]> granicus.if.org Git - imagemagick/blobdiff - coders/histogram.c
(no commit message)
[imagemagick] / coders / histogram.c
index ac2a3d017fb40e54cde876d36ab717390b94a94b..6adcad6ea945e6aa81478a5c7f5b3e99e649b380 100644 (file)
@@ -17,7 +17,7 @@
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2011 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  %
 /*
   Include declarations.
 */
-#include "magick/studio.h"
-#include "magick/property.h"
-#include "magick/blob.h"
-#include "magick/blob-private.h"
-#include "magick/cache.h"
-#include "magick/color.h"
-#include "magick/color-private.h"
-#include "magick/constitute.h"
-#include "magick/exception.h"
-#include "magick/exception-private.h"
-#include "magick/geometry.h"
-#include "magick/image-private.h"
-#include "magick/magick.h"
-#include "magick/memory_.h"
-#include "magick/monitor.h"
-#include "magick/monitor-private.h"
-#include "magick/resource_.h"
-#include "magick/quantum-private.h"
-#include "magick/static.h"
-#include "magick/statistic.h"
-#include "magick/string_.h"
-#include "magick/module.h"
+#include "MagickCore/studio.h"
+#include "MagickCore/property.h"
+#include "MagickCore/blob.h"
+#include "MagickCore/blob-private.h"
+#include "MagickCore/cache.h"
+#include "MagickCore/color.h"
+#include "MagickCore/color-private.h"
+#include "MagickCore/constitute.h"
+#include "MagickCore/exception.h"
+#include "MagickCore/exception-private.h"
+#include "MagickCore/geometry.h"
+#include "MagickCore/histogram.h"
+#include "MagickCore/image-private.h"
+#include "MagickCore/magick.h"
+#include "MagickCore/memory_.h"
+#include "MagickCore/monitor.h"
+#include "MagickCore/monitor-private.h"
+#include "MagickCore/option.h"
+#include "MagickCore/pixel-accessor.h"
+#include "MagickCore/quantum-private.h"
+#include "MagickCore/resource_.h"
+#include "MagickCore/static.h"
+#include "MagickCore/statistic.h"
+#include "MagickCore/string_.h"
+#include "MagickCore/module.h"
+#include "MagickCore/utility.h"
 \f
 /*
   Forward declarations.
@@ -88,10 +92,10 @@ static MagickBooleanType
 %
 %  The format of the RegisterHISTOGRAMImage method is:
 %
-%      unsigned long RegisterHISTOGRAMImage(void)
+%      size_t RegisterHISTOGRAMImage(void)
 %
 */
