% MagickCore Image Special Effects Methods %
% %
% Software Design %
-% John Cristy %
+% Cristy %
% October 1996 %
% %
% %
-% Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2015 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 %
/*
Define declarations.
*/
-#define LeftShiftOperator 0xf5
-#define RightShiftOperator 0xf6
-#define LessThanEqualOperator 0xf7
-#define GreaterThanEqualOperator 0xf8
-#define EqualOperator 0xf9
-#define NotEqualOperator 0xfa
-#define LogicalAndOperator 0xfb
-#define LogicalOrOperator 0xfc
-#define ExponentialNotation 0xfd
-
+#define LeftShiftOperator 0xf5U
+#define RightShiftOperator 0xf6U
+#define LessThanEqualOperator 0xf7U
+#define GreaterThanEqualOperator 0xf8U
+#define EqualOperator 0xf9U
+#define NotEqualOperator 0xfaU
+#define LogicalAndOperator 0xfbU
+#define LogicalOrOperator 0xfcU
+#define ExponentialNotation 0xfdU
+
struct _FxInfo
{
const Image
if ((IsGrayColorspace(image->colorspace) != MagickFalse) ||
(IsPixelInfoGray(colorize) != MagickFalse))
(void) SetImageColorspace(colorize_image,sRGBColorspace,exception);
- if ((colorize_image->alpha_trait != BlendPixelTrait) &&
- (colorize->alpha_trait == BlendPixelTrait))
+ if ((colorize_image->alpha_trait == UndefinedPixelTrait) &&
+ (colorize->alpha_trait != UndefinedPixelTrait))
(void) SetImageAlpha(colorize_image,OpaqueAlpha,exception);
if (blend == (const char *) NULL)
return(colorize_image);
blend_percentage.green=geometry_info.rho;
blend_percentage.blue=geometry_info.rho;
blend_percentage.black=geometry_info.rho;
- blend_percentage.alpha=geometry_info.rho;
+ blend_percentage.alpha=(MagickRealType) TransparentAlpha;
if ((flags & SigmaValue) != 0)
blend_percentage.green=geometry_info.sigma;
if ((flags & XiValue) != 0)
GetPixelGreen(image,p)+ColorMatrix[v][2]*GetPixelBlue(image,p);
if (image->colorspace == CMYKColorspace)
sum+=ColorMatrix[v][3]*GetPixelBlack(image,p);
- if (image->alpha_trait == BlendPixelTrait)
+ if (image->alpha_trait != UndefinedPixelTrait)
sum+=ColorMatrix[v][4]*GetPixelAlpha(image,p);
sum+=QuantumRange*ColorMatrix[v][5];
switch (v)
return(y);
}
-static inline double MagickMin(const double x,const double y)
-{
- if (x < y)
- return(x);
- return(y);
-}
-
static double FxChannelStatistics(FxInfo *fx_info,Image *image,
PixelChannel channel,const char *symbol,ExceptionInfo *exception)
{
level=0;
point.x=(double) x;
point.y=(double) y;
- if (isalpha((int) *(p+1)) == 0)
+ if (isalpha((int) ((unsigned char) *(p+1))) == 0)
{
if (strchr("suv",(int) *p) != (char *) NULL)
{
if (*p == '.')
p++;
}
- if ((*p == 'p') && (isalpha((int) *(p+1)) == 0))
+ if ((*p == 'p') && (isalpha((int) ((unsigned char) *(p+1))) == 0))
{
p++;
if (*p == '{')
length=GetImageListLength(fx_info->images);
while (i < 0)
i+=(ssize_t) length;
- i%=length;
+ if (length != 0)
+ i%=length;
image=GetImageFromList(fx_info->images,i);
if (image == (Image *) NULL)
{
double
alpha;
- if (pixel.alpha_trait != BlendPixelTrait)
+ if (pixel.alpha_trait == UndefinedPixelTrait)
return(1.0);
alpha=(double) (QuantumScale*pixel.alpha);
return(alpha);
case IndexPixelChannel:
return(0.0);
case IntensityPixelChannel:
- {
return(QuantumScale*GetPixelInfoIntensity(&pixel));
- }
default:
break;
}
default:
return(0.0);
}
- return(0.0);
}
if (LocaleCompare(symbol,"c") == 0)
return(QuantumScale*pixel.red);
if (LocaleNCompare(symbol,"minima",6) == 0)
return(FxChannelStatistics(fx_info,image,channel,symbol,exception));
if (LocaleCompare(symbol,"m") == 0)
- return(QuantumScale*pixel.blue);
+ return(QuantumScale*pixel.green);
break;
}
case 'N':
case 'y':
{
if (LocaleCompare(symbol,"y") == 0)
- return(QuantumScale*pixel.green);
+ return(QuantumScale*pixel.blue);
break;
}
case 'Z':
while (*expression != '\0')
{
precedence=UndefinedPrecedence;
- if ((isspace((int) ((char) *expression)) != 0) || (c == (int) '@'))
+ if ((isspace((int) ((unsigned char) *expression)) != 0) || (c == (int) '@'))
{
expression++;
continue;
case 'E':
case 'e':
{
- if ((LocaleNCompare(expression,"E+",2) == 0) ||
- (LocaleNCompare(expression,"E-",2) == 0))
- {
+ if ((isdigit((int) ((unsigned char) c)) != 0) &&
+ ((LocaleNCompare(expression,"E+",2) == 0) ||
+ (LocaleNCompare(expression,"E-",2) == 0)))
+ {
expression+=2; /* scientific notation */
break;
}
}
default:
{
- if (((c != 0) && ((isdigit((int) ((char) c)) != 0) ||
- (strchr(")",c) != (char *) NULL))) &&
- (((islower((int) ((char) *expression)) != 0) ||
- (strchr("(",(int) *expression) != (char *) NULL)) ||
- ((isdigit((int) ((char) c)) == 0) &&
- (isdigit((int) ((char) *expression)) != 0))) &&
- (strchr("xy",(int) *expression) == (char *) NULL))
+ if (((c != 0) && ((isdigit((int) ((unsigned char) c)) != 0) ||
+ (strchr(")",(int) ((unsigned char) c)) != (char *) NULL))) &&
+ (((islower((int) ((unsigned char) *expression)) != 0) ||
+ (strchr("(",(int) ((unsigned char) *expression)) != (char *) NULL)) ||
+ ((isdigit((int) ((unsigned char) c)) == 0) &&
+ (isdigit((int) ((unsigned char) *expression)) != 0))) &&
+ (strchr("xy",(int) ((unsigned char) *expression)) == (char *) NULL))
precedence=MultiplyPrecedence;
break;
}
*p;
*beta=0.0;
- if (exception->severity != UndefinedException)
+ if (exception->severity >= ErrorException)
return(0.0);
- while (isspace((int) *expression) != 0)
+ while (isspace((int) ((unsigned char) *expression)) != 0)
expression++;
if (*expression == '\0')
- {
- (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
- "MissingExpression","`%s'",expression);
- return(0.0);
- }
+ return(0.0);
*subexpression='\0';
p=FxOperatorPrecedence(expression,exception);
if (p != (const char *) NULL)
*beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,beta,exception);
if (*beta == 0.0)
{
- if (exception->severity == UndefinedException)
- (void) ThrowMagickException(exception,GetMagickModule(),
- OptionError,"DivideByZero","`%s'",expression);
+ (void) ThrowMagickException(exception,GetMagickModule(),
+ OptionError,"DivideByZero","`%s'",expression);
return(0.0);
}
return(alpha/(*beta));
case EqualOperator:
{
*beta=FxEvaluateSubexpression(fx_info,channel,x,y,++p,beta,exception);
- return(fabs(alpha-(*beta)) < MagickEpsilon ? MagickEpsilon : 0.0);
+ return(fabs(alpha-(*beta)) < MagickEpsilon ? 1.0 : 0.0);
}
case NotEqualOperator:
{
case 'r':
{
if (LocaleNCompare(expression,"rand",4) == 0)
- return((double) GetPseudoRandomValue(fx_info->random_info));
+ {
+ double
+ alpha;
+
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+ #pragma omp critical (MagickCore_FxEvaluateSubexpression)
+#endif
+ alpha=GetPseudoRandomValue(fx_info->random_info);
+ return(alpha);
+ }
if (LocaleNCompare(expression,"round",5) == 0)
{
alpha=FxEvaluateSubexpression(fx_info,channel,x,y,expression+5,beta,
if (*expression != '@')
fx_expression=ConstantString(expression);
else
- fx_expression=FileToString(expression+1,~0,exception);
+ fx_expression=FileToString(expression+1,~0UL,exception);
for (i=0; i < (ssize_t) number_threads; i++)
{
MagickBooleanType
*/
if (GetPixelReadMask(image,p) == 0)
{
+ SetPixelBackgoundColor(implode_image,q);
p+=GetPixelChannels(image);
q+=GetPixelChannels(implode_image);
continue;
SetPixelGreen(sepia_image,ClampToQuantum(tone),q);
if ((double) GetPixelBlue(image,q) < tone)
SetPixelBlue(sepia_image,ClampToQuantum(tone),q);
+ SetPixelAlpha(sepia_image,GetPixelAlpha(image,p),q);
p+=GetPixelChannels(image);
q+=GetPixelChannels(sepia_image);
}
clone_image=DestroyImage(clone_image);
if (border_image == (Image *) NULL)
return((Image *) NULL);
- if (border_image->alpha_trait != BlendPixelTrait)
+ if (border_image->alpha_trait == UndefinedPixelTrait)
(void) SetImageAlphaChannel(border_image,OpaqueAlphaChannel,exception);
/*
Shadow image.
background_color.alpha_trait=BlendPixelTrait;
for (x=0; x < (ssize_t) border_image->columns; x++)
{
- if (border_image->alpha_trait == BlendPixelTrait)
+ if (border_image->alpha_trait != UndefinedPixelTrait)
background_color.alpha=GetPixelAlpha(border_image,q)*alpha/100.0;
SetPixelInfoPixel(border_image,&background_color,q);
q+=GetPixelChannels(border_image);
border_image=DestroyImage(border_image);
if (shadow_image == (Image *) NULL)
return((Image *) NULL);
- (void) SetPixelChannelMask(shadow_image,channel_mask);
+ SetPixelChannelMask(shadow_image,channel_mask);
if (shadow_image->page.width == 0)
shadow_image->page.width=shadow_image->columns;
if (shadow_image->page.height == 0)
if ((double) image->colormap[i].red > threshold)
image->colormap[i].red=QuantumRange-image->colormap[i].red;
if ((double) image->colormap[i].green > threshold)
- image->colormap[i].green=QuantumRange-
- image->colormap[i].green;
+ image->colormap[i].green=QuantumRange-image->colormap[i].green;
if ((double) image->colormap[i].blue > threshold)
- image->colormap[i].blue=QuantumRange-
- image->colormap[i].blue;
+ image->colormap[i].blue=QuantumRange-image->colormap[i].blue;
}
}
/*
{
PixelChannel channel=GetPixelChannelChannel(image,i);
PixelTrait traits=GetPixelChannelTraits(image,channel);
- if ((traits == UndefinedPixelTrait) ||
- ((traits & CopyPixelTrait) != 0))
+ if ((traits & UpdatePixelTrait) == 0)
continue;
if ((double) q[i] > threshold)
q[i]=QuantumRange-q[i];
*/
if (GetPixelReadMask(image,p) == 0)
{
+ SetPixelBackgoundColor(swirl_image,q);
p+=GetPixelChannels(image);
q+=GetPixelChannels(swirl_image);
continue;