From: cristy Date: Sun, 15 Jan 2012 02:45:06 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~6378 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fc830f498117dcdaf6a39afc7cc60d350dacf24c;p=imagemagick --- diff --git a/MagickCore/effect.c b/MagickCore/effect.c index 1cd1db4c2..41a30935c 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -1577,15 +1577,14 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) MagickBooleanType status; - Quantum - *restrict buffers, - *restrict pixels; - - register ssize_t - i; + MagickOffsetType + progress; size_t - length; + extent; + + ssize_t + y; static const ssize_t X[4] = {0, 1, 1,-1}, @@ -1600,7 +1599,8 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickSignature); - despeckle_image=CloneImage(image,0,0,MagickTrue,exception); + despeckle_image=CloneImage(image,image->columns,image->rows,MagickTrue, + exception); if (despeckle_image == (Image *) NULL) return((Image *) NULL); status=SetImageStorageClass(despeckle_image,DirectClass,exception); @@ -1609,131 +1609,116 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) despeckle_image=DestroyImage(despeckle_image); return((Image *) NULL); } - /* - Allocate image buffers. - */ - length=(size_t) ((image->columns+2)*(image->rows+2)); - pixels=(Quantum *) AcquireQuantumMemory(length,2*sizeof(*pixels)); - buffers=(Quantum *) AcquireQuantumMemory(length,2*sizeof(*pixels)); - if ((pixels == (Quantum *) NULL) || (buffers == (Quantum *) NULL)) - { - if (buffers != (Quantum *) NULL) - buffers=(Quantum *) RelinquishMagickMemory(buffers); - if (pixels != (Quantum *) NULL) - pixels=(Quantum *) RelinquishMagickMemory(pixels); - despeckle_image=DestroyImage(despeckle_image); - ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); - } /* Reduce speckle in the image. */ status=MagickTrue; + progress=0; + extent=3*(image->columns+2); image_view=AcquireCacheView(image); despeckle_view=AcquireCacheView(despeckle_image); - for (i=0; i < (ssize_t) GetPixelChannels(image); i++) +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp parallel for schedule(static,4) shared(status) +#endif + for (y=0; y < (ssize_t) image->rows; y++) { - PixelChannel - channel; + Quantum + *restrict buffers, + *restrict pixels; - PixelTrait - despeckle_traits, - traits; + register const Quantum + *restrict p; register Quantum - *buffer, - *pixel; + *restrict q; register ssize_t - k, - x; + i; - ssize_t - j, - y; - - if (status == MagickFalse) - continue; - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - despeckle_traits=GetPixelChannelMapTraits(despeckle_image,channel); - if ((traits == UndefinedPixelTrait) || - (despeckle_traits == UndefinedPixelTrait)) - continue; - if ((despeckle_traits & CopyPixelTrait) != 0) - continue; - pixel=pixels; - (void) ResetMagickMemory(pixel,0,length*sizeof(*pixel)); - buffer=buffers; - j=(ssize_t) image->columns+2; - for (y=0; y < (ssize_t) image->rows; y++) - { - register const Quantum - *restrict p; - - p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); - if (p == (const Quantum *) NULL) - { - status=MagickFalse; - continue; - } - j++; - for (x=0; x < (ssize_t) image->columns; x++) + p=GetCacheViewVirtualPixels(image_view,-1,y-1,image->columns+2,3,exception); + q=GetCacheViewAuthenticPixels(despeckle_view,0,y,despeckle_image->columns,1, + exception); + if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) { - pixel[j++]=p[i]; - p+=GetPixelChannels(image); + status=MagickFalse; + continue; } - j++; - } - (void) ResetMagickMemory(buffer,0,length*sizeof(*buffer)); - for (k=0; k < 4; k++) - { - Hull(X[k],Y[k],image->columns,image->rows,1,pixel,buffer); - Hull(-X[k],-Y[k],image->columns,image->rows,1,pixel,buffer); - Hull(-X[k],-Y[k],image->columns,image->rows,-1,pixel,buffer); - Hull(X[k],Y[k],image->columns,image->rows,-1,pixel,buffer); - } - j=(ssize_t) image->columns+2; - for (y=0; y < (ssize_t) image->rows; y++) + pixels=(Quantum *) AcquireQuantumMemory(extent,sizeof(*pixels)); + buffers=(Quantum *) AcquireQuantumMemory(extent,sizeof(*buffers)); + if ((pixels == (Quantum *) NULL) || (buffers == (Quantum *) NULL)) + { + if (buffers != (Quantum *) NULL) + buffers=(Quantum *) RelinquishMagickMemory(buffers); + if (pixels != (Quantum *) NULL) + pixels=(Quantum *) RelinquishMagickMemory(pixels); + (void) ThrowMagickException(exception,GetMagickModule(), + ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); + continue; + } + for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { - MagickBooleanType - sync; + PixelChannel + channel; - register Quantum - *restrict q; + PixelTrait + despeckle_traits, + traits; - q=GetCacheViewAuthenticPixels(despeckle_view,0,y,despeckle_image->columns, - 1,exception); - if (q == (Quantum *) NULL) + register ssize_t + j, + x; + + if (status == MagickFalse) + continue; + channel=GetPixelChannelMapChannel(image,i); + traits=GetPixelChannelMapTraits(image,channel); + despeckle_traits=GetPixelChannelMapTraits(despeckle_image,channel); + if ((traits == UndefinedPixelTrait) || + (despeckle_traits == UndefinedPixelTrait)) + continue; + for (x=0; x < (ssize_t) (3*(image->columns+2)); x++) + pixels[x]=p[x*GetPixelChannels(image)+i]; + if ((despeckle_traits & CopyPixelTrait) != 0) { - status=MagickFalse; + /* + Do not despeckle this channel, just copy. + */ + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelChannel(despeckle_image,channel,pixels[x+image->columns+3], + q+x*GetPixelChannels(despeckle_image)); continue; } - j++; - for (x=0; x < (ssize_t) image->columns; x++) + (void) ResetMagickMemory(buffers,0,extent*sizeof(*buffers)); + for (j=0; j < 4; j++) { - SetPixelChannel(despeckle_image,channel,pixel[j++],q); - q+=GetPixelChannels(despeckle_image); + Hull(X[j],Y[j],image->columns,1,1,pixels,buffers); + Hull(-X[j],-Y[j],image->columns,1,1,pixels,buffers); + Hull(-X[j],-Y[j],image->columns,1,-1,pixels,buffers); + Hull(X[j],Y[j],image->columns,1,-1,pixels,buffers); } - sync=SyncCacheViewAuthenticPixels(despeckle_view,exception); - if (sync == MagickFalse) - status=MagickFalse; - j++; + for (x=0; x < (ssize_t) image->columns; x++) + SetPixelChannel(despeckle_image,channel,pixels[x+image->columns+3],q+x* + GetPixelChannels(despeckle_image)); } + if (SyncCacheViewAuthenticPixels(despeckle_view,exception) == MagickFalse) + status=MagickFalse; if (image->progress_monitor != (MagickProgressMonitor) NULL) { MagickBooleanType proceed; - proceed=SetImageProgress(image,DespeckleImageTag,(MagickOffsetType) i, - GetPixelChannels(image)); +#if defined(MAGICKCORE_OPENMP_SUPPORT) + #pragma omp critical (MagickCore_DespeckleImage) +#endif + proceed=SetImageProgress(image,DespeckleImageTag,progress,image->rows); if (proceed == MagickFalse) status=MagickFalse; } + buffers=(Quantum *) RelinquishMagickMemory(buffers); + pixels=(Quantum *) RelinquishMagickMemory(pixels); } despeckle_view=DestroyCacheView(despeckle_view); image_view=DestroyCacheView(image_view); - buffers=(Quantum *) RelinquishMagickMemory(buffers); - pixels=(Quantum *) RelinquishMagickMemory(pixels); despeckle_image->type=image->type; if (status == MagickFalse) despeckle_image=DestroyImage(despeckle_image);