summaryrefslogtreecommitdiffstats
path: root/tiny_skia
diff options
context:
space:
mode:
Diffstat (limited to 'tiny_skia')
-rw-r--r--tiny_skia/src/backend.rs19
-rw-r--r--tiny_skia/src/window/compositor.rs66
2 files changed, 70 insertions, 15 deletions
diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs
index 4282a745..62373ec7 100644
--- a/tiny_skia/src/backend.rs
+++ b/tiny_skia/src/backend.rs
@@ -1,7 +1,8 @@
-use crate::{Font, Settings, Size};
+use crate::{Color, Font, Settings, Size, Viewport};
use iced_graphics::backend;
use iced_graphics::text;
+use iced_graphics::Primitive;
use std::borrow::Cow;
@@ -17,6 +18,22 @@ impl Backend {
default_text_size: settings.default_text_size,
}
}
+
+ pub fn draw<T: AsRef<str>>(
+ &mut self,
+ pixels: &mut tiny_skia::Pixmap,
+ _primitives: &[Primitive],
+ _viewport: &Viewport,
+ background_color: Color,
+ _overlay: &[T],
+ ) {
+ pixels.fill(into_color(background_color));
+ }
+}
+
+fn into_color(color: Color) -> tiny_skia::Color {
+ tiny_skia::Color::from_rgba(color.r, color.g, color.b, color.a)
+ .expect("Convert color from iced to tiny_skia")
}
impl iced_graphics::Backend for Backend {
diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs
index 053bb29b..164d99c6 100644
--- a/tiny_skia/src/window/compositor.rs
+++ b/tiny_skia/src/window/compositor.rs
@@ -10,7 +10,11 @@ pub struct Compositor<Theme> {
_theme: PhantomData<Theme>,
}
-pub struct Surface;
+pub struct Surface {
+ window: softbuffer::GraphicsContext,
+ pixels: tiny_skia::Pixmap,
+ buffer: Vec<u32>,
+}
impl<Theme> iced_graphics::window::Compositor for Compositor<Theme> {
type Settings = Settings;
@@ -28,19 +32,33 @@ impl<Theme> iced_graphics::window::Compositor for Compositor<Theme> {
fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>(
&mut self,
- _window: &W,
+ window: &W,
+ width: u32,
+ height: u32,
) -> Surface {
- // TODO
- Surface
+ let window =
+ unsafe { softbuffer::GraphicsContext::new(window, window) }
+ .expect("Create softbuffer for window");
+
+ let pixels = tiny_skia::Pixmap::new(width, height)
+ .expect("Create pixmap for window");
+
+ Surface {
+ window,
+ pixels,
+ buffer: vec![0; (width * height) as usize],
+ }
}
fn configure_surface(
&mut self,
- _surface: &mut Surface,
- _width: u32,
- _height: u32,
+ surface: &mut Surface,
+ width: u32,
+ height: u32,
) {
- // TODO
+ surface.pixels = tiny_skia::Pixmap::new(width, height)
+ .expect("Create pixmap for window");
+ surface.buffer = vec![0; (width * height) as usize];
}
fn fetch_information(&self) -> Information {
@@ -84,13 +102,33 @@ pub fn new<Theme>(settings: Settings) -> (Compositor<Theme>, Backend) {
pub fn present<Theme, T: AsRef<str>>(
_compositor: &mut Compositor<Theme>,
- _backend: &mut Backend,
- _surface: &mut Surface,
- _primitives: &[Primitive],
- _viewport: &Viewport,
- _background_color: Color,
- _overlay: &[T],
+ backend: &mut Backend,
+ surface: &mut Surface,
+ primitives: &[Primitive],
+ viewport: &Viewport,
+ background_color: Color,
+ overlay: &[T],
) -> Result<(), compositor::SurfaceError> {
+ backend.draw(
+ &mut surface.pixels,
+ primitives,
+ viewport,
+ background_color,
+ overlay,
+ );
+
+ for (i, pixel) in surface.pixels.pixels_mut().iter().enumerate() {
+ surface.buffer[i] = u32::from(pixel.red()) << 16
+ | u32::from(pixel.green()) << 8
+ | u32::from(pixel.blue());
+ }
+
+ surface.window.set_buffer(
+ &surface.buffer,
+ surface.pixels.width() as u16,
+ surface.pixels.height() as u16,
+ );
+
// TODO
Ok(())
}