diff --git a/crates/egui/src/containers/frame.rs b/crates/egui/src/containers/frame.rs index 6a526a7e98e..62c5d0b5871 100644 --- a/crates/egui/src/containers/frame.rs +++ b/crates/egui/src/containers/frame.rs @@ -76,7 +76,7 @@ pub struct Frame { #[test] fn frame_size() { assert_eq!( - std::mem::size_of::(), 44, + std::mem::size_of::(), 32, "Frame changed size! If it shrank - good! Update this test. If it grew - bad! Try to find a way to avoid it." ); assert!( diff --git a/crates/egui/src/style.rs b/crates/egui/src/style.rs index 1e23ee0041c..1d5a1b25c77 100644 --- a/crates/egui/src/style.rs +++ b/crates/egui/src/style.rs @@ -1293,9 +1293,9 @@ impl Visuals { window_rounding: Rounding::same(6), window_shadow: Shadow { - offset: vec2(10.0, 20.0), - blur: 15.0, - spread: 0.0, + offset: [10, 20], + blur: 15, + spread: 0, color: Color32::from_black_alpha(96), }, window_fill: Color32::from_gray(27), @@ -1307,9 +1307,9 @@ impl Visuals { panel_fill: Color32::from_gray(27), popup_shadow: Shadow { - offset: vec2(6.0, 10.0), - blur: 8.0, - spread: 0.0, + offset: [6, 10], + blur: 8, + spread: 0, color: Color32::from_black_alpha(96), }, @@ -1349,9 +1349,9 @@ impl Visuals { error_fg_color: Color32::from_rgb(255, 0, 0), // red window_shadow: Shadow { - offset: vec2(10.0, 20.0), - blur: 15.0, - spread: 0.0, + offset: [10, 20], + blur: 15, + spread: 0, color: Color32::from_black_alpha(25), }, window_fill: Color32::from_gray(248), @@ -1360,9 +1360,9 @@ impl Visuals { panel_fill: Color32::from_gray(248), popup_shadow: Shadow { - offset: vec2(6.0, 10.0), - blur: 8.0, - spread: 0.0, + offset: [6, 10], + blur: 8, + spread: 0, color: Color32::from_black_alpha(25), }, @@ -2456,13 +2456,13 @@ impl Widget for &mut Shadow { ui.vertical(|ui| { crate::Grid::new("shadow_ui").show(ui, |ui| { ui.add( - DragValue::new(&mut offset.x) + DragValue::new(&mut offset[0]) .speed(1.0) .range(-100.0..=100.0) .prefix("x: "), ); ui.add( - DragValue::new(&mut offset.y) + DragValue::new(&mut offset[1]) .speed(1.0) .range(-100.0..=100.0) .prefix("y: "), diff --git a/crates/egui_demo_lib/src/demo/frame_demo.rs b/crates/egui_demo_lib/src/demo/frame_demo.rs index e982d979904..b772eb7502d 100644 --- a/crates/egui_demo_lib/src/demo/frame_demo.rs +++ b/crates/egui_demo_lib/src/demo/frame_demo.rs @@ -12,9 +12,9 @@ impl Default for FrameDemo { outer_margin: 24.0.into(), rounding: 14.0.into(), shadow: egui::Shadow { - offset: [8.0, 12.0].into(), - blur: 16.0, - spread: 0.0, + offset: [8, 12], + blur: 16, + spread: 0, color: egui::Color32::from_black_alpha(180), }, fill: egui::Color32::from_rgba_unmultiplied(97, 0, 255, 128), diff --git a/crates/epaint/src/shadow.rs b/crates/epaint/src/shadow.rs index 3f8145e50e5..959049ace9f 100644 --- a/crates/epaint/src/shadow.rs +++ b/crates/epaint/src/shadow.rs @@ -5,33 +5,41 @@ use crate::{Color32, Marginf, Rect, RectShape, Rounding, Vec2}; /// Can be used for a rectangular shadow with a soft penumbra. /// /// Very similar to a box-shadow in CSS. -#[derive(Clone, Copy, Debug, Default, PartialEq)] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub struct Shadow { /// Move the shadow by this much. /// /// For instance, a value of `[1.0, 2.0]` will move the shadow 1 point to the right and 2 points down, /// causing a drop-shadow effect. - pub offset: Vec2, + pub offset: [i8; 2], /// The width of the blur, i.e. the width of the fuzzy penumbra. /// - /// A value of 0.0 means a sharp shadow. - pub blur: f32, + /// A value of 0 means a sharp shadow. + pub blur: u8, /// Expand the shadow in all directions by this much. - pub spread: f32, + pub spread: u8, /// Color of the opaque center of the shadow. pub color: Color32, } +#[test] +fn shadow_size() { + assert_eq!( + std::mem::size_of::(), 8, + "Shadow changed size! If it shrank - good! Update this test. If it grew - bad! Try to find a way to avoid it." + ); +} + impl Shadow { /// No shadow at all. pub const NONE: Self = Self { - offset: Vec2::ZERO, - blur: 0.0, - spread: 0.0, + offset: [0, 0], + blur: 0, + spread: 0, color: Color32::TRANSPARENT, }; @@ -45,11 +53,14 @@ impl Shadow { spread, color, } = *self; + let [offset_x, offset_y] = offset; - let rect = rect.translate(offset).expand(spread); - let rounding = rounding.into() + Rounding::from(spread.abs()); + let rect = rect + .translate(Vec2::new(offset_x as _, offset_y as _)) + .expand(spread as _); + let rounding = rounding.into() + Rounding::from(spread); - RectShape::filled(rect, rounding, color).with_blur_width(blur) + RectShape::filled(rect, rounding, color).with_blur_width(blur as _) } /// How much larger than the parent rect are we in each direction? @@ -60,11 +71,14 @@ impl Shadow { spread, color: _, } = *self; + let spread = spread as f32; + let blur = blur as f32; + let [offset_x, offset_y] = offset; Marginf { - left: spread + 0.5 * blur - offset.x, - right: spread + 0.5 * blur + offset.x, - top: spread + 0.5 * blur - offset.y, - bottom: spread + 0.5 * blur + offset.y, + left: spread + 0.5 * blur - offset_x as f32, + right: spread + 0.5 * blur + offset_x as f32, + top: spread + 0.5 * blur - offset_y as f32, + bottom: spread + 0.5 * blur + offset_y as f32, } } }