Re: [AD] Faster hsv_to_rgb()

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


> I have optimised hsv_to_rgb() by reducing the equasion used to calculate
> the colour-values. This saves 3 multiplies, 3 to 4 adds/subtracts and
> reduces by one the number of temporary variables needed. The code is at
> this URL:
>
> http://www.xs4all.nl/~ellman/ae-a/tmp/hsv2rgb.zip

Thanks!

Here are my numbers, obtained with GCC 3.2.3 -mcpu=pentium -O2 -funroll-loops 
-ffast-math -fomit-frame-pointer (default options for Allegro):
- speed improvement: +7.2%
- mult insns saved: 2

Note that reusing existing variables is very unlikely to make any difference 
with modern compilers and generally degrades readability.

I've commited the attached patch to mainline (which performs equally to your 
original patch).

-- 
Eric Botcazou
Index: src/color.c
===================================================================
RCS file: /cvsroot/alleg/allegro/src/color.c,v
retrieving revision 1.16
diff -u -r1.16 color.c
--- src/color.c	7 Feb 2003 13:29:06 -0000	1.16
+++ src/color.c	11 May 2003 22:55:36 -0000
@@ -360,18 +360,48 @@
 
       i = (int)h;
       f = h - i;
-      x = v * (1.0f - s) + 0.5f;
-      y = v * (1.0f - (s * f)) + 0.5f;
-      z = v * (1.0f - (s * (1.0f - f))) + 0.5f;
+      x = v * s;
+      y = x * f;
+      z = v - x + 0.5f;
 
       switch (i) {
+
 	 case 6:
-	 case 0: *r = v; *g = z; *b = x; break;
-	 case 1: *r = y; *g = v; *b = x; break;
-	 case 2: *r = x; *g = v; *b = z; break;
-	 case 3: *r = x; *g = y; *b = v; break;
-	 case 4: *r = z; *g = x; *b = v; break;
-	 case 5: *r = v; *g = x; *b = y; break;
+	 case 0:
+	    *r = v;
+	    *g = z + y;
+	    *b = z;
+	    break;
+
+	 case 1:
+	    *r = v - y + 0.5f;
+	    *g = v;
+	    *b = z;
+	    break;
+
+	 case 2:
+	    *r = z;
+	    *g = v;
+	    *b = z + y;
+	    break;
+
+	 case 3:
+	    *r = z;
+	    *g = v - y + 0.5f;
+	    *b = v;
+	    break;
+
+	 case 4:
+	    *r = z + y;
+	    *g = z;
+	    *b = v;
+	    break;
+
+	 case 5:
+	    *r = v;
+	    *g = z;
+	    *b = v - y + 0.5f;
+	    break;
       }
    }
 }


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/