Changeset 2271


Ignore:
Timestamp:
Jan 24, 2013, 12:26:16 AM (7 years ago)
Author:
sam
Message:

color: tweak RGB to HSV/HSL code for not yet investigated numerical
stability issues.

File:
1 edited

Legend:

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

    r2219 r2271  
    8989        float K = 0.f;
    9090
    91         if (src.g < src.b)
     91        if (src.b - src.g > 1e-20f)
    9292            src = src.rbg, K = -1.f;
    9393
    94         if (src.r < src.g)
     94        if (src.g - src.r > 1e-20f)
    9595            src = src.grb, K = -2.f / 6.f - K;
    9696
     
    113113        float K = 0.f;
    114114
    115         if (src.g < src.b)
     115        /* FIXME: this appears to be needed for numerical stability on
     116         * i386 hardware using -ffast-math. Otherwise if (src.g < src.b)
     117         * would suffice. */
     118        if (src.b - src.g > 1e-20f)
    116119            src = src.rbg, K = -1.f;
    117120
    118         if (src.r < src.g)
     121        if (src.g - src.r > 1e-20f)
    119122            src = src.grb, K = -2.f / 6.f - K;
    120123
     
    137140    {
    138141        float tmp = (2 - src.y) * src.z;
    139         return vec3(src.x, src.y * src.z / (1.f - abs(1.f - tmp)), 0.5f * tmp);
     142        return vec3(src.x,
     143                    src.y * src.z / (min(tmp, 2.f - tmp) + 1e-20f),
     144                    0.5f * tmp);
    140145    }
    141146
     
    151156    {
    152157        float tmp = src.y * (0.5f - abs(0.5f - src.z));
    153         return vec3(src.x, 2.f * tmp / (src.z + tmp), src.z + tmp);
     158        return vec3(src.x, 2.f * tmp / (src.z + tmp + 1e-20f), src.z + tmp);
    154159    }
    155160
Note: See TracChangeset for help on using the changeset viewer.