diff --git a/crates/ecolor/src/color32.rs b/crates/ecolor/src/color32.rs index 09e68116f09..6f2c11272b5 100644 --- a/crates/ecolor/src/color32.rs +++ b/crates/ecolor/src/color32.rs @@ -155,6 +155,12 @@ impl Color32 { Self([r, g, b, 0]) } + /// Is the alpha=0 ? + #[inline(always)] + pub fn is_additive(self) -> bool { + self.a() == 0 + } + /// Premultiplied RGBA #[inline(always)] pub const fn to_array(&self) -> [u8; 4] { diff --git a/crates/ecolor/src/rgba.rs b/crates/ecolor/src/rgba.rs index 38bbaa3212a..849696ddc6f 100644 --- a/crates/ecolor/src/rgba.rs +++ b/crates/ecolor/src/rgba.rs @@ -122,6 +122,12 @@ impl Rgba { Self([r, g, b, 0.0]) } + /// Is the alpha=0 ? + #[inline(always)] + pub fn is_additive(self) -> bool { + self.a() == 0.0 + } + /// Multiply with e.g. 0.5 to make us half transparent #[inline(always)] pub fn multiply(self, alpha: f32) -> Self { diff --git a/crates/egui_plot/src/items/rect_elem.rs b/crates/egui_plot/src/items/rect_elem.rs index 1ac470c77d1..b83da7c3dbb 100644 --- a/crates/egui_plot/src/items/rect_elem.rs +++ b/crates/egui_plot/src/items/rect_elem.rs @@ -58,8 +58,16 @@ pub(super) trait RectElement { pub(super) fn highlighted_color(mut stroke: Stroke, fill: Color32) -> (Stroke, Color32) { stroke.width *= 2.0; - let fill = Rgba::from(fill); - let fill_alpha = (2.0 * fill.a()).at_most(1.0); - let fill = fill.to_opaque().multiply(fill_alpha); + + let mut fill = Rgba::from(fill); + if fill.is_additive() { + // Make slightly brighter + fill = 1.3 * fill; + } else { + // Make more opaque: + let fill_alpha = (2.0 * fill.a()).at_most(1.0); + fill = fill.to_opaque().multiply(fill_alpha); + } + (stroke, fill.into()) }