diff options
| author | 2023-03-01 21:34:26 +0100 | |
|---|---|---|
| committer | 2023-03-01 21:34:26 +0100 | |
| commit | 5fd5d1cdf8e5354788dc40729c4565ef377d3bba (patch) | |
| tree | 0921efc7dc13a3050e03482147a791f85515f1f2 /examples | |
| parent | 3f6e28fa9b1b8d911f765c9efb5249a9e0c942d5 (diff) | |
| download | iced-5fd5d1cdf8e5354788dc40729c4565ef377d3bba.tar.gz iced-5fd5d1cdf8e5354788dc40729c4565ef377d3bba.tar.bz2 iced-5fd5d1cdf8e5354788dc40729c4565ef377d3bba.zip | |
Implement `Canvas` support for `iced_tiny_skia`
Diffstat (limited to '')
| -rw-r--r-- | examples/arc/src/main.rs | 9 | ||||
| -rw-r--r-- | examples/bezier_tool/src/main.rs | 25 | ||||
| -rw-r--r-- | examples/clock/src/main.rs | 9 | ||||
| -rw-r--r-- | examples/color_palette/src/main.rs | 9 | ||||
| -rw-r--r-- | examples/game_of_life/src/main.rs | 73 | ||||
| -rw-r--r-- | examples/geometry/src/main.rs | 6 | ||||
| -rw-r--r-- | examples/modern_art/src/main.rs | 5 | ||||
| -rw-r--r-- | examples/multitouch/src/main.rs | 7 | ||||
| -rw-r--r-- | examples/sierpinski_triangle/src/main.rs | 9 | ||||
| -rw-r--r-- | examples/solar_system/src/main.rs | 28 | 
10 files changed, 100 insertions, 80 deletions
| diff --git a/examples/arc/src/main.rs b/examples/arc/src/main.rs index 7b6ea0e1..d71ba6f6 100644 --- a/examples/arc/src/main.rs +++ b/examples/arc/src/main.rs @@ -5,8 +5,8 @@ use iced::widget::canvas::{      self, stroke, Cache, Canvas, Cursor, Geometry, Path, Stroke,  };  use iced::{ -    Application, Command, Element, Length, Point, Rectangle, Settings, -    Subscription, Theme, +    Application, Command, Element, Length, Point, Rectangle, Renderer, +    Settings, Subscription, Theme,  };  pub fn main() -> iced::Result { @@ -69,17 +69,18 @@ impl Application for Arc {      }  } -impl<Message> canvas::Program<Message> for Arc { +impl<Message> canvas::Program<Message, Renderer> for Arc {      type State = ();      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let geometry = self.cache.draw(bounds.size(), |frame| { +        let geometry = self.cache.draw(renderer, bounds.size(), |frame| {              let palette = theme.palette();              let center = frame.center(); diff --git a/examples/bezier_tool/src/main.rs b/examples/bezier_tool/src/main.rs index 7c3916d4..5bb463c3 100644 --- a/examples/bezier_tool/src/main.rs +++ b/examples/bezier_tool/src/main.rs @@ -64,7 +64,7 @@ mod bezier {      use iced::widget::canvas::{          self, Canvas, Cursor, Frame, Geometry, Path, Stroke,      }; -    use iced::{Element, Length, Point, Rectangle, Theme}; +    use iced::{Element, Length, Point, Rectangle, Renderer, Theme};      #[derive(Default)]      pub struct State { @@ -92,7 +92,7 @@ mod bezier {          curves: &'a [Curve],      } -    impl<'a> canvas::Program<Curve> for Bezier<'a> { +    impl<'a> canvas::Program<Curve, Renderer> for Bezier<'a> {          type State = Option<Pending>;          fn update( @@ -152,22 +152,26 @@ mod bezier {          fn draw(              &self,              state: &Self::State, +            renderer: &Renderer,              _theme: &Theme,              bounds: Rectangle,              cursor: Cursor,          ) -> Vec<Geometry> { -            let content = -                self.state.cache.draw(bounds.size(), |frame: &mut Frame| { +            let content = self.state.cache.draw( +                renderer, +                bounds.size(), +                |frame: &mut Frame| {                      Curve::draw_all(self.curves, frame);                      frame.stroke(                          &Path::rectangle(Point::ORIGIN, frame.size()),                          Stroke::default().with_width(2.0),                      ); -                }); +                }, +            );              if let Some(pending) = state { -                let pending_curve = pending.draw(bounds, cursor); +                let pending_curve = pending.draw(renderer, bounds, cursor);                  vec![content, pending_curve]              } else { @@ -216,8 +220,13 @@ mod bezier {      }      impl Pending { -        fn draw(&self, bounds: Rectangle, cursor: Cursor) -> Geometry { -            let mut frame = Frame::new(bounds.size()); +        fn draw( +            &self, +            renderer: &Renderer, +            bounds: Rectangle, +            cursor: Cursor, +        ) -> Geometry { +            let mut frame = Frame::new(renderer, bounds.size());              if let Some(cursor_position) = cursor.position_in(&bounds) {                  match *self { diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs index a389c54f..6425e2da 100644 --- a/examples/clock/src/main.rs +++ b/examples/clock/src/main.rs @@ -4,8 +4,8 @@ use iced::widget::canvas::{  };  use iced::widget::{canvas, container};  use iced::{ -    Application, Color, Command, Element, Length, Point, Rectangle, Settings, -    Subscription, Theme, Vector, +    Application, Color, Command, Element, Length, Point, Rectangle, Renderer, +    Settings, Subscription, Theme, Vector,  };  pub fn main() -> iced::Result { @@ -83,17 +83,18 @@ impl Application for Clock {      }  } -impl<Message> canvas::Program<Message> for Clock { +impl<Message> canvas::Program<Message, Renderer> for Clock {      type State = ();      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let clock = self.clock.draw(bounds.size(), |frame| { +        let clock = self.clock.draw(renderer, bounds.size(), |frame| {              let center = frame.center();              let radius = frame.width().min(frame.height()) / 2.0; diff --git a/examples/color_palette/src/main.rs b/examples/color_palette/src/main.rs index a2df36c2..1109a883 100644 --- a/examples/color_palette/src/main.rs +++ b/examples/color_palette/src/main.rs @@ -1,8 +1,8 @@  use iced::widget::canvas::{self, Canvas, Cursor, Frame, Geometry, Path};  use iced::widget::{column, row, text, Slider};  use iced::{ -    alignment, Alignment, Color, Element, Length, Point, Rectangle, Sandbox, -    Settings, Size, Vector, +    alignment, Alignment, Color, Element, Length, Point, Rectangle, Renderer, +    Sandbox, Settings, Size, Vector,  };  use palette::{self, convert::FromColor, Hsl, Srgb};  use std::marker::PhantomData; @@ -237,17 +237,18 @@ impl Theme {      }  } -impl<Message> canvas::Program<Message> for Theme { +impl<Message> canvas::Program<Message, Renderer> for Theme {      type State = ();      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &iced::Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let theme = self.canvas_cache.draw(bounds.size(), |frame| { +        let theme = self.canvas_cache.draw(renderer, bounds.size(), |frame| {              self.draw(frame);          }); diff --git a/examples/game_of_life/src/main.rs b/examples/game_of_life/src/main.rs index ed911160..494f71a6 100644 --- a/examples/game_of_life/src/main.rs +++ b/examples/game_of_life/src/main.rs @@ -211,8 +211,8 @@ mod grid {          Cache, Canvas, Cursor, Frame, Geometry, Path, Text,      };      use iced::{ -        alignment, mouse, Color, Element, Length, Point, Rectangle, Size, -        Theme, Vector, +        alignment, mouse, Color, Element, Length, Point, Rectangle, Renderer, +        Size, Theme, Vector,      };      use rustc_hash::{FxHashMap, FxHashSet};      use std::future::Future; @@ -393,7 +393,7 @@ mod grid {          }      } -    impl canvas::Program<Message> for Grid { +    impl canvas::Program<Message, Renderer> for Grid {          type State = Interaction;          fn update( @@ -536,13 +536,14 @@ mod grid {          fn draw(              &self,              _interaction: &Interaction, +            renderer: &Renderer,              _theme: &Theme,              bounds: Rectangle,              cursor: Cursor,          ) -> Vec<Geometry> {              let center = Vector::new(bounds.width / 2.0, bounds.height / 2.0); -            let life = self.life_cache.draw(bounds.size(), |frame| { +            let life = self.life_cache.draw(renderer, bounds.size(), |frame| {                  let background = Path::rectangle(Point::ORIGIN, frame.size());                  frame.fill(&background, Color::from_rgb8(0x40, 0x44, 0x4B)); @@ -565,7 +566,7 @@ mod grid {              });              let overlay = { -                let mut frame = Frame::new(bounds.size()); +                let mut frame = Frame::new(renderer, bounds.size());                  let hovered_cell =                      cursor.position_in(&bounds).map(|position| { @@ -626,38 +627,40 @@ mod grid {              if self.scaling < 0.2 || !self.show_lines {                  vec![life, overlay]              } else { -                let grid = self.grid_cache.draw(bounds.size(), |frame| { -                    frame.translate(center); -                    frame.scale(self.scaling); -                    frame.translate(self.translation); -                    frame.scale(Cell::SIZE as f32); - -                    let region = self.visible_region(frame.size()); -                    let rows = region.rows(); -                    let columns = region.columns(); -                    let (total_rows, total_columns) = -                        (rows.clone().count(), columns.clone().count()); -                    let width = 2.0 / Cell::SIZE as f32; -                    let color = Color::from_rgb8(70, 74, 83); - -                    frame.translate(Vector::new(-width / 2.0, -width / 2.0)); +                let grid = +                    self.grid_cache.draw(renderer, bounds.size(), |frame| { +                        frame.translate(center); +                        frame.scale(self.scaling); +                        frame.translate(self.translation); +                        frame.scale(Cell::SIZE as f32); -                    for row in region.rows() { -                        frame.fill_rectangle( -                            Point::new(*columns.start() as f32, row as f32), -                            Size::new(total_columns as f32, width), -                            color, -                        ); -                    } +                        let region = self.visible_region(frame.size()); +                        let rows = region.rows(); +                        let columns = region.columns(); +                        let (total_rows, total_columns) = +                            (rows.clone().count(), columns.clone().count()); +                        let width = 2.0 / Cell::SIZE as f32; +                        let color = Color::from_rgb8(70, 74, 83); + +                        frame +                            .translate(Vector::new(-width / 2.0, -width / 2.0)); + +                        for row in region.rows() { +                            frame.fill_rectangle( +                                Point::new(*columns.start() as f32, row as f32), +                                Size::new(total_columns as f32, width), +                                color, +                            ); +                        } -                    for column in region.columns() { -                        frame.fill_rectangle( -                            Point::new(column as f32, *rows.start() as f32), -                            Size::new(width, total_rows as f32), -                            color, -                        ); -                    } -                }); +                        for column in region.columns() { +                            frame.fill_rectangle( +                                Point::new(column as f32, *rows.start() as f32), +                                Size::new(width, total_rows as f32), +                                color, +                            ); +                        } +                    });                  vec![life, grid, overlay]              } diff --git a/examples/geometry/src/main.rs b/examples/geometry/src/main.rs index 9bacce7f..a77772d5 100644 --- a/examples/geometry/src/main.rs +++ b/examples/geometry/src/main.rs @@ -10,9 +10,9 @@ mod rainbow {      // Of course, you can choose to make the implementation renderer-agnostic,      // if you wish to, by creating your own `Renderer` trait, which could be      // implemented by `iced_wgpu` and other renderers. +    use iced_graphics::primitive::{ColoredVertex2D, Primitive};      use iced_graphics::renderer::{self, Renderer}; -    use iced_graphics::triangle::ColoredVertex2D; -    use iced_graphics::{Backend, Primitive}; +    use iced_graphics::Backend;      use iced_native::layout;      use iced_native::widget::{self, Widget}; @@ -59,7 +59,7 @@ mod rainbow {              cursor_position: Point,              _viewport: &Rectangle,          ) { -            use iced_graphics::triangle::Mesh2D; +            use iced_graphics::primitive::Mesh2D;              use iced_native::Renderer as _;              let b = layout.bounds(); diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index 28ed3e21..a43a2b2b 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -55,17 +55,18 @@ impl Application for ModernArt {      }  } -impl<Message> canvas::Program<Message> for ModernArt { +impl<Message> canvas::Program<Message, Renderer> for ModernArt {      type State = ();      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let geometry = self.cache.draw(bounds.size(), |frame| { +        let geometry = self.cache.draw(renderer, bounds.size(), |frame| {              let num_squares = thread_rng().gen_range(0..1200);              let mut i = 0; diff --git a/examples/multitouch/src/main.rs b/examples/multitouch/src/main.rs index f5faae0f..7df6c929 100644 --- a/examples/multitouch/src/main.rs +++ b/examples/multitouch/src/main.rs @@ -6,7 +6,7 @@ use iced::widget::canvas::stroke::{self, Stroke};  use iced::widget::canvas::{self, Canvas, Cursor, Geometry};  use iced::{      executor, touch, window, Application, Color, Command, Element, Length, -    Point, Rectangle, Settings, Subscription, Theme, +    Point, Rectangle, Renderer, Settings, Subscription, Theme,  };  use std::collections::HashMap; @@ -95,7 +95,7 @@ impl Application for Multitouch {      }  } -impl canvas::Program<Message> for State { +impl canvas::Program<Message, Renderer> for State {      type State = ();      fn update( @@ -125,11 +125,12 @@ impl canvas::Program<Message> for State {      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let fingerweb = self.cache.draw(bounds.size(), |frame| { +        let fingerweb = self.cache.draw(renderer, bounds.size(), |frame| {              if self.fingers.len() < 2 {                  return;              } diff --git a/examples/sierpinski_triangle/src/main.rs b/examples/sierpinski_triangle/src/main.rs index 1d25d171..e85f8391 100644 --- a/examples/sierpinski_triangle/src/main.rs +++ b/examples/sierpinski_triangle/src/main.rs @@ -5,8 +5,8 @@ use iced::widget::canvas::event::{self, Event};  use iced::widget::canvas::{self, Canvas};  use iced::widget::{column, row, slider, text};  use iced::{ -    Application, Color, Command, Length, Point, Rectangle, Settings, Size, -    Theme, +    Application, Color, Command, Length, Point, Rectangle, Renderer, Settings, +    Size, Theme,  };  use rand::Rng; @@ -97,7 +97,7 @@ struct SierpinskiGraph {      cache: canvas::Cache,  } -impl canvas::Program<Message> for SierpinskiGraph { +impl canvas::Program<Message, Renderer> for SierpinskiGraph {      type State = ();      fn update( @@ -134,11 +134,12 @@ impl canvas::Program<Message> for SierpinskiGraph {      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: canvas::Cursor,      ) -> Vec<canvas::Geometry> { -        let geom = self.cache.draw(bounds.size(), |frame| { +        let geom = self.cache.draw(renderer, bounds.size(), |frame| {              frame.stroke(                  &canvas::Path::rectangle(Point::ORIGIN, frame.size()),                  canvas::Stroke::default(), diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 9a4ee754..0023a69b 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -15,8 +15,8 @@ use iced::widget::canvas::stroke::{self, Stroke};  use iced::widget::canvas::{Cursor, Path};  use iced::window;  use iced::{ -    Application, Color, Command, Element, Length, Point, Rectangle, Settings, -    Size, Subscription, Vector, +    Application, Color, Command, Element, Length, Point, Rectangle, Renderer, +    Settings, Size, Subscription, Vector,  };  use std::time::Instant; @@ -150,30 +150,32 @@ impl State {      }  } -impl<Message> canvas::Program<Message> for State { +impl<Message> canvas::Program<Message, Renderer> for State {      type State = ();      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<canvas::Geometry> {          use std::f32::consts::PI; -        let background = self.space_cache.draw(bounds.size(), |frame| { -            let stars = Path::new(|path| { -                for (p, size) in &self.stars { -                    path.rectangle(*p, Size::new(*size, *size)); -                } -            }); +        let background = +            self.space_cache.draw(renderer, bounds.size(), |frame| { +                let stars = Path::new(|path| { +                    for (p, size) in &self.stars { +                        path.rectangle(*p, Size::new(*size, *size)); +                    } +                }); -            frame.translate(frame.center() - Point::ORIGIN); -            frame.fill(&stars, Color::WHITE); -        }); +                frame.translate(frame.center() - Point::ORIGIN); +                frame.fill(&stars, Color::WHITE); +            }); -        let system = self.system_cache.draw(bounds.size(), |frame| { +        let system = self.system_cache.draw(renderer, bounds.size(), |frame| {              let center = frame.center();              let sun = Path::circle(center, Self::SUN_RADIUS); | 
