From cc906c83cdf896d94b7ccf91258466714be631f6 Mon Sep 17 00:00:00 2001 From: Nick Senger Date: Wed, 8 Nov 2023 19:12:53 -0800 Subject: feat: quad shadows --- graphics/src/damage.rs | 25 ++++++++++++++++++++++--- graphics/src/primitive.rs | 6 ++++++ graphics/src/renderer.rs | 3 +++ 3 files changed, 31 insertions(+), 3 deletions(-) (limited to 'graphics/src') diff --git a/graphics/src/damage.rs b/graphics/src/damage.rs index 59e9f5b4..2aec9b25 100644 --- a/graphics/src/damage.rs +++ b/graphics/src/damage.rs @@ -78,9 +78,28 @@ impl Damage for Primitive { // damage bounds (?) raw.clip_bounds.expand(1.5) } - Self::Quad { bounds, .. } - | Self::Image { bounds, .. } - | Self::Svg { bounds, .. } => bounds.expand(1.0), + Self::Quad { + bounds, + shadow_offset, + shadow_blur_radius, + .. + } => { + let bounds_with_shadow = Rectangle { + x: bounds.x + shadow_offset.x.min(0.0) - shadow_blur_radius, + y: bounds.y + shadow_offset.y.min(0.0) - shadow_blur_radius, + width: bounds.width + + shadow_offset.x.abs() + + shadow_blur_radius * 2.0, + height: bounds.height + + shadow_offset.y.abs() + + shadow_blur_radius * 2.0, + }; + + bounds_with_shadow.expand(1.0) + } + Self::Image { bounds, .. } | Self::Svg { bounds, .. } => { + bounds.expand(1.0) + } Self::Clip { bounds, .. } => bounds.expand(1.0), Self::Group { primitives } => primitives .iter() diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs index 20affaaf..795d9609 100644 --- a/graphics/src/primitive.rs +++ b/graphics/src/primitive.rs @@ -71,6 +71,12 @@ pub enum Primitive { border_width: f32, /// The border color of the quad border_color: Color, + /// The shadow color of the quad + shadow_color: Color, + /// The shadow offset of the quad + shadow_offset: Vector, + /// The shadow blur radius of the quad + shadow_blur_radius: f32, }, /// An image primitive Image { diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs index 1b0f5c5b..bd640097 100644 --- a/graphics/src/renderer.rs +++ b/graphics/src/renderer.rs @@ -127,6 +127,9 @@ impl iced_core::Renderer for Renderer { border_radius: quad.border_radius.into(), border_width: quad.border_width, border_color: quad.border_color, + shadow_color: quad.shadow.color, + shadow_offset: quad.shadow.offset, + shadow_blur_radius: quad.shadow.blur_radius, }); } -- cgit From b7b457a575cdd103915994f640c50262ce30a7c5 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 20 Jan 2024 12:11:18 +0100 Subject: Make `shadow` optional in `renderer::Quad` --- graphics/src/damage.rs | 21 ++++++++++----------- graphics/src/primitive.rs | 12 +++++------- graphics/src/renderer.rs | 4 +--- 3 files changed, 16 insertions(+), 21 deletions(-) (limited to 'graphics/src') diff --git a/graphics/src/damage.rs b/graphics/src/damage.rs index 2aec9b25..cced0c97 100644 --- a/graphics/src/damage.rs +++ b/graphics/src/damage.rs @@ -80,26 +80,25 @@ impl Damage for Primitive { } Self::Quad { bounds, - shadow_offset, - shadow_blur_radius, + shadow: Some(shadow), .. } => { let bounds_with_shadow = Rectangle { - x: bounds.x + shadow_offset.x.min(0.0) - shadow_blur_radius, - y: bounds.y + shadow_offset.y.min(0.0) - shadow_blur_radius, + x: bounds.x + shadow.offset.x.min(0.0) - shadow.blur_radius, + y: bounds.y + shadow.offset.y.min(0.0) - shadow.blur_radius, width: bounds.width - + shadow_offset.x.abs() - + shadow_blur_radius * 2.0, + + shadow.offset.x.abs() + + shadow.blur_radius * 2.0, height: bounds.height - + shadow_offset.y.abs() - + shadow_blur_radius * 2.0, + + shadow.offset.y.abs() + + shadow.blur_radius * 2.0, }; bounds_with_shadow.expand(1.0) } - Self::Image { bounds, .. } | Self::Svg { bounds, .. } => { - bounds.expand(1.0) - } + Self::Quad { bounds, .. } + | Self::Image { bounds, .. } + | Self::Svg { bounds, .. } => bounds.expand(1.0), Self::Clip { bounds, .. } => bounds.expand(1.0), Self::Group { primitives } => primitives .iter() diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs index 795d9609..a428c31a 100644 --- a/graphics/src/primitive.rs +++ b/graphics/src/primitive.rs @@ -3,7 +3,9 @@ use crate::core::alignment; use crate::core::image; use crate::core::svg; use crate::core::text; -use crate::core::{Background, Color, Font, Pixels, Point, Rectangle, Vector}; +use crate::core::{ + Background, Color, Font, Pixels, Point, Rectangle, Shadow, Vector, +}; use crate::text::editor; use crate::text::paragraph; @@ -71,12 +73,8 @@ pub enum Primitive { border_width: f32, /// The border color of the quad border_color: Color, - /// The shadow color of the quad - shadow_color: Color, - /// The shadow offset of the quad - shadow_offset: Vector, - /// The shadow blur radius of the quad - shadow_blur_radius: f32, + /// The [`Shadow`] of the quad + shadow: Option, }, /// An image primitive Image { diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs index bd640097..6f312331 100644 --- a/graphics/src/renderer.rs +++ b/graphics/src/renderer.rs @@ -127,9 +127,7 @@ impl iced_core::Renderer for Renderer { border_radius: quad.border_radius.into(), border_width: quad.border_width, border_color: quad.border_color, - shadow_color: quad.shadow.color, - shadow_offset: quad.shadow.offset, - shadow_blur_radius: quad.shadow.blur_radius, + shadow: quad.shadow, }); } -- cgit From 25f182f933ea6b7c112c8f9a450a98dc9b9eebdd Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 20 Jan 2024 13:29:25 +0100 Subject: Introduce `Border` struct analogous to `Shadow` --- graphics/src/damage.rs | 6 +----- graphics/src/primitive.rs | 12 ++++-------- graphics/src/renderer.rs | 4 +--- 3 files changed, 6 insertions(+), 16 deletions(-) (limited to 'graphics/src') diff --git a/graphics/src/damage.rs b/graphics/src/damage.rs index cced0c97..ba9192ef 100644 --- a/graphics/src/damage.rs +++ b/graphics/src/damage.rs @@ -78,11 +78,7 @@ impl Damage for Primitive { // damage bounds (?) raw.clip_bounds.expand(1.5) } - Self::Quad { - bounds, - shadow: Some(shadow), - .. - } => { + Self::Quad { bounds, shadow, .. } if shadow.color.a > 0.0 => { let bounds_with_shadow = Rectangle { x: bounds.x + shadow.offset.x.min(0.0) - shadow.blur_radius, y: bounds.y + shadow.offset.y.min(0.0) - shadow.blur_radius, diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs index a428c31a..aed59e1a 100644 --- a/graphics/src/primitive.rs +++ b/graphics/src/primitive.rs @@ -4,7 +4,7 @@ use crate::core::image; use crate::core::svg; use crate::core::text; use crate::core::{ - Background, Color, Font, Pixels, Point, Rectangle, Shadow, Vector, + Background, Border, Color, Font, Pixels, Point, Rectangle, Shadow, Vector, }; use crate::text::editor; use crate::text::paragraph; @@ -67,14 +67,10 @@ pub enum Primitive { bounds: Rectangle, /// The background of the quad background: Background, - /// The border radii of the quad - border_radius: [f32; 4], - /// The border width of the quad - border_width: f32, - /// The border color of the quad - border_color: Color, + /// The [`Border`] of the quad + border: Border, /// The [`Shadow`] of the quad - shadow: Option, + shadow: Shadow, }, /// An image primitive Image { diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs index 6f312331..3ba41c3f 100644 --- a/graphics/src/renderer.rs +++ b/graphics/src/renderer.rs @@ -124,9 +124,7 @@ impl iced_core::Renderer for Renderer { self.primitives.push(Primitive::Quad { bounds: quad.bounds, background: background.into(), - border_radius: quad.border_radius.into(), - border_width: quad.border_width, - border_color: quad.border_color, + border: quad.border, shadow: quad.shadow, }); } -- cgit