% 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)
{
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);