From d0cc8a312355fece75c351c545db6544e88eff07 Mon Sep 17 00:00:00 2001
From: Eugene Vert <eugene.a.vert@gmail.com>
Date: Tue, 23 May 2023 10:12:46 +0300
Subject: [PATCH] jxl-color: Fix `linear_to_srgb` panic

---
 crates/jxl-color/src/tf.rs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/crates/jxl-color/src/tf.rs b/crates/jxl-color/src/tf.rs
index b760d214..18d61d9c 100644
--- a/crates/jxl-color/src/tf.rs
+++ b/crates/jxl-color/src/tf.rs
@@ -34,7 +34,7 @@ pub fn linear_to_srgb(samples: &mut [f32]) {
         let pow = pow * v_adj + 0.018092343;
 
         // `mul` won't be used when `v` is small.
-        let idx = (v >> 23).saturating_sub(118) as usize & 15;
+        let idx = (v >> 23).wrapping_sub(118) as usize & 0xf;
         let mul = 0x4000_0000 | (u32::from(POWTABLE_UPPER[idx]) << 18) | (u32::from(POWTABLE_LOWER[idx]) << 10);
 
         let v = f32::from_bits(v);
@@ -127,7 +127,7 @@ unsafe fn linear_to_srgb_avx2(samples: &mut [f32]) {
         let pow = pow.mul_add(v_adj, 0.107963754);
         let pow = pow.mul_add(v_adj, 0.018092343);
 
-        let idx = ((v >> 23) - 118) as usize;
+        let idx = (v >> 23).wrapping_sub(118) as usize & 0xf;
         let mul = 0x4000_0000 | (u32::from(POWTABLE_UPPER.0[idx]) << 18) | (u32::from(POWTABLE_LOWER.0[idx]) << 10);
 
         let v = f32::from_bits(v);