% MagicCore Methods to Acquire / Destroy Quantum Pixels %
% %
% Software Design %
-% John Cristy %
+% Cristy %
% October 1998 %
% %
% %
-% Copyright 1999-2008 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2014 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 %
%
*/
-static inline size_t MagickMax(const size_t x,
- const size_t y)
+static inline size_t MagickMax(const size_t x,const size_t y)
{
if (x > y)
return(x);
if (image == (const Image *) NULL)
return(quantum_info);
status=SetQuantumDepth(image,quantum_info,image->depth);
+ quantum_info->endian=image->endian;
if (status == MagickFalse)
quantum_info=DestroyQuantumInfo(quantum_info);
return(quantum_info);
assert(quantum_info != (QuantumInfo *) NULL);
assert(quantum_info->signature == MagickSignature);
- quantum_info->number_threads=GetOpenMPMaximumThreads();
+ quantum_info->number_threads=(size_t) GetMagickResourceLimit(ThreadResource);
quantum_info->pixels=(unsigned char **) AcquireQuantumMemory(
quantum_info->number_threads,sizeof(*quantum_info->pixels));
if (quantum_info->pixels == (unsigned char **) NULL)
return(MagickFalse);
quantum_info->extent=extent;
- (void) ResetMagickMemory(quantum_info->pixels,0,
- quantum_info->number_threads*sizeof(*quantum_info->pixels));
+ (void) ResetMagickMemory(quantum_info->pixels,0,quantum_info->number_threads*
+ sizeof(*quantum_info->pixels));
for (i=0; i < (ssize_t) quantum_info->number_threads; i++)
{
quantum_info->pixels[i]=(unsigned char *) AcquireQuantumMemory(extent+1,
if (quantum_info->pixels != (unsigned char **) NULL)
DestroyQuantumPixels(quantum_info);
if (quantum_info->semaphore != (SemaphoreInfo *) NULL)
- DestroySemaphoreInfo(&quantum_info->semaphore);
+ RelinquishSemaphoreInfo(&quantum_info->semaphore);
quantum_info->signature=(~MagickSignature);
quantum_info=(QuantumInfo *) RelinquishMagickMemory(quantum_info);
return(quantum_info);
% %
% %
% %
+% G e t Q u a n t u m E n d i a n %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% GetQuantumEndian() returns the quantum endian of the image.
+%
+% The endian of the GetQuantumEndian method is:
+%
+% EndianType GetQuantumEndian(const QuantumInfo *quantum_info)
+%
+% A description of each parameter follows:
+%
+% o quantum_info: the quantum info.
+%
+*/
+MagickExport EndianType GetQuantumEndian(const QuantumInfo *quantum_info)
+{
+ assert(quantum_info != (QuantumInfo *) NULL);
+ assert(quantum_info->signature == MagickSignature);
+ return(quantum_info->endian);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
% G e t Q u a n t u m F o r m a t %
% %
% %
quantum_info->maximum=1.0;
quantum_info->scale=QuantumRange;
quantum_info->pack=MagickTrue;
- quantum_info->semaphore=AllocateSemaphoreInfo();
+ quantum_info->semaphore=AcquireSemaphoreInfo();
quantum_info->signature=MagickSignature;
if (image_info == (const ImageInfo *) NULL)
return;
else
if (quantum_info->minimum == quantum_info->maximum)
{
- quantum_info->scale=(MagickRealType) QuantumRange/quantum_info->minimum;
+ quantum_info->scale=(double) QuantumRange/quantum_info->minimum;
quantum_info->minimum=0.0;
}
else
- quantum_info->scale=(MagickRealType) QuantumRange/(quantum_info->maximum-
+ quantum_info->scale=(double) QuantumRange/(quantum_info->maximum-
quantum_info->minimum);
option=GetImageOption(image_info,"quantum:scale");
if (option != (char *) NULL)
if (option != (char *) NULL)
quantum_info->min_is_white=LocaleCompare(option,"min-is-white") == 0 ?
MagickTrue : MagickFalse;
+ quantum_info->endian=image_info->endian;
+ ResetQuantumState(quantum_info);
}
\f
/*
if (image->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
quantum_type=RGBQuantum;
- if (image->matte != MagickFalse)
+ if (image->alpha_trait == BlendPixelTrait)
quantum_type=RGBAQuantum;
if (image->colorspace == CMYKColorspace)
{
quantum_type=CMYKQuantum;
- if (image->matte != MagickFalse)
+ if (image->alpha_trait == BlendPixelTrait)
quantum_type=CMYKAQuantum;
}
if (IsImageGray(image,exception) != MagickFalse)
{
quantum_type=GrayQuantum;
- if (image->matte != MagickFalse)
+ if (image->alpha_trait == BlendPixelTrait)
quantum_type=GrayAlphaQuantum;
}
- else
- if (image->storage_class == PseudoClass)
- {
- quantum_type=IndexQuantum;
- if (image->matte != MagickFalse)
- quantum_type=IndexAlphaQuantum;
- }
+ if (image->storage_class == PseudoClass)
+ {
+ quantum_type=IndexQuantum;
+ if (image->alpha_trait == BlendPixelTrait)
+ quantum_type=IndexAlphaQuantum;
+ }
return(quantum_type);
}
\f
% %
% %
% %
++ R e s e t Q u a n t u m S t a t e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ResetQuantumState() resets the quantum state.
+%
+% The format of the ResetQuantumState method is:
+%
+% void ResetQuantumState(QuantumInfo *quantum_info)
+%
+% A description of each parameter follows:
+%
+% o quantum_info: the quantum info.
+%
+*/
+MagickPrivate void ResetQuantumState(QuantumInfo *quantum_info)
+{
+ static const unsigned int mask[32] =
+ {
+ 0x00000000U, 0x00000001U, 0x00000003U, 0x00000007U, 0x0000000fU,
+ 0x0000001fU, 0x0000003fU, 0x0000007fU, 0x000000ffU, 0x000001ffU,
+ 0x000003ffU, 0x000007ffU, 0x00000fffU, 0x00001fffU, 0x00003fffU,
+ 0x00007fffU, 0x0000ffffU, 0x0001ffffU, 0x0003ffffU, 0x0007ffffU,
+ 0x000fffffU, 0x001fffffU, 0x003fffffU, 0x007fffffU, 0x00ffffffU,
+ 0x01ffffffU, 0x03ffffffU, 0x07ffffffU, 0x0fffffffU, 0x1fffffffU,
+ 0x3fffffffU, 0x7fffffffU
+ };
+
+ assert(quantum_info != (QuantumInfo *) NULL);
+ assert(quantum_info->signature == MagickSignature);
+ quantum_info->state.inverse_scale=1.0;
+ if (fabs(quantum_info->scale) >= MagickEpsilon)
+ quantum_info->state.inverse_scale/=quantum_info->scale;
+ quantum_info->state.pixel=0U;
+ quantum_info->state.bits=0U;
+ quantum_info->state.mask=mask;
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
% S e t Q u a n t u m F o r m a t %
% %
% %
}
if (quantum_info->pixels != (unsigned char **) NULL)
DestroyQuantumPixels(quantum_info);
- status=AcquireQuantumPixels(quantum_info,(6+quantum_info->pad)*image->columns*
- ((quantum_info->depth+7)/8)); /* allow for CMYKA + RLE byte + pad */
+ status=AcquireQuantumPixels(quantum_info,(MaxPixelChannels+quantum_info->pad)*
+ image->columns*((quantum_info->depth+7)/8));
return(status);
}
\f
% %
% %
% %
+% S e t Q u a n t u m E n d i a n %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetQuantumEndian() sets the quantum endian.
+%
+% The endian of the SetQuantumEndian method is:
+%
+% MagickBooleanType SetQuantumEndian(const Image *image,
+% QuantumInfo *quantum_info,const EndianType endian)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o quantum_info: the quantum info.
+%
+% o endian: the quantum endian.
+%
+*/
+MagickExport MagickBooleanType SetQuantumEndian(const Image *image,
+ QuantumInfo *quantum_info,const EndianType endian)
+{
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ assert(quantum_info != (QuantumInfo *) NULL);
+ assert(quantum_info->signature == MagickSignature);
+ quantum_info->endian=endian;
+ return(SetQuantumDepth(image,quantum_info,quantum_info->depth));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
% S e t Q u a n t u m F o r m a t %
% %
% %