2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % PPPP IIIII X X EEEEE L %
10 % P IIIII X X EEEEE LLLLL %
12 % MagickCore Methods to Import/Export Pixels %
19 % Copyright 1999-2011 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/property.h"
43 #include "MagickCore/blob.h"
44 #include "MagickCore/blob-private.h"
45 #include "MagickCore/color-private.h"
46 #include "MagickCore/draw.h"
47 #include "MagickCore/exception.h"
48 #include "MagickCore/exception-private.h"
49 #include "MagickCore/cache.h"
50 #include "MagickCore/constitute.h"
51 #include "MagickCore/delegate.h"
52 #include "MagickCore/geometry.h"
53 #include "MagickCore/image-private.h"
54 #include "MagickCore/list.h"
55 #include "MagickCore/magick.h"
56 #include "MagickCore/memory_.h"
57 #include "MagickCore/monitor.h"
58 #include "MagickCore/option.h"
59 #include "MagickCore/pixel.h"
60 #include "MagickCore/pixel-accessor.h"
61 #include "MagickCore/quantum.h"
62 #include "MagickCore/quantum-private.h"
63 #include "MagickCore/resource_.h"
64 #include "MagickCore/semaphore.h"
65 #include "MagickCore/statistic.h"
66 #include "MagickCore/stream.h"
67 #include "MagickCore/string_.h"
68 #include "MagickCore/transform.h"
69 #include "MagickCore/utility.h"
72 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76 + A c q u i r e P i x e l C h a n n e l M a p %
80 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
82 % AcquirePixelChannelMap() acquires a pixel component map.
84 % The format of the AcquirePixelChannelMap() method is:
86 % PixelChannelMap *AcquirePixelChannelMap(void)
89 MagickExport PixelChannelMap *AcquirePixelChannelMap(void)
97 channel_map=(PixelChannelMap *) AcquireQuantumMemory(MaxPixelChannels,
98 sizeof(*channel_map));
99 if (channel_map == (PixelChannelMap *) NULL)
100 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
101 (void) ResetMagickMemory(channel_map,0,MaxPixelChannels*sizeof(*channel_map));
102 for (i=0; i < MaxPixelChannels; i++)
103 channel_map[i].channel=(PixelChannel) i;
108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
112 + C l o n e P i x e l C h a n n e l M a p %
116 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
118 % ClonePixelChannelMap() clones a pixel component map.
120 % The format of the ClonePixelChannelMap() method is:
122 % PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
124 % A description of each parameter follows:
126 % o channel_map: the pixel component map.
129 MagickExport PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
134 assert(channel_map != (PixelChannelMap *) NULL);
135 clone_map=AcquirePixelChannelMap();
136 if (clone_map == (PixelChannelMap *) NULL)
137 return((PixelChannelMap *) NULL);
138 (void) CopyMagickMemory(clone_map,channel_map,MaxPixelChannels*
139 sizeof(*channel_map));
144 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
148 + C l o n e P i x e l I n f o %
152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
154 % ClonePixelInfo() makes a duplicate of the given pixel info structure, or if
155 % pixel info is NULL, a new one.
157 % The format of the ClonePixelInfo method is:
159 % PixelInfo *ClonePixelInfo(const PixelInfo *pixel_info)
161 % A description of each parameter follows:
163 % o pixel_info: the pixel info.
166 MagickExport PixelInfo *ClonePixelInfo(const PixelInfo *pixel)
171 pixel_info=(PixelInfo *) AcquireQuantumMemory(1,sizeof(*pixel_info));
172 if (pixel_info == (PixelInfo *) NULL)
173 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
174 *pixel_info=(*pixel);
179 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
183 + D e s t r o y P i x e l C h a n n e l M a p %
187 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
189 % DestroyPixelChannelMap() deallocates memory associated with the pixel
192 % The format of the DestroyPixelChannelMap() method is:
194 % PixelChannelMap *DestroyPixelChannelMap(PixelChannelMap *channel_map)
196 % A description of each parameter follows:
198 % o channel_map: the pixel component map.
201 MagickExport PixelChannelMap *DestroyPixelChannelMap(
202 PixelChannelMap *channel_map)
204 assert(channel_map != (PixelChannelMap *) NULL);
205 channel_map=(PixelChannelMap *) RelinquishMagickMemory(channel_map);
206 return((PixelChannelMap *) RelinquishMagickMemory(channel_map));
210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
214 % E x p o r t I m a g e P i x e l s %
218 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
220 % ExportImagePixels() extracts pixel data from an image and returns it to you.
221 % The method returns MagickTrue on success otherwise MagickFalse if an error is
222 % encountered. The data is returned as char, short int, int, ssize_t, float,
223 % or double in the order specified by map.
225 % Suppose you want to extract the first scanline of a 640x480 image as
226 % character data in red-green-blue order:
228 % ExportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels,exception);
230 % The format of the ExportImagePixels method is:
232 % MagickBooleanType ExportImagePixels(const Image *image,
233 % const ssize_t x_offset,const ssize_t y_offset,const size_t columns,
234 % const size_t rows,const char *map,const StorageType type,
235 % void *pixels,ExceptionInfo *exception)
237 % A description of each parameter follows:
239 % o image: the image.
241 % o x_offset,y_offset,columns,rows: These values define the perimeter
242 % of a region of pixels you want to extract.
244 % o map: This string reflects the expected ordering of the pixel array.
245 % It can be any combination or order of R = red, G = green, B = blue,
246 % A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
247 % Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
250 % o type: Define the data type of the pixels. Float and double types are
251 % normalized to [0..1] otherwise [0..QuantumRange]. Choose from these
252 % types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, LongPixel,
253 % QuantumPixel, or ShortPixel.
255 % o pixels: This array of values contain the pixel components as defined by
256 % map and type. You must preallocate this array where the expected
257 % length varies depending on the values of width, height, map, and type.
259 % o exception: return any errors or warnings in this structure.
262 MagickExport MagickBooleanType ExportImagePixels(const Image *image,
263 const ssize_t x_offset,const ssize_t y_offset,const size_t columns,
264 const size_t rows,const char *map,const StorageType type,void *pixels,
265 ExceptionInfo *exception)
274 register const Quantum
283 assert(image != (Image *) NULL);
284 assert(image->signature == MagickSignature);
285 if (image->debug != MagickFalse)
286 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
288 quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
289 if (quantum_map == (QuantumType *) NULL)
291 (void) ThrowMagickException(exception,GetMagickModule(),
292 ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename);
295 for (i=0; i < (ssize_t) length; i++)
302 quantum_map[i]=AlphaQuantum;
308 quantum_map[i]=BlueQuantum;
314 quantum_map[i]=CyanQuantum;
315 if (image->colorspace == CMYKColorspace)
317 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
318 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
319 "ColorSeparatedImageRequired","`%s'",map);
325 quantum_map[i]=GreenQuantum;
331 quantum_map[i]=IndexQuantum;
337 quantum_map[i]=BlackQuantum;
338 if (image->colorspace == CMYKColorspace)
340 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
341 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
342 "ColorSeparatedImageRequired","`%s'",map);
348 quantum_map[i]=MagentaQuantum;
349 if (image->colorspace == CMYKColorspace)
351 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
352 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
353 "ColorSeparatedImageRequired","`%s'",map);
359 quantum_map[i]=OpacityQuantum;
365 quantum_map[i]=UndefinedQuantum;
371 quantum_map[i]=RedQuantum;
377 quantum_map[i]=YellowQuantum;
378 if (image->colorspace == CMYKColorspace)
380 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
381 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
382 "ColorSeparatedImageRequired","`%s'",map);
387 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
388 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
389 "UnrecognizedPixelMap","`%s'",map);
398 register unsigned char
401 q=(unsigned char *) pixels;
402 if (LocaleCompare(map,"BGR") == 0)
404 for (y=0; y < (ssize_t) rows; y++)
406 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
407 if (p == (const Quantum *) NULL)
409 for (x=0; x < (ssize_t) columns; x++)
411 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
412 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
413 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
414 p+=GetPixelChannels(image);
419 if (LocaleCompare(map,"BGRA") == 0)
421 for (y=0; y < (ssize_t) rows; y++)
423 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
424 if (p == (const Quantum *) NULL)
426 for (x=0; x < (ssize_t) columns; x++)
428 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
429 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
430 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
431 *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
432 p+=GetPixelChannels(image);
437 if (LocaleCompare(map,"BGRP") == 0)
439 for (y=0; y < (ssize_t) rows; y++)
441 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
442 if (p == (const Quantum *) NULL)
444 for (x=0; x < (ssize_t) columns; x++)
446 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
447 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
448 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
449 *q++=ScaleQuantumToChar((Quantum) 0);
450 p+=GetPixelChannels(image);
455 if (LocaleCompare(map,"I") == 0)
457 for (y=0; y < (ssize_t) rows; y++)
459 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
460 if (p == (const Quantum *) NULL)
462 for (x=0; x < (ssize_t) columns; x++)
464 *q++=ScaleQuantumToChar(GetPixelIntensity(image,p));
465 p+=GetPixelChannels(image);
470 if (LocaleCompare(map,"RGB") == 0)
472 for (y=0; y < (ssize_t) rows; y++)
474 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
475 if (p == (const Quantum *) NULL)
477 for (x=0; x < (ssize_t) columns; x++)
479 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
480 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
481 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
482 p+=GetPixelChannels(image);
487 if (LocaleCompare(map,"RGBA") == 0)
489 for (y=0; y < (ssize_t) rows; y++)
491 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
492 if (p == (const Quantum *) NULL)
494 for (x=0; x < (ssize_t) columns; x++)
496 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
497 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
498 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
499 *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
500 p+=GetPixelChannels(image);
505 if (LocaleCompare(map,"RGBP") == 0)
507 for (y=0; y < (ssize_t) rows; y++)
509 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
510 if (p == (const Quantum *) NULL)
512 for (x=0; x < (ssize_t) columns; x++)
514 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
515 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
516 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
517 *q++=ScaleQuantumToChar((Quantum) 0);
518 p+=GetPixelChannels(image);
523 for (y=0; y < (ssize_t) rows; y++)
525 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
526 if (p == (const Quantum *) NULL)
528 for (x=0; x < (ssize_t) columns; x++)
530 for (i=0; i < (ssize_t) length; i++)
533 switch (quantum_map[i])
538 *q=ScaleQuantumToChar(GetPixelRed(image,p));
544 *q=ScaleQuantumToChar(GetPixelGreen(image,p));
550 *q=ScaleQuantumToChar(GetPixelBlue(image,p));
555 *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
560 *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
565 if (image->colorspace == CMYKColorspace)
566 *q=ScaleQuantumToChar(GetPixelBlack(image,p));
571 *q=ScaleQuantumToChar(GetPixelIntensity(image,p));
579 p+=GetPixelChannels(image);
590 if (LocaleCompare(map,"BGR") == 0)
592 for (y=0; y < (ssize_t) rows; y++)
594 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
595 if (p == (const Quantum *) NULL)
597 for (x=0; x < (ssize_t) columns; x++)
599 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
600 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
601 *q++=(double) (QuantumScale*GetPixelRed(image,p));
602 p+=GetPixelChannels(image);
607 if (LocaleCompare(map,"BGRA") == 0)
609 for (y=0; y < (ssize_t) rows; y++)
611 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
612 if (p == (const Quantum *) NULL)
614 for (x=0; x < (ssize_t) columns; x++)
616 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
617 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
618 *q++=(double) (QuantumScale*GetPixelRed(image,p));
619 *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
620 p+=GetPixelChannels(image);
625 if (LocaleCompare(map,"BGRP") == 0)
627 for (y=0; y < (ssize_t) rows; y++)
629 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
630 if (p == (const Quantum *) NULL)
632 for (x=0; x < (ssize_t) columns; x++)
634 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
635 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
636 *q++=(double) (QuantumScale*GetPixelRed(image,p));
638 p+=GetPixelChannels(image);
643 if (LocaleCompare(map,"I") == 0)
645 for (y=0; y < (ssize_t) rows; y++)
647 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
648 if (p == (const Quantum *) NULL)
650 for (x=0; x < (ssize_t) columns; x++)
652 *q++=(double) (QuantumScale*GetPixelIntensity(image,p));
653 p+=GetPixelChannels(image);
658 if (LocaleCompare(map,"RGB") == 0)
660 for (y=0; y < (ssize_t) rows; y++)
662 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
663 if (p == (const Quantum *) NULL)
665 for (x=0; x < (ssize_t) columns; x++)
667 *q++=(double) (QuantumScale*GetPixelRed(image,p));
668 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
669 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
670 p+=GetPixelChannels(image);
675 if (LocaleCompare(map,"RGBA") == 0)
677 for (y=0; y < (ssize_t) rows; y++)
679 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
680 if (p == (const Quantum *) NULL)
682 for (x=0; x < (ssize_t) columns; x++)
684 *q++=(double) (QuantumScale*GetPixelRed(image,p));
685 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
686 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
687 *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
688 p+=GetPixelChannels(image);
693 if (LocaleCompare(map,"RGBP") == 0)
695 for (y=0; y < (ssize_t) rows; y++)
697 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
698 if (p == (const Quantum *) NULL)
700 for (x=0; x < (ssize_t) columns; x++)
702 *q++=(double) (QuantumScale*GetPixelRed(image,p));
703 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
704 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
706 p+=GetPixelChannels(image);
711 for (y=0; y < (ssize_t) rows; y++)
713 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
714 if (p == (const Quantum *) NULL)
716 for (x=0; x < (ssize_t) columns; x++)
718 for (i=0; i < (ssize_t) length; i++)
721 switch (quantum_map[i])
726 *q=(double) (QuantumScale*GetPixelRed(image,p));
732 *q=(double) (QuantumScale*GetPixelGreen(image,p));
738 *q=(double) (QuantumScale*GetPixelBlue(image,p));
743 *q=(double) (QuantumScale*GetPixelAlpha(image,p));
748 *q=(double) (QuantumScale*GetPixelAlpha(image,p));
753 if (image->colorspace == CMYKColorspace)
754 *q=(double) (QuantumScale*
755 GetPixelBlack(image,p));
760 *q=(double) (QuantumScale*GetPixelIntensity(image,p));
768 p+=GetPixelChannels(image);
779 if (LocaleCompare(map,"BGR") == 0)
781 for (y=0; y < (ssize_t) rows; y++)
783 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
784 if (p == (const Quantum *) NULL)
786 for (x=0; x < (ssize_t) columns; x++)
788 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
789 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
790 *q++=(float) (QuantumScale*GetPixelRed(image,p));
791 p+=GetPixelChannels(image);
796 if (LocaleCompare(map,"BGRA") == 0)
798 for (y=0; y < (ssize_t) rows; y++)
800 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
801 if (p == (const Quantum *) NULL)
803 for (x=0; x < (ssize_t) columns; x++)
805 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
806 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
807 *q++=(float) (QuantumScale*GetPixelRed(image,p));
808 *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
809 p+=GetPixelChannels(image);
814 if (LocaleCompare(map,"BGRP") == 0)
816 for (y=0; y < (ssize_t) rows; y++)
818 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
819 if (p == (const Quantum *) NULL)
821 for (x=0; x < (ssize_t) columns; x++)
823 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
824 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
825 *q++=(float) (QuantumScale*GetPixelRed(image,p));
827 p+=GetPixelChannels(image);
832 if (LocaleCompare(map,"I") == 0)
834 for (y=0; y < (ssize_t) rows; y++)
836 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
837 if (p == (const Quantum *) NULL)
839 for (x=0; x < (ssize_t) columns; x++)
841 *q++=(float) (QuantumScale*GetPixelIntensity(image,p));
842 p+=GetPixelChannels(image);
847 if (LocaleCompare(map,"RGB") == 0)
849 for (y=0; y < (ssize_t) rows; y++)
851 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
852 if (p == (const Quantum *) NULL)
854 for (x=0; x < (ssize_t) columns; x++)
856 *q++=(float) (QuantumScale*GetPixelRed(image,p));
857 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
858 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
859 p+=GetPixelChannels(image);
864 if (LocaleCompare(map,"RGBA") == 0)
866 for (y=0; y < (ssize_t) rows; y++)
868 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
869 if (p == (const Quantum *) NULL)
871 for (x=0; x < (ssize_t) columns; x++)
873 *q++=(float) (QuantumScale*GetPixelRed(image,p));
874 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
875 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
876 *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
877 p+=GetPixelChannels(image);
882 if (LocaleCompare(map,"RGBP") == 0)
884 for (y=0; y < (ssize_t) rows; y++)
886 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
887 if (p == (const Quantum *) NULL)
889 for (x=0; x < (ssize_t) columns; x++)
891 *q++=(float) (QuantumScale*GetPixelRed(image,p));
892 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
893 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
895 p+=GetPixelChannels(image);
900 for (y=0; y < (ssize_t) rows; y++)
902 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
903 if (p == (const Quantum *) NULL)
905 for (x=0; x < (ssize_t) columns; x++)
907 for (i=0; i < (ssize_t) length; i++)
910 switch (quantum_map[i])
915 *q=(float) (QuantumScale*GetPixelRed(image,p));
921 *q=(float) (QuantumScale*GetPixelGreen(image,p));
927 *q=(float) (QuantumScale*GetPixelBlue(image,p));
932 *q=(float) (QuantumScale*((Quantum) (GetPixelAlpha(image,p))));
937 *q=(float) (QuantumScale*GetPixelAlpha(image,p));
942 if (image->colorspace == CMYKColorspace)
943 *q=(float) (QuantumScale* GetPixelBlack(image,p));
948 *q=(float) (QuantumScale*GetPixelIntensity(image,p));
956 p+=GetPixelChannels(image);
963 register unsigned int
966 q=(unsigned int *) pixels;
967 if (LocaleCompare(map,"BGR") == 0)
969 for (y=0; y < (ssize_t) rows; y++)
971 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
972 if (p == (const Quantum *) NULL)
974 for (x=0; x < (ssize_t) columns; x++)
976 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
977 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
978 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
979 p+=GetPixelChannels(image);
984 if (LocaleCompare(map,"BGRA") == 0)
986 for (y=0; y < (ssize_t) rows; y++)
988 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
989 if (p == (const Quantum *) NULL)
991 for (x=0; x < (ssize_t) columns; x++)
993 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
994 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
995 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
996 *q++=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
997 p+=GetPixelChannels(image);
1002 if (LocaleCompare(map,"BGRP") == 0)
1004 for (y=0; y < (ssize_t) rows; y++)
1006 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1007 if (p == (const Quantum *) NULL)
1009 for (x=0; x < (ssize_t) columns; x++)
1011 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1012 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1013 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1015 p+=GetPixelChannels(image);
1020 if (LocaleCompare(map,"I") == 0)
1022 for (y=0; y < (ssize_t) rows; y++)
1024 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1025 if (p == (const Quantum *) NULL)
1027 for (x=0; x < (ssize_t) columns; x++)
1029 *q++=(unsigned int) ScaleQuantumToLong(
1030 GetPixelIntensity(image,p));
1031 p+=GetPixelChannels(image);
1036 if (LocaleCompare(map,"RGB") == 0)
1038 for (y=0; y < (ssize_t) rows; y++)
1040 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1041 if (p == (const Quantum *) NULL)
1043 for (x=0; x < (ssize_t) columns; x++)
1045 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1046 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1047 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1048 p+=GetPixelChannels(image);
1053 if (LocaleCompare(map,"RGBA") == 0)
1055 for (y=0; y < (ssize_t) rows; y++)
1057 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1058 if (p == (const Quantum *) NULL)
1060 for (x=0; x < (ssize_t) columns; x++)
1062 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1063 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1064 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1065 *q++=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
1066 p+=GetPixelChannels(image);
1071 if (LocaleCompare(map,"RGBP") == 0)
1073 for (y=0; y < (ssize_t) rows; y++)
1075 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1076 if (p == (const Quantum *) NULL)
1078 for (x=0; x < (ssize_t) columns; x++)
1080 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1081 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1082 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1084 p+=GetPixelChannels(image);
1089 for (y=0; y < (ssize_t) rows; y++)
1091 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1092 if (p == (const Quantum *) NULL)
1094 for (x=0; x < (ssize_t) columns; x++)
1096 for (i=0; i < (ssize_t) length; i++)
1099 switch (quantum_map[i])
1104 *q=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1108 case MagentaQuantum:
1110 *q=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1116 *q=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1121 *q=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
1124 case OpacityQuantum:
1126 *q=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
1131 if (image->colorspace == CMYKColorspace)
1132 *q=(unsigned int) ScaleQuantumToLong(GetPixelBlack(image,p));
1137 *q=(unsigned int) ScaleQuantumToLong(
1138 GetPixelIntensity(image,p));
1146 p+=GetPixelChannels(image);
1156 q=(size_t *) pixels;
1157 if (LocaleCompare(map,"BGR") == 0)
1159 for (y=0; y < (ssize_t) rows; y++)
1161 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1162 if (p == (const Quantum *) NULL)
1164 for (x=0; x < (ssize_t) columns; x++)
1166 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1167 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1168 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1169 p+=GetPixelChannels(image);
1174 if (LocaleCompare(map,"BGRA") == 0)
1176 for (y=0; y < (ssize_t) rows; y++)
1178 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1179 if (p == (const Quantum *) NULL)
1181 for (x=0; x < (ssize_t) columns; x++)
1183 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1184 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1185 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1186 *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1187 p+=GetPixelChannels(image);
1192 if (LocaleCompare(map,"BGRP") == 0)
1194 for (y=0; y < (ssize_t) rows; y++)
1196 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1197 if (p == (const Quantum *) NULL)
1199 for (x=0; x < (ssize_t) columns; x++)
1201 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1202 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1203 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1205 p+=GetPixelChannels(image);
1210 if (LocaleCompare(map,"I") == 0)
1212 for (y=0; y < (ssize_t) rows; y++)
1214 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1215 if (p == (const Quantum *) NULL)
1217 for (x=0; x < (ssize_t) columns; x++)
1219 *q++=ScaleQuantumToLong(GetPixelIntensity(image,p));
1220 p+=GetPixelChannels(image);
1225 if (LocaleCompare(map,"RGB") == 0)
1227 for (y=0; y < (ssize_t) rows; y++)
1229 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1230 if (p == (const Quantum *) NULL)
1232 for (x=0; x < (ssize_t) columns; x++)
1234 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1235 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1236 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1237 p+=GetPixelChannels(image);
1242 if (LocaleCompare(map,"RGBA") == 0)
1244 for (y=0; y < (ssize_t) rows; y++)
1246 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1247 if (p == (const Quantum *) NULL)
1249 for (x=0; x < (ssize_t) columns; x++)
1251 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1252 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1253 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1254 *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1255 p+=GetPixelChannels(image);
1260 if (LocaleCompare(map,"RGBP") == 0)
1262 for (y=0; y < (ssize_t) rows; y++)
1264 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1265 if (p == (const Quantum *) NULL)
1267 for (x=0; x < (ssize_t) columns; x++)
1269 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1270 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1271 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1273 p+=GetPixelChannels(image);
1278 for (y=0; y < (ssize_t) rows; y++)
1280 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1281 if (p == (const Quantum *) NULL)
1283 for (x=0; x < (ssize_t) columns; x++)
1285 for (i=0; i < (ssize_t) length; i++)
1288 switch (quantum_map[i])
1293 *q=ScaleQuantumToLong(GetPixelRed(image,p));
1297 case MagentaQuantum:
1299 *q=ScaleQuantumToLong(GetPixelGreen(image,p));
1305 *q=ScaleQuantumToLong(GetPixelBlue(image,p));
1310 *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1313 case OpacityQuantum:
1315 *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1320 if (image->colorspace == CMYKColorspace)
1321 *q=ScaleQuantumToLong(GetPixelBlack(image,p));
1326 *q=ScaleQuantumToLong(GetPixelIntensity(image,p));
1334 p+=GetPixelChannels(image);
1344 q=(Quantum *) pixels;
1345 if (LocaleCompare(map,"BGR") == 0)
1347 for (y=0; y < (ssize_t) rows; y++)
1349 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1350 if (p == (const Quantum *) NULL)
1352 for (x=0; x < (ssize_t) columns; x++)
1354 *q++=GetPixelBlue(image,p);
1355 *q++=GetPixelGreen(image,p);
1356 *q++=GetPixelRed(image,p);
1357 p+=GetPixelChannels(image);
1362 if (LocaleCompare(map,"BGRA") == 0)
1364 for (y=0; y < (ssize_t) rows; y++)
1366 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1367 if (p == (const Quantum *) NULL)
1369 for (x=0; x < (ssize_t) columns; x++)
1371 *q++=GetPixelBlue(image,p);
1372 *q++=GetPixelGreen(image,p);
1373 *q++=GetPixelRed(image,p);
1374 *q++=(Quantum) (GetPixelAlpha(image,p));
1375 p+=GetPixelChannels(image);
1380 if (LocaleCompare(map,"BGRP") == 0)
1382 for (y=0; y < (ssize_t) rows; y++)
1384 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1385 if (p == (const Quantum *) NULL)
1387 for (x=0; x < (ssize_t) columns; x++)
1389 *q++=GetPixelBlue(image,p);
1390 *q++=GetPixelGreen(image,p);
1391 *q++=GetPixelRed(image,p);
1393 p+=GetPixelChannels(image);
1398 if (LocaleCompare(map,"I") == 0)
1400 for (y=0; y < (ssize_t) rows; y++)
1402 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1403 if (p == (const Quantum *) NULL)
1405 for (x=0; x < (ssize_t) columns; x++)
1407 *q++=GetPixelIntensity(image,p);
1408 p+=GetPixelChannels(image);
1413 if (LocaleCompare(map,"RGB") == 0)
1415 for (y=0; y < (ssize_t) rows; y++)
1417 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1418 if (p == (const Quantum *) NULL)
1420 for (x=0; x < (ssize_t) columns; x++)
1422 *q++=GetPixelRed(image,p);
1423 *q++=GetPixelGreen(image,p);
1424 *q++=GetPixelBlue(image,p);
1425 p+=GetPixelChannels(image);
1430 if (LocaleCompare(map,"RGBA") == 0)
1432 for (y=0; y < (ssize_t) rows; y++)
1434 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1435 if (p == (const Quantum *) NULL)
1437 for (x=0; x < (ssize_t) columns; x++)
1439 *q++=GetPixelRed(image,p);
1440 *q++=GetPixelGreen(image,p);
1441 *q++=GetPixelBlue(image,p);
1442 *q++=(Quantum) (GetPixelAlpha(image,p));
1443 p+=GetPixelChannels(image);
1448 if (LocaleCompare(map,"RGBP") == 0)
1450 for (y=0; y < (ssize_t) rows; y++)
1452 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1453 if (p == (const Quantum *) NULL)
1455 for (x=0; x < (ssize_t) columns; x++)
1457 *q++=GetPixelRed(image,p);
1458 *q++=GetPixelGreen(image,p);
1459 *q++=GetPixelBlue(image,p);
1461 p+=GetPixelChannels(image);
1466 for (y=0; y < (ssize_t) rows; y++)
1468 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1469 if (p == (const Quantum *) NULL)
1471 for (x=0; x < (ssize_t) columns; x++)
1473 for (i=0; i < (ssize_t) length; i++)
1476 switch (quantum_map[i])
1481 *q=GetPixelRed(image,p);
1485 case MagentaQuantum:
1487 *q=GetPixelGreen(image,p);
1493 *q=GetPixelBlue(image,p);
1498 *q=(Quantum) (GetPixelAlpha(image,p));
1501 case OpacityQuantum:
1503 *q=GetPixelAlpha(image,p);
1508 if (image->colorspace == CMYKColorspace)
1509 *q=GetPixelBlack(image,p);
1514 *q=(GetPixelIntensity(image,p));
1522 p+=GetPixelChannels(image);
1529 register unsigned short
1532 q=(unsigned short *) pixels;
1533 if (LocaleCompare(map,"BGR") == 0)
1535 for (y=0; y < (ssize_t) rows; y++)
1537 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1538 if (p == (const Quantum *) NULL)
1540 for (x=0; x < (ssize_t) columns; x++)
1542 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1543 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1544 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1545 p+=GetPixelChannels(image);
1550 if (LocaleCompare(map,"BGRA") == 0)
1552 for (y=0; y < (ssize_t) rows; y++)
1554 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1555 if (p == (const Quantum *) NULL)
1557 for (x=0; x < (ssize_t) columns; x++)
1559 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1560 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1561 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1562 *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1563 p+=GetPixelChannels(image);
1568 if (LocaleCompare(map,"BGRP") == 0)
1570 for (y=0; y < (ssize_t) rows; y++)
1572 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1573 if (p == (const Quantum *) NULL)
1575 for (x=0; x < (ssize_t) columns; x++)
1577 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1578 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1579 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1581 p+=GetPixelChannels(image);
1586 if (LocaleCompare(map,"I") == 0)
1588 for (y=0; y < (ssize_t) rows; y++)
1590 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1591 if (p == (const Quantum *) NULL)
1593 for (x=0; x < (ssize_t) columns; x++)
1595 *q++=ScaleQuantumToShort(GetPixelIntensity(image,p));
1596 p+=GetPixelChannels(image);
1601 if (LocaleCompare(map,"RGB") == 0)
1603 for (y=0; y < (ssize_t) rows; y++)
1605 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1606 if (p == (const Quantum *) NULL)
1608 for (x=0; x < (ssize_t) columns; x++)
1610 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1611 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1612 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1613 p+=GetPixelChannels(image);
1618 if (LocaleCompare(map,"RGBA") == 0)
1620 for (y=0; y < (ssize_t) rows; y++)
1622 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1623 if (p == (const Quantum *) NULL)
1625 for (x=0; x < (ssize_t) columns; x++)
1627 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1628 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1629 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1630 *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1631 p+=GetPixelChannels(image);
1636 if (LocaleCompare(map,"RGBP") == 0)
1638 for (y=0; y < (ssize_t) rows; y++)
1640 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1641 if (p == (const Quantum *) NULL)
1643 for (x=0; x < (ssize_t) columns; x++)
1645 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1646 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1647 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1649 p+=GetPixelChannels(image);
1654 for (y=0; y < (ssize_t) rows; y++)
1656 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1657 if (p == (const Quantum *) NULL)
1659 for (x=0; x < (ssize_t) columns; x++)
1661 for (i=0; i < (ssize_t) length; i++)
1664 switch (quantum_map[i])
1669 *q=ScaleQuantumToShort(GetPixelRed(image,p));
1673 case MagentaQuantum:
1675 *q=ScaleQuantumToShort(GetPixelGreen(image,p));
1681 *q=ScaleQuantumToShort(GetPixelBlue(image,p));
1686 *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1689 case OpacityQuantum:
1691 *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1696 if (image->colorspace == CMYKColorspace)
1697 *q=ScaleQuantumToShort(GetPixelBlack(image,p));
1702 *q=ScaleQuantumToShort(GetPixelIntensity(image,p));
1710 p+=GetPixelChannels(image);
1717 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1718 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
1719 "UnrecognizedPixelMap","`%s'",map);
1723 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1728 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1732 % G e t P i x e l I n f o %
1736 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1738 % GetPixelInfo() initializes the PixelInfo structure.
1740 % The format of the GetPixelInfo method is:
1742 % GetPixelInfo(const Image *image,PixelInfo *pixel)
1744 % A description of each parameter follows:
1746 % o image: the image.
1748 % o pixel: Specifies a pointer to a PixelPacket structure.
1751 MagickExport void GetPixelInfo(const Image *image,PixelInfo *pixel)
1753 pixel->storage_class=DirectClass;
1754 pixel->colorspace=RGBColorspace;
1755 pixel->matte=MagickFalse;
1757 pixel->depth=MAGICKCORE_QUANTUM_DEPTH;
1762 pixel->alpha=(MagickRealType) OpaqueAlpha;
1764 if (image == (const Image *) NULL)
1766 pixel->storage_class=image->storage_class;
1767 pixel->colorspace=image->colorspace;
1768 pixel->matte=image->matte;
1769 pixel->depth=image->depth;
1770 pixel->fuzz=image->fuzz;
1774 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1778 % I m p o r t I m a g e P i x e l s %
1782 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1784 % ImportImagePixels() accepts pixel data and stores in the image at the
1785 % location you specify. The method returns MagickTrue on success otherwise
1786 % MagickFalse if an error is encountered. The pixel data can be either char,
1787 % short int, int, ssize_t, float, or double in the order specified by map.
1789 % Suppose your want to upload the first scanline of a 640x480 image from
1790 % character data in red-green-blue order:
1792 % ImportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels);
1794 % The format of the ImportImagePixels method is:
1796 % MagickBooleanType ImportImagePixels(Image *image,const ssize_t x_offset,
1797 % const ssize_t y_offset,const size_t columns,
1798 % const size_t rows,const char *map,const StorageType type,
1799 % const void *pixels,ExceptionInfo *exception)
1801 % A description of each parameter follows:
1803 % o image: the image.
1805 % o x_offset,y_offset,columns,rows: These values define the perimeter
1806 % of a region of pixels you want to define.
1808 % o map: This string reflects the expected ordering of the pixel array.
1809 % It can be any combination or order of R = red, G = green, B = blue,
1810 % A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
1811 % Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
1814 % o type: Define the data type of the pixels. Float and double types are
1815 % normalized to [0..1] otherwise [0..QuantumRange]. Choose from these
1816 % types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, or
1819 % o pixels: This array of values contain the pixel components as defined by
1820 % map and type. You must preallocate this array where the expected
1821 % length varies depending on the values of width, height, map, and type.
1823 % o exception: return any errors or warnings in this structure.
1826 MagickExport MagickBooleanType ImportImagePixels(Image *image,
1827 const ssize_t x_offset,const ssize_t y_offset,const size_t columns,
1828 const size_t rows,const char *map,const StorageType type,
1829 const void *pixels,ExceptionInfo *exception)
1848 Allocate image structure.
1850 assert(image != (Image *) NULL);
1851 assert(image->signature == MagickSignature);
1852 if (image->debug != MagickFalse)
1853 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1855 quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
1856 if (quantum_map == (QuantumType *) NULL)
1857 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
1859 for (i=0; i < (ssize_t) length; i++)
1866 quantum_map[i]=AlphaQuantum;
1867 image->matte=MagickTrue;
1873 quantum_map[i]=BlueQuantum;
1879 quantum_map[i]=CyanQuantum;
1880 (void) SetImageColorspace(image,CMYKColorspace,exception);
1886 quantum_map[i]=GreenQuantum;
1892 quantum_map[i]=BlackQuantum;
1893 (void) SetImageColorspace(image,CMYKColorspace,exception);
1899 quantum_map[i]=IndexQuantum;
1905 quantum_map[i]=MagentaQuantum;
1906 (void) SetImageColorspace(image,CMYKColorspace,exception);
1912 quantum_map[i]=OpacityQuantum;
1913 image->matte=MagickTrue;
1919 quantum_map[i]=UndefinedQuantum;
1925 quantum_map[i]=RedQuantum;
1931 quantum_map[i]=YellowQuantum;
1932 (void) SetImageColorspace(image,CMYKColorspace,exception);
1937 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1938 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
1939 "UnrecognizedPixelMap","`%s'",map);
1940 return(MagickFalse);
1944 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1945 return(MagickFalse);
1947 Transfer the pixels from the pixel datarray to the image.
1953 register const unsigned char
1956 p=(const unsigned char *) pixels;
1957 if (LocaleCompare(map,"BGR") == 0)
1959 for (y=0; y < (ssize_t) rows; y++)
1961 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
1962 if (q == (Quantum *) NULL)
1964 for (x=0; x < (ssize_t) columns; x++)
1966 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
1967 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
1968 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
1969 q+=GetPixelChannels(image);
1971 if (SyncAuthenticPixels(image,exception) == MagickFalse)
1976 if (LocaleCompare(map,"BGRA") == 0)
1978 for (y=0; y < (ssize_t) rows; y++)
1980 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
1981 if (q == (Quantum *) NULL)
1983 for (x=0; x < (ssize_t) columns; x++)
1985 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
1986 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
1987 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
1988 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
1989 q+=GetPixelChannels(image);
1991 if (SyncAuthenticPixels(image,exception) == MagickFalse)
1996 if (LocaleCompare(map,"BGRO") == 0)
1998 for (y=0; y < (ssize_t) rows; y++)
2000 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2001 if (q == (Quantum *) NULL)
2003 for (x=0; x < (ssize_t) columns; x++)
2005 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2006 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2007 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2008 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2009 q+=GetPixelChannels(image);
2011 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2016 if (LocaleCompare(map,"BGRP") == 0)
2018 for (y=0; y < (ssize_t) rows; y++)
2020 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2021 if (q == (Quantum *) NULL)
2023 for (x=0; x < (ssize_t) columns; x++)
2025 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2026 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2027 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2029 q+=GetPixelChannels(image);
2031 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2036 if (LocaleCompare(map,"I") == 0)
2038 for (y=0; y < (ssize_t) rows; y++)
2040 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2041 if (q == (Quantum *) NULL)
2043 for (x=0; x < (ssize_t) columns; x++)
2045 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2046 SetPixelGreen(image,GetPixelRed(image,q),q);
2047 SetPixelBlue(image,GetPixelRed(image,q),q);
2048 q+=GetPixelChannels(image);
2050 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2055 if (LocaleCompare(map,"RGB") == 0)
2057 for (y=0; y < (ssize_t) rows; y++)
2059 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2060 if (q == (Quantum *) NULL)
2062 for (x=0; x < (ssize_t) columns; x++)
2064 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2065 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2066 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2067 q+=GetPixelChannels(image);
2069 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2074 if (LocaleCompare(map,"RGBA") == 0)
2076 for (y=0; y < (ssize_t) rows; y++)
2078 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2079 if (q == (Quantum *) NULL)
2081 for (x=0; x < (ssize_t) columns; x++)
2083 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2084 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2085 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2086 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2087 q+=GetPixelChannels(image);
2089 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2094 if (LocaleCompare(map,"RGBO") == 0)
2096 for (y=0; y < (ssize_t) rows; y++)
2098 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2099 if (q == (Quantum *) NULL)
2101 for (x=0; x < (ssize_t) columns; x++)
2103 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2104 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2105 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2106 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2107 q+=GetPixelChannels(image);
2109 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2114 if (LocaleCompare(map,"RGBP") == 0)
2116 for (y=0; y < (ssize_t) rows; y++)
2118 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2119 if (q == (Quantum *) NULL)
2121 for (x=0; x < (ssize_t) columns; x++)
2123 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2124 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2125 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2127 q+=GetPixelChannels(image);
2129 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2134 for (y=0; y < (ssize_t) rows; y++)
2136 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2137 if (q == (Quantum *) NULL)
2139 for (x=0; x < (ssize_t) columns; x++)
2141 for (i=0; i < (ssize_t) length; i++)
2143 switch (quantum_map[i])
2148 SetPixelRed(image,ScaleCharToQuantum(*p),q);
2152 case MagentaQuantum:
2154 SetPixelGreen(image,ScaleCharToQuantum(*p),q);
2160 SetPixelBlue(image,ScaleCharToQuantum(*p),q);
2165 SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2168 case OpacityQuantum:
2170 SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2175 SetPixelBlack(image,ScaleCharToQuantum(*p),q);
2180 SetPixelRed(image,ScaleCharToQuantum(*p),q);
2181 SetPixelGreen(image,GetPixelRed(image,q),q);
2182 SetPixelBlue(image,GetPixelRed(image,q),q);
2190 q+=GetPixelChannels(image);
2192 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2199 register const double
2202 p=(const double *) pixels;
2203 if (LocaleCompare(map,"BGR") == 0)
2205 for (y=0; y < (ssize_t) rows; y++)
2207 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2208 if (q == (Quantum *) NULL)
2210 for (x=0; x < (ssize_t) columns; x++)
2212 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2215 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2218 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2221 q+=GetPixelChannels(image);
2223 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2228 if (LocaleCompare(map,"BGRA") == 0)
2230 for (y=0; y < (ssize_t) rows; y++)
2232 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2233 if (q == (Quantum *) NULL)
2235 for (x=0; x < (ssize_t) columns; x++)
2237 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2240 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2243 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2246 SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2249 q+=GetPixelChannels(image);
2251 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2256 if (LocaleCompare(map,"BGRP") == 0)
2258 for (y=0; y < (ssize_t) rows; y++)
2260 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2261 if (q == (Quantum *) NULL)
2263 for (x=0; x < (ssize_t) columns; x++)
2265 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2268 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2271 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2275 q+=GetPixelChannels(image);
2277 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2282 if (LocaleCompare(map,"I") == 0)
2284 for (y=0; y < (ssize_t) rows; y++)
2286 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2287 if (q == (Quantum *) NULL)
2289 for (x=0; x < (ssize_t) columns; x++)
2291 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2293 SetPixelGreen(image,GetPixelRed(image,q),q);
2294 SetPixelBlue(image,GetPixelRed(image,q),q);
2296 q+=GetPixelChannels(image);
2298 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2303 if (LocaleCompare(map,"RGB") == 0)
2305 for (y=0; y < (ssize_t) rows; y++)
2307 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2308 if (q == (Quantum *) NULL)
2310 for (x=0; x < (ssize_t) columns; x++)
2312 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2315 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2318 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2321 q+=GetPixelChannels(image);
2323 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2328 if (LocaleCompare(map,"RGBA") == 0)
2330 for (y=0; y < (ssize_t) rows; y++)
2332 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2333 if (q == (Quantum *) NULL)
2335 for (x=0; x < (ssize_t) columns; x++)
2337 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2340 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2343 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2346 SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2349 q+=GetPixelChannels(image);
2351 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2356 if (LocaleCompare(map,"RGBP") == 0)
2358 for (y=0; y < (ssize_t) rows; y++)
2360 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2361 if (q == (Quantum *) NULL)
2363 for (x=0; x < (ssize_t) columns; x++)
2365 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2368 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2371 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2374 q+=GetPixelChannels(image);
2376 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2381 for (y=0; y < (ssize_t) rows; y++)
2383 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2384 if (q == (Quantum *) NULL)
2386 for (x=0; x < (ssize_t) columns; x++)
2388 for (i=0; i < (ssize_t) length; i++)
2390 switch (quantum_map[i])
2395 SetPixelRed(image,ClampToQuantum((MagickRealType)
2396 QuantumRange*(*p)),q);
2400 case MagentaQuantum:
2402 SetPixelGreen(image,ClampToQuantum((MagickRealType)
2403 QuantumRange*(*p)),q);
2409 SetPixelBlue(image,ClampToQuantum((MagickRealType)
2410 QuantumRange*(*p)),q);
2415 SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2416 QuantumRange*(*p)),q);
2419 case OpacityQuantum:
2421 SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2422 QuantumRange*(*p)),q);
2427 SetPixelBlack(image,ClampToQuantum((MagickRealType)
2428 QuantumRange*(*p)),q);
2433 SetPixelRed(image,ClampToQuantum((MagickRealType)
2434 QuantumRange*(*p)),q);
2435 SetPixelGreen(image,GetPixelRed(image,q),q);
2436 SetPixelBlue(image,GetPixelRed(image,q),q);
2444 q+=GetPixelChannels(image);
2446 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2453 register const float
2456 p=(const float *) pixels;
2457 if (LocaleCompare(map,"BGR") == 0)
2459 for (y=0; y < (ssize_t) rows; y++)
2461 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2462 if (q == (Quantum *) NULL)
2464 for (x=0; x < (ssize_t) columns; x++)
2466 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2469 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2472 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2475 q+=GetPixelChannels(image);
2477 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2482 if (LocaleCompare(map,"BGRA") == 0)
2484 for (y=0; y < (ssize_t) rows; y++)
2486 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2487 if (q == (Quantum *) NULL)
2489 for (x=0; x < (ssize_t) columns; x++)
2491 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2494 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2497 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2500 SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2503 q+=GetPixelChannels(image);
2505 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2510 if (LocaleCompare(map,"BGRP") == 0)
2512 for (y=0; y < (ssize_t) rows; y++)
2514 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2515 if (q == (Quantum *) NULL)
2517 for (x=0; x < (ssize_t) columns; x++)
2519 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2522 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2525 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2529 q+=GetPixelChannels(image);
2531 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2536 if (LocaleCompare(map,"I") == 0)
2538 for (y=0; y < (ssize_t) rows; y++)
2540 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2541 if (q == (Quantum *) NULL)
2543 for (x=0; x < (ssize_t) columns; x++)
2545 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2547 SetPixelGreen(image,GetPixelRed(image,q),q);
2548 SetPixelBlue(image,GetPixelRed(image,q),q);
2550 q+=GetPixelChannels(image);
2552 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2557 if (LocaleCompare(map,"RGB") == 0)
2559 for (y=0; y < (ssize_t) rows; y++)
2561 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2562 if (q == (Quantum *) NULL)
2564 for (x=0; x < (ssize_t) columns; x++)
2566 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2569 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2572 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2575 q+=GetPixelChannels(image);
2577 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2582 if (LocaleCompare(map,"RGBA") == 0)
2584 for (y=0; y < (ssize_t) rows; y++)
2586 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2587 if (q == (Quantum *) NULL)
2589 for (x=0; x < (ssize_t) columns; x++)
2591 SetPixelRed(image,ClampToQuantum((MagickRealType)
2592 QuantumRange*(*p)),q);
2594 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2597 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2600 SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2603 q+=GetPixelChannels(image);
2605 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2610 if (LocaleCompare(map,"RGBP") == 0)
2612 for (y=0; y < (ssize_t) rows; y++)
2614 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2615 if (q == (Quantum *) NULL)
2617 for (x=0; x < (ssize_t) columns; x++)
2619 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2622 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2625 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2628 q+=GetPixelChannels(image);
2630 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2635 for (y=0; y < (ssize_t) rows; y++)
2637 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2638 if (q == (Quantum *) NULL)
2640 for (x=0; x < (ssize_t) columns; x++)
2642 for (i=0; i < (ssize_t) length; i++)
2644 switch (quantum_map[i])
2649 SetPixelRed(image,ClampToQuantum((MagickRealType)
2650 QuantumRange*(*p)),q);
2654 case MagentaQuantum:
2656 SetPixelGreen(image,ClampToQuantum((MagickRealType)
2657 QuantumRange*(*p)),q);
2663 SetPixelBlue(image,ClampToQuantum((MagickRealType)
2664 QuantumRange*(*p)),q);
2669 SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2670 QuantumRange*(*p)),q);
2673 case OpacityQuantum:
2675 SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2676 QuantumRange*(*p)),q);
2681 SetPixelBlack(image,ClampToQuantum((MagickRealType)
2682 QuantumRange*(*p)),q);
2687 SetPixelRed(image,ClampToQuantum((MagickRealType)
2688 QuantumRange*(*p)),q);
2689 SetPixelGreen(image,GetPixelRed(image,q),q);
2690 SetPixelBlue(image,GetPixelRed(image,q),q);
2698 q+=GetPixelChannels(image);
2700 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2707 register const unsigned int
2710 p=(const unsigned int *) pixels;
2711 if (LocaleCompare(map,"BGR") == 0)
2713 for (y=0; y < (ssize_t) rows; y++)
2715 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2716 if (q == (Quantum *) NULL)
2718 for (x=0; x < (ssize_t) columns; x++)
2720 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2721 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2722 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2723 q+=GetPixelChannels(image);
2725 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2730 if (LocaleCompare(map,"BGRA") == 0)
2732 for (y=0; y < (ssize_t) rows; y++)
2734 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2735 if (q == (Quantum *) NULL)
2737 for (x=0; x < (ssize_t) columns; x++)
2739 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2740 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2741 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2742 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2743 q+=GetPixelChannels(image);
2745 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2750 if (LocaleCompare(map,"BGRP") == 0)
2752 for (y=0; y < (ssize_t) rows; y++)
2754 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2755 if (q == (Quantum *) NULL)
2757 for (x=0; x < (ssize_t) columns; x++)
2759 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2760 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2761 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2763 q+=GetPixelChannels(image);
2765 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2770 if (LocaleCompare(map,"I") == 0)
2772 for (y=0; y < (ssize_t) rows; y++)
2774 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2775 if (q == (Quantum *) NULL)
2777 for (x=0; x < (ssize_t) columns; x++)
2779 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2780 SetPixelGreen(image,GetPixelRed(image,q),q);
2781 SetPixelBlue(image,GetPixelRed(image,q),q);
2782 q+=GetPixelChannels(image);
2784 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2789 if (LocaleCompare(map,"RGB") == 0)
2791 for (y=0; y < (ssize_t) rows; y++)
2793 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2794 if (q == (Quantum *) NULL)
2796 for (x=0; x < (ssize_t) columns; x++)
2798 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2799 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2800 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2801 q+=GetPixelChannels(image);
2803 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2808 if (LocaleCompare(map,"RGBA") == 0)
2810 for (y=0; y < (ssize_t) rows; y++)
2812 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2813 if (q == (Quantum *) NULL)
2815 for (x=0; x < (ssize_t) columns; x++)
2817 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2818 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2819 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2820 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2821 q+=GetPixelChannels(image);
2823 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2828 if (LocaleCompare(map,"RGBP") == 0)
2830 for (y=0; y < (ssize_t) rows; y++)
2832 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2833 if (q == (Quantum *) NULL)
2835 for (x=0; x < (ssize_t) columns; x++)
2837 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2838 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2839 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2841 q+=GetPixelChannels(image);
2843 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2848 for (y=0; y < (ssize_t) rows; y++)
2850 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2851 if (q == (Quantum *) NULL)
2853 for (x=0; x < (ssize_t) columns; x++)
2855 for (i=0; i < (ssize_t) length; i++)
2857 switch (quantum_map[i])
2862 SetPixelRed(image,ScaleLongToQuantum(*p),q);
2866 case MagentaQuantum:
2868 SetPixelGreen(image,ScaleLongToQuantum(*p),q);
2874 SetPixelBlue(image,ScaleLongToQuantum(*p),q);
2879 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
2882 case OpacityQuantum:
2884 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
2889 SetPixelBlack(image,ScaleLongToQuantum(*p),q);
2894 SetPixelRed(image,ScaleLongToQuantum(*p),q);
2895 SetPixelGreen(image,GetPixelRed(image,q),q);
2896 SetPixelBlue(image,GetPixelRed(image,q),q);
2904 q+=GetPixelChannels(image);
2906 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2913 register const unsigned int
2916 p=(const unsigned int *) pixels;
2917 if (LocaleCompare(map,"BGR") == 0)
2919 for (y=0; y < (ssize_t) rows; y++)
2921 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2922 if (q == (Quantum *) NULL)
2924 for (x=0; x < (ssize_t) columns; x++)
2926 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2927 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2928 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2929 q+=GetPixelChannels(image);
2931 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2936 if (LocaleCompare(map,"BGRA") == 0)
2938 for (y=0; y < (ssize_t) rows; y++)
2940 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2941 if (q == (Quantum *) NULL)
2943 for (x=0; x < (ssize_t) columns; x++)
2945 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2946 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2947 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2948 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2949 q+=GetPixelChannels(image);
2951 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2956 if (LocaleCompare(map,"BGRP") == 0)
2958 for (y=0; y < (ssize_t) rows; y++)
2960 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2961 if (q == (Quantum *) NULL)
2963 for (x=0; x < (ssize_t) columns; x++)
2965 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2966 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2967 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2969 q+=GetPixelChannels(image);
2971 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2976 if (LocaleCompare(map,"I") == 0)
2978 for (y=0; y < (ssize_t) rows; y++)
2980 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2981 if (q == (Quantum *) NULL)
2983 for (x=0; x < (ssize_t) columns; x++)
2985 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2986 SetPixelGreen(image,GetPixelRed(image,q),q);
2987 SetPixelBlue(image,GetPixelRed(image,q),q);
2988 q+=GetPixelChannels(image);
2990 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2995 if (LocaleCompare(map,"RGB") == 0)
2997 for (y=0; y < (ssize_t) rows; y++)
2999 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3000 if (q == (Quantum *) NULL)
3002 for (x=0; x < (ssize_t) columns; x++)
3004 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3005 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3006 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3007 q+=GetPixelChannels(image);
3009 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3014 if (LocaleCompare(map,"RGBA") == 0)
3016 for (y=0; y < (ssize_t) rows; y++)
3018 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3019 if (q == (Quantum *) NULL)
3021 for (x=0; x < (ssize_t) columns; x++)
3023 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3024 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3025 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3026 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3027 q+=GetPixelChannels(image);
3029 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3034 if (LocaleCompare(map,"RGBP") == 0)
3036 for (y=0; y < (ssize_t) rows; y++)
3038 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3039 if (q == (Quantum *) NULL)
3041 for (x=0; x < (ssize_t) columns; x++)
3043 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3044 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3045 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3047 q+=GetPixelChannels(image);
3049 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3054 for (y=0; y < (ssize_t) rows; y++)
3056 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3057 if (q == (Quantum *) NULL)
3059 for (x=0; x < (ssize_t) columns; x++)
3061 for (i=0; i < (ssize_t) length; i++)
3063 switch (quantum_map[i])
3068 SetPixelRed(image,ScaleLongToQuantum(*p),q);
3072 case MagentaQuantum:
3074 SetPixelGreen(image,ScaleLongToQuantum(*p),q);
3080 SetPixelBlue(image,ScaleLongToQuantum(*p),q);
3085 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3088 case OpacityQuantum:
3090 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3095 SetPixelBlack(image,ScaleLongToQuantum(*p),q);
3100 SetPixelRed(image,ScaleLongToQuantum(*p),q);
3101 SetPixelGreen(image,GetPixelRed(image,q),q);
3102 SetPixelBlue(image,GetPixelRed(image,q),q);
3110 q+=GetPixelChannels(image);
3112 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3119 register const Quantum
3122 p=(const Quantum *) pixels;
3123 if (LocaleCompare(map,"BGR") == 0)
3125 for (y=0; y < (ssize_t) rows; y++)
3127 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3128 if (q == (Quantum *) NULL)
3130 for (x=0; x < (ssize_t) columns; x++)
3132 SetPixelBlue(image,*p++,q);
3133 SetPixelGreen(image,*p++,q);
3134 SetPixelRed(image,*p++,q);
3135 q+=GetPixelChannels(image);
3137 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3142 if (LocaleCompare(map,"BGRA") == 0)
3144 for (y=0; y < (ssize_t) rows; y++)
3146 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3147 if (q == (Quantum *) NULL)
3149 for (x=0; x < (ssize_t) columns; x++)
3151 SetPixelBlue(image,*p++,q);
3152 SetPixelGreen(image,*p++,q);
3153 SetPixelRed(image,*p++,q);
3154 SetPixelAlpha(image,*p++,q);
3155 q+=GetPixelChannels(image);
3157 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3162 if (LocaleCompare(map,"BGRP") == 0)
3164 for (y=0; y < (ssize_t) rows; y++)
3166 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3167 if (q == (Quantum *) NULL)
3169 for (x=0; x < (ssize_t) columns; x++)
3171 SetPixelBlue(image,*p++,q);
3172 SetPixelGreen(image,*p++,q);
3173 SetPixelRed(image,*p++,q);
3175 q+=GetPixelChannels(image);
3177 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3182 if (LocaleCompare(map,"I") == 0)
3184 for (y=0; y < (ssize_t) rows; y++)
3186 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3187 if (q == (Quantum *) NULL)
3189 for (x=0; x < (ssize_t) columns; x++)
3191 SetPixelRed(image,*p++,q);
3192 SetPixelGreen(image,GetPixelRed(image,q),q);
3193 SetPixelBlue(image,GetPixelRed(image,q),q);
3194 q+=GetPixelChannels(image);
3196 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3201 if (LocaleCompare(map,"RGB") == 0)
3203 for (y=0; y < (ssize_t) rows; y++)
3205 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3206 if (q == (Quantum *) NULL)
3208 for (x=0; x < (ssize_t) columns; x++)
3210 SetPixelRed(image,*p++,q);
3211 SetPixelGreen(image,*p++,q);
3212 SetPixelBlue(image,*p++,q);
3213 q+=GetPixelChannels(image);
3215 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3220 if (LocaleCompare(map,"RGBA") == 0)
3222 for (y=0; y < (ssize_t) rows; y++)
3224 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3225 if (q == (Quantum *) NULL)
3227 for (x=0; x < (ssize_t) columns; x++)
3229 SetPixelRed(image,*p++,q);
3230 SetPixelGreen(image,*p++,q);
3231 SetPixelBlue(image,*p++,q);
3232 SetPixelAlpha(image,*p++,q);
3233 q+=GetPixelChannels(image);
3235 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3240 if (LocaleCompare(map,"RGBP") == 0)
3242 for (y=0; y < (ssize_t) rows; y++)
3244 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3245 if (q == (Quantum *) NULL)
3247 for (x=0; x < (ssize_t) columns; x++)
3249 SetPixelRed(image,*p++,q);
3250 SetPixelGreen(image,*p++,q);
3251 SetPixelBlue(image,*p++,q);
3253 q+=GetPixelChannels(image);
3255 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3260 for (y=0; y < (ssize_t) rows; y++)
3262 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3263 if (q == (Quantum *) NULL)
3265 for (x=0; x < (ssize_t) columns; x++)
3267 for (i=0; i < (ssize_t) length; i++)
3269 switch (quantum_map[i])
3274 SetPixelRed(image,*p,q);
3278 case MagentaQuantum:
3280 SetPixelGreen(image,*p,q);
3286 SetPixelBlue(image,*p,q);
3291 SetPixelAlpha(image,*p,q);
3294 case OpacityQuantum:
3296 SetPixelAlpha(image,*p,q);
3301 SetPixelBlack(image,*p,q);
3306 SetPixelRed(image,*p,q);
3307 SetPixelGreen(image,GetPixelRed(image,q),q);
3308 SetPixelBlue(image,GetPixelRed(image,q),q);
3316 q+=GetPixelChannels(image);
3318 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3325 register const unsigned short
3328 p=(const unsigned short *) pixels;
3329 if (LocaleCompare(map,"BGR") == 0)
3331 for (y=0; y < (ssize_t) rows; y++)
3333 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3334 if (q == (Quantum *) NULL)
3336 for (x=0; x < (ssize_t) columns; x++)
3338 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3339 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3340 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3341 q+=GetPixelChannels(image);
3343 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3348 if (LocaleCompare(map,"BGRA") == 0)
3350 for (y=0; y < (ssize_t) rows; y++)
3352 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3353 if (q == (Quantum *) NULL)
3355 for (x=0; x < (ssize_t) columns; x++)
3357 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3358 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3359 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3360 SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3361 q+=GetPixelChannels(image);
3363 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3368 if (LocaleCompare(map,"BGRP") == 0)
3370 for (y=0; y < (ssize_t) rows; y++)
3372 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3373 if (q == (Quantum *) NULL)
3375 for (x=0; x < (ssize_t) columns; x++)
3377 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3378 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3379 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3381 q+=GetPixelChannels(image);
3383 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3388 if (LocaleCompare(map,"I") == 0)
3390 for (y=0; y < (ssize_t) rows; y++)
3392 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3393 if (q == (Quantum *) NULL)
3395 for (x=0; x < (ssize_t) columns; x++)
3397 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3398 SetPixelGreen(image,GetPixelRed(image,q),q);
3399 SetPixelBlue(image,GetPixelRed(image,q),q);
3400 q+=GetPixelChannels(image);
3402 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3407 if (LocaleCompare(map,"RGB") == 0)
3409 for (y=0; y < (ssize_t) rows; y++)
3411 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3412 if (q == (Quantum *) NULL)
3414 for (x=0; x < (ssize_t) columns; x++)
3416 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3417 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3418 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3419 q+=GetPixelChannels(image);
3421 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3426 if (LocaleCompare(map,"RGBA") == 0)
3428 for (y=0; y < (ssize_t) rows; y++)
3430 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3431 if (q == (Quantum *) NULL)
3433 for (x=0; x < (ssize_t) columns; x++)
3435 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3436 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3437 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3438 SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3439 q+=GetPixelChannels(image);
3441 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3446 if (LocaleCompare(map,"RGBP") == 0)
3448 for (y=0; y < (ssize_t) rows; y++)
3450 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3451 if (q == (Quantum *) NULL)
3453 for (x=0; x < (ssize_t) columns; x++)
3455 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3456 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3457 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3459 q+=GetPixelChannels(image);
3461 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3466 for (y=0; y < (ssize_t) rows; y++)
3468 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3469 if (q == (Quantum *) NULL)
3471 for (x=0; x < (ssize_t) columns; x++)
3473 for (i=0; i < (ssize_t) length; i++)
3475 switch (quantum_map[i])
3480 SetPixelRed(image,ScaleShortToQuantum(*p),q);
3484 case MagentaQuantum:
3486 SetPixelGreen(image,ScaleShortToQuantum(*p),q);
3492 SetPixelBlue(image,ScaleShortToQuantum(*p),q);
3497 SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3500 case OpacityQuantum:
3502 SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3507 SetPixelBlack(image,ScaleShortToQuantum(*p),q);
3512 SetPixelRed(image,ScaleShortToQuantum(*p),q);
3513 SetPixelGreen(image,GetPixelRed(image,q),q);
3514 SetPixelBlue(image,GetPixelRed(image,q),q);
3522 q+=GetPixelChannels(image);
3524 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3531 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3532 (void) ThrowMagickException(&image->exception,GetMagickModule(),
3533 OptionError,"UnrecognizedPixelMap","`%s'",map);
3537 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3542 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3546 + I n i t i a l i z e P i x e l C h a n n e l M a p %
3550 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3552 % InitializePixelChannelMap() defines the standard pixel component map.
3554 % The format of the InitializePixelChannelMap() method is:
3556 % void InitializePixelChannelMap(Image *image)
3558 % A description of each parameter follows:
3560 % o image: the image.
3563 MagickExport void InitializePixelChannelMap(Image *image)
3571 for (i=0; i < (ssize_t) MaxPixelChannels; i++)
3573 SetPixelChannelMapChannel(image,(PixelChannel) i,(PixelChannel) i);
3574 SetPixelChannelMapTraits(image,(PixelChannel) i,UndefinedPixelTrait);
3576 image->sync=MagickTrue;
3577 image->number_channels=4;
3578 if (0 && image->colorspace == GRAYColorspace)
3579 image->number_channels=2;
3580 if (image->colorspace == CMYKColorspace)
3581 image->number_channels++;
3582 if (image->storage_class == PseudoClass)
3583 image->number_channels++;
3584 for (i=0; i < (ssize_t) image->number_channels; i++)
3585 SetPixelChannelMapTraits(image,(PixelChannel) i,(PixelTrait)
3587 alpha_channel=GetPixelChannelMapChannel(image,AlphaPixelChannel);
3588 if (image->matte == MagickFalse)
3589 SetPixelChannelMapTraits(image,AlphaPixelChannel,CopyPixelTrait);
3591 for (i=0; i < (ssize_t) image->number_channels; i++)
3592 if ((PixelChannel) i != alpha_channel)
3593 SetPixelChannelMapTraits(image,(PixelChannel) i,(PixelTrait)
3594 (UpdatePixelTrait | BlendPixelTrait));
3595 if (0 && image->colorspace == GRAYColorspace)
3597 image->number_channels=2;
3598 SetPixelChannelMapChannel(image,GreenPixelChannel,RedPixelChannel);
3599 SetPixelChannelMapChannel(image,BluePixelChannel,RedPixelChannel);
3601 if (image->storage_class == PseudoClass)
3603 SetPixelChannelMapChannel(image,IndexPixelChannel,IndexPixelChannel);
3604 SetPixelChannelMapTraits(image,IndexPixelChannel,CopyPixelTrait);
3606 image->number_channels+=image->number_meta_channels;
3607 for ( ; i < (ssize_t) image->number_channels; i++)
3608 SetPixelChannelMapTraits(image,(PixelChannel) i,CopyPixelTrait);
3609 (void) SetPixelChannelMask(image,image->channel_mask);
3613 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3617 % I n t e r p o l a t e P i x e l C h a n n e l %
3621 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3623 % InterpolatePixelChannel() applies a pixel interpolation method between a
3624 % floating point coordinate and the pixels surrounding that coordinate. No
3625 % pixel area resampling, or scaling of the result is performed.
3627 % The format of the InterpolatePixelChannel method is:
3629 % MagickBooleanType InterpolatePixelChannel(const Image *image,
3630 % const CacheView *image_view,const PixelChannel channel,
3631 % const PixelInterpolateMethod method,const double x,const double y,
3632 % double *pixel,ExceptionInfo *exception)
3634 % A description of each parameter follows:
3636 % o image: the image.
3638 % o image_view: the image view.
3640 % o channel: the pixel channel to interpolate.
3642 % o method: the pixel color interpolation method.
3644 % o x,y: A double representing the current (x,y) position of the pixel.
3646 % o pixel: return the interpolated pixel here.
3648 % o exception: return any errors or warnings in this structure.
3652 static inline double MagickMax(const MagickRealType x,const MagickRealType y)
3659 static inline MagickRealType CubicWeightingFunction(const MagickRealType x)
3665 alpha=MagickMax(x+2.0,0.0);
3666 gamma=1.0*alpha*alpha*alpha;
3667 alpha=MagickMax(x+1.0,0.0);
3668 gamma-=4.0*alpha*alpha*alpha;
3669 alpha=MagickMax(x+0.0,0.0);
3670 gamma+=6.0*alpha*alpha*alpha;
3671 alpha=MagickMax(x-1.0,0.0);
3672 gamma-=4.0*alpha*alpha*alpha;
3676 static inline double MeshInterpolate(const PointInfo *delta,const double p,
3677 const double x,const double y)
3679 return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
3682 static inline ssize_t NearestNeighbor(const MagickRealType x)
3685 return((ssize_t) (x+0.5));
3686 return((ssize_t) (x-0.5));
3689 MagickExport MagickBooleanType InterpolatePixelChannel(const Image *image,
3690 const CacheView *image_view,const PixelChannel channel,
3691 const PixelInterpolateMethod method,const double x,const double y,
3692 double *pixel,ExceptionInfo *exception)
3705 register const Quantum
3715 assert(image != (Image *) NULL);
3716 assert(image != (Image *) NULL);
3717 assert(image->signature == MagickSignature);
3718 assert(image_view != (CacheView *) NULL);
3721 traits=GetPixelChannelMapTraits(image,channel);
3722 x_offset=(ssize_t) floor(x);
3723 y_offset=(ssize_t) floor(y);
3724 switch (method == UndefinedInterpolatePixel ? image->interpolate : method)
3726 case AverageInterpolatePixel:
3728 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
3730 if (p == (const Quantum *) NULL)
3735 if ((traits & BlendPixelTrait) == 0)
3736 for (i=0; i < 16; i++)
3739 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3742 for (i=0; i < 16; i++)
3744 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3745 GetPixelChannels(image));
3746 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3748 for (i=0; i < 16; i++)
3750 gamma=1.0/(fabs((double) alpha[i]) <= MagickEpsilon ? 1.0 : alpha[i]);
3751 *pixel+=gamma*0.0625*pixels[i];
3755 case BicubicInterpolatePixel:
3764 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
3766 if (p == (const Quantum *) NULL)
3771 if ((traits & BlendPixelTrait) == 0)
3772 for (i=0; i < 16; i++)
3775 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3778 for (i=0; i < 16; i++)
3780 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3781 GetPixelChannels(image));
3782 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3786 for (i=0; i < 4; i++)
3788 u[0]=(pixels[4*i+3]-pixels[4*i+2])-(pixels[4*i+0]-pixels[4*i+1]);
3789 u[1]=(pixels[4*i+0]-pixels[4*i+1])-u[0];
3790 u[2]=pixels[4*i+2]-pixels[4*i+0];
3792 v[i]=(delta.x*delta.x*delta.x*u[0])+(delta.x*delta.x*u[1])+(delta.x*
3795 u[0]=(v[3]-v[2])-(v[0]-v[1]);
3796 u[1]=(v[0]-v[1])-u[0];
3799 *pixel=(delta.y*delta.y*delta.y*u[0])+(delta.y*delta.y*u[1])+(delta.y*
3803 case BilinearInterpolatePixel:
3810 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
3811 if (p == (const Quantum *) NULL)
3816 if ((traits & BlendPixelTrait) == 0)
3817 for (i=0; i < 4; i++)
3820 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3823 for (i=0; i < 4; i++)
3825 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3826 GetPixelChannels(image));
3827 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3831 epsilon.x=1.0-delta.x;
3832 epsilon.y=1.0-delta.y;
3833 gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
3834 (epsilon.x*alpha[2]+delta.x*alpha[3])));
3835 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3836 *pixel=gamma*(epsilon.y*(epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*
3837 (epsilon.x*pixels[2]+delta.x*pixels[3]));
3840 case FilterInterpolatePixel:
3854 geometry.x=x_offset-1;
3855 geometry.y=y_offset-1;
3856 excerpt_image=ExcerptImage(image,&geometry,exception);
3857 if (excerpt_image == (Image *) NULL)
3862 filter_image=ResizeImage(excerpt_image,1,1,image->filter,image->blur,
3864 excerpt_image=DestroyImage(excerpt_image);
3865 if (filter_image == (Image *) NULL)
3867 filter_view=AcquireCacheView(filter_image);
3868 p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
3869 if (p == (const Quantum *) NULL)
3872 *pixel=(double) GetPixelChannel(image,channel,p);
3873 filter_view=DestroyCacheView(filter_view);
3874 filter_image=DestroyImage(filter_image);
3877 case IntegerInterpolatePixel:
3879 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
3880 if (p == (const Quantum *) NULL)
3885 *pixel=(double) GetPixelChannel(image,channel,p);
3888 case NearestNeighborInterpolatePixel:
3890 p=GetCacheViewVirtualPixels(image_view,NearestNeighbor(x),
3891 NearestNeighbor(y),1,1,exception);
3892 if (p == (const Quantum *) NULL)
3897 *pixel=(double) GetPixelChannel(image,channel,p);
3900 case MeshInterpolatePixel:
3906 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
3907 if (p == (const Quantum *) NULL)
3912 if ((traits & BlendPixelTrait) == 0)
3913 for (i=0; i < 4; i++)
3916 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3919 for (i=0; i < 4; i++)
3921 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3922 GetPixelChannels(image));
3923 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3927 luminance.x=GetPixelLuminance(image,p)-(double)
3928 GetPixelLuminance(image,p+3*GetPixelChannels(image));
3929 luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
3930 GetPixelLuminance(image,p+2*GetPixelChannels(image));
3931 if (fabs(luminance.x) < fabs(luminance.y))
3936 if (delta.x <= delta.y)
3939 Bottom-left triangle (pixel: 2, diagonal: 0-3).
3941 delta.y=1.0-delta.y;
3942 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
3943 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3944 *pixel=gamma*MeshInterpolate(&delta,pixels[2],pixels[3],
3950 Top-right triangle (pixel: 1, diagonal: 0-3).
3952 delta.x=1.0-delta.x;
3953 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
3954 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3955 *pixel=gamma*MeshInterpolate(&delta,pixels[1],pixels[0],
3964 if (delta.x <= (1.0-delta.y))
3967 Top-left triangle (pixel: 0, diagonal: 1-2).
3969 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
3970 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3971 *pixel=gamma*MeshInterpolate(&delta,pixels[0],pixels[1],
3977 Bottom-right triangle (pixel: 3, diagonal: 1-2).
3979 delta.x=1.0-delta.x;
3980 delta.y=1.0-delta.y;
3981 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
3982 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3983 *pixel=gamma*MeshInterpolate(&delta,pixels[3],pixels[2],
3989 case SplineInterpolatePixel:
4002 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4004 if (p == (const Quantum *) NULL)
4009 if ((traits & BlendPixelTrait) == 0)
4010 for (i=0; i < 16; i++)
4013 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4016 for (i=0; i < 16; i++)
4018 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4019 GetPixelChannels(image));
4020 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4025 for (i=(-1); i < 3L; i++)
4027 dy=CubicWeightingFunction((MagickRealType) i-delta.y);
4028 for (j=(-1); j < 3L; j++)
4030 dx=CubicWeightingFunction(delta.x-(MagickRealType) j);
4031 gamma=1.0/(fabs((double) alpha[n]) <= MagickEpsilon ? 1.0 : alpha[n]);
4032 *pixel+=gamma*dx*dy*pixels[n];
4043 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4047 % I n t e r p o l a t e P i x e l C h a n n e l s %
4051 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4053 % InterpolatePixelChannels() applies a pixel interpolation method between a
4054 % floating point coordinate and the pixels surrounding that coordinate. No
4055 % pixel area resampling, or scaling of the result is performed.
4057 % The format of the InterpolatePixelChannels method is:
4059 % MagickBooleanType InterpolatePixelChannels(const Image *source,
4060 % const CacheView *source_view,const Image *destination,
4061 % const PixelInterpolateMethod method,const double x,const double y,
4062 % Quantum *pixel,ExceptionInfo *exception)
4064 % A description of each parameter follows:
4066 % o source: the source.
4068 % o source_view: the source view.
4070 % o destination: the destination image.
4072 % o method: the pixel color interpolation method.
4074 % o x,y: A double representing the current (x,y) position of the pixel.
4076 % o pixel: return the interpolated pixel here.
4078 % o exception: return any errors or warnings in this structure.
4081 MagickExport MagickBooleanType InterpolatePixelChannels(const Image *source,
4082 const CacheView *source_view,const Image *destination,
4083 const PixelInterpolateMethod method,const double x,const double y,
4084 Quantum *pixel,ExceptionInfo *exception)
4101 register const Quantum
4111 assert(source != (Image *) NULL);
4112 assert(source != (Image *) NULL);
4113 assert(source->signature == MagickSignature);
4114 assert(source_view != (CacheView *) NULL);
4116 x_offset=(ssize_t) floor(x);
4117 y_offset=(ssize_t) floor(y);
4118 switch (method == UndefinedInterpolatePixel ? source->interpolate : method)
4120 case AverageInterpolatePixel:
4122 p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4124 if (p == (const Quantum *) NULL)
4129 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4137 traits=GetPixelChannelMapTraits(source,(PixelChannel) i);
4138 channel=GetPixelChannelMapChannel(source,(PixelChannel) i);
4139 destination_traits=GetPixelChannelMapTraits(destination,channel);
4140 if ((traits == UndefinedPixelTrait) ||
4141 (destination_traits == UndefinedPixelTrait))
4143 for (j=0; j < 16; j++)
4144 pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
4145 if ((traits & BlendPixelTrait) == 0)
4147 for (j=0; j < 16; j++)
4148 pixel[channel]+=0.0625*pixels[j];
4152 for (j=0; j < 16; j++)
4154 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4155 GetPixelChannels(source));
4156 pixels[j]*=alpha[j];
4157 gamma=1.0/(fabs((double) alpha[j]) <= MagickEpsilon ? 1.0 : alpha[j]);
4158 sum+=gamma*0.0625*pixels[j];
4160 pixel[channel]=ClampToQuantum(sum);
4164 case BicubicInterpolatePixel:
4173 p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4175 if (p == (const Quantum *) NULL)
4180 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4185 traits=GetPixelChannelMapTraits(source,(PixelChannel) i);
4186 channel=GetPixelChannelMapChannel(source,(PixelChannel) i);
4187 destination_traits=GetPixelChannelMapTraits(destination,channel);
4188 if ((traits == UndefinedPixelTrait) ||
4189 (destination_traits == UndefinedPixelTrait))
4191 if ((traits & BlendPixelTrait) == 0)
4192 for (j=0; j < 16; j++)
4195 pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
4198 for (j=0; j < 16; j++)
4200 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4201 GetPixelChannels(source));
4202 pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
4206 for (j=0; j < 4; j++)
4208 u[0]=(pixels[4*j+3]-pixels[4*j+2])-(pixels[4*j+0]-pixels[4*j+1]);
4209 u[1]=(pixels[4*j+0]-pixels[4*j+1])-u[0];
4210 u[2]=pixels[4*j+2]-pixels[4*j+0];
4212 v[j]=(delta.x*delta.x*delta.x*u[0])+(delta.x*delta.x*u[1])+(delta.x*
4215 u[0]=(v[3]-v[2])-(v[0]-v[1]);
4216 u[1]=(v[0]-v[1])-u[0];
4219 pixel[channel]=ClampToQuantum((delta.y*delta.y*delta.y*u[0])+(delta.y*
4220 delta.y*u[1])+(delta.y*u[2])+u[3]);
4224 case BilinearInterpolatePixel:
4227 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4228 if (p == (const Quantum *) NULL)
4233 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4239 traits=GetPixelChannelMapTraits(source,(PixelChannel) i);
4240 channel=GetPixelChannelMapChannel(source,(PixelChannel) i);
4241 destination_traits=GetPixelChannelMapTraits(destination,channel);
4242 if ((traits == UndefinedPixelTrait) ||
4243 (destination_traits == UndefinedPixelTrait))
4247 epsilon.x=1.0-delta.x;
4248 epsilon.y=1.0-delta.y;
4249 pixels[0]=(MagickRealType) p[i];
4250 pixels[1]=(MagickRealType) p[GetPixelChannels(source)+i];
4251 pixels[2]=(MagickRealType) p[2*GetPixelChannels(source)+i];
4252 pixels[3]=(MagickRealType) p[3*GetPixelChannels(source)+i];
4253 if ((traits & BlendPixelTrait) == 0)
4255 gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
4256 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4257 pixel[channel]=ClampToQuantum(gamma*(epsilon.y*(epsilon.x*pixels[0]+
4258 delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+delta.x*
4262 alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4263 alpha[1]=QuantumScale*GetPixelAlpha(source,p+GetPixelChannels(source));
4264 alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4265 GetPixelChannels(source));
4266 alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4267 GetPixelChannels(source));
4268 pixels[0]*=alpha[0];
4269 pixels[1]*=alpha[1];
4270 pixels[2]*=alpha[2];
4271 pixels[3]*=alpha[3];
4272 gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4273 (epsilon.x*alpha[2]+delta.x*alpha[3])));
4274 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4275 pixel[channel]=ClampToQuantum(gamma*(epsilon.y*(epsilon.x*pixels[0]+
4276 delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+delta.x*pixels[3])));
4280 case FilterInterpolatePixel:
4282 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4294 traits=GetPixelChannelMapTraits(source,(PixelChannel) i);
4295 channel=GetPixelChannelMapChannel(source,(PixelChannel) i);
4296 destination_traits=GetPixelChannelMapTraits(destination,channel);
4297 if ((traits == UndefinedPixelTrait) ||
4298 (destination_traits == UndefinedPixelTrait))
4302 geometry.x=x_offset-1;
4303 geometry.y=y_offset-1;
4304 excerpt_source=ExcerptImage(source,&geometry,exception);
4305 if (excerpt_source == (Image *) NULL)
4310 filter_source=ResizeImage(excerpt_source,1,1,source->filter,
4311 source->blur,exception);
4312 excerpt_source=DestroyImage(excerpt_source);
4313 if (filter_source == (Image *) NULL)
4315 filter_view=AcquireCacheView(filter_source);
4316 p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
4317 if (p == (const Quantum *) NULL)
4320 pixel[channel]=p[i];
4321 filter_view=DestroyCacheView(filter_view);
4322 filter_source=DestroyImage(filter_source);
4326 case IntegerInterpolatePixel:
4328 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
4329 if (p == (const Quantum *) NULL)
4334 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4336 traits=GetPixelChannelMapTraits(source,(PixelChannel) i);
4337 channel=GetPixelChannelMapChannel(source,(PixelChannel) i);
4338 destination_traits=GetPixelChannelMapTraits(destination,channel);
4339 if ((traits == UndefinedPixelTrait) ||
4340 (destination_traits == UndefinedPixelTrait))
4342 pixel[channel]=p[i];
4346 case NearestNeighborInterpolatePixel:
4348 p=GetCacheViewVirtualPixels(source_view,NearestNeighbor(x),
4349 NearestNeighbor(y),1,1,exception);
4350 if (p == (const Quantum *) NULL)
4355 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4357 traits=GetPixelChannelMapTraits(source,(PixelChannel) i);
4358 channel=GetPixelChannelMapChannel(source,(PixelChannel) i);
4359 destination_traits=GetPixelChannelMapTraits(destination,channel);
4360 if ((traits == UndefinedPixelTrait) ||
4361 (destination_traits == UndefinedPixelTrait))
4363 pixel[channel]=p[i];
4367 case MeshInterpolatePixel:
4369 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4370 if (p == (const Quantum *) NULL)
4375 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4381 traits=GetPixelChannelMapTraits(source,(PixelChannel) i);
4382 channel=GetPixelChannelMapChannel(source,(PixelChannel) i);
4383 destination_traits=GetPixelChannelMapTraits(destination,channel);
4384 if ((traits == UndefinedPixelTrait) ||
4385 (destination_traits == UndefinedPixelTrait))
4387 pixels[0]=(MagickRealType) p[i];
4388 pixels[1]=(MagickRealType) p[GetPixelChannels(source)+i];
4389 pixels[2]=(MagickRealType) p[2*GetPixelChannels(source)+i];
4390 pixels[3]=(MagickRealType) p[3*GetPixelChannels(source)+i];
4391 if ((traits & BlendPixelTrait) == 0)
4400 alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4401 alpha[1]=QuantumScale*GetPixelAlpha(source,p+
4402 GetPixelChannels(source));
4403 alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4404 GetPixelChannels(source));
4405 alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4406 GetPixelChannels(source));
4410 luminance.x=GetPixelLuminance(source,p)-(double)
4411 GetPixelLuminance(source,p+3*GetPixelChannels(source));
4412 luminance.y=GetPixelLuminance(source,p+GetPixelChannels(source))-
4413 (double) GetPixelLuminance(source,p+2*GetPixelChannels(source));
4414 if (fabs(luminance.x) < fabs(luminance.y))
4419 if (delta.x <= delta.y)
4422 Bottom-left triangle (pixel: 2, diagonal: 0-3).
4424 delta.y=1.0-delta.y;
4425 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4426 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4427 pixel[channel]=ClampToQuantum(gamma*MeshInterpolate(&delta,
4428 pixels[2],pixels[3],pixels[0]));
4433 Top-right triangle (pixel: 1, diagonal: 0-3).
4435 delta.x=1.0-delta.x;
4436 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4437 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4438 pixel[channel]=ClampToQuantum(gamma*MeshInterpolate(&delta,
4439 pixels[1],pixels[0],pixels[3]));
4447 if (delta.x <= (1.0-delta.y))
4450 Top-left triangle (pixel: 0, diagonal: 1-2).
4452 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4453 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4454 pixel[channel]=ClampToQuantum(gamma*MeshInterpolate(&delta,
4455 pixels[0],pixels[1],pixels[2]));
4460 Bottom-right triangle (pixel: 3, diagonal: 1-2).
4462 delta.x=1.0-delta.x;
4463 delta.y=1.0-delta.y;
4464 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4465 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4466 pixel[channel]=ClampToQuantum(gamma*MeshInterpolate(&delta,
4467 pixels[3],pixels[2],pixels[1]));
4473 case SplineInterpolatePixel:
4475 p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4477 if (p == (const Quantum *) NULL)
4482 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4501 traits=GetPixelChannelMapTraits(source,(PixelChannel) i);
4502 channel=GetPixelChannelMapChannel(source,(PixelChannel) i);
4503 destination_traits=GetPixelChannelMapTraits(destination,channel);
4504 if ((traits == UndefinedPixelTrait) ||
4505 (destination_traits == UndefinedPixelTrait))
4507 if ((traits & BlendPixelTrait) == 0)
4508 for (j=0; j < 16; j++)
4511 pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
4514 for (j=0; j < 16; j++)
4516 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4517 GetPixelChannels(source));
4518 pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
4524 for (j=(-1); j < 3L; j++)
4526 dy=CubicWeightingFunction((MagickRealType) j-delta.y);
4527 for (k=(-1); k < 3L; k++)
4529 dx=CubicWeightingFunction(delta.x-(MagickRealType) k);
4530 gamma=1.0/(fabs((double) alpha[n]) <= MagickEpsilon ? 1.0 :
4532 sum+=gamma*dx*dy*pixels[n];
4536 pixel[channel]=ClampToQuantum(sum);
4545 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4549 % I n t e r p o l a t e P i x e l I n f o %
4553 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4555 % InterpolatePixelInfo() applies a pixel interpolation method between a
4556 % floating point coordinate and the pixels surrounding that coordinate. No
4557 % pixel area resampling, or scaling of the result is performed.
4559 % The format of the InterpolatePixelInfo method is:
4561 % MagickBooleanType InterpolatePixelInfo(const Image *image,
4562 % const CacheView *image_view,const PixelInterpolateMethod method,
4563 % const double x,const double y,PixelInfo *pixel,
4564 % ExceptionInfo *exception)
4566 % A description of each parameter follows:
4568 % o image: the image.
4570 % o image_view: the image view.
4572 % o method: the pixel color interpolation method.
4574 % o x,y: A double representing the current (x,y) position of the pixel.
4576 % o pixel: return the interpolated pixel here.
4578 % o exception: return any errors or warnings in this structure.
4582 static inline void AlphaBlendPixelInfo(const Image *image,
4583 const Quantum *pixel,PixelInfo *pixel_info,MagickRealType *alpha)
4585 if (image->matte == MagickFalse)
4588 pixel_info->red=(MagickRealType) GetPixelRed(image,pixel);
4589 pixel_info->green=(MagickRealType) GetPixelGreen(image,pixel);
4590 pixel_info->blue=(MagickRealType) GetPixelBlue(image,pixel);
4591 pixel_info->black=0.0;
4592 if (image->colorspace == CMYKColorspace)
4593 pixel_info->black=(MagickRealType) GetPixelBlack(image,pixel);
4594 pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
4597 *alpha=QuantumScale*GetPixelAlpha(image,pixel);
4598 pixel_info->red=(*alpha*GetPixelRed(image,pixel));
4599 pixel_info->green=(*alpha*GetPixelGreen(image,pixel));
4600 pixel_info->blue=(*alpha*GetPixelBlue(image,pixel));
4601 pixel_info->black=0.0;
4602 if (image->colorspace == CMYKColorspace)
4603 pixel_info->black=(*alpha*GetPixelBlack(image,pixel));
4604 pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
4607 static void BicubicInterpolate(const PixelInfo *pixels,const double dx,
4618 p=(pixels[3].red-pixels[2].red)-(pixels[0].red-pixels[1].red);
4619 q=(pixels[0].red-pixels[1].red)-p;
4620 r=pixels[2].red-pixels[0].red;
4622 pixel->red=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4623 p=(pixels[3].green-pixels[2].green)-(pixels[0].green-pixels[1].green);
4624 q=(pixels[0].green-pixels[1].green)-p;
4625 r=pixels[2].green-pixels[0].green;
4627 pixel->green=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4628 p=(pixels[3].blue-pixels[2].blue)-(pixels[0].blue-pixels[1].blue);
4629 q=(pixels[0].blue-pixels[1].blue)-p;
4630 r=pixels[2].blue-pixels[0].blue;
4632 pixel->blue=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4633 p=(pixels[3].alpha-pixels[2].alpha)-(pixels[0].alpha-pixels[1].alpha);
4634 q=(pixels[0].alpha-pixels[1].alpha)-p;
4635 r=pixels[2].alpha-pixels[0].alpha;
4637 pixel->alpha=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4638 if (pixel->colorspace == CMYKColorspace)
4640 p=(pixels[3].black-pixels[2].black)-(pixels[0].black-pixels[1].black);
4641 q=(pixels[0].black-pixels[1].black)-p;
4642 r=pixels[2].black-pixels[0].black;
4644 pixel->black=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4648 MagickExport MagickBooleanType InterpolatePixelInfo(const Image *image,
4649 const CacheView *image_view,const PixelInterpolateMethod method,
4650 const double x,const double y,PixelInfo *pixel,ExceptionInfo *exception)
4662 register const Quantum
4672 assert(image != (Image *) NULL);
4673 assert(image->signature == MagickSignature);
4674 assert(image_view != (CacheView *) NULL);
4676 x_offset=(ssize_t) floor(x);
4677 y_offset=(ssize_t) floor(y);
4678 switch (method == UndefinedInterpolatePixel ? image->interpolate : method)
4680 case AverageInterpolatePixel:
4682 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4684 if (p == (const Quantum *) NULL)
4689 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4690 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4691 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4692 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4693 AlphaBlendPixelInfo(image,p+4*GetPixelChannels(image),pixels+4,alpha+4);
4694 AlphaBlendPixelInfo(image,p+5*GetPixelChannels(image),pixels+5,alpha+5);
4695 AlphaBlendPixelInfo(image,p+6*GetPixelChannels(image),pixels+6,alpha+6);
4696 AlphaBlendPixelInfo(image,p+7*GetPixelChannels(image),pixels+7,alpha+7);
4697 AlphaBlendPixelInfo(image,p+8*GetPixelChannels(image),pixels+8,alpha+8);
4698 AlphaBlendPixelInfo(image,p+9*GetPixelChannels(image),pixels+9,alpha+9);
4699 AlphaBlendPixelInfo(image,p+10*GetPixelChannels(image),pixels+10,alpha+
4701 AlphaBlendPixelInfo(image,p+11*GetPixelChannels(image),pixels+11,alpha+
4703 AlphaBlendPixelInfo(image,p+12*GetPixelChannels(image),pixels+12,alpha+
4705 AlphaBlendPixelInfo(image,p+13*GetPixelChannels(image),pixels+13,alpha+
4707 AlphaBlendPixelInfo(image,p+14*GetPixelChannels(image),pixels+14,alpha+
4709 AlphaBlendPixelInfo(image,p+15*GetPixelChannels(image),pixels+15,alpha+
4716 for (i=0; i < 16L; i++)
4718 gamma=1.0/(fabs((double) alpha[i]) <= MagickEpsilon ? 1.0 : alpha[i]);
4719 pixel->red+=gamma*0.0625*pixels[i].red;
4720 pixel->green+=gamma*0.0625*pixels[i].green;
4721 pixel->blue+=gamma*0.0625*pixels[i].blue;
4722 if (image->colorspace == CMYKColorspace)
4723 pixel->black+=gamma*0.0625*pixels[i].black;
4724 pixel->alpha+=0.0625*pixels[i].alpha;
4728 case BicubicInterpolatePixel:
4736 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4738 if (p == (const Quantum *) NULL)
4743 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4744 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4745 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4746 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4747 AlphaBlendPixelInfo(image,p+4*GetPixelChannels(image),pixels+4,alpha+4);
4748 AlphaBlendPixelInfo(image,p+5*GetPixelChannels(image),pixels+5,alpha+5);
4749 AlphaBlendPixelInfo(image,p+6*GetPixelChannels(image),pixels+6,alpha+6);
4750 AlphaBlendPixelInfo(image,p+7*GetPixelChannels(image),pixels+7,alpha+7);
4751 AlphaBlendPixelInfo(image,p+8*GetPixelChannels(image),pixels+8,alpha+8);
4752 AlphaBlendPixelInfo(image,p+9*GetPixelChannels(image),pixels+9,alpha+9);
4753 AlphaBlendPixelInfo(image,p+10*GetPixelChannels(image),pixels+10,alpha+
4755 AlphaBlendPixelInfo(image,p+11*GetPixelChannels(image),pixels+11,alpha+
4757 AlphaBlendPixelInfo(image,p+12*GetPixelChannels(image),pixels+12,alpha+
4759 AlphaBlendPixelInfo(image,p+13*GetPixelChannels(image),pixels+13,alpha+
4761 AlphaBlendPixelInfo(image,p+14*GetPixelChannels(image),pixels+14,alpha+
4763 AlphaBlendPixelInfo(image,p+15*GetPixelChannels(image),pixels+15,alpha+
4767 for (i=0; i < 4L; i++)
4768 BicubicInterpolate(pixels+4*i,delta.x,u+i);
4769 BicubicInterpolate(u,delta.y,pixel);
4772 case BilinearInterpolatePixel:
4779 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4780 if (p == (const Quantum *) NULL)
4785 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4786 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4787 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4788 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4791 epsilon.x=1.0-delta.x;
4792 epsilon.y=1.0-delta.y;
4793 gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4794 (epsilon.x*alpha[2]+delta.x*alpha[3])));
4795 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4796 pixel->red=gamma*(epsilon.y*(epsilon.x*pixels[0].red+delta.x*
4797 pixels[1].red)+delta.y*(epsilon.x*pixels[2].red+delta.x*pixels[3].red));
4798 pixel->green=gamma*(epsilon.y*(epsilon.x*pixels[0].green+delta.x*
4799 pixels[1].green)+delta.y*(epsilon.x*pixels[2].green+delta.x*
4801 pixel->blue=gamma*(epsilon.y*(epsilon.x*pixels[0].blue+delta.x*
4802 pixels[1].blue)+delta.y*(epsilon.x*pixels[2].blue+delta.x*
4804 if (image->colorspace == CMYKColorspace)
4805 pixel->black=gamma*(epsilon.y*(epsilon.x*pixels[0].black+delta.x*
4806 pixels[1].black)+delta.y*(epsilon.x*pixels[2].black+delta.x*
4808 gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
4809 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4810 pixel->alpha=(epsilon.y*(epsilon.x*pixels[0].alpha+delta.x*
4811 pixels[1].alpha)+delta.y*(epsilon.x*pixels[2].alpha+delta.x*
4815 case FilterInterpolatePixel:
4829 geometry.x=x_offset-1;
4830 geometry.y=y_offset-1;
4831 excerpt_image=ExcerptImage(image,&geometry,exception);
4832 if (excerpt_image == (Image *) NULL)
4837 filter_image=ResizeImage(excerpt_image,1,1,image->filter,image->blur,
4839 excerpt_image=DestroyImage(excerpt_image);
4840 if (filter_image == (Image *) NULL)
4842 filter_view=AcquireCacheView(filter_image);
4843 p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
4844 if (p != (const Quantum *) NULL)
4845 SetPixelInfo(image,p,pixel);
4846 filter_view=DestroyCacheView(filter_view);
4847 filter_image=DestroyImage(filter_image);
4850 case IntegerInterpolatePixel:
4852 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4853 if (p == (const Quantum *) NULL)
4858 SetPixelInfo(image,p,pixel);
4861 case MeshInterpolatePixel:
4867 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4868 if (p == (const Quantum *) NULL)
4875 luminance.x=GetPixelLuminance(image,p)-(double)
4876 GetPixelLuminance(image,p+3*GetPixelChannels(image));
4877 luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
4878 GetPixelLuminance(image,p+2*GetPixelChannels(image));
4879 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4880 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4881 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4882 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4883 if (fabs(luminance.x) < fabs(luminance.y))
4888 if (delta.x <= delta.y)
4891 Bottom-left triangle (pixel: 2, diagonal: 0-3).
4893 delta.y=1.0-delta.y;
4894 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4895 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4896 pixel->red=gamma*MeshInterpolate(&delta,pixels[2].red,
4897 pixels[3].red,pixels[0].red);
4898 pixel->green=gamma*MeshInterpolate(&delta,pixels[2].green,
4899 pixels[3].green,pixels[0].green);
4900 pixel->blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
4901 pixels[3].blue,pixels[0].blue);
4902 if (image->colorspace == CMYKColorspace)
4903 pixel->black=gamma*MeshInterpolate(&delta,pixels[2].black,
4904 pixels[3].black,pixels[0].black);
4905 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
4906 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[2].alpha,
4907 pixels[3].alpha,pixels[0].alpha);
4912 Top-right triangle (pixel:1 , diagonal: 0-3).
4914 delta.x=1.0-delta.x;
4915 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4916 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4917 pixel->red=gamma*MeshInterpolate(&delta,pixels[1].red,
4918 pixels[0].red,pixels[3].red);
4919 pixel->green=gamma*MeshInterpolate(&delta,pixels[1].green,
4920 pixels[0].green,pixels[3].green);
4921 pixel->blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
4922 pixels[0].blue,pixels[3].blue);
4923 if (image->colorspace == CMYKColorspace)
4924 pixel->black=gamma*MeshInterpolate(&delta,pixels[1].black,
4925 pixels[0].black,pixels[3].black);
4926 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
4927 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[1].alpha,
4928 pixels[0].alpha,pixels[3].alpha);
4936 if (delta.x <= (1.0-delta.y))
4939 Top-left triangle (pixel: 0, diagonal: 1-2).
4941 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4942 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4943 pixel->red=gamma*MeshInterpolate(&delta,pixels[0].red,
4944 pixels[1].red,pixels[2].red);
4945 pixel->green=gamma*MeshInterpolate(&delta,pixels[0].green,
4946 pixels[1].green,pixels[2].green);
4947 pixel->blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
4948 pixels[1].blue,pixels[2].blue);
4949 if (image->colorspace == CMYKColorspace)
4950 pixel->black=gamma*MeshInterpolate(&delta,pixels[0].black,
4951 pixels[1].black,pixels[2].black);
4952 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
4953 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[0].alpha,
4954 pixels[1].alpha,pixels[2].alpha);
4959 Bottom-right triangle (pixel: 3, diagonal: 1-2).
4961 delta.x=1.0-delta.x;
4962 delta.y=1.0-delta.y;
4963 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4964 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4965 pixel->red=gamma*MeshInterpolate(&delta,pixels[3].red,
4966 pixels[2].red,pixels[1].red);
4967 pixel->green=gamma*MeshInterpolate(&delta,pixels[3].green,
4968 pixels[2].green,pixels[1].green);
4969 pixel->blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
4970 pixels[2].blue,pixels[1].blue);
4971 if (image->colorspace == CMYKColorspace)
4972 pixel->black=gamma*MeshInterpolate(&delta,pixels[3].black,
4973 pixels[2].black,pixels[1].black);
4974 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
4975 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[3].alpha,
4976 pixels[2].alpha,pixels[1].alpha);
4981 case NearestNeighborInterpolatePixel:
4983 p=GetCacheViewVirtualPixels(image_view,NearestNeighbor(x),
4984 NearestNeighbor(y),1,1,exception);
4985 if (p == (const Quantum *) NULL)
4990 SetPixelInfo(image,p,pixel);
4993 case SplineInterpolatePixel:
5006 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
5008 if (p == (const Quantum *) NULL)
5013 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
5014 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
5015 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
5016 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
5017 AlphaBlendPixelInfo(image,p+4*GetPixelChannels(image),pixels+4,alpha+4);
5018 AlphaBlendPixelInfo(image,p+5*GetPixelChannels(image),pixels+5,alpha+5);
5019 AlphaBlendPixelInfo(image,p+6*GetPixelChannels(image),pixels+6,alpha+6);
5020 AlphaBlendPixelInfo(image,p+7*GetPixelChannels(image),pixels+7,alpha+7);
5021 AlphaBlendPixelInfo(image,p+8*GetPixelChannels(image),pixels+8,alpha+8);
5022 AlphaBlendPixelInfo(image,p+9*GetPixelChannels(image),pixels+9,alpha+9);
5023 AlphaBlendPixelInfo(image,p+10*GetPixelChannels(image),pixels+10,alpha+
5025 AlphaBlendPixelInfo(image,p+11*GetPixelChannels(image),pixels+11,alpha+
5027 AlphaBlendPixelInfo(image,p+12*GetPixelChannels(image),pixels+12,alpha+
5029 AlphaBlendPixelInfo(image,p+13*GetPixelChannels(image),pixels+13,alpha+
5031 AlphaBlendPixelInfo(image,p+14*GetPixelChannels(image),pixels+14,alpha+
5033 AlphaBlendPixelInfo(image,p+15*GetPixelChannels(image),pixels+15,alpha+
5043 for (i=(-1); i < 3L; i++)
5045 dy=CubicWeightingFunction((MagickRealType) i-delta.y);
5046 for (j=(-1); j < 3L; j++)
5048 dx=CubicWeightingFunction(delta.x-(MagickRealType) j);
5049 gamma=1.0/(fabs((double) alpha[n]) <= MagickEpsilon ? 1.0 : alpha[n]);
5050 pixel->red+=gamma*dx*dy*pixels[n].red;
5051 pixel->green+=gamma*dx*dy*pixels[n].green;
5052 pixel->blue+=gamma*dx*dy*pixels[n].blue;
5053 if (image->colorspace == CMYKColorspace)
5054 pixel->black+=gamma*dx*dy*pixels[n].black;
5055 pixel->alpha+=dx*dy*pixels[n].alpha;
5066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5070 + I s F u z z y E q u i v a l e n c e P i x e l %
5074 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5076 % IsFuzzyEquivalencePixel() returns MagickTrue if the distance between two
5077 % pixels is less than the specified distance in a linear three (or four)u
5078 % dimensional color space.
5080 % The format of the IsFuzzyEquivalencePixel method is:
5082 % void IsFuzzyEquivalencePixel(const Image *image,const Quantum *p,
5085 % A description of each parameter follows:
5087 % o image: the image.
5094 MagickExport MagickBooleanType IsFuzzyEquivalencePixel(const Image *image,
5095 const Quantum *p,const Quantum *q)
5101 register MagickRealType
5105 fuzz=MagickMax(image->fuzz,(MagickRealType) MagickSQ1_2)*
5106 MagickMax(image->fuzz,(MagickRealType) MagickSQ1_2);
5109 if (image->matte != MagickFalse)
5112 Transparencies are involved - set alpha distance
5114 pixel=(MagickRealType) ((image->matte != MagickFalse ?
5115 GetPixelAlpha(image,p) : OpaqueAlpha)-(image->matte != MagickFalse ?
5116 GetPixelAlpha(image,q) : OpaqueAlpha));
5117 distance=pixel*pixel;
5118 if (distance > fuzz)
5119 return(MagickFalse);
5121 Generate a alpha scaling factor to generate a 4D cone on colorspace
5122 Note that if one color is transparent, distance has no color component.
5124 scale=QuantumScale*GetPixelAlpha(image,p);
5125 scale*=QuantumScale*GetPixelAlpha(image,q);
5126 if (scale <= MagickEpsilon)
5130 RGB or CMY color cube
5132 distance*=3.0; /* rescale appropriately */
5134 pixel=GetPixelRed(image,p)-(MagickRealType) GetPixelRed(image,q);
5135 if ((image->colorspace == HSLColorspace) ||
5136 (image->colorspace == HSBColorspace) ||
5137 (image->colorspace == HWBColorspace))
5140 Compute an arc distance for hue. It should be a vector angle of
5141 'S'/'W' length with 'L'/'B' forming appropriate cones.
5143 if (fabs((double) pixel) > (QuantumRange/2))
5144 pixel-=QuantumRange;
5147 distance+=scale*pixel*pixel;
5148 if (distance > fuzz)
5149 return(MagickFalse);
5150 pixel=GetPixelGreen(image,p)-(MagickRealType) GetPixelGreen(image,q);
5151 distance+=scale*pixel*pixel;
5152 if (distance > fuzz)
5153 return(MagickFalse);
5154 pixel=GetPixelBlue(image,p)-(MagickRealType) GetPixelBlue(image,q);
5155 distance+=scale*pixel*pixel;
5156 if (distance > fuzz)
5157 return(MagickFalse);
5162 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5166 + I s F u z z y E q u i v a l e n c e P i x e l I n f o %
5170 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5172 % IsFuzzyEquivalencePixelInfo() returns true if the distance between two
5173 % colors is less than the specified distance in a linear three (or four)
5174 % dimensional color space.
5176 % This implements the equivalent of...
5177 % fuzz < sqrt( color_distance^2 * u.a*v.a + alpha_distance^2 )
5179 % Which produces a multi-dimensional cone for that colorspace along the
5180 % transparency vector.
5182 % For example for an RGB
5183 % color_distance^2 = ( (u.r-v.r)^2 + (u.g-v.g)^2 + (u.b-v.b)^2 ) / 3
5185 % See http://www.imagemagick.org/Usage/bugs/fuzz_distance/
5187 % Hue colorspace distances need more work. Hue is not a distance, it is an
5190 % A check that q is in the same color space as p should be made and the
5191 % appropriate mapping made. -- Anthony Thyssen 8 December 2010
5193 % The format of the IsFuzzyEquivalencePixelInfo method is:
5195 % MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
5196 % const PixelInfo *q)
5198 % A description of each parameter follows:
5205 MagickExport MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
5212 register MagickRealType
5216 if ((p->fuzz == 0.0) && (q->fuzz == 0.0))
5217 return(IsPixelInfoEquivalent(p,q));
5219 fuzz=MagickMax(q->fuzz,(MagickRealType) MagickSQ1_2)*
5220 MagickMax(q->fuzz,(MagickRealType) MagickSQ1_2);
5221 else if (q->fuzz == 0.0)
5222 fuzz=MagickMax(p->fuzz,(MagickRealType) MagickSQ1_2)*
5223 MagickMax(p->fuzz,(MagickRealType) MagickSQ1_2);
5225 fuzz=MagickMax(p->fuzz,(MagickRealType) MagickSQ1_2)*
5226 MagickMax(q->fuzz,(MagickRealType) MagickSQ1_2);
5229 if ((p->matte != MagickFalse) || (q->matte != MagickFalse))
5232 Transparencies are involved - set alpha distance.
5234 pixel=(p->matte != MagickFalse ? p->alpha : OpaqueAlpha)-
5235 (q->matte != MagickFalse ? q->alpha : OpaqueAlpha);
5236 distance=pixel*pixel;
5237 if (distance > fuzz)
5238 return(MagickFalse);
5240 Generate a alpha scaling factor to generate a 4D cone on colorspace.
5241 Note that if one color is transparent, distance has no color component.
5243 if (p->matte != MagickFalse)
5244 scale=(QuantumScale*p->alpha);
5245 if (q->matte != MagickFalse)
5246 scale*=(QuantumScale*q->alpha);
5247 if (scale <= MagickEpsilon )
5251 CMYK create a CMY cube with a multi-dimensional cone toward black.
5253 if (p->colorspace == CMYKColorspace)
5255 pixel=p->black-q->black;
5256 distance+=pixel*pixel*scale;
5257 if (distance > fuzz)
5258 return(MagickFalse);
5259 scale*=(MagickRealType) (QuantumScale*(QuantumRange-p->black));
5260 scale*=(MagickRealType) (QuantumScale*(QuantumRange-q->black));
5263 RGB or CMY color cube.
5265 distance*=3.0; /* rescale appropriately */
5267 pixel=p->red-q->red;
5268 if ((p->colorspace == HSLColorspace) || (p->colorspace == HSBColorspace) ||
5269 (p->colorspace == HWBColorspace))
5271 /* This calculates a arc distance for hue
5272 Really if should be a vector angle of 'S'/'W' length
5273 with 'L'/'B' forming appropriate cones.
5274 In other words this is a hack - Anthony
5276 if (fabs((double) pixel) > (QuantumRange/2))
5277 pixel-=QuantumRange;
5280 distance+=pixel*pixel*scale;
5281 if (distance > fuzz)
5282 return(MagickFalse);
5283 pixel=p->green-q->green;
5284 distance+=pixel*pixel*scale;
5285 if (distance > fuzz)
5286 return(MagickFalse);
5287 pixel=p->blue-q->blue;
5288 distance+=pixel*pixel*scale;
5289 if (distance > fuzz)
5290 return(MagickFalse);
5295 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5299 + I s F u z z y E q u i v a l e n c e P i x e l P a c k e t %
5303 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5305 % IsFuzzyEquivalencePixelPacket() returns MagickTrue if the distance between
5306 % two pixels is less than the specified distance in a linear three (or four)
5307 % dimensional color space.
5309 % The format of the IsFuzzyEquivalencePixelPacket method is:
5311 % void IsFuzzyEquivalencePixelPacket(const Image *image,
5312 % const PixelPacket *p,const PixelPacket *q)
5314 % A description of each parameter follows:
5316 % o image: the image.
5323 MagickExport MagickBooleanType IsFuzzyEquivalencePixelPacket(const Image *image,
5324 const PixelPacket *p,const PixelPacket *q)
5330 register MagickRealType
5334 if ((image->fuzz == 0.0) && (image->matte == MagickFalse))
5335 return(IsPixelPacketEquivalent(p,q));
5336 fuzz=MagickMax(image->fuzz,(MagickRealType) MagickSQ1_2)*
5337 MagickMax(image->fuzz,(MagickRealType) MagickSQ1_2);
5340 if (image->matte != MagickFalse)
5343 Transparencies are involved - set alpha distance
5345 pixel=(MagickRealType) ((image->matte != MagickFalse ? p->alpha :
5346 OpaqueAlpha)-(image->matte != MagickFalse ? q->alpha : OpaqueAlpha));
5347 distance=pixel*pixel;
5348 if (distance > fuzz)
5349 return(MagickFalse);
5351 Generate a alpha scaling factor to generate a 4D cone on colorspace
5352 Note that if one color is transparent, distance has no color component.
5354 scale=QuantumScale*p->alpha;
5355 scale*=QuantumScale*q->alpha;
5356 if (scale <= MagickEpsilon)
5360 RGB or CMY color cube
5362 distance*=3.0; /* rescale appropriately */
5364 pixel=p->red-(MagickRealType) q->red;
5365 if ((image->colorspace == HSLColorspace) ||
5366 (image->colorspace == HSBColorspace) ||
5367 (image->colorspace == HWBColorspace))
5370 Compute an arc distance for hue. It should be a vector angle of
5371 'S'/'W' length with 'L'/'B' forming appropriate cones.
5373 if (fabs((double) pixel) > (QuantumRange/2))
5374 pixel-=QuantumRange;
5377 distance+=scale*pixel*pixel;
5378 if (distance > fuzz)
5379 return(MagickFalse);
5380 pixel=(MagickRealType) p->green-q->green;
5381 distance+=scale*pixel*pixel;
5382 if (distance > fuzz)
5383 return(MagickFalse);
5384 pixel=(MagickRealType) p->blue-q->blue;
5385 distance+=scale*pixel*pixel;
5386 if (distance > fuzz)
5387 return(MagickFalse);
5392 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5396 % S e t P i x e l C h a n n e l M a p %
5400 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5402 % SetPixelChannelMap() sets the pixel channel map from the specified channel
5405 % The format of the SetPixelChannelMap method is:
5407 % void SetPixelChannelMap(Image *image,const ChannelType channel_mask)
5409 % A description of each parameter follows:
5411 % o image: the image.
5413 % o mask: the channel mask.
5416 MagickExport void SetPixelChannelMap(Image *image,
5417 const ChannelType channel_mask)
5419 #define GetChannelBit(mask,bit) (((size_t) (mask) >> (size_t) (bit)) & 0x01)
5424 image->sync=channel_mask == DefaultChannels ? MagickTrue : MagickFalse;
5425 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
5426 SetPixelChannelMapTraits(image,(PixelChannel) i,
5427 GetChannelBit(channel_mask,i) != 0 ? UpdatePixelTrait : CopyPixelTrait);
5428 for ( ; i < MaxPixelChannels; i++)
5429 SetPixelChannelMapTraits(image,(PixelChannel) i,UndefinedPixelTrait);
5430 if (image->storage_class == PseudoClass)
5431 SetPixelChannelMapTraits(image,IndexPixelChannel,CopyPixelTrait);
5435 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5439 % S e t P i x e l C h a n n e l M a s k %
5443 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5445 % SetPixelChannelMask() sets the pixel channel mask from the specified
5448 % The format of the SetPixelChannelMask method is:
5450 % ChannelType SetPixelChannelMask(Image *image,
5451 % const ChannelType channel_mask)
5453 % A description of each parameter follows:
5455 % o image: the image.
5457 % o channel_mask: the channel mask.
5460 MagickExport ChannelType SetPixelChannelMask(Image *image,
5461 const ChannelType channel_mask)
5466 mask=image->channel_mask;
5467 image->channel_mask=channel_mask;
5468 SetPixelChannelMap(image,channel_mask);