]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Mon, 22 Aug 2011 01:20:01 +0000 (01:20 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Mon, 22 Aug 2011 01:20:01 +0000 (01:20 +0000)
Magick++/lib/Image.cpp
MagickCore/display.c
MagickCore/effect.c
MagickCore/enhance.c
MagickCore/enhance.h
MagickWand/magick-image.c
MagickWand/mogrify.c
PerlMagick/Magick.xs
coders/msl.c

index 82ab3d5181b249c4e2dc2f013929c955801a3b9e..96fea80c8354a100ddcf46b3724f9697095910a7 100644 (file)
@@ -883,9 +883,11 @@ void Magick::Image::enhance ( void )
 // Equalize image (histogram equalization)
 void Magick::Image::equalize ( void )
 {
+  ExceptionInfo exceptionInfo;
+  GetExceptionInfo( &exceptionInfo );
   modifyImage();
-  EqualizeImage( image() );
-  throwImageException();
+  EqualizeImage( image(), &exceptionInfo );
+  throwException( exceptionInfo );
 }
 
 // Erase image to current "background color"
index 77da91668be14009a63c8f379c0af7d0e923c9f6..27a5e1e4897e9c540eb69be1d15d049c55a77542 100644 (file)
@@ -7906,7 +7906,7 @@ static Image *XMagickCommand(Display *display,XResourceInfo *resource_info,
       */
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
-      (void) EqualizeImage(*image);
+      (void) EqualizeImage(*image,&(*image)->exception);
       XSetCursorState(display,windows,MagickFalse);
       if (windows->image.orphan != MagickFalse)
         break;
index a1ef4e4d1aa39c20ff90c62e59420df1c323ed54..bfbfa0c477918daa3a3855e40346a106cb50d543 100644 (file)
@@ -1901,7 +1901,7 @@ MagickExport Image *EmbossImage(const Image *image,const double radius,
   emboss_image=ConvolveImage(image,kernel_info,exception);
   kernel_info=DestroyKernelInfo(kernel_info);
   if (emboss_image != (Image *) NULL)
-    (void) EqualizeImage(emboss_image);
+    (void) EqualizeImage(emboss_image,exception);
   return(emboss_image);
 }
 \f
index acc60e2588b7795661ec5580146ac2189de19ffb..054f7d146c43a2bb5abc8689431068c6817825f4 100644 (file)
@@ -1294,34 +1294,18 @@ MagickExport MagickBooleanType ContrastStretchImage(Image *image,
 */
 MagickExport Image *EnhanceImage(const Image *image,ExceptionInfo *exception)
 {
-#define Enhance(weight) \
-  mean=((MagickRealType) GetPixelRed(image,r)+pixel.red)/2; \
-  distance=(MagickRealType) GetPixelRed(image,r)-(MagickRealType) pixel.red; \
+#define EnhancePixel(weight) \
+  mean=((MagickRealType) r[i]+q[channel])/2.0; \
+  distance=(MagickRealType) r[i]-(MagickRealType) q[channel]; \
   distance_squared=QuantumScale*(2.0*((MagickRealType) QuantumRange+1.0)+ \
-     mean)*distance*distance; \
-  mean=((MagickRealType) GetPixelGreen(image,r)+pixel.green)/2; \
-  distance=(MagickRealType) GetPixelGreen(image,r)- \
-    (MagickRealType) pixel.green; \
-  distance_squared+=4.0*distance*distance; \
-  mean=((MagickRealType) GetPixelBlue(image,r)+pixel.blue)/2; \
-  distance=(MagickRealType) GetPixelBlue(image,r)- \
-    (MagickRealType) pixel.blue; \
-  distance_squared+=QuantumScale*(3.0*((MagickRealType) \
-    QuantumRange+1.0)-1.0-mean)*distance*distance; \
-  mean=((MagickRealType) GetPixelAlpha(image,r)+pixel.alpha)/2; \
-  distance=(MagickRealType) GetPixelAlpha(image,r)-(MagickRealType) pixel.alpha; \
-  distance_squared+=QuantumScale*(3.0*((MagickRealType) \
-    QuantumRange+1.0)-1.0-mean)*distance*distance; \
+    mean)*distance*distance; \
   if (distance_squared < ((MagickRealType) QuantumRange*(MagickRealType) \
       QuantumRange/25.0f)) \
     { \
-      aggregate.red+=(weight)*GetPixelRed(image,r); \
-      aggregate.green+=(weight)*GetPixelGreen(image,r); \
-      aggregate.blue+=(weight)*GetPixelBlue(image,r); \
-      aggregate.alpha+=(weight)*GetPixelAlpha(image,r); \
+      aggregate+=(weight)*r[i]; \
       total_weight+=(weight); \
     } \
-  r++;
+  r+=GetPixelChannels(image);
 #define EnhanceImageTag  "Enhance/Image"
 
   CacheView
@@ -1337,9 +1321,6 @@ MagickExport Image *EnhanceImage(const Image *image,ExceptionInfo *exception)
   MagickOffsetType
     progress;
 
-  PixelInfo
-    zero;
-
   ssize_t
     y;
 
@@ -1352,8 +1333,6 @@ MagickExport Image *EnhanceImage(const Image *image,ExceptionInfo *exception)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-  if ((image->columns < 5) || (image->rows < 5))
-    return((Image *) NULL);
   enhance_image=CloneImage(image,image->columns,image->rows,MagickTrue,
     exception);
   if (enhance_image == (Image *) NULL)
@@ -1368,7 +1347,6 @@ MagickExport Image *EnhanceImage(const Image *image,ExceptionInfo *exception)
   */
   status=MagickTrue;
   progress=0;
-  (void) ResetMagickMemory(&zero,0,sizeof(zero));
   image_view=AcquireCacheView(image);
   enhance_view=AcquireCacheView(enhance_image);
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
@@ -1385,9 +1363,9 @@ MagickExport Image *EnhanceImage(const Image *image,ExceptionInfo *exception)
     register ssize_t
       x;
 
-    /*
-      Read another scan line.
-    */
+    ssize_t
+      center;
+
     if (status == MagickFalse)
       continue;
     p=GetCacheViewVirtualPixels(image_view,-2,y-2,image->columns+4,5,exception);
@@ -1398,48 +1376,63 @@ MagickExport Image *EnhanceImage(const Image *image,ExceptionInfo *exception)
         status=MagickFalse;
         continue;
       }
+    center=GetPixelChannels(image)*(2*(image->columns+4)+2);
     for (x=0; x < (ssize_t) image->columns; x++)
     {
-      PixelInfo
-        aggregate;
+      register ssize_t
+        i;
 
-      MagickRealType
-        distance,
-        distance_squared,
-        mean,
-        total_weight;
+      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+      {
+        MagickRealType
+          aggregate,
+          distance,
+          distance_squared,
+          mean,
+          total_weight;
 
-      PixelPacket
-        pixel;
+        PixelChannel
+          channel;
 
-      register const Quantum
-        *restrict r;
+        PixelTrait
+          enhance_traits,
+          traits;
 
-      /*
-        Compute weighted average of target pixel color components.
-      */
-      aggregate=zero;
-      total_weight=0.0;
-      r=p+2*(image->columns+4)+2;
-      GetPixelPacket(image,r,&pixel);
-      r=p;
-      Enhance(5.0); Enhance(8.0); Enhance(10.0); Enhance(8.0); Enhance(5.0);
-      r=p+(image->columns+4);
-      Enhance(8.0); Enhance(20.0); Enhance(40.0); Enhance(20.0); Enhance(8.0);
-      r=p+2*(image->columns+4);
-      Enhance(10.0); Enhance(40.0); Enhance(80.0); Enhance(40.0); Enhance(10.0);
-      r=p+3*(image->columns+4);
-      Enhance(8.0); Enhance(20.0); Enhance(40.0); Enhance(20.0); Enhance(8.0);
-      r=p+4*(image->columns+4);
-      Enhance(5.0); Enhance(8.0); Enhance(10.0); Enhance(8.0); Enhance(5.0);
-      SetPixelRed(enhance_image,(Quantum) ((aggregate.red+
-        (total_weight/2)-1)/total_weight),q);
-      SetPixelGreen(enhance_image,(Quantum) ((aggregate.green+
-        (total_weight/2)-1)/total_weight),q);
-      SetPixelBlue(enhance_image,(Quantum) ((aggregate.blue+
-        (total_weight/2)-1)/total_weight),q);
-      SetPixelAlpha(enhance_image,(Quantum) ((aggregate.alpha+
-        (total_weight/2)-1)/total_weight),q);
+        register const Quantum
+          *restrict r;
+
+        traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+        if (traits == UndefinedPixelTrait)
+          continue;
+        channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+        enhance_traits=GetPixelChannelMapTraits(enhance_image,channel);
+        if (enhance_traits == UndefinedPixelTrait)
+          continue;
+        q[channel]=p[center+i];
+        if ((enhance_traits & CopyPixelTrait) != 0)
+          continue;
+        /*
+          Compute weighted average of target pixel color components.
+        */
+        aggregate=0.0;
+        total_weight=0.0;
+        r=p+0*GetPixelChannels(image)*(image->columns+4);
+        EnhancePixel(5.0); EnhancePixel(8.0); EnhancePixel(10.0);
+          EnhancePixel(8.0); EnhancePixel(5.0);
+        r=p+1*GetPixelChannels(image)*(image->columns+4);
+        EnhancePixel(8.0); EnhancePixel(20.0); EnhancePixel(40.0);
+          EnhancePixel(20.0); EnhancePixel(8.0);
+        r=p+2*GetPixelChannels(image)*(image->columns+4);
+        EnhancePixel(10.0); EnhancePixel(40.0); EnhancePixel(80.0);
+          EnhancePixel(40.0); EnhancePixel(10.0);
+        r=p+3*GetPixelChannels(image)*(image->columns+4);
+        EnhancePixel(8.0); EnhancePixel(20.0); EnhancePixel(40.0);
+          EnhancePixel(20.0); EnhancePixel(8.0);
+        r=p+4*GetPixelChannels(image)*(image->columns+4);
+        EnhancePixel(5.0); EnhancePixel(8.0); EnhancePixel(10.0);
+          EnhancePixel(8.0); EnhancePixel(5.0);
+        q[channel]=ClampToQuantum(aggregate/total_weight);
+      }
       p+=GetPixelChannels(image);
       q+=GetPixelChannels(enhance_image);
     }
@@ -1478,25 +1471,23 @@ MagickExport Image *EnhanceImage(const Image *image,ExceptionInfo *exception)
 %
 %  The format of the EqualizeImage method is:
 %
-%      MagickBooleanType EqualizeImage(Image *image)
+%      MagickBooleanType EqualizeImage(Image *image,ExceptionInfo *exception)
 %
 %  A description of each parameter follows:
 %
 %    o image: the image.
 %
-%    o channel: the channel.
+%    o exception: return any errors or warnings in this structure.
 %
 */
-MagickExport MagickBooleanType EqualizeImage(Image *image)
+MagickExport MagickBooleanType EqualizeImage(Image *image,
+  ExceptionInfo *exception)
 {
 #define EqualizeImageTag  "Equalize/Image"
 
   CacheView
     *image_view;
 
-  ExceptionInfo
-    *exception;
-
   MagickBooleanType
     status;
 
@@ -1530,8 +1521,7 @@ MagickExport MagickBooleanType EqualizeImage(Image *image)
     sizeof(*histogram));
   map=(PixelInfo *) AcquireQuantumMemory(MaxMap+1UL,sizeof(*map));
   if ((equalize_map == (PixelInfo *) NULL) ||
-      (histogram == (PixelInfo *) NULL) ||
-      (map == (PixelInfo *) NULL))
+      (histogram == (PixelInfo *) NULL) || (map == (PixelInfo *) NULL))
     {
       if (map != (PixelInfo *) NULL)
         map=(PixelInfo *) RelinquishMagickMemory(map);
@@ -1546,7 +1536,6 @@ MagickExport MagickBooleanType EqualizeImage(Image *image)
     Form histogram.
   */
   (void) ResetMagickMemory(histogram,0,(MaxMap+1)*sizeof(*histogram));
-  exception=(&image->exception);
   for (y=0; y < (ssize_t) image->rows; y++)
   {
     register const Quantum
index b89bd725051e6b731f4ff6ae3795bc8b8303d322..ecb154d61394c5a9460edb3e004971e4f2d4e7f2 100644 (file)
@@ -30,7 +30,7 @@ extern MagickExport MagickBooleanType
   ColorDecisionListImage(Image *,const char *,ExceptionInfo *),
   ContrastImage(Image *,const MagickBooleanType,ExceptionInfo *),
   ContrastStretchImage(Image *,const double,const double,ExceptionInfo *),
-  EqualizeImage(Image *image),
+  EqualizeImage(Image *image,ExceptionInfo *),
   GammaImage(Image *,const double,ExceptionInfo *),
   HaldClutImage(Image *,const Image *),
   LevelImage(Image *,const double,const double,const double,ExceptionInfo *),
index 5c4e4f88efaef768b1f98e8c3816186f7a18cbb2..41bf918c42cc892ca91d49f2a6a56464ab185029 100644 (file)
@@ -2710,9 +2710,7 @@ WandExport MagickBooleanType MagickEqualizeImage(MagickWand *wand)
     (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
   if (wand->images == (Image *) NULL)
     ThrowWandException(WandError,"ContainsNoImages",wand->name);
-  status=EqualizeImage(wand->images);
-  if (status == MagickFalse)
-    InheritException(wand->exception,&wand->images->exception);
+  status=EqualizeImage(wand->images,&wand->images->exception);
   return(status);
 }
 \f
index 323a8f2c7b3a62e48ac5e5c817d11b6c02825ed0..9da0a2f32c076e04cc5e70c2ad91d8f1be6c9a7e 100644 (file)
@@ -1470,8 +1470,7 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
               Equalize image.
             */
             (void) SyncImageSettings(mogrify_info,*image);
-            (void) EqualizeImage(*image);
-            InheritException(exception,&(*image)->exception);
+            (void) EqualizeImage(*image,exception);
             break;
           }
         if (LocaleCompare("evaluate",option+1) == 0)
index a58c1b389db353ef566eadba31395e69bfe66d83..9c891f3f41c1cf6e506010466aef7441583f8633 100644 (file)
@@ -8643,7 +8643,7 @@ Mogrify(ref,...)
           if (attribute_flag[0] != 0)
             channel=(ChannelType) argument_list[0].integer_reference;
           channel_mask=SetPixelChannelMask(image,channel);
-          EqualizeImage(image);
+          EqualizeImage(image,exception);
           (void) SetPixelChannelMask(image,channel_mask);
           break;
         }
index 5b0750fe68c7363f866e208beb9a90c9c7772510..38ec9b67b7f9b574eb08908fdc6b6fafbce8adf1 100644 (file)
@@ -2886,7 +2886,8 @@ static void MSLStartElement(void *context,const xmlChar *tag,
                 }
               }
             }
-          (void) EqualizeImage(msl_info->image[n]);
+          (void) EqualizeImage(msl_info->image[n],
+            &msl_info->image[n]->exception);
           break;
         }
       ThrowMSLException(OptionError,"UnrecognizedElement",(const char *) tag);