Changeset 2196 for trunk/src


Ignore:
Timestamp:
Jan 3, 2013, 3:46:21 AM (7 years ago)
Author:
sam
Message:

color: ensure XYZ values use the [0 100] scale and add an optional
white value in case we want to convert XYZ to L*a*b* with something
else than D65.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lol/image/color.h

    r2195 r2196  
    6969     * Convert linear HSV to linear RGB
    7070     */
    71     static vec3 HSVToLinearRGB(vec3 src)
     71    static vec3 HSVToRGB(vec3 src)
    7272    {
    7373        vec3 tmp = abs(fract(vec3(src.x) + vec3(3.f, 2.f, 1.f) / 3.f) * 6.f - vec3(3.f));
     
    7575    }
    7676
    77     static vec4 HSVToLinearRGB(vec4 src)
    78     {
    79         return vec4(HSVToLinearRGB(src.rgb), src.a);
     77    static vec4 HSVToRGB(vec4 src)
     78    {
     79        return vec4(HSVToRGB(src.rgb), src.a);
    8080    }
    8181
     
    109109
    110110    /*
    111      * Convert linear RGB to CIE XYZ
     111     * Convert linear RGB [0 1] to CIE XYZ [0 100]
    112112     */
    113113    static vec3 LinearRGBToCIEXYZ(vec3 src)
    114114    {
    115         mat3 m(vec3(0.4124f, 0.2126f, 0.0193f),
    116                vec3(0.3576f, 0.7152f, 0.1192f),
    117                vec3(0.1805f, 0.0722f, 0.9505f));
     115        mat3 m(vec3(41.24f, 21.26f,  1.93f),
     116               vec3(35.76f, 71.52f, 11.92f),
     117               vec3(18.05f,  7.22f, 95.05f));
    118118        return m * src;
    119119    }
     
    125125
    126126    /*
    127      * Convert CIE XYZ to linear RGB
     127     * Convert CIE XYZ [0 100] to linear RGB [0 1]
    128128     */
    129129    static vec3 CIEXYZToLinearRGB(vec3 src)
    130130    {
    131         mat3 m(vec3(3.2406f, -0.9689f, 0.0557f),
    132                vec3(-1.5372f, 1.8758f, -0.2040f),
    133                vec3(-0.4986f, 0.0415f, 1.0570f));
     131        mat3 m(vec3( 0.032406f, -0.009689f,  0.000557f),
     132               vec3(-0.015372f,  0.018758f, -0.002040f),
     133               vec3(-0.004986f,  0.000415f,  0.010570f));
    134134        return m * src;
    135135    }
     
    156156    /*
    157157     * Convert CIE XYZ to CIE L*a*b*
    158      * Note: XYZ values are normalised using a D65 illuminant.
    159      */
    160     static vec3 CIEXYZToCIELab(vec3 src)
     158     * Note: XYZ values are normalised using a D65 illuminant if
     159     * no white value is provided.
     160     */
     161    static vec3 CIEXYZToCIELab(vec3 src, vec3 white)
    161162    {
    162163        float const a = (6.0 * 6.0 * 6.0) / (29 * 29 * 29);
     
    165166        float const d = 1.0 / 3;
    166167
    167         /* Normalise XYZ using D65 illuminant */
    168         src *= vec3(1.f / 95.047f, 1.f / 100.f, 1.f / 108.883f);
     168        src /= white;
    169169
    170170        vec3 f = b * src + vec3(c);
     
    181181    }
    182182
     183    static vec3 CIEXYZToCIELab(vec3 src)
     184    {
     185        return CIEXYZToCIELab(src, vec3(95.047f, 100.f, 108.883f));
     186    }
     187
     188    static vec4 CIEXYZToCIELab(vec4 src, vec4 white)
     189    {
     190        return vec4(CIEXYZToCIELab(src.rgb, white.rgb), src.a);
     191    }
     192
    183193    static vec4 CIEXYZToCIELab(vec4 src)
    184194    {
    185         return vec4(CIEXYZToLinearRGB(src.rgb), src.a);
     195        return vec4(CIEXYZToCIELab(src.rgb), src.a);
    186196    }
    187197
Note: See TracChangeset for help on using the changeset viewer.