]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Fri, 12 Aug 2011 12:38:05 +0000 (12:38 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Fri, 12 Aug 2011 12:38:05 +0000 (12:38 +0000)
MagickCore/quantize.c

index 2c928b376b96b28789327909266ee107187eb67e..85c648855601c3cb2d89b50bba361a24725e9cf3 100644 (file)
@@ -2603,6 +2603,69 @@ static void PruneToCubeDepth(const Image *image,CubeInfo *cube_info,
 %    o image: the image.
 %
 */
+
+static MagickBooleanType DirectToColormapImage(Image *image,
+  ExceptionInfo *exception)
+{
+  CacheView
+    *image_view;
+
+  MagickBooleanType
+    status;
+
+  register ssize_t
+    i;
+
+  size_t
+    number_colors;
+
+  ssize_t
+    y;
+
+  status=MagickTrue;
+  number_colors=(size_t) (image->columns*image->rows);
+  if (AcquireImageColormap(image,number_colors) == MagickFalse)
+    ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
+      image->filename);
+  if (image->colors != number_colors)
+    return(MagickFalse);
+  i=0;
+  image_view=AcquireCacheView(image);
+  for (y=0; y < (ssize_t) image->rows; y++)
+  {
+    MagickBooleanType
+      proceed;
+
+    register Quantum
+      *restrict q;
+
+    register ssize_t
+      x;
+
+    q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
+    if (q == (Quantum *) NULL)
+      break;
+    for (x=0; x < (ssize_t) image->columns; x++)
+    {
+      image->colormap[i].red=GetPixelRed(image,q);
+      image->colormap[i].green=GetPixelGreen(image,q);
+      image->colormap[i].blue=GetPixelBlue(image,q);
+      image->colormap[i].alpha=GetPixelAlpha(image,q);
+      SetPixelIndex(image,(Quantum) i,q);
+      i++;
+      q+=GetPixelChannels(image);
+    }
+    if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
+      break;
+    proceed=SetImageProgress(image,AssignImageTag,(MagickOffsetType) y,
+      image->rows);
+    if (proceed == MagickFalse)
+      status=MagickFalse;
+  }
+  image_view=DestroyCacheView(image_view);
+  return(status);
+}
+
 MagickExport MagickBooleanType QuantizeImage(const QuantizeInfo *quantize_info,
   Image *image)
 {
@@ -2627,6 +2690,8 @@ MagickExport MagickBooleanType QuantizeImage(const QuantizeInfo *quantize_info,
     maximum_colors=MaxColormapSize;
   if (maximum_colors > MaxColormapSize)
     maximum_colors=MaxColormapSize;
+  if ((image->columns*image->rows) <= maximum_colors)
+    (void) DirectToColormapImage(image,&image->exception);
   if ((IsImageGray(image,&image->exception) != MagickFalse) &&
       (image->matte == MagickFalse))
     (void) SetGrayscaleImage(image);