From: cristy Date: Sat, 10 Sep 2011 20:01:36 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~7035 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1e7aa318dd8acbde7ead2fad88d9b388e52f88fb;p=imagemagick --- diff --git a/MagickCore/effect.c b/MagickCore/effect.c index aaa9325c2..c296561dd 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -2133,7 +2133,7 @@ MagickExport Image *MotionBlurImage(const Image *image,const double radius, kernel=(double *) RelinquishMagickMemory(kernel); ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); } - blur_image=CloneImage(image,0,0,MagickTrue,exception); + blur_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception); if (blur_image == (Image *) NULL) { kernel=(double *) RelinquishMagickMemory(kernel); @@ -2889,7 +2889,7 @@ MagickExport Image *RadialBlurImage(const Image *image, (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickSignature); - blur_image=CloneImage(image,0,0,MagickTrue,exception); + blur_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception); if (blur_image == (Image *) NULL) return((Image *) NULL); if (SetImageStorageClass(blur_image,DirectClass,exception) == MagickFalse) @@ -2928,8 +2928,11 @@ MagickExport Image *RadialBlurImage(const Image *image, #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp parallel for schedule(dynamic,4) shared(progress,status) #endif - for (y=0; y < (ssize_t) blur_image->rows; y++) + for (y=0; y < (ssize_t) image->rows; y++) { + register const Quantum + *restrict p; + register Quantum *restrict q; @@ -2938,25 +2941,19 @@ MagickExport Image *RadialBlurImage(const Image *image, if (status == MagickFalse) continue; + p=GetCacheViewVirtualPixels(blur_view,0,y,image->columns,1,exception); q=GetCacheViewAuthenticPixels(blur_view,0,y,blur_image->columns,1, exception); - if (q == (Quantum *) NULL) + if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) { status=MagickFalse; continue; } - for (x=0; x < (ssize_t) blur_image->columns; x++) + for (x=0; x < (ssize_t) image->columns; x++) { - PixelInfo - qixel; - MagickRealType - normalize, radius; - PixelPacket - pixel; - PointInfo center; @@ -2980,82 +2977,76 @@ MagickExport Image *RadialBlurImage(const Image *image, if (step >= n) step=n-1; } - normalize=0.0; - qixel.red=bias; - qixel.green=bias; - qixel.blue=bias; - qixel.black=bias; - qixel.alpha=bias; - if (((GetPixelAlphaTraits(image) & UpdatePixelTrait) == 0) || - (image->matte == MagickFalse)) - { - for (i=0; i < (ssize_t) n; i+=(ssize_t) step) + for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + { + MagickRealType + gamma, + pixel; + + PixelChannel + channel; + + PixelTrait + blur_traits, + traits; + + register const Quantum + *restrict r; + + register ssize_t + j; + + traits=GetPixelChannelMapTraits(image,(PixelChannel) i); + channel=GetPixelChannelMapChannel(image,(PixelChannel) i); + blur_traits=GetPixelChannelMapTraits(blur_image,channel); + if ((traits == UndefinedPixelTrait) || + (blur_traits == UndefinedPixelTrait)) + continue; + if ((blur_traits & CopyPixelTrait) != 0) { - (void) GetOneCacheViewVirtualPixel(image_view,(ssize_t) - (blur_center.x+center.x*cos_theta[i]-center.y*sin_theta[i]+0.5), - (ssize_t) (blur_center.y+center.x*sin_theta[i]+center.y* - cos_theta[i]+0.5),&pixel,exception); - qixel.red+=pixel.red; - qixel.green+=pixel.green; - qixel.blue+=pixel.blue; - if (image->colorspace == CMYKColorspace) - qixel.black+=pixel.black; - qixel.alpha+=pixel.alpha; - normalize+=1.0; + q[channel]=p[i]; + continue; } - normalize=1.0/(fabs((double) normalize) <= MagickEpsilon ? 1.0 : - normalize); - if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0) - SetPixelRed(blur_image,ClampToQuantum(normalize*qixel.red),q); - if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0) - SetPixelGreen(blur_image,ClampToQuantum(normalize*qixel.green),q); - if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0) - SetPixelBlue(blur_image,ClampToQuantum(normalize*qixel.blue),q); - if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) && - (image->colorspace == CMYKColorspace)) - SetPixelBlack(blur_image,ClampToQuantum(normalize*qixel.black),q); - if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) - SetPixelAlpha(blur_image,ClampToQuantum(normalize*qixel.alpha),q); - } - else - { - MagickRealType - alpha, - gamma; - - alpha=1.0; - gamma=0.0; - for (i=0; i < (ssize_t) n; i+=(ssize_t) step) + gamma=0.0; + pixel=bias; + if ((blur_traits & BlendPixelTrait) == 0) { - (void) GetOneCacheViewVirtualPixel(image_view,(ssize_t) - (blur_center.x+center.x*cos_theta[i]-center.y*sin_theta[i]+0.5), - (ssize_t) (blur_center.y+center.x*sin_theta[i]+center.y* - cos_theta[i]+0.5),&pixel,exception); - alpha=(MagickRealType) (QuantumScale*pixel.alpha); - qixel.red+=alpha*pixel.red; - qixel.green+=alpha*pixel.green; - qixel.blue+=alpha*pixel.blue; - qixel.alpha+=pixel.alpha; - if (image->colorspace == CMYKColorspace) - qixel.black+=alpha*pixel.black; - gamma+=alpha; - normalize+=1.0; + for (j=0; j < (ssize_t) n; j+=(ssize_t) step) + { + r=GetCacheViewVirtualPixels(image_view, (ssize_t) (blur_center.x+ + center.x*cos_theta[j]-center.y*sin_theta[j]+0.5),(ssize_t) + (blur_center.y+center.x*sin_theta[j]+center.y*cos_theta[j]+0.5), + 1,1,exception); + if (r == (const Quantum *) NULL) + { + status=MagickFalse; + continue; + } + pixel+=r[i]; + gamma++; + } + gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma); + q[channel]=ClampToQuantum(gamma*pixel); + continue; } - gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma); - normalize=1.0/(fabs((double) normalize) <= MagickEpsilon ? 1.0 : - normalize); - if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0) - SetPixelRed(blur_image,ClampToQuantum(gamma*qixel.red),q); - if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0) - SetPixelGreen(blur_image,ClampToQuantum(gamma*qixel.green),q); - if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0) - SetPixelBlue(blur_image,ClampToQuantum(gamma*qixel.blue),q); - if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) && - (image->colorspace == CMYKColorspace)) - SetPixelBlack(blur_image,ClampToQuantum(gamma*qixel.black),q); - if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) - SetPixelAlpha(blur_image,ClampToQuantum(normalize*qixel.alpha),q); + for (j=0; j < (ssize_t) n; j+=(ssize_t) step) + { + r=GetCacheViewVirtualPixels(image_view, (ssize_t) (blur_center.x+ + center.x*cos_theta[j]-center.y*sin_theta[j]+0.5),(ssize_t) + (blur_center.y+center.x*sin_theta[j]+center.y*cos_theta[j]+0.5), + 1,1,exception); + if (r == (const Quantum *) NULL) + { + status=MagickFalse; + continue; + } + pixel+=GetPixelAlpha(image,r)*r[i]; + gamma+=GetPixelAlpha(image,r); } + gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma); + q[channel]=ClampToQuantum(gamma*pixel); + } + p+=GetPixelChannels(image); q+=GetPixelChannels(blur_image); } if (SyncCacheViewAuthenticPixels(blur_view,exception) == MagickFalse) @@ -3100,7 +3091,8 @@ MagickExport Image *RadialBlurImage(const Image *image, % The format of the SelectiveBlurImage method is: % % Image *SelectiveBlurImage(const Image *image,const double radius, -% const double sigma,const double threshold,ExceptionInfo *exception) +% const double sigma,const double threshold,const double bias, +% ExceptionInfo *exception) % % A description of each parameter follows: % @@ -3114,12 +3106,14 @@ MagickExport Image *RadialBlurImage(const Image *image, % o threshold: only pixels within this contrast threshold are included % in the blur operation. % +% o bias: the bias. +% % o exception: return any errors or warnings in this structure. % */ MagickExport Image *SelectiveBlurImage(const Image *image, const double radius,const double sigma,const double threshold, - ExceptionInfo *exception) + const double bias,ExceptionInfo *exception) { #define SelectiveBlurImageTag "SelectiveBlur/Image" @@ -3139,13 +3133,11 @@ MagickExport Image *SelectiveBlurImage(const Image *image, MagickOffsetType progress; - PixelInfo - bias; - register ssize_t i; size_t + center, width; ssize_t @@ -3207,7 +3199,7 @@ MagickExport Image *SelectiveBlurImage(const Image *image, } message=DestroyString(message); } - blur_image=CloneImage(image,0,0,MagickTrue,exception); + blur_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception); if (blur_image == (Image *) NULL) return((Image *) NULL); if (SetImageStorageClass(blur_image,DirectClass,exception) == MagickFalse) @@ -3220,8 +3212,8 @@ MagickExport Image *SelectiveBlurImage(const Image *image, */ status=MagickTrue; progress=0; - GetPixelInfo(image,&bias); - SetPixelInfoBias(image,&bias); + center=(ssize_t) GetPixelChannels(image)*(image->columns+width)*(width/2L)+ + GetPixelChannels(image)*(width/2L); image_view=AcquireCacheView(image); blur_view=AcquireCacheView(blur_image); #if defined(MAGICKCORE_OPENMP_SUPPORT) @@ -3235,9 +3227,6 @@ MagickExport Image *SelectiveBlurImage(const Image *image, MagickBooleanType sync; - MagickRealType - gamma; - register const Quantum *restrict p; @@ -3260,166 +3249,103 @@ MagickExport Image *SelectiveBlurImage(const Image *image, } for (x=0; x < (ssize_t) image->columns; x++) { - PixelInfo - pixel; + register ssize_t + i; - register const double - *restrict k; + for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + { + MagickRealType + alpha, + gamma, + intensity, + pixel; - register ssize_t - u; + PixelChannel + channel; - ssize_t - j, - v; + PixelTrait + blur_traits, + traits; - pixel=bias; - k=kernel; - gamma=0.0; - j=0; - if (((GetPixelAlphaTraits(image) & UpdatePixelTrait) == 0) || - (image->matte == MagickFalse)) - { - for (v=0; v < (ssize_t) width; v++) + register const double + *restrict k; + + register const Quantum + *restrict pixels; + + register ssize_t + u; + + ssize_t + v; + + traits=GetPixelChannelMapTraits(image,(PixelChannel) i); + channel=GetPixelChannelMapChannel(image,(PixelChannel) i); + blur_traits=GetPixelChannelMapTraits(blur_image,channel); + if ((traits == UndefinedPixelTrait) || + (blur_traits == UndefinedPixelTrait)) + continue; + if ((blur_traits & CopyPixelTrait) != 0) { - for (u=0; u < (ssize_t) width; u++) - { - contrast=GetPixelIntensity(image,p+(u+j)*GetPixelChannels(image))- - (double) GetPixelIntensity(blur_image,q); - if (fabs(contrast) < threshold) - { - pixel.red+=(*k)*GetPixelRed(image,p+(u+j)* - GetPixelChannels(image)); - pixel.green+=(*k)*GetPixelGreen(image,p+(u+j)* - GetPixelChannels(image)); - pixel.blue+=(*k)*GetPixelBlue(image,p+(u+j)* - GetPixelChannels(image)); - if (image->colorspace == CMYKColorspace) - pixel.black+=(*k)*GetPixelBlack(image,p+(u+j)* - GetPixelChannels(image)); - gamma+=(*k); - k++; - } - } - j+=(ssize_t) (image->columns+width); + q[channel]=p[center+i]; + continue; } - if (gamma != 0.0) - { - gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma); - if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0) - SetPixelRed(blur_image,ClampToQuantum(gamma*pixel.red),q); - if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0) - SetPixelGreen(blur_image,ClampToQuantum(gamma*pixel.green),q); - if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0) - SetPixelBlue(blur_image,ClampToQuantum(gamma*pixel.blue),q); - if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) && - (image->colorspace == CMYKColorspace)) - SetPixelBlack(blur_image,ClampToQuantum(gamma*pixel.black),q); - } - if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) + k=kernel; + pixel=bias; + pixels=p; + intensity=GetPixelIntensity(image,p+center); + gamma=0.0; + if ((blur_traits & BlendPixelTrait) == 0) + { + for (v=0; v < (ssize_t) width; v++) { - gamma=0.0; - j=0; - for (v=0; v < (ssize_t) width; v++) + for (u=0; u < (ssize_t) width; u++) { - for (u=0; u < (ssize_t) width; u++) - { - contrast=GetPixelIntensity(image,p+(u+j)* - GetPixelChannels(image))-(double) - GetPixelIntensity(blur_image,q); - if (fabs(contrast) < threshold) - { - pixel.alpha+=(*k)* - GetPixelAlpha(image,p+(u+j)*GetPixelChannels(image)); - gamma+=(*k); - k++; - } - } - j+=(ssize_t) (image->columns+width); + contrast=GetPixelIntensity(image,pixels)-intensity; + if (fabs(contrast) < threshold) + { + pixel+=(*k)*pixels[i]; + gamma+=(*k); + } + k++; + pixels+=GetPixelChannels(image); } - if (gamma != 0.0) - { - gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : - gamma); - SetPixelAlpha(blur_image,ClampToQuantum(gamma*pixel.alpha),q); - } + pixels+=image->columns*GetPixelChannels(image); } - } - else + if (fabs((double) gamma) < MagickEpsilon) + { + q[channel]=p[center+i]; + continue; + } + gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma); + q[channel]=ClampToQuantum(gamma*pixel); + continue; + } + for (v=0; v < (ssize_t) width; v++) { - MagickRealType - alpha; - - for (v=0; v < (ssize_t) width; v++) + for (u=0; u < (ssize_t) width; u++) { - for (u=0; u < (ssize_t) width; u++) - { - contrast=GetPixelIntensity(image,p+(u+j)* - GetPixelChannels(image))-(double) - GetPixelIntensity(blur_image,q); - if (fabs(contrast) < threshold) - { - alpha=(MagickRealType) (QuantumScale* - GetPixelAlpha(image,p+(u+j)*GetPixelChannels(image))); - pixel.red+=(*k)*alpha* - GetPixelRed(image,p+(u+j)*GetPixelChannels(image)); - pixel.green+=(*k)*alpha*GetPixelGreen(image,p+(u+j)* - GetPixelChannels(image)); - pixel.blue+=(*k)*alpha*GetPixelBlue(image,p+(u+j)* - GetPixelChannels(image)); - pixel.alpha+=(*k)*GetPixelAlpha(image,p+(u+j)* - GetPixelChannels(image)); - if (image->colorspace == CMYKColorspace) - pixel.black+=(*k)*GetPixelBlack(image,p+(u+j)* - GetPixelChannels(image)); - gamma+=(*k)*alpha; - k++; - } - } - j+=(ssize_t) (image->columns+width); - } - if (gamma != 0.0) - { - gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma); - if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0) - SetPixelRed(blur_image,ClampToQuantum(gamma*pixel.red),q); - if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0) - SetPixelGreen(blur_image,ClampToQuantum(gamma*pixel.green),q); - if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0) - SetPixelBlue(blur_image,ClampToQuantum(gamma*pixel.blue),q); - if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) && - (image->colorspace == CMYKColorspace)) - SetPixelBlack(blur_image,ClampToQuantum(gamma*pixel.black),q); - } - if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) - { - gamma=0.0; - j=0; - for (v=0; v < (ssize_t) width; v++) + contrast=GetPixelIntensity(image,pixels)-intensity; + if (fabs(contrast) < threshold) { - for (u=0; u < (ssize_t) width; u++) - { - contrast=GetPixelIntensity(image,p+(u+j)* - GetPixelChannels(image))-(double) - GetPixelIntensity(blur_image,q); - if (fabs(contrast) < threshold) - { - pixel.alpha+=(*k)* - GetPixelAlpha(image,p+(u+j)*GetPixelChannels(image)); - gamma+=(*k); - k++; - } - } - j+=(ssize_t) (image->columns+width); + alpha=(MagickRealType) (QuantumScale* + GetPixelAlpha(image,pixels)); + pixel+=(*k)*alpha*pixels[i]; + gamma+=(*k)*alpha; } - if (gamma != 0.0) - { - gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : - gamma); - SetPixelAlpha(blur_image,ClampToQuantum(pixel.alpha),q); - } - } + k++; + pixels+=GetPixelChannels(image); + } + pixels+=image->columns*GetPixelChannels(image); } + if (fabs((double) gamma) < MagickEpsilon) + { + q[channel]=p[center+i]; + continue; + } + gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma); + q[channel]=ClampToQuantum(gamma*pixel); + } p+=GetPixelChannels(image); q+=GetPixelChannels(blur_image); } @@ -3551,10 +3477,10 @@ MagickExport Image *ShadeImage(const Image *image,const MagickBooleanType gray, normal; register const Quantum + *restrict center, *restrict p, - *restrict s0, - *restrict s1, - *restrict s2; + *restrict post, + *restrict pre; register Quantum *restrict q; @@ -3576,26 +3502,28 @@ MagickExport Image *ShadeImage(const Image *image,const MagickBooleanType gray, Shade this row of pixels. */ normal.z=2.0*(double) QuantumRange; /* constant Z of surface normal */ - s0=p+GetPixelChannels(image); - s1=s0+(image->columns+2)*GetPixelChannels(image); - s2=s1+(image->columns+2)*GetPixelChannels(image); + pre=p+GetPixelChannels(image); + center=pre+(image->columns+2)*GetPixelChannels(image); + post=center+(image->columns+2)*GetPixelChannels(image); for (x=0; x < (ssize_t) image->columns; x++) { + register ssize_t + i; + /* Determine the surface normal and compute shading. */ - normal.x=(double) (GetPixelIntensity(image,s0-GetPixelChannels(image))+ - GetPixelIntensity(image,s1-GetPixelChannels(image))+ - GetPixelIntensity(image,s2-GetPixelChannels(image))- - GetPixelIntensity(image,s0+GetPixelChannels(image))- - GetPixelIntensity(image,s1+GetPixelChannels(image))- - GetPixelIntensity(image,s2+GetPixelChannels(image))); - normal.y=(double) (GetPixelIntensity(image,s2-GetPixelChannels(image))+ - GetPixelIntensity(image,s2)+ - GetPixelIntensity(image,s2+GetPixelChannels(image))- - GetPixelIntensity(image,s0-GetPixelChannels(image))- - GetPixelIntensity(image,s0)- - GetPixelIntensity(image,s0+GetPixelChannels(image))); + normal.x=(double) (GetPixelIntensity(image,pre-GetPixelChannels(image))+ + GetPixelIntensity(image,center-GetPixelChannels(image))+ + GetPixelIntensity(image,post-GetPixelChannels(image))- + GetPixelIntensity(image,pre+GetPixelChannels(image))- + GetPixelIntensity(image,center+GetPixelChannels(image))- + GetPixelIntensity(image,post+GetPixelChannels(image))); + normal.y=(double) (GetPixelIntensity(image,post-GetPixelChannels(image))+ + GetPixelIntensity(image,post)+GetPixelIntensity(image,post+ + GetPixelChannels(image))-GetPixelIntensity(image,pre- + GetPixelChannels(image))-GetPixelIntensity(image,pre)- + GetPixelIntensity(image,pre+GetPixelChannels(image))); if ((normal.x == 0.0) && (normal.y == 0.0)) shade=light.z; else @@ -3610,25 +3538,36 @@ MagickExport Image *ShadeImage(const Image *image,const MagickBooleanType gray, shade=distance/sqrt((double) normal_distance); } } - if (gray != MagickFalse) - { - SetPixelRed(shade_image,ClampToQuantum(shade),q); - SetPixelGreen(shade_image,ClampToQuantum(shade),q); - SetPixelBlue(shade_image,ClampToQuantum(shade),q); - } - else - { - SetPixelRed(shade_image,ClampToQuantum(QuantumScale*shade* - GetPixelRed(image,s1)),q); - SetPixelGreen(shade_image,ClampToQuantum(QuantumScale*shade* - GetPixelGreen(image,s1)),q); - SetPixelBlue(shade_image,ClampToQuantum(QuantumScale*shade* - GetPixelBlue(image,s1)),q); - } - SetPixelAlpha(shade_image,GetPixelAlpha(image,s1),q); - s0+=GetPixelChannels(image); - s1+=GetPixelChannels(image); - s2+=GetPixelChannels(image); + for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + { + PixelChannel + channel; + + PixelTrait + shade_traits, + traits; + + traits=GetPixelChannelMapTraits(image,(PixelChannel) i); + channel=GetPixelChannelMapChannel(image,(PixelChannel) i); + shade_traits=GetPixelChannelMapTraits(shade_image,channel); + if ((traits == UndefinedPixelTrait) || + (shade_traits == UndefinedPixelTrait)) + continue; + if ((shade_traits & CopyPixelTrait) != 0) + { + q[channel]=center[i]; + continue; + } + if (gray != MagickFalse) + { + q[channel]=ClampToQuantum(shade); + continue; + } + q[channel]=ClampToQuantum(QuantumScale*shade*center[i]); + } + pre+=GetPixelChannels(image); + center+=GetPixelChannels(image); + post+=GetPixelChannels(image); q+=GetPixelChannels(shade_image); } if (SyncCacheViewAuthenticPixels(shade_view,exception) == MagickFalse) diff --git a/MagickCore/effect.h b/MagickCore/effect.h index ac462de56..6aa968f55 100644 --- a/MagickCore/effect.h +++ b/MagickCore/effect.h @@ -89,7 +89,7 @@ extern MagickExport Image *PreviewImage(const Image *,const PreviewType,ExceptionInfo *), *RadialBlurImage(const Image *,const double,const double,ExceptionInfo *), *SelectiveBlurImage(const Image *,const double,const double,const double, - ExceptionInfo *), + const double,ExceptionInfo *), *ShadeImage(const Image *,const MagickBooleanType,const double,const double, ExceptionInfo *), *SharpenImage(const Image *,const double,const double,const double, diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c index dcfbbfe98..e94f54719 100644 --- a/MagickWand/magick-image.c +++ b/MagickWand/magick-image.c @@ -8318,7 +8318,8 @@ MagickExport MagickBooleanType MagickSegmentImage(MagickWand *wand, % The format of the MagickSelectiveBlurImage method is: % % MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand, -% const double radius,const double sigma,const double threshold) +% const double radius,const double sigma,const double threshold, +% const double bias) % % A description of each parameter follows: % @@ -8332,9 +8333,12 @@ MagickExport MagickBooleanType MagickSegmentImage(MagickWand *wand, % o threshold: only pixels within this contrast threshold are included % in the blur operation. % +% o bias: the bias. +% */ WandExport MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand, - const double radius,const double sigma,const double threshold) + const double radius,const double sigma,const double threshold, + const double bias) { Image *blur_image; @@ -8345,7 +8349,7 @@ WandExport MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand, (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); if (wand->images == (Image *) NULL) ThrowWandException(WandError,"ContainsNoImages",wand->name); - blur_image=SelectiveBlurImage(wand->images,radius,sigma,threshold, + blur_image=SelectiveBlurImage(wand->images,radius,sigma,threshold,bias, wand->exception); if (blur_image == (Image *) NULL) return(MagickFalse); diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h index 23c3e7b9d..50b820a01 100644 --- a/MagickWand/magick-image.h +++ b/MagickWand/magick-image.h @@ -224,7 +224,8 @@ extern WandExport MagickBooleanType MagickScaleImage(MagickWand *,const size_t,const size_t), MagickSegmentImage(MagickWand *,const ColorspaceType,const MagickBooleanType, const double,const double), - MagickSelectiveBlurImage(MagickWand *,const double,const double,const double), + MagickSelectiveBlurImage(MagickWand *,const double,const double,const double, + const double), MagickSeparateImage(MagickWand *), MagickSepiaToneImage(MagickWand *,const double), MagickSetImage(MagickWand *,const MagickWand *), diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c index bfcee2706..6b9eef875 100644 --- a/MagickWand/mogrify.c +++ b/MagickWand/mogrify.c @@ -2560,7 +2560,7 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, if ((flags & PercentValue) != 0) geometry_info.xi=(double) QuantumRange*geometry_info.xi/100.0; mogrify_image=SelectiveBlurImage(*image,geometry_info.rho, - geometry_info.sigma,geometry_info.xi,exception); + geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception); break; } if (LocaleCompare("separate",option+1) == 0) diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs index 929f5e892..3c823c89c 100644 --- a/PerlMagick/Magick.xs +++ b/PerlMagick/Magick.xs @@ -511,7 +511,8 @@ static struct {"virtual-pixel", MagickVirtualPixelOptions} } }, { "SelectiveBlur", { {"geometry", StringReference}, {"radius", RealReference}, {"sigma", RealReference}, - {"threshold", RealReference}, {"channel", MagickChannelOptions} } }, + {"threshold", RealReference}, {"bias", RealReference}, + {"channel", MagickChannelOptions} } }, { "HaldClut", { {"image", ImageReference}, {"channel", MagickChannelOptions} } }, { "BlueShift", { {"factor", StringReference} } }, @@ -10437,10 +10438,12 @@ Mogrify(ref,...) if (attribute_flag[3] != 0) geometry_info.xi=argument_list[3].integer_reference;; if (attribute_flag[4] != 0) - channel=(ChannelType) argument_list[4].integer_reference; + geometry_info.psi=argument_list[4].integer_reference;; + if (attribute_flag[5] != 0) + channel=(ChannelType) argument_list[5].integer_reference; channel_mask=SetPixelChannelMask(image,channel); image=SelectiveBlurImage(image,geometry_info.rho,geometry_info.sigma, - geometry_info.xi,exception); + geometry_info.xi,geometry_info.psi,exception); if (image != (Image *) NULL) (void) SetPixelChannelMask(image,channel_mask); break;