]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Mon, 4 Apr 2011 14:46:39 +0000 (14:46 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Mon, 4 Apr 2011 14:46:39 +0000 (14:46 +0000)
magick/effect.c
magick/effect.h
magick/option.c

index 24893c78ead35a876cd3e75d273e5b55608be5fb..60d536eb8e343ef4de19ce91213993ba609b738c 100644 (file)
@@ -5121,6 +5121,13 @@ static inline void InsertPixelList(const Image *image,const PixelPacket *pixel,
     AddNodePixelList(pixel_list,4,index);
 }
 
+static inline MagickRealType MagickAbsoluteValue(const MagickRealType x)
+{
+  if (x < 0)
+    return(-x);
+  return(x);
+}
+
 static void ResetPixelList(PixelList *pixel_list)
 {
   int
@@ -5282,8 +5289,41 @@ MagickExport Image *StatisticImageChannel(const Image *image,
         r+=image->columns+StatisticWidth;
         s+=image->columns+StatisticWidth;
       }
+      GetMagickPixelPacket(image,&pixel);
+      SetMagickPixelPacket(image,p+StatisticWidth*StatisticHeight/2,indexes+
+        StatisticWidth*StatisticHeight/2+x,&pixel);
       switch (type)
       {
+        case BottomHatStatistic:
+        {
+          MagickPixelPacket
+            maximum;
+
+          maximum=GetMaximumPixelList(pixel_list[id]);
+          pixel.red=MagickAbsoluteValue(maximum.red-pixel.red);
+          pixel.green=MagickAbsoluteValue(maximum.green-pixel.green);
+          pixel.blue=MagickAbsoluteValue(maximum.blue-pixel.blue);
+          pixel.opacity=MagickAbsoluteValue(maximum.opacity-pixel.opacity);
+          if (image->colorspace == CMYKColorspace)
+            pixel.index=MagickAbsoluteValue(maximum.index-pixel.index);
+          break;
+        }
+        case GradientStatistic:
+        {
+          MagickPixelPacket
+            maximum,
+            minimum;
+
+          minimum=GetMinimumPixelList(pixel_list[id]);
+          maximum=GetMaximumPixelList(pixel_list[id]);
+          pixel.red=MagickAbsoluteValue(maximum.red-minimum.red);
+          pixel.green=MagickAbsoluteValue(maximum.green-minimum.green);
+          pixel.blue=MagickAbsoluteValue(maximum.blue-minimum.blue);
+          pixel.opacity=MagickAbsoluteValue(maximum.opacity-minimum.opacity);
+          if (image->colorspace == CMYKColorspace)
+            pixel.index=MagickAbsoluteValue(maximum.index-minimum.index);
+          break;
+        }
         case MaximumStatistic:
         {
           pixel=GetMaximumPixelList(pixel_list[id]);
@@ -5320,6 +5360,20 @@ MagickExport Image *StatisticImageChannel(const Image *image,
           pixel=GetStandardDeviationPixelList(pixel_list[id]);
           break;
         }
+        case TopHatStatistic:
+        {
+          MagickPixelPacket
+            minimum;
+
+          minimum=GetMinimumPixelList(pixel_list[id]);
+          pixel.red=MagickAbsoluteValue(pixel.red-minimum.red);
+          pixel.green=MagickAbsoluteValue(pixel.green-minimum.green);
+          pixel.blue=MagickAbsoluteValue(pixel.blue-minimum.blue);
+          pixel.opacity=MagickAbsoluteValue(pixel.opacity-minimum.opacity);
+          if (image->colorspace == CMYKColorspace)
+            pixel.index=MagickAbsoluteValue(pixel.index-minimum.index);
+          break;
+        }
       }
       if ((channel & RedChannel) != 0)
         q->red=ClampToQuantum(pixel.red);
index 1e6f2cb9978a98b50d80c184dc47747b3320db0c..2b9d87b96b89ec80964939bd2456649c0a6e8507 100644 (file)
@@ -61,13 +61,16 @@ typedef enum
 typedef enum
 {
   UndefinedStatistic,
+  BottomHatStatistic,
+  GradientStatistic,
   MaximumStatistic,
   MeanStatistic,
   MedianStatistic,
   MinimumStatistic,
   ModeStatistic,
   NonpeakStatistic,
-  StandardDeviationStatistic
+  StandardDeviationStatistic,
+  TopHatStatistic
 } StatisticType;
 
 extern MagickExport Image
index 2c88667b12b5cca691d01cd822c90d1fca593aa2..01f102483de8fd1995258c1d9e3007c92c039304 100644 (file)
@@ -1457,6 +1457,8 @@ static const OptionInfo
   StatisticOptions[] =
   {
     { "Undefined", (ssize_t) UndefinedStatistic, MagickTrue },
+    { "BottomHat", (ssize_t) BottomHatStatistic, MagickFalse },
+    { "Gradient", (ssize_t) GradientStatistic, MagickFalse },
     { "Maximum", (ssize_t) MaximumStatistic, MagickFalse },
     { "Mean", (ssize_t) MeanStatistic, MagickFalse },
     { "Median", (ssize_t) MedianStatistic, MagickFalse },
@@ -1464,6 +1466,7 @@ static const OptionInfo
     { "Mode", (ssize_t) ModeStatistic, MagickFalse },
     { "Nonpeak", (ssize_t) NonpeakStatistic, MagickFalse },
     { "StandardDeviation", (ssize_t) StandardDeviationStatistic, MagickFalse },
+    { "TopHat", (ssize_t) TopHatStatistic, MagickFalse },
     { (char *) NULL, (ssize_t) UndefinedMethod, MagickFalse }
   },
   StorageOptions[] =