X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=MagickCore%2Ffx.c;h=44c4e5e56bb4c39725cc65e726162dff840046ac;hb=17f11b056210f082a6d0e54ac5d68e6d72fa76b2;hp=9eef035b5bf4cebc5bff25bc31c2dd6dbceed895;hpb=94d535de97796790e76b0448ea6da125264c55a7;p=imagemagick diff --git a/MagickCore/fx.c b/MagickCore/fx.c index 9eef035b5..44c4e5e56 100644 --- a/MagickCore/fx.c +++ b/MagickCore/fx.c @@ -13,11 +13,11 @@ % MagickCore Image Special Effects Methods % % % % Software Design % -% John Cristy % +% Cristy % % October 1996 % % % % % -% Copyright 1999-2012 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 % @@ -46,6 +46,7 @@ #include "MagickCore/attribute.h" #include "MagickCore/cache.h" #include "MagickCore/cache-view.h" +#include "MagickCore/channel.h" #include "MagickCore/color.h" #include "MagickCore/color-private.h" #include "MagickCore/colorspace-private.h" @@ -94,16 +95,16 @@ /* 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 @@ -178,7 +179,7 @@ MagickPrivate FxInfo *AcquireFxInfo(const Image *image,const char *expression, fx_info->exception=AcquireExceptionInfo(); fx_info->images=image; fx_info->colors=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory, - RelinquishMagickMemory); + RelinquishAlignedMemory); fx_info->symbols=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory, RelinquishMagickMemory); fx_info->view=(CacheView **) AcquireQuantumMemory(GetImageListLength( @@ -200,10 +201,11 @@ MagickPrivate FxInfo *AcquireFxInfo(const Image *image,const char *expression, Force right-to-left associativity for unary negation. */ (void) SubstituteString(&fx_info->expression,"-","-1.0*"); + (void) SubstituteString(&fx_info->expression,"^-1.0*","^-"); (void) SubstituteString(&fx_info->expression,"E-1.0*","E-"); (void) SubstituteString(&fx_info->expression,"e-1.0*","e-"); /* - Convert complex to simple operators. + Convert compound to simple operators. */ fx_op[1]='\0'; *fx_op=(char) LeftShiftOperator; @@ -283,8 +285,10 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, ssize_t y; +#if defined(MAGICKCORE_OPENMP_SUPPORT) unsigned long key; +#endif /* Initialize noise image attributes. @@ -303,8 +307,6 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, noise_image=DestroyImage(noise_image); return((Image *) NULL); } - if (IsGrayColorspace(image->colorspace) != MagickFalse) - (void) TransformImageColorspace(noise_image,RGBColorspace,exception); /* Add noise in each row. */ @@ -313,10 +315,10 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, random_info=AcquireRandomInfoThreadSet(); image_view=AcquireVirtualCacheView(image,exception); noise_view=AcquireAuthenticCacheView(noise_image,exception); - key=GetRandomSecretKey(random_info[0]); #if defined(MAGICKCORE_OPENMP_SUPPORT) + key=GetRandomSecretKey(random_info[0]); #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,key == ~0UL) + magick_threads(image,noise_image,image->rows,key == ~0UL) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -352,21 +354,14 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - PixelChannel - channel; - - PixelTrait - noise_traits, - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - noise_traits=GetPixelChannelMapTraits(noise_image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); + PixelTrait noise_traits=GetPixelChannelTraits(noise_image,channel); if ((traits == UndefinedPixelTrait) || (noise_traits == UndefinedPixelTrait)) continue; if (((noise_traits & CopyPixelTrait) != 0) || - (GetPixelMask(image,p) != 0)) + (GetPixelReadMask(image,p) == 0)) { SetPixelChannel(noise_image,channel,p[i],q); continue; @@ -478,7 +473,7 @@ MagickExport Image *BlueShiftImage(const Image *image,const double factor, shift_view=AcquireAuthenticCacheView(shift_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,shift_image,image->rows,1) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -606,8 +601,7 @@ MagickExport Image *CharcoalImage(const Image *image,const double radius, clone_image=CloneImage(image,0,0,MagickTrue,exception); if (clone_image == (Image *) NULL) return((Image *) NULL); - (void) SetImageType(clone_image,GrayscaleType,exception); - edge_image=EdgeImage(clone_image,radius,sigma,exception); + edge_image=EdgeImage(clone_image,radius,exception); clone_image=DestroyImage(clone_image); if (edge_image == (Image *) NULL) return((Image *) NULL); @@ -617,7 +611,7 @@ MagickExport Image *CharcoalImage(const Image *image,const double radius, return((Image *) NULL); (void) NormalizeImage(charcoal_image,exception); (void) NegateImage(charcoal_image,MagickFalse,exception); - (void) SetImageType(charcoal_image,GrayscaleType,exception); + (void) GrayscaleImage(charcoal_image,image->intensity,exception); return(charcoal_image); } @@ -659,7 +653,7 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend, { #define ColorizeImageTag "Colorize/Image" #define Colorize(pixel,blend_percentage,colorize) \ - (pixel)=((pixel)*(100.0-(blend_percentage))+(colorize)*(blend_percentage))/100.0; + (((pixel)*(100.0-(blend_percentage))+(colorize)*(blend_percentage))/100.0) CacheView *colorize_view, @@ -704,11 +698,11 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend, colorize_image=DestroyImage(colorize_image); return((Image *) NULL); } - if ((IsGrayColorspace(image->colorspace) != MagickFalse) && + if ((IsGrayColorspace(image->colorspace) != MagickFalse) || (IsPixelInfoGray(colorize) != MagickFalse)) - (void) SetImageColorspace(colorize_image,RGBColorspace,exception); - if ((colorize_image->matte == MagickFalse) && - (colorize->matte != MagickFalse)) + (void) SetImageColorspace(colorize_image,sRGBColorspace,exception); + if ((colorize_image->alpha_trait == UndefinedPixelTrait) && + (colorize->alpha_trait != UndefinedPixelTrait)) (void) SetImageAlpha(colorize_image,OpaqueAlpha,exception); if (blend == (const char *) NULL) return(colorize_image); @@ -718,7 +712,7 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend, 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) @@ -741,25 +735,22 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend, colorize_view=AcquireAuthenticCacheView(colorize_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,colorize_image,image->rows,1) #endif for (y=0; y < (ssize_t) image->rows; y++) { MagickBooleanType sync; - PixelInfo - pixel; - register const Quantum *restrict p; - register ssize_t - x; - register Quantum *restrict q; + register ssize_t + x; + if (status == MagickFalse) continue; p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); @@ -770,22 +761,30 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend, status=MagickFalse; continue; } - GetPixelInfo(colorize_image,&pixel); for (x=0; x < (ssize_t) image->columns; x++) { - if (GetPixelMask(colorize_image,q) != 0) - { - p+=GetPixelChannels(image); - q+=GetPixelChannels(colorize_image); + register ssize_t + i; + + for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + { + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); + PixelTrait colorize_traits=GetPixelChannelTraits(colorize_image, + channel); + if ((traits == UndefinedPixelTrait) || + (colorize_traits == UndefinedPixelTrait)) continue; - } - GetPixelInfoPixel(image,p,&pixel); - Colorize(pixel.red,blend_percentage.red,colorize->red); - Colorize(pixel.green,blend_percentage.green,colorize->green); - Colorize(pixel.blue,blend_percentage.blue,colorize->blue); - Colorize(pixel.black,blend_percentage.black,colorize->black); - Colorize(pixel.alpha,blend_percentage.alpha,colorize->alpha); - SetPixelInfoPixel(colorize_image,&pixel,q); + if (((colorize_traits & CopyPixelTrait) != 0) || + (GetPixelReadMask(image,p) == 0)) + { + SetPixelChannel(colorize_image,channel,p[i],q); + continue; + } + SetPixelChannel(colorize_image,channel,ClampToQuantum(Colorize(p[i], + GetPixelInfoChannel(&blend_percentage,channel),GetPixelInfoChannel( + colorize,channel))),q); + } p+=GetPixelChannels(image); q+=GetPixelChannels(colorize_image); } @@ -948,7 +947,7 @@ MagickExport Image *ColorMatrixImage(const Image *image, color_view=AcquireAuthenticCacheView(color_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,color_image,image->rows,1) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -994,7 +993,7 @@ MagickExport Image *ColorMatrixImage(const Image *image, GetPixelGreen(image,p)+ColorMatrix[v][2]*GetPixelBlue(image,p); if (image->colorspace == CMYKColorspace) sum+=ColorMatrix[v][3]*GetPixelBlack(image,p); - if (image->matte != MagickFalse) + if (image->alpha_trait != UndefinedPixelTrait) sum+=ColorMatrix[v][4]*GetPixelAlpha(image,p); sum+=QuantumRange*ColorMatrix[v][5]; switch (v) @@ -1116,13 +1115,6 @@ static inline double MagickMax(const double x,const double y) 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) { @@ -1151,7 +1143,7 @@ static double FxChannelStatistics(FxInfo *fx_info,Image *image, { channel=(PixelChannel) option; channel_mask=(ChannelType) (channel_mask | (1 << channel)); - SetPixelChannelMapMask(image,channel_mask); + SetPixelChannelMask(image,channel_mask); } } (void) FormatLocaleString(key,MaxTextExtent,"%p.%.20g.%s",(void *) image, @@ -1160,7 +1152,7 @@ static double FxChannelStatistics(FxInfo *fx_info,Image *image, if (value != (const char *) NULL) { if (channel_mask != UndefinedChannel) - SetPixelChannelMapMask(image,channel_mask); + SetPixelChannelMask(image,channel_mask); return(QuantumScale*StringToDouble(value,(char **) NULL)); } (void) DeleteNodeFromSplayTree(fx_info->symbols,key); @@ -1228,7 +1220,7 @@ static double FxChannelStatistics(FxInfo *fx_info,Image *image, standard_deviation); } if (channel_mask != UndefinedChannel) - SetPixelChannelMapMask(image,channel_mask); + SetPixelChannelMask(image,channel_mask); (void) AddValueToSplayTree(fx_info->symbols,ConstantString(key), ConstantString(statistic)); return(QuantumScale*StringToDouble(statistic,(char **) NULL)); @@ -1268,7 +1260,7 @@ static inline const char *FxSubexpression(const char *expression, } if (*subexpression == '\0') (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "UnbalancedParenthesis","'%s'",expression); + "UnbalancedParenthesis","`%s'",expression); return(subexpression); } @@ -1310,7 +1302,7 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, 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) { @@ -1352,7 +1344,7 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, if (*p == '.') p++; } - if ((isalpha((int) *(p+1)) == 0) && (*p == 'p')) + if ((*p == 'p') && (isalpha((int) ((unsigned char) *(p+1))) == 0)) { p++; if (*p == '{') @@ -1411,20 +1403,21 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, 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) { (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "NoSuchImage","'%s'",expression); + "NoSuchImage","`%s'",expression); return(0.0); } GetPixelInfo(image,&pixel); (void) InterpolatePixelInfo(image,fx_info->view[i],image->interpolate, point.x,point.y,&pixel,exception); if ((strlen(p) > 2) && (LocaleCompare(p,"intensity") != 0) && - (LocaleCompare(p,"luminance") != 0) && (LocaleCompare(p,"hue") != 0) && - (LocaleCompare(p,"saturation") != 0) && + (LocaleCompare(p,"luma") != 0) && (LocaleCompare(p,"luminance") != 0) && + (LocaleCompare(p,"hue") != 0) && (LocaleCompare(p,"saturation") != 0) && (LocaleCompare(p,"lightness") != 0)) { char @@ -1483,7 +1476,7 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, if (image->colorspace != CMYKColorspace) { (void) ThrowMagickException(exception,GetMagickModule(), - ImageError,"ColorSeparatedImageRequired","'%s'", + ImageError,"ColorSeparatedImageRequired","`%s'", image->filename); return(0.0); } @@ -1494,7 +1487,7 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, double alpha; - if (pixel.matte == MagickFalse) + if (pixel.alpha_trait == UndefinedPixelTrait) return(1.0); alpha=(double) (QuantumScale*pixel.alpha); return(alpha); @@ -1502,14 +1495,12 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, case IndexPixelChannel: return(0.0); case IntensityPixelChannel: - { return(QuantumScale*GetPixelInfoIntensity(&pixel)); - } default: break; } (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "UnableToParseExpression","'%s'",p); + "UnableToParseExpression","`%s'",p); return(0.0); } switch (*symbol) @@ -1611,7 +1602,6 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, default: return(0.0); } - return(0.0); } if (LocaleCompare(symbol,"c") == 0) return(QuantumScale*pixel.red); @@ -1641,7 +1631,7 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, if (image->colorspace != CMYKColorspace) { (void) ThrowMagickException(exception,GetMagickModule(), - OptionError,"ColorSeparatedImageRequired","'%s'", + OptionError,"ColorSeparatedImageRequired","`%s'", image->filename); return(0.0); } @@ -1709,12 +1699,20 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, &lightness); return(lightness); } + if (LocaleCompare(symbol,"luma") == 0) + { + double + luma; + + luma=0.212656*pixel.red+0.715158*pixel.green+0.072186*pixel.blue; + return(QuantumScale*luma); + } if (LocaleCompare(symbol,"luminance") == 0) { double luminence; - luminence=0.21267*pixel.red+0.71516*pixel.green+0.07217*pixel.blue; + luminence=0.212656*pixel.red+0.715158*pixel.green+0.072186*pixel.blue; return(QuantumScale*luminence); } break; @@ -1729,7 +1727,7 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, 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': @@ -1808,7 +1806,7 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, case 'y': { if (LocaleCompare(symbol,"y") == 0) - return(QuantumScale*pixel.green); + return(QuantumScale*pixel.blue); break; } case 'Z': @@ -1831,7 +1829,7 @@ static double FxGetSymbol(FxInfo *fx_info,const PixelChannel channel, if (value != (const char *) NULL) return((double) StringToDouble(value,(char **) NULL)); (void) ThrowMagickException(exception,GetMagickModule(),OptionError, - "UnableToParseExpression","'%s'",symbol); + "UnableToParseExpression","`%s'",symbol); return(0.0); } @@ -1880,7 +1878,7 @@ static const char *FxOperatorPrecedence(const char *expression, while (*expression != '\0') { precedence=UndefinedPrecedence; - if ((isspace((int) ((char) *expression)) != 0) || (c == (int) '@')) + if ((isspace((int) ((unsigned char) *expression)) != 0) || (c == (int) '@')) { expression++; continue; @@ -1921,9 +1919,10 @@ static const char *FxOperatorPrecedence(const char *expression, 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; } @@ -1970,13 +1969,13 @@ static const char *FxOperatorPrecedence(const char *expression, } 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; } @@ -2107,16 +2106,12 @@ static double FxEvaluateSubexpression(FxInfo *fx_info, *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) @@ -2155,9 +2150,8 @@ static double FxEvaluateSubexpression(FxInfo *fx_info, *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)); @@ -2169,7 +2163,7 @@ static double FxEvaluateSubexpression(FxInfo *fx_info, if (*beta == 0.0) { (void) ThrowMagickException(exception,GetMagickModule(), - OptionError,"DivideByZero","'%s'",expression); + OptionError,"DivideByZero","`%s'",expression); return(0.0); } return(fmod((double) alpha,(double) *beta)); @@ -2219,7 +2213,7 @@ static double FxEvaluateSubexpression(FxInfo *fx_info, 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: { @@ -2261,7 +2255,7 @@ static double FxEvaluateSubexpression(FxInfo *fx_info, if (q == (char *) NULL) { (void) ThrowMagickException(exception,GetMagickModule(), - OptionError,"UnableToParseExpression","'%s'",subexpression); + OptionError,"UnableToParseExpression","`%s'",subexpression); return(0.0); } if (fabs((double) alpha) >= MagickEpsilon) @@ -2281,7 +2275,7 @@ static double FxEvaluateSubexpression(FxInfo *fx_info, if (*q != '\0') { (void) ThrowMagickException(exception,GetMagickModule(), - OptionError,"UnableToParseExpression","'%s'",subexpression); + OptionError,"UnableToParseExpression","`%s'",subexpression); return(0.0); } ClearMagickException(exception); @@ -2619,8 +2613,7 @@ static double FxEvaluateSubexpression(FxInfo *fx_info, exception); if (alpha == 0.0) return(1.0); - gamma=(double) (2.0*j1((double) (MagickPI*alpha))/(MagickPI* - alpha)); + gamma=(double) (2.0*j1((double) (MagickPI*alpha))/(MagickPI*alpha)); return(gamma); } #endif @@ -2735,7 +2728,16 @@ static double FxEvaluateSubexpression(FxInfo *fx_info, 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, @@ -2981,20 +2983,31 @@ static FxInfo **AcquireFxThreadSet(const Image *image,const char *expression, number_threads=(size_t) GetMagickResourceLimit(ThreadResource); fx_info=(FxInfo **) AcquireQuantumMemory(number_threads,sizeof(*fx_info)); if (fx_info == (FxInfo **) NULL) - return((FxInfo **) NULL); + { + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + return((FxInfo **) NULL); + } (void) ResetMagickMemory(fx_info,0,number_threads*sizeof(*fx_info)); 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 + status; + fx_info[i]=AcquireFxInfo(image,fx_expression,exception); if (fx_info[i] == (FxInfo *) NULL) - return(DestroyFxThreadSet(fx_info)); - (void) FxPreprocessExpression(fx_info[i],&alpha,fx_info[i]->exception); + break; + status=FxPreprocessExpression(fx_info[i],&alpha,exception); + if (status == MagickFalse) + break; } fx_expression=DestroyString(fx_expression); + if (i < (ssize_t) number_threads) + fx_info=DestroyFxThreadSet(fx_info); return(fx_info); } @@ -3019,9 +3032,6 @@ MagickExport Image *FxImage(const Image *image,const char *expression, MagickOffsetType progress; - double - alpha; - ssize_t y; @@ -3029,25 +3039,19 @@ MagickExport Image *FxImage(const Image *image,const char *expression, assert(image->signature == MagickSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + fx_info=AcquireFxThreadSet(image,expression,exception); + if (fx_info == (FxInfo **) NULL) + return((Image *) NULL); fx_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception); if (fx_image == (Image *) NULL) - return((Image *) NULL); - if (SetImageStorageClass(fx_image,DirectClass,exception) == MagickFalse) { - fx_image=DestroyImage(fx_image); + fx_info=DestroyFxThreadSet(fx_info); return((Image *) NULL); } - fx_info=AcquireFxThreadSet(image,expression,exception); - if (fx_info == (FxInfo **) NULL) - { - fx_image=DestroyImage(fx_image); - ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); - } - status=FxPreprocessExpression(fx_info[0],&alpha,exception); - if (status == MagickFalse) + if (SetImageStorageClass(fx_image,DirectClass,exception) == MagickFalse) { - fx_image=DestroyImage(fx_image); fx_info=DestroyFxThreadSet(fx_info); + fx_image=DestroyImage(fx_image); return((Image *) NULL); } /* @@ -3059,7 +3063,7 @@ MagickExport Image *FxImage(const Image *image,const char *expression, fx_view=AcquireAuthenticCacheView(fx_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,fx_image,fx_image->rows,1) #endif for (y=0; y < (ssize_t) fx_image->rows; y++) { @@ -3094,21 +3098,14 @@ MagickExport Image *FxImage(const Image *image,const char *expression, double alpha; - PixelChannel - channel; - - PixelTrait - fx_traits, - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - fx_traits=GetPixelChannelMapTraits(fx_image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); + PixelTrait fx_traits=GetPixelChannelTraits(fx_image,channel); if ((traits == UndefinedPixelTrait) || (fx_traits == UndefinedPixelTrait)) continue; if (((fx_traits & CopyPixelTrait) != 0) || - (GetPixelMask(image,p) != 0)) + (GetPixelReadMask(image,p) == 0)) { SetPixelChannel(fx_image,channel,p[i],q); continue; @@ -3187,7 +3184,8 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, CacheView *image_view, - *implode_view; + *implode_view, + *interpolate_view; Image *implode_image; @@ -3227,7 +3225,7 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, return((Image *) NULL); } if (implode_image->background_color.alpha != OpaqueAlpha) - implode_image->matte=MagickTrue; + implode_image->alpha_trait=BlendPixelTrait; /* Compute scaling factor. */ @@ -3250,10 +3248,11 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, status=MagickTrue; progress=0; image_view=AcquireVirtualCacheView(image,exception); + interpolate_view=AcquireVirtualCacheView(image,exception); implode_view=AcquireAuthenticCacheView(implode_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,implode_image,image->rows,1) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -3274,7 +3273,7 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, if (status == MagickFalse) continue; - p=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); q=QueueCacheViewAuthenticPixels(implode_view,0,y,implode_image->columns,1, exception); if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) @@ -3291,8 +3290,9 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, /* Determine if the pixel is within an ellipse. */ - if (GetPixelMask(image,p) != 0) + if (GetPixelReadMask(image,p) == 0) { + SetPixelBackgoundColor(implode_image,q); p+=GetPixelChannels(image); q+=GetPixelChannels(implode_image); continue; @@ -3302,16 +3302,10 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, if (distance >= (radius*radius)) for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - PixelChannel - channel; - - PixelTrait - implode_traits, - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - implode_traits=GetPixelChannelMapTraits(implode_image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); + PixelTrait implode_traits=GetPixelChannelTraits(implode_image, + channel); if ((traits == UndefinedPixelTrait) || (implode_traits == UndefinedPixelTrait)) continue; @@ -3329,9 +3323,9 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, if (distance > 0.0) factor=pow(sin((double) (MagickPI*sqrt((double) distance)/radius/ 2)),-amount); - status=InterpolatePixelChannels(image,image_view,implode_image,method, - (double) (factor*delta.x/scale.x+center.x),(double) (factor*delta.y/ - scale.y+center.y),q,exception); + status=InterpolatePixelChannels(image,interpolate_view,implode_image, + method,(double) (factor*delta.x/scale.x+center.x),(double) (factor* + delta.y/scale.y+center.y),q,exception); } p+=GetPixelChannels(image); q+=GetPixelChannels(implode_image); @@ -3352,6 +3346,7 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, } } implode_view=DestroyCacheView(implode_view); + interpolate_view=DestroyCacheView(interpolate_view); image_view=DestroyCacheView(image_view); if (status == MagickFalse) implode_image=DestroyImage(implode_image); @@ -3388,11 +3383,15 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, % o exception: return any errors or warnings in this structure. % */ -MagickExport Image *MorphImages(const Image *image, - const size_t number_frames,ExceptionInfo *exception) +MagickExport Image *MorphImages(const Image *image,const size_t number_frames, + ExceptionInfo *exception) { #define MorphImageTag "Morph/Image" + double + alpha, + beta; + Image *morph_image, *morph_images; @@ -3403,10 +3402,6 @@ MagickExport Image *MorphImages(const Image *image, MagickOffsetType scene; - double - alpha, - beta; - register const Image *next; @@ -3498,7 +3493,7 @@ MagickExport Image *MorphImages(const Image *image, morph_view=AcquireAuthenticCacheView(morph_images,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(morph_image,morph_image,morph_image->rows,1) #endif for (y=0; y < (ssize_t) morph_images->rows; y++) { @@ -3532,21 +3527,14 @@ MagickExport Image *MorphImages(const Image *image, for (i=0; i < (ssize_t) GetPixelChannels(morph_image); i++) { - PixelChannel - channel; - - PixelTrait - morph_traits, - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - morph_traits=GetPixelChannelMapTraits(morph_image,channel); + PixelChannel channel=GetPixelChannelChannel(morph_image,i); + PixelTrait traits=GetPixelChannelTraits(morph_image,channel); + PixelTrait morph_traits=GetPixelChannelTraits(morph_images,channel); if ((traits == UndefinedPixelTrait) || (morph_traits == UndefinedPixelTrait)) continue; if (((morph_traits & CopyPixelTrait) != 0) || - (GetPixelMask(image,p) != 0)) + (GetPixelReadMask(morph_images,p) == 0)) { SetPixelChannel(morph_image,channel,p[i],q); continue; @@ -3654,12 +3642,6 @@ static MagickBooleanType PlasmaImageProxy(Image *image,CacheView *image_view, double plasma; - PixelChannel - channel; - - PixelTrait - traits; - register const Quantum *restrict u, *restrict v; @@ -3736,11 +3718,11 @@ static MagickBooleanType PlasmaImageProxy(Image *image,CacheView *image_view, return(MagickTrue); for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); if (traits == UndefinedPixelTrait) continue; - q[i]=PlasmaPixel(random_info,(u[channel]+v[channel])/2.0,plasma); + q[i]=PlasmaPixel(random_info,(u[i]+v[i])/2.0,plasma); } (void) SyncCacheViewAuthenticPixels(image_view,exception); if (segment->x1 != segment->x2) @@ -3759,11 +3741,11 @@ static MagickBooleanType PlasmaImageProxy(Image *image,CacheView *image_view, return(MagickTrue); for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); if (traits == UndefinedPixelTrait) continue; - q[i]=PlasmaPixel(random_info,(u[channel]+v[channel])/2.0,plasma); + q[i]=PlasmaPixel(random_info,(u[i]+v[i])/2.0,plasma); } (void) SyncCacheViewAuthenticPixels(image_view,exception); } @@ -3786,11 +3768,11 @@ static MagickBooleanType PlasmaImageProxy(Image *image,CacheView *image_view, return(MagickTrue); for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); if (traits == UndefinedPixelTrait) continue; - q[i]=PlasmaPixel(random_info,(u[channel]+v[channel])/2.0,plasma); + q[i]=PlasmaPixel(random_info,(u[i]+v[i])/2.0,plasma); } (void) SyncCacheViewAuthenticPixels(image_view,exception); } @@ -3810,11 +3792,11 @@ static MagickBooleanType PlasmaImageProxy(Image *image,CacheView *image_view, return(MagickTrue); for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); if (traits == UndefinedPixelTrait) continue; - q[i]=PlasmaPixel(random_info,(u[channel]+v[channel])/2.0,plasma); + q[i]=PlasmaPixel(random_info,(u[i]+v[i])/2.0,plasma); } (void) SyncCacheViewAuthenticPixels(image_view,exception); } @@ -3836,11 +3818,11 @@ static MagickBooleanType PlasmaImageProxy(Image *image,CacheView *image_view, return(MagickTrue); for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); if (traits == UndefinedPixelTrait) continue; - q[i]=PlasmaPixel(random_info,(u[channel]+v[channel])/2.0,plasma); + q[i]=PlasmaPixel(random_info,(u[i]+v[i])/2.0,plasma); } (void) SyncCacheViewAuthenticPixels(image_view,exception); } @@ -3960,6 +3942,9 @@ MagickExport Image *PolaroidImage(const Image *image,const DrawInfo *draw_info, DrawInfo *annotate_info; + ImageInfo + *image_info; + MagickBooleanType status; @@ -3975,9 +3960,11 @@ MagickExport Image *PolaroidImage(const Image *image,const DrawInfo *draw_info, caption_image=CloneImage(image,image->columns,1,MagickTrue,exception); if (caption_image == (Image *) NULL) return((Image *) NULL); + image_info=AcquireImageInfo(); annotate_info=CloneDrawInfo((const ImageInfo *) NULL,draw_info); - text=InterpretImageProperties((ImageInfo *) NULL,(Image *) image,caption, + text=InterpretImageProperties(image_info,(Image *) image,caption, exception); + image_info=DestroyImageInfo(image_info); (void) CloneString(&annotate_info->text,text); count=FormatMagickCaption(caption_image,annotate_info,MagickTrue,&metrics, &text,exception); @@ -4149,7 +4136,7 @@ MagickExport Image *SepiaToneImage(const Image *image,const double threshold, sepia_view=AcquireAuthenticCacheView(sepia_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,sepia_image,image->rows,1) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -4192,6 +4179,7 @@ MagickExport Image *SepiaToneImage(const Image *image,const double threshold, 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); } @@ -4290,7 +4278,7 @@ MagickExport Image *ShadowImage(const Image *image,const double alpha, if (clone_image == (Image *) NULL) return((Image *) NULL); if (IsGrayColorspace(image->colorspace) != MagickFalse) - (void) TransformImageColorspace(clone_image,RGBColorspace,exception); + (void) SetImageColorspace(clone_image,sRGBColorspace,exception); (void) SetImageVirtualPixelMethod(clone_image,TransparentVirtualPixelMethod, exception); border_info.width=(size_t) floor(2.0*sigma+0.5); @@ -4299,12 +4287,12 @@ MagickExport Image *ShadowImage(const Image *image,const double alpha, border_info.y=0; (void) QueryColorCompliance("none",AllCompliance,&clone_image->border_color, exception); - clone_image->matte=MagickTrue; + clone_image->alpha_trait=BlendPixelTrait; border_image=BorderImage(clone_image,&border_info,OverCompositeOp,exception); clone_image=DestroyImage(clone_image); if (border_image == (Image *) NULL) return((Image *) NULL); - if (border_image->matte == MagickFalse) + if (border_image->alpha_trait == UndefinedPixelTrait) (void) SetImageAlphaChannel(border_image,OpaqueAlphaChannel,exception); /* Shadow image. @@ -4332,10 +4320,10 @@ MagickExport Image *ShadowImage(const Image *image,const double alpha, continue; } background_color=border_image->background_color; - background_color.matte=MagickTrue; + background_color.alpha_trait=BlendPixelTrait; for (x=0; x < (ssize_t) border_image->columns; x++) { - if (border_image->matte != MagickFalse) + 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); @@ -4349,12 +4337,12 @@ MagickExport Image *ShadowImage(const Image *image,const double alpha, border_image=DestroyImage(border_image); return((Image *) NULL); } - channel_mask=SetPixelChannelMask(border_image,AlphaChannel); + channel_mask=SetImageChannelMask(border_image,AlphaChannel); shadow_image=BlurImage(border_image,0.0,sigma,exception); border_image=DestroyImage(border_image); if (shadow_image == (Image *) NULL) return((Image *) NULL); - (void) SetPixelChannelMapMask(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) @@ -4424,8 +4412,10 @@ MagickExport Image *SketchImage(const Image *image,const double radius, ssize_t y; +#if defined(MAGICKCORE_OPENMP_SUPPORT) unsigned long key; +#endif /* Sketch image. @@ -4436,11 +4426,13 @@ MagickExport Image *SketchImage(const Image *image,const double radius, return((Image *) NULL); status=MagickTrue; random_info=AcquireRandomInfoThreadSet(); +#if defined(MAGICKCORE_OPENMP_SUPPORT) key=GetRandomSecretKey(random_info[0]); +#endif random_view=AcquireAuthenticCacheView(random_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(status) \ - dynamic_number_threads(image,image->columns,image->rows,key == ~0UL) + magick_threads(random_image,random_image,random_image->rows,key == ~0UL) #endif for (y=0; y < (ssize_t) random_image->rows; y++) { @@ -4470,7 +4462,7 @@ MagickExport Image *SketchImage(const Image *image,const double radius, register ssize_t i; - if (GetPixelMask(random_image,q) != 0) + if (GetPixelReadMask(random_image,q) == 0) { q+=GetPixelChannels(random_image); continue; @@ -4478,14 +4470,8 @@ MagickExport Image *SketchImage(const Image *image,const double radius, value=GetPseudoRandomValue(random_info[id]); for (i=0; i < (ssize_t) GetPixelChannels(random_image); i++) { - PixelChannel - channel; - - PixelTrait - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); if (traits == UndefinedPixelTrait) continue; q[i]=ClampToQuantum(QuantumRange*value); @@ -4506,7 +4492,7 @@ MagickExport Image *SketchImage(const Image *image,const double radius, random_image=DestroyImage(random_image); if (blur_image == (Image *) NULL) return((Image *) NULL); - dodge_image=EdgeImage(blur_image,radius,1.0,exception); + dodge_image=EdgeImage(blur_image,radius,exception); blur_image=DestroyImage(blur_image); if (dodge_image == (Image *) NULL) return((Image *) NULL); @@ -4586,6 +4572,8 @@ MagickExport MagickBooleanType SolarizeImage(Image *image, assert(image->signature == MagickSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + if (IsGrayColorspace(image->colorspace) != MagickFalse) + (void) SetImageColorspace(image,sRGBColorspace,exception); if (image->storage_class == PseudoClass) { register ssize_t @@ -4599,11 +4587,9 @@ MagickExport MagickBooleanType SolarizeImage(Image *image, 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; } } /* @@ -4614,7 +4600,7 @@ MagickExport MagickBooleanType SolarizeImage(Image *image, image_view=AcquireAuthenticCacheView(image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,image,image->rows,1) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -4637,23 +4623,16 @@ MagickExport MagickBooleanType SolarizeImage(Image *image, register ssize_t i; - if (GetPixelMask(image,q) != 0) + if (GetPixelReadMask(image,q) == 0) { q+=GetPixelChannels(image); continue; } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - PixelChannel - channel; - - PixelTrait - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - if ((traits == UndefinedPixelTrait) || - ((traits & CopyPixelTrait) != 0)) + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); + if ((traits & UpdatePixelTrait) == 0) continue; if ((double) q[i] > threshold) q[i]=QuantumRange-q[i]; @@ -4846,10 +4825,7 @@ MagickExport Image *SteganoImage(const Image *image,const Image *watermark, stegano_view=DestroyCacheView(stegano_view); watermark_view=DestroyCacheView(watermark_view); if (status == MagickFalse) - { - stegano_image=DestroyImage(stegano_image); - return((Image *) NULL); - } + stegano_image=DestroyImage(stegano_image); return(stegano_image); } @@ -4992,10 +4968,7 @@ MagickExport Image *StereoAnaglyphImage(const Image *left_image, } } if (status == MagickFalse) - { - stereo_image=DestroyImage(stereo_image); - return((Image *) NULL); - } + stereo_image=DestroyImage(stereo_image); return(stereo_image); } @@ -5037,6 +5010,7 @@ MagickExport Image *SwirlImage(const Image *image,double degrees, CacheView *image_view, + *interpolate_view, *swirl_view; Image @@ -5076,7 +5050,7 @@ MagickExport Image *SwirlImage(const Image *image,double degrees, return((Image *) NULL); } if (swirl_image->background_color.alpha != OpaqueAlpha) - swirl_image->matte=MagickTrue; + swirl_image->alpha_trait=BlendPixelTrait; /* Compute scaling factor. */ @@ -5097,10 +5071,11 @@ MagickExport Image *SwirlImage(const Image *image,double degrees, status=MagickTrue; progress=0; image_view=AcquireVirtualCacheView(image,exception); + interpolate_view=AcquireVirtualCacheView(image,exception); swirl_view=AcquireAuthenticCacheView(swirl_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,swirl_image,image->rows,1) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -5121,7 +5096,7 @@ MagickExport Image *SwirlImage(const Image *image,double degrees, if (status == MagickFalse) continue; - p=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); q=QueueCacheViewAuthenticPixels(swirl_view,0,y,swirl_image->columns,1, exception); if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) @@ -5135,8 +5110,9 @@ MagickExport Image *SwirlImage(const Image *image,double degrees, /* Determine if the pixel is within an ellipse. */ - if (GetPixelMask(image,p) != 0) + if (GetPixelReadMask(image,p) == 0) { + SetPixelBackgoundColor(swirl_image,q); p+=GetPixelChannels(image); q+=GetPixelChannels(swirl_image); continue; @@ -5150,16 +5126,9 @@ MagickExport Image *SwirlImage(const Image *image,double degrees, for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - PixelChannel - channel; - - PixelTrait - swirl_traits, - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - swirl_traits=GetPixelChannelMapTraits(swirl_image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); + PixelTrait swirl_traits=GetPixelChannelTraits(swirl_image,channel); if ((traits == UndefinedPixelTrait) || (swirl_traits == UndefinedPixelTrait)) continue; @@ -5179,8 +5148,8 @@ MagickExport Image *SwirlImage(const Image *image,double degrees, factor=1.0-sqrt((double) distance)/radius; sine=sin((double) (degrees*factor*factor)); cosine=cos((double) (degrees*factor*factor)); - status=InterpolatePixelChannels(image,image_view,swirl_image,method, - ((cosine*delta.x-sine*delta.y)/scale.x+center.x),(double) + status=InterpolatePixelChannels(image,interpolate_view,swirl_image, + method,((cosine*delta.x-sine*delta.y)/scale.x+center.x),(double) ((sine*delta.x+cosine*delta.y)/scale.y+center.y),q,exception); } p+=GetPixelChannels(image); @@ -5202,6 +5171,7 @@ MagickExport Image *SwirlImage(const Image *image,double degrees, } } swirl_view=DestroyCacheView(swirl_view); + interpolate_view=DestroyCacheView(interpolate_view); image_view=DestroyCacheView(image_view); if (status == MagickFalse) swirl_image=DestroyImage(swirl_image); @@ -5248,6 +5218,9 @@ MagickExport Image *TintImage(const Image *image,const char *blend, *image_view, *tint_view; + double + intensity; + GeometryInfo geometry_info; @@ -5260,9 +5233,6 @@ MagickExport Image *TintImage(const Image *image,const char *blend, MagickOffsetType progress; - double - intensity; - PixelInfo color_vector; @@ -5291,7 +5261,7 @@ MagickExport Image *TintImage(const Image *image,const char *blend, } if ((IsGrayColorspace(image->colorspace) != MagickFalse) && (IsPixelInfoGray(tint) == MagickFalse)) - (void) SetImageColorspace(tint_image,RGBColorspace,exception); + (void) SetImageColorspace(tint_image,sRGBColorspace,exception); if (blend == (const char *) NULL) return(tint_image); /* @@ -5302,7 +5272,7 @@ MagickExport Image *TintImage(const Image *image,const char *blend, color_vector.red=geometry_info.rho; color_vector.green=geometry_info.rho; color_vector.blue=geometry_info.rho; - color_vector.alpha=OpaqueAlpha; + color_vector.alpha=(MagickRealType) OpaqueAlpha; if ((flags & SigmaValue) != 0) color_vector.green=geometry_info.sigma; if ((flags & XiValue) != 0) @@ -5318,16 +5288,11 @@ MagickExport Image *TintImage(const Image *image,const char *blend, color_vector.alpha=geometry_info.chi; } intensity=(double) GetPixelInfoIntensity(tint); - color_vector.red=(double) (color_vector.red*tint->red/100.0- - intensity); - color_vector.green=(double) (color_vector.green*tint->green/100.0- - intensity); - color_vector.blue=(double) (color_vector.blue*tint->blue/100.0- - intensity); - color_vector.black=(double) (color_vector.black*tint->black/100.0- - intensity); - color_vector.alpha=(double) (color_vector.alpha*tint->alpha/100.0- - intensity); + color_vector.red=(double) (color_vector.red*tint->red/100.0-intensity); + color_vector.green=(double) (color_vector.green*tint->green/100.0-intensity); + color_vector.blue=(double) (color_vector.blue*tint->blue/100.0-intensity); + color_vector.black=(double) (color_vector.black*tint->black/100.0-intensity); + color_vector.alpha=(double) (color_vector.alpha*tint->alpha/100.0-intensity); /* Tint image. */ @@ -5337,7 +5302,7 @@ MagickExport Image *TintImage(const Image *image,const char *blend, tint_view=AcquireAuthenticCacheView(tint_image,exception); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,tint_image,image->rows,1) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -5373,21 +5338,14 @@ MagickExport Image *TintImage(const Image *image,const char *blend, for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - PixelChannel - channel; - - PixelTrait - tint_traits, - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - tint_traits=GetPixelChannelMapTraits(tint_image,channel); + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); + PixelTrait tint_traits=GetPixelChannelTraits(tint_image,channel); if ((traits == UndefinedPixelTrait) || (tint_traits == UndefinedPixelTrait)) continue; if (((tint_traits & CopyPixelTrait) != 0) || - (GetPixelMask(image,p) != 0)) + (GetPixelReadMask(image,p) == 0)) { SetPixelChannel(tint_image,channel,p[i],q); continue; @@ -5493,7 +5451,7 @@ MagickExport Image *VignetteImage(const Image *image,const double radius, canvas_image=DestroyImage(canvas_image); return((Image *) NULL); } - canvas_image->matte=MagickTrue; + canvas_image->alpha_trait=BlendPixelTrait; oval_image=CloneImage(canvas_image,canvas_image->columns,canvas_image->rows, MagickTrue,exception); if (oval_image == (Image *) NULL) @@ -5522,7 +5480,7 @@ MagickExport Image *VignetteImage(const Image *image,const double radius, canvas_image=DestroyImage(canvas_image); return((Image *) NULL); } - blur_image->matte=MagickFalse; + blur_image->alpha_trait=UndefinedPixelTrait; (void) CompositeImage(canvas_image,blur_image,IntensityCompositeOp,MagickTrue, 0,0,exception); blur_image=DestroyImage(blur_image); @@ -5613,7 +5571,7 @@ MagickExport Image *WaveImage(const Image *image,const double amplitude, return((Image *) NULL); } if (wave_image->background_color.alpha != OpaqueAlpha) - wave_image->matte=MagickTrue; + wave_image->alpha_trait=BlendPixelTrait; /* Allocate sine map. */ @@ -5638,7 +5596,7 @@ MagickExport Image *WaveImage(const Image *image,const double amplitude, BackgroundVirtualPixelMethod); #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(static,4) shared(progress,status) \ - dynamic_number_threads(image,image->columns,image->rows,1) + magick_threads(image,wave_image,wave_image->rows,1) #endif for (y=0; y < (ssize_t) wave_image->rows; y++) {