diff options
Diffstat (limited to 'libdimension/color.c')
-rw-r--r-- | libdimension/color.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/libdimension/color.c b/libdimension/color.c index 4589824..2089326 100644 --- a/libdimension/color.c +++ b/libdimension/color.c @@ -301,15 +301,23 @@ dmnsn_color_illuminate(dmnsn_color light, dmnsn_color color) dmnsn_CIE_Lab Lab1 = dmnsn_Lab_from_color(light, dmnsn_whitepoint); dmnsn_CIE_Lab Lab2 = dmnsn_Lab_from_color(color, dmnsn_whitepoint); - double dot = Lab1.L*Lab2.L + Lab1.a*Lab2.a + Lab1.b*Lab2.b; - double norm = sqrt(Lab2.L*Lab2.L + Lab2.a*Lab2.a + Lab2.b*Lab2.b); - - if (norm == 0.0) - return dmnsn_black; - - dmnsn_CIE_Lab Lab = { .L = dot*Lab2.L/norm/100.0, - .a = dot*Lab2.a/norm, - .b = dot*Lab2.b/norm }; + /* + * This is derived from the simple illumination equation for RGB color: + * RGB' = (R_light*R_color, G_light*G_color, B_light*B_color) + * + * CIE L*a*b* may be transformed to an RGB colorspace by considering `a' + * to be the green -> magenta opponent process (from negative to positive), + * and `b' to be the blue -> yellow opponent process: + * RGB = (L + a + b, L - a + b, L + a - b) + * + * The reverse transformation is: + * Lab = ((G + B)/2, (R - G)/2, (R - B)/2) + */ + dmnsn_CIE_Lab Lab = { + .L = (Lab1.L*Lab2.L + (Lab1.b - Lab1.a)*(Lab2.b - Lab2.a))/100.0, + .a = (Lab1.a*(Lab2.L + Lab2.b) + Lab2.a*(Lab1.L + Lab1.b))/100.0, + .b = (Lab1.b*(Lab2.L + Lab2.a) + Lab2.b*(Lab1.L + Lab1.a))/100.0 + }; dmnsn_color ret = dmnsn_color_from_Lab(Lab, dmnsn_whitepoint); ret.filter = color.filter; @@ -318,7 +326,7 @@ dmnsn_color_illuminate(dmnsn_color light, dmnsn_color color) return ret; } -/* Find the perceptual difference between two colors, using CIE L*a*b*. */ +/* Find the perceptual difference between two colors, using CIE L*a*b* */ double dmnsn_color_difference(dmnsn_color color1, dmnsn_color color2) { |