% July 1992 %
% %
% %
-% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2012 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 "MagickCore/pixel-accessor.h"
#include "MagickCore/quantize.h"
#include "MagickCore/quantum.h"
+#include "MagickCore/resource_.h"
#include "MagickCore/semaphore.h"
#include "MagickCore/string_.h"
+#include "MagickCore/thread-private.h"
#include "MagickCore/token.h"
#include "MagickCore/utility.h"
#include "MagickCore/xml-tree.h"
% The format of the AcquireImageColormap method is:
%
% MagickBooleanType AcquireImageColormap(Image *image,
-% const size_t colors)
+% const size_t colors,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
%
% o colors: the number of colors in the image colormap.
%
+% o exception: return any errors or warnings in this structure.
+%
*/
static inline size_t MagickMax(const size_t x,
return(y);
}
-static inline size_t MagickMin(const size_t x,
- const size_t y)
-{
- if (x < y)
- return(x);
- return(y);
-}
-
MagickExport MagickBooleanType AcquireImageColormap(Image *image,
- const size_t colors)
+ const size_t colors,ExceptionInfo *exception)
{
register ssize_t
i;
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
image->colors=colors;
length=(size_t) colors;
- if (image->colormap == (PixelPacket *) NULL)
- image->colormap=(PixelPacket *) AcquireQuantumMemory(length,
+ if (image->colormap == (PixelInfo *) NULL)
+ image->colormap=(PixelInfo *) AcquireQuantumMemory(length,
sizeof(*image->colormap));
else
- image->colormap=(PixelPacket *) ResizeQuantumMemory(image->colormap,length,
+ image->colormap=(PixelInfo *) ResizeQuantumMemory(image->colormap,length,
sizeof(*image->colormap));
- if (image->colormap == (PixelPacket *) NULL)
+ if (image->colormap == (PixelInfo *) NULL)
ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
image->filename);
for (i=0; i < (ssize_t) image->colors; i++)
{
- size_t
+ double
pixel;
- pixel=(size_t) (i*(QuantumRange/MagickMax(colors-1,1)));
- image->colormap[i].red=(Quantum) pixel;
- image->colormap[i].green=(Quantum) pixel;
- image->colormap[i].blue=(Quantum) pixel;
+ pixel=(double) (i*(QuantumRange/MagickMax(colors-1,1)));
+ GetPixelInfo(image,image->colormap+i);
+ image->colormap[i].matte=MagickTrue;
+ image->colormap[i].red=pixel;
+ image->colormap[i].green=pixel;
+ image->colormap[i].blue=pixel;
image->colormap[i].alpha=OpaqueAlpha;
}
- return(SetImageStorageClass(image,PseudoClass));
+ return(SetImageStorageClass(image,PseudoClass,exception));
}
\f
/*
% positions. If you cycle the colormap a number of times you can produce
% a psychodelic effect.
%
+% WARNING: this assumes an images colormap is in a well know and defined
+% order. Currently Imagemagick has no way of setting that order.
+%
% The format of the CycleColormapImage method is:
%
-% MagickBooleanType CycleColormapImage(Image *image,const ssize_t displace)
+% MagickBooleanType CycleColormapImage(Image *image,const ssize_t displace,
+% ExceptionInfo *exception)
%
% A description of each parameter follows:
%
%
% o displace: displace the colormap this amount.
%
+% o exception: return any errors or warnings in this structure.
+%
*/
MagickExport MagickBooleanType CycleColormapImage(Image *image,
- const ssize_t displace)
+ const ssize_t displace,ExceptionInfo *exception)
{
CacheView
*image_view;
- ExceptionInfo
- *exception;
-
MagickBooleanType
status;
if (image->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
if (image->storage_class == DirectClass)
- (void) SetImageType(image,PaletteType);
+ (void) SetImageType(image,PaletteType,exception);
status=MagickTrue;
- exception=(&image->exception);
- image_view=AcquireCacheView(image);
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(dynamic,4) shared(status)
+ image_view=AcquireAuthenticCacheView(image,exception);
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+ #pragma omp parallel for schedule(static,4) shared(status) \
+ dynamic_number_threads(image->columns,image->rows,1)
#endif
for (y=0; y < (ssize_t) image->rows; y++)
{
if (status == MagickFalse)
continue;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
- if (q == (const Quantum *) NULL)
+ if (q == (Quantum *) NULL)
{
status=MagickFalse;
continue;
if (index < 0)
index+=(ssize_t) image->colors;
SetPixelIndex(image,(Quantum) index,q);
- SetPixelPacket(image,image->colormap+(ssize_t) index,q);
+ SetPixelInfoPixel(image,image->colormap+(ssize_t) index,q);
q+=GetPixelChannels(image);
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
%
% The format of the SortColormapByIntensity method is:
%
-% MagickBooleanType SortColormapByIntensity(Image *image)
+% MagickBooleanType SortColormapByIntensity(Image *image,
+% ExceptionInfo *exception)
%
% A description of each parameter follows:
%
% o image: A pointer to an Image structure.
%
+% o exception: return any errors or warnings in this structure.
+%
*/
#if defined(__cplusplus) || defined(c_plusplus)
static int IntensityCompare(const void *x,const void *y)
{
- const PixelPacket
+ const PixelInfo
*color_1,
*color_2;
int
intensity;
- color_1=(const PixelPacket *) x;
- color_2=(const PixelPacket *) y;
- intensity=(int) GetPixelPacketIntensity(color_2)-(int)
- GetPixelPacketIntensity(color_1);
+ color_1=(const PixelInfo *) x;
+ color_2=(const PixelInfo *) y;
+ intensity=(int) GetPixelInfoIntensity(color_2)-(int)
+ GetPixelInfoIntensity(color_1);
return(intensity);
}
}
#endif
-MagickExport MagickBooleanType SortColormapByIntensity(Image *image)
+MagickExport MagickBooleanType SortColormapByIntensity(Image *image,
+ ExceptionInfo *exception)
{
CacheView
*image_view;
- ExceptionInfo
- *exception;
-
MagickBooleanType
status;
Assign index values to colormap entries.
*/
#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(dynamic,4) shared(status)
+ #pragma omp parallel for schedule(static,4) shared(status) \
+ dynamic_number_threads(image->columns,1,1)
#endif
for (i=0; i < (ssize_t) image->colors; i++)
- image->colormap[i].alpha=(Quantum) i;
+ image->colormap[i].alpha=(double) i;
/*
Sort image colormap by decreasing color popularity.
*/
Update image colormap indexes to sorted colormap order.
*/
#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(dynamic,4) shared(status)
+ #pragma omp parallel for schedule(static,4) shared(status)
#endif
for (i=0; i < (ssize_t) image->colors; i++)
pixels[(ssize_t) image->colormap[i].alpha]=(unsigned short) i;
status=MagickTrue;
- exception=(&image->exception);
- image_view=AcquireCacheView(image);
+ image_view=AcquireAuthenticCacheView(image,exception);
for (y=0; y < (ssize_t) image->rows; y++)
{
Quantum
*restrict q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
- if (q == (const Quantum *) NULL)
+ if (q == (Quantum *) NULL)
{
status=MagickFalse;
- continue;
+ break;
}
for (x=0; x < (ssize_t) image->columns; x++)
{
index=(Quantum) pixels[(ssize_t) GetPixelIndex(image,q)];
SetPixelIndex(image,index,q);
- SetPixelPacket(image,image->colormap+(ssize_t) index,q);
+ SetPixelInfoPixel(image,image->colormap+(ssize_t) index,q);
q+=GetPixelChannels(image);
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)