diff options
Diffstat (limited to 'tiny_skia')
| -rw-r--r-- | tiny_skia/Cargo.toml | 21 | ||||
| -rw-r--r-- | tiny_skia/src/backend.rs | 87 | ||||
| -rw-r--r-- | tiny_skia/src/lib.rs | 16 | ||||
| -rw-r--r-- | tiny_skia/src/settings.rs | 24 | ||||
| -rw-r--r-- | tiny_skia/src/window.rs | 3 | ||||
| -rw-r--r-- | tiny_skia/src/window/compositor.rs | 96 | 
6 files changed, 247 insertions, 0 deletions
| diff --git a/tiny_skia/Cargo.toml b/tiny_skia/Cargo.toml new file mode 100644 index 00000000..7f4b0f8c --- /dev/null +++ b/tiny_skia/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "iced_tiny_skia" +version = "0.1.0" +edition = "2021" + +[features] +image = [] +svg = [] + +[dependencies] +raw-window-handle = "0.5" +softbuffer = "0.2" +tiny-skia = "0.8" + +[dependencies.iced_native] +version = "0.9" +path = "../native" + +[dependencies.iced_graphics] +version = "0.7" +path = "../graphics" diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs new file mode 100644 index 00000000..4282a745 --- /dev/null +++ b/tiny_skia/src/backend.rs @@ -0,0 +1,87 @@ +use crate::{Font, Settings, Size}; + +use iced_graphics::backend; +use iced_graphics::text; + +use std::borrow::Cow; + +pub struct Backend { +    default_font: Font, +    default_text_size: f32, +} + +impl Backend { +    pub fn new(settings: Settings) -> Self { +        Self { +            default_font: settings.default_font, +            default_text_size: settings.default_text_size, +        } +    } +} + +impl iced_graphics::Backend for Backend { +    fn trim_measurements(&mut self) { +        // TODO +    } +} + +impl backend::Text for Backend { +    const ICON_FONT: Font = Font::Name("Iced-Icons"); +    const CHECKMARK_ICON: char = '\u{f00c}'; +    const ARROW_DOWN_ICON: char = '\u{e800}'; + +    fn default_font(&self) -> Font { +        self.default_font +    } + +    fn default_size(&self) -> f32 { +        self.default_text_size +    } + +    fn measure( +        &self, +        _contents: &str, +        _size: f32, +        _font: Font, +        _bounds: Size, +    ) -> (f32, f32) { +        // TODO +        (0.0, 0.0) +    } + +    fn hit_test( +        &self, +        _contents: &str, +        _size: f32, +        _font: Font, +        _bounds: Size, +        _point: iced_native::Point, +        _nearest_only: bool, +    ) -> Option<text::Hit> { +        // TODO +        None +    } + +    fn load_font(&mut self, _font: Cow<'static, [u8]>) { +        // TODO +    } +} + +#[cfg(feature = "image")] +impl backend::Image for Backend { +    fn dimensions(&self, _handle: &iced_native::image::Handle) -> Size<u32> { +        // TODO +        Size::new(0, 0) +    } +} + +#[cfg(feature = "svg")] +impl backend::Svg for Backend { +    fn viewport_dimensions( +        &self, +        _handle: &iced_native::svg::Handle, +    ) -> Size<u32> { +        // TODO +        Size::new(0, 0) +    } +} diff --git a/tiny_skia/src/lib.rs b/tiny_skia/src/lib.rs new file mode 100644 index 00000000..fce44e9e --- /dev/null +++ b/tiny_skia/src/lib.rs @@ -0,0 +1,16 @@ +pub mod window; + +mod backend; +mod settings; + +pub use backend::Backend; +pub use settings::Settings; + +pub use iced_graphics::{Color, Error, Font, Point, Size, Vector, Viewport}; + +/// A [`tiny-skia`] graphics renderer for [`iced`]. +/// +/// [`tiny-skia`]: https://github.com/RazrFalcon/tiny-skia +/// [`iced`]: https://github.com/iced-rs/iced +pub type Renderer<Theme = iced_native::Theme> = +    iced_graphics::Renderer<Backend, Theme>; diff --git a/tiny_skia/src/settings.rs b/tiny_skia/src/settings.rs new file mode 100644 index 00000000..88098345 --- /dev/null +++ b/tiny_skia/src/settings.rs @@ -0,0 +1,24 @@ +use crate::Font; + +/// The settings of a [`Backend`]. +/// +/// [`Backend`]: crate::Backend +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct Settings { +    /// The default [`Font`] to use. +    pub default_font: Font, + +    /// The default size of text. +    /// +    /// By default, it will be set to `16.0`. +    pub default_text_size: f32, +} + +impl Default for Settings { +    fn default() -> Settings { +        Settings { +            default_font: Font::SansSerif, +            default_text_size: 16.0, +        } +    } +} diff --git a/tiny_skia/src/window.rs b/tiny_skia/src/window.rs new file mode 100644 index 00000000..d8d9378e --- /dev/null +++ b/tiny_skia/src/window.rs @@ -0,0 +1,3 @@ +pub mod compositor; + +pub use compositor::{Compositor, Surface}; diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs new file mode 100644 index 00000000..053bb29b --- /dev/null +++ b/tiny_skia/src/window/compositor.rs @@ -0,0 +1,96 @@ +use crate::{Backend, Color, Error, Renderer, Settings, Viewport}; + +use iced_graphics::window::compositor::{self, Information, SurfaceError}; +use iced_graphics::Primitive; + +use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use std::marker::PhantomData; + +pub struct Compositor<Theme> { +    _theme: PhantomData<Theme>, +} + +pub struct Surface; + +impl<Theme> iced_graphics::window::Compositor for Compositor<Theme> { +    type Settings = Settings; +    type Renderer = Renderer<Theme>; +    type Surface = Surface; + +    fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( +        settings: Self::Settings, +        _compatible_window: Option<&W>, +    ) -> Result<(Self, Self::Renderer), Error> { +        let (compositor, backend) = new(settings); + +        Ok((compositor, Renderer::new(backend))) +    } + +    fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>( +        &mut self, +        _window: &W, +    ) -> Surface { +        // TODO +        Surface +    } + +    fn configure_surface( +        &mut self, +        _surface: &mut Surface, +        _width: u32, +        _height: u32, +    ) { +        // TODO +    } + +    fn fetch_information(&self) -> Information { +        Information { +            adapter: String::from("CPU"), +            backend: String::from("tiny-skia"), +        } +    } + +    fn present<T: AsRef<str>>( +        &mut self, +        renderer: &mut Self::Renderer, +        surface: &mut Self::Surface, +        viewport: &Viewport, +        background_color: Color, +        overlay: &[T], +    ) -> Result<(), SurfaceError> { +        renderer.with_primitives(|backend, primitives| { +            present( +                self, +                backend, +                surface, +                primitives, +                viewport, +                background_color, +                overlay, +            ) +        }) +    } +} + +pub fn new<Theme>(settings: Settings) -> (Compositor<Theme>, Backend) { +    // TODO +    ( +        Compositor { +            _theme: PhantomData, +        }, +        Backend::new(settings), +    ) +} + +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], +) -> Result<(), compositor::SurfaceError> { +    // TODO +    Ok(()) +} | 
