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"
71 #define LogPixelChannels(image) \
76 (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%.20g]", \
77 image->filename,(double) image->number_channels); \
78 for (i=0; i < (ssize_t) image->number_channels; i++) \
81 traits[MaxTextExtent]; \
86 switch (GetPixelChannelMapChannel(image,i)) \
88 case RedPixelChannel: \
91 if (image->colorspace == CMYKColorspace) \
93 if (image->colorspace == GRAYColorspace) \
97 case GreenPixelChannel: \
100 if (image->colorspace == CMYKColorspace) \
104 case BluePixelChannel: \
107 if (image->colorspace == CMYKColorspace) \
111 case BlackPixelChannel: \
114 if (image->storage_class == PseudoClass) \
118 case IndexPixelChannel: \
123 case AlphaPixelChannel: \
128 case MaskPixelChannel: \
133 case MetaPixelChannel: \
139 channel="undefined"; \
142 if ((GetPixelChannelMapTraits(image,i) & UpdatePixelTrait) != 0) \
143 (void) ConcatenateMagickString(traits,"update,",MaxTextExtent); \
144 if ((GetPixelChannelMapTraits(image,i) & BlendPixelTrait) != 0) \
145 (void) ConcatenateMagickString(traits,"blend,",MaxTextExtent); \
146 if ((GetPixelChannelMapTraits(image,i) & CopyPixelTrait) != 0) \
147 (void) ConcatenateMagickString(traits,"copy,",MaxTextExtent); \
148 if (*traits == '\0') \
149 (void) ConcatenateMagickString(traits,"undefined,",MaxTextExtent); \
150 traits[strlen(traits)-1]='\0'; \
151 (void) LogMagickEvent(PixelEvent,GetMagickModule()," %.20g: %s (%s)", \
152 (double) i,channel,traits); \
157 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
161 + A c q u i r e P i x e l C h a n n e l M a p %
165 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
167 % AcquirePixelChannelMap() acquires a pixel component map.
169 % The format of the AcquirePixelChannelMap() method is:
171 % PixelChannelMap *AcquirePixelChannelMap(void)
174 MagickExport PixelChannelMap *AcquirePixelChannelMap(void)
182 channel_map=(PixelChannelMap *) AcquireQuantumMemory(MaxPixelChannels,
183 sizeof(*channel_map));
184 if (channel_map == (PixelChannelMap *) NULL)
185 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
186 (void) ResetMagickMemory(channel_map,0,MaxPixelChannels*sizeof(*channel_map));
187 for (i=0; i < MaxPixelChannels; i++)
188 channel_map[i].channel=(PixelChannel) i;
193 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
197 + C l o n e P i x e l C h a n n e l M a p %
201 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
203 % ClonePixelChannelMap() clones a pixel component map.
205 % The format of the ClonePixelChannelMap() method is:
207 % PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
209 % A description of each parameter follows:
211 % o channel_map: the pixel component map.
214 MagickExport PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
219 assert(channel_map != (PixelChannelMap *) NULL);
220 clone_map=AcquirePixelChannelMap();
221 if (clone_map == (PixelChannelMap *) NULL)
222 return((PixelChannelMap *) NULL);
223 (void) CopyMagickMemory(clone_map,channel_map,MaxPixelChannels*
224 sizeof(*channel_map));
229 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
233 + C l o n e P i x e l I n f o %
237 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
239 % ClonePixelInfo() makes a duplicate of the given pixel info structure, or if
240 % pixel info is NULL, a new one.
242 % The format of the ClonePixelInfo method is:
244 % PixelInfo *ClonePixelInfo(const PixelInfo *pixel_info)
246 % A description of each parameter follows:
248 % o pixel_info: the pixel info.
251 MagickExport PixelInfo *ClonePixelInfo(const PixelInfo *pixel)
256 pixel_info=(PixelInfo *) AcquireQuantumMemory(1,sizeof(*pixel_info));
257 if (pixel_info == (PixelInfo *) NULL)
258 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
259 *pixel_info=(*pixel);
264 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
268 + D e s t r o y P i x e l C h a n n e l M a p %
272 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
274 % DestroyPixelChannelMap() deallocates memory associated with the pixel
277 % The format of the DestroyPixelChannelMap() method is:
279 % PixelChannelMap *DestroyPixelChannelMap(PixelChannelMap *channel_map)
281 % A description of each parameter follows:
283 % o channel_map: the pixel component map.
286 MagickExport PixelChannelMap *DestroyPixelChannelMap(
287 PixelChannelMap *channel_map)
289 assert(channel_map != (PixelChannelMap *) NULL);
290 channel_map=(PixelChannelMap *) RelinquishMagickMemory(channel_map);
291 return((PixelChannelMap *) RelinquishMagickMemory(channel_map));
295 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
299 % E x p o r t I m a g e P i x e l s %
303 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
305 % ExportImagePixels() extracts pixel data from an image and returns it to you.
306 % The method returns MagickTrue on success otherwise MagickFalse if an error is
307 % encountered. The data is returned as char, short int, int, ssize_t, float,
308 % or double in the order specified by map.
310 % Suppose you want to extract the first scanline of a 640x480 image as
311 % character data in red-green-blue order:
313 % ExportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels,exception);
315 % The format of the ExportImagePixels method is:
317 % MagickBooleanType ExportImagePixels(const Image *image,
318 % const ssize_t x_offset,const ssize_t y_offset,const size_t columns,
319 % const size_t rows,const char *map,const StorageType type,
320 % void *pixels,ExceptionInfo *exception)
322 % A description of each parameter follows:
324 % o image: the image.
326 % o x_offset,y_offset,columns,rows: These values define the perimeter
327 % of a region of pixels you want to extract.
329 % o map: This string reflects the expected ordering of the pixel array.
330 % It can be any combination or order of R = red, G = green, B = blue,
331 % A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
332 % Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
335 % o type: Define the data type of the pixels. Float and double types are
336 % normalized to [0..1] otherwise [0..QuantumRange]. Choose from these
337 % types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, LongPixel,
338 % QuantumPixel, or ShortPixel.
340 % o pixels: This array of values contain the pixel components as defined by
341 % map and type. You must preallocate this array where the expected
342 % length varies depending on the values of width, height, map, and type.
344 % o exception: return any errors or warnings in this structure.
347 MagickExport MagickBooleanType ExportImagePixels(const Image *image,
348 const ssize_t x_offset,const ssize_t y_offset,const size_t columns,
349 const size_t rows,const char *map,const StorageType type,void *pixels,
350 ExceptionInfo *exception)
359 register const Quantum
368 assert(image != (Image *) NULL);
369 assert(image->signature == MagickSignature);
370 if (image->debug != MagickFalse)
371 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
373 quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
374 if (quantum_map == (QuantumType *) NULL)
376 (void) ThrowMagickException(exception,GetMagickModule(),
377 ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename);
380 for (i=0; i < (ssize_t) length; i++)
387 quantum_map[i]=AlphaQuantum;
393 quantum_map[i]=BlueQuantum;
399 quantum_map[i]=CyanQuantum;
400 if (image->colorspace == CMYKColorspace)
402 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
403 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
404 "ColorSeparatedImageRequired","`%s'",map);
410 quantum_map[i]=GreenQuantum;
416 quantum_map[i]=IndexQuantum;
422 quantum_map[i]=BlackQuantum;
423 if (image->colorspace == CMYKColorspace)
425 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
426 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
427 "ColorSeparatedImageRequired","`%s'",map);
433 quantum_map[i]=MagentaQuantum;
434 if (image->colorspace == CMYKColorspace)
436 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
437 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
438 "ColorSeparatedImageRequired","`%s'",map);
444 quantum_map[i]=OpacityQuantum;
450 quantum_map[i]=UndefinedQuantum;
456 quantum_map[i]=RedQuantum;
462 quantum_map[i]=YellowQuantum;
463 if (image->colorspace == CMYKColorspace)
465 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
466 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
467 "ColorSeparatedImageRequired","`%s'",map);
472 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
473 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
474 "UnrecognizedPixelMap","`%s'",map);
483 register unsigned char
486 q=(unsigned char *) pixels;
487 if (LocaleCompare(map,"BGR") == 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(GetPixelBlue(image,p));
497 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
498 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
499 p+=GetPixelChannels(image);
504 if (LocaleCompare(map,"BGRA") == 0)
506 for (y=0; y < (ssize_t) rows; y++)
508 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
509 if (p == (const Quantum *) NULL)
511 for (x=0; x < (ssize_t) columns; x++)
513 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
514 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
515 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
516 *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
517 p+=GetPixelChannels(image);
522 if (LocaleCompare(map,"BGRP") == 0)
524 for (y=0; y < (ssize_t) rows; y++)
526 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
527 if (p == (const Quantum *) NULL)
529 for (x=0; x < (ssize_t) columns; x++)
531 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
532 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
533 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
534 *q++=ScaleQuantumToChar((Quantum) 0);
535 p+=GetPixelChannels(image);
540 if (LocaleCompare(map,"I") == 0)
542 for (y=0; y < (ssize_t) rows; y++)
544 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
545 if (p == (const Quantum *) NULL)
547 for (x=0; x < (ssize_t) columns; x++)
549 *q++=ScaleQuantumToChar(GetPixelIntensity(image,p));
550 p+=GetPixelChannels(image);
555 if (LocaleCompare(map,"RGB") == 0)
557 for (y=0; y < (ssize_t) rows; y++)
559 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
560 if (p == (const Quantum *) NULL)
562 for (x=0; x < (ssize_t) columns; x++)
564 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
565 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
566 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
567 p+=GetPixelChannels(image);
572 if (LocaleCompare(map,"RGBA") == 0)
574 for (y=0; y < (ssize_t) rows; y++)
576 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
577 if (p == (const Quantum *) NULL)
579 for (x=0; x < (ssize_t) columns; x++)
581 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
582 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
583 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
584 *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
585 p+=GetPixelChannels(image);
590 if (LocaleCompare(map,"RGBP") == 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++=ScaleQuantumToChar(GetPixelRed(image,p));
600 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
601 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
602 *q++=ScaleQuantumToChar((Quantum) 0);
603 p+=GetPixelChannels(image);
608 for (y=0; y < (ssize_t) rows; y++)
610 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
611 if (p == (const Quantum *) NULL)
613 for (x=0; x < (ssize_t) columns; x++)
615 for (i=0; i < (ssize_t) length; i++)
618 switch (quantum_map[i])
623 *q=ScaleQuantumToChar(GetPixelRed(image,p));
629 *q=ScaleQuantumToChar(GetPixelGreen(image,p));
635 *q=ScaleQuantumToChar(GetPixelBlue(image,p));
640 *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
645 *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
650 if (image->colorspace == CMYKColorspace)
651 *q=ScaleQuantumToChar(GetPixelBlack(image,p));
656 *q=ScaleQuantumToChar(GetPixelIntensity(image,p));
664 p+=GetPixelChannels(image);
675 if (LocaleCompare(map,"BGR") == 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*GetPixelBlue(image,p));
685 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
686 *q++=(double) (QuantumScale*GetPixelRed(image,p));
687 p+=GetPixelChannels(image);
692 if (LocaleCompare(map,"BGRA") == 0)
694 for (y=0; y < (ssize_t) rows; y++)
696 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
697 if (p == (const Quantum *) NULL)
699 for (x=0; x < (ssize_t) columns; x++)
701 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
702 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
703 *q++=(double) (QuantumScale*GetPixelRed(image,p));
704 *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
705 p+=GetPixelChannels(image);
710 if (LocaleCompare(map,"BGRP") == 0)
712 for (y=0; y < (ssize_t) rows; y++)
714 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
715 if (p == (const Quantum *) NULL)
717 for (x=0; x < (ssize_t) columns; x++)
719 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
720 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
721 *q++=(double) (QuantumScale*GetPixelRed(image,p));
723 p+=GetPixelChannels(image);
728 if (LocaleCompare(map,"I") == 0)
730 for (y=0; y < (ssize_t) rows; y++)
732 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
733 if (p == (const Quantum *) NULL)
735 for (x=0; x < (ssize_t) columns; x++)
737 *q++=(double) (QuantumScale*GetPixelIntensity(image,p));
738 p+=GetPixelChannels(image);
743 if (LocaleCompare(map,"RGB") == 0)
745 for (y=0; y < (ssize_t) rows; y++)
747 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
748 if (p == (const Quantum *) NULL)
750 for (x=0; x < (ssize_t) columns; x++)
752 *q++=(double) (QuantumScale*GetPixelRed(image,p));
753 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
754 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
755 p+=GetPixelChannels(image);
760 if (LocaleCompare(map,"RGBA") == 0)
762 for (y=0; y < (ssize_t) rows; y++)
764 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
765 if (p == (const Quantum *) NULL)
767 for (x=0; x < (ssize_t) columns; x++)
769 *q++=(double) (QuantumScale*GetPixelRed(image,p));
770 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
771 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
772 *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
773 p+=GetPixelChannels(image);
778 if (LocaleCompare(map,"RGBP") == 0)
780 for (y=0; y < (ssize_t) rows; y++)
782 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
783 if (p == (const Quantum *) NULL)
785 for (x=0; x < (ssize_t) columns; x++)
787 *q++=(double) (QuantumScale*GetPixelRed(image,p));
788 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
789 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
791 p+=GetPixelChannels(image);
796 for (y=0; y < (ssize_t) rows; y++)
798 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
799 if (p == (const Quantum *) NULL)
801 for (x=0; x < (ssize_t) columns; x++)
803 for (i=0; i < (ssize_t) length; i++)
806 switch (quantum_map[i])
811 *q=(double) (QuantumScale*GetPixelRed(image,p));
817 *q=(double) (QuantumScale*GetPixelGreen(image,p));
823 *q=(double) (QuantumScale*GetPixelBlue(image,p));
828 *q=(double) (QuantumScale*GetPixelAlpha(image,p));
833 *q=(double) (QuantumScale*GetPixelAlpha(image,p));
838 if (image->colorspace == CMYKColorspace)
839 *q=(double) (QuantumScale*
840 GetPixelBlack(image,p));
845 *q=(double) (QuantumScale*GetPixelIntensity(image,p));
853 p+=GetPixelChannels(image);
864 if (LocaleCompare(map,"BGR") == 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*GetPixelBlue(image,p));
874 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
875 *q++=(float) (QuantumScale*GetPixelRed(image,p));
876 p+=GetPixelChannels(image);
881 if (LocaleCompare(map,"BGRA") == 0)
883 for (y=0; y < (ssize_t) rows; y++)
885 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
886 if (p == (const Quantum *) NULL)
888 for (x=0; x < (ssize_t) columns; x++)
890 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
891 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
892 *q++=(float) (QuantumScale*GetPixelRed(image,p));
893 *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
894 p+=GetPixelChannels(image);
899 if (LocaleCompare(map,"BGRP") == 0)
901 for (y=0; y < (ssize_t) rows; y++)
903 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
904 if (p == (const Quantum *) NULL)
906 for (x=0; x < (ssize_t) columns; x++)
908 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
909 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
910 *q++=(float) (QuantumScale*GetPixelRed(image,p));
912 p+=GetPixelChannels(image);
917 if (LocaleCompare(map,"I") == 0)
919 for (y=0; y < (ssize_t) rows; y++)
921 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
922 if (p == (const Quantum *) NULL)
924 for (x=0; x < (ssize_t) columns; x++)
926 *q++=(float) (QuantumScale*GetPixelIntensity(image,p));
927 p+=GetPixelChannels(image);
932 if (LocaleCompare(map,"RGB") == 0)
934 for (y=0; y < (ssize_t) rows; y++)
936 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
937 if (p == (const Quantum *) NULL)
939 for (x=0; x < (ssize_t) columns; x++)
941 *q++=(float) (QuantumScale*GetPixelRed(image,p));
942 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
943 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
944 p+=GetPixelChannels(image);
949 if (LocaleCompare(map,"RGBA") == 0)
951 for (y=0; y < (ssize_t) rows; y++)
953 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
954 if (p == (const Quantum *) NULL)
956 for (x=0; x < (ssize_t) columns; x++)
958 *q++=(float) (QuantumScale*GetPixelRed(image,p));
959 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
960 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
961 *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
962 p+=GetPixelChannels(image);
967 if (LocaleCompare(map,"RGBP") == 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++=(float) (QuantumScale*GetPixelRed(image,p));
977 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
978 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
980 p+=GetPixelChannels(image);
985 for (y=0; y < (ssize_t) rows; y++)
987 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
988 if (p == (const Quantum *) NULL)
990 for (x=0; x < (ssize_t) columns; x++)
992 for (i=0; i < (ssize_t) length; i++)
995 switch (quantum_map[i])
1000 *q=(float) (QuantumScale*GetPixelRed(image,p));
1004 case MagentaQuantum:
1006 *q=(float) (QuantumScale*GetPixelGreen(image,p));
1012 *q=(float) (QuantumScale*GetPixelBlue(image,p));
1017 *q=(float) (QuantumScale*((Quantum) (GetPixelAlpha(image,p))));
1020 case OpacityQuantum:
1022 *q=(float) (QuantumScale*GetPixelAlpha(image,p));
1027 if (image->colorspace == CMYKColorspace)
1028 *q=(float) (QuantumScale* GetPixelBlack(image,p));
1033 *q=(float) (QuantumScale*GetPixelIntensity(image,p));
1041 p+=GetPixelChannels(image);
1048 register unsigned int
1051 q=(unsigned int *) pixels;
1052 if (LocaleCompare(map,"BGR") == 0)
1054 for (y=0; y < (ssize_t) rows; y++)
1056 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1057 if (p == (const Quantum *) NULL)
1059 for (x=0; x < (ssize_t) columns; x++)
1061 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1062 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1063 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1064 p+=GetPixelChannels(image);
1069 if (LocaleCompare(map,"BGRA") == 0)
1071 for (y=0; y < (ssize_t) rows; y++)
1073 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1074 if (p == (const Quantum *) NULL)
1076 for (x=0; x < (ssize_t) columns; x++)
1078 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1079 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1080 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1081 *q++=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
1082 p+=GetPixelChannels(image);
1087 if (LocaleCompare(map,"BGRP") == 0)
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 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1097 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1098 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1100 p+=GetPixelChannels(image);
1105 if (LocaleCompare(map,"I") == 0)
1107 for (y=0; y < (ssize_t) rows; y++)
1109 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1110 if (p == (const Quantum *) NULL)
1112 for (x=0; x < (ssize_t) columns; x++)
1114 *q++=(unsigned int) ScaleQuantumToLong(
1115 GetPixelIntensity(image,p));
1116 p+=GetPixelChannels(image);
1121 if (LocaleCompare(map,"RGB") == 0)
1123 for (y=0; y < (ssize_t) rows; y++)
1125 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1126 if (p == (const Quantum *) NULL)
1128 for (x=0; x < (ssize_t) columns; x++)
1130 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1131 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1132 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1133 p+=GetPixelChannels(image);
1138 if (LocaleCompare(map,"RGBA") == 0)
1140 for (y=0; y < (ssize_t) rows; y++)
1142 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1143 if (p == (const Quantum *) NULL)
1145 for (x=0; x < (ssize_t) columns; x++)
1147 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1148 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1149 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1150 *q++=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
1151 p+=GetPixelChannels(image);
1156 if (LocaleCompare(map,"RGBP") == 0)
1158 for (y=0; y < (ssize_t) rows; y++)
1160 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1161 if (p == (const Quantum *) NULL)
1163 for (x=0; x < (ssize_t) columns; x++)
1165 *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1166 *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1167 *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1169 p+=GetPixelChannels(image);
1174 for (y=0; y < (ssize_t) rows; y++)
1176 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1177 if (p == (const Quantum *) NULL)
1179 for (x=0; x < (ssize_t) columns; x++)
1181 for (i=0; i < (ssize_t) length; i++)
1184 switch (quantum_map[i])
1189 *q=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
1193 case MagentaQuantum:
1195 *q=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
1201 *q=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
1206 *q=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
1209 case OpacityQuantum:
1211 *q=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
1216 if (image->colorspace == CMYKColorspace)
1217 *q=(unsigned int) ScaleQuantumToLong(GetPixelBlack(image,p));
1222 *q=(unsigned int) ScaleQuantumToLong(
1223 GetPixelIntensity(image,p));
1231 p+=GetPixelChannels(image);
1241 q=(size_t *) pixels;
1242 if (LocaleCompare(map,"BGR") == 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(GetPixelBlue(image,p));
1252 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1253 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1254 p+=GetPixelChannels(image);
1259 if (LocaleCompare(map,"BGRA") == 0)
1261 for (y=0; y < (ssize_t) rows; y++)
1263 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1264 if (p == (const Quantum *) NULL)
1266 for (x=0; x < (ssize_t) columns; x++)
1268 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1269 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1270 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1271 *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1272 p+=GetPixelChannels(image);
1277 if (LocaleCompare(map,"BGRP") == 0)
1279 for (y=0; y < (ssize_t) rows; y++)
1281 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1282 if (p == (const Quantum *) NULL)
1284 for (x=0; x < (ssize_t) columns; x++)
1286 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1287 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1288 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1290 p+=GetPixelChannels(image);
1295 if (LocaleCompare(map,"I") == 0)
1297 for (y=0; y < (ssize_t) rows; y++)
1299 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1300 if (p == (const Quantum *) NULL)
1302 for (x=0; x < (ssize_t) columns; x++)
1304 *q++=ScaleQuantumToLong(GetPixelIntensity(image,p));
1305 p+=GetPixelChannels(image);
1310 if (LocaleCompare(map,"RGB") == 0)
1312 for (y=0; y < (ssize_t) rows; y++)
1314 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1315 if (p == (const Quantum *) NULL)
1317 for (x=0; x < (ssize_t) columns; x++)
1319 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1320 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1321 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1322 p+=GetPixelChannels(image);
1327 if (LocaleCompare(map,"RGBA") == 0)
1329 for (y=0; y < (ssize_t) rows; y++)
1331 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1332 if (p == (const Quantum *) NULL)
1334 for (x=0; x < (ssize_t) columns; x++)
1336 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1337 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1338 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1339 *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1340 p+=GetPixelChannels(image);
1345 if (LocaleCompare(map,"RGBP") == 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++=ScaleQuantumToLong(GetPixelRed(image,p));
1355 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1356 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1358 p+=GetPixelChannels(image);
1363 for (y=0; y < (ssize_t) rows; y++)
1365 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1366 if (p == (const Quantum *) NULL)
1368 for (x=0; x < (ssize_t) columns; x++)
1370 for (i=0; i < (ssize_t) length; i++)
1373 switch (quantum_map[i])
1378 *q=ScaleQuantumToLong(GetPixelRed(image,p));
1382 case MagentaQuantum:
1384 *q=ScaleQuantumToLong(GetPixelGreen(image,p));
1390 *q=ScaleQuantumToLong(GetPixelBlue(image,p));
1395 *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1398 case OpacityQuantum:
1400 *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1405 if (image->colorspace == CMYKColorspace)
1406 *q=ScaleQuantumToLong(GetPixelBlack(image,p));
1411 *q=ScaleQuantumToLong(GetPixelIntensity(image,p));
1419 p+=GetPixelChannels(image);
1429 q=(Quantum *) pixels;
1430 if (LocaleCompare(map,"BGR") == 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++=GetPixelBlue(image,p);
1440 *q++=GetPixelGreen(image,p);
1441 *q++=GetPixelRed(image,p);
1442 p+=GetPixelChannels(image);
1447 if (LocaleCompare(map,"BGRA") == 0)
1449 for (y=0; y < (ssize_t) rows; y++)
1451 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1452 if (p == (const Quantum *) NULL)
1454 for (x=0; x < (ssize_t) columns; x++)
1456 *q++=GetPixelBlue(image,p);
1457 *q++=GetPixelGreen(image,p);
1458 *q++=GetPixelRed(image,p);
1459 *q++=(Quantum) (GetPixelAlpha(image,p));
1460 p+=GetPixelChannels(image);
1465 if (LocaleCompare(map,"BGRP") == 0)
1467 for (y=0; y < (ssize_t) rows; y++)
1469 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1470 if (p == (const Quantum *) NULL)
1472 for (x=0; x < (ssize_t) columns; x++)
1474 *q++=GetPixelBlue(image,p);
1475 *q++=GetPixelGreen(image,p);
1476 *q++=GetPixelRed(image,p);
1478 p+=GetPixelChannels(image);
1483 if (LocaleCompare(map,"I") == 0)
1485 for (y=0; y < (ssize_t) rows; y++)
1487 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1488 if (p == (const Quantum *) NULL)
1490 for (x=0; x < (ssize_t) columns; x++)
1492 *q++=GetPixelIntensity(image,p);
1493 p+=GetPixelChannels(image);
1498 if (LocaleCompare(map,"RGB") == 0)
1500 for (y=0; y < (ssize_t) rows; y++)
1502 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1503 if (p == (const Quantum *) NULL)
1505 for (x=0; x < (ssize_t) columns; x++)
1507 *q++=GetPixelRed(image,p);
1508 *q++=GetPixelGreen(image,p);
1509 *q++=GetPixelBlue(image,p);
1510 p+=GetPixelChannels(image);
1515 if (LocaleCompare(map,"RGBA") == 0)
1517 for (y=0; y < (ssize_t) rows; y++)
1519 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1520 if (p == (const Quantum *) NULL)
1522 for (x=0; x < (ssize_t) columns; x++)
1524 *q++=GetPixelRed(image,p);
1525 *q++=GetPixelGreen(image,p);
1526 *q++=GetPixelBlue(image,p);
1527 *q++=(Quantum) (GetPixelAlpha(image,p));
1528 p+=GetPixelChannels(image);
1533 if (LocaleCompare(map,"RGBP") == 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++=GetPixelRed(image,p);
1543 *q++=GetPixelGreen(image,p);
1544 *q++=GetPixelBlue(image,p);
1546 p+=GetPixelChannels(image);
1551 for (y=0; y < (ssize_t) rows; y++)
1553 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1554 if (p == (const Quantum *) NULL)
1556 for (x=0; x < (ssize_t) columns; x++)
1558 for (i=0; i < (ssize_t) length; i++)
1561 switch (quantum_map[i])
1566 *q=GetPixelRed(image,p);
1570 case MagentaQuantum:
1572 *q=GetPixelGreen(image,p);
1578 *q=GetPixelBlue(image,p);
1583 *q=(Quantum) (GetPixelAlpha(image,p));
1586 case OpacityQuantum:
1588 *q=GetPixelAlpha(image,p);
1593 if (image->colorspace == CMYKColorspace)
1594 *q=GetPixelBlack(image,p);
1599 *q=(GetPixelIntensity(image,p));
1607 p+=GetPixelChannels(image);
1614 register unsigned short
1617 q=(unsigned short *) pixels;
1618 if (LocaleCompare(map,"BGR") == 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(GetPixelBlue(image,p));
1628 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1629 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1630 p+=GetPixelChannels(image);
1635 if (LocaleCompare(map,"BGRA") == 0)
1637 for (y=0; y < (ssize_t) rows; y++)
1639 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1640 if (p == (const Quantum *) NULL)
1642 for (x=0; x < (ssize_t) columns; x++)
1644 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1645 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1646 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1647 *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1648 p+=GetPixelChannels(image);
1653 if (LocaleCompare(map,"BGRP") == 0)
1655 for (y=0; y < (ssize_t) rows; y++)
1657 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1658 if (p == (const Quantum *) NULL)
1660 for (x=0; x < (ssize_t) columns; x++)
1662 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1663 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1664 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1666 p+=GetPixelChannels(image);
1671 if (LocaleCompare(map,"I") == 0)
1673 for (y=0; y < (ssize_t) rows; y++)
1675 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1676 if (p == (const Quantum *) NULL)
1678 for (x=0; x < (ssize_t) columns; x++)
1680 *q++=ScaleQuantumToShort(GetPixelIntensity(image,p));
1681 p+=GetPixelChannels(image);
1686 if (LocaleCompare(map,"RGB") == 0)
1688 for (y=0; y < (ssize_t) rows; y++)
1690 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1691 if (p == (const Quantum *) NULL)
1693 for (x=0; x < (ssize_t) columns; x++)
1695 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1696 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1697 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1698 p+=GetPixelChannels(image);
1703 if (LocaleCompare(map,"RGBA") == 0)
1705 for (y=0; y < (ssize_t) rows; y++)
1707 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1708 if (p == (const Quantum *) NULL)
1710 for (x=0; x < (ssize_t) columns; x++)
1712 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1713 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1714 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1715 *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1716 p+=GetPixelChannels(image);
1721 if (LocaleCompare(map,"RGBP") == 0)
1723 for (y=0; y < (ssize_t) rows; y++)
1725 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1726 if (p == (const Quantum *) NULL)
1728 for (x=0; x < (ssize_t) columns; x++)
1730 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1731 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1732 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1734 p+=GetPixelChannels(image);
1739 for (y=0; y < (ssize_t) rows; y++)
1741 p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1742 if (p == (const Quantum *) NULL)
1744 for (x=0; x < (ssize_t) columns; x++)
1746 for (i=0; i < (ssize_t) length; i++)
1749 switch (quantum_map[i])
1754 *q=ScaleQuantumToShort(GetPixelRed(image,p));
1758 case MagentaQuantum:
1760 *q=ScaleQuantumToShort(GetPixelGreen(image,p));
1766 *q=ScaleQuantumToShort(GetPixelBlue(image,p));
1771 *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1774 case OpacityQuantum:
1776 *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1781 if (image->colorspace == CMYKColorspace)
1782 *q=ScaleQuantumToShort(GetPixelBlack(image,p));
1787 *q=ScaleQuantumToShort(GetPixelIntensity(image,p));
1795 p+=GetPixelChannels(image);
1802 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1803 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
1804 "UnrecognizedPixelMap","`%s'",map);
1808 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1813 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1817 % G e t P i x e l I n f o %
1821 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1823 % GetPixelInfo() initializes the PixelInfo structure.
1825 % The format of the GetPixelInfo method is:
1827 % GetPixelInfo(const Image *image,PixelInfo *pixel)
1829 % A description of each parameter follows:
1831 % o image: the image.
1833 % o pixel: Specifies a pointer to a PixelInfo structure.
1836 MagickExport void GetPixelInfo(const Image *image,PixelInfo *pixel)
1838 pixel->storage_class=DirectClass;
1839 pixel->colorspace=RGBColorspace;
1840 pixel->matte=MagickFalse;
1842 pixel->depth=MAGICKCORE_QUANTUM_DEPTH;
1847 pixel->alpha=(MagickRealType) OpaqueAlpha;
1849 if (image == (const Image *) NULL)
1851 pixel->storage_class=image->storage_class;
1852 pixel->colorspace=image->colorspace;
1853 pixel->matte=image->matte;
1854 pixel->depth=image->depth;
1855 pixel->fuzz=image->fuzz;
1859 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1863 % I m p o r t I m a g e P i x e l s %
1867 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1869 % ImportImagePixels() accepts pixel data and stores in the image at the
1870 % location you specify. The method returns MagickTrue on success otherwise
1871 % MagickFalse if an error is encountered. The pixel data can be either char,
1872 % short int, int, ssize_t, float, or double in the order specified by map.
1874 % Suppose your want to upload the first scanline of a 640x480 image from
1875 % character data in red-green-blue order:
1877 % ImportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels);
1879 % The format of the ImportImagePixels method is:
1881 % MagickBooleanType ImportImagePixels(Image *image,const ssize_t x_offset,
1882 % const ssize_t y_offset,const size_t columns,
1883 % const size_t rows,const char *map,const StorageType type,
1884 % const void *pixels,ExceptionInfo *exception)
1886 % A description of each parameter follows:
1888 % o image: the image.
1890 % o x_offset,y_offset,columns,rows: These values define the perimeter
1891 % of a region of pixels you want to define.
1893 % o map: This string reflects the expected ordering of the pixel array.
1894 % It can be any combination or order of R = red, G = green, B = blue,
1895 % A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
1896 % Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
1899 % o type: Define the data type of the pixels. Float and double types are
1900 % normalized to [0..1] otherwise [0..QuantumRange]. Choose from these
1901 % types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, or
1904 % o pixels: This array of values contain the pixel components as defined by
1905 % map and type. You must preallocate this array where the expected
1906 % length varies depending on the values of width, height, map, and type.
1908 % o exception: return any errors or warnings in this structure.
1911 MagickExport MagickBooleanType ImportImagePixels(Image *image,
1912 const ssize_t x_offset,const ssize_t y_offset,const size_t columns,
1913 const size_t rows,const char *map,const StorageType type,
1914 const void *pixels,ExceptionInfo *exception)
1933 Allocate image structure.
1935 assert(image != (Image *) NULL);
1936 assert(image->signature == MagickSignature);
1937 if (image->debug != MagickFalse)
1938 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1940 quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
1941 if (quantum_map == (QuantumType *) NULL)
1942 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
1944 for (i=0; i < (ssize_t) length; i++)
1951 quantum_map[i]=AlphaQuantum;
1952 image->matte=MagickTrue;
1958 quantum_map[i]=BlueQuantum;
1964 quantum_map[i]=CyanQuantum;
1965 (void) SetImageColorspace(image,CMYKColorspace,exception);
1971 quantum_map[i]=GreenQuantum;
1977 quantum_map[i]=BlackQuantum;
1978 (void) SetImageColorspace(image,CMYKColorspace,exception);
1984 quantum_map[i]=IndexQuantum;
1990 quantum_map[i]=MagentaQuantum;
1991 (void) SetImageColorspace(image,CMYKColorspace,exception);
1997 quantum_map[i]=OpacityQuantum;
1998 image->matte=MagickTrue;
2004 quantum_map[i]=UndefinedQuantum;
2010 quantum_map[i]=RedQuantum;
2016 quantum_map[i]=YellowQuantum;
2017 (void) SetImageColorspace(image,CMYKColorspace,exception);
2022 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2023 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
2024 "UnrecognizedPixelMap","`%s'",map);
2025 return(MagickFalse);
2029 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2030 return(MagickFalse);
2032 Transfer the pixels from the pixel datarray to the image.
2038 register const unsigned char
2041 p=(const unsigned char *) pixels;
2042 if (LocaleCompare(map,"BGR") == 0)
2044 for (y=0; y < (ssize_t) rows; y++)
2046 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2047 if (q == (Quantum *) NULL)
2049 for (x=0; x < (ssize_t) columns; x++)
2051 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2052 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2053 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2054 q+=GetPixelChannels(image);
2056 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2061 if (LocaleCompare(map,"BGRA") == 0)
2063 for (y=0; y < (ssize_t) rows; y++)
2065 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2066 if (q == (Quantum *) NULL)
2068 for (x=0; x < (ssize_t) columns; x++)
2070 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2071 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2072 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2073 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2074 q+=GetPixelChannels(image);
2076 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2081 if (LocaleCompare(map,"BGRO") == 0)
2083 for (y=0; y < (ssize_t) rows; y++)
2085 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2086 if (q == (Quantum *) NULL)
2088 for (x=0; x < (ssize_t) columns; x++)
2090 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2091 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2092 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2093 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2094 q+=GetPixelChannels(image);
2096 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2101 if (LocaleCompare(map,"BGRP") == 0)
2103 for (y=0; y < (ssize_t) rows; y++)
2105 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2106 if (q == (Quantum *) NULL)
2108 for (x=0; x < (ssize_t) columns; x++)
2110 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2111 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2112 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2114 q+=GetPixelChannels(image);
2116 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2121 if (LocaleCompare(map,"I") == 0)
2123 for (y=0; y < (ssize_t) rows; y++)
2125 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2126 if (q == (Quantum *) NULL)
2128 for (x=0; x < (ssize_t) columns; x++)
2130 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2131 SetPixelGreen(image,GetPixelRed(image,q),q);
2132 SetPixelBlue(image,GetPixelRed(image,q),q);
2133 q+=GetPixelChannels(image);
2135 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2140 if (LocaleCompare(map,"RGB") == 0)
2142 for (y=0; y < (ssize_t) rows; y++)
2144 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2145 if (q == (Quantum *) NULL)
2147 for (x=0; x < (ssize_t) columns; x++)
2149 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2150 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2151 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2152 q+=GetPixelChannels(image);
2154 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2159 if (LocaleCompare(map,"RGBA") == 0)
2161 for (y=0; y < (ssize_t) rows; y++)
2163 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2164 if (q == (Quantum *) NULL)
2166 for (x=0; x < (ssize_t) columns; x++)
2168 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2169 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2170 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2171 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2172 q+=GetPixelChannels(image);
2174 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2179 if (LocaleCompare(map,"RGBO") == 0)
2181 for (y=0; y < (ssize_t) rows; y++)
2183 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2184 if (q == (Quantum *) NULL)
2186 for (x=0; x < (ssize_t) columns; x++)
2188 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2189 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2190 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2191 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2192 q+=GetPixelChannels(image);
2194 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2199 if (LocaleCompare(map,"RGBP") == 0)
2201 for (y=0; y < (ssize_t) rows; y++)
2203 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2204 if (q == (Quantum *) NULL)
2206 for (x=0; x < (ssize_t) columns; x++)
2208 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2209 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2210 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2212 q+=GetPixelChannels(image);
2214 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2219 for (y=0; y < (ssize_t) rows; y++)
2221 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2222 if (q == (Quantum *) NULL)
2224 for (x=0; x < (ssize_t) columns; x++)
2226 for (i=0; i < (ssize_t) length; i++)
2228 switch (quantum_map[i])
2233 SetPixelRed(image,ScaleCharToQuantum(*p),q);
2237 case MagentaQuantum:
2239 SetPixelGreen(image,ScaleCharToQuantum(*p),q);
2245 SetPixelBlue(image,ScaleCharToQuantum(*p),q);
2250 SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2253 case OpacityQuantum:
2255 SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2260 SetPixelBlack(image,ScaleCharToQuantum(*p),q);
2265 SetPixelRed(image,ScaleCharToQuantum(*p),q);
2266 SetPixelGreen(image,GetPixelRed(image,q),q);
2267 SetPixelBlue(image,GetPixelRed(image,q),q);
2275 q+=GetPixelChannels(image);
2277 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2284 register const double
2287 p=(const double *) pixels;
2288 if (LocaleCompare(map,"BGR") == 0)
2290 for (y=0; y < (ssize_t) rows; y++)
2292 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2293 if (q == (Quantum *) NULL)
2295 for (x=0; x < (ssize_t) columns; x++)
2297 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2300 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2303 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2306 q+=GetPixelChannels(image);
2308 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2313 if (LocaleCompare(map,"BGRA") == 0)
2315 for (y=0; y < (ssize_t) rows; y++)
2317 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2318 if (q == (Quantum *) NULL)
2320 for (x=0; x < (ssize_t) columns; x++)
2322 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2325 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2328 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2331 SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2334 q+=GetPixelChannels(image);
2336 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2341 if (LocaleCompare(map,"BGRP") == 0)
2343 for (y=0; y < (ssize_t) rows; y++)
2345 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2346 if (q == (Quantum *) NULL)
2348 for (x=0; x < (ssize_t) columns; x++)
2350 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2353 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2356 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2360 q+=GetPixelChannels(image);
2362 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2367 if (LocaleCompare(map,"I") == 0)
2369 for (y=0; y < (ssize_t) rows; y++)
2371 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2372 if (q == (Quantum *) NULL)
2374 for (x=0; x < (ssize_t) columns; x++)
2376 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2378 SetPixelGreen(image,GetPixelRed(image,q),q);
2379 SetPixelBlue(image,GetPixelRed(image,q),q);
2381 q+=GetPixelChannels(image);
2383 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2388 if (LocaleCompare(map,"RGB") == 0)
2390 for (y=0; y < (ssize_t) rows; y++)
2392 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2393 if (q == (Quantum *) NULL)
2395 for (x=0; x < (ssize_t) columns; x++)
2397 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2400 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2403 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2406 q+=GetPixelChannels(image);
2408 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2413 if (LocaleCompare(map,"RGBA") == 0)
2415 for (y=0; y < (ssize_t) rows; y++)
2417 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2418 if (q == (Quantum *) NULL)
2420 for (x=0; x < (ssize_t) columns; x++)
2422 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2425 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2428 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2431 SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2434 q+=GetPixelChannels(image);
2436 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2441 if (LocaleCompare(map,"RGBP") == 0)
2443 for (y=0; y < (ssize_t) rows; y++)
2445 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2446 if (q == (Quantum *) NULL)
2448 for (x=0; x < (ssize_t) columns; x++)
2450 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2453 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2456 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2459 q+=GetPixelChannels(image);
2461 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2466 for (y=0; y < (ssize_t) rows; y++)
2468 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2469 if (q == (Quantum *) NULL)
2471 for (x=0; x < (ssize_t) columns; x++)
2473 for (i=0; i < (ssize_t) length; i++)
2475 switch (quantum_map[i])
2480 SetPixelRed(image,ClampToQuantum((MagickRealType)
2481 QuantumRange*(*p)),q);
2485 case MagentaQuantum:
2487 SetPixelGreen(image,ClampToQuantum((MagickRealType)
2488 QuantumRange*(*p)),q);
2494 SetPixelBlue(image,ClampToQuantum((MagickRealType)
2495 QuantumRange*(*p)),q);
2500 SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2501 QuantumRange*(*p)),q);
2504 case OpacityQuantum:
2506 SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2507 QuantumRange*(*p)),q);
2512 SetPixelBlack(image,ClampToQuantum((MagickRealType)
2513 QuantumRange*(*p)),q);
2518 SetPixelRed(image,ClampToQuantum((MagickRealType)
2519 QuantumRange*(*p)),q);
2520 SetPixelGreen(image,GetPixelRed(image,q),q);
2521 SetPixelBlue(image,GetPixelRed(image,q),q);
2529 q+=GetPixelChannels(image);
2531 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2538 register const float
2541 p=(const float *) pixels;
2542 if (LocaleCompare(map,"BGR") == 0)
2544 for (y=0; y < (ssize_t) rows; y++)
2546 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2547 if (q == (Quantum *) NULL)
2549 for (x=0; x < (ssize_t) columns; x++)
2551 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2554 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2557 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2560 q+=GetPixelChannels(image);
2562 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2567 if (LocaleCompare(map,"BGRA") == 0)
2569 for (y=0; y < (ssize_t) rows; y++)
2571 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2572 if (q == (Quantum *) NULL)
2574 for (x=0; x < (ssize_t) columns; x++)
2576 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2579 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2582 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2585 SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2588 q+=GetPixelChannels(image);
2590 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2595 if (LocaleCompare(map,"BGRP") == 0)
2597 for (y=0; y < (ssize_t) rows; y++)
2599 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2600 if (q == (Quantum *) NULL)
2602 for (x=0; x < (ssize_t) columns; x++)
2604 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2607 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2610 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2614 q+=GetPixelChannels(image);
2616 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2621 if (LocaleCompare(map,"I") == 0)
2623 for (y=0; y < (ssize_t) rows; y++)
2625 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2626 if (q == (Quantum *) NULL)
2628 for (x=0; x < (ssize_t) columns; x++)
2630 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2632 SetPixelGreen(image,GetPixelRed(image,q),q);
2633 SetPixelBlue(image,GetPixelRed(image,q),q);
2635 q+=GetPixelChannels(image);
2637 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2642 if (LocaleCompare(map,"RGB") == 0)
2644 for (y=0; y < (ssize_t) rows; y++)
2646 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2647 if (q == (Quantum *) NULL)
2649 for (x=0; x < (ssize_t) columns; x++)
2651 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2654 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2657 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2660 q+=GetPixelChannels(image);
2662 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2667 if (LocaleCompare(map,"RGBA") == 0)
2669 for (y=0; y < (ssize_t) rows; y++)
2671 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2672 if (q == (Quantum *) NULL)
2674 for (x=0; x < (ssize_t) columns; x++)
2676 SetPixelRed(image,ClampToQuantum((MagickRealType)
2677 QuantumRange*(*p)),q);
2679 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2682 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2685 SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2688 q+=GetPixelChannels(image);
2690 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2695 if (LocaleCompare(map,"RGBP") == 0)
2697 for (y=0; y < (ssize_t) rows; y++)
2699 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2700 if (q == (Quantum *) NULL)
2702 for (x=0; x < (ssize_t) columns; x++)
2704 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2707 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2710 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2713 q+=GetPixelChannels(image);
2715 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2720 for (y=0; y < (ssize_t) rows; y++)
2722 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2723 if (q == (Quantum *) NULL)
2725 for (x=0; x < (ssize_t) columns; x++)
2727 for (i=0; i < (ssize_t) length; i++)
2729 switch (quantum_map[i])
2734 SetPixelRed(image,ClampToQuantum((MagickRealType)
2735 QuantumRange*(*p)),q);
2739 case MagentaQuantum:
2741 SetPixelGreen(image,ClampToQuantum((MagickRealType)
2742 QuantumRange*(*p)),q);
2748 SetPixelBlue(image,ClampToQuantum((MagickRealType)
2749 QuantumRange*(*p)),q);
2754 SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2755 QuantumRange*(*p)),q);
2758 case OpacityQuantum:
2760 SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2761 QuantumRange*(*p)),q);
2766 SetPixelBlack(image,ClampToQuantum((MagickRealType)
2767 QuantumRange*(*p)),q);
2772 SetPixelRed(image,ClampToQuantum((MagickRealType)
2773 QuantumRange*(*p)),q);
2774 SetPixelGreen(image,GetPixelRed(image,q),q);
2775 SetPixelBlue(image,GetPixelRed(image,q),q);
2783 q+=GetPixelChannels(image);
2785 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2792 register const unsigned int
2795 p=(const unsigned int *) pixels;
2796 if (LocaleCompare(map,"BGR") == 0)
2798 for (y=0; y < (ssize_t) rows; y++)
2800 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2801 if (q == (Quantum *) NULL)
2803 for (x=0; x < (ssize_t) columns; x++)
2805 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2806 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2807 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2808 q+=GetPixelChannels(image);
2810 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2815 if (LocaleCompare(map,"BGRA") == 0)
2817 for (y=0; y < (ssize_t) rows; y++)
2819 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2820 if (q == (Quantum *) NULL)
2822 for (x=0; x < (ssize_t) columns; x++)
2824 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2825 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2826 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2827 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2828 q+=GetPixelChannels(image);
2830 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2835 if (LocaleCompare(map,"BGRP") == 0)
2837 for (y=0; y < (ssize_t) rows; y++)
2839 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2840 if (q == (Quantum *) NULL)
2842 for (x=0; x < (ssize_t) columns; x++)
2844 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2845 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2846 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2848 q+=GetPixelChannels(image);
2850 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2855 if (LocaleCompare(map,"I") == 0)
2857 for (y=0; y < (ssize_t) rows; y++)
2859 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2860 if (q == (Quantum *) NULL)
2862 for (x=0; x < (ssize_t) columns; x++)
2864 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2865 SetPixelGreen(image,GetPixelRed(image,q),q);
2866 SetPixelBlue(image,GetPixelRed(image,q),q);
2867 q+=GetPixelChannels(image);
2869 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2874 if (LocaleCompare(map,"RGB") == 0)
2876 for (y=0; y < (ssize_t) rows; y++)
2878 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2879 if (q == (Quantum *) NULL)
2881 for (x=0; x < (ssize_t) columns; x++)
2883 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2884 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2885 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2886 q+=GetPixelChannels(image);
2888 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2893 if (LocaleCompare(map,"RGBA") == 0)
2895 for (y=0; y < (ssize_t) rows; y++)
2897 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2898 if (q == (Quantum *) NULL)
2900 for (x=0; x < (ssize_t) columns; x++)
2902 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2903 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2904 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2905 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2906 q+=GetPixelChannels(image);
2908 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2913 if (LocaleCompare(map,"RGBP") == 0)
2915 for (y=0; y < (ssize_t) rows; y++)
2917 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2918 if (q == (Quantum *) NULL)
2920 for (x=0; x < (ssize_t) columns; x++)
2922 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2923 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2924 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2926 q+=GetPixelChannels(image);
2928 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2933 for (y=0; y < (ssize_t) rows; y++)
2935 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2936 if (q == (Quantum *) NULL)
2938 for (x=0; x < (ssize_t) columns; x++)
2940 for (i=0; i < (ssize_t) length; i++)
2942 switch (quantum_map[i])
2947 SetPixelRed(image,ScaleLongToQuantum(*p),q);
2951 case MagentaQuantum:
2953 SetPixelGreen(image,ScaleLongToQuantum(*p),q);
2959 SetPixelBlue(image,ScaleLongToQuantum(*p),q);
2964 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
2967 case OpacityQuantum:
2969 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
2974 SetPixelBlack(image,ScaleLongToQuantum(*p),q);
2979 SetPixelRed(image,ScaleLongToQuantum(*p),q);
2980 SetPixelGreen(image,GetPixelRed(image,q),q);
2981 SetPixelBlue(image,GetPixelRed(image,q),q);
2989 q+=GetPixelChannels(image);
2991 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2998 register const unsigned int
3001 p=(const unsigned int *) pixels;
3002 if (LocaleCompare(map,"BGR") == 0)
3004 for (y=0; y < (ssize_t) rows; y++)
3006 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3007 if (q == (Quantum *) NULL)
3009 for (x=0; x < (ssize_t) columns; x++)
3011 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3012 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3013 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3014 q+=GetPixelChannels(image);
3016 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3021 if (LocaleCompare(map,"BGRA") == 0)
3023 for (y=0; y < (ssize_t) rows; y++)
3025 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3026 if (q == (Quantum *) NULL)
3028 for (x=0; x < (ssize_t) columns; x++)
3030 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3031 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3032 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3033 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3034 q+=GetPixelChannels(image);
3036 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3041 if (LocaleCompare(map,"BGRP") == 0)
3043 for (y=0; y < (ssize_t) rows; y++)
3045 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3046 if (q == (Quantum *) NULL)
3048 for (x=0; x < (ssize_t) columns; x++)
3050 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3051 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3052 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3054 q+=GetPixelChannels(image);
3056 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3061 if (LocaleCompare(map,"I") == 0)
3063 for (y=0; y < (ssize_t) rows; y++)
3065 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3066 if (q == (Quantum *) NULL)
3068 for (x=0; x < (ssize_t) columns; x++)
3070 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3071 SetPixelGreen(image,GetPixelRed(image,q),q);
3072 SetPixelBlue(image,GetPixelRed(image,q),q);
3073 q+=GetPixelChannels(image);
3075 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3080 if (LocaleCompare(map,"RGB") == 0)
3082 for (y=0; y < (ssize_t) rows; y++)
3084 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3085 if (q == (Quantum *) NULL)
3087 for (x=0; x < (ssize_t) columns; x++)
3089 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3090 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3091 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3092 q+=GetPixelChannels(image);
3094 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3099 if (LocaleCompare(map,"RGBA") == 0)
3101 for (y=0; y < (ssize_t) rows; y++)
3103 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3104 if (q == (Quantum *) NULL)
3106 for (x=0; x < (ssize_t) columns; x++)
3108 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3109 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3110 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3111 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3112 q+=GetPixelChannels(image);
3114 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3119 if (LocaleCompare(map,"RGBP") == 0)
3121 for (y=0; y < (ssize_t) rows; y++)
3123 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3124 if (q == (Quantum *) NULL)
3126 for (x=0; x < (ssize_t) columns; x++)
3128 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3129 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3130 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3132 q+=GetPixelChannels(image);
3134 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3139 for (y=0; y < (ssize_t) rows; y++)
3141 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3142 if (q == (Quantum *) NULL)
3144 for (x=0; x < (ssize_t) columns; x++)
3146 for (i=0; i < (ssize_t) length; i++)
3148 switch (quantum_map[i])
3153 SetPixelRed(image,ScaleLongToQuantum(*p),q);
3157 case MagentaQuantum:
3159 SetPixelGreen(image,ScaleLongToQuantum(*p),q);
3165 SetPixelBlue(image,ScaleLongToQuantum(*p),q);
3170 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3173 case OpacityQuantum:
3175 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3180 SetPixelBlack(image,ScaleLongToQuantum(*p),q);
3185 SetPixelRed(image,ScaleLongToQuantum(*p),q);
3186 SetPixelGreen(image,GetPixelRed(image,q),q);
3187 SetPixelBlue(image,GetPixelRed(image,q),q);
3195 q+=GetPixelChannels(image);
3197 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3204 register const Quantum
3207 p=(const Quantum *) pixels;
3208 if (LocaleCompare(map,"BGR") == 0)
3210 for (y=0; y < (ssize_t) rows; y++)
3212 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3213 if (q == (Quantum *) NULL)
3215 for (x=0; x < (ssize_t) columns; x++)
3217 SetPixelBlue(image,*p++,q);
3218 SetPixelGreen(image,*p++,q);
3219 SetPixelRed(image,*p++,q);
3220 q+=GetPixelChannels(image);
3222 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3227 if (LocaleCompare(map,"BGRA") == 0)
3229 for (y=0; y < (ssize_t) rows; y++)
3231 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3232 if (q == (Quantum *) NULL)
3234 for (x=0; x < (ssize_t) columns; x++)
3236 SetPixelBlue(image,*p++,q);
3237 SetPixelGreen(image,*p++,q);
3238 SetPixelRed(image,*p++,q);
3239 SetPixelAlpha(image,*p++,q);
3240 q+=GetPixelChannels(image);
3242 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3247 if (LocaleCompare(map,"BGRP") == 0)
3249 for (y=0; y < (ssize_t) rows; y++)
3251 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3252 if (q == (Quantum *) NULL)
3254 for (x=0; x < (ssize_t) columns; x++)
3256 SetPixelBlue(image,*p++,q);
3257 SetPixelGreen(image,*p++,q);
3258 SetPixelRed(image,*p++,q);
3260 q+=GetPixelChannels(image);
3262 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3267 if (LocaleCompare(map,"I") == 0)
3269 for (y=0; y < (ssize_t) rows; y++)
3271 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3272 if (q == (Quantum *) NULL)
3274 for (x=0; x < (ssize_t) columns; x++)
3276 SetPixelRed(image,*p++,q);
3277 SetPixelGreen(image,GetPixelRed(image,q),q);
3278 SetPixelBlue(image,GetPixelRed(image,q),q);
3279 q+=GetPixelChannels(image);
3281 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3286 if (LocaleCompare(map,"RGB") == 0)
3288 for (y=0; y < (ssize_t) rows; y++)
3290 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3291 if (q == (Quantum *) NULL)
3293 for (x=0; x < (ssize_t) columns; x++)
3295 SetPixelRed(image,*p++,q);
3296 SetPixelGreen(image,*p++,q);
3297 SetPixelBlue(image,*p++,q);
3298 q+=GetPixelChannels(image);
3300 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3305 if (LocaleCompare(map,"RGBA") == 0)
3307 for (y=0; y < (ssize_t) rows; y++)
3309 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3310 if (q == (Quantum *) NULL)
3312 for (x=0; x < (ssize_t) columns; x++)
3314 SetPixelRed(image,*p++,q);
3315 SetPixelGreen(image,*p++,q);
3316 SetPixelBlue(image,*p++,q);
3317 SetPixelAlpha(image,*p++,q);
3318 q+=GetPixelChannels(image);
3320 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3325 if (LocaleCompare(map,"RGBP") == 0)
3327 for (y=0; y < (ssize_t) rows; y++)
3329 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3330 if (q == (Quantum *) NULL)
3332 for (x=0; x < (ssize_t) columns; x++)
3334 SetPixelRed(image,*p++,q);
3335 SetPixelGreen(image,*p++,q);
3336 SetPixelBlue(image,*p++,q);
3338 q+=GetPixelChannels(image);
3340 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3345 for (y=0; y < (ssize_t) rows; y++)
3347 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3348 if (q == (Quantum *) NULL)
3350 for (x=0; x < (ssize_t) columns; x++)
3352 for (i=0; i < (ssize_t) length; i++)
3354 switch (quantum_map[i])
3359 SetPixelRed(image,*p,q);
3363 case MagentaQuantum:
3365 SetPixelGreen(image,*p,q);
3371 SetPixelBlue(image,*p,q);
3376 SetPixelAlpha(image,*p,q);
3379 case OpacityQuantum:
3381 SetPixelAlpha(image,*p,q);
3386 SetPixelBlack(image,*p,q);
3391 SetPixelRed(image,*p,q);
3392 SetPixelGreen(image,GetPixelRed(image,q),q);
3393 SetPixelBlue(image,GetPixelRed(image,q),q);
3401 q+=GetPixelChannels(image);
3403 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3410 register const unsigned short
3413 p=(const unsigned short *) pixels;
3414 if (LocaleCompare(map,"BGR") == 0)
3416 for (y=0; y < (ssize_t) rows; y++)
3418 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3419 if (q == (Quantum *) NULL)
3421 for (x=0; x < (ssize_t) columns; x++)
3423 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3424 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3425 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3426 q+=GetPixelChannels(image);
3428 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3433 if (LocaleCompare(map,"BGRA") == 0)
3435 for (y=0; y < (ssize_t) rows; y++)
3437 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3438 if (q == (Quantum *) NULL)
3440 for (x=0; x < (ssize_t) columns; x++)
3442 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3443 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3444 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3445 SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3446 q+=GetPixelChannels(image);
3448 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3453 if (LocaleCompare(map,"BGRP") == 0)
3455 for (y=0; y < (ssize_t) rows; y++)
3457 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3458 if (q == (Quantum *) NULL)
3460 for (x=0; x < (ssize_t) columns; x++)
3462 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3463 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3464 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3466 q+=GetPixelChannels(image);
3468 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3473 if (LocaleCompare(map,"I") == 0)
3475 for (y=0; y < (ssize_t) rows; y++)
3477 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3478 if (q == (Quantum *) NULL)
3480 for (x=0; x < (ssize_t) columns; x++)
3482 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3483 SetPixelGreen(image,GetPixelRed(image,q),q);
3484 SetPixelBlue(image,GetPixelRed(image,q),q);
3485 q+=GetPixelChannels(image);
3487 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3492 if (LocaleCompare(map,"RGB") == 0)
3494 for (y=0; y < (ssize_t) rows; y++)
3496 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3497 if (q == (Quantum *) NULL)
3499 for (x=0; x < (ssize_t) columns; x++)
3501 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3502 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3503 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3504 q+=GetPixelChannels(image);
3506 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3511 if (LocaleCompare(map,"RGBA") == 0)
3513 for (y=0; y < (ssize_t) rows; y++)
3515 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3516 if (q == (Quantum *) NULL)
3518 for (x=0; x < (ssize_t) columns; x++)
3520 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3521 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3522 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3523 SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3524 q+=GetPixelChannels(image);
3526 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3531 if (LocaleCompare(map,"RGBP") == 0)
3533 for (y=0; y < (ssize_t) rows; y++)
3535 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3536 if (q == (Quantum *) NULL)
3538 for (x=0; x < (ssize_t) columns; x++)
3540 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3541 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3542 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3544 q+=GetPixelChannels(image);
3546 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3551 for (y=0; y < (ssize_t) rows; y++)
3553 q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3554 if (q == (Quantum *) NULL)
3556 for (x=0; x < (ssize_t) columns; x++)
3558 for (i=0; i < (ssize_t) length; i++)
3560 switch (quantum_map[i])
3565 SetPixelRed(image,ScaleShortToQuantum(*p),q);
3569 case MagentaQuantum:
3571 SetPixelGreen(image,ScaleShortToQuantum(*p),q);
3577 SetPixelBlue(image,ScaleShortToQuantum(*p),q);
3582 SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3585 case OpacityQuantum:
3587 SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3592 SetPixelBlack(image,ScaleShortToQuantum(*p),q);
3597 SetPixelRed(image,ScaleShortToQuantum(*p),q);
3598 SetPixelGreen(image,GetPixelRed(image,q),q);
3599 SetPixelBlue(image,GetPixelRed(image,q),q);
3607 q+=GetPixelChannels(image);
3609 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3616 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3617 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
3618 "UnrecognizedPixelMap","`%s'",map);
3622 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3627 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3631 + 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 %
3635 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3637 % InitializePixelChannelMap() defines the standard pixel component map.
3639 % The format of the InitializePixelChannelMap() method is:
3641 % void InitializePixelChannelMap(Image *image)
3643 % A description of each parameter follows:
3645 % o image: the image.
3648 MagickExport void InitializePixelChannelMap(Image *image)
3659 assert(image != (Image *) NULL);
3660 assert(image->signature == MagickSignature);
3661 (void) ResetMagickMemory(image->channel_map,0,MaxPixelChannels*
3662 sizeof(*image->channel_map));
3663 trait=UpdatePixelTrait;
3664 if (image->matte != MagickFalse)
3665 trait|=BlendPixelTrait;
3667 SetPixelChannelMap(image,RedPixelChannel,trait,n++);
3668 SetPixelChannelMap(image,GreenPixelChannel,trait,n++);
3669 SetPixelChannelMap(image,BluePixelChannel,trait,n++);
3671 if (image->colorspace == GRAYColorspace)
3674 SetPixelChannelMap(image,RedPixelChannel,trait,n);
3675 SetPixelChannelMap(image,GreenPixelChannel,trait,n);
3676 SetPixelChannelMap(image,BluePixelChannel,trait,n++);
3678 if (image->colorspace == CMYKColorspace)
3679 SetPixelChannelMap(image,BlackPixelChannel,trait,n++);
3680 if (image->matte != MagickFalse)
3681 SetPixelChannelMap(image,AlphaPixelChannel,CopyPixelTrait,n++);
3682 if (image->storage_class == PseudoClass)
3683 SetPixelChannelMap(image,IndexPixelChannel,CopyPixelTrait,n++);
3684 assert((n+image->number_meta_channels) < MaxPixelChannels);
3685 for (i=0; i < (ssize_t) image->number_meta_channels; i++)
3686 SetPixelChannelMap(image,(PixelChannel) MetaPixelChannel+i,CopyPixelTrait,
3688 image->number_channels=n;
3689 if (image->debug != MagickFalse)
3690 LogPixelChannels(image);
3691 (void) SetPixelChannelMask(image,image->channel_mask);
3695 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3699 % I n t e r p o l a t e P i x e l C h a n n e l %
3703 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3705 % InterpolatePixelChannel() applies a pixel interpolation method between a
3706 % floating point coordinate and the pixels surrounding that coordinate. No
3707 % pixel area resampling, or scaling of the result is performed.
3709 % The format of the InterpolatePixelChannel method is:
3711 % MagickBooleanType InterpolatePixelChannel(const Image *image,
3712 % const CacheView *image_view,const PixelChannel channel,
3713 % const PixelInterpolateMethod method,const double x,const double y,
3714 % double *pixel,ExceptionInfo *exception)
3716 % A description of each parameter follows:
3718 % o image: the image.
3720 % o image_view: the image view.
3722 % o channel: the pixel channel to interpolate.
3724 % o method: the pixel color interpolation method.
3726 % o x,y: A double representing the current (x,y) position of the pixel.
3728 % o pixel: return the interpolated pixel here.
3730 % o exception: return any errors or warnings in this structure.
3734 static inline double MagickMax(const MagickRealType x,const MagickRealType y)
3741 static inline MagickRealType CubicWeightingFunction(const MagickRealType x)
3747 alpha=MagickMax(x+2.0,0.0);
3748 gamma=1.0*alpha*alpha*alpha;
3749 alpha=MagickMax(x+1.0,0.0);
3750 gamma-=4.0*alpha*alpha*alpha;
3751 alpha=MagickMax(x+0.0,0.0);
3752 gamma+=6.0*alpha*alpha*alpha;
3753 alpha=MagickMax(x-1.0,0.0);
3754 gamma-=4.0*alpha*alpha*alpha;
3758 static inline double MeshInterpolate(const PointInfo *delta,const double p,
3759 const double x,const double y)
3761 return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
3764 static inline ssize_t NearestNeighbor(const MagickRealType x)
3767 return((ssize_t) (x+0.5));
3768 return((ssize_t) (x-0.5));
3771 MagickExport MagickBooleanType InterpolatePixelChannel(const Image *image,
3772 const CacheView *image_view,const PixelChannel channel,
3773 const PixelInterpolateMethod method,const double x,const double y,
3774 double *pixel,ExceptionInfo *exception)
3787 register const Quantum
3797 assert(image != (Image *) NULL);
3798 assert(image != (Image *) NULL);
3799 assert(image->signature == MagickSignature);
3800 assert(image_view != (CacheView *) NULL);
3803 traits=GetPixelChannelMapTraits(image,channel);
3804 x_offset=(ssize_t) floor(x);
3805 y_offset=(ssize_t) floor(y);
3806 switch (method == UndefinedInterpolatePixel ? image->interpolate : method)
3808 case AverageInterpolatePixel:
3810 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
3812 if (p == (const Quantum *) NULL)
3817 if ((traits & BlendPixelTrait) == 0)
3818 for (i=0; i < 16; i++)
3821 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3824 for (i=0; i < 16; i++)
3826 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3827 GetPixelChannels(image));
3828 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3830 for (i=0; i < 16; i++)
3832 gamma=1.0/(fabs((double) alpha[i]) <= MagickEpsilon ? 1.0 : alpha[i]);
3833 *pixel+=gamma*0.0625*pixels[i];
3837 case BicubicInterpolatePixel:
3846 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
3848 if (p == (const Quantum *) NULL)
3853 if ((traits & BlendPixelTrait) == 0)
3854 for (i=0; i < 16; i++)
3857 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3860 for (i=0; i < 16; i++)
3862 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3863 GetPixelChannels(image));
3864 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3868 for (i=0; i < 4; i++)
3870 u[0]=(pixels[4*i+3]-pixels[4*i+2])-(pixels[4*i+0]-pixels[4*i+1]);
3871 u[1]=(pixels[4*i+0]-pixels[4*i+1])-u[0];
3872 u[2]=pixels[4*i+2]-pixels[4*i+0];
3874 v[i]=(delta.x*delta.x*delta.x*u[0])+(delta.x*delta.x*u[1])+(delta.x*
3877 u[0]=(v[3]-v[2])-(v[0]-v[1]);
3878 u[1]=(v[0]-v[1])-u[0];
3881 *pixel=(delta.y*delta.y*delta.y*u[0])+(delta.y*delta.y*u[1])+(delta.y*
3885 case BilinearInterpolatePixel:
3892 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
3893 if (p == (const Quantum *) NULL)
3898 if ((traits & BlendPixelTrait) == 0)
3899 for (i=0; i < 4; i++)
3902 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3905 for (i=0; i < 4; i++)
3907 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3908 GetPixelChannels(image));
3909 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3913 epsilon.x=1.0-delta.x;
3914 epsilon.y=1.0-delta.y;
3915 gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
3916 (epsilon.x*alpha[2]+delta.x*alpha[3])));
3917 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3918 *pixel=gamma*(epsilon.y*(epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*
3919 (epsilon.x*pixels[2]+delta.x*pixels[3]));
3922 case FilterInterpolatePixel:
3936 geometry.x=x_offset-1;
3937 geometry.y=y_offset-1;
3938 excerpt_image=ExcerptImage(image,&geometry,exception);
3939 if (excerpt_image == (Image *) NULL)
3944 filter_image=ResizeImage(excerpt_image,1,1,image->filter,image->blur,
3946 excerpt_image=DestroyImage(excerpt_image);
3947 if (filter_image == (Image *) NULL)
3949 filter_view=AcquireCacheView(filter_image);
3950 p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
3951 if (p == (const Quantum *) NULL)
3954 *pixel=(double) GetPixelChannel(image,channel,p);
3955 filter_view=DestroyCacheView(filter_view);
3956 filter_image=DestroyImage(filter_image);
3959 case IntegerInterpolatePixel:
3961 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
3962 if (p == (const Quantum *) NULL)
3967 *pixel=(double) GetPixelChannel(image,channel,p);
3970 case NearestNeighborInterpolatePixel:
3972 p=GetCacheViewVirtualPixels(image_view,NearestNeighbor(x),
3973 NearestNeighbor(y),1,1,exception);
3974 if (p == (const Quantum *) NULL)
3979 *pixel=(double) GetPixelChannel(image,channel,p);
3982 case MeshInterpolatePixel:
3988 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
3989 if (p == (const Quantum *) NULL)
3994 if ((traits & BlendPixelTrait) == 0)
3995 for (i=0; i < 4; i++)
3998 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4001 for (i=0; i < 4; i++)
4003 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4004 GetPixelChannels(image));
4005 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4009 luminance.x=GetPixelLuminance(image,p)-(double)
4010 GetPixelLuminance(image,p+3*GetPixelChannels(image));
4011 luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
4012 GetPixelLuminance(image,p+2*GetPixelChannels(image));
4013 if (fabs(luminance.x) < fabs(luminance.y))
4018 if (delta.x <= delta.y)
4021 Bottom-left triangle (pixel: 2, diagonal: 0-3).
4023 delta.y=1.0-delta.y;
4024 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4025 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4026 *pixel=gamma*MeshInterpolate(&delta,pixels[2],pixels[3],
4032 Top-right triangle (pixel: 1, diagonal: 0-3).
4034 delta.x=1.0-delta.x;
4035 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4036 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4037 *pixel=gamma*MeshInterpolate(&delta,pixels[1],pixels[0],
4046 if (delta.x <= (1.0-delta.y))
4049 Top-left triangle (pixel: 0, diagonal: 1-2).
4051 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4052 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4053 *pixel=gamma*MeshInterpolate(&delta,pixels[0],pixels[1],
4059 Bottom-right triangle (pixel: 3, diagonal: 1-2).
4061 delta.x=1.0-delta.x;
4062 delta.y=1.0-delta.y;
4063 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4064 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4065 *pixel=gamma*MeshInterpolate(&delta,pixels[3],pixels[2],
4071 case SplineInterpolatePixel:
4084 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4086 if (p == (const Quantum *) NULL)
4091 if ((traits & BlendPixelTrait) == 0)
4092 for (i=0; i < 16; i++)
4095 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4098 for (i=0; i < 16; i++)
4100 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4101 GetPixelChannels(image));
4102 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4107 for (i=(-1); i < 3L; i++)
4109 dy=CubicWeightingFunction((MagickRealType) i-delta.y);
4110 for (j=(-1); j < 3L; j++)
4112 dx=CubicWeightingFunction(delta.x-(MagickRealType) j);
4113 gamma=1.0/(fabs((double) alpha[n]) <= MagickEpsilon ? 1.0 : alpha[n]);
4114 *pixel+=gamma*dx*dy*pixels[n];
4125 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4129 % I n t e r p o l a t e P i x e l C h a n n e l s %
4133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4135 % InterpolatePixelChannels() applies a pixel interpolation method between a
4136 % floating point coordinate and the pixels surrounding that coordinate. No
4137 % pixel area resampling, or scaling of the result is performed.
4139 % The format of the InterpolatePixelChannels method is:
4141 % MagickBooleanType InterpolatePixelChannels(const Image *source,
4142 % const CacheView *source_view,const Image *destination,
4143 % const PixelInterpolateMethod method,const double x,const double y,
4144 % Quantum *pixel,ExceptionInfo *exception)
4146 % A description of each parameter follows:
4148 % o source: the source.
4150 % o source_view: the source view.
4152 % o destination: the destination image.
4154 % o method: the pixel color interpolation method.
4156 % o x,y: A double representing the current (x,y) position of the pixel.
4158 % o pixel: return the interpolated pixel here.
4160 % o exception: return any errors or warnings in this structure.
4163 MagickExport MagickBooleanType InterpolatePixelChannels(const Image *source,
4164 const CacheView *source_view,const Image *destination,
4165 const PixelInterpolateMethod method,const double x,const double y,
4166 Quantum *pixel,ExceptionInfo *exception)
4183 register const Quantum
4193 assert(source != (Image *) NULL);
4194 assert(source != (Image *) NULL);
4195 assert(source->signature == MagickSignature);
4196 assert(source_view != (CacheView *) NULL);
4198 x_offset=(ssize_t) floor(x);
4199 y_offset=(ssize_t) floor(y);
4200 switch (method == UndefinedInterpolatePixel ? source->interpolate : method)
4202 case AverageInterpolatePixel:
4204 p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4206 if (p == (const Quantum *) NULL)
4211 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4219 traits=GetPixelChannelMapTraits(source,i);
4220 channel=GetPixelChannelMapChannel(source,i);
4221 destination_traits=GetPixelChannelMapTraits(destination,channel);
4222 if ((traits == UndefinedPixelTrait) ||
4223 (destination_traits == UndefinedPixelTrait))
4225 for (j=0; j < 16; j++)
4226 pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
4227 if ((traits & BlendPixelTrait) == 0)
4229 for (j=0; j < 16; j++)
4230 pixel[channel]+=0.0625*pixels[j];
4234 for (j=0; j < 16; j++)
4236 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4237 GetPixelChannels(source));
4238 pixels[j]*=alpha[j];
4239 gamma=1.0/(fabs((double) alpha[j]) <= MagickEpsilon ? 1.0 : alpha[j]);
4240 sum+=gamma*0.0625*pixels[j];
4242 pixel[channel]=ClampToQuantum(sum);
4246 case BicubicInterpolatePixel:
4255 p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4257 if (p == (const Quantum *) NULL)
4262 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4267 traits=GetPixelChannelMapTraits(source,i);
4268 channel=GetPixelChannelMapChannel(source,i);
4269 destination_traits=GetPixelChannelMapTraits(destination,channel);
4270 if ((traits == UndefinedPixelTrait) ||
4271 (destination_traits == UndefinedPixelTrait))
4273 if ((traits & BlendPixelTrait) == 0)
4274 for (j=0; j < 16; j++)
4277 pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
4280 for (j=0; j < 16; j++)
4282 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4283 GetPixelChannels(source));
4284 pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
4288 for (j=0; j < 4; j++)
4290 u[0]=(pixels[4*j+3]-pixels[4*j+2])-(pixels[4*j+0]-pixels[4*j+1]);
4291 u[1]=(pixels[4*j+0]-pixels[4*j+1])-u[0];
4292 u[2]=pixels[4*j+2]-pixels[4*j+0];
4294 v[j]=(delta.x*delta.x*delta.x*u[0])+(delta.x*delta.x*u[1])+(delta.x*
4297 u[0]=(v[3]-v[2])-(v[0]-v[1]);
4298 u[1]=(v[0]-v[1])-u[0];
4301 pixel[channel]=ClampToQuantum((delta.y*delta.y*delta.y*u[0])+(delta.y*
4302 delta.y*u[1])+(delta.y*u[2])+u[3]);
4306 case BilinearInterpolatePixel:
4309 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4310 if (p == (const Quantum *) NULL)
4315 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4321 traits=GetPixelChannelMapTraits(source,i);
4322 channel=GetPixelChannelMapChannel(source,i);
4323 destination_traits=GetPixelChannelMapTraits(destination,channel);
4324 if ((traits == UndefinedPixelTrait) ||
4325 (destination_traits == UndefinedPixelTrait))
4329 epsilon.x=1.0-delta.x;
4330 epsilon.y=1.0-delta.y;
4331 pixels[0]=(MagickRealType) p[i];
4332 pixels[1]=(MagickRealType) p[GetPixelChannels(source)+i];
4333 pixels[2]=(MagickRealType) p[2*GetPixelChannels(source)+i];
4334 pixels[3]=(MagickRealType) p[3*GetPixelChannels(source)+i];
4335 if ((traits & BlendPixelTrait) == 0)
4337 gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
4338 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4339 pixel[channel]=ClampToQuantum(gamma*(epsilon.y*(epsilon.x*pixels[0]+
4340 delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+delta.x*
4344 alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4345 alpha[1]=QuantumScale*GetPixelAlpha(source,p+GetPixelChannels(source));
4346 alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4347 GetPixelChannels(source));
4348 alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4349 GetPixelChannels(source));
4350 pixels[0]*=alpha[0];
4351 pixels[1]*=alpha[1];
4352 pixels[2]*=alpha[2];
4353 pixels[3]*=alpha[3];
4354 gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4355 (epsilon.x*alpha[2]+delta.x*alpha[3])));
4356 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4357 pixel[channel]=ClampToQuantum(gamma*(epsilon.y*(epsilon.x*pixels[0]+
4358 delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+delta.x*pixels[3])));
4362 case FilterInterpolatePixel:
4364 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4376 traits=GetPixelChannelMapTraits(source,i);
4377 channel=GetPixelChannelMapChannel(source,i);
4378 destination_traits=GetPixelChannelMapTraits(destination,channel);
4379 if ((traits == UndefinedPixelTrait) ||
4380 (destination_traits == UndefinedPixelTrait))
4384 geometry.x=x_offset-1;
4385 geometry.y=y_offset-1;
4386 excerpt_source=ExcerptImage(source,&geometry,exception);
4387 if (excerpt_source == (Image *) NULL)
4392 filter_source=ResizeImage(excerpt_source,1,1,source->filter,
4393 source->blur,exception);
4394 excerpt_source=DestroyImage(excerpt_source);
4395 if (filter_source == (Image *) NULL)
4397 filter_view=AcquireCacheView(filter_source);
4398 p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
4399 if (p == (const Quantum *) NULL)
4402 pixel[channel]=p[i];
4403 filter_view=DestroyCacheView(filter_view);
4404 filter_source=DestroyImage(filter_source);
4408 case IntegerInterpolatePixel:
4410 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
4411 if (p == (const Quantum *) NULL)
4416 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4418 traits=GetPixelChannelMapTraits(source,i);
4419 channel=GetPixelChannelMapChannel(source,i);
4420 destination_traits=GetPixelChannelMapTraits(destination,channel);
4421 if ((traits == UndefinedPixelTrait) ||
4422 (destination_traits == UndefinedPixelTrait))
4424 pixel[channel]=p[i];
4428 case NearestNeighborInterpolatePixel:
4430 p=GetCacheViewVirtualPixels(source_view,NearestNeighbor(x),
4431 NearestNeighbor(y),1,1,exception);
4432 if (p == (const Quantum *) NULL)
4437 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4439 traits=GetPixelChannelMapTraits(source,i);
4440 channel=GetPixelChannelMapChannel(source,i);
4441 destination_traits=GetPixelChannelMapTraits(destination,channel);
4442 if ((traits == UndefinedPixelTrait) ||
4443 (destination_traits == UndefinedPixelTrait))
4445 pixel[channel]=p[i];
4449 case MeshInterpolatePixel:
4451 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4452 if (p == (const Quantum *) NULL)
4457 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4463 traits=GetPixelChannelMapTraits(source,i);
4464 channel=GetPixelChannelMapChannel(source,i);
4465 destination_traits=GetPixelChannelMapTraits(destination,channel);
4466 if ((traits == UndefinedPixelTrait) ||
4467 (destination_traits == UndefinedPixelTrait))
4469 pixels[0]=(MagickRealType) p[i];
4470 pixels[1]=(MagickRealType) p[GetPixelChannels(source)+i];
4471 pixels[2]=(MagickRealType) p[2*GetPixelChannels(source)+i];
4472 pixels[3]=(MagickRealType) p[3*GetPixelChannels(source)+i];
4473 if ((traits & BlendPixelTrait) == 0)
4482 alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4483 alpha[1]=QuantumScale*GetPixelAlpha(source,p+
4484 GetPixelChannels(source));
4485 alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4486 GetPixelChannels(source));
4487 alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4488 GetPixelChannels(source));
4492 luminance.x=GetPixelLuminance(source,p)-(double)
4493 GetPixelLuminance(source,p+3*GetPixelChannels(source));
4494 luminance.y=GetPixelLuminance(source,p+GetPixelChannels(source))-
4495 (double) GetPixelLuminance(source,p+2*GetPixelChannels(source));
4496 if (fabs(luminance.x) < fabs(luminance.y))
4501 if (delta.x <= delta.y)
4504 Bottom-left triangle (pixel: 2, diagonal: 0-3).
4506 delta.y=1.0-delta.y;
4507 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4508 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4509 pixel[channel]=ClampToQuantum(gamma*MeshInterpolate(&delta,
4510 pixels[2],pixels[3],pixels[0]));
4515 Top-right triangle (pixel: 1, diagonal: 0-3).
4517 delta.x=1.0-delta.x;
4518 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4519 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4520 pixel[channel]=ClampToQuantum(gamma*MeshInterpolate(&delta,
4521 pixels[1],pixels[0],pixels[3]));
4529 if (delta.x <= (1.0-delta.y))
4532 Top-left triangle (pixel: 0, diagonal: 1-2).
4534 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4535 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4536 pixel[channel]=ClampToQuantum(gamma*MeshInterpolate(&delta,
4537 pixels[0],pixels[1],pixels[2]));
4542 Bottom-right triangle (pixel: 3, diagonal: 1-2).
4544 delta.x=1.0-delta.x;
4545 delta.y=1.0-delta.y;
4546 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4547 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4548 pixel[channel]=ClampToQuantum(gamma*MeshInterpolate(&delta,
4549 pixels[3],pixels[2],pixels[1]));
4555 case SplineInterpolatePixel:
4557 p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4559 if (p == (const Quantum *) NULL)
4564 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4583 traits=GetPixelChannelMapTraits(source,i);
4584 channel=GetPixelChannelMapChannel(source,i);
4585 destination_traits=GetPixelChannelMapTraits(destination,channel);
4586 if ((traits == UndefinedPixelTrait) ||
4587 (destination_traits == UndefinedPixelTrait))
4589 if ((traits & BlendPixelTrait) == 0)
4590 for (j=0; j < 16; j++)
4593 pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
4596 for (j=0; j < 16; j++)
4598 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4599 GetPixelChannels(source));
4600 pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
4606 for (j=(-1); j < 3L; j++)
4608 dy=CubicWeightingFunction((MagickRealType) j-delta.y);
4609 for (k=(-1); k < 3L; k++)
4611 dx=CubicWeightingFunction(delta.x-(MagickRealType) k);
4612 gamma=1.0/(fabs((double) alpha[n]) <= MagickEpsilon ? 1.0 :
4614 sum+=gamma*dx*dy*pixels[n];
4618 pixel[channel]=ClampToQuantum(sum);
4627 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4631 % I n t e r p o l a t e P i x e l I n f o %
4635 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4637 % InterpolatePixelInfo() applies a pixel interpolation method between a
4638 % floating point coordinate and the pixels surrounding that coordinate. No
4639 % pixel area resampling, or scaling of the result is performed.
4641 % The format of the InterpolatePixelInfo method is:
4643 % MagickBooleanType InterpolatePixelInfo(const Image *image,
4644 % const CacheView *image_view,const PixelInterpolateMethod method,
4645 % const double x,const double y,PixelInfo *pixel,
4646 % ExceptionInfo *exception)
4648 % A description of each parameter follows:
4650 % o image: the image.
4652 % o image_view: the image view.
4654 % o method: the pixel color interpolation method.
4656 % o x,y: A double representing the current (x,y) position of the pixel.
4658 % o pixel: return the interpolated pixel here.
4660 % o exception: return any errors or warnings in this structure.
4664 static inline void AlphaBlendPixelInfo(const Image *image,
4665 const Quantum *pixel,PixelInfo *pixel_info,MagickRealType *alpha)
4667 if (image->matte == MagickFalse)
4670 pixel_info->red=(MagickRealType) GetPixelRed(image,pixel);
4671 pixel_info->green=(MagickRealType) GetPixelGreen(image,pixel);
4672 pixel_info->blue=(MagickRealType) GetPixelBlue(image,pixel);
4673 pixel_info->black=0.0;
4674 if (image->colorspace == CMYKColorspace)
4675 pixel_info->black=(MagickRealType) GetPixelBlack(image,pixel);
4676 pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
4679 *alpha=QuantumScale*GetPixelAlpha(image,pixel);
4680 pixel_info->red=(*alpha*GetPixelRed(image,pixel));
4681 pixel_info->green=(*alpha*GetPixelGreen(image,pixel));
4682 pixel_info->blue=(*alpha*GetPixelBlue(image,pixel));
4683 pixel_info->black=0.0;
4684 if (image->colorspace == CMYKColorspace)
4685 pixel_info->black=(*alpha*GetPixelBlack(image,pixel));
4686 pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
4689 static void BicubicInterpolate(const PixelInfo *pixels,const double dx,
4700 p=(pixels[3].red-pixels[2].red)-(pixels[0].red-pixels[1].red);
4701 q=(pixels[0].red-pixels[1].red)-p;
4702 r=pixels[2].red-pixels[0].red;
4704 pixel->red=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4705 p=(pixels[3].green-pixels[2].green)-(pixels[0].green-pixels[1].green);
4706 q=(pixels[0].green-pixels[1].green)-p;
4707 r=pixels[2].green-pixels[0].green;
4709 pixel->green=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4710 p=(pixels[3].blue-pixels[2].blue)-(pixels[0].blue-pixels[1].blue);
4711 q=(pixels[0].blue-pixels[1].blue)-p;
4712 r=pixels[2].blue-pixels[0].blue;
4714 pixel->blue=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4715 p=(pixels[3].alpha-pixels[2].alpha)-(pixels[0].alpha-pixels[1].alpha);
4716 q=(pixels[0].alpha-pixels[1].alpha)-p;
4717 r=pixels[2].alpha-pixels[0].alpha;
4719 pixel->alpha=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4720 if (pixel->colorspace == CMYKColorspace)
4722 p=(pixels[3].black-pixels[2].black)-(pixels[0].black-pixels[1].black);
4723 q=(pixels[0].black-pixels[1].black)-p;
4724 r=pixels[2].black-pixels[0].black;
4726 pixel->black=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4730 MagickExport MagickBooleanType InterpolatePixelInfo(const Image *image,
4731 const CacheView *image_view,const PixelInterpolateMethod method,
4732 const double x,const double y,PixelInfo *pixel,ExceptionInfo *exception)
4744 register const Quantum
4754 assert(image != (Image *) NULL);
4755 assert(image->signature == MagickSignature);
4756 assert(image_view != (CacheView *) NULL);
4758 x_offset=(ssize_t) floor(x);
4759 y_offset=(ssize_t) floor(y);
4760 switch (method == UndefinedInterpolatePixel ? image->interpolate : method)
4762 case AverageInterpolatePixel:
4764 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4766 if (p == (const Quantum *) NULL)
4771 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4772 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4773 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4774 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4775 AlphaBlendPixelInfo(image,p+4*GetPixelChannels(image),pixels+4,alpha+4);
4776 AlphaBlendPixelInfo(image,p+5*GetPixelChannels(image),pixels+5,alpha+5);
4777 AlphaBlendPixelInfo(image,p+6*GetPixelChannels(image),pixels+6,alpha+6);
4778 AlphaBlendPixelInfo(image,p+7*GetPixelChannels(image),pixels+7,alpha+7);
4779 AlphaBlendPixelInfo(image,p+8*GetPixelChannels(image),pixels+8,alpha+8);
4780 AlphaBlendPixelInfo(image,p+9*GetPixelChannels(image),pixels+9,alpha+9);
4781 AlphaBlendPixelInfo(image,p+10*GetPixelChannels(image),pixels+10,alpha+
4783 AlphaBlendPixelInfo(image,p+11*GetPixelChannels(image),pixels+11,alpha+
4785 AlphaBlendPixelInfo(image,p+12*GetPixelChannels(image),pixels+12,alpha+
4787 AlphaBlendPixelInfo(image,p+13*GetPixelChannels(image),pixels+13,alpha+
4789 AlphaBlendPixelInfo(image,p+14*GetPixelChannels(image),pixels+14,alpha+
4791 AlphaBlendPixelInfo(image,p+15*GetPixelChannels(image),pixels+15,alpha+
4798 for (i=0; i < 16L; i++)
4800 gamma=1.0/(fabs((double) alpha[i]) <= MagickEpsilon ? 1.0 : alpha[i]);
4801 pixel->red+=gamma*0.0625*pixels[i].red;
4802 pixel->green+=gamma*0.0625*pixels[i].green;
4803 pixel->blue+=gamma*0.0625*pixels[i].blue;
4804 if (image->colorspace == CMYKColorspace)
4805 pixel->black+=gamma*0.0625*pixels[i].black;
4806 pixel->alpha+=0.0625*pixels[i].alpha;
4810 case BicubicInterpolatePixel:
4818 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4820 if (p == (const Quantum *) NULL)
4825 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4826 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4827 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4828 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4829 AlphaBlendPixelInfo(image,p+4*GetPixelChannels(image),pixels+4,alpha+4);
4830 AlphaBlendPixelInfo(image,p+5*GetPixelChannels(image),pixels+5,alpha+5);
4831 AlphaBlendPixelInfo(image,p+6*GetPixelChannels(image),pixels+6,alpha+6);
4832 AlphaBlendPixelInfo(image,p+7*GetPixelChannels(image),pixels+7,alpha+7);
4833 AlphaBlendPixelInfo(image,p+8*GetPixelChannels(image),pixels+8,alpha+8);
4834 AlphaBlendPixelInfo(image,p+9*GetPixelChannels(image),pixels+9,alpha+9);
4835 AlphaBlendPixelInfo(image,p+10*GetPixelChannels(image),pixels+10,alpha+
4837 AlphaBlendPixelInfo(image,p+11*GetPixelChannels(image),pixels+11,alpha+
4839 AlphaBlendPixelInfo(image,p+12*GetPixelChannels(image),pixels+12,alpha+
4841 AlphaBlendPixelInfo(image,p+13*GetPixelChannels(image),pixels+13,alpha+
4843 AlphaBlendPixelInfo(image,p+14*GetPixelChannels(image),pixels+14,alpha+
4845 AlphaBlendPixelInfo(image,p+15*GetPixelChannels(image),pixels+15,alpha+
4849 for (i=0; i < 4L; i++)
4850 BicubicInterpolate(pixels+4*i,delta.x,u+i);
4851 BicubicInterpolate(u,delta.y,pixel);
4854 case BilinearInterpolatePixel:
4861 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4862 if (p == (const Quantum *) NULL)
4867 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4868 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4869 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4870 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4873 epsilon.x=1.0-delta.x;
4874 epsilon.y=1.0-delta.y;
4875 gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4876 (epsilon.x*alpha[2]+delta.x*alpha[3])));
4877 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4878 pixel->red=gamma*(epsilon.y*(epsilon.x*pixels[0].red+delta.x*
4879 pixels[1].red)+delta.y*(epsilon.x*pixels[2].red+delta.x*pixels[3].red));
4880 pixel->green=gamma*(epsilon.y*(epsilon.x*pixels[0].green+delta.x*
4881 pixels[1].green)+delta.y*(epsilon.x*pixels[2].green+delta.x*
4883 pixel->blue=gamma*(epsilon.y*(epsilon.x*pixels[0].blue+delta.x*
4884 pixels[1].blue)+delta.y*(epsilon.x*pixels[2].blue+delta.x*
4886 if (image->colorspace == CMYKColorspace)
4887 pixel->black=gamma*(epsilon.y*(epsilon.x*pixels[0].black+delta.x*
4888 pixels[1].black)+delta.y*(epsilon.x*pixels[2].black+delta.x*
4890 gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
4891 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4892 pixel->alpha=(epsilon.y*(epsilon.x*pixels[0].alpha+delta.x*
4893 pixels[1].alpha)+delta.y*(epsilon.x*pixels[2].alpha+delta.x*
4897 case FilterInterpolatePixel:
4911 geometry.x=x_offset-1;
4912 geometry.y=y_offset-1;
4913 excerpt_image=ExcerptImage(image,&geometry,exception);
4914 if (excerpt_image == (Image *) NULL)
4919 filter_image=ResizeImage(excerpt_image,1,1,image->filter,image->blur,
4921 excerpt_image=DestroyImage(excerpt_image);
4922 if (filter_image == (Image *) NULL)
4924 filter_view=AcquireCacheView(filter_image);
4925 p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
4926 if (p != (const Quantum *) NULL)
4927 GetPixelInfoPixel(image,p,pixel);
4928 filter_view=DestroyCacheView(filter_view);
4929 filter_image=DestroyImage(filter_image);
4932 case IntegerInterpolatePixel:
4934 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4935 if (p == (const Quantum *) NULL)
4940 GetPixelInfoPixel(image,p,pixel);
4943 case MeshInterpolatePixel:
4949 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4950 if (p == (const Quantum *) NULL)
4957 luminance.x=GetPixelLuminance(image,p)-(double)
4958 GetPixelLuminance(image,p+3*GetPixelChannels(image));
4959 luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
4960 GetPixelLuminance(image,p+2*GetPixelChannels(image));
4961 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4962 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4963 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4964 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4965 if (fabs(luminance.x) < fabs(luminance.y))
4970 if (delta.x <= delta.y)
4973 Bottom-left triangle (pixel: 2, diagonal: 0-3).
4975 delta.y=1.0-delta.y;
4976 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4977 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4978 pixel->red=gamma*MeshInterpolate(&delta,pixels[2].red,
4979 pixels[3].red,pixels[0].red);
4980 pixel->green=gamma*MeshInterpolate(&delta,pixels[2].green,
4981 pixels[3].green,pixels[0].green);
4982 pixel->blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
4983 pixels[3].blue,pixels[0].blue);
4984 if (image->colorspace == CMYKColorspace)
4985 pixel->black=gamma*MeshInterpolate(&delta,pixels[2].black,
4986 pixels[3].black,pixels[0].black);
4987 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
4988 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[2].alpha,
4989 pixels[3].alpha,pixels[0].alpha);
4994 Top-right triangle (pixel:1 , diagonal: 0-3).
4996 delta.x=1.0-delta.x;
4997 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4998 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4999 pixel->red=gamma*MeshInterpolate(&delta,pixels[1].red,
5000 pixels[0].red,pixels[3].red);
5001 pixel->green=gamma*MeshInterpolate(&delta,pixels[1].green,
5002 pixels[0].green,pixels[3].green);
5003 pixel->blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
5004 pixels[0].blue,pixels[3].blue);
5005 if (image->colorspace == CMYKColorspace)
5006 pixel->black=gamma*MeshInterpolate(&delta,pixels[1].black,
5007 pixels[0].black,pixels[3].black);
5008 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5009 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[1].alpha,
5010 pixels[0].alpha,pixels[3].alpha);
5018 if (delta.x <= (1.0-delta.y))
5021 Top-left triangle (pixel: 0, diagonal: 1-2).
5023 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
5024 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
5025 pixel->red=gamma*MeshInterpolate(&delta,pixels[0].red,
5026 pixels[1].red,pixels[2].red);
5027 pixel->green=gamma*MeshInterpolate(&delta,pixels[0].green,
5028 pixels[1].green,pixels[2].green);
5029 pixel->blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
5030 pixels[1].blue,pixels[2].blue);
5031 if (image->colorspace == CMYKColorspace)
5032 pixel->black=gamma*MeshInterpolate(&delta,pixels[0].black,
5033 pixels[1].black,pixels[2].black);
5034 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5035 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[0].alpha,
5036 pixels[1].alpha,pixels[2].alpha);
5041 Bottom-right triangle (pixel: 3, diagonal: 1-2).
5043 delta.x=1.0-delta.x;
5044 delta.y=1.0-delta.y;
5045 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
5046 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
5047 pixel->red=gamma*MeshInterpolate(&delta,pixels[3].red,
5048 pixels[2].red,pixels[1].red);
5049 pixel->green=gamma*MeshInterpolate(&delta,pixels[3].green,
5050 pixels[2].green,pixels[1].green);
5051 pixel->blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
5052 pixels[2].blue,pixels[1].blue);
5053 if (image->colorspace == CMYKColorspace)
5054 pixel->black=gamma*MeshInterpolate(&delta,pixels[3].black,
5055 pixels[2].black,pixels[1].black);
5056 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5057 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[3].alpha,
5058 pixels[2].alpha,pixels[1].alpha);
5063 case NearestNeighborInterpolatePixel:
5065 p=GetCacheViewVirtualPixels(image_view,NearestNeighbor(x),
5066 NearestNeighbor(y),1,1,exception);
5067 if (p == (const Quantum *) NULL)
5072 GetPixelInfoPixel(image,p,pixel);
5075 case SplineInterpolatePixel:
5088 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
5090 if (p == (const Quantum *) NULL)
5095 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
5096 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
5097 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
5098 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
5099 AlphaBlendPixelInfo(image,p+4*GetPixelChannels(image),pixels+4,alpha+4);
5100 AlphaBlendPixelInfo(image,p+5*GetPixelChannels(image),pixels+5,alpha+5);
5101 AlphaBlendPixelInfo(image,p+6*GetPixelChannels(image),pixels+6,alpha+6);
5102 AlphaBlendPixelInfo(image,p+7*GetPixelChannels(image),pixels+7,alpha+7);
5103 AlphaBlendPixelInfo(image,p+8*GetPixelChannels(image),pixels+8,alpha+8);
5104 AlphaBlendPixelInfo(image,p+9*GetPixelChannels(image),pixels+9,alpha+9);
5105 AlphaBlendPixelInfo(image,p+10*GetPixelChannels(image),pixels+10,alpha+
5107 AlphaBlendPixelInfo(image,p+11*GetPixelChannels(image),pixels+11,alpha+
5109 AlphaBlendPixelInfo(image,p+12*GetPixelChannels(image),pixels+12,alpha+
5111 AlphaBlendPixelInfo(image,p+13*GetPixelChannels(image),pixels+13,alpha+
5113 AlphaBlendPixelInfo(image,p+14*GetPixelChannels(image),pixels+14,alpha+
5115 AlphaBlendPixelInfo(image,p+15*GetPixelChannels(image),pixels+15,alpha+
5125 for (i=(-1); i < 3L; i++)
5127 dy=CubicWeightingFunction((MagickRealType) i-delta.y);
5128 for (j=(-1); j < 3L; j++)
5130 dx=CubicWeightingFunction(delta.x-(MagickRealType) j);
5131 gamma=1.0/(fabs((double) alpha[n]) <= MagickEpsilon ? 1.0 : alpha[n]);
5132 pixel->red+=gamma*dx*dy*pixels[n].red;
5133 pixel->green+=gamma*dx*dy*pixels[n].green;
5134 pixel->blue+=gamma*dx*dy*pixels[n].blue;
5135 if (image->colorspace == CMYKColorspace)
5136 pixel->black+=gamma*dx*dy*pixels[n].black;
5137 pixel->alpha+=dx*dy*pixels[n].alpha;
5148 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5152 + I s F u z z y E q u i v a l e n c e P i x e l %
5156 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5158 % IsFuzzyEquivalencePixel() returns MagickTrue if the distance between two
5159 % pixels is less than the specified distance in a linear three (or four)u
5160 % dimensional color space.
5162 % The format of the IsFuzzyEquivalencePixel method is:
5164 % void IsFuzzyEquivalencePixel(const Image *image,const Quantum *p,
5167 % A description of each parameter follows:
5169 % o image: the image.
5176 MagickExport MagickBooleanType IsFuzzyEquivalencePixel(const Image *image,
5177 const Quantum *p,const Quantum *q)
5183 register MagickRealType
5187 fuzz=MagickMax(image->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(
5188 image->fuzz,(MagickRealType) MagickSQ1_2);
5191 if (image->matte != MagickFalse)
5194 Transparencies are involved - set alpha distance
5196 pixel=(MagickRealType) ((image->matte != MagickFalse ?
5197 GetPixelAlpha(image,p) : OpaqueAlpha)-(image->matte != MagickFalse ?
5198 GetPixelAlpha(image,q) : OpaqueAlpha));
5199 distance=pixel*pixel;
5200 if (distance > fuzz)
5201 return(MagickFalse);
5203 Generate a alpha scaling factor to generate a 4D cone on colorspace
5204 Note that if one color is transparent, distance has no color component.
5206 scale=QuantumScale*GetPixelAlpha(image,p);
5207 scale*=QuantumScale*GetPixelAlpha(image,q);
5208 if (scale <= MagickEpsilon)
5212 RGB or CMY color cube
5214 distance*=3.0; /* rescale appropriately */
5216 pixel=GetPixelRed(image,p)-(MagickRealType) GetPixelRed(image,q);
5217 if ((image->colorspace == HSLColorspace) ||
5218 (image->colorspace == HSBColorspace) ||
5219 (image->colorspace == HWBColorspace))
5222 Compute an arc distance for hue. It should be a vector angle of
5223 'S'/'W' length with 'L'/'B' forming appropriate cones.
5225 if (fabs((double) pixel) > (QuantumRange/2))
5226 pixel-=QuantumRange;
5229 distance+=scale*pixel*pixel;
5230 if (distance > fuzz)
5231 return(MagickFalse);
5232 pixel=GetPixelGreen(image,p)-(MagickRealType) GetPixelGreen(image,q);
5233 distance+=scale*pixel*pixel;
5234 if (distance > fuzz)
5235 return(MagickFalse);
5236 pixel=GetPixelBlue(image,p)-(MagickRealType) GetPixelBlue(image,q);
5237 distance+=scale*pixel*pixel;
5238 if (distance > fuzz)
5239 return(MagickFalse);
5244 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5248 + 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 %
5252 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5254 % IsFuzzyEquivalencePixelInfo() returns true if the distance between two
5255 % colors is less than the specified distance in a linear three (or four)
5256 % dimensional color space.
5258 % This implements the equivalent of:
5259 % fuzz < sqrt(color_distance^2 * u.a*v.a + alpha_distance^2)
5261 % Which produces a multi-dimensional cone for that colorspace along the
5262 % transparency vector.
5264 % For example for an RGB:
5265 % color_distance^2 = ( (u.r-v.r)^2 + (u.g-v.g)^2 + (u.b-v.b)^2 ) / 3
5267 % See http://www.imagemagick.org/Usage/bugs/fuzz_distance/
5269 % Hue colorspace distances need more work. Hue is not a distance, it is an
5272 % A check that q is in the same color space as p should be made and the
5273 % appropriate mapping made. -- Anthony Thyssen 8 December 2010
5275 % The format of the IsFuzzyEquivalencePixelInfo method is:
5277 % MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
5278 % const PixelInfo *q)
5280 % A description of each parameter follows:
5287 MagickExport MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
5294 register MagickRealType
5298 if ((p->fuzz == 0.0) && (q->fuzz == 0.0))
5299 return(IsPixelInfoEquivalent(p,q));
5301 fuzz=MagickMax(q->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(q->fuzz,
5302 (MagickRealType) MagickSQ1_2);
5303 else if (q->fuzz == 0.0)
5304 fuzz=MagickMax(p->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(p->fuzz,
5305 (MagickRealType) MagickSQ1_2);
5307 fuzz=MagickMax(p->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(q->fuzz,
5308 (MagickRealType) MagickSQ1_2);
5311 if ((p->matte != MagickFalse) || (q->matte != MagickFalse))
5314 Transparencies are involved - set alpha distance.
5316 pixel=(p->matte != MagickFalse ? p->alpha : OpaqueAlpha)-
5317 (q->matte != MagickFalse ? q->alpha : OpaqueAlpha);
5318 distance=pixel*pixel;
5319 if (distance > fuzz)
5320 return(MagickFalse);
5322 Generate a alpha scaling factor to generate a 4D cone on colorspace.
5323 If one color is transparent, distance has no color component.
5325 if (p->matte != MagickFalse)
5326 scale=(QuantumScale*p->alpha);
5327 if (q->matte != MagickFalse)
5328 scale*=(QuantumScale*q->alpha);
5329 if (scale <= MagickEpsilon )
5333 CMYK create a CMY cube with a multi-dimensional cone toward black.
5335 if (p->colorspace == CMYKColorspace)
5337 pixel=p->black-q->black;
5338 distance+=pixel*pixel*scale;
5339 if (distance > fuzz)
5340 return(MagickFalse);
5341 scale*=(MagickRealType) (QuantumScale*(QuantumRange-p->black));
5342 scale*=(MagickRealType) (QuantumScale*(QuantumRange-q->black));
5345 RGB or CMY color cube.
5347 distance*=3.0; /* rescale appropriately */
5349 pixel=p->red-q->red;
5350 if ((p->colorspace == HSLColorspace) || (p->colorspace == HSBColorspace) ||
5351 (p->colorspace == HWBColorspace))
5354 This calculates a arc distance for hue-- it should be a vector angle
5355 of 'S'/'W' length with 'L'/'B' forming appropriate cones. In other
5356 words this is a hack - Anthony.
5358 if (fabs((double) pixel) > (QuantumRange/2))
5359 pixel-=QuantumRange;
5362 distance+=pixel*pixel*scale;
5363 if (distance > fuzz)
5364 return(MagickFalse);
5365 pixel=p->green-q->green;
5366 distance+=pixel*pixel*scale;
5367 if (distance > fuzz)
5368 return(MagickFalse);
5369 pixel=p->blue-q->blue;
5370 distance+=pixel*pixel*scale;
5371 if (distance > fuzz)
5372 return(MagickFalse);
5377 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5381 % S e t P i x e l C h a n n e l M a p M a s k %
5385 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5387 % SetPixelChannelMapMask() sets the pixel channel map from the specified
5390 % The format of the SetPixelChannelMapMask method is:
5392 % void SetPixelChannelMapMask(Image *image,const ChannelType channel_mask)
5394 % A description of each parameter follows:
5396 % o image: the image.
5398 % o mask: the channel mask.
5401 MagickExport void SetPixelChannelMapMask(Image *image,
5402 const ChannelType channel_mask)
5404 #define GetChannelBit(mask,bit) (((size_t) (mask) >> (size_t) (bit)) & 0x01)
5409 image->channel_mask=channel_mask;
5410 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
5415 channel=GetPixelChannelMapChannel(image,i);
5416 SetPixelChannelMapTraits(image,channel,
5417 GetChannelBit(channel_mask,channel) == 0 ? CopyPixelTrait :
5418 image->matte == MagickFalse ? UpdatePixelTrait : (PixelTrait)
5419 (UpdatePixelTrait | BlendPixelTrait));
5421 if (image->storage_class == PseudoClass)
5422 SetPixelChannelMapTraits(image,IndexPixelChannel,CopyPixelTrait);
5423 if (image->debug != MagickFalse)
5424 LogPixelChannels(image);
5428 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5432 % S e t P i x e l C h a n n e l M a s k %
5436 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5438 % SetPixelChannelMask() sets the pixel channel mask from the specified channel
5441 % The format of the SetPixelChannelMask method is:
5443 % ChannelType SetPixelChannelMask(Image *image,
5444 % const ChannelType channel_mask)
5446 % A description of each parameter follows:
5448 % o image: the image.
5450 % o channel_mask: the channel mask.
5453 MagickExport ChannelType SetPixelChannelMask(Image *image,
5454 const ChannelType channel_mask)
5459 mask=image->channel_mask;
5460 image->channel_mask=channel_mask;
5461 SetPixelChannelMapMask(image,channel_mask);