2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % QQQ U U AAA N N TTTTT U U M M %
7 % Q Q U U A A NN N T U U MM MM %
8 % Q Q U U AAAAA N N N T U U M M M %
9 % Q QQ U U A A N NN T U U M M %
10 % QQQQ UUU A A N N T UUU M M %
12 % MagicCore Methods to Acquire / Destroy Quantum Pixels %
19 % Copyright 1999-2008 ImageMagick Studio LLC, a non-profit organization %
20 % dedicated to making software imaging solutions freely available. %
22 % You may not use this file except in compliance with the License. You may %
23 % obtain a copy of the License at %
25 % http://www.imagemagick.org/script/license.php %
27 % Unless required by applicable law or agreed to in writing, software %
28 % distributed under the License is distributed on an "AS IS" BASIS, %
29 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
30 % See the License for the specific language governing permissions and %
31 % limitations under the License. %
33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41 #include "MagickCore/studio.h"
42 #include "MagickCore/attribute.h"
43 #include "MagickCore/blob.h"
44 #include "MagickCore/blob-private.h"
45 #include "MagickCore/color-private.h"
46 #include "MagickCore/exception.h"
47 #include "MagickCore/exception-private.h"
48 #include "MagickCore/cache.h"
49 #include "MagickCore/constitute.h"
50 #include "MagickCore/delegate.h"
51 #include "MagickCore/geometry.h"
52 #include "MagickCore/list.h"
53 #include "MagickCore/magick.h"
54 #include "MagickCore/memory_.h"
55 #include "MagickCore/monitor.h"
56 #include "MagickCore/option.h"
57 #include "MagickCore/pixel.h"
58 #include "MagickCore/pixel-accessor.h"
59 #include "MagickCore/property.h"
60 #include "MagickCore/quantum.h"
61 #include "MagickCore/quantum-private.h"
62 #include "MagickCore/resource_.h"
63 #include "MagickCore/semaphore.h"
64 #include "MagickCore/statistic.h"
65 #include "MagickCore/stream.h"
66 #include "MagickCore/string_.h"
67 #include "MagickCore/string-private.h"
68 #include "MagickCore/thread-private.h"
69 #include "MagickCore/utility.h"
74 #define QuantumSignature 0xab
80 DestroyQuantumPixels(QuantumInfo *);
83 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87 % A c q u i r e Q u a n t u m I n f o %
91 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
93 % AcquireQuantumInfo() allocates the QuantumInfo structure.
95 % The format of the AcquireQuantumInfo method is:
97 % QuantumInfo *AcquireQuantumInfo(const ImageInfo *image_info,Image *image)
99 % A description of each parameter follows:
101 % o image_info: the image info.
103 % o image: the image.
107 static inline size_t MagickMax(const size_t x,
115 MagickExport QuantumInfo *AcquireQuantumInfo(const ImageInfo *image_info,
124 quantum_info=(QuantumInfo *) AcquireMagickMemory(sizeof(*quantum_info));
125 if (quantum_info == (QuantumInfo *) NULL)
126 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
127 quantum_info->signature=MagickSignature;
128 GetQuantumInfo(image_info,quantum_info);
129 if (image == (const Image *) NULL)
130 return(quantum_info);
131 status=SetQuantumDepth(image,quantum_info,image->depth);
132 if (status == MagickFalse)
133 quantum_info=DestroyQuantumInfo(quantum_info);
134 return(quantum_info);
138 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
142 + A c q u i r e Q u a n t u m P i x e l s %
146 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
148 % AcquireQuantumPixels() allocates the unsigned char structure.
150 % The format of the AcquireQuantumPixels method is:
152 % MagickBooleanType AcquireQuantumPixels(QuantumInfo *quantum_info,
153 % const size_t extent)
155 % A description of each parameter follows:
157 % o quantum_info: the quantum info.
159 % o extent: the quantum info.
162 static MagickBooleanType AcquireQuantumPixels(QuantumInfo *quantum_info,
168 assert(quantum_info != (QuantumInfo *) NULL);
169 assert(quantum_info->signature == MagickSignature);
170 quantum_info->number_threads=GetOpenMPMaximumThreads();
171 quantum_info->pixels=(unsigned char **) AcquireQuantumMemory(
172 quantum_info->number_threads,sizeof(*quantum_info->pixels));
173 if (quantum_info->pixels == (unsigned char **) NULL)
175 quantum_info->extent=extent;
176 (void) ResetMagickMemory(quantum_info->pixels,0,
177 quantum_info->number_threads*sizeof(*quantum_info->pixels));
178 for (i=0; i < (ssize_t) quantum_info->number_threads; i++)
180 quantum_info->pixels[i]=(unsigned char *) AcquireQuantumMemory(extent+1,
181 sizeof(**quantum_info->pixels));
182 if (quantum_info->pixels[i] == (unsigned char *) NULL)
184 (void) ResetMagickMemory(quantum_info->pixels[i],0,(extent+1)*
185 sizeof(**quantum_info->pixels));
186 quantum_info->pixels[i][extent]=QuantumSignature;
192 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
196 % D e s t r o y Q u a n t u m I n f o %
200 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
202 % DestroyQuantumInfo() deallocates memory associated with the QuantumInfo
205 % The format of the DestroyQuantumInfo method is:
207 % QuantumInfo *DestroyQuantumInfo(QuantumInfo *quantum_info)
209 % A description of each parameter follows:
211 % o quantum_info: the quantum info.
214 MagickExport QuantumInfo *DestroyQuantumInfo(QuantumInfo *quantum_info)
216 assert(quantum_info != (QuantumInfo *) NULL);
217 assert(quantum_info->signature == MagickSignature);
218 if (quantum_info->pixels != (unsigned char **) NULL)
219 DestroyQuantumPixels(quantum_info);
220 if (quantum_info->semaphore != (SemaphoreInfo *) NULL)
221 DestroySemaphoreInfo(&quantum_info->semaphore);
222 quantum_info->signature=(~MagickSignature);
223 quantum_info=(QuantumInfo *) RelinquishMagickMemory(quantum_info);
224 return(quantum_info);
228 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
232 + D e s t r o y Q u a n t u m P i x e l s %
236 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
238 % DestroyQuantumPixels() destroys the quantum pixels.
240 % The format of the DestroyQuantumPixels() method is:
242 % void DestroyQuantumPixels(QuantumInfo *quantum_info)
244 % A description of each parameter follows:
246 % o quantum_info: the quantum info.
249 static void DestroyQuantumPixels(QuantumInfo *quantum_info)
257 assert(quantum_info != (QuantumInfo *) NULL);
258 assert(quantum_info->signature == MagickSignature);
259 assert(quantum_info->pixels != (unsigned char **) NULL);
260 extent=(ssize_t) quantum_info->extent;
261 for (i=0; i < (ssize_t) quantum_info->number_threads; i++)
262 if (quantum_info->pixels[i] != (unsigned char *) NULL)
265 Did we overrun our quantum buffer?
267 assert(quantum_info->pixels[i][extent] == QuantumSignature);
268 quantum_info->pixels[i]=(unsigned char *) RelinquishMagickMemory(
269 quantum_info->pixels[i]);
271 quantum_info->pixels=(unsigned char **) RelinquishMagickMemory(
272 quantum_info->pixels);
276 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280 % G e t Q u a n t u m E x t e n t %
284 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
286 % GetQuantumExtent() returns the quantum pixel buffer extent.
288 % The format of the GetQuantumExtent method is:
290 % size_t GetQuantumExtent(Image *image,const QuantumInfo *quantum_info,
291 % const QuantumType quantum_type)
293 % A description of each parameter follows:
295 % o image: the image.
297 % o quantum_info: the quantum info.
299 % o quantum_type: Declare which pixel components to transfer (red, green,
300 % blue, opacity, RGB, or RGBA).
303 MagickExport size_t GetQuantumExtent(const Image *image,
304 const QuantumInfo *quantum_info,const QuantumType quantum_type)
309 assert(quantum_info != (QuantumInfo *) NULL);
310 assert(quantum_info->signature == MagickSignature);
312 switch (quantum_type)
314 case GrayAlphaQuantum: packet_size=2; break;
315 case IndexAlphaQuantum: packet_size=2; break;
316 case RGBQuantum: packet_size=3; break;
317 case BGRQuantum: packet_size=3; break;
318 case RGBAQuantum: packet_size=4; break;
319 case RGBOQuantum: packet_size=4; break;
320 case BGRAQuantum: packet_size=4; break;
321 case CMYKQuantum: packet_size=4; break;
322 case CMYKAQuantum: packet_size=5; break;
325 if (quantum_info->pack == MagickFalse)
326 return((size_t) (packet_size*image->columns*((quantum_info->depth+7)/8)));
327 return((size_t) ((packet_size*image->columns*quantum_info->depth+7)/8));
331 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
335 % G e t Q u a n t u m F o r m a t %
339 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
341 % GetQuantumFormat() returns the quantum format of the image.
343 % The format of the GetQuantumFormat method is:
345 % QuantumFormatType GetQuantumFormat(const QuantumInfo *quantum_info)
347 % A description of each parameter follows:
349 % o quantum_info: the quantum info.
352 MagickExport QuantumFormatType GetQuantumFormat(const QuantumInfo *quantum_info)
354 assert(quantum_info != (QuantumInfo *) NULL);
355 assert(quantum_info->signature == MagickSignature);
356 return(quantum_info->format);
360 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
364 % G e t Q u a n t u m I n f o %
368 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
370 % GetQuantumInfo() initializes the QuantumInfo structure to default values.
372 % The format of the GetQuantumInfo method is:
374 % GetQuantumInfo(const ImageInfo *image_info,QuantumInfo *quantum_info)
376 % A description of each parameter follows:
378 % o image_info: the image info.
380 % o quantum_info: the quantum info.
383 MagickExport void GetQuantumInfo(const ImageInfo *image_info,
384 QuantumInfo *quantum_info)
389 assert(quantum_info != (QuantumInfo *) NULL);
390 (void) ResetMagickMemory(quantum_info,0,sizeof(*quantum_info));
391 quantum_info->quantum=8;
392 quantum_info->maximum=1.0;
393 quantum_info->scale=QuantumRange;
394 quantum_info->pack=MagickTrue;
395 quantum_info->semaphore=AllocateSemaphoreInfo();
396 quantum_info->signature=MagickSignature;
397 if (image_info == (const ImageInfo *) NULL)
399 option=GetImageOption(image_info,"quantum:format");
400 if (option != (char *) NULL)
401 quantum_info->format=(QuantumFormatType) ParseCommandOption(
402 MagickQuantumFormatOptions,MagickFalse,option);
403 option=GetImageOption(image_info,"quantum:minimum");
404 if (option != (char *) NULL)
405 quantum_info->minimum=StringToDouble(option,(char **) NULL);
406 option=GetImageOption(image_info,"quantum:maximum");
407 if (option != (char *) NULL)
408 quantum_info->maximum=StringToDouble(option,(char **) NULL);
409 if ((quantum_info->minimum == 0.0) && (quantum_info->maximum == 0.0))
410 quantum_info->scale=0.0;
412 if (quantum_info->minimum == quantum_info->maximum)
414 quantum_info->scale=(MagickRealType) QuantumRange/quantum_info->minimum;
415 quantum_info->minimum=0.0;
418 quantum_info->scale=(MagickRealType) QuantumRange/(quantum_info->maximum-
419 quantum_info->minimum);
420 option=GetImageOption(image_info,"quantum:scale");
421 if (option != (char *) NULL)
422 quantum_info->scale=StringToDouble(option,(char **) NULL);
423 option=GetImageOption(image_info,"quantum:polarity");
424 if (option != (char *) NULL)
425 quantum_info->min_is_white=LocaleCompare(option,"min-is-white") == 0 ?
426 MagickTrue : MagickFalse;
427 quantum_info->endian=image_info->endian;
428 ResetQuantumState(quantum_info);
432 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
436 % G e t Q u a n t u m P i x e l s %
440 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
442 % GetQuantumPixels() returns the quantum pixels.
444 % The format of the GetQuantumPixels method is:
446 % unsigned char *QuantumPixels GetQuantumPixels(
447 % const QuantumInfo *quantum_info)
449 % A description of each parameter follows:
451 % o image: the image.
454 MagickExport unsigned char *GetQuantumPixels(const QuantumInfo *quantum_info)
457 id = GetOpenMPThreadId();
459 assert(quantum_info != (QuantumInfo *) NULL);
460 assert(quantum_info->signature == MagickSignature);
461 return(quantum_info->pixels[id]);
465 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
469 % G e t Q u a n t u m T y p e %
473 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
475 % GetQuantumType() returns the quantum type of the image.
477 % The format of the GetQuantumType method is:
479 % QuantumType GetQuantumType(Image *image,ExceptionInfo *exception)
481 % A description of each parameter follows:
483 % o image: the image.
486 MagickExport QuantumType GetQuantumType(Image *image,ExceptionInfo *exception)
491 assert(image != (Image *) NULL);
492 assert(image->signature == MagickSignature);
493 if (image->debug != MagickFalse)
494 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
495 quantum_type=RGBQuantum;
496 if (image->matte != MagickFalse)
497 quantum_type=RGBAQuantum;
498 if (image->colorspace == CMYKColorspace)
500 quantum_type=CMYKQuantum;
501 if (image->matte != MagickFalse)
502 quantum_type=CMYKAQuantum;
504 if (IsImageGray(image,exception) != MagickFalse)
506 quantum_type=GrayQuantum;
507 if (image->matte != MagickFalse)
508 quantum_type=GrayAlphaQuantum;
511 if (image->storage_class == PseudoClass)
513 quantum_type=IndexQuantum;
514 if (image->matte != MagickFalse)
515 quantum_type=IndexAlphaQuantum;
517 return(quantum_type);
521 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
525 + R e s e t Q u a n t u m S t a t e %
529 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
531 % ResetQuantumState() resets the quantum state.
533 % The format of the ResetQuantumState method is:
535 % void ResetQuantumState(QuantumInfo *quantum_info)
537 % A description of each parameter follows:
539 % o quantum_info: the quantum info.
542 MagickPrivate void ResetQuantumState(QuantumInfo *quantum_info)
544 static const unsigned int mask[32] =
546 0x00000000U, 0x00000001U, 0x00000003U, 0x00000007U, 0x0000000fU,
547 0x0000001fU, 0x0000003fU, 0x0000007fU, 0x000000ffU, 0x000001ffU,
548 0x000003ffU, 0x000007ffU, 0x00000fffU, 0x00001fffU, 0x00003fffU,
549 0x00007fffU, 0x0000ffffU, 0x0001ffffU, 0x0003ffffU, 0x0007ffffU,
550 0x000fffffU, 0x001fffffU, 0x003fffffU, 0x007fffffU, 0x00ffffffU,
551 0x01ffffffU, 0x03ffffffU, 0x07ffffffU, 0x0fffffffU, 0x1fffffffU,
552 0x3fffffffU, 0x7fffffffU
555 assert(quantum_info != (QuantumInfo *) NULL);
556 assert(quantum_info->signature == MagickSignature);
557 quantum_info->state.inverse_scale=1.0;
558 if (fabs(quantum_info->scale) >= MagickEpsilon)
559 quantum_info->state.inverse_scale/=quantum_info->scale;
560 quantum_info->state.pixel=0U;
561 quantum_info->state.bits=0U;
562 quantum_info->state.mask=mask;
566 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
570 % S e t Q u a n t u m F o r m a t %
574 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
576 % SetQuantumAlphaType() sets the quantum format.
578 % The format of the SetQuantumAlphaType method is:
580 % void SetQuantumAlphaType(QuantumInfo *quantum_info,
581 % const QuantumAlphaType type)
583 % A description of each parameter follows:
585 % o quantum_info: the quantum info.
587 % o type: the alpha type (e.g. associate).
590 MagickExport void SetQuantumAlphaType(QuantumInfo *quantum_info,
591 const QuantumAlphaType type)
593 assert(quantum_info != (QuantumInfo *) NULL);
594 assert(quantum_info->signature == MagickSignature);
595 quantum_info->alpha_type=type;
599 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
603 % S e t Q u a n t u m D e p t h %
607 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
609 % SetQuantumDepth() sets the quantum depth.
611 % The format of the SetQuantumDepth method is:
613 % MagickBooleanType SetQuantumDepth(const Image *image,
614 % QuantumInfo *quantum_info,const size_t depth)
616 % A description of each parameter follows:
618 % o image: the image.
620 % o quantum_info: the quantum info.
622 % o depth: the quantum depth.
625 MagickExport MagickBooleanType SetQuantumDepth(const Image *image,
626 QuantumInfo *quantum_info,const size_t depth)
632 Allocate the quantum pixel buffer.
634 assert(image != (Image *) NULL);
635 assert(image->signature == MagickSignature);
636 if (image->debug != MagickFalse)
637 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
638 assert(quantum_info != (QuantumInfo *) NULL);
639 assert(quantum_info->signature == MagickSignature);
640 quantum_info->depth=depth;
641 if (quantum_info->format == FloatingPointQuantumFormat)
643 if (quantum_info->depth > 32)
644 quantum_info->depth=64;
646 if (quantum_info->depth > 16)
647 quantum_info->depth=32;
649 quantum_info->depth=16;
651 if (quantum_info->pixels != (unsigned char **) NULL)
652 DestroyQuantumPixels(quantum_info);
653 status=AcquireQuantumPixels(quantum_info,(6+quantum_info->pad)*image->columns*
654 ((quantum_info->depth+7)/8)); /* allow for CMYKA + RLE byte + pad */
659 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
663 % S e t Q u a n t u m F o r m a t %
667 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
669 % SetQuantumFormat() sets the quantum format.
671 % The format of the SetQuantumFormat method is:
673 % MagickBooleanType SetQuantumFormat(const Image *image,
674 % QuantumInfo *quantum_info,const QuantumFormatType format)
676 % A description of each parameter follows:
678 % o image: the image.
680 % o quantum_info: the quantum info.
682 % o format: the quantum format.
685 MagickExport MagickBooleanType SetQuantumFormat(const Image *image,
686 QuantumInfo *quantum_info,const QuantumFormatType format)
688 assert(image != (Image *) NULL);
689 assert(image->signature == MagickSignature);
690 if (image->debug != MagickFalse)
691 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
692 assert(quantum_info != (QuantumInfo *) NULL);
693 assert(quantum_info->signature == MagickSignature);
694 quantum_info->format=format;
695 return(SetQuantumDepth(image,quantum_info,quantum_info->depth));
699 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
703 % S e t Q u a n t u m I m a g e T y p e %
707 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
709 % SetQuantumImageType() sets the image type based on the quantum type.
711 % The format of the SetQuantumImageType method is:
713 % void ImageType SetQuantumImageType(Image *image,
714 % const QuantumType quantum_type)
716 % A description of each parameter follows:
718 % o image: the image.
720 % o quantum_type: Declare which pixel components to transfer (red, green,
721 % blue, opacity, RGB, or RGBA).
724 MagickExport void SetQuantumImageType(Image *image,
725 const QuantumType quantum_type)
727 assert(image != (Image *) NULL);
728 assert(image->signature == MagickSignature);
729 if (image->debug != MagickFalse)
730 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
731 switch (quantum_type)
734 case IndexAlphaQuantum:
736 image->type=PaletteType;
740 case GrayAlphaQuantum:
742 image->type=GrayscaleType;
743 if (image->depth == 1)
744 image->type=BilevelType;
754 image->type=ColorSeparationType;
759 image->type=TrueColorType;
766 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
770 % S e t Q u a n t u m P a c k %
774 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
776 % SetQuantumPack() sets the quantum pack flag.
778 % The format of the SetQuantumPack method is:
780 % void SetQuantumPack(QuantumInfo *quantum_info,
781 % const MagickBooleanType pack)
783 % A description of each parameter follows:
785 % o quantum_info: the quantum info.
787 % o pack: the pack flag.
790 MagickExport void SetQuantumPack(QuantumInfo *quantum_info,
791 const MagickBooleanType pack)
793 assert(quantum_info != (QuantumInfo *) NULL);
794 assert(quantum_info->signature == MagickSignature);
795 quantum_info->pack=pack;
800 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
804 % S e t Q u a n t u m P a d %
808 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
810 % SetQuantumPad() sets the quantum pad.
812 % The format of the SetQuantumPad method is:
814 % MagickBooleanType SetQuantumPad(const Image *image,
815 % QuantumInfo *quantum_info,const size_t pad)
817 % A description of each parameter follows:
819 % o image: the image.
821 % o quantum_info: the quantum info.
823 % o pad: the quantum pad.
826 MagickExport MagickBooleanType SetQuantumPad(const Image *image,
827 QuantumInfo *quantum_info,const size_t pad)
829 assert(image != (Image *) NULL);
830 assert(image->signature == MagickSignature);
831 if (image->debug != MagickFalse)
832 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
833 assert(quantum_info != (QuantumInfo *) NULL);
834 assert(quantum_info->signature == MagickSignature);
835 quantum_info->pad=pad;
836 return(SetQuantumDepth(image,quantum_info,quantum_info->depth));
840 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
844 % S e t Q u a n t u m M i n I s W h i t e %
848 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
850 % SetQuantumMinIsWhite() sets the quantum min-is-white flag.
852 % The format of the SetQuantumMinIsWhite method is:
854 % void SetQuantumMinIsWhite(QuantumInfo *quantum_info,
855 % const MagickBooleanType min_is_white)
857 % A description of each parameter follows:
859 % o quantum_info: the quantum info.
861 % o min_is_white: the min-is-white flag.
864 MagickExport void SetQuantumMinIsWhite(QuantumInfo *quantum_info,
865 const MagickBooleanType min_is_white)
867 assert(quantum_info != (QuantumInfo *) NULL);
868 assert(quantum_info->signature == MagickSignature);
869 quantum_info->min_is_white=min_is_white;
873 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
877 % S e t Q u a n t u m Q u a n t u m %
881 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
883 % SetQuantumQuantum() sets the quantum quantum.
885 % The format of the SetQuantumQuantum method is:
887 % void SetQuantumQuantum(QuantumInfo *quantum_info,
888 % const size_t quantum)
890 % A description of each parameter follows:
892 % o quantum_info: the quantum info.
894 % o quantum: the quantum quantum.
897 MagickExport void SetQuantumQuantum(QuantumInfo *quantum_info,
898 const size_t quantum)
900 assert(quantum_info != (QuantumInfo *) NULL);
901 assert(quantum_info->signature == MagickSignature);
902 quantum_info->quantum=quantum;
906 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
910 % S e t Q u a n t u m S c a l e %
914 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
916 % SetQuantumScale() sets the quantum scale.
918 % The format of the SetQuantumScale method is:
920 % void SetQuantumScale(QuantumInfo *quantum_info,const double scale)
922 % A description of each parameter follows:
924 % o quantum_info: the quantum info.
926 % o scale: the quantum scale.
929 MagickExport void SetQuantumScale(QuantumInfo *quantum_info,const double scale)
931 assert(quantum_info != (QuantumInfo *) NULL);
932 assert(quantum_info->signature == MagickSignature);
933 quantum_info->scale=scale;