Skip to content

Commit

Permalink
Add RGB565 rendering function to the C++ software renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
tronical committed Jul 21, 2023
1 parent 1ecd36d commit cc36915
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
13 changes: 13 additions & 0 deletions api/cpp/include/slint_platform.h
Expand Up @@ -295,6 +295,19 @@ class SoftwareRenderer : public AbstractRenderer
cbindgen_private::slint_software_renderer_render_rgb8(
inner, &window.window_handle().inner, buffer.data(), buffer.size(), pixel_stride);
}

/// Render the window scene into an RGB 565 encoded pixel buffer
///
/// The buffer must be at least as large as the associated slint::Window
///
/// The stride is the amount of pixels between two lines in the buffer.
/// It is must be at least as large as the width of the window.
void render_rgb565(const Window &window, std::span<uint16_t> buffer,
std::size_t pixel_stride) const
{
cbindgen_private::slint_software_renderer_render_rgb565(
inner, &window.window_handle().inner, buffer.data(), buffer.size(), pixel_stride);
}
};

/// An opaque, low-level window handle that internalizes everything necessary to exchange messages
Expand Down
17 changes: 16 additions & 1 deletion api/cpp/platform.rs
Expand Up @@ -8,7 +8,7 @@ use i_slint_core::api::{PhysicalSize, Window};
use i_slint_core::graphics::{IntSize, Rgb8Pixel};
use i_slint_core::platform::{Platform, PlatformError};
use i_slint_core::renderer::Renderer;
use i_slint_core::software_renderer::{RepaintBufferType, SoftwareRenderer};
use i_slint_core::software_renderer::{RepaintBufferType, Rgb565Pixel, SoftwareRenderer};
use i_slint_core::window::ffi::WindowAdapterRcOpaque;
use i_slint_core::window::{WindowAdapter, WindowAdapterInternal};

Expand Down Expand Up @@ -295,6 +295,21 @@ pub unsafe extern "C" fn slint_software_renderer_render_rgb8(
renderer.render(buffer, pixel_stride);
}

#[no_mangle]
pub unsafe extern "C" fn slint_software_renderer_render_rgb565(
r: SoftwareRendererOpaque,
window_adapter: *const WindowAdapterRcOpaque,
buffer: *mut u16,
buffer_len: usize,
pixel_stride: usize,
) {
let buffer = core::slice::from_raw_parts_mut(buffer as *mut Rgb565Pixel, buffer_len);
let renderer = &*(r as *const SoftwareRenderer);
let window_adapter = &*(window_adapter as *const Rc<dyn WindowAdapter>);
renderer.set_window(window_adapter.window());
renderer.render(buffer, pixel_stride);
}

#[no_mangle]
pub unsafe extern "C" fn slint_software_renderer_handle(r: SoftwareRendererOpaque) -> RendererPtr {
let r = (r as *const SoftwareRenderer) as *const dyn Renderer;
Expand Down

0 comments on commit cc36915

Please sign in to comment.