diff --git a/crates/epaint/src/shape.rs b/crates/epaint/src/shape.rs index 61b9d75e92b..ceb5dd072e5 100644 --- a/crates/epaint/src/shape.rs +++ b/crates/epaint/src/shape.rs @@ -745,6 +745,10 @@ pub struct TextShape { /// This only affects the glyphs and will NOT replace background color nor strikethrough/underline color. pub override_text_color: Option, + /// If set, the text will be rendered with the given opacity in gamma space + /// Affects everything: backgrounds, glyphs, strikethough, underline, etc. + pub opacity_factor: f32, + /// Rotate text by this many radians clockwise. /// The pivot is `pos` (the upper left corner of the text). pub angle: f32, @@ -762,6 +766,7 @@ impl TextShape { underline: Stroke::NONE, fallback_color, override_text_color: None, + opacity_factor: 1.0, angle: 0.0, } } @@ -792,6 +797,13 @@ impl TextShape { self.angle = angle; self } + + /// Render text with this opacity in gamma space + #[inline] + pub fn with_opacity_factor(mut self, opacity_factor: f32) -> Self { + self.opacity_factor = opacity_factor; + self + } } impl From for Shape { diff --git a/crates/epaint/src/shape_transform.rs b/crates/epaint/src/shape_transform.rs index b36accb5a3f..c8edff1fcaf 100644 --- a/crates/epaint/src/shape_transform.rs +++ b/crates/epaint/src/shape_transform.rs @@ -56,6 +56,7 @@ pub fn adjust_colors(shape: &mut Shape, adjust_color: &impl Fn(&mut Color32)) { underline, fallback_color, override_text_color, + opacity_factor: _, angle: _, }) => { adjust_color(&mut underline.color); diff --git a/crates/epaint/src/tessellator.rs b/crates/epaint/src/tessellator.rs index 72899f2844c..bc729045dd7 100644 --- a/crates/epaint/src/tessellator.rs +++ b/crates/epaint/src/tessellator.rs @@ -1474,6 +1474,7 @@ impl Tessellator { underline, override_text_color, fallback_color, + opacity_factor, angle, } = text_shape; @@ -1481,6 +1482,10 @@ impl Tessellator { return; } + if *opacity_factor <= 0.0 { + return; + } + if galley.pixels_per_point != self.pixels_per_point { eprintln!("epaint: WARNING: pixels_per_point (dpi scale) have changed between text layout and tessellation. \ You must recreate your text shapes if pixels_per_point changes."); @@ -1548,6 +1553,10 @@ impl Tessellator { color = *fallback_color; } + if *opacity_factor < 1.0 { + color = color.gamma_multiply(*opacity_factor); + } + crate::epaint_assert!(color != Color32::PLACEHOLDER, "A placeholder color made it to the tessellator. You forgot to set a fallback color."); let offset = if *angle == 0.0 {