diff --git a/src/color/oklab.rs b/src/color/oklab.rs index fac653e..1e30b5c 100644 --- a/src/color/oklab.rs +++ b/src/color/oklab.rs @@ -43,21 +43,51 @@ impl Operations for Reference { } } +/// A fast fused multiply-add operation that uses hardware FMA if available. +/// If hardware FMA is not available, it falls back to a regular multiply-add. +#[inline(always)] +fn fma(a: Vec3A, b: Vec3A, c: Vec3A) -> Vec3A { + #[cfg(any( + all( + any(target_arch = "x86", target_arch = "x86_64"), + target_feature = "fma" + ), + target_arch = "aarch64" + ))] + { + a.mul_add(b, c) + } + #[cfg(not(any( + all( + any(target_arch = "x86", target_arch = "x86_64"), + target_feature = "fma" + ), + target_arch = "aarch64" + )))] + { + a * b + c + } +} + struct Fast; +#[allow(clippy::excessive_precision)] impl Operations for Fast { fn srgb_to_linear(c: Vec3A) -> Vec3A { Vec3A::select( c.cmpge(Vec3A::splat(0.04045)), { - // This uses a Padé approximant for ((c + 0.055) / 1.055) ^ 2.4: - // (0.000857709 +0.0359438 x+0.524293 x^2+1.31193 x^3)/(1+0.992498 x-0.119725 x^2) + // Polynomial approximation for ((c + 0.055) / 1.055) ^ 2.4 + // This has a max error of 0.0001228 and is exact at c=0.04045 and c=1 + const A0: f32 = 0.00117465; + const A1: f32 = 0.02381997; + const A2: f32 = 0.58750746; + const A3: f32 = 0.47736490; + const A4: f32 = -0.08986699; let c2 = c * c; - let c3 = c2 * c; - Vec3A::min( - Vec3A::ONE, - (0.000857709 + 0.0359438 * c + 0.524293 * c2 + 1.31193 * c3) - / (Vec3A::ONE + 0.992498 * c - 0.119725 * c2), - ) + let p01 = fma(c, Vec3A::splat(A1), Vec3A::splat(A0)); + let p23 = fma(c, Vec3A::splat(A3), Vec3A::splat(A2)); + let t = fma(c2, Vec3A::splat(A4), p23); + fma(c2, t, p01) }, c * (1.0 / 12.92), ) @@ -68,33 +98,47 @@ impl Operations for Fast { { // This uses a Padé approximant for 1.055 c^(1/2.4) - 0.055: // (-0.0117264+21.0897 x+949.46 x^2+2225.62 x^3)/(1+176.398 x+1983.15 x^2+1035.65 x^3) + const P0: f32 = -0.0117264; + const P1: f32 = 21.0897; + const P2: f32 = 949.46; + const P3: f32 = 2225.62; + const Q1: f32 = 176.398; + const Q2: f32 = 1983.15; + const Q3: f32 = 1035.65; let c2 = c * c; - let c3 = c2 * c; - (-0.0117264 + 21.0897 * c + 949.46 * c2 + 2225.62 * c3) - / (1.0 + 176.398 * c + 1983.15 * c2 + 1035.65 * c3) + let p01 = fma(c, Vec3A::splat(P1), Vec3A::splat(P0)); + let p23 = fma(c, Vec3A::splat(P3), Vec3A::splat(P2)); + let p = fma(c2, p23, p01); + let q01 = fma(c, Vec3A::splat(Q1), Vec3A::ONE); + let q23 = fma(c, Vec3A::splat(Q3), Vec3A::splat(Q2)); + let q = fma(c2, q23, q01); + p / q }, c * 12.92, ) } - #[allow(clippy::excessive_precision)] fn cbrt(x: Vec3A) -> Vec3A { - // This is the fast cbrt approximation from the oklab crate. - // Source: https://gitlab.com/kornelski/oklab/-/blob/d3c074f154187dd5c0642119a6402a6c0753d70c/oklab/src/lib.rs#L61 - // Author: Kornel (https://gitlab.com/kornelski/) + // This is the fast cbrt approximation inspired by the non-std cbrt + // implementation (https://gitlab.com/kornelski/oklab/-/blob/d3c074f154187dd5c0642119a6402a6c0753d70c/oklab/src/lib.rs#L61) + // in the oklab crate by Kornel (https://gitlab.com/kornelski/), which + // in turn seems to be based on the libm implementation. + // In this version, I replaced the part after the initial guess with + // one Halley iteration. This reduces accuracy, but saves 2 divisions + // which helps performance a lot. const B: u32 = 709957561; - const C: f32 = 5.4285717010e-1; - const D: f32 = -7.0530611277e-1; - const E: f32 = 1.4142856598e+0; - const F: f32 = 1.6071428061e+0; - const G: f32 = 3.5714286566e-1; - - let mut t = Vec3A::from_array( - x.to_array() - .map(|x| f32::from_bits((x.to_bits() / 3).wrapping_add(B))), - ); - let s = C + (t * t) * (t / x); - t *= G + F / (s + E + D / s); - t + fn initial_guess(x: f32) -> f32 { + let bits = x.to_bits(); + // divide by 3 using multiplication and bitshift + // this is only correct if bits <= 2^31, which is true for all + // positive f32 values + let div = ((bits as u64 * 1431655766) >> 32) as u32; + f32::from_bits(div + B) + } + let t = Vec3A::from_array(x.to_array().map(initial_guess)); + + // one halley iteration + let s = t * t * t; + t * fma(Vec3A::splat(2.0), x, s) / fma(Vec3A::splat(2.0), s, x) } } @@ -133,7 +177,8 @@ fn oklab_to_srgb_impl(lab: Vec3A) -> Vec3A { lms.dot(Vec3A::new(-0.0041960863, -0.7034186147, 1.7076147010)), ); - O::linear_to_srgb(rgb) + // the clamping is necessary for out-of-gamut colors + O::linear_to_srgb(rgb).clamp(Vec3A::ZERO, Vec3A::ONE) } #[allow(unused)] @@ -193,14 +238,14 @@ mod tests { let ref_oklab = srgb_to_oklab(color); assert!( - (fast_oklab - ref_oklab).abs().max_element() < 1e-3, + (fast_oklab - ref_oklab).abs().max_element() < 0.001, "{color:?} -> fast: {fast_oklab:?} vs ref: {ref_oklab:?}" ); let srgb = fast_oklab_to_srgb(fast_oklab); assert!( - (color - srgb).abs().max_element() < 2.5e-3, + (color - srgb).abs().max_element() < 0.0025, "{color:?} -> {srgb:?}" ); @@ -212,6 +257,14 @@ mod tests { fast_oklab.min_element() >= 0.0, "{color:?} -> {fast_oklab:?}" ); + assert!( + srgb.max_element() <= 1.0, + "{color:?} -> {fast_oklab:?} -> {srgb:?}" + ); + assert!( + srgb.min_element() >= 0.0, + "{color:?} -> {fast_oklab:?} -> {srgb:?}" + ); } } } @@ -262,14 +315,21 @@ mod tests { fn test_error_fast_srgb_to_linear() { assert_eq!( get_error_stats(RefScalar::srgb_to_linear, FastScalar::srgb_to_linear), - "Error: avg=0.00002514 max=0.00013047 for 0.999" + "Error: avg=0.00007546 max=0.00012287 for 0.641" ); } #[test] fn test_error_fast_linear_to_srgb() { assert_eq!( get_error_stats(RefScalar::linear_to_srgb, FastScalar::linear_to_srgb), - "Error: avg=0.00105457 max=0.00236702 for 0.732" + "Error: avg=0.00105456 max=0.00236708 for 0.730" + ); + } + #[test] + fn test_error_fast_cbrt() { + assert_eq!( + get_error_stats(RefScalar::cbrt, FastScalar::cbrt), + "Error: avg=0.00000283 max=0.00001299 for 0.250" ); } diff --git a/test-data/encode_quality.md b/test-data/encode_quality.md index d093b67..cb4b25e 100644 --- a/test-data/encode_quality.md +++ b/test-data/encode_quality.md @@ -44,15 +44,15 @@ | | | A | 22.66 | 38.14 | 0.56 | | | | | | | | perc | L | 28.85 | 33.51 | 1.22 -| | | R | 18.97 | 20.97 | 5.42 -| | | G | 25.09 | 29.59 | 2.59 -| | | B | 22.10 | 25.12 | 3.66 +| | | R | 18.97 | 20.97 | 5.43 +| | | G | 25.09 | 29.59 | 2.60 +| | | B | 22.11 | 25.12 | 3.66 | | | A | 24.22 | 29.16 | 1.64 | | | | | | | | perc d | L | 28.68 | 33.56 | 1.12 -| | | R | 18.95 | 20.99 | 5.21 +| | | R | 18.95 | 20.98 | 5.21 | | | G | 24.99 | 29.62 | 2.47 -| | | B | 22.06 | 25.12 | 3.45 +| | | B | 22.06 | 25.13 | 3.45 | | | A | 24.22 | 29.16 | 1.64 | | | | | | | | | | | | @@ -80,15 +80,15 @@ | | | B | 13.66 | 16.70 | 15.36 | | | A | 15.65 | 32.53 | 1.63 | | | | | | -| | perc | L | 21.63 | 24.12 | 6.11 -| | | R | 10.63 | 11.60 | 27.76 -| | | G | 20.42 | 22.99 | 8.61 -| | | B | 13.71 | 15.92 | 15.88 +| | perc | L | 21.63 | 24.12 | 6.12 +| | | R | 10.63 | 11.60 | 27.79 +| | | G | 20.42 | 22.99 | 8.60 +| | | B | 13.71 | 15.92 | 15.87 | | | A | 17.80 | 20.01 | 9.10 | | | | | | -| | perc d | L | 21.52 | 24.14 | 5.93 -| | | R | 10.62 | 11.61 | 27.52 -| | | G | 20.35 | 23.02 | 8.41 +| | perc d | L | 21.52 | 24.15 | 5.93 +| | | R | 10.62 | 11.61 | 27.56 +| | | G | 20.34 | 23.02 | 8.41 | | | B | 13.67 | 15.91 | 15.90 | | | A | 17.80 | 20.01 | 9.10 | | | | | | @@ -113,15 +113,15 @@ | | | G | 44.36 | 53.53 | 0.36 | | | B | 45.00 | 54.01 | 0.34 | | | | | | -| | perc | L | 52.56 | 59.63 | 0.21 -| | | R | 42.63 | 47.62 | 0.81 -| | | G | 45.88 | 52.39 | 0.50 -| | | B | 43.71 | 49.29 | 0.70 +| | perc | L | 52.56 | 59.64 | 0.21 +| | | R | 42.62 | 47.62 | 0.81 +| | | G | 45.91 | 52.51 | 0.49 +| | | B | 43.64 | 49.33 | 0.70 | | | | | | -| | perc d | L | 51.42 | 61.06 | 0.15 -| | | R | 42.11 | 48.09 | 0.68 -| | | G | 45.09 | 53.62 | 0.36 -| | | B | 43.10 | 50.67 | 0.51 +| | perc d | L | 51.41 | 61.04 | 0.15 +| | | R | 42.11 | 48.10 | 0.68 +| | | G | 45.08 | 53.62 | 0.36 +| | | B | 43.05 | 50.74 | 0.51 | | | | | | | | | | | | | bricks-d.png | fast | L | 34.33 | 44.72 | 0.67 @@ -144,15 +144,15 @@ | | | G | 31.99 | 43.88 | 0.61 | | | B | 31.15 | 42.66 | 0.82 | | | | | | -| | perc | L | 35.69 | 47.64 | 0.39 -| | | R | 30.34 | 39.25 | 0.93 -| | | G | 31.68 | 41.16 | 0.86 -| | | B | 30.22 | 39.05 | 1.42 +| | perc | L | 35.67 | 47.61 | 0.38 +| | | R | 30.33 | 39.27 | 0.93 +| | | G | 31.70 | 41.22 | 0.86 +| | | B | 30.24 | 39.11 | 1.43 | | | | | | -| | perc d | L | 34.79 | 48.95 | 0.28 -| | | R | 29.94 | 39.65 | 0.72 -| | | G | 31.16 | 41.83 | 0.67 -| | | B | 29.79 | 39.72 | 1.08 +| | perc d | L | 34.77 | 48.85 | 0.28 +| | | R | 29.93 | 39.65 | 0.73 +| | | G | 31.17 | 41.90 | 0.67 +| | | B | 29.81 | 39.76 | 1.09 | | | | | | | | | | | | | bricks-n.png | fast | L | 33.57 | 44.18 | 0.65 @@ -175,15 +175,15 @@ | | | G | 26.92 | 38.03 | 0.87 | | | B | 29.16 | 39.26 | 0.99 | | | | | | -| | perc | L | 35.84 | 46.95 | 0.45 -| | | R | 24.53 | 34.52 | 1.57 -| | | G | 29.77 | 40.64 | 0.80 +| | perc | L | 35.84 | 46.94 | 0.46 +| | | R | 24.53 | 34.53 | 1.58 +| | | G | 29.76 | 40.62 | 0.81 | | | B | 29.00 | 38.59 | 1.19 | | | | | | -| | perc d | L | 35.23 | 47.82 | 0.35 -| | | R | 24.43 | 34.81 | 1.41 -| | | G | 29.19 | 40.98 | 0.70 -| | | B | 28.89 | 38.90 | 1.04 +| | perc d | L | 35.24 | 47.79 | 0.35 +| | | R | 24.43 | 34.81 | 1.42 +| | | G | 29.18 | 40.95 | 0.71 +| | | B | 28.88 | 38.90 | 1.04 | | | | | | | | | | | | | clovers-d.png | fast | L | 34.45 | 44.48 | 0.85 @@ -206,15 +206,15 @@ | | | G | 31.80 | 44.21 | 0.57 | | | B | 34.85 | 43.49 | 0.86 | | | | | | -| | perc | L | 35.91 | 47.89 | 0.44 -| | | R | 29.90 | 35.29 | 2.93 -| | | G | 33.79 | 45.55 | 0.62 -| | | B | 31.45 | 37.10 | 2.82 +| | perc | L | 35.91 | 47.87 | 0.44 +| | | R | 29.88 | 35.26 | 2.94 +| | | G | 33.79 | 45.54 | 0.62 +| | | B | 31.44 | 37.05 | 2.84 | | | | | | -| | perc d | L | 34.98 | 49.73 | 0.31 -| | | R | 30.16 | 36.71 | 2.26 -| | | G | 32.88 | 47.36 | 0.43 -| | | B | 31.71 | 38.04 | 2.26 +| | perc d | L | 34.97 | 49.75 | 0.31 +| | | R | 30.11 | 36.64 | 2.27 +| | | G | 32.87 | 47.39 | 0.43 +| | | B | 31.72 | 38.05 | 2.26 | | | | | | | | | | | | | clovers-r.png | fast | L | 33.85 | 45.05 | 0.84 @@ -237,15 +237,15 @@ | | | G | 31.67 | 46.25 | 0.63 | | | B | 31.66 | 46.42 | 0.57 | | | | | | -| | perc | L | 34.65 | 47.24 | 0.43 -| | | R | 32.59 | 43.88 | 1.07 -| | | G | 32.83 | 45.16 | 0.65 -| | | B | 32.51 | 43.66 | 1.07 +| | perc | L | 34.65 | 47.25 | 0.43 +| | | R | 32.59 | 43.89 | 1.07 +| | | G | 32.83 | 45.17 | 0.65 +| | | B | 32.51 | 43.68 | 1.07 | | | | | | -| | perc d | L | 33.80 | 49.05 | 0.31 -| | | R | 31.68 | 45.38 | 0.82 -| | | G | 31.98 | 46.90 | 0.49 -| | | B | 31.76 | 45.68 | 0.77 +| | perc d | L | 33.80 | 49.07 | 0.31 +| | | R | 31.68 | 45.39 | 0.82 +| | | G | 31.97 | 46.91 | 0.49 +| | | B | 31.75 | 45.66 | 0.77 | | | | | | | | | | | | | stone-d.png | fast | L | 34.83 | 45.46 | 0.80 @@ -269,14 +269,14 @@ | | | B | 33.72 | 46.37 | 0.69 | | | | | | | | perc | L | 35.58 | 47.21 | 0.48 -| | | R | 34.37 | 43.89 | 1.18 +| | | R | 34.36 | 43.87 | 1.19 | | | G | 35.12 | 46.66 | 0.62 -| | | B | 34.39 | 43.82 | 1.17 +| | | B | 34.39 | 43.85 | 1.17 | | | | | | -| | perc d | L | 34.54 | 48.81 | 0.33 -| | | R | 33.41 | 45.15 | 0.90 -| | | G | 34.15 | 48.11 | 0.45 -| | | B | 33.58 | 45.11 | 0.86 +| | perc d | L | 34.53 | 48.86 | 0.33 +| | | R | 33.39 | 45.13 | 0.91 +| | | G | 34.14 | 48.15 | 0.45 +| | | B | 33.57 | 45.12 | 0.85 | | | | | | | | | | | | | grass.png | fast | L | 24.91 | 34.81 | 2.29 @@ -305,13 +305,13 @@ | | | | | | | | perc | L | 25.00 | 34.88 | 2.25 | | | R | 17.60 | 22.58 | 10.52 -| | | G | 19.09 | 24.13 | 8.73 +| | | G | 19.09 | 24.12 | 8.73 | | | B | 19.68 | 24.67 | 8.29 | | | A | 18.04 | 27.78 | 5.11 | | | | | | -| | perc d | L | 24.98 | 34.89 | 2.24 +| | perc d | L | 24.97 | 34.89 | 2.24 | | | R | 17.59 | 22.59 | 10.46 -| | | G | 19.09 | 24.13 | 8.70 +| | | G | 19.09 | 24.13 | 8.71 | | | B | 19.67 | 24.67 | 8.26 | | | A | 18.04 | 27.78 | 5.11 | | | | | | @@ -340,15 +340,15 @@ | | | B | 23.70 | 29.30 | 3.16 | | | A | 21.75 | 35.14 | 1.44 | | | | | | -| | perc | L | 28.00 | 37.85 | 1.19 +| | perc | L | 28.00 | 37.84 | 1.19 | | | R | 17.88 | 23.59 | 6.77 | | | G | 21.82 | 27.31 | 4.15 -| | | B | 23.64 | 29.11 | 3.30 +| | | B | 23.64 | 29.11 | 3.31 | | | A | 22.56 | 32.99 | 2.15 | | | | | | -| | perc d | L | 27.98 | 37.91 | 1.16 +| | perc d | L | 27.99 | 37.91 | 1.16 | | | R | 17.87 | 23.59 | 6.71 -| | | G | 21.81 | 27.31 | 4.13 +| | | G | 21.81 | 27.31 | 4.14 | | | B | 23.63 | 29.13 | 3.23 | | | A | 22.56 | 32.99 | 2.15 | | | | | | @@ -373,15 +373,15 @@ | | | G | 50.89 | 56.79 | 0.40 | | | B | 46.61 | 54.17 | 0.52 | | | | | | -| | perc | L | 57.92 | 60.65 | 0.26 -| | | R | 49.22 | 51.88 | 0.72 -| | | G | 53.91 | 56.64 | 0.41 -| | | B | 49.29 | 51.91 | 0.72 +| | perc | L | 57.93 | 60.65 | 0.26 +| | | R | 49.21 | 51.88 | 0.72 +| | | G | 53.86 | 56.60 | 0.41 +| | | B | 49.29 | 51.90 | 0.72 | | | | | | -| | perc d | L | 53.18 | 63.09 | 0.18 +| | perc d | L | 53.18 | 63.08 | 0.18 | | | R | 45.88 | 52.53 | 0.59 -| | | G | 51.14 | 57.24 | 0.36 -| | | B | 45.88 | 52.54 | 0.61 +| | | G | 51.15 | 57.24 | 0.36 +| | | B | 45.89 | 52.54 | 0.61 | | | | | | diff --git a/test-data/output-encode/compression/_hashes.yml b/test-data/output-encode/compression/_hashes.yml index b2ed933..88f2ede 100644 --- a/test-data/output-encode/compression/_hashes.yml +++ b/test-data/output-encode/compression/_hashes.yml @@ -11,10 +11,10 @@ BC1_UNORM dither base.dds: > 44b3e8df6b18f31d7e7cba257c165780cd84105861adb268a266391ddbdab887 BC1_UNORM perc base.dds: > - 2b9c200b3613f958991c3fee6961722e78b874c45ac945f9e49df49a3bf76416 + afe96108d13b6b74a71f6b5a90bc3d2246c4f16e3e8b28aaeca2bd340c8b332a BC1_UNORM perc d base.dds: > - fc91d97b85bd5a58bb28c22574252612068bbd379f8191d7419e1c5792954656 + 3b44d8c2cc22f8cda7ddd7906cdf0893e73cbe2771c10a9d5cdafbdd0646654d BC1_UNORM fast color-twirl.dds: > 28639ab8850610eab834f48810db3470603cdf0e7adb18eff06b926aa6f845fb @@ -29,10 +29,10 @@ BC1_UNORM dither color-twirl.dds: > ced5b8273cd118f658e7cc4d81581459875844f99f63c7124532e656271eced2 BC1_UNORM perc color-twirl.dds: > - ffd6ce3dc4eae3ace6373e286e40dc4c6879b5fa2fc246bc353c3f868912eb1f + e420da281f89093fc89537b143757364ed08d7a604047d756805effcdcce8092 BC1_UNORM perc d color-twirl.dds: > - 683b1f46d0502961f8ca02d43a4d7214c594358c8afbf72ce946f6274d12e9a5 + 23aee1fb31cc4c4ac0ddc4ab3d5511761c152644ab1931be3ac10c0befa2d904 BC1_UNORM fast bricks-d.dds: > 407b1b63a944454ee57142fad0c5ea788337c63f5973385f00aedfd8aa316879 @@ -47,10 +47,10 @@ BC1_UNORM dither bricks-d.dds: > a184e049d54f37e2eea90e6563b8b802a6d069ac99fc9edf933684b41ca174bd BC1_UNORM perc bricks-d.dds: > - a2715b4d8e48038991b06fc86798f556099c5a19ffb648d60b02f3483f691c17 + dcb9eda79633eeb9bc25e7c12204afa87f2f4dd1d593c7f7a5994a0355eafa07 BC1_UNORM perc d bricks-d.dds: > - 31c2b4846d3ea9955af21d24db06763b51d7a74280e5fa28e5629ba965b2cf9c + 695556967dd11b920479883930a28cf93a41fcf40cdb1338947737da843d5cd9 BC1_UNORM fast bricks-n.dds: > cde741a07df62ad91f9930567ad2644cbf498d7b2c94462dae87cf02c4b139e2 @@ -65,10 +65,10 @@ BC1_UNORM dither bricks-n.dds: > 5da3a86c92e897b60ba17eafef033a679c3cf1a1f6210282ccf21721f82e5ae6 BC1_UNORM perc bricks-n.dds: > - 2918da2c58c992a8e0edca5035a30a8b870bc6ecdc780c16161fe8d8dcbea879 + 38ddf81722f9b00594bd95c225930ad7d91a9e0ee2f1a2c3ec59e0f4c35bef20 BC1_UNORM perc d bricks-n.dds: > - 5f4199a1bd1794a577a3638c4c737fe9f438dc2fffd558f02e7dbf7a8be73b2c + 1f45fec6d3437ee8d4c57500e197d0f9f49afcb31ce99c94a002c6ba709dbb98 BC1_UNORM fast clovers-d.dds: > 31709e578f4ebe14fc497e027ad3601684b749a4ff7761557737705156218a6b @@ -83,10 +83,10 @@ BC1_UNORM dither clovers-d.dds: > 9e82d8c1b3d8c25a39d0b02801014da5aacfbcf2d74cf65a6cb46e567e33bb00 BC1_UNORM perc clovers-d.dds: > - fd1640372a38fe6f030caba57a17af95612a53e18fcb24af64aaa0b5fa0a78b8 + ebd1c53becdbfca3eacb2c8091889e90a0c8eec891bdc51c72e8f77bcfa025fc BC1_UNORM perc d clovers-d.dds: > - e680ff21db3001d27ecfaab190982f538f7774b177de72533f85cbd8affa43f5 + fc454155851270165f02d8338c47226b2238c992b2cf0cd59eb1d314a8804f07 BC1_UNORM fast clovers-r.dds: > 797e217227149e775d8ee5d55778e7c38111bab9c38ef2a594392982ced3ee72 @@ -101,10 +101,10 @@ BC1_UNORM dither clovers-r.dds: > ac6240507843f1dd4af4ba2ae101d5bf9eab6ea55027f0837cebab52443ca12a BC1_UNORM perc clovers-r.dds: > - 32f8ec6183c44c8c938f15533496cc678cba8a0d85feb6ed4de08a32227918ed + 6179b8b9dd592432b56c8feae3438f1839767d1a5acbffc544257cc259d0cf7f BC1_UNORM perc d clovers-r.dds: > - 070e19ce16454dbc9135374cb9df11bbef1aa6ef67c5f5ee8210e4a193b7ebc1 + 779567e7af628c296086112fffcf74fbe928f040f0384fee5049b4c00ba21ee4 BC1_UNORM fast stone-d.dds: > 3b0fa35baf5608d317dc97e5aedf4bf5152afa951068d66fb14727f5e85778ae @@ -119,10 +119,10 @@ BC1_UNORM dither stone-d.dds: > e992f7febd885bdb317f28da576e82091c03b013af71f01f78e6098f310bfa29 BC1_UNORM perc stone-d.dds: > - 3aea6fa29579b04678d536770fc38f02f0a0dc27d06434a088f6f7b5a387fe15 + 0e2707438d9157b4061a10efdbb5666120741bc0c6b02ad22ff6db243aad7871 BC1_UNORM perc d stone-d.dds: > - 0814097edfb4321d9ffe3a416fe247dbf610b3eb57ab01d15d3689e86b94ffe6 + 6353617123ce724c7079b129fc0d0d2820f67c7f7e78d95a688dbba2cd64529d BC1_UNORM fast grass.dds: > c24d7b91247e7cc3dd1fd913827a20e16dedbff46bcc5dbb506ffd9e7dc38c61 @@ -137,10 +137,10 @@ BC1_UNORM dither grass.dds: > 5a70910ead1f6266fbf4ae4a96f7557d813994b5512f22dfc28bd1124dab5377 BC1_UNORM perc grass.dds: > - cc6eac9e12a0852e9879424723121f100b6801c8fb2e40b14be5bde6df1a20fc + 75dfed97264a19f8860c7089d7723aa042c48757b6589d31587bca1a7d26137c BC1_UNORM perc d grass.dds: > - a22852de4e48cc6b55666de1189fbb7ec770d7bab1709b9dc2447b2b8b267188 + f0f0930b72beb9f1018d57ce54433cb0b33449cf6d53d95e21f74a7f18d56f72 BC1_UNORM fast leaves.dds: > cbe0da225eb6fdf655997b616cce5e642eb44b7da4461c4e441b095a6a298c98 @@ -155,10 +155,10 @@ BC1_UNORM dither leaves.dds: > 2042cb1fcb43ff7e4fe3adf177f5b9ac86b38abb7507d5ea879875cf9e64960a BC1_UNORM perc leaves.dds: > - bc17a60e0ca5299f7d7ebf30135cd126a7d374a348c9a10ae57d640de368eaad + 1d5d5b45f88a1843d0988466984435f48997e25b99c29dd1a45dab7469ee128d BC1_UNORM perc d leaves.dds: > - 73a7f25ad415ad8e00349d6299009361aad2ffc3f01ee6fa1e3a5fea3341a8f9 + ae64bdf07f9cc048ae465efcb8f41c1d91a99e739f6ecc42a17c624bc3702562 BC1_UNORM fast random color.dds: > d722829f4dbe4fe240cc67d0ed780c18e5475b64fc4f45ba17229cdadbb93d7c @@ -173,10 +173,10 @@ BC1_UNORM dither random color.dds: > 2fe0aa2ed8b19cfb31eea2a1d253e4d79f807b0c41daf96be617484dd31b0f4e BC1_UNORM perc random color.dds: > - edd64ae272e674f6eed55af47c168768794d0f029e96fff2c200968b7fc293ec + e1c12e6344ebf14ba05928c8c80231dddb6d7fd5e673dcdfc8c71b557c66103f BC1_UNORM perc d random color.dds: > - 97f053bbf0513016aef03afbc4b48136ce4efb1c55682a771e62f81cc9983f39 + 6361880a24373816db573388f9ae3a47d5af5dd3ffebb3f6ec84571f5cc8bb45 BC4_UNORM fast base.dds: > 5a1e1cb4b8219ce9bbd98458103c976a43649c039562ea541dd0989a8c561b19