diff --git a/api/cpp/include/slint-platform.h b/api/cpp/include/slint-platform.h index 430dd5bb0f2..7f074b6b251 100644 --- a/api/cpp/include/slint-platform.h +++ b/api/cpp/include/slint-platform.h @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -995,6 +996,11 @@ class SkiaRenderer : public AbstractRenderer /// Renders the scene into the window provided to the SkiaRenderer's constructor. void render() const { cbindgen_private::slint_skia_renderer_render(inner); } + + void render_into_buffer(SharedPixelBuffer &buffer) + { + cbindgen_private::slint_skia_renderer_render(inner, buffer); + } }; #endif diff --git a/api/cpp/platform.rs b/api/cpp/platform.rs index f07f156f0d1..d34c1d91a6a 100644 --- a/api/cpp/platform.rs +++ b/api/cpp/platform.rs @@ -921,4 +921,13 @@ pub mod skia { core::mem::transmute(r) } } + + #[unsafe(no_mangle)] + pub unsafe extern "C" fn slint_skia_renderer_render_to_buffer( + r: SkiaRendererOpaque, + buffer: &mut SharedPixelBuffer, + ) { + let r = unsafe { &*(r as *const SkiaRenderer) }; + r.render_into_buffer(buffer).unwrap(); + } } diff --git a/internal/renderers/skia/lib.rs b/internal/renderers/skia/lib.rs index 9787cfd60cd..87dfc19d942 100644 --- a/internal/renderers/skia/lib.rs +++ b/internal/renderers/skia/lib.rs @@ -596,6 +596,42 @@ impl SkiaRenderer { ) } + pub fn render_to_buffer( + &self, + target_buffer: &mut SharedPixelBuffer, + ) -> Result, PlatformError> { + let window_adapter = self.window_adapter()?; + let window = window_adapter.window(); + let size = window_adapter.window().size(); + let (width, height) = (size.width, size.height); + + let mut surface_borrow = skia_safe::surfaces::wrap_pixels( + &skia_safe::ImageInfo::new( + (width as i32, height as i32), + skia_safe::ColorType::RGBA8888, + skia_safe::AlphaType::Opaque, + None, + ), + target_buffer.make_mut_bytes(), + None, + None, + ) + .ok_or_else(|| "Error wrapping target buffer for rendering into with Skia".to_string())?; + + let dirty_region = self.render_to_canvas( + surface_borrow.canvas(), + 0., + (0.0, 0.0), + None, + 0, + None, + window, + None, + ); + + Ok(dirty_region) + } + fn render_to_canvas( &self, skia_canvas: &skia_safe::Canvas, @@ -959,27 +995,11 @@ impl i_slint_core::renderer::RendererSealed for SkiaRenderer { &self, ) -> Result, PlatformError> { let window_adapter = self.window_adapter()?; - let window = window_adapter.window(); let size = window_adapter.window().size(); let (width, height) = (size.width, size.height); let mut target_buffer = SharedPixelBuffer::::new(width, height); - - let mut surface_borrow = skia_safe::surfaces::wrap_pixels( - &skia_safe::ImageInfo::new( - (width as i32, height as i32), - skia_safe::ColorType::RGBA8888, - skia_safe::AlphaType::Opaque, - None, - ), - target_buffer.make_mut_bytes(), - None, - None, - ) - .ok_or_else(|| "Error wrapping target buffer for rendering into with Skia".to_string())?; - - self.render_to_canvas(surface_borrow.canvas(), 0., (0.0, 0.0), None, 0, None, window, None); - + self.render_to_buffer(&mut target_buffer)?; Ok(target_buffer) }