mirror of
https://github.com/slint-ui/slint.git
synced 2025-08-04 10:50:00 +00:00
WIP: Start wrapping TargetPIxelBuffer in C++
This commit is contained in:
parent
543ed39058
commit
fbee7f9566
3 changed files with 228 additions and 2 deletions
|
@ -356,10 +356,139 @@ mod software_renderer {
|
|||
type SoftwareRendererOpaque = *const c_void;
|
||||
use i_slint_core::graphics::{IntRect, Rgb8Pixel};
|
||||
use i_slint_core::software_renderer::{
|
||||
PhysicalRegion, RepaintBufferType, Rgb565Pixel, SoftwareRenderer,
|
||||
PhysicalRegion, PremultipliedRgbaColor, RepaintBufferType, Rgb565Pixel, SoftwareRenderer,
|
||||
TargetPixelBuffer,
|
||||
};
|
||||
use i_slint_core::SharedVector;
|
||||
|
||||
type CppTargetPixelBufferUserData = *mut c_void;
|
||||
|
||||
#[repr(C)]
|
||||
pub struct CppRgb8TargetPixelBuffer {
|
||||
user_data: CppTargetPixelBufferUserData,
|
||||
line_slice: unsafe extern "C" fn(
|
||||
CppTargetPixelBufferUserData,
|
||||
usize,
|
||||
slice_ptr: &mut *mut Rgb8Pixel,
|
||||
slice_len: *mut usize,
|
||||
),
|
||||
num_lines: unsafe extern "C" fn(CppTargetPixelBufferUserData) -> usize,
|
||||
fill_rectangle: unsafe extern "C" fn(
|
||||
CppTargetPixelBufferUserData,
|
||||
i16,
|
||||
i16,
|
||||
i16,
|
||||
i16,
|
||||
u8,
|
||||
u8,
|
||||
u8,
|
||||
u8,
|
||||
) -> bool,
|
||||
}
|
||||
|
||||
impl TargetPixelBuffer for CppRgb8TargetPixelBuffer {
|
||||
type Pixel = Rgb8Pixel;
|
||||
|
||||
fn line_slice(&mut self, line_number: usize) -> &mut [Self::Pixel] {
|
||||
unsafe {
|
||||
let mut data = core::ptr::null_mut();
|
||||
let mut len = 0;
|
||||
(self.line_slice)(self.user_data, line_number, &mut data, &mut len);
|
||||
core::slice::from_raw_parts_mut(data, len)
|
||||
}
|
||||
}
|
||||
|
||||
fn num_lines(&self) -> usize {
|
||||
unsafe { (self.num_lines)(self.user_data) }
|
||||
}
|
||||
|
||||
fn fill_rectangle(
|
||||
&mut self,
|
||||
x: i16,
|
||||
y: i16,
|
||||
width: i16,
|
||||
height: i16,
|
||||
color: PremultipliedRgbaColor,
|
||||
) -> bool {
|
||||
unsafe {
|
||||
(self.fill_rectangle)(
|
||||
self.user_data,
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
color.red,
|
||||
color.green,
|
||||
color.blue,
|
||||
color.alpha,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct CppRgb565TargetPixelBuffer {
|
||||
user_data: CppTargetPixelBufferUserData,
|
||||
line_slice: unsafe extern "C" fn(
|
||||
CppTargetPixelBufferUserData,
|
||||
usize,
|
||||
slice_ptr: &mut *mut u16,
|
||||
slice_len: *mut usize,
|
||||
),
|
||||
num_lines: unsafe extern "C" fn(CppTargetPixelBufferUserData) -> usize,
|
||||
fill_rectangle: unsafe extern "C" fn(
|
||||
CppTargetPixelBufferUserData,
|
||||
i16,
|
||||
i16,
|
||||
i16,
|
||||
i16,
|
||||
u8,
|
||||
u8,
|
||||
u8,
|
||||
u8,
|
||||
) -> bool,
|
||||
}
|
||||
|
||||
impl TargetPixelBuffer for CppRgb565TargetPixelBuffer {
|
||||
type Pixel = Rgb565Pixel;
|
||||
|
||||
fn line_slice(&mut self, line_number: usize) -> &mut [Self::Pixel] {
|
||||
unsafe {
|
||||
let mut data = core::ptr::null_mut();
|
||||
let mut len = 0;
|
||||
(self.line_slice)(self.user_data, line_number, &mut data, &mut len);
|
||||
core::slice::from_raw_parts_mut(data as *mut Rgb565Pixel, len)
|
||||
}
|
||||
}
|
||||
|
||||
fn num_lines(&self) -> usize {
|
||||
unsafe { (self.num_lines)(self.user_data) }
|
||||
}
|
||||
|
||||
fn fill_rectangle(
|
||||
&mut self,
|
||||
x: i16,
|
||||
y: i16,
|
||||
width: i16,
|
||||
height: i16,
|
||||
color: PremultipliedRgbaColor,
|
||||
) -> bool {
|
||||
unsafe {
|
||||
(self.fill_rectangle)(
|
||||
self.user_data,
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
color.red,
|
||||
color.green,
|
||||
color.blue,
|
||||
color.alpha,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn slint_software_renderer_new(
|
||||
buffer_age: u32,
|
||||
|
@ -391,6 +520,26 @@ mod software_renderer {
|
|||
renderer.render(buffer, pixel_stride)
|
||||
}
|
||||
|
||||
#[cfg(feature = "experimental")]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn slint_software_renderer_render_accel_rgb8(
|
||||
r: SoftwareRendererOpaque,
|
||||
buffer: *mut CppRgb8TargetPixelBuffer,
|
||||
) -> PhysicalRegion {
|
||||
let renderer = &*(r as *const SoftwareRenderer);
|
||||
unsafe { renderer.render_into_buffer(&mut *buffer) }
|
||||
}
|
||||
|
||||
#[cfg(feature = "experimental")]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn slint_software_renderer_render_accel_rgb565(
|
||||
r: SoftwareRendererOpaque,
|
||||
buffer: *mut CppRgb565TargetPixelBuffer,
|
||||
) -> PhysicalRegion {
|
||||
let renderer = &*(r as *const SoftwareRenderer);
|
||||
unsafe { renderer.render_into_buffer(&mut *buffer) }
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn slint_software_renderer_render_rgb565(
|
||||
r: SoftwareRendererOpaque,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue