diff options
Diffstat (limited to '')
| -rw-r--r-- | tiny_skia/src/backend.rs | 13 | ||||
| -rw-r--r-- | tiny_skia/src/geometry.rs | 58 | ||||
| -rw-r--r-- | tiny_skia/src/primitive.rs | 10 | ||||
| -rw-r--r-- | tiny_skia/src/settings.rs | 10 | ||||
| -rw-r--r-- | tiny_skia/src/window/compositor.rs | 24 | 
5 files changed, 83 insertions, 32 deletions
| diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs index b6487b38..8c8781e3 100644 --- a/tiny_skia/src/backend.rs +++ b/tiny_skia/src/backend.rs @@ -5,6 +5,7 @@ use crate::graphics::backend;  use crate::graphics::text;  use crate::graphics::{Damage, Viewport};  use crate::primitive::{self, Primitive}; +use crate::window;  use std::borrow::Cow; @@ -989,8 +990,9 @@ fn rounded_box_sdf(      (x.powf(2.0) + y.powf(2.0)).sqrt() - radius  } -impl iced_graphics::Backend for Backend { +impl backend::Backend for Backend {      type Primitive = primitive::Custom; +    type Compositor = window::Compositor;  }  impl backend::Text for Backend { @@ -1018,3 +1020,12 @@ impl backend::Svg for Backend {          self.vector_pipeline.viewport_dimensions(handle)      }  } + +#[cfg(feature = "geometry")] +impl crate::graphics::geometry::Backend for Backend { +    type Frame = crate::geometry::Frame; + +    fn new_frame(&self, size: Size) -> Self::Frame { +        crate::geometry::Frame::new(size) +    } +} diff --git a/tiny_skia/src/geometry.rs b/tiny_skia/src/geometry.rs index 16787f89..76482e12 100644 --- a/tiny_skia/src/geometry.rs +++ b/tiny_skia/src/geometry.rs @@ -4,7 +4,7 @@ use crate::core::{  };  use crate::graphics::geometry::fill::{self, Fill};  use crate::graphics::geometry::stroke::{self, Stroke}; -use crate::graphics::geometry::{Path, Style, Text}; +use crate::graphics::geometry::{self, Path, Style, Text};  use crate::graphics::Gradient;  use crate::primitive::{self, Primitive}; @@ -25,23 +25,36 @@ impl Frame {          }      } -    pub fn width(&self) -> f32 { +    pub fn into_primitive(self) -> Primitive { +        Primitive::Clip { +            bounds: Rectangle::new(Point::ORIGIN, self.size), +            content: Box::new(Primitive::Group { +                primitives: self.primitives, +            }), +        } +    } +} + +impl geometry::frame::Backend for Frame { +    type Geometry = Primitive; + +    fn width(&self) -> f32 {          self.size.width      } -    pub fn height(&self) -> f32 { +    fn height(&self) -> f32 {          self.size.height      } -    pub fn size(&self) -> Size { +    fn size(&self) -> Size {          self.size      } -    pub fn center(&self) -> Point { +    fn center(&self) -> Point {          Point::new(self.size.width / 2.0, self.size.height / 2.0)      } -    pub fn fill(&mut self, path: &Path, fill: impl Into<Fill>) { +    fn fill(&mut self, path: &Path, fill: impl Into<Fill>) {          let Some(path) =              convert_path(path).and_then(|path| path.transform(self.transform))          else { @@ -61,7 +74,7 @@ impl Frame {              }));      } -    pub fn fill_rectangle( +    fn fill_rectangle(          &mut self,          top_left: Point,          size: Size, @@ -89,7 +102,7 @@ impl Frame {              }));      } -    pub fn stroke<'a>(&mut self, path: &Path, stroke: impl Into<Stroke<'a>>) { +    fn stroke<'a>(&mut self, path: &Path, stroke: impl Into<Stroke<'a>>) {          let Some(path) =              convert_path(path).and_then(|path| path.transform(self.transform))          else { @@ -110,7 +123,7 @@ impl Frame {              }));      } -    pub fn fill_text(&mut self, text: impl Into<Text>) { +    fn fill_text(&mut self, text: impl Into<Text>) {          let text = text.into();          let (scale_x, scale_y) = self.transform.get_scale(); @@ -174,51 +187,50 @@ impl Frame {          }      } -    pub fn push_transform(&mut self) { +    fn push_transform(&mut self) {          self.stack.push(self.transform);      } -    pub fn pop_transform(&mut self) { +    fn pop_transform(&mut self) {          self.transform = self.stack.pop().expect("Pop transform");      } -    pub fn clip(&mut self, frame: Self, at: Point) { +    fn draft(&mut self, size: Size) -> Self { +        Self::new(size) +    } + +    fn paste(&mut self, frame: Self, at: Point) {          self.primitives.push(Primitive::Transform {              transformation: Transformation::translate(at.x, at.y),              content: Box::new(frame.into_primitive()),          });      } -    pub fn translate(&mut self, translation: Vector) { +    fn translate(&mut self, translation: Vector) {          self.transform =              self.transform.pre_translate(translation.x, translation.y);      } -    pub fn rotate(&mut self, angle: impl Into<Radians>) { +    fn rotate(&mut self, angle: impl Into<Radians>) {          self.transform = self.transform.pre_concat(              tiny_skia::Transform::from_rotate(angle.into().0.to_degrees()),          );      } -    pub fn scale(&mut self, scale: impl Into<f32>) { +    fn scale(&mut self, scale: impl Into<f32>) {          let scale = scale.into();          self.scale_nonuniform(Vector { x: scale, y: scale });      } -    pub fn scale_nonuniform(&mut self, scale: impl Into<Vector>) { +    fn scale_nonuniform(&mut self, scale: impl Into<Vector>) {          let scale = scale.into();          self.transform = self.transform.pre_scale(scale.x, scale.y);      } -    pub fn into_primitive(self) -> Primitive { -        Primitive::Clip { -            bounds: Rectangle::new(Point::ORIGIN, self.size), -            content: Box::new(Primitive::Group { -                primitives: self.primitives, -            }), -        } +    fn into_geometry(self) -> Self::Geometry { +        self.into_primitive()      }  } diff --git a/tiny_skia/src/primitive.rs b/tiny_skia/src/primitive.rs index 7718d542..b7c428e4 100644 --- a/tiny_skia/src/primitive.rs +++ b/tiny_skia/src/primitive.rs @@ -1,5 +1,5 @@  use crate::core::Rectangle; -use crate::graphics::Damage; +use crate::graphics::{Damage, Mesh};  pub type Primitive = crate::graphics::Primitive<Custom>; @@ -42,3 +42,11 @@ impl Damage for Custom {          }      }  } + +impl TryFrom<Mesh> for Custom { +    type Error = &'static str; + +    fn try_from(_mesh: Mesh) -> Result<Self, Self::Error> { +        Err("unsupported") +    } +} diff --git a/tiny_skia/src/settings.rs b/tiny_skia/src/settings.rs index ec27b218..01d015b4 100644 --- a/tiny_skia/src/settings.rs +++ b/tiny_skia/src/settings.rs @@ -1,4 +1,5 @@  use crate::core::{Font, Pixels}; +use crate::graphics;  /// The settings of a [`Backend`].  /// @@ -22,3 +23,12 @@ impl Default for Settings {          }      }  } + +impl From<graphics::Settings> for Settings { +    fn from(settings: graphics::Settings) -> Self { +        Self { +            default_font: settings.default_font, +            default_text_size: settings.default_text_size, +        } +    } +} diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index a98825f1..25c57dc1 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -1,11 +1,11 @@  use crate::core::{Color, Rectangle, Size};  use crate::graphics::compositor::{self, Information};  use crate::graphics::damage; -use crate::graphics::{Error, Viewport}; +use crate::graphics::error::{self, Error}; +use crate::graphics::{self, Viewport};  use crate::{Backend, Primitive, Renderer, Settings};  use std::collections::VecDeque; -use std::future::{self, Future};  use std::num::NonZeroU32;  pub struct Compositor { @@ -25,15 +25,25 @@ pub struct Surface {  }  impl crate::graphics::Compositor for Compositor { -    type Settings = Settings;      type Renderer = Renderer;      type Surface = Surface; -    fn new<W: compositor::Window>( -        settings: Self::Settings, +    async fn with_backend<W: compositor::Window>( +        settings: graphics::Settings,          compatible_window: W, -    ) -> impl Future<Output = Result<Self, Error>> { -        future::ready(Ok(new(settings, compatible_window))) +        backend: Option<&str>, +    ) -> Result<Self, Error> { +        match backend { +            None | Some("tiny-skia") | Some("tiny_skia") => { +                Ok(new(settings.into(), compatible_window)) +            } +            Some(backend) => Err(Error::GraphicsAdapterNotFound { +                backend: "tiny-skia", +                reason: error::Reason::DidNotMatch { +                    preferred_backend: backend.to_owned(), +                }, +            }), +        }      }      fn create_renderer(&self) -> Self::Renderer { | 
