From: cristy Date: Sun, 28 Apr 2013 02:38:26 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~3794 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9ab5d040c4c60a85bca1767c8148ae2e328386ca;p=imagemagick --- diff --git a/MagickCore/effect.c b/MagickCore/effect.c index 6ec08f340..fc7e0aefb 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -1206,14 +1206,17 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) MagickExport Image *EdgeImage(const Image *image,const double radius, ExceptionInfo *exception) { - char - geometry[MaxTextExtent]; + Image + *edge_image; KernelInfo *kernel_info; - Image - *edge_image; + register ssize_t + i; + + size_t + width; assert(image != (const Image *) NULL); assert(image->signature == MagickSignature); @@ -1221,11 +1224,28 @@ MagickExport Image *EdgeImage(const Image *image,const double radius, (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickSignature); - (void) FormatLocaleString(geometry,MaxTextExtent,"square:%.20g",radius); - kernel_info=AcquireKernelInfo(geometry); + width=GetOptimalKernelWidth1D(radius,0.5); + kernel_info=AcquireKernelInfo((const char *) NULL); if (kernel_info == (KernelInfo *) NULL) ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); - edge_image=MorphologyApply(image,EdgeInMorphology,1,kernel_info, + (void) ResetMagickMemory(kernel_info,0,sizeof(*kernel_info)); + kernel_info->width=width; + kernel_info->height=width; + kernel_info->x=(ssize_t) (kernel_info->width-1)/2; + kernel_info->y=(ssize_t) (kernel_info->height-1)/2; + kernel_info->signature=MagickSignature; + kernel_info->values=(MagickRealType *) MagickAssumeAligned( + AcquireAlignedMemory(kernel_info->width,kernel_info->height* + sizeof(*kernel_info->values))); + if (kernel_info->values == (MagickRealType *) NULL) + { + kernel_info=DestroyKernelInfo(kernel_info); + ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); + } + for (i=0; i < (ssize_t) (kernel_info->width*kernel_info->height); i++) + kernel_info->values[i]=(-1.0); + kernel_info->values[i/2]=(double) kernel_info->width*kernel_info->height-1.0; + edge_image=MorphologyApply(image,ConvolveMorphology,1,kernel_info, UndefinedCompositeOp,0.0,exception); kernel_info=DestroyKernelInfo(kernel_info); return(edge_image); diff --git a/MagickCore/morphology.c b/MagickCore/morphology.c index 001dd25ed..9ea4ff47d 100644 --- a/MagickCore/morphology.c +++ b/MagickCore/morphology.c @@ -2630,7 +2630,7 @@ static ssize_t MorphologyPrimitive(const Image *image,Image *morphology_image, vertical kernels (such as a 'BlurKernel') */ #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(progress,status) \ + #pragma omp parallel for schedule(static,4) shared(changed,progress,status) \ magick_threads(image,morphology_image,image->columns,1) #endif for (x=0; x < (ssize_t) image->columns; x++) @@ -2741,6 +2741,7 @@ static ssize_t MorphologyPrimitive(const Image *image,Image *morphology_image, pixels+=GetPixelChannels(image); } } + #pragma omp critical (MagickCore_MorphologyImage) if (fabs(pixel-p[center+i]) > MagickEpsilon) changed++; SetPixelChannel(morphology_image,channel,ClampToQuantum(pixel),q); @@ -2773,7 +2774,7 @@ static ssize_t MorphologyPrimitive(const Image *image,Image *morphology_image, Normal handling of horizontal or rectangular kernels (row by row). */ #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(progress,status) \ + #pragma omp parallel for schedule(static,4) shared(changed,progress,status) \ magick_threads(image,morphology_image,image->rows,1) #endif for (y=0; y < (ssize_t) image->rows; y++) @@ -3135,6 +3136,7 @@ static ssize_t MorphologyPrimitive(const Image *image,Image *morphology_image, default: break; } + #pragma omp critical (MagickCore_MorphologyImage) if (fabs(pixel-p[center+i]) > MagickEpsilon) changed++; SetPixelChannel(morphology_image,channel,ClampToQuantum(pixel),q);