44 #include "magick/studio.h"
45 #include "magick/attribute.h"
46 #include "magick/blob.h"
47 #include "magick/cache-view.h"
48 #include "magick/cache.h"
49 #include "magick/color.h"
50 #include "magick/color-private.h"
51 #include "magick/colormap.h"
52 #include "magick/colormap-private.h"
53 #include "magick/client.h"
54 #include "magick/configure.h"
55 #include "magick/exception.h"
56 #include "magick/exception-private.h"
57 #include "magick/gem.h"
58 #include "magick/geometry.h"
59 #include "magick/image-private.h"
60 #include "magick/memory_.h"
61 #include "magick/monitor.h"
62 #include "magick/monitor-private.h"
63 #include "magick/option.h"
64 #include "magick/pixel-accessor.h"
65 #include "magick/pixel-private.h"
66 #include "magick/quantize.h"
67 #include "magick/quantum.h"
68 #include "magick/semaphore.h"
69 #include "magick/resource_.h"
70 #include "magick/string_.h"
71 #include "magick/thread-private.h"
72 #include "magick/token.h"
73 #include "magick/utility.h"
74 #include "magick/xml-tree.h"
103 MagickExport MagickBooleanType AcquireImageColormap(
Image *image,
112 assert(image != (
Image *) NULL);
113 assert(image->signature == MagickCoreSignature);
114 if (IsEventLogging() != MagickFalse)
115 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
116 if (colors > MaxColormapSize)
119 image->storage_class=DirectClass;
120 ThrowBinaryImageException(ResourceLimitError,
"UnableToCreateColormap",
123 image->colors=MagickMax(colors,1);
125 image->colormap=(
PixelPacket *) AcquireQuantumMemory(image->colors+256,
126 sizeof(*image->colormap));
128 image->colormap=(
PixelPacket *) ResizeQuantumMemory(image->colormap,
129 image->colors+256,
sizeof(*image->colormap));
133 image->storage_class=DirectClass;
134 ThrowBinaryImageException(ResourceLimitError,
"MemoryAllocationFailed",
137 for (i=0; i < (ssize_t) image->colors; i++)
142 pixel=(size_t) (i*(QuantumRange/MagickMax(colors-1,1)));
143 image->colormap[i].red=(Quantum) pixel;
144 image->colormap[i].green=(Quantum) pixel;
145 image->colormap[i].blue=(Quantum) pixel;
146 image->colormap[i].opacity=OpaqueOpacity;
148 image->storage_class=PseudoClass;
178 MagickExport MagickBooleanType CycleColormapImage(
Image *image,
179 const ssize_t displace)
193 assert(image != (
Image *) NULL);
194 assert(image->signature == MagickCoreSignature);
195 if (IsEventLogging() != MagickFalse)
196 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
197 if (image->storage_class == DirectClass)
198 (void) SetImageType(image,PaletteType);
200 exception=(&image->exception);
201 image_view=AcquireAuthenticCacheView(image,exception);
202 #if defined(MAGICKCORE_OPENMP_SUPPORT)
203 #pragma omp parallel for schedule(static) shared(status) \
204 magick_number_threads(image,image,image->rows,2)
206 for (y=0; y < (ssize_t) image->rows; y++)
209 *magick_restrict indexes;
220 if (status == MagickFalse)
222 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
228 indexes=GetCacheViewAuthenticIndexQueue(image_view);
229 for (x=0; x < (ssize_t) image->columns; x++)
231 index=(ssize_t) (GetPixelIndex(indexes+x)+displace) %
234 index+=(ssize_t) image->colors;
235 SetPixelIndex(indexes+x,index);
236 SetPixelRGBO(q,image->colormap+(ssize_t) index);
239 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
242 image_view=DestroyCacheView(image_view);
270 #if defined(__cplusplus) || defined(c_plusplus)
274 static int IntensityCompare(
const void *x,
const void *y)
285 intensity=PixelPacketIntensity(color_2)-(int) PixelPacketIntensity(color_1);
289 #if defined(__cplusplus) || defined(c_plusplus)
293 MagickExport MagickBooleanType SortColormapByIntensity(
Image *image)
311 assert(image != (
Image *) NULL);
312 assert(image->signature == MagickCoreSignature);
313 if (IsEventLogging() != MagickFalse)
314 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
315 if (image->storage_class != PseudoClass)
317 exception=(&image->exception);
321 pixels=(
unsigned short *) AcquireQuantumMemory((
size_t) image->colors,
323 if (pixels == (
unsigned short *) NULL)
324 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
329 for (i=0; i < (ssize_t) image->colors; i++)
330 image->colormap[i].opacity=(IndexPacket) i;
334 qsort((
void *) image->colormap,(
size_t) image->colors,
335 sizeof(*image->colormap),IntensityCompare);
339 for (i=0; i < (ssize_t) image->colors; i++)
340 pixels[(ssize_t) image->colormap[i].opacity]=(
unsigned short) i;
342 image_view=AcquireAuthenticCacheView(image,exception);
343 #if defined(MAGICKCORE_OPENMP_SUPPORT)
344 #pragma omp parallel for schedule(static) shared(status) \
345 magick_number_threads(image,image,image->rows,2)
347 for (y=0; y < (ssize_t) image->rows; y++)
350 *magick_restrict indexes;
358 if (status == MagickFalse)
360 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
366 indexes=GetCacheViewAuthenticIndexQueue(image_view);
367 for (x=0; x < (ssize_t) image->columns; x++)
375 i=ConstrainColormapIndex(image,GetPixelIndex(indexes+x));
376 index=(IndexPacket) pixels[i];
377 SetPixelIndex(indexes+x,index);
378 SetPixelRGBO(q,image->colormap+(ssize_t) index);
381 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
384 image_view=DestroyCacheView(image_view);
385 pixels=(
unsigned short *) RelinquishMagickMemory(pixels);