From 2a3c1e13fd90b2ecde7df434fe055259708818db Mon Sep 17 00:00:00 2001
From: Ygor Souza <ygor.souza@protonmail.com>
Date: Sat, 7 Sep 2024 23:07:43 +0200
Subject: [PATCH] Use a precomputed lookup table in Color32::from_unmultiplied

This is about 50 times faster according to the benchmarks, at the
expense of storing a 65KB lookup table in the program memory.
---
 crates/ecolor/Cargo.toml                      |   2 +-
 .../color32_from_unmultiplied_lookup_table    | Bin 0 -> 65536 bytes
 crates/ecolor/src/color32.rs                  |  54 ++++++++++++------
 3 files changed, 37 insertions(+), 19 deletions(-)
 create mode 100644 crates/ecolor/data/color32_from_unmultiplied_lookup_table

diff --git a/crates/ecolor/Cargo.toml b/crates/ecolor/Cargo.toml
index c1a10070c03f..88cae7a07a10 100644
--- a/crates/ecolor/Cargo.toml
+++ b/crates/ecolor/Cargo.toml
@@ -14,7 +14,7 @@ readme = "README.md"
 repository = "https://github.com/emilk/egui"
 categories = ["mathematics", "encoding"]
 keywords = ["gui", "color", "conversion", "gamedev", "images"]
-include = ["../LICENSE-APACHE", "../LICENSE-MIT", "**/*.rs", "Cargo.toml"]
+include = ["../LICENSE-APACHE", "../LICENSE-MIT", "**/*.rs", "data/*", "Cargo.toml"]
 
 [lints]
 workspace = true
diff --git a/crates/ecolor/data/color32_from_unmultiplied_lookup_table b/crates/ecolor/data/color32_from_unmultiplied_lookup_table
new file mode 100644
index 0000000000000000000000000000000000000000..42ba44980677b70bcdff5e717046d1153255aeee
GIT binary patch
literal 65536
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
Dd}R^J

literal 0
HcmV?d00001

diff --git a/crates/ecolor/src/color32.rs b/crates/ecolor/src/color32.rs
index ca257303dae9..74af9c1e7fbd 100644
--- a/crates/ecolor/src/color32.rs
+++ b/crates/ecolor/src/color32.rs
@@ -1,6 +1,7 @@
-use crate::{
-    fast_round, gamma_u8_from_linear_f32, linear_f32_from_gamma_u8, linear_f32_from_linear_u8, Rgba,
-};
+use crate::{fast_round, linear_f32_from_linear_u8, Rgba};
+
+static FROM_UNMULTIPLIED_LUT: &[u8; 256 * 256] =
+    include_bytes!("../data/color32_from_unmultiplied_lookup_table");
 
 /// This format is used for space-efficient color representation (32 bits).
 ///
@@ -95,21 +96,17 @@ impl Color32 {
     /// From `sRGBA` WITHOUT premultiplied alpha.
     #[inline]
     pub fn from_rgba_unmultiplied(r: u8, g: u8, b: u8, a: u8) -> Self {
-        if a == 255 {
-            Self::from_rgb(r, g, b) // common-case optimization
-        } else if a == 0 {
-            Self::TRANSPARENT // common-case optimization
-        } else {
-            let r_lin = linear_f32_from_gamma_u8(r);
-            let g_lin = linear_f32_from_gamma_u8(g);
-            let b_lin = linear_f32_from_gamma_u8(b);
-            let a_lin = linear_f32_from_linear_u8(a);
-
-            let r = gamma_u8_from_linear_f32(r_lin * a_lin);
-            let g = gamma_u8_from_linear_f32(g_lin * a_lin);
-            let b = gamma_u8_from_linear_f32(b_lin * a_lin);
-
-            Self::from_rgba_premultiplied(r, g, b, a)
+        match a {
+            // common-case optimization
+            0 => Self::TRANSPARENT,
+            // common-case optimization
+            255 => Self::from_rgb(r, g, b),
+            a => {
+                let [r, g, b] = [r, g, b].map(|value| {
+                    FROM_UNMULTIPLIED_LUT[usize::from(u16::from_be_bytes([value, a]))]
+                });
+                Self::from_rgba_premultiplied(r, g, b, a)
+            }
         }
     }
 
@@ -250,3 +247,24 @@ impl Color32 {
         )
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    #[test]
+    fn from_unmultiplied_lookup_table_check() {
+        use crate::{
+            gamma_u8_from_linear_f32, linear_f32_from_gamma_u8, linear_f32_from_linear_u8,
+        };
+        for value in 0..=255u8 {
+            for alpha in 0..=255u8 {
+                let value_lin = linear_f32_from_gamma_u8(value);
+                let alpha_lin = linear_f32_from_linear_u8(alpha);
+
+                let calculated = gamma_u8_from_linear_f32(value_lin * alpha_lin);
+                let lut = FROM_UNMULTIPLIED_LUT[usize::from(u16::from_be_bytes([value, alpha]))];
+                assert_eq!(calculated, lut);
+            }
+        }
+    }
+}