-ModuleExport unsigned long RegisterHISTOGRAMImage(void)
+ModuleExport size_t RegisterHISTOGRAMImage(void)
 {
   MagickInfo
     *entry;
@@ -99,7 +103,7 @@ ModuleExport unsigned long RegisterHISTOGRAMImage(void)
   entry=SetMagickInfo("HISTOGRAM");
   entry->encoder=(EncodeImageHandler *) WriteHISTOGRAMImage;
   entry->adjoin=MagickFalse;
-  entry->format_type=ExplicitFormatType;
+  entry->format_type=ImplicitFormatType;
   entry->description=ConstantString("Histogram of the image");
   entry->module=ConstantString("HISTOGRAM");
   (void) RegisterMagickInfo(entry);
@@ -182,28 +186,22 @@ static MagickBooleanType WriteHISTOGRAMImage(const ImageInfo *image_info,
   char
     filename[MaxTextExtent];
 
+  const char
+    *option;
+
   ExceptionInfo
     *exception;
 
-  FILE
-    *file;
-
   Image
     *histogram_image;
 
   ImageInfo
     *write_info;
 
-  int
-    unique_file;
-
-  long
-    y;
-
   MagickBooleanType
     status;
 
-  MagickPixelPacket
+  PixelInfo
     *histogram;
 
   MagickRealType
@@ -213,19 +211,22 @@ static MagickBooleanType WriteHISTOGRAMImage(const ImageInfo *image_info,
   RectangleInfo
     geometry;
 
-  register const PixelPacket
+  register const Quantum
     *p;
 
-  register long
-    x;
-
-  register PixelPacket
+  register Quantum
     *q,
     *r;
 
+  register ssize_t
+    x;
+
   size_t
     length;
 
+  ssize_t
+    y;
+
   /*
     Allocate histogram image.
   */
@@ -251,9 +252,9 @@ static MagickBooleanType WriteHISTOGRAMImage(const ImageInfo *image_info,
   */
   length=MagickMax((size_t) ScaleQuantumToChar((Quantum) QuantumRange)+1UL,
     histogram_image->columns);
-  histogram=(MagickPixelPacket *) AcquireQuantumMemory(length,
+  histogram=(PixelInfo *) AcquireQuantumMemory(length,
     sizeof(*histogram));
-  if (histogram == (MagickPixelPacket *) NULL)
+  if (histogram == (PixelInfo *) NULL)
     {
       histogram_image=DestroyImage(histogram_image);
       ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
@@ -263,30 +264,33 @@ static MagickBooleanType WriteHISTOGRAMImage(const ImageInfo *image_info,
   */
   channel=image_info->channel;
   (void) ResetMagickMemory(histogram,0,length*sizeof(*histogram));
-  for (y=0; y < (long) image->rows; y++)
+  for (y=0; y < (ssize_t) image->rows; y++)
   {
     p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
-    if (p == (const PixelPacket *) NULL)
+    if (p == (const Quantum *) NULL)
       break;
-    for (x=0; x < (long) image->columns; x++)
+    for (x=0; x < (ssize_t) image->columns; x++)
     {
-      if ((channel & RedChannel) != 0)
-        histogram[ScaleQuantumToChar(p->red)].red++;
-      if ((channel & GreenChannel) != 0)
-        histogram[ScaleQuantumToChar(p->green)].green++;
-      if ((channel & BlueChannel) != 0)
-        histogram[ScaleQuantumToChar(p->blue)].blue++;
-      p++;
+      if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
+        histogram[ScaleQuantumToChar(GetPixelRed(image,p))].red++;
+      if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
+        histogram[ScaleQuantumToChar(GetPixelGreen(image,p))].green++;
+      if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
+        histogram[ScaleQuantumToChar(GetPixelBlue(image,p))].blue++;
+      p+=GetPixelChannels(image);
     }
   }
   maximum=histogram[0].red;
-  for (x=0; x < (long) histogram_image->columns; x++)
+  for (x=0; x < (ssize_t) histogram_image->columns; x++)
   {
-    if (((channel & RedChannel) != 0) && (maximum < histogram[x].red))
+    if (((GetPixelRedTraits(image) & ActivePixelTrait) != 0) &&
+        (maximum < histogram[x].red))
       maximum=histogram[x].red;
-    if (((channel & GreenChannel) != 0) && (maximum < histogram[x].green))
+    if (((GetPixelGreenTraits(image) & ActivePixelTrait) != 0) &&
+        (maximum < histogram[x].green))
       maximum=histogram[x].green;
-    if (((channel & BlueChannel) != 0) && (maximum < histogram[x].blue))
+    if (((GetPixelBlueTraits(image) & ActivePixelTrait) != 0) &&
+        (maximum < histogram[x].blue))
       maximum=histogram[x].blue;
   }
   scale=(MagickRealType) histogram_image->rows/maximum;
@@ -297,38 +301,38 @@ static MagickBooleanType WriteHISTOGRAMImage(const ImageInfo *image_info,
   (void) QueryColorDatabase("#000000",&histogram_image->background_color,
     &image->exception);
   (void) SetImageBackgroundColor(histogram_image);
-  for (x=0; x < (long) histogram_image->columns; x++)
+  for (x=0; x < (ssize_t) histogram_image->columns; x++)
   {
     q=GetAuthenticPixels(histogram_image,x,0,1,histogram_image->rows,exception);
-    if (q == (PixelPacket *) NULL)
+    if (q == (const Quantum *) NULL)
       break;
-    if ((channel & RedChannel) != 0)
+    if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
       {
-        y=(long) (histogram_image->rows-scale*histogram[x].red+0.5);
+        y=(ssize_t) ceil(histogram_image->rows-scale*histogram[x].red-0.5);
         r=q+y;
-        for ( ; y < (long) histogram_image->rows; y++)
+        for ( ; y < (ssize_t) histogram_image->rows; y++)
         {
-          r->red=(Quantum) QuantumRange;
+          SetPixelRed(histogram_image,QuantumRange,r);
           r++;
         }
       }
-    if ((channel & GreenChannel) != 0)
+    if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
       {
-        y=(long) (histogram_image->rows-scale*histogram[x].green+0.5);
+        y=(ssize_t) ceil(histogram_image->rows-scale*histogram[x].green-0.5);
         r=q+y;
-        for ( ; y < (long) histogram_image->rows; y++)
+        for ( ; y < (ssize_t) histogram_image->rows; y++)
         {
-          r->green=(Quantum) QuantumRange;
+          SetPixelGreen(histogram_image,QuantumRange,r);
           r++;
         }
       }
-    if ((channel & BlueChannel) != 0)
+    if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
       {
-        y=(long) (histogram_image->rows-scale*histogram[x].blue+0.5);
+        y=(ssize_t) ceil(histogram_image->rows-scale*histogram[x].blue-0.5);
         r=q+y;
-        for ( ; y < (long) histogram_image->rows; y++)
+        for ( ; y < (ssize_t) histogram_image->rows; y++)
         {
-          r->blue=(Quantum) QuantumRange;
+          SetPixelBlue(histogram_image,QuantumRange,r);
           r++;
         }
       }
@@ -341,38 +345,48 @@ static MagickBooleanType WriteHISTOGRAMImage(const ImageInfo *image_info,
   /*
     Relinquish resources.
   */
-  histogram=(MagickPixelPacket *) RelinquishMagickMemory(histogram);
-  file=(FILE *) NULL;
-  unique_file=AcquireUniqueFileResource(filename);
-  if (unique_file != -1)
-    file=fdopen(unique_file,"wb");
-  if ((unique_file != -1) && (file != (FILE *) NULL))
+  histogram=(PixelInfo *) RelinquishMagickMemory(histogram);
+  option=GetImageOption(image_info,"histogram:unique-colors");
+  if ((option == (const char *) NULL) || (IsMagickTrue(option) != MagickFalse))
     {
-      char
-        *property;
+      FILE
+        *file;
+
+      int
+        unique_file;
 
       /*
-        Add a histogram as an image comment.
+        Add a unique colors as an image comment.
       */
-      (void) GetNumberColors(image,file,&image->exception);
-      (void) fclose(file);
-      property=FileToString(filename,~0UL,&image->exception);
-      if (property != (char *) NULL)
+      file=(FILE *) NULL;
+      unique_file=AcquireUniqueFileResource(filename);
+      if (unique_file != -1)
+        file=fdopen(unique_file,"wb");
+      if ((unique_file != -1) && (file != (FILE *) NULL))
         {
-          (void) SetImageProperty(histogram_image,"comment",property);
-          property=DestroyString(property);
+          char
+            *property;
+
+          (void) GetNumberColors(image,file,&image->exception);
+          (void) fclose(file);
+          property=FileToString(filename,~0UL,&image->exception);
+          if (property != (char *) NULL)
+            {
+              (void) SetImageProperty(histogram_image,"comment",property);
+              property=DestroyString(property);
+            }
         }
+      (void) RelinquishUniqueFileResource(filename);
     }
-  (void) RelinquishUniqueFileResource(filename);
   /*
     Write Histogram image.
   */
   (void) CopyMagickString(histogram_image->filename,image_info->filename,
     MaxTextExtent);
   write_info=CloneImageInfo(image_info);
-  (void) SetImageInfo(write_info,MagickTrue,&image->exception);
+  (void) SetImageInfo(write_info,1,&image->exception);
   if (LocaleCompare(write_info->magick,"HISTOGRAM") == 0)
-    (void) FormatMagickString(histogram_image->filename,MaxTextExtent,
+    (void) FormatLocaleString(histogram_image->filename,MaxTextExtent,
       "miff:%s",write_info->filename);
   status=WriteImage(write_info,histogram_image);
   histogram_image=DestroyImage(histogram_image);