summaryrefslogtreecommitdiff
path: root/MagickCore/color.c
diff options
context:
space:
mode:
Diffstat (limited to 'MagickCore/color.c')
-rw-r--r--MagickCore/color.c154
1 files changed, 122 insertions, 32 deletions
diff --git a/MagickCore/color.c b/MagickCore/color.c
index 46a20389a..7a64c0108 100644
--- a/MagickCore/color.c
+++ b/MagickCore/color.c
@@ -16,7 +16,7 @@
% July 1992 %
% %
% %
-% Copyright 1999-2020 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization %
% dedicated to making software imaging solutions freely available. %
% %
% You may not use this file except in compliance with the License. You may %
@@ -839,7 +839,7 @@ static LinkedListInfo *AcquireColorCache(const char *filename,
MagickStatusType
status;
- register ssize_t
+ ssize_t
i;
/*
@@ -874,7 +874,7 @@ static LinkedListInfo *AcquireColorCache(const char *filename,
ColorInfo
*color_info;
- register const ColormapInfo
+ const ColormapInfo
*p;
p=Colormap+i;
@@ -950,7 +950,7 @@ MagickPrivate MagickBooleanType ColorComponentGenesis(void)
static void *DestroyColorElement(void *color_info)
{
- register ColorInfo
+ ColorInfo
*p;
p=(ColorInfo *) color_info;
@@ -1010,10 +1010,10 @@ MagickExport const ColorInfo *GetColorCompliance(const char *name,
char
colorname[MagickPathExtent];
- register const ColorInfo
+ const ColorInfo
*p;
- register char
+ char
*q;
assert(exception != (ExceptionInfo *) NULL);
@@ -1285,10 +1285,10 @@ MagickExport const ColorInfo **GetColorInfoList(const char *pattern,
const ColorInfo
**colors;
- register const ColorInfo
+ const ColorInfo
*p;
- register ssize_t
+ ssize_t
i;
/*
@@ -1359,7 +1359,7 @@ extern "C" {
static int ColorCompare(const void *x,const void *y)
{
- register const char
+ const char
**p,
**q;
@@ -1378,10 +1378,10 @@ MagickExport char **GetColorList(const char *pattern,
char
**colors;
- register const ColorInfo
+ const ColorInfo
*p;
- register ssize_t
+ ssize_t
i;
/*
@@ -1650,7 +1650,7 @@ MagickPrivate MagickBooleanType IsEquivalentAlpha(const Image *image,
fuzz,
pixel;
- register double
+ double
distance;
if (image->alpha_trait == UndefinedPixelTrait)
@@ -1718,11 +1718,11 @@ MagickExport MagickBooleanType IsEquivalentImage(const Image *image,
target,
pixel;
- register const Quantum
+ const Quantum
*p,
*q;
- register ssize_t
+ ssize_t
i,
x;
@@ -1827,7 +1827,7 @@ MagickPrivate MagickBooleanType IsEquivalentIntensity(const Image *image,
fuzz,
pixel;
- register double
+ double
distance;
if (GetPixelInfoIntensity(image,p) == GetPixelInfoIntensity(image,q))
@@ -1879,7 +1879,7 @@ MagickExport MagickBooleanType ListColorInfo(FILE *file,
const ColorInfo
**color_info;
- register ssize_t
+ ssize_t
i;
size_t
@@ -2177,6 +2177,91 @@ static MagickBooleanType LoadColorCache(LinkedListInfo *cache,const char *xml,
% o exception: return any errors or warnings in this structure.
%
*/
+
+static MagickStatusType ParseCSSColor(const char *magick_restrict color,
+ GeometryInfo *geometry_info)
+{
+ char
+ *q;
+
+ ssize_t
+ i;
+
+ MagickStatusType
+ flags;
+
+ SetGeometryInfo(geometry_info);
+ flags=NoValue;
+ if ((color == (char *) NULL) || (*color == '\0'))
+ return(flags);
+ q=(char *) color;
+ if (*q == '(')
+ q++;
+ for (i=0; (i < 5) && (*q != ')') && (*q != '\0'); i++)
+ {
+ char
+ *p;
+
+ float
+ intensity;
+
+ p=q;
+ intensity=(float) StringToDouble(p,&q);
+ if (p == q)
+ break;
+ if (*q == '%')
+ {
+ intensity*=0.01f*255.0f;
+ q++;
+ }
+ switch (i)
+ {
+ case 0:
+ {
+ geometry_info->rho=intensity;
+ flags|=RhoValue;
+ if (LocaleNCompare(q,"deg",3) == 0)
+ q+=3;
+ break;
+ }
+ case 1:
+ {
+ geometry_info->sigma=intensity;
+ flags|=SigmaValue;
+ break;
+ }
+ case 2:
+ {
+ geometry_info->xi=intensity;
+ flags|=XiValue;
+ break;
+ }
+ case 3:
+ {
+ geometry_info->psi=intensity;
+ flags|=PsiValue;
+ break;
+ }
+ case 4:
+ {
+ geometry_info->chi=intensity;
+ flags|=ChiValue;
+ break;
+ }
+ }
+ while (isspace((int) ((unsigned char) *q)) != 0)
+ q++;
+ if (*q == ',')
+ q++;
+ if (*q == '/')
+ {
+ flags|=AlphaValue;
+ q++;
+ }
+ }
+ return(flags);
+}
+
MagickExport MagickBooleanType QueryColorCompliance(const char *name,
const ComplianceType compliance,PixelInfo *color,ExceptionInfo *exception)
{
@@ -2189,10 +2274,10 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
MagickStatusType
flags;
- register const ColorInfo
+ const ColorInfo
*p;
- register ssize_t
+ ssize_t
i;
ssize_t
@@ -2326,17 +2411,19 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
if (LocaleNCompare(colorspace,"device-",7) == 0)
{
(void) CopyMagickString(colorspace,colorspace+7,MagickPathExtent);
- scale=(double) QuantumRange;
+ if (strchr(name,'%') == (char *) NULL)
+ scale=(double) QuantumRange;
icc_color=MagickTrue;
}
- if (LocaleCompare(colorspace,"icc-color") == 0)
+ if ((LocaleCompare(colorspace,"color") == 0) ||
+ (LocaleCompare(colorspace,"icc-color") == 0))
{
- register ssize_t
+ ssize_t
j;
(void) CopyMagickString(colorspace,name+i+2,MagickPathExtent);
for (j=0; colorspace[j] != '\0'; j++)
- if (colorspace[j] == ',')
+ if ((colorspace[j] == ' ') || (colorspace[j] == ','))
break;
colorspace[j--]='\0';
i+=j+3;
@@ -2363,11 +2450,10 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
color->colorspace=sRGBColorspace; /* as required by SVG standard */
color->depth=8;
}
- SetGeometryInfo(&geometry_info);
if (i >= (ssize_t) strlen(name))
- flags=ParseGeometry(name,&geometry_info);
+ flags=ParseCSSColor(name,&geometry_info);
else
- flags=ParseGeometry(name+i+1,&geometry_info);
+ flags=ParseCSSColor(name+i+1,&geometry_info);
if (flags == 0)
{
char
@@ -2400,8 +2486,8 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
colorname=DestroyString(colorname);
return(status);
}
- if ((flags & PercentValue) != 0)
- scale=(double) (QuantumRange/100.0);
+ if ((flags & AlphaValue) != 0)
+ color->alpha_trait=BlendPixelTrait;
if ((flags & RhoValue) != 0)
color->red=(double) ClampToQuantum((MagickRealType) (scale*
geometry_info.rho));
@@ -2419,8 +2505,14 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
geometry_info.psi));
else
if (color->alpha_trait != UndefinedPixelTrait)
- color->alpha=(double) ClampToQuantum(QuantumRange*
- geometry_info.psi);
+ {
+ if ((flags & AlphaValue) != 0)
+ color->alpha=(double) ClampToQuantum((MagickRealType) (scale*
+ geometry_info.psi));
+ else
+ color->alpha=(double) ClampToQuantum((MagickRealType) (
+ QuantumRange*geometry_info.psi));
+ }
}
if (((flags & ChiValue) != 0) &&
(color->alpha_trait != UndefinedPixelTrait))
@@ -2458,8 +2550,6 @@ MagickExport MagickBooleanType QueryColorCompliance(const char *name,
red;
scale=1.0/255.0;
- if ((flags & PercentValue) != 0)
- scale=1.0/100.0;
geometry_info.sigma*=scale;
geometry_info.xi*=scale;
red=0.0;
@@ -2577,7 +2667,7 @@ MagickExport MagickBooleanType QueryColorname(
double
alpha;
- register const ColorInfo
+ const ColorInfo
*p;
magick_unreferenced(image);