]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/color.c
(no commit message)
[imagemagick] / MagickCore / color.c
index b5d26f8d365033db2cfce3942b200e95372c3807..089d4de8c702044f091309d1c1f28dafce75e8a2 100644 (file)
@@ -1089,8 +1089,10 @@ MagickExport void ConcatenateColorComponent(const PixelInfo *pixel,
       (void) ConcatenateMagickString(tuple,text,MaxTextExtent);
       return;
     }
-  if ((pixel->colorspace == HSLColorspace) ||
-      (pixel->colorspace == HSBColorspace))
+  if ((pixel->colorspace == HCLColorspace) ||
+      (pixel->colorspace == HSBColorspace) ||
+      (pixel->colorspace == HSLColorspace) ||
+      (pixel->colorspace == HWBColorspace))
     {
       (void) FormatLocaleString(text,MaxTextExtent,"%g%%",(double)
         (100.0*QuantumScale*color));
@@ -1415,7 +1417,8 @@ MagickExport void GetColorTuple(const PixelInfo *pixel,
       ConcatentateHexColorComponent(pixel,BluePixelChannel,tuple);
       if (pixel->colorspace == CMYKColorspace)
         ConcatentateHexColorComponent(pixel,BlackPixelChannel,tuple);
-      if ((pixel->matte != MagickFalse) && (pixel->alpha != OpaqueAlpha))
+      if ((pixel->alpha_trait == BlendPixelTrait) &&
+          (pixel->alpha != OpaqueAlpha))
         ConcatentateHexColorComponent(pixel,AlphaPixelChannel,tuple);
       return;
     }
@@ -1443,7 +1446,7 @@ MagickExport void GetColorTuple(const PixelInfo *pixel,
       if (color.colorspace-CMYKColorspace)
         status&=fabs(color.black-SVGCompliant(color.black)) < MagickEpsilon ?
           MagickTrue : MagickFalse;
-      if (color.matte != MagickFalse)
+      if (color.alpha_trait == BlendPixelTrait)
         status&=fabs(color.alpha-SVGCompliant(color.alpha)) < MagickEpsilon ?
           MagickTrue : MagickFalse;
       if (status != MagickFalse)
@@ -1451,7 +1454,7 @@ MagickExport void GetColorTuple(const PixelInfo *pixel,
     }
   (void) ConcatenateMagickString(tuple,CommandOptionToMnemonic(
     MagickColorspaceOptions,(ssize_t) color.colorspace),MaxTextExtent);
-  if (color.matte != MagickFalse)
+  if (color.alpha_trait == BlendPixelTrait)
     (void) ConcatenateMagickString(tuple,"a",MaxTextExtent);
   (void) ConcatenateMagickString(tuple,"(",MaxTextExtent);
   if (color.colorspace == GRAYColorspace)
@@ -1469,7 +1472,7 @@ MagickExport void GetColorTuple(const PixelInfo *pixel,
       (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
       ConcatenateColorComponent(&color,BlackPixelChannel,SVGCompliance,tuple);
     }
-  if (color.matte != MagickFalse)
+  if (color.alpha_trait == BlendPixelTrait)
     {
       (void) ConcatenateMagickString(tuple,",",MaxTextExtent);
       ConcatenateColorComponent(&color,AlphaPixelChannel,SVGCompliance,tuple);
@@ -1567,7 +1570,7 @@ MagickExport MagickBooleanType IsEquivalentAlpha(const Image *image,
   register double
     distance;
 
-  if (image->matte == MagickFalse)
+  if (image->alpha_trait != BlendPixelTrait)
     return(MagickTrue);
   if (p->alpha == q->alpha)
     return(MagickTrue);
@@ -2256,7 +2259,7 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
           depth=4*(n/4);
         }
       color->colorspace=sRGBColorspace;
-      color->matte=MagickFalse;
+      color->alpha_trait=UndefinedPixelTrait;
       range=GetQuantumRange(depth);
       color->red=(double) ScaleAnyToQuantum(pixel.red,range);
       color->green=(double) ScaleAnyToQuantum(pixel.green,range);
@@ -2264,7 +2267,7 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
       color->alpha=(double) OpaqueAlpha;
       if ((n % 3) != 0)
         {
-          color->matte=MagickTrue;
+          color->alpha_trait=BlendPixelTrait;
           color->alpha=(double) ScaleAnyToQuantum(pixel.alpha,range);
         }
       color->black=0.0;
@@ -2288,6 +2291,12 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
       colorspace[i--]='\0';
       scale=(double) ScaleCharToQuantum(1);
       icc_color=MagickFalse;
+      if (LocaleNCompare(colorspace,"device-",7) == 0)
+        {
+          (void) CopyMagickString(colorspace,colorspace+7,MaxTextExtent);
+          scale=(double) QuantumRange;
+          icc_color=MagickTrue;
+        }
       if (LocaleCompare(colorspace,"icc-color") == 0)
         {
           register ssize_t
@@ -2303,11 +2312,11 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
           icc_color=MagickTrue;
         }
       LocaleLower(colorspace);
-      color->matte=MagickFalse;
+      color->alpha_trait=UndefinedPixelTrait;
       if ((i > 0) && (colorspace[i] == 'a'))
         {
           colorspace[i]='\0';
-          color->matte=MagickTrue;
+          color->alpha_trait=BlendPixelTrait;
         }
       type=ParseCommandOption(MagickColorspaceOptions,MagickFalse,colorspace);
       if (type < 0)
@@ -2354,11 +2363,12 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
                 color->black=(double) ClampToQuantum(scale*
                   geometry_info.psi);
               else
-                if (color->matte != MagickFalse)
+                if (color->alpha_trait == BlendPixelTrait)
                   color->alpha=(double) ClampToQuantum(QuantumRange*
                     geometry_info.psi);
             }
-          if (((flags & ChiValue) != 0) && (color->matte != MagickFalse))
+          if (((flags & ChiValue) != 0) &&
+              (color->alpha_trait == BlendPixelTrait))
             color->alpha=(double) ClampToQuantum(QuantumRange*
               geometry_info.chi);
           if (LocaleCompare(colorspace,"gray") == 0)
@@ -2366,23 +2376,30 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
               color->colorspace=GRAYColorspace;
               color->green=color->red;
               color->blue=color->red;
-              if (((flags & SigmaValue) != 0) && (color->matte != MagickFalse))
+              if (((flags & SigmaValue) != 0) &&
+                  (color->alpha_trait == BlendPixelTrait))
                 color->alpha=(double) ClampToQuantum(QuantumRange*
                   geometry_info.sigma);
             }
-          if ((LocaleCompare(colorspace,"HSB") == 0) ||
+          if ((LocaleCompare(colorspace,"HCL") == 0) ||
+              (LocaleCompare(colorspace,"HSB") == 0) ||
               (LocaleCompare(colorspace,"HSL") == 0) ||
               (LocaleCompare(colorspace,"HWB") == 0))
             {
               PixelInfo
                 pixel;
 
-              if (LocaleCompare(colorspace,"HSB") == 0)
-                color->colorspace=HSBColorspace;
-              if (LocaleCompare(colorspace,"HSL") == 0)
-                color->colorspace=HSLColorspace;
-              if (LocaleCompare(colorspace,"HWB") == 0)
-                color->colorspace=HWBColorspace;
+              if (LocaleCompare(colorspace,"HCL") == 0)
+                color->colorspace=HCLColorspace;
+              else
+                if (LocaleCompare(colorspace,"HSB") == 0)
+                  color->colorspace=HSBColorspace;
+                else
+                  if (LocaleCompare(colorspace,"HSL") == 0)
+                    color->colorspace=HSLColorspace;
+                  else
+                    if (LocaleCompare(colorspace,"HWB") == 0)
+                      color->colorspace=HWBColorspace;
               scale=1.0/360.0;
               if ((flags & PercentValue) != 0)
                 scale=1.0/100.0;
@@ -2392,19 +2409,24 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
                 scale=1.0/100.0;
               geometry_info.sigma*=scale;
               geometry_info.xi*=scale;
-              if (LocaleCompare(colorspace,"HSB") == 0)
-                ConvertHSBToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,360.0)/
-                  360.0,geometry_info.sigma,geometry_info.xi,&pixel.red,
+              if (LocaleCompare(colorspace,"HCL") == 0)
+                ConvertHCLToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,
+                  360.0)/360.0,geometry_info.sigma,geometry_info.xi,&pixel.red,
                   &pixel.green,&pixel.blue);
               else
-                if (LocaleCompare(colorspace,"HSL") == 0)
-                  ConvertHSLToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,
+                if (LocaleCompare(colorspace,"HSB") == 0)
+                  ConvertHSBToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,
                     360.0)/360.0,geometry_info.sigma,geometry_info.xi,
                     &pixel.red,&pixel.green,&pixel.blue);
                 else
