summaryrefslogtreecommitdiffstats
path: root/tiny_skia/src/window/compositor.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tiny_skia/src/window/compositor.rs')
-rw-r--r--tiny_skia/src/window/compositor.rs42
1 files changed, 16 insertions, 26 deletions
diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs
index 5b1e56a4..6e4bb6ef 100644
--- a/tiny_skia/src/window/compositor.rs
+++ b/tiny_skia/src/window/compositor.rs
@@ -5,7 +5,6 @@ use crate::{Backend, Renderer, Settings};
use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle};
use std::marker::PhantomData;
-use std::num::NonZeroU32;
pub struct Compositor<Theme> {
clip_mask: tiny_skia::ClipMask,
@@ -13,7 +12,8 @@ pub struct Compositor<Theme> {
}
pub struct Surface {
- window: softbuffer::Surface,
+ window: softbuffer::GraphicsContext,
+ buffer: Vec<u32>,
}
impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
@@ -36,20 +36,14 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
width: u32,
height: u32,
) -> Surface {
- let platform = unsafe { softbuffer::Context::new(window) }
- .expect("Create softbuffer context");
+ let window =
+ unsafe { softbuffer::GraphicsContext::new(window, window) }
+ .expect("Create softbuffer for window");
- let mut window = unsafe { softbuffer::Surface::new(&platform, window) }
- .expect("Create softbuffer surface");
-
- window
- .resize(
- NonZeroU32::new(width).unwrap(),
- NonZeroU32::new(height).unwrap(),
- )
- .expect("Resize surface");
-
- Surface { window }
+ Surface {
+ window,
+ buffer: vec![0; width as usize * height as usize],
+ }
}
fn configure_surface(
@@ -58,13 +52,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> {
width: u32,
height: u32,
) {
- surface
- .window
- .resize(
- NonZeroU32::new(width).unwrap(),
- NonZeroU32::new(height).unwrap(),
- )
- .expect("Resize surface");
+ surface.buffer.resize((width * height) as usize, 0);
}
fn fetch_information(&self) -> Information {
@@ -118,11 +106,9 @@ pub fn present<Theme, T: AsRef<str>>(
) -> Result<(), compositor::SurfaceError> {
let physical_size = viewport.physical_size();
- let mut buffer = surface.window.buffer_mut().expect("Get window buffer");
-
let drawn = backend.draw(
&mut tiny_skia::PixmapMut::from_bytes(
- bytemuck::cast_slice_mut(&mut buffer),
+ bytemuck::cast_slice_mut(&mut surface.buffer),
physical_size.width,
physical_size.height,
)
@@ -135,7 +121,11 @@ pub fn present<Theme, T: AsRef<str>>(
);
if drawn {
- let _ = buffer.present();
+ surface.window.set_buffer(
+ &surface.buffer,
+ physical_size.width as u16,
+ physical_size.height as u16,
+ );
}
Ok(())