]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Sun, 28 Apr 2013 02:38:26 +0000 (02:38 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Sun, 28 Apr 2013 02:38:26 +0000 (02:38 +0000)
MagickCore/effect.c
MagickCore/morphology.c

index 6ec08f340b9ee2ef6eec6ecbea511ef5a3b56006..fc7e0aefb602697873bc81eb58d63a7dc1052dcc 100644 (file)
@@ -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);
index 001dd25edcffc45a2a0e67cafea91ed5b8c6ae61..9ea4ff47d1404f370aec71e9706044423424d07f 100644 (file)
@@ -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);