-                  ConvertHWBToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,
-                    360.0)/360.0,geometry_info.sigma,geometry_info.xi,
-                    &pixel.red,&pixel.green,&pixel.blue);
+                  if (LocaleCompare(colorspace,"HSL") == 0)
+                    ConvertHSLToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,
+                      360.0)/360.0,geometry_info.sigma,geometry_info.xi,
+                      &pixel.red,&pixel.green,&pixel.blue);
+                  else
+                    ConvertHWBToRGB(fmod(fmod(geometry_info.rho,360.0)+360.0,
+                      360.0)/360.0,geometry_info.sigma,geometry_info.xi,
+                      &pixel.red,&pixel.green,&pixel.blue);
               color->colorspace=sRGBColorspace;
               color->red=(double) pixel.red;
               color->green=(double) pixel.green;
@@ -2420,7 +2442,8 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
   if (p == (const ColorInfo *) NULL)
     return(MagickFalse);
   color->colorspace=sRGBColorspace;
-  color->matte=p->color.alpha != OpaqueAlpha ? MagickTrue : MagickFalse;
+  color->alpha_trait=p->color.alpha != OpaqueAlpha ? BlendPixelTrait :
+    UndefinedPixelTrait;
   color->red=(double) p->color.red;
   color->green=(double) p->color.green;
   color->blue=(double) p->color.blue;
@@ -2489,7 +2512,7 @@ MagickExport MagickBooleanType QueryColorname(const Image *image,
   pixel=(*color);
   if (compliance == XPMCompliance)
     {
-      pixel.matte=MagickFalse;
+      pixel.alpha_trait=UndefinedPixelTrait;
       pixel.depth=(size_t) MagickMin(1.0*image->depth,16.0);
     }
   GetColorTuple(&pixel,compliance != SVGCompliance ? MagickTrue : MagickFalse,
@@ -2498,7 +2521,7 @@ MagickExport MagickBooleanType QueryColorname(const Image *image,
     return(MagickFalse);
   (void) GetColorInfo("*",exception);
   ResetLinkedListIterator(color_list);
-  opacity=image->matte != MagickFalse ? color->alpha : OpaqueAlpha;
+  opacity=image->alpha_trait == BlendPixelTrait ? color->alpha : OpaqueAlpha;
   p=(const ColorInfo *) GetNextValueInLinkedList(color_list);
   while (p != (const ColorInfo *) NULL)
   {