Dariusz Knociński wrote:
> Patch:
> diff -u -p -r imlib2-1.4.1.000.old/src/lib/color_helpers.c 
> imlib2-1.4.1.000.new/src/lib/color_helpers.c
> --- imlib2-1.4.1.000.old/src/lib/color_helpers.c      2007-05-21 
> 00:58:01.000000000 +0200
> +++ imlib2-1.4.1.000.new/src/lib/color_helpers.c      2008-04-15 
> 09:34:36.000000000 +0200
> @@ -5,117 +5,89 @@
>   */
>  
>  void
> -__imlib_rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v)
> +__imlib_rgb_to_hsv( int r, int g, int b, float *h, float *s, float *v )
>  {
> -   int                 min, max;
> -   int                 delta;
> +     register float min, max, delta;
>  
> -   max = (r + g + abs(r - g)) / 2;
> -   max = (max + b + abs(max - b)) / 2;
> -   min = (r + g - abs(r - g)) / 2;
> -   min = (min + b - abs(min - b)) / 2;
> +    min = ((( r < g ) ? r : g) < b ) ? (( r < g ) ? r : g) : b;
> +    max = ((( r > g ) ? r : g) > b ) ? (( r > g ) ? r : g) : b;
>  
> -   delta = max - min;
> -   *v = (float)(100 * max) / 255.0;
> -
> -   if (max != 0)
> -      *s = (float)(100 * delta) / (float)max;
> -   else
> -     {
> -        *s = 0.0;
> +    *v = max / 255.0;
> +     delta = ( max - min );
> +    if( delta == 0 )
> +    {
>          *h = 0.0;
> -        *v = 0.0;
> -     }
> -   if (r == max)
> -     {
> -        *h = (float)(100 * (g - b)) / (float)(6.0 * delta);
> -     }
> -   else
> -     {
> -        if (g == max)
> -          {
> -             *h = (float)(100 * (2 * delta + b - r)) / (float)(6.0 * delta);
> -          }
> -        else
> -          {
> -             *h = (float)(100 * (4 * delta + r - g)) / (float)(6.0 * delta);
> -          }
> -     }
> -   if (*h < 0.0)
> -      *h += 100.0;
> -   if (*h > 100.0)
> -      *h -= 100.0;
> +        *s = 0.0;
> +        return;
> +    }
> +    *s = delta / max;
> +     if( r == max )
> +             *h = ( g - b ) / delta;
> +     else if( g == max )
> +             *h = 2.0 + ( b - r ) / delta;
> +     else
> +             *h = 4.0 + ( r - g ) / delta;
> +     *h *= 60.0;
> +     if( *h < 0 )
> +             *h += 360.0;
>  }
>  
>  void
>  __imlib_hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b)
>  {
> -   float               hh, f;
> -   float               p, q, t;
> -   int                 i;
> +    register float f, vf;
> +    register int i, p, q, t, vv;
>  
> -   if (s == 0.0)
> -     {
> -        *r = round((v * 255.0) / 100.0);
> -        *g = round((v * 255.0) / 100.0);
> -        *b = round((v * 255.0) / 100.0);
> +    vf = 255.0 * v;
> +    vv = (int)round( vf );
>  
> +    if( s == 0.0 )
> +    {
> +        *r = *g = *b = vv;
>          return;
> -     }
> -
> -   hh = (h * 6.0) / 100.0;
> -   i = floor(hh);
> -   f = hh - (float)i;
> -
> -   p = v * (1.0 - s / 100.0) / 100.0;
> -   q = v * (1.0 - (s * f) / 100.0) / 100.0;
> -   t = v * (1.0 - s * (1.0 - f) / 100.0) / 100.0;
> +    }
>  
> -   switch (i)
> -     {
> -     case 0:
> -        {
> -           *r = round(v * 255.0 / 100.0);
> -           *g = round(t * 255.0);
> -           *b = round(p * 255.0);
> -           break;
> -        }
> -     case 1:
> -        {
> -           *r = round(q * 255.0);
> -           *g = round(v * 255.0 / 100.0);
> -           *b = round(p * 255.0);
> -           break;
> -        }
> -     case 2:
> -        {
> -           *r = round(p * 255.0);
> -           *g = round(v * 255.0 / 100.0);
> -           *b = round(t * 255.0);
> -           break;
> -        }
> -     case 3:
> -        {
> -           *r = round(p * 255.0);
> -           *g = round(q * 255.0);
> -           *b = round(v * 255.0 / 100.0);
> -           break;
> -        }
> -     case 4:
> -        {
> -           *r = round(t * 255.0);
> -           *g = round(p * 255.0);
> -           *b = round(v * 255.0 / 100.0);
> -           break;
> -        }
> -     case 5:
> -        {
> -           *r = round(v * 255.0 / 100.0);
> -           *g = round(p * 255.0);
> -           *b = round(q * 255.0);
> -           break;
> -        }
> -     }
> +    h /= 60.0;
> +    i = floor(h);
> +    f = h - (float)i;
> +    p = (int)round( vf * (1.0 - s ));
> +    q = (int)round( vf * (1.0 - (s * f)));
> +    t = (int)round( vf * (1.0 - s * (1.0 - f)));
> +
> +    switch( i % 6 )
> +    {
> +    case 0:
> +        *r = vv;
> +        *g = t;
> +        *b = p;
> +        break;
> +    case 1:
> +        *r = q;
> +        *g = vv;
> +        *b = p;
> +        break;
> +    case 2:
> +        *r = p;
> +        *g = vv;
> +        *b = t;
> +        break;
> +    case 3:
> +        *r = p;
> +        *g = q;
> +        *b = vv;
> +        break;
> +    case 4:
> +        *r = t;
> +        *g = p;
> +        *b = vv;
> +        break;
> +    case 5:
> +    default:
> +        *r = vv;
> +        *g = p;
> +        *b = q;
> +        break;
> +    }
>  }
>  
>  void
> diff -u -p -r imlib2-1.4.1.000.old/src/lib/grad.c 
> imlib2-1.4.1.000.new/src/lib/grad.c
> --- imlib2-1.4.1.000.old/src/lib/grad.c       2007-05-21 00:58:01.000000000 
> +0200
> +++ imlib2-1.4.1.000.new/src/lib/grad.c       2008-04-15 09:29:32.000000000 
> +0200
> @@ -112,7 +112,7 @@ __imlib_MapRange(ImlibRange * rg, int le
>               pmap[i++] = (a << 24) | (r << 16) | (g << 8) | b;
>            }
>       }
> -   inc = ((ll - 1) << 16) / (len);
> +   inc = ((ll - 1) << 16) / (len-1);
>     l = 0;
>     for (i = 0; i < len; i++)
>       {
> @@ -194,7 +194,7 @@ __imlib_MapHsvaRange(ImlibRange * rg, in
>               pmap[i++] = (a << 24) | (r << 16) | (g << 8) | b;
>            }
>       }
> -   inc = ((ll - 1) << 16) / (len);
> +   inc = ((ll - 1) << 16) / (len-1);
>     l = 0;
>     for (i = 0; i < len; i++)
>       {
>   

      Strictly speaking, this is still incorrect. The reason being
that the map-range functions are doing an initial interpolation in
rgb colorspace. It should be doing all of the interpolation in hsv
color space, not partly in rgb space then the rest in hsv one.



-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to