]> granicus.if.org Git - imagemagick/blobdiff - magick/histogram.c
(no commit message)
[imagemagick] / magick / histogram.c
index c7797c08337322f8fbda9306a9c34dc9a7bb2b78..4586bcf72a735f654b159361ff4d80a47cf27921 100644 (file)
@@ -18,7 +18,7 @@
 %                                August 2009                                  %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 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  %
@@ -141,7 +141,7 @@ static void
 %
 %  ClassifyImageColors() builds a populated CubeInfo tree for the specified
 %  image.  The returned tree should be deallocated using DestroyCubeInfo()
-%  once it is no ssize_ter needed.
+%  once it is no longer needed.
 %
 %  The format of the ClassifyImageColors() method is:
 %
@@ -183,9 +183,6 @@ static CubeInfo *ClassifyImageColors(const Image *image,
   CubeInfo
     *cube_info;
 
-  ssize_t
-    y;
-
   MagickBooleanType
     proceed;
 
@@ -202,15 +199,18 @@ static CubeInfo *ClassifyImageColors(const Image *image,
   register const PixelPacket
     *p;
 
-  register ssize_t
-    i,
-    x;
-
   register size_t
     id,
     index,
     level;
 
+  register ssize_t
+    i,
+    x;
+
+  ssize_t
+    y;
+
   /*
     Initialize color description tree.
   */
@@ -286,7 +286,7 @@ static CubeInfo *ClassifyImageColors(const Image *image,
           node_info->list[i].pixel=(*p);
           if ((image->colorspace == CMYKColorspace) ||
               (image->storage_class == PseudoClass))
-            node_info->list[i].index=indexes[x];
+            node_info->list[i].index=GetIndexPixelComponent(indexes+x);
           node_info->list[i].count=1;
           node_info->number_unique++;
           cube_info->colors++;
@@ -483,7 +483,7 @@ static CubeInfo *GetCubeInfo(void)
   /*
     Initialize tree to describe color cube.
   */
-  cube_info=(CubeInfo *) AcquireAlignedMemory(1,sizeof(*cube_info));
+  cube_info=(CubeInfo *) AcquireMagickMemory(sizeof(*cube_info));
   if (cube_info == (CubeInfo *) NULL)
     return((CubeInfo *) NULL);
   (void) ResetMagickMemory(cube_info,0,sizeof(*cube_info));
@@ -594,7 +594,7 @@ static NodeInfo *GetNodeInfo(CubeInfo *cube_info,const size_t level)
       /*
         Allocate a new nodes of nodes.
       */
-      nodes=(Nodes *) AcquireAlignedMemory(1,sizeof(*nodes));
+      nodes=(Nodes *) AcquireMagickMemory(sizeof(*nodes));
       if (nodes == (Nodes *) NULL)
         return((NodeInfo *) NULL);
       nodes->next=cube_info->node_queue;
@@ -646,9 +646,6 @@ MagickExport MagickBooleanType IsHistogramImage(const Image *image,
   CubeInfo
     *cube_info;
 
-  ssize_t
-    y;
-
   MagickPixelPacket
     pixel,
     target;
@@ -673,6 +670,9 @@ MagickExport MagickBooleanType IsHistogramImage(const Image *image,
     index,
     level;
 
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
@@ -757,7 +757,7 @@ MagickExport MagickBooleanType IsHistogramImage(const Image *image,
           node_info->list[i].pixel=(*p);
           if ((image->colorspace == CMYKColorspace) ||
               (image->storage_class == PseudoClass))
-            node_info->list[i].index=indexes[x];
+            node_info->list[i].index=GetIndexPixelComponent(indexes+x);
           node_info->list[i].count=1;
           node_info->number_unique++;
           cube_info->colors++;
@@ -809,9 +809,6 @@ MagickExport MagickBooleanType IsPaletteImage(const Image *image,
   CubeInfo
     *cube_info;
 
-  ssize_t
-    y;
-
   MagickPixelPacket
     pixel,
     target;
@@ -836,6 +833,9 @@ MagickExport MagickBooleanType IsPaletteImage(const Image *image,
     index,
     level;
 
+  ssize_t
+    y;
+
   assert(image != (Image *) NULL);
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
@@ -920,7 +920,7 @@ MagickExport MagickBooleanType IsPaletteImage(const Image *image,
           node_info->list[i].pixel=(*p);
           if ((image->colorspace == CMYKColorspace) ||
               (image->storage_class == PseudoClass))
-            node_info->list[i].index=indexes[x];
+            node_info->list[i].index=GetIndexPixelComponent(indexes+x);
           node_info->list[i].count=1;
           node_info->number_unique++;
           cube_info->colors++;
@@ -953,7 +953,7 @@ MagickExport MagickBooleanType IsPaletteImage(const Image *image,
 %  stretch the colors (and histogram) of the image.  The stretch points are
 %  also moved further inward by the adjustment values given.
 %
-%  If the adjustment values are both zero this function is equivelent to a
+%  If the adjustment values are both zero this function is equivalent to a
 %  perfect normalization (or autolevel) of the image.
 %
 %  Each channel is stretched independantally of each other (producing color
@@ -1161,6 +1161,7 @@ MagickExport size_t GetNumberColors(const Image *image,FILE *file,
     HistogramCompare);
   GetMagickPixelPacket(image,&pixel);
   p=histogram;
+  status=MagickTrue;
   for (i=0; i < (ssize_t) number_colors; i++)
   {
     SetMagickPixelPacket(image,&p->pixel,&p->index,&pixel);
@@ -1183,7 +1184,7 @@ MagickExport size_t GetNumberColors(const Image *image,FILE *file,
     (void) ConcatenateMagickString(tuple,")",MaxTextExtent);
     (void) QueryMagickColorname(image,&pixel,SVGCompliance,color,exception);
     GetColorTuple(&pixel,MagickTrue,hex);
-    (void) fprintf(file,MagickSizeFormat,p->count);
+    (void) fprintf(file,"%10" MagickSizeFormat,p->count);
     (void) fprintf(file,": %s %s %s\n",tuple,hex,color);
     if (image->progress_monitor != (MagickProgressMonitor) NULL)
       {
@@ -1199,6 +1200,8 @@ MagickExport size_t GetNumberColors(const Image *image,FILE *file,
   }
   (void) fflush(file);
   histogram=(ColorPacket *) RelinquishMagickMemory(histogram);
+  if (status == MagickFalse)
+    return(0);
   return(number_colors);
 }
 \f
@@ -1227,8 +1230,8 @@ MagickExport size_t GetNumberColors(const Image *image,FILE *file,
 %
 */
 
-static void UniqueColorsToImage(Image *image,CubeInfo *cube_info,
-  const NodeInfo *node_info,ExceptionInfo *exception)
+static void UniqueColorsToImage(Image *unique_image,CacheView *unique_view,
+  CubeInfo *cube_info,const NodeInfo *node_info,ExceptionInfo *exception)
 {
 #define UniqueColorsImageTag  "UniqueColors/Image"
 
@@ -1244,10 +1247,11 @@ static void UniqueColorsToImage(Image *image,CubeInfo *cube_info,
   /*
     Traverse any children.
   */
-  number_children=image->matte == MagickFalse ? 8UL : 16UL;
+  number_children=unique_image->matte == MagickFalse ? 8UL : 16UL;
   for (i=0; i < (ssize_t) number_children; i++)
     if (node_info->child[i] != (NodeInfo *) NULL)
-      UniqueColorsToImage(image,cube_info,node_info->child[i],exception);
+      UniqueColorsToImage(unique_image,unique_view,cube_info,
+        node_info->child[i],exception);
   if (node_info->level == (MaxTreeDepth-1))
     {
       register ColorPacket
@@ -1259,38 +1263,45 @@ static void UniqueColorsToImage(Image *image,CubeInfo *cube_info,
       register PixelPacket
         *restrict q;
 
+      status=MagickTrue;
       p=node_info->list;
       for (i=0; i < (ssize_t) node_info->number_unique; i++)
       {
-        q=QueueAuthenticPixels(image,cube_info->x,0,1,1,exception);
+        q=QueueCacheViewAuthenticPixels(unique_view,cube_info->x,0,1,1,
+          exception);
         if (q == (PixelPacket *) NULL)
           continue;
-        indexes=GetAuthenticIndexQueue(image);
+        indexes=GetCacheViewAuthenticIndexQueue(unique_view);
         *q=p->pixel;
-        if (image->colorspace == CMYKColorspace)
+        if (unique_image->colorspace == CMYKColorspace)
           *indexes=p->index;
-        if (SyncAuthenticPixels(image,exception) == MagickFalse)
+        if (SyncCacheViewAuthenticPixels(unique_view,exception) == MagickFalse)
           break;
         cube_info->x++;
         p++;
       }
-      if (image->progress_monitor != (MagickProgressMonitor) NULL)
+      if (unique_image->progress_monitor != (MagickProgressMonitor) NULL)
         {
           MagickBooleanType
             proceed;
 
-          proceed=SetImageProgress(image,UniqueColorsImageTag,
+          proceed=SetImageProgress(unique_image,UniqueColorsImageTag,
             cube_info->progress,cube_info->colors);
           if (proceed == MagickFalse)
             status=MagickFalse;
         }
       cube_info->progress++;
+      if (status == MagickFalse)
+        return;
     }
 }
 
 MagickExport Image *UniqueImageColors(const Image *image,
   ExceptionInfo *exception)
 {
+  CacheView
+    *unique_view;
+
   CubeInfo
     *cube_info;
 
@@ -1309,7 +1320,10 @@ MagickExport Image *UniqueImageColors(const Image *image,
       unique_image=DestroyImage(unique_image);
       return((Image *) NULL);
     }
-  UniqueColorsToImage(unique_image,cube_info,cube_info->root,exception);
+  unique_view=AcquireCacheView(unique_image);
+  UniqueColorsToImage(unique_image,unique_view,cube_info,cube_info->root,
+    exception);
+  unique_view=DestroyCacheView(unique_view);
   if (cube_info->colors < MaxColormapSize)
     {
       QuantizeInfo