diff options
| author | 2024-08-04 14:52:29 +0200 | |
|---|---|---|
| committer | 2024-08-04 14:52:29 +0200 | |
| commit | 145c3dc8fc4f92c400fbc3f8202ed22e1d498663 (patch) | |
| tree | fe48b8e7f0021100aa2a0c697437527212af3475 /graphics | |
| parent | 9cccaebb04944f2295cadff716d9708f4caa5642 (diff) | |
| parent | cc076903dda18f79dbd82238f7a8216bab8c679d (diff) | |
| download | iced-145c3dc8fc4f92c400fbc3f8202ed22e1d498663.tar.gz iced-145c3dc8fc4f92c400fbc3f8202ed22e1d498663.tar.bz2 iced-145c3dc8fc4f92c400fbc3f8202ed22e1d498663.zip  | |
Merge pull request #2537 from iced-rs/feature/canvas-image-support
`image` and `svg` support for `canvas`
Diffstat (limited to '')
| -rw-r--r-- | graphics/Cargo.toml | 1 | ||||
| -rw-r--r-- | graphics/src/geometry.rs | 1 | ||||
| -rw-r--r-- | graphics/src/geometry/frame.rs | 31 | ||||
| -rw-r--r-- | graphics/src/image.rs | 45 | 
4 files changed, 33 insertions, 45 deletions
diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index e8d27d07..7e2d767b 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -20,6 +20,7 @@ all-features = true  [features]  geometry = ["lyon_path"]  image = ["dep:image", "kamadak-exif"] +svg = []  web-colors = []  fira-sans = [] diff --git a/graphics/src/geometry.rs b/graphics/src/geometry.rs index ab4a7a36..2b4b45a6 100644 --- a/graphics/src/geometry.rs +++ b/graphics/src/geometry.rs @@ -16,6 +16,7 @@ pub use stroke::{LineCap, LineDash, LineJoin, Stroke};  pub use style::Style;  pub use text::Text; +pub use crate::core::{Image, Svg};  pub use crate::gradient::{self, Gradient};  use crate::cache::Cached; diff --git a/graphics/src/geometry/frame.rs b/graphics/src/geometry/frame.rs index 377589d7..b5f2f139 100644 --- a/graphics/src/geometry/frame.rs +++ b/graphics/src/geometry/frame.rs @@ -1,6 +1,6 @@  //! Draw and generate geometry.  use crate::core::{Point, Radians, Rectangle, Size, Vector}; -use crate::geometry::{self, Fill, Path, Stroke, Text}; +use crate::geometry::{self, Fill, Image, Path, Stroke, Svg, Text};  /// The region of a surface that can be used to draw geometry.  #[allow(missing_debug_implementations)] @@ -75,6 +75,18 @@ where          self.raw.fill_text(text);      } +    /// Draws the given [`Image`] on the [`Frame`] inside the given bounds. +    #[cfg(feature = "image")] +    pub fn draw_image(&mut self, bounds: Rectangle, image: impl Into<Image>) { +        self.raw.draw_image(bounds, image); +    } + +    /// Draws the given [`Svg`] on the [`Frame`] inside the given bounds. +    #[cfg(feature = "svg")] +    pub fn draw_svg(&mut self, bounds: Rectangle, svg: impl Into<Svg>) { +        self.raw.draw_svg(bounds, svg); +    } +      /// Stores the current transform of the [`Frame`] and executes the given      /// drawing operations, restoring the transform afterwards.      /// @@ -116,8 +128,7 @@ where          let mut frame = self.draft(region);          let result = f(&mut frame); - -        self.paste(frame, Point::new(region.x, region.y)); +        self.paste(frame);          result      } @@ -134,8 +145,8 @@ where      }      /// Draws the contents of the given [`Frame`] with origin at the given [`Point`]. -    fn paste(&mut self, frame: Self, at: Point) { -        self.raw.paste(frame.raw, at); +    fn paste(&mut self, frame: Self) { +        self.raw.paste(frame.raw);      }      /// Applies a translation to the current transform of the [`Frame`]. @@ -186,7 +197,7 @@ pub trait Backend: Sized {      fn scale_nonuniform(&mut self, scale: impl Into<Vector>);      fn draft(&mut self, clip_bounds: Rectangle) -> Self; -    fn paste(&mut self, frame: Self, at: Point); +    fn paste(&mut self, frame: Self);      fn stroke<'a>(&mut self, path: &Path, stroke: impl Into<Stroke<'a>>); @@ -199,6 +210,9 @@ pub trait Backend: Sized {          fill: impl Into<Fill>,      ); +    fn draw_image(&mut self, bounds: Rectangle, image: impl Into<Image>); +    fn draw_svg(&mut self, bounds: Rectangle, svg: impl Into<Svg>); +      fn into_geometry(self) -> Self::Geometry;  } @@ -231,7 +245,7 @@ impl Backend for () {      fn scale_nonuniform(&mut self, _scale: impl Into<Vector>) {}      fn draft(&mut self, _clip_bounds: Rectangle) -> Self {} -    fn paste(&mut self, _frame: Self, _at: Point) {} +    fn paste(&mut self, _frame: Self) {}      fn stroke<'a>(&mut self, _path: &Path, _stroke: impl Into<Stroke<'a>>) {} @@ -245,5 +259,8 @@ impl Backend for () {      ) {      } +    fn draw_image(&mut self, _bounds: Rectangle, _image: impl Into<Image>) {} +    fn draw_svg(&mut self, _bounds: Rectangle, _svg: impl Into<Svg>) {} +      fn into_geometry(self) -> Self::Geometry {}  } diff --git a/graphics/src/image.rs b/graphics/src/image.rs index 318592be..67a5e0cf 100644 --- a/graphics/src/image.rs +++ b/graphics/src/image.rs @@ -2,57 +2,26 @@  #[cfg(feature = "image")]  pub use ::image as image_rs; -use crate::core::{image, svg, Color, Radians, Rectangle}; +use crate::core::image; +use crate::core::svg; +use crate::core::Rectangle;  /// A raster or vector image.  #[derive(Debug, Clone, PartialEq)]  pub enum Image {      /// A raster image. -    Raster { -        /// The handle of a raster image. -        handle: image::Handle, +    Raster(image::Image, Rectangle), -        /// The filter method of a raster image. -        filter_method: image::FilterMethod, - -        /// The bounds of the image. -        bounds: Rectangle, - -        /// The rotation of the image. -        rotation: Radians, - -        /// The opacity of the image. -        opacity: f32, -    },      /// A vector image. -    Vector { -        /// The handle of a vector image. -        handle: svg::Handle, - -        /// The [`Color`] filter -        color: Option<Color>, - -        /// The bounds of the image. -        bounds: Rectangle, - -        /// The rotation of the image. -        rotation: Radians, - -        /// The opacity of the image. -        opacity: f32, -    }, +    Vector(svg::Svg, Rectangle),  }  impl Image {      /// Returns the bounds of the [`Image`].      pub fn bounds(&self) -> Rectangle {          match self { -            Image::Raster { -                bounds, rotation, .. -            } -            | Image::Vector { -                bounds, rotation, .. -            } => bounds.rotate(*rotation), +            Image::Raster(image, bounds) => bounds.rotate(image.rotation), +            Image::Vector(svg, bounds) => bounds.rotate(svg.rotation),          }      }  }  | 
