Ogeon / palette

A Rust library for linear color calculations and conversion
Apache License 2.0
748 stars 60 forks source link

Allow RGB/XYZ conversion matrices to be pre-defined #308

Closed Ogeon closed 1 year ago

Ogeon commented 1 year ago

As suggested by @Kannen in https://github.com/Ogeon/palette/issues/199#issuecomment-1479207597, make it possible to have RGB to XYZ and XYZ to RGB matrices pre-defined for an RGB space. This results in significantly faster conversions.

Ogeon commented 1 year ago

Hmm, looks like the benchmark action bumped into some issues. Here's the output from the log, at least, showing that the improvements:

 group                                      base                                   changes
-----                                      ----                                   -------
Cie family/lab to lch                      1.03      3.3±0.07µs        ? ?/sec    1.00      3.2±0.05µs        ? ?/sec
Cie family/lab to xyz                      1.00    760.3±9.37ns        ? ?/sec    1.00   763.5±31.25ns        ? ?/sec
Cie family/lch to lab                      1.00      2.4±0.04µs        ? ?/sec    1.01      2.4±0.05µs        ? ?/sec
Cie family/linsrgb to xyz                  13.76     4.2±0.08µs        ? ?/sec    1.00    307.8±4.31ns        ? ?/sec
Cie family/linsrgb to xyz - wide::f32x8    7.33    744.9±6.56ns        ? ?/sec    1.00    101.6±2.32ns        ? ?/sec
Cie family/xyz to lab                      1.00     17.9±0.22µs        ? ?/sec    1.01     18.0±0.40µs        ? ?/sec
Cie family/xyz to yxy                      1.00   629.7±10.15ns        ? ?/sec    1.00    629.1±8.32ns        ? ?/sec
Cie family/yxy to xyz                      1.27    697.1±9.47ns        ? ?/sec    1.00    548.6±7.04ns        ? ?/sec
Matrix functions/matrix_inverse            1.00     10.7±0.23ns        ? ?/sec    1.00     10.7±0.32ns        ? ?/sec
Matrix functions/multiply_3x3              1.00      9.6±0.14ns        ? ?/sec    1.00      9.7±0.17ns        ? ?/sec
Matrix functions/multiply_rgb_to_xyz       1.00      6.0±0.08ns        ? ?/sec    1.00      6.0±0.06ns        ? ?/sec
Matrix functions/multiply_xyz              1.00      6.0±0.12ns        ? ?/sec    1.00      6.0±0.09ns        ? ?/sec
Matrix functions/multiply_xyz_to_rgb       1.00      6.0±0.07ns        ? ?/sec    1.00      6.0±0.06ns        ? ?/sec
Matrix functions/rgb_to_xyz_matrix         1.00     24.9±0.35ns        ? ?/sec    1.00     24.9±0.44ns        ? ?/sec
Rgb family/hsl to hsv                      1.97  1286.0±15.85ns        ? ?/sec    1.00    652.7±9.33ns        ? ?/sec
Rgb family/hsl to linear hsl               1.02     13.1±0.25µs        ? ?/sec    1.00     12.9±0.17µs        ? ?/sec
Rgb family/hsl to rgb                      1.00      2.1±0.03µs        ? ?/sec    1.02      2.1±0.03µs        ? ?/sec
Rgb family/hsv to hsl                      1.00   822.7±10.58ns        ? ?/sec    1.02   835.5±10.64ns        ? ?/sec
Rgb family/hsv to hwb                      1.00    233.5±2.43ns        ? ?/sec    1.02    237.7±5.25ns        ? ?/sec
Rgb family/hsv to linear hsv               1.01     11.7±0.17µs        ? ?/sec    1.00     11.6±0.14µs        ? ?/sec
Rgb family/hsv to rgb                      1.00  1902.3±22.81ns        ? ?/sec    1.01  1917.4±28.67ns        ? ?/sec
Rgb family/hwb to hsv                      1.00    478.6±6.05ns        ? ?/sec    1.01    483.3±8.41ns        ? ?/sec
Rgb family/hwb to linear hwb               1.00     12.4±0.29µs        ? ?/sec    1.00     12.3±0.17µs        ? ?/sec
Rgb family/linear hsl to hsl               1.01     11.3±0.26µs        ? ?/sec    1.00     11.2±0.16µs        ? ?/sec
Rgb family/linear hsv to hsv               1.00     10.2±0.15µs        ? ?/sec    1.00     10.3±0.15µs        ? ?/sec
Rgb family/linear hwb to hwb               1.01     11.3±0.16µs        ? ?/sec    1.00     11.3±0.36µs        ? ?/sec
Rgb family/linsrgb to rgb                  1.00      5.9±0.10µs        ? ?/sec    1.01      5.9±0.13µs        ? ?/sec
Rgb family/linsrgb to rgb - wide::f32x8    1.02      5.2±0.08µs        ? ?/sec    1.00      5.1±0.08µs        ? ?/sec
Rgb family/linsrgb_f32 to rgb_u8           1.00   952.6±10.10ns        ? ?/sec    1.01   961.9±12.88ns        ? ?/sec
Rgb family/linsrgb_f64 to rgb_u8           1.00  1221.4±20.15ns        ? ?/sec    1.00  1221.0±35.59ns        ? ?/sec
Rgb family/rgb to hsl                      1.89  1667.9±33.97ns        ? ?/sec    1.00   880.6±17.05ns        ? ?/sec
Rgb family/rgb to hsl - wide::f32x8        1.00    469.4±5.23ns        ? ?/sec    1.00    469.9±7.90ns        ? ?/sec
Rgb family/rgb to hsv                      1.00    515.1±6.97ns        ? ?/sec    1.01    520.9±7.71ns        ? ?/sec
Rgb family/rgb to hsv - wide::f32x8        1.00    426.1±5.12ns        ? ?/sec    1.00    426.4±5.97ns        ? ?/sec
Rgb family/rgb to linsrgb                  1.00      8.3±0.19µs        ? ?/sec    1.00      8.3±0.14µs        ? ?/sec
Rgb family/rgb to linsrgb - wide::f32x8    1.03      3.4±0.04µs        ? ?/sec    1.00      3.3±0.04µs        ? ?/sec
Rgb family/rgb_u8 to linsrgb_f32           1.00    304.5±5.28ns        ? ?/sec    1.00    305.9±3.50ns        ? ?/sec
Rgb family/rgb_u8 to linsrgb_f64           1.00    307.7±4.36ns        ? ?/sec    1.02    312.6±5.71ns        ? ?/sec
Rgb family/xyz to linsrgb                  19.72     7.0±0.10µs        ? ?/sec    1.00    355.7±4.17ns        ? ?/sec
Rgb family/xyz to linsrgb - wide::f32x8    10.42 1100.9±17.61ns        ? ?/sec    1.00    105.6±2.01ns        ? ?/sec
Ogeon commented 1 year ago

bors r+

bors[bot] commented 1 year ago

Build succeeded: