Better handle additive colors in plots (#3387)

This commit is contained in:
Emil Ernerfeldt 2023-09-25 15:45:32 +02:00 committed by GitHub
parent fdd493d48f
commit 8bf0055bda
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 3 deletions

View File

@ -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] {

View File

@ -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 {

View File

@ -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())
}