Changeset 2217


Ignore:
Timestamp:
Jan 13, 2013, 11:44:30 PM (7 years ago)
Author:
sam
Message:

color: optimise RGB to HSV conversion routine using my latest findings,
and add a simple unit test function.

Location:
trunk
Files:
2 edited

Legend:

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

    r2216 r2217  
    8585    static vec3 RGBToHSV(vec3 src)
    8686    {
    87         float offset = 0.f;
     87        float K = 0.f;
     88
     89        if (src.g < src.b)
     90            src = src.rbg, K = -1.f;
    8891
    8992        if (src.r < src.g)
    90             src = src.grb, offset = -2.f / 6.f;
    91 
    92         if (src.g < src.b)
    93             src = src.rbg, offset = -1.f - 4.f * offset;
    94 
    95         if (src.r < src.g)
    96             src = src.grb, offset = -2.f / 6.f - offset;
    97 
    98         float chroma = src.r - src.b;
    99         return vec3(abs((src.g - src.b) / (6.f * chroma + 1e-40f) + offset),
    100                     chroma / (src.r + 1e-40f),
     93            src = src.grb, K = -2.f / 6.f - K;
     94
     95        float chroma = src.r - min(src.g, src.b);
     96        return vec3(abs(K + (src.g - src.b) / (6.f * chroma + 1e-20f)),
     97                    chroma / (src.r + 1e-20f),
    10198                    src.r);
    10299    }
  • trunk/test/unit/color.cpp

    r2207 r2217  
    8787        }
    8888    }
     89
     90    LOLUNIT_TEST(RGBToHSV)
     91    {
     92        for (int r = 0; r < 20; r++)
     93        for (int g = 0; g < 20; g++)
     94        for (int b = 0; b < 20; b++)
     95        {
     96            vec3 v1 = vec3(r / 20.f, g / 20.f, b / 20.f);
     97            vec3 v2 = Color::HSVToRGB(Color::RGBToHSV(v1));
     98
     99            LOLUNIT_ASSERT_DOUBLES_EQUAL(v1.r, v2.r, 0.0001);
     100            LOLUNIT_ASSERT_DOUBLES_EQUAL(v1.g, v2.g, 0.0001);
     101            LOLUNIT_ASSERT_DOUBLES_EQUAL(v1.b, v2.b, 0.0001);
     102        }
     103    }
    89104};
    90105
Note: See TracChangeset for help on using the changeset viewer.