From 40f45d7b7e35dd4937abe6b5ce16b6256b4f1eeb Mon Sep 17 00:00:00 2001 From: shan Date: Thu, 29 Sep 2022 10:52:58 -0700 Subject: Adds linear gradient support to 2D meshes in the canvas widget. --- graphics/src/widget/canvas/fill.rs | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 56495435..02d2311f 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -1,12 +1,14 @@ use iced_native::Color; +use crate::widget::canvas::Gradient; + /// The style used to fill geometry. -#[derive(Debug, Clone, Copy)] -pub struct Fill { - /// The color used to fill geometry. +#[derive(Debug, Clone)] +pub struct Fill<'a> { + /// The color or gradient of the fill. /// - /// By default, it is set to `BLACK`. - pub color: Color, + /// By default, it is set to [`FillStyle::Solid`] `BLACK`. + pub style: FillStyle<'a>, /// The fill rule defines how to determine what is inside and what is /// outside of a shape. @@ -19,24 +21,33 @@ pub struct Fill { pub rule: FillRule, } -impl Default for Fill { - fn default() -> Fill { +impl <'a> Default for Fill<'a> { + fn default() -> Fill<'a> { Fill { - color: Color::BLACK, + style: FillStyle::Solid(Color::BLACK), rule: FillRule::NonZero, } } } -impl From for Fill { - fn from(color: Color) -> Fill { +impl<'a> From for Fill<'a> { + fn from(color: Color) -> Fill<'a> { Fill { - color, + style: FillStyle::Solid(color), ..Fill::default() } } } +/// The color or gradient of a [`Fill`]. +#[derive(Debug, Clone)] +pub enum FillStyle<'a> { + /// A solid color + Solid(Color), + /// A color gradient + Gradient(&'a Gradient), +} + /// The fill rule defines how to determine what is inside and what is outside of /// a shape. /// -- cgit From 5d0fffc626928177239336757507b986b081b878 Mon Sep 17 00:00:00 2001 From: shan Date: Fri, 30 Sep 2022 10:27:00 -0700 Subject: Fixed some importing issues since you can use a Shader::Gradient outside a Canvas widget, where it was previously only accessible. --- graphics/src/widget/canvas/fill.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 02d2311f..60029e03 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -1,6 +1,6 @@ use iced_native::Color; - -use crate::widget::canvas::Gradient; +use crate::gradient::Gradient; +use crate::shader::Shader; /// The style used to fill geometry. #[derive(Debug, Clone)] @@ -48,6 +48,15 @@ pub enum FillStyle<'a> { Gradient(&'a Gradient), } +impl <'a> Into for FillStyle<'a> { + fn into(self) -> Shader { + match self { + FillStyle::Solid(color) => Shader::Solid(color), + FillStyle::Gradient(gradient) => gradient.clone().into() + } + } +} + /// The fill rule defines how to determine what is inside and what is outside of /// a shape. /// -- cgit From 6e7b3ced0b1daf368e44e181ecdb4ae529877eb6 Mon Sep 17 00:00:00 2001 From: shan Date: Tue, 4 Oct 2022 18:24:46 -0700 Subject: Reworked wgpu buffers, updated glow side to have proper transform location storage, attempting to fix visibility modifiers, implemented some of the feedback received in initial PR. --- graphics/src/widget/canvas/fill.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 60029e03..6f10505c 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -8,7 +8,7 @@ pub struct Fill<'a> { /// The color or gradient of the fill. /// /// By default, it is set to [`FillStyle::Solid`] `BLACK`. - pub style: FillStyle<'a>, + pub style: Style<'a>, /// The fill rule defines how to determine what is inside and what is /// outside of a shape. @@ -24,7 +24,7 @@ pub struct Fill<'a> { impl <'a> Default for Fill<'a> { fn default() -> Fill<'a> { Fill { - style: FillStyle::Solid(Color::BLACK), + style: Style::Solid(Color::BLACK), rule: FillRule::NonZero, } } @@ -33,7 +33,7 @@ impl <'a> Default for Fill<'a> { impl<'a> From for Fill<'a> { fn from(color: Color) -> Fill<'a> { Fill { - style: FillStyle::Solid(color), + style: Style::Solid(color), ..Fill::default() } } @@ -41,18 +41,18 @@ impl<'a> From for Fill<'a> { /// The color or gradient of a [`Fill`]. #[derive(Debug, Clone)] -pub enum FillStyle<'a> { +pub enum Style<'a> { /// A solid color Solid(Color), /// A color gradient Gradient(&'a Gradient), } -impl <'a> Into for FillStyle<'a> { +impl <'a> Into for Style<'a> { fn into(self) -> Shader { match self { - FillStyle::Solid(color) => Shader::Solid(color), - FillStyle::Gradient(gradient) => gradient.clone().into() + Style::Solid(color) => Shader::Solid(color), + Style::Gradient(gradient) => gradient.clone().into() } } } -- cgit From 30432cbade3d9b25c4df62656a7494db3f4ea82a Mon Sep 17 00:00:00 2001 From: shan Date: Wed, 5 Oct 2022 10:49:58 -0700 Subject: Readjusted namespaces, removed Geometry example as it's no longer relevant. --- graphics/src/widget/canvas/fill.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 6f10505c..55cb3966 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -1,6 +1,8 @@ -use iced_native::Color; +//! Fill [crate::widget::canvas::Geometry] with a certain style. + use crate::gradient::Gradient; -use crate::shader::Shader; +use crate::layer::mesh; +use iced_native::Color; /// The style used to fill geometry. #[derive(Debug, Clone)] @@ -21,7 +23,7 @@ pub struct Fill<'a> { pub rule: FillRule, } -impl <'a> Default for Fill<'a> { +impl<'a> Default for Fill<'a> { fn default() -> Fill<'a> { Fill { style: Style::Solid(Color::BLACK), @@ -48,11 +50,11 @@ pub enum Style<'a> { Gradient(&'a Gradient), } -impl <'a> Into for Style<'a> { - fn into(self) -> Shader { +impl<'a> Into for Style<'a> { + fn into(self) -> mesh::Style { match self { - Style::Solid(color) => Shader::Solid(color), - Style::Gradient(gradient) => gradient.clone().into() + Style::Solid(color) => mesh::Style::Solid(color), + Style::Gradient(gradient) => gradient.clone().into(), } } } -- cgit From 9c7bf417ac9c1ac72bcc55aa3cd5e8eb962243a2 Mon Sep 17 00:00:00 2001 From: shan Date: Thu, 6 Oct 2022 16:57:38 -0700 Subject: Added support for gradients to respect current frame transform. --- graphics/src/widget/canvas/fill.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 55cb3966..768c2b9c 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -3,6 +3,7 @@ use crate::gradient::Gradient; use crate::layer::mesh; use iced_native::Color; +use crate::widget::canvas::frame::Transform; /// The style used to fill geometry. #[derive(Debug, Clone)] @@ -50,11 +51,16 @@ pub enum Style<'a> { Gradient(&'a Gradient), } -impl<'a> Into for Style<'a> { - fn into(self) -> mesh::Style { +impl<'a> Style<'a> { + /// Converts a fill's [Style] to a [mesh::Style] for use in the renderer's shader. + pub(crate) fn as_mesh_style(&self, transform: &Transform) -> mesh::Style { match self { - Style::Solid(color) => mesh::Style::Solid(color), - Style::Gradient(gradient) => gradient.clone().into(), + Style::Solid(color) => { + mesh::Style::Solid(*color) + }, + Style::Gradient(gradient) => { + mesh::Style::Gradient((*gradient).clone().transform(transform)) + } } } } -- cgit From f9a6efcaa03728f43aaa105af8936c1ed4778388 Mon Sep 17 00:00:00 2001 From: shan Date: Thu, 6 Oct 2022 19:41:00 -0700 Subject: Fixed some more imports/documentation. --- graphics/src/widget/canvas/fill.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 768c2b9c..cd56aa9e 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -42,7 +42,7 @@ impl<'a> From for Fill<'a> { } } -/// The color or gradient of a [`Fill`]. +/// The style of a [`Fill`]. #[derive(Debug, Clone)] pub enum Style<'a> { /// A solid color -- cgit From a4a1262fa2d625be5ad7a37e409e0e9c399b09b6 Mon Sep 17 00:00:00 2001 From: shan Date: Fri, 7 Oct 2022 16:28:13 -0700 Subject: Fixed import issue with canvas in the gradient mod for situations where canvas feature is not enabled. --- graphics/src/widget/canvas/fill.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index cd56aa9e..477a7020 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -42,6 +42,15 @@ impl<'a> From for Fill<'a> { } } +impl<'a> Into> for &'a Gradient { + fn into(self) -> Fill<'a> { + Fill { + style: Style::Gradient(self), + ..Default::default() + } + } +} + /// The style of a [`Fill`]. #[derive(Debug, Clone)] pub enum Style<'a> { @@ -59,7 +68,11 @@ impl<'a> Style<'a> { mesh::Style::Solid(*color) }, Style::Gradient(gradient) => { - mesh::Style::Gradient((*gradient).clone().transform(transform)) + let mut gradient = (*gradient).clone(); + let coordinates = gradient.coords(); + transform.transform_point(coordinates.0); + transform.transform_point(coordinates.1); + mesh::Style::Gradient(gradient) } } } -- cgit From fd5e1e5ab0b712cd6719733b5a68602176ae5ec4 Mon Sep 17 00:00:00 2001 From: shan Date: Fri, 7 Oct 2022 16:55:55 -0700 Subject: Adjusted gradient transform function to be more readable. --- graphics/src/widget/canvas/fill.rs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 477a7020..34cc5e50 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -67,13 +67,9 @@ impl<'a> Style<'a> { Style::Solid(color) => { mesh::Style::Solid(*color) }, - Style::Gradient(gradient) => { - let mut gradient = (*gradient).clone(); - let coordinates = gradient.coords(); - transform.transform_point(coordinates.0); - transform.transform_point(coordinates.1); - mesh::Style::Gradient(gradient) - } + Style::Gradient(gradient) => mesh::Style::Gradient( + transform.transform_gradient((*gradient).clone()), + ), } } } -- cgit From 20a0577034b40a6bbabee9bbbfc085f3fd5016c0 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 04:33:54 +0100 Subject: Reuse last buffer in `Frame` if `mesh_style` matches --- graphics/src/widget/canvas/fill.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 34cc5e50..9582bf27 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -2,8 +2,8 @@ use crate::gradient::Gradient; use crate::layer::mesh; -use iced_native::Color; use crate::widget::canvas::frame::Transform; +use iced_native::Color; /// The style used to fill geometry. #[derive(Debug, Clone)] @@ -64,9 +64,7 @@ impl<'a> Style<'a> { /// Converts a fill's [Style] to a [mesh::Style] for use in the renderer's shader. pub(crate) fn as_mesh_style(&self, transform: &Transform) -> mesh::Style { match self { - Style::Solid(color) => { - mesh::Style::Solid(*color) - }, + Style::Solid(color) => mesh::Style::Solid(*color), Style::Gradient(gradient) => mesh::Style::Gradient( transform.transform_gradient((*gradient).clone()), ), -- cgit From 7e22e2d45293c5916812be03dc7367134b69b3ad Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 04:53:27 +0100 Subject: Fix lints by `clippy` --- graphics/src/widget/canvas/fill.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 9582bf27..2be8ed41 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -42,10 +42,10 @@ impl<'a> From for Fill<'a> { } } -impl<'a> Into> for &'a Gradient { - fn into(self) -> Fill<'a> { +impl<'a> From<&'a Gradient> for Fill<'a> { + fn from(gradient: &'a Gradient) -> Self { Fill { - style: Style::Gradient(self), + style: Style::Gradient(gradient), ..Default::default() } } -- cgit From 84d1b79fefc88534835fdfbe79bc0eb3b43627cf Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 3 Nov 2022 05:50:53 +0100 Subject: Move `mesh::Style` to `triangle` and reuse it in `fill` and `stroke` --- graphics/src/widget/canvas/fill.rs | 45 ++++++++++---------------------------- 1 file changed, 11 insertions(+), 34 deletions(-) (limited to 'graphics/src/widget/canvas/fill.rs') diff --git a/graphics/src/widget/canvas/fill.rs b/graphics/src/widget/canvas/fill.rs index 2be8ed41..c69fc0d7 100644 --- a/graphics/src/widget/canvas/fill.rs +++ b/graphics/src/widget/canvas/fill.rs @@ -1,17 +1,15 @@ //! Fill [crate::widget::canvas::Geometry] with a certain style. +use crate::{Color, Gradient}; -use crate::gradient::Gradient; -use crate::layer::mesh; -use crate::widget::canvas::frame::Transform; -use iced_native::Color; +pub use crate::triangle::Style; /// The style used to fill geometry. #[derive(Debug, Clone)] -pub struct Fill<'a> { +pub struct Fill { /// The color or gradient of the fill. /// /// By default, it is set to [`FillStyle::Solid`] `BLACK`. - pub style: Style<'a>, + pub style: Style, /// The fill rule defines how to determine what is inside and what is /// outside of a shape. @@ -24,17 +22,17 @@ pub struct Fill<'a> { pub rule: FillRule, } -impl<'a> Default for Fill<'a> { - fn default() -> Fill<'a> { - Fill { +impl Default for Fill { + fn default() -> Self { + Self { style: Style::Solid(Color::BLACK), rule: FillRule::NonZero, } } } -impl<'a> From for Fill<'a> { - fn from(color: Color) -> Fill<'a> { +impl From for Fill { + fn from(color: Color) -> Fill { Fill { style: Style::Solid(color), ..Fill::default() @@ -42,8 +40,8 @@ impl<'a> From for Fill<'a> { } } -impl<'a> From<&'a Gradient> for Fill<'a> { - fn from(gradient: &'a Gradient) -> Self { +impl From for Fill { + fn from(gradient: Gradient) -> Self { Fill { style: Style::Gradient(gradient), ..Default::default() @@ -51,27 +49,6 @@ impl<'a> From<&'a Gradient> for Fill<'a> { } } -/// The style of a [`Fill`]. -#[derive(Debug, Clone)] -pub enum Style<'a> { - /// A solid color - Solid(Color), - /// A color gradient - Gradient(&'a Gradient), -} - -impl<'a> Style<'a> { - /// Converts a fill's [Style] to a [mesh::Style] for use in the renderer's shader. - pub(crate) fn as_mesh_style(&self, transform: &Transform) -> mesh::Style { - match self { - Style::Solid(color) => mesh::Style::Solid(*color), - Style::Gradient(gradient) => mesh::Style::Gradient( - transform.transform_gradient((*gradient).clone()), - ), - } - } -} - /// The fill rule defines how to determine what is inside and what is outside of /// a shape. /// -- cgit