Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions api/cpp/include/slint-platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <cassert>
#include <cstdint>
#include <slint_image.h>
#include <utility>
#include <ranges>

Expand Down Expand Up @@ -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<slint::Rgb8Pixel> &buffer)
{
cbindgen_private::slint_skia_renderer_render(inner, buffer);
}
};
#endif

Expand Down
9 changes: 9 additions & 0 deletions api/cpp/platform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Rgb8Pixel>,
) {
let r = unsafe { &*(r as *const SkiaRenderer) };
r.render_into_buffer(buffer).unwrap();
}
}
54 changes: 37 additions & 17 deletions internal/renderers/skia/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,42 @@ impl SkiaRenderer {
)
}

pub fn render_to_buffer(
&self,
target_buffer: &mut SharedPixelBuffer<i_slint_core::graphics::Rgba8Pixel>,
) -> Result<Option<DirtyRegion>, 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,
Expand Down Expand Up @@ -959,27 +995,11 @@ impl i_slint_core::renderer::RendererSealed for SkiaRenderer {
&self,
) -> Result<SharedPixelBuffer<i_slint_core::graphics::Rgba8Pixel>, 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::<i_slint_core::graphics::Rgba8Pixel>::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)
}

Expand Down
Loading