]> granicus.if.org Git - imagemagick/blobdiff - filters/analyze.c
...
[imagemagick] / filters / analyze.c
index cc3b882322b3901ac727f648c734fe47de71f376..6894212620b8fb39358a7554641f1b988dd74a71 100644 (file)
 %                              December 1998                                  %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2018 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  %
 %  obtain a copy of the License at                                            %
 %                                                                             %
-%    http://www.imagemagick.org/script/license.php                            %
+%    https://imagemagick.org/script/license.php                               %
 %                                                                             %
 %  Unless required by applicable law or agreed to in writing, software        %
 %  distributed under the License is distributed on an "AS IS" BASIS,          %
@@ -42,7 +42,7 @@
 #include <time.h>
 #include <assert.h>
 #include <math.h>
-#include "magick/MagickCore.h"
+#include "MagickCore/MagickCore.h"
 \f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -81,7 +81,7 @@ ModuleExport size_t analyzeImage(Image **images,const int argc,
   const char **argv,ExceptionInfo *exception)
 {
   char
-    text[MaxTextExtent];
+    text[MagickPathExtent];
 
   double
     area,
@@ -110,7 +110,7 @@ ModuleExport size_t analyzeImage(Image **images,const int argc,
 
   assert(images != (Image **) NULL);
   assert(*images != (Image *) NULL);
-  assert((*images)->signature == MagickSignature);
+  assert((*images)->signature == MagickCoreSignature);
   (void) argc;
   (void) argv;
   image=(*images);
@@ -143,13 +143,14 @@ ModuleExport size_t analyzeImage(Image **images,const int argc,
     saturation_skewness=0.0;
     area=0.0;
     status=MagickTrue;
-    image_view=AcquireCacheView(image);
+    image_view=AcquireVirtualCacheView(image,exception);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
-    #pragma omp parallel for schedule(dynamic,4) shared(status)
+    #pragma omp parallel for schedule(static) shared(status) \
+      magick_number_threads(image,image,image->rows,1)
 #endif
     for (y=0; y < (ssize_t) image->rows; y++)
     {
-      register const PixelPacket
+      register const Quantum
         *p;
 
       register ssize_t
@@ -158,14 +159,15 @@ ModuleExport size_t analyzeImage(Image **images,const int argc,
       if (status == MagickFalse)
         continue;
       p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
-      if (p == (const PixelPacket *) NULL)
+      if (p == (const Quantum *) NULL)
         {
           status=MagickFalse;
           continue;
         }
       for (x=0; x < (ssize_t) image->columns; x++)
       {
-        ConvertRGBToHSB(p->red,p->green,p->blue,&hue,&saturation,&brightness);
+        ConvertRGBToHSL(GetPixelRed(image,p),GetPixelGreen(image,p),
+          GetPixelBlue(image,p),&hue,&saturation,&brightness);
         brightness*=QuantumRange;
         brightness_sum_x+=brightness;
         brightness_sum_x2+=brightness*brightness;
@@ -177,60 +179,68 @@ ModuleExport size_t analyzeImage(Image **images,const int argc,
         saturation_sum_x3+=saturation*saturation*saturation;
         saturation_sum_x4+=saturation*saturation*saturation*saturation;
         area++;
-        p++;
+        p+=GetPixelChannels(image);
       }
     }
     image_view=DestroyCacheView(image_view);
     if (area <= 0.0)
       break;
     brightness_mean=brightness_sum_x/area;
-    (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_mean);
-    (void) SetImageProperty(image,"filter:brightness:mean",text);
+    (void) FormatLocaleString(text,MagickPathExtent,"%g",brightness_mean);
+    (void) SetImageProperty(image,"filter:brightness:mean",text,
+      exception);
     brightness_standard_deviation=sqrt(brightness_sum_x2/area-(brightness_sum_x/
       area*brightness_sum_x/area));
-    (void) FormatMagickString(text,MaxTextExtent,"%g",
+    (void) FormatLocaleString(text,MagickPathExtent,"%g",
       brightness_standard_deviation);
-    (void) SetImageProperty(image,"filter:brightness:standard-deviation",text);
-    if (brightness_standard_deviation != 0)
+    (void) SetImageProperty(image,"filter:brightness:standard-deviation",text,
+      exception);
+    if (fabs(brightness_standard_deviation) >= MagickEpsilon)
       brightness_kurtosis=(brightness_sum_x4/area-4.0*brightness_mean*
         brightness_sum_x3/area+6.0*brightness_mean*brightness_mean*
         brightness_sum_x2/area-3.0*brightness_mean*brightness_mean*
         brightness_mean*brightness_mean)/(brightness_standard_deviation*
         brightness_standard_deviation*brightness_standard_deviation*
         brightness_standard_deviation)-3.0;
-    (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_kurtosis);
-    (void) SetImageProperty(image,"filter:brightness:kurtosis",text);
+    (void) FormatLocaleString(text,MagickPathExtent,"%g",brightness_kurtosis);
+    (void) SetImageProperty(image,"filter:brightness:kurtosis",text,
+      exception);
     if (brightness_standard_deviation != 0)
       brightness_skewness=(brightness_sum_x3/area-3.0*brightness_mean*
         brightness_sum_x2/area+2.0*brightness_mean*brightness_mean*
         brightness_mean)/(brightness_standard_deviation*
         brightness_standard_deviation*brightness_standard_deviation);
-    (void) FormatMagickString(text,MaxTextExtent,"%g",brightness_skewness);
-    (void) SetImageProperty(image,"filter:brightness:skewness",text);
+    (void) FormatLocaleString(text,MagickPathExtent,"%g",brightness_skewness);
+    (void) SetImageProperty(image,"filter:brightness:skewness",text,
+      exception);
     saturation_mean=saturation_sum_x/area;
-    (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_mean);
-    (void) SetImageProperty(image,"filter:saturation:mean",text);
+    (void) FormatLocaleString(text,MagickPathExtent,"%g",saturation_mean);
+    (void) SetImageProperty(image,"filter:saturation:mean",text,
+      exception);
     saturation_standard_deviation=sqrt(saturation_sum_x2/area-(saturation_sum_x/
       area*saturation_sum_x/area));
-    (void) FormatMagickString(text,MaxTextExtent,"%g",
+    (void) FormatLocaleString(text,MagickPathExtent,"%g",
       saturation_standard_deviation);
-    (void) SetImageProperty(image,"filter:saturation:standard-deviation",text);
-    if (saturation_standard_deviation != 0)
+    (void) SetImageProperty(image,"filter:saturation:standard-deviation",text,
+      exception);
+    if (fabs(saturation_standard_deviation) >= MagickEpsilon)
       saturation_kurtosis=(saturation_sum_x4/area-4.0*saturation_mean*
         saturation_sum_x3/area+6.0*saturation_mean*saturation_mean*
         saturation_sum_x2/area-3.0*saturation_mean*saturation_mean*
         saturation_mean*saturation_mean)/(saturation_standard_deviation*
         saturation_standard_deviation*saturation_standard_deviation*
         saturation_standard_deviation)-3.0;
-    (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_kurtosis);
-    (void) SetImageProperty(image,"filter:saturation:kurtosis",text);
-    if (saturation_standard_deviation != 0)
+    (void) FormatLocaleString(text,MagickPathExtent,"%g",saturation_kurtosis);
+    (void) SetImageProperty(image,"filter:saturation:kurtosis",text,
+      exception);
+    if (fabs(saturation_standard_deviation) >= MagickEpsilon)
       saturation_skewness=(saturation_sum_x3/area-3.0*saturation_mean*
         saturation_sum_x2/area+2.0*saturation_mean*saturation_mean*
         saturation_mean)/(saturation_standard_deviation*
         saturation_standard_deviation*saturation_standard_deviation);
-    (void) FormatMagickString(text,MaxTextExtent,"%g",saturation_skewness);
-    (void) SetImageProperty(image,"filter:saturation:skewness",text);
+    (void) FormatLocaleString(text,MagickPathExtent,"%g",saturation_skewness);
+    (void) SetImageProperty(image,"filter:saturation:skewness",text,
+      exception);
   }
   return(MagickImageFilterSignature);
 }