]> granicus.if.org Git - imagemagick/commitdiff
...
authorCristy <urban-warrior@imagemagick.org>
Tue, 27 Mar 2018 13:16:01 +0000 (09:16 -0400)
committerCristy <urban-warrior@imagemagick.org>
Tue, 27 Mar 2018 13:16:01 +0000 (09:16 -0400)
MagickCore/gem.c

index a5b9e142254a49b932fddf8debf74b9112308151..6db3e47b46d86076403fb315e22e5c6db5bd49b1 100644 (file)
@@ -463,10 +463,13 @@ MagickExport void ConvertHSLToRGB(const double hue,const double saturation,
   const double lightness,double *red,double *green,double *blue)
 {
   double
-    c,
-    h,
-    min,
-    x;
+    b,
+    g,
+    r,
+    v,
+    x,
+    y,
+    z;
 
   /*
     Convert HSL to RGB colorspace.
@@ -474,66 +477,31 @@ MagickExport void ConvertHSLToRGB(const double hue,const double saturation,
   assert(red != (double *) NULL);
   assert(green != (double *) NULL);
   assert(blue != (double *) NULL);
-  h=hue*360.0;
-  if (lightness <= 0.5)
-    c=2.0*lightness*saturation;
-  else
-    c=(2.0-2.0*lightness)*saturation;
-  min=lightness-0.5*c;
-  h-=360.0*floor(h/360.0);
-  h/=60.0;
-  x=c*(1.0-fabs(h-2.0*floor(h/2.0)-1.0));
-  switch ((int) floor(h))
-  {
-    case 0:
-    {
-      *red=QuantumRange*(min+c);
-      *green=QuantumRange*(min+x);
-      *blue=QuantumRange*min;
-      break;
-    }
-    case 1:
+  if (saturation == 0.0)
     {
-      *red=QuantumRange*(min+x);
-      *green=QuantumRange*(min+c);
-      *blue=QuantumRange*min;
-      break;
-    }
-    case 2:
-    {
-      *red=QuantumRange*min;
-      *green=QuantumRange*(min+c);
-      *blue=QuantumRange*(min+x);
-      break;
-    }
-    case 3:
-    {
-      *red=QuantumRange*min;
-      *green=QuantumRange*(min+x);
-      *blue=QuantumRange*(min+c);
-      break;
-    }
-    case 4:
-    {
-      *red=QuantumRange*(min+x);
-      *green=QuantumRange*min;
-      *blue=QuantumRange*(min+c);
-      break;
-    }
-    case 5:
-    {
-      *red=QuantumRange*(min+c);
-      *green=QuantumRange*min;
-      *blue=QuantumRange*(min+x);
-      break;
-    }
-    default:
-    {
-      *red=0.0;
-      *green=0.0;
-      *blue=0.0;
+      *red=(double) QuantumRange*lightness;
+      *green=(double) QuantumRange*lightness;
+      *blue=(double) QuantumRange*lightness;
+      return;
     }
+  v=(lightness <= 0.5) ? (lightness*(1.0+saturation)) : (lightness+saturation-
+    lightness*saturation);
+  y=lightness+lightness-v;
+  x=y+(v-y)*(6.0*hue-(ssize_t) (6.0*hue));
+  z=v-(v-y)*(6.0*hue-(ssize_t) (6.0*hue));
+  switch ((ssize_t) (6.0*hue))
+  {
+    case 0: r=v; g=x; b=y; break;
+    case 1: r=z; g=v; b=y; break;
+    case 2: r=y; g=v; b=x; break;
+    case 3: r=y; g=z; b=v; break;
+    case 4: r=x; g=y; b=v; break;
+    case 5: r=v; g=y; b=z; break;
+    default: r=v; g=x; b=y; break;
   }
+  *red=(double) QuantumRange*r;
+  *green=(double) QuantumRange*g;
+  *blue=(double) QuantumRange*b;
 }
 \f
 /*