From e8e53e95006732d1ac9f7e36d66f72ca8eef693c Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 7 Jan 2021 16:28:22 +0100 Subject: [PATCH] Optimize Color32::from_rgba_unmultiplied --- egui/src/paint/color.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/egui/src/paint/color.rs b/egui/src/paint/color.rs index 4e752d5a..a7c2bad6 100644 --- a/egui/src/paint/color.rs +++ b/egui/src/paint/color.rs @@ -57,11 +57,20 @@ impl Color32 { /// From `sRGBA` WITHOUT premultiplied alpha. pub fn from_rgba_unmultiplied(r: u8, g: u8, b: u8, a: u8) -> Self { if a == 255 { - Self::from_rgba_premultiplied(r, g, b, a) // common-case optimization + Self::from_rgba_premultiplied(r, g, b, 255) // common-case optimization + } else if a == 0 { + Self::TRANSPARENT // common-case optimization } else { - Rgba::from(Self::from_rgb(r, g, b)) - .multiply(a as f32 / 255.0) - .into() + let r_lin = linear_from_gamma_byte(r); + let g_lin = linear_from_gamma_byte(g); + let b_lin = linear_from_gamma_byte(b); + let a_lin = linear_from_alpha_byte(a); + + let r = gamma_byte_from_linear(r_lin * a_lin); + let g = gamma_byte_from_linear(g_lin * a_lin); + let b = gamma_byte_from_linear(b_lin * a_lin); + + Self::from_rgba_premultiplied(r, g, b, a) } }