Changeset 2195


Ignore:
Timestamp:
Jan 2, 2013, 7:08:51 PM (7 years ago)
Author:
sam
Message:

color: add HSL/HSV conversions, fix XYZ/RGB conversions that I mixed up,
add XYZ to xyY conversion (which gives us a pretty accurate xy graph of
the sRGB gamut), and normalise XYZ using a D65 white point.

File:
1 edited

Legend:

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

    r2193 r2195  
    8181
    8282    /*
     83     * Convert linear HSV to linear HSL
     84     */
     85    static vec3 HSVToHSL(vec3 src)
     86    {
     87        float tmp = (2 - src.y) * src.z;
     88        return vec3(src.x, src.y * src.z / (1.f - abs(1.f - tmp)), 0.5f * tmp);
     89    }
     90
     91    static vec4 HSVToHSL(vec4 src)
     92    {
     93        return vec4(HSVToHSL(src.rgb), src.a);
     94    }
     95
     96    /*
     97     * Convert linear HSL to linear HSV
     98     */
     99    static vec3 HSLToHSV(vec3 src)
     100    {
     101        float tmp = src.y * (0.5f - abs(0.5f - src.z));
     102        return vec3(src.x, 2.f * tmp / (src.z + tmp), src.z + tmp);
     103    }
     104
     105    static vec4 HSLToHSV(vec4 src)
     106    {
     107        return vec4(HSLToHSV(src.rgb), src.a);
     108    }
     109
     110    /*
    83111     * Convert linear RGB to CIE XYZ
    84112     */
    85113    static vec3 LinearRGBToCIEXYZ(vec3 src)
     114    {
     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));
     118        return m * src;
     119    }
     120
     121    static vec4 LinearRGBToCIEXYZ(vec4 src)
     122    {
     123        return vec4(LinearRGBToCIEXYZ(src.rgb), src.a);
     124    }
     125
     126    /*
     127     * Convert CIE XYZ to linear RGB
     128     */
     129    static vec3 CIEXYZToLinearRGB(vec3 src)
    86130    {
    87131        mat3 m(vec3(3.2406f, -0.9689f, 0.0557f),
     
    91135    }
    92136
    93     static vec4 LinearRGBToCIEXYZ(vec4 src)
    94     {
    95         return vec4(LinearRGBToCIEXYZ(src.rgb), src.a);
    96     }
    97 
    98     /*
    99      * Convert CIE XYZ to linear RGB
    100      */
    101     static vec3 CIEXYZToLinearRGB(vec3 src)
    102     {
    103         mat3 m(vec3(0.4124f, 0.2126f, 0.0193f),
    104                vec3(0.3576f, 0.7152f, 0.1192f),
    105                vec3(0.1805f, 0.0722f, 0.9505f));
    106         return m * src;
    107     }
    108 
    109137    static vec4 CIEXYZToLinearRGB(vec4 src)
    110138    {
     
    113141
    114142    /*
     143     * Convert CIE XYZ to CIE xyY
     144     */
     145    static vec3 CIEXYZToCIExyY(vec3 src)
     146    {
     147        float tmp = 1.0f / (src.x + src.y + src.z);
     148        return vec3(src.x * tmp, src.y * tmp, src.y);
     149    }
     150
     151    static vec4 CIEXYZToCIExyY(vec4 src)
     152    {
     153        return vec4(CIEXYZToCIExyY(src.rgb), src.a);
     154    }
     155
     156    /*
    115157     * Convert CIE XYZ to CIE L*a*b*
    116      * Note: XYZ values should be normalised, ie. divided by the
    117      * corresponding components for white.
     158     * Note: XYZ values are normalised using a D65 illuminant.
    118159     */
    119160    static vec3 CIEXYZToCIELab(vec3 src)
     
    123164        float const c = 4.0 / 29;
    124165        float const d = 1.0 / 3;
     166
     167        /* Normalise XYZ using D65 illuminant */
     168        src *= vec3(1.f / 95.047f, 1.f / 100.f, 1.f / 108.883f);
    125169
    126170        vec3 f = b * src + vec3(c);
Note: See TracChangeset for help on using the changeset viewer.