Split the software renderer in its own crate: i-slint-renderer-software (#10229)

The goal is to be able to enable feature conditionally with `i-slint-renderer-software/?...`

NOTE: this change the implementation of
`SceneBuilder::platform_text_fill_brush/platform_text_stroke_brush`
It was warning about `non_exhaustive_omitted_patterns`.
And it changed it to always return the brush color so gradient gets
converted to plain color instead of None.
This is the behavior with the non-parley renderer
This commit is contained in:
Olivier Goffart 2025-12-09 14:17:05 +01:00 committed by GitHub
parent 590c9b7864
commit 5c69db596a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
38 changed files with 363 additions and 289 deletions

View file

@ -41,14 +41,19 @@ renderer-femtovg-wgpu = ["i-slint-backend-selector/renderer-femtovg-wgpu"]
renderer-skia = ["i-slint-backend-selector/renderer-skia", "i-slint-renderer-skia", "raw-window-handle"]
renderer-skia-opengl = ["i-slint-backend-selector/renderer-skia-opengl", "renderer-skia"]
renderer-skia-vulkan = ["i-slint-backend-selector/renderer-skia-vulkan", "renderer-skia"]
renderer-software = ["i-slint-backend-selector/renderer-software"]
renderer-software = ["i-slint-backend-selector/renderer-software", "dep:i-slint-renderer-software"]
gettext = ["i-slint-core/gettext-rs"]
accessibility = ["i-slint-backend-selector/accessibility"]
system-testing = ["i-slint-backend-selector/system-testing"]
std = ["i-slint-core/default", "i-slint-core/image-default-formats", "i-slint-backend-selector"]
std = [
"i-slint-core/default",
"i-slint-core/image-default-formats",
"i-slint-backend-selector",
"i-slint-renderer-software?/std",
]
freestanding = ["i-slint-core/libm", "i-slint-core/unsafe-single-threaded"]
experimental = ["i-slint-core/experimental"]
experimental = ["i-slint-renderer-software?/experimental"]
default = ["std", "backend-winit", "renderer-femtovg", "backend-qt"]
@ -56,6 +61,7 @@ default = ["std", "backend-winit", "renderer-femtovg", "backend-qt"]
i-slint-backend-selector = { workspace = true, optional = true }
i-slint-backend-testing = { workspace = true, optional = true, features = ["ffi"] }
i-slint-renderer-skia = { workspace = true, features = ["default", "x11", "wayland"], optional = true }
i-slint-renderer-software = { workspace = true, optional = true }
i-slint-core = { workspace = true, features = ["ffi"] }
slint-interpreter = { workspace = true, features = ["ffi", "compat-1-2"], optional = true }
raw-window-handle = { version = "0.6", optional = true }

View file

@ -341,7 +341,6 @@ fn gen_corelib(
"Rect",
"SortOrder",
"BitmapFont",
"PhysicalRegion",
]
.iter()
.chain(items.iter())
@ -496,10 +495,12 @@ fn gen_corelib(
"SharedPixelBuffer",
"SharedImageBuffer",
"StaticTextures",
"BorrowedOpenGLTextureOrigin"
"BorrowedOpenGLTextureOrigin",
"PhysicalRegion",
"PHYSICAL_REGION_MAX_SIZE",
],
"slint_image_internal.h",
"#include \"slint_color.h\"\nnamespace slint::cbindgen_private { struct ParsedSVG{}; struct HTMLImage{}; using namespace vtable; namespace types{ struct NineSliceImage{}; } }",
"#include \"slint_color.h\"\nnamespace slint::cbindgen_private { struct ParsedSVG{}; struct HTMLImage{}; struct PhysicalPx; using namespace vtable; namespace types{ struct NineSliceImage{}; } }",
),
(
vec!["Color", "slint_color_brighter", "slint_color_darker",
@ -582,6 +583,7 @@ fn gen_corelib(
"ConicGradientBrush",
"slint_conic_gradient_normalize_stops",
"slint_conic_gradient_apply_rotation",
"PHYSICAL_REGION_MAX_SIZE",
]
.into_iter()
.chain(config.export.exclude.iter().map(|s| s.as_str()))
@ -622,6 +624,7 @@ fn gen_corelib(
.with_src(crate_dir.join("input.rs"))
.with_src(crate_dir.join("item_rendering.rs"))
.with_src(crate_dir.join("window.rs"))
.with_src(crate_dir.join("../renderers/software/lib.rs"))
.with_include("slint_enums_internal.h")
.generate()
.with_context(|| format!("Unable to generate bindings for {internal_header}"))?
@ -881,6 +884,7 @@ namespace slint::cbindgen_private {
using slint::cbindgen_private::types::TexturePixelFormat;
struct DrawTextureArgs;
struct DrawRectangleArgs;
using types::PhysicalRegion;
}
",
)

View file

@ -602,7 +602,7 @@ public:
auto rectangles() const
{
SharedVector<cbindgen_private::IntRect> rectangles;
slint_software_renderer_region_to_rects(&inner, &rectangles);
cbindgen_private::slint_software_renderer_region_to_rects(&inner, &rectangles);
# if __cpp_lib_ranges >= 202110L // DR20 P2415R2
using std::ranges::owning_view;
# else

View file

@ -359,12 +359,12 @@ mod software_renderer {
type SoftwareRendererOpaque = *const c_void;
use i_slint_core::SharedVector;
use i_slint_core::graphics::{IntRect, Rgb8Pixel};
use i_slint_core::software_renderer::{
use i_slint_renderer_software::{
PhysicalRegion, RepaintBufferType, Rgb565Pixel, SoftwareRenderer,
};
#[cfg(feature = "experimental")]
use i_slint_core::software_renderer::{TargetPixelBuffer, TexturePixelFormat};
use i_slint_renderer_software::{TargetPixelBuffer, TexturePixelFormat};
#[cfg(feature = "experimental")]
type CppTargetPixelBufferUserData = *mut c_void;
@ -398,8 +398,8 @@ mod software_renderer {
pub tiling_gap_y: u32,
}
#[cfg(feature = "experimental")]
impl From<&i_slint_core::software_renderer::DrawTextureArgs> for DrawTextureArgs {
fn from(from: &i_slint_core::software_renderer::DrawTextureArgs) -> Self {
impl From<&i_slint_renderer_software::DrawTextureArgs> for DrawTextureArgs {
fn from(from: &i_slint_renderer_software::DrawTextureArgs) -> Self {
let source = from.source();
Self {
image_data: source.data.as_ptr(),
@ -448,8 +448,8 @@ mod software_renderer {
pub rotation: i32,
}
#[cfg(feature = "experimental")]
impl From<&i_slint_core::software_renderer::DrawRectangleArgs> for DrawRectangleArgs {
fn from(from: &i_slint_core::software_renderer::DrawRectangleArgs) -> Self {
impl From<&i_slint_renderer_software::DrawRectangleArgs> for DrawRectangleArgs {
fn from(from: &i_slint_renderer_software::DrawRectangleArgs) -> Self {
Self {
x: from.x,
y: from.y,
@ -494,7 +494,7 @@ mod software_renderer {
}
#[cfg(feature = "experimental")]
impl<TargetPixel: i_slint_core::software_renderer::TargetPixel> TargetPixelBuffer
impl<TargetPixel: i_slint_renderer_software::TargetPixel> TargetPixelBuffer
for CppTargetPixelBuffer<TargetPixel>
{
type TargetPixel = TargetPixel;
@ -524,7 +524,7 @@ mod software_renderer {
/// Draw a rectangle specified by the DrawRectangleArgs. That rectangle must be clipped to the given region
fn draw_rectangle(
&mut self,
args: &i_slint_core::software_renderer::DrawRectangleArgs,
args: &i_slint_renderer_software::DrawRectangleArgs,
clip: &PhysicalRegion,
) -> bool {
let args = args.into();
@ -533,7 +533,7 @@ mod software_renderer {
fn draw_texture(
&mut self,
texture: &i_slint_core::software_renderer::DrawTextureArgs,
texture: &i_slint_renderer_software::DrawTextureArgs,
clip: &PhysicalRegion,
) -> bool {
let texture = texture.into();
@ -620,8 +620,8 @@ mod software_renderer {
user_data: *mut core::ffi::c_void,
}
impl<TargetPixel: i_slint_core::software_renderer::TargetPixel>
i_slint_core::software_renderer::LineBufferProvider for LineByLineProcessor<TargetPixel>
impl<TargetPixel: i_slint_renderer_software::TargetPixel>
i_slint_renderer_software::LineBufferProvider for LineByLineProcessor<TargetPixel>
{
type TargetPixel = TargetPixel;
fn process_line(
@ -710,7 +710,7 @@ mod software_renderer {
r: SoftwareRendererOpaque,
rotation: i32,
) {
use i_slint_core::software_renderer::RenderingRotation;
use i_slint_renderer_software::RenderingRotation;
let renderer = unsafe { &*(r as *const SoftwareRenderer) };
renderer.set_rendering_rotation(match rotation {
90 => RenderingRotation::Rotate90,