/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % QQQ U U AAA N N TTTTT U U M M % % Q Q U U A A NN N T U U MM MM % % Q Q U U AAAAA N N N T U U M M M % % Q QQ U U A A N NN T U U M M % % QQQQ UUU A A N N T UUU M M % % % % MagicCore Methods to Acquire / Destroy Quantum Pixels % % % % Software Design % % Cristy % % October 1998 % % % % % % Copyright 1999-2021 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 % % obtain a copy of the License at % % % % https://imagemagick.org/script/license.php % % % % Unless required by applicable law or agreed to in writing, software % % distributed under the License is distributed on an "AS IS" BASIS, % % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % % See the License for the specific language governing permissions and % % limitations under the License. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % */ /* Include declarations. */ #include "MagickCore/studio.h" #include "MagickCore/attribute.h" #include "MagickCore/blob.h" #include "MagickCore/blob-private.h" #include "MagickCore/color-private.h" #include "MagickCore/exception.h" #include "MagickCore/exception-private.h" #include "MagickCore/cache.h" #include "MagickCore/cache-private.h" #include "MagickCore/colorspace.h" #include "MagickCore/colorspace-private.h" #include "MagickCore/constitute.h" #include "MagickCore/delegate.h" #include "MagickCore/geometry.h" #include "MagickCore/list.h" #include "MagickCore/magick.h" #include "MagickCore/memory_.h" #include "MagickCore/memory-private.h" #include "MagickCore/monitor.h" #include "MagickCore/option.h" #include "MagickCore/pixel.h" #include "MagickCore/pixel-accessor.h" #include "MagickCore/property.h" #include "MagickCore/quantum.h" #include "MagickCore/quantum-private.h" #include "MagickCore/resource_.h" #include "MagickCore/semaphore.h" #include "MagickCore/statistic.h" #include "MagickCore/stream.h" #include "MagickCore/string_.h" #include "MagickCore/string-private.h" #include "MagickCore/thread-private.h" #include "MagickCore/utility.h" /* Define declarations. */ #define QuantumSignature 0xab /* Forward declarations. */ static void DestroyQuantumPixels(QuantumInfo *); /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % A c q u i r e Q u a n t u m I n f o % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % AcquireQuantumInfo() allocates the QuantumInfo structure. % % The format of the AcquireQuantumInfo method is: % % QuantumInfo *AcquireQuantumInfo(const ImageInfo *image_info,Image *image) % % A description of each parameter follows: % % o image_info: the image info. % % o image: the image. % */ MagickExport QuantumInfo *AcquireQuantumInfo(const ImageInfo *image_info, Image *image) { MagickBooleanType status; QuantumInfo *quantum_info; quantum_info=(QuantumInfo *) AcquireCriticalMemory(sizeof(*quantum_info)); quantum_info->signature=MagickCoreSignature; GetQuantumInfo(image_info,quantum_info); 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); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % + A c q u i r e Q u a n t u m P i x e l s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % AcquireQuantumPixels() allocates the pixel staging areas. % % The format of the AcquireQuantumPixels method is: % % MagickBooleanType AcquireQuantumPixels(QuantumInfo *quantum_info, % const size_t extent) % % A description of each parameter follows: % % o quantum_info: the quantum info. % % o extent: the quantum info. % */ static MagickBooleanType AcquireQuantumPixels(QuantumInfo *quantum_info, const size_t extent) { ssize_t i; assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->number_threads=(size_t) GetMagickResourceLimit(ThreadResource); quantum_info->pixels=(MemoryInfo **) AcquireQuantumMemory( quantum_info->number_threads,sizeof(*quantum_info->pixels)); if (quantum_info->pixels == (MemoryInfo **) NULL) return(MagickFalse); quantum_info->extent=extent; (void) memset(quantum_info->pixels,0,quantum_info->number_threads* sizeof(*quantum_info->pixels)); for (i=0; i < (ssize_t) quantum_info->number_threads; i++) { unsigned char *pixels; quantum_info->pixels[i]=AcquireVirtualMemory(extent+1,sizeof(*pixels)); if (quantum_info->pixels[i] == (MemoryInfo *) NULL) { DestroyQuantumPixels(quantum_info); return(MagickFalse); } pixels=(unsigned char *) GetVirtualMemoryBlob(quantum_info->pixels[i]); (void) memset(pixels,0,(extent+1)*sizeof(*pixels)); pixels[extent]=QuantumSignature; } return(MagickTrue); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % D e s t r o y Q u a n t u m I n f o % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DestroyQuantumInfo() deallocates memory associated with the QuantumInfo % structure. % % The format of the DestroyQuantumInfo method is: % % QuantumInfo *DestroyQuantumInfo(QuantumInfo *quantum_info) % % A description of each parameter follows: % % o quantum_info: the quantum info. % */ MagickExport QuantumInfo *DestroyQuantumInfo(QuantumInfo *quantum_info) { assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); if (quantum_info->pixels != (MemoryInfo **) NULL) DestroyQuantumPixels(quantum_info); if (quantum_info->semaphore != (SemaphoreInfo *) NULL) RelinquishSemaphoreInfo(&quantum_info->semaphore); quantum_info->signature=(~MagickCoreSignature); quantum_info=(QuantumInfo *) RelinquishMagickMemory(quantum_info); return(quantum_info); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % + D e s t r o y Q u a n t u m P i x e l s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DestroyQuantumPixels() destroys the quantum pixels. % % The format of the DestroyQuantumPixels() method is: % % void DestroyQuantumPixels(QuantumInfo *quantum_info) % % A description of each parameter follows: % % o quantum_info: the quantum info. % */ static void DestroyQuantumPixels(QuantumInfo *quantum_info) { ssize_t i; ssize_t extent; assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); assert(quantum_info->pixels != (MemoryInfo **) NULL); extent=(ssize_t) quantum_info->extent; for (i=0; i < (ssize_t) quantum_info->number_threads; i++) if (quantum_info->pixels[i] != (MemoryInfo *) NULL) { unsigned char *pixels; /* Did we overrun our quantum buffer? */ pixels=(unsigned char *) GetVirtualMemoryBlob(quantum_info->pixels[i]); assert(pixels[extent] == QuantumSignature); quantum_info->pixels[i]=RelinquishVirtualMemory( quantum_info->pixels[i]); } quantum_info->pixels=(MemoryInfo **) RelinquishMagickMemory( quantum_info->pixels); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t Q u a n t u m E x t e n t % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetQuantumExtent() returns the quantum pixel buffer extent. % % The format of the GetQuantumExtent method is: % % size_t GetQuantumExtent(Image *image,const QuantumInfo *quantum_info, % const QuantumType quantum_type) % % A description of each parameter follows: % % o image: the image. % % o quantum_info: the quantum info. % % o quantum_type: Declare which pixel components to transfer (red, green, % blue, opacity, RGB, or RGBA). % */ MagickExport size_t GetQuantumExtent(const Image *image, const QuantumInfo *quantum_info,const QuantumType quantum_type) { size_t packet_size; assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); packet_size=1; switch (quantum_type) { case GrayAlphaQuantum: packet_size=2; break; case IndexAlphaQuantum: packet_size=2; break; case RGBQuantum: packet_size=3; break; case BGRQuantum: packet_size=3; break; case RGBAQuantum: packet_size=4; break; case RGBOQuantum: packet_size=4; break; case BGRAQuantum: packet_size=4; break; case CMYKQuantum: packet_size=4; break; case CMYKAQuantum: packet_size=5; break; case CbYCrAQuantum: packet_size=4; break; case CbYCrQuantum: packet_size=3; break; case CbYCrYQuantum: packet_size=4; break; default: break; } if (quantum_info->pack == MagickFalse) return((size_t) (packet_size*image->columns*((quantum_info->depth+7)/8))); return((size_t) ((packet_size*image->columns*quantum_info->depth+7)/8)); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % 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 == MagickCoreSignature); return(quantum_info->endian); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t Q u a n t u m F o r m a t % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetQuantumFormat() returns the quantum format of the image. % % The format of the GetQuantumFormat method is: % % QuantumFormatType GetQuantumFormat(const QuantumInfo *quantum_info) % % A description of each parameter follows: % % o quantum_info: the quantum info. % */ MagickExport QuantumFormatType GetQuantumFormat(const QuantumInfo *quantum_info) { assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); return(quantum_info->format); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t Q u a n t u m I n f o % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetQuantumInfo() initializes the QuantumInfo structure to default values. % % The format of the GetQuantumInfo method is: % % GetQuantumInfo(const ImageInfo *image_info,QuantumInfo *quantum_info) % % A description of each parameter follows: % % o image_info: the image info. % % o quantum_info: the quantum info. % */ MagickExport void GetQuantumInfo(const ImageInfo *image_info, QuantumInfo *quantum_info) { const char *option; assert(quantum_info != (QuantumInfo *) NULL); (void) memset(quantum_info,0,sizeof(*quantum_info)); quantum_info->quantum=8; quantum_info->maximum=1.0; quantum_info->scale=QuantumRange; quantum_info->pack=MagickTrue; quantum_info->semaphore=AcquireSemaphoreInfo(); quantum_info->signature=MagickCoreSignature; if (image_info == (const ImageInfo *) NULL) return; option=GetImageOption(image_info,"quantum:format"); if (option != (char *) NULL) quantum_info->format=(QuantumFormatType) ParseCommandOption( MagickQuantumFormatOptions,MagickFalse,option); option=GetImageOption(image_info,"quantum:minimum"); if (option != (char *) NULL) quantum_info->minimum=StringToDouble(option,(char **) NULL); option=GetImageOption(image_info,"quantum:maximum"); if (option != (char *) NULL) quantum_info->maximum=StringToDouble(option,(char **) NULL); if ((quantum_info->minimum == 0.0) && (quantum_info->maximum == 0.0)) quantum_info->scale=0.0; else if (quantum_info->minimum == quantum_info->maximum) { quantum_info->scale=(double) QuantumRange/quantum_info->minimum; quantum_info->minimum=0.0; } else quantum_info->scale=(double) QuantumRange/(quantum_info->maximum- quantum_info->minimum); option=GetImageOption(image_info,"quantum:scale"); if (option != (char *) NULL) quantum_info->scale=StringToDouble(option,(char **) NULL); option=GetImageOption(image_info,"quantum:polarity"); 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); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t Q u a n t u m P i x e l s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetQuantumPixels() returns the quantum pixels. % % The format of the GetQuantumPixels method is: % % unsigned char *QuantumPixels GetQuantumPixels( % const QuantumInfo *quantum_info) % % A description of each parameter follows: % % o image: the image. % */ MagickExport unsigned char *GetQuantumPixels(const QuantumInfo *quantum_info) { const int id = GetOpenMPThreadId(); assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); return((unsigned char *) GetVirtualMemoryBlob(quantum_info->pixels[id])); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t Q u a n t u m T y p e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetQuantumType() returns the quantum type of the image. % % The format of the GetQuantumType method is: % % QuantumType GetQuantumType(Image *image,ExceptionInfo *exception) % % A description of each parameter follows: % % o image: the image. % % o exception: return any errors or warnings in this structure. % */ MagickExport QuantumType GetQuantumType(Image *image,ExceptionInfo *exception) { QuantumType quantum_type; assert(image != (Image *) NULL); assert(image->signature == MagickCoreSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); (void) exception; quantum_type=RGBQuantum; if (image->alpha_trait != UndefinedPixelTrait) quantum_type=RGBAQuantum; if (image->colorspace == CMYKColorspace) { quantum_type=CMYKQuantum; if (image->alpha_trait != UndefinedPixelTrait) quantum_type=CMYKAQuantum; } if (IsGrayColorspace(image->colorspace) != MagickFalse) { quantum_type=GrayQuantum; if (image->alpha_trait != UndefinedPixelTrait) quantum_type=GrayAlphaQuantum; } if (image->storage_class == PseudoClass) { quantum_type=IndexQuantum; if (image->alpha_trait != UndefinedPixelTrait) quantum_type=IndexAlphaQuantum; } return(quantum_type); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % + 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 == MagickCoreSignature); 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; } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t Q u a n t u m F o r m a t % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetQuantumAlphaType() sets the quantum format. % % The format of the SetQuantumAlphaType method is: % % void SetQuantumAlphaType(QuantumInfo *quantum_info, % const QuantumAlphaType type) % % A description of each parameter follows: % % o quantum_info: the quantum info. % % o type: the alpha type (e.g. associate). % */ MagickExport void SetQuantumAlphaType(QuantumInfo *quantum_info, const QuantumAlphaType type) { assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->alpha_type=type; } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t Q u a n t u m D e p t h % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetQuantumDepth() sets the quantum depth. % % The format of the SetQuantumDepth method is: % % MagickBooleanType SetQuantumDepth(const Image *image, % QuantumInfo *quantum_info,const size_t depth) % % A description of each parameter follows: % % o image: the image. % % o quantum_info: the quantum info. % % o depth: the quantum depth. % */ MagickExport MagickBooleanType SetQuantumDepth(const Image *image, QuantumInfo *quantum_info,const size_t depth) { size_t extent, quantum; /* Allocate the quantum pixel buffer. */ assert(image != (Image *) NULL); assert(image->signature == MagickCoreSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->depth=MagickMin(depth,64); if (quantum_info->format == FloatingPointQuantumFormat) { if (quantum_info->depth > 32) quantum_info->depth=64; else if (quantum_info->depth > 24) quantum_info->depth=32; else if (quantum_info->depth > 16) quantum_info->depth=24; else quantum_info->depth=16; } if (quantum_info->pixels != (MemoryInfo **) NULL) DestroyQuantumPixels(quantum_info); quantum=(quantum_info->pad+MaxPixelChannels)*(quantum_info->depth+7)/8; extent=MagickMax(image->columns,image->rows)*quantum; if ((MagickMax(image->columns,image->rows) != 0) && (quantum != (extent/MagickMax(image->columns,image->rows)))) return(MagickFalse); return(AcquireQuantumPixels(quantum_info,extent)); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % 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 == MagickCoreSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->endian=endian; return(SetQuantumDepth(image,quantum_info,quantum_info->depth)); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t Q u a n t u m F o r m a t % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetQuantumFormat() sets the quantum format. % % The format of the SetQuantumFormat method is: % % MagickBooleanType SetQuantumFormat(const Image *image, % QuantumInfo *quantum_info,const QuantumFormatType format) % % A description of each parameter follows: % % o image: the image. % % o quantum_info: the quantum info. % % o format: the quantum format. % */ MagickExport MagickBooleanType SetQuantumFormat(const Image *image, QuantumInfo *quantum_info,const QuantumFormatType format) { assert(image != (Image *) NULL); assert(image->signature == MagickCoreSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->format=format; return(SetQuantumDepth(image,quantum_info,quantum_info->depth)); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t Q u a n t u m I m a g e T y p e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetQuantumImageType() sets the image type based on the quantum type. % % The format of the SetQuantumImageType method is: % % void ImageType SetQuantumImageType(Image *image, % const QuantumType quantum_type) % % A description of each parameter follows: % % o image: the image. % % o quantum_type: Declare which pixel components to transfer (red, green, % blue, opacity, RGB, or RGBA). % */ MagickExport void SetQuantumImageType(Image *image, const QuantumType quantum_type) { assert(image != (Image *) NULL); assert(image->signature == MagickCoreSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); switch (quantum_type) { case IndexQuantum: case IndexAlphaQuantum: { image->type=PaletteType; break; } case GrayQuantum: case GrayAlphaQuantum: { image->type=GrayscaleType; if (image->depth == 1) image->type=BilevelType; break; } case CyanQuantum: case MagentaQuantum: case YellowQuantum: case BlackQuantum: case CMYKQuantum: case CMYKAQuantum: { image->type=ColorSeparationType; break; } default: { image->type=TrueColorType; break; } } } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t Q u a n t u m P a c k % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetQuantumPack() sets the quantum pack flag. % % The format of the SetQuantumPack method is: % % void SetQuantumPack(QuantumInfo *quantum_info, % const MagickBooleanType pack) % % A description of each parameter follows: % % o quantum_info: the quantum info. % % o pack: the pack flag. % */ MagickExport void SetQuantumPack(QuantumInfo *quantum_info, const MagickBooleanType pack) { assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->pack=pack; } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t Q u a n t u m P a d % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetQuantumPad() sets the quantum pad. % % The format of the SetQuantumPad method is: % % MagickBooleanType SetQuantumPad(const Image *image, % QuantumInfo *quantum_info,const size_t pad) % % A description of each parameter follows: % % o image: the image. % % o quantum_info: the quantum info. % % o pad: the quantum pad. % */ MagickExport MagickBooleanType SetQuantumPad(const Image *image, QuantumInfo *quantum_info,const size_t pad) { assert(image != (Image *) NULL); assert(image->signature == MagickCoreSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->pad=pad; return(SetQuantumDepth(image,quantum_info,quantum_info->depth)); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t Q u a n t u m M i n I s W h i t e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetQuantumMinIsWhite() sets the quantum min-is-white flag. % % The format of the SetQuantumMinIsWhite method is: % % void SetQuantumMinIsWhite(QuantumInfo *quantum_info, % const MagickBooleanType min_is_white) % % A description of each parameter follows: % % o quantum_info: the quantum info. % % o min_is_white: the min-is-white flag. % */ MagickExport void SetQuantumMinIsWhite(QuantumInfo *quantum_info, const MagickBooleanType min_is_white) { assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->min_is_white=min_is_white; } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t Q u a n t u m Q u a n t u m % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetQuantumQuantum() sets the quantum quantum. % % The format of the SetQuantumQuantum method is: % % void SetQuantumQuantum(QuantumInfo *quantum_info, % const size_t quantum) % % A description of each parameter follows: % % o quantum_info: the quantum info. % % o quantum: the quantum quantum. % */ MagickExport void SetQuantumQuantum(QuantumInfo *quantum_info, const size_t quantum) { assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->quantum=quantum; } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % S e t Q u a n t u m S c a l e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % SetQuantumScale() sets the quantum scale. % % The format of the SetQuantumScale method is: % % void SetQuantumScale(QuantumInfo *quantum_info,const double scale) % % A description of each parameter follows: % % o quantum_info: the quantum info. % % o scale: the quantum scale. % */ MagickExport void SetQuantumScale(QuantumInfo *quantum_info,const double scale) { assert(quantum_info != (QuantumInfo *) NULL); assert(quantum_info->signature == MagickCoreSignature); quantum_info->scale=scale; }