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-2012 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/cache-private.h"
46 #include "MagickCore/color-private.h"
47 #include "MagickCore/draw.h"
48 #include "MagickCore/exception.h"
49 #include "MagickCore/exception-private.h"
50 #include "MagickCore/cache.h"
51 #include "MagickCore/constitute.h"
52 #include "MagickCore/delegate.h"
53 #include "MagickCore/geometry.h"
54 #include "MagickCore/image-private.h"
55 #include "MagickCore/list.h"
56 #include "MagickCore/magick.h"
57 #include "MagickCore/memory_.h"
58 #include "MagickCore/monitor.h"
59 #include "MagickCore/option.h"
60 #include "MagickCore/pixel.h"
61 #include "MagickCore/pixel-accessor.h"
62 #include "MagickCore/pixel-private.h"
63 #include "MagickCore/quantum.h"
64 #include "MagickCore/quantum-private.h"
65 #include "MagickCore/resource_.h"
66 #include "MagickCore/semaphore.h"
67 #include "MagickCore/statistic.h"
68 #include "MagickCore/stream.h"
69 #include "MagickCore/string_.h"
70 #include "MagickCore/transform.h"
71 #include "MagickCore/utility.h"
73 #define LogPixelChannels(image) \
78 (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%.20g]", \
79 image->filename,(double) image->number_channels); \
80 for (i=0; i < (ssize_t) image->number_channels; i++) \
83 traits[MaxTextExtent]; \
91 switch (GetPixelChannelChannel(image,i)) \
93 case RedPixelChannel: \
96 if (image->colorspace == CMYKColorspace) \
98 if (image->colorspace == GRAYColorspace) \
102 case GreenPixelChannel: \
105 if (image->colorspace == CMYKColorspace) \
109 case BluePixelChannel: \
112 if (image->colorspace == CMYKColorspace) \
116 case BlackPixelChannel: \
119 if (image->storage_class == PseudoClass) \
123 case IndexPixelChannel: \
128 case AlphaPixelChannel: \
133 case MaskPixelChannel: \
138 case MetaPixelChannel: \
146 channel=GetPixelChannelChannel(image,i); \
148 if ((GetPixelChannelTraits(image,channel) & UpdatePixelTrait) != 0) \
149 (void) ConcatenateMagickString(traits,"update,",MaxTextExtent); \
150 if ((GetPixelChannelTraits(image,channel) & BlendPixelTrait) != 0) \
151 (void) ConcatenateMagickString(traits,"blend,",MaxTextExtent); \
152 if ((GetPixelChannelTraits(image,channel) & CopyPixelTrait) != 0) \
153 (void) ConcatenateMagickString(traits,"copy,",MaxTextExtent); \
154 if (*traits == '\0') \
155 (void) ConcatenateMagickString(traits,"undefined,",MaxTextExtent); \
156 traits[strlen(traits)-1]='\0'; \
157 (void) LogMagickEvent(PixelEvent,GetMagickModule()," %.20g: %s (%s)", \
158 (double) i,name,traits); \
163 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
167 + A c q u i r e P i x e l C h a n n e l M a p %
171 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
173 % AcquirePixelChannelMap() acquires a pixel component map.
175 % The format of the AcquirePixelChannelMap() method is:
177 % PixelChannelMap *AcquirePixelChannelMap(void)
180 MagickExport PixelChannelMap *AcquirePixelChannelMap(void)
188 channel_map=(PixelChannelMap *) AcquireQuantumMemory(MaxPixelChannels,
189 sizeof(*channel_map));
190 if (channel_map == (PixelChannelMap *) NULL)
191 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
192 (void) ResetMagickMemory(channel_map,0,MaxPixelChannels*sizeof(*channel_map));
193 for (i=0; i < MaxPixelChannels; i++)
194 channel_map[i].channel=(PixelChannel) i;
199 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
203 + C l o n e P i x e l C h a n n e l M a p %
207 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
209 % ClonePixelChannelMap() clones a pixel component map.
211 % The format of the ClonePixelChannelMap() method is:
213 % PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
215 % A description of each parameter follows:
217 % o channel_map: the pixel component map.
220 MagickExport PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
225 assert(channel_map != (PixelChannelMap *) NULL);
226 clone_map=AcquirePixelChannelMap();
227 if (clone_map == (PixelChannelMap *) NULL)
228 return((PixelChannelMap *) NULL);
229 (void) CopyMagickMemory(clone_map,channel_map,MaxPixelChannels*
230 sizeof(*channel_map));
235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
239 + C l o n e P i x e l I n f o %
243 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
245 % ClonePixelInfo() makes a duplicate of the given pixel info structure, or if
246 % pixel info is NULL, a new one.
248 % The format of the ClonePixelInfo method is:
250 % PixelInfo *ClonePixelInfo(const PixelInfo *pixel_info)
252 % A description of each parameter follows:
254 % o pixel_info: the pixel info.
257 MagickExport PixelInfo *ClonePixelInfo(const PixelInfo *pixel)
262 pixel_info=(PixelInfo *) AcquireQuantumMemory(1,sizeof(*pixel_info));
263 if (pixel_info == (PixelInfo *) NULL)
264 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
265 *pixel_info=(*pixel);
270 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
274 + D e s t r o y P i x e l C h a n n e l M a p %
278 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280 % DestroyPixelChannelMap() deallocates memory associated with the pixel
283 % The format of the DestroyPixelChannelMap() method is:
285 % PixelChannelMap *DestroyPixelChannelMap(PixelChannelMap *channel_map)
287 % A description of each parameter follows:
289 % o channel_map: the pixel component map.
292 MagickExport PixelChannelMap *DestroyPixelChannelMap(
293 PixelChannelMap *channel_map)
295 assert(channel_map != (PixelChannelMap *) NULL);
296 channel_map=(PixelChannelMap *) RelinquishMagickMemory(channel_map);
297 return((PixelChannelMap *) RelinquishMagickMemory(channel_map));
301 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
305 % E x p o r t I m a g e P i x e l s %
309 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
311 % ExportImagePixels() extracts pixel data from an image and returns it to you.
312 % The method returns MagickTrue on success otherwise MagickFalse if an error is
313 % encountered. The data is returned as char, short int, Quantum, unsigned int,
314 % unsigned long long, float, or double in the order specified by map.
316 % Suppose you want to extract the first scanline of a 640x480 image as
317 % character data in red-green-blue order:
319 % ExportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels,exception);
321 % The format of the ExportImagePixels method is:
323 % MagickBooleanType ExportImagePixels(const Image *image,const ssize_t x,
324 % const ssize_t y,const size_t width,const size_t height,
325 % const char *map,const StorageType type,void *pixels,
326 % ExceptionInfo *exception)
328 % A description of each parameter follows:
330 % o image: the image.
332 % o x,y,width,height: These values define the perimeter
333 % of a region of pixels you want to extract.
335 % o map: This string reflects the expected ordering of the pixel array.
336 % It can be any combination or order of R = red, G = green, B = blue,
337 % A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
338 % Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
341 % o type: Define the data type of the pixels. Float and double types are
342 % normalized to [0..1] otherwise [0..QuantumRange]. Choose from these
343 % types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *),
344 % LongPixel (unsigned int *), LongLongPixel (unsigned long long *),
345 % QuantumPixel (Quantum *), or ShortPixel (unsigned short *).
347 % o pixels: This array of values contain the pixel components as defined by
348 % map and type. You must preallocate this array where the expected
349 % length varies depending on the values of width, height, map, and type.
351 % o exception: return any errors or warnings in this structure.
355 static void ExportCharPixel(Image *image,const RectangleInfo *roi,
356 const char *restrict map,const QuantumType *quantum_map,void *pixels,
357 ExceptionInfo *exception)
359 register const Quantum
365 register unsigned char
374 q=(unsigned char *) pixels;
375 if (LocaleCompare(map,"BGR") == 0)
377 for (y=0; y < (ssize_t) roi->height; y++)
379 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
380 if (p == (const Quantum *) NULL)
382 for (x=0; x < (ssize_t) roi->width; x++)
384 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
385 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
386 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
387 p+=GetPixelChannels(image);
392 if (LocaleCompare(map,"BGRA") == 0)
394 for (y=0; y < (ssize_t) roi->height; y++)
396 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
397 if (p == (const Quantum *) NULL)
399 for (x=0; x < (ssize_t) roi->width; x++)
401 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
402 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
403 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
404 *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
405 p+=GetPixelChannels(image);
410 if (LocaleCompare(map,"BGRP") == 0)
412 for (y=0; y < (ssize_t) roi->height; y++)
414 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
415 if (p == (const Quantum *) NULL)
417 for (x=0; x < (ssize_t) roi->width; x++)
419 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
420 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
421 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
422 *q++=ScaleQuantumToChar((Quantum) 0);
423 p+=GetPixelChannels(image);
428 if (LocaleCompare(map,"I") == 0)
430 for (y=0; y < (ssize_t) roi->height; y++)
432 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
433 if (p == (const Quantum *) NULL)
435 for (x=0; x < (ssize_t) roi->width; x++)
437 *q++=ScaleQuantumToChar(GetPixelIntensity(image,p));
438 p+=GetPixelChannels(image);
443 if (LocaleCompare(map,"RGB") == 0)
445 for (y=0; y < (ssize_t) roi->height; y++)
447 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
448 if (p == (const Quantum *) NULL)
450 for (x=0; x < (ssize_t) roi->width; x++)
452 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
453 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
454 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
455 p+=GetPixelChannels(image);
460 if (LocaleCompare(map,"RGBA") == 0)
462 for (y=0; y < (ssize_t) roi->height; y++)
464 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
465 if (p == (const Quantum *) NULL)
467 for (x=0; x < (ssize_t) roi->width; x++)
469 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
470 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
471 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
472 *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
473 p+=GetPixelChannels(image);
478 if (LocaleCompare(map,"RGBP") == 0)
480 for (y=0; y < (ssize_t) roi->height; y++)
482 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
483 if (p == (const Quantum *) NULL)
485 for (x=0; x < (ssize_t) roi->width; x++)
487 *q++=ScaleQuantumToChar(GetPixelRed(image,p));
488 *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
489 *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
490 *q++=ScaleQuantumToChar((Quantum) 0);
491 p+=GetPixelChannels(image);
497 for (y=0; y < (ssize_t) roi->height; y++)
499 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
500 if (p == (const Quantum *) NULL)
502 for (x=0; x < (ssize_t) roi->width; x++)
507 for (i=0; i < (ssize_t) length; i++)
510 switch (quantum_map[i])
515 *q=ScaleQuantumToChar(GetPixelRed(image,p));
521 *q=ScaleQuantumToChar(GetPixelGreen(image,p));
527 *q=ScaleQuantumToChar(GetPixelBlue(image,p));
532 *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
537 *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
542 if (image->colorspace == CMYKColorspace)
543 *q=ScaleQuantumToChar(GetPixelBlack(image,p));
548 *q=ScaleQuantumToChar(GetPixelIntensity(image,p));
556 p+=GetPixelChannels(image);
561 static void ExportDoublePixel(Image *image,const RectangleInfo *roi,
562 const char *restrict map,const QuantumType *quantum_map,void *pixels,
563 ExceptionInfo *exception)
565 register const Quantum
581 if (LocaleCompare(map,"BGR") == 0)
583 for (y=0; y < (ssize_t) roi->height; y++)
585 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
586 if (p == (const Quantum *) NULL)
588 for (x=0; x < (ssize_t) roi->width; x++)
590 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
591 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
592 *q++=(double) (QuantumScale*GetPixelRed(image,p));
593 p+=GetPixelChannels(image);
598 if (LocaleCompare(map,"BGRA") == 0)
600 for (y=0; y < (ssize_t) roi->height; y++)
602 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
603 if (p == (const Quantum *) NULL)
605 for (x=0; x < (ssize_t) roi->width; x++)
607 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
608 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
609 *q++=(double) (QuantumScale*GetPixelRed(image,p));
610 *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
611 p+=GetPixelChannels(image);
616 if (LocaleCompare(map,"BGRP") == 0)
618 for (y=0; y < (ssize_t) roi->height; y++)
620 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
621 if (p == (const Quantum *) NULL)
623 for (x=0; x < (ssize_t) roi->width; x++)
625 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
626 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
627 *q++=(double) (QuantumScale*GetPixelRed(image,p));
629 p+=GetPixelChannels(image);
634 if (LocaleCompare(map,"I") == 0)
636 for (y=0; y < (ssize_t) roi->height; y++)
638 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
639 if (p == (const Quantum *) NULL)
641 for (x=0; x < (ssize_t) roi->width; x++)
643 *q++=(double) (QuantumScale*GetPixelIntensity(image,p));
644 p+=GetPixelChannels(image);
649 if (LocaleCompare(map,"RGB") == 0)
651 for (y=0; y < (ssize_t) roi->height; y++)
653 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
654 if (p == (const Quantum *) NULL)
656 for (x=0; x < (ssize_t) roi->width; x++)
658 *q++=(double) (QuantumScale*GetPixelRed(image,p));
659 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
660 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
661 p+=GetPixelChannels(image);
666 if (LocaleCompare(map,"RGBA") == 0)
668 for (y=0; y < (ssize_t) roi->height; y++)
670 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
671 if (p == (const Quantum *) NULL)
673 for (x=0; x < (ssize_t) roi->width; x++)
675 *q++=(double) (QuantumScale*GetPixelRed(image,p));
676 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
677 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
678 *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
679 p+=GetPixelChannels(image);
684 if (LocaleCompare(map,"RGBP") == 0)
686 for (y=0; y < (ssize_t) roi->height; y++)
688 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
689 if (p == (const Quantum *) NULL)
691 for (x=0; x < (ssize_t) roi->width; x++)
693 *q++=(double) (QuantumScale*GetPixelRed(image,p));
694 *q++=(double) (QuantumScale*GetPixelGreen(image,p));
695 *q++=(double) (QuantumScale*GetPixelBlue(image,p));
697 p+=GetPixelChannels(image);
703 for (y=0; y < (ssize_t) roi->height; y++)
705 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
706 if (p == (const Quantum *) NULL)
708 for (x=0; x < (ssize_t) roi->width; x++)
713 for (i=0; i < (ssize_t) length; i++)
716 switch (quantum_map[i])
721 *q=(double) (QuantumScale*GetPixelRed(image,p));
727 *q=(double) (QuantumScale*GetPixelGreen(image,p));
733 *q=(double) (QuantumScale*GetPixelBlue(image,p));
738 *q=(double) (QuantumScale*GetPixelAlpha(image,p));
743 *q=(double) (QuantumScale*GetPixelAlpha(image,p));
748 if (image->colorspace == CMYKColorspace)
749 *q=(double) (QuantumScale*
750 GetPixelBlack(image,p));
755 *q=(double) (QuantumScale*GetPixelIntensity(image,p));
763 p+=GetPixelChannels(image);
768 static void ExportFloatPixel(Image *image,const RectangleInfo *roi,
769 const char *restrict map,const QuantumType *quantum_map,void *pixels,
770 ExceptionInfo *exception)
772 register const Quantum
788 if (LocaleCompare(map,"BGR") == 0)
790 for (y=0; y < (ssize_t) roi->height; y++)
792 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
793 if (p == (const Quantum *) NULL)
795 for (x=0; x < (ssize_t) roi->width; x++)
797 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
798 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
799 *q++=(float) (QuantumScale*GetPixelRed(image,p));
800 p+=GetPixelChannels(image);
805 if (LocaleCompare(map,"BGRA") == 0)
807 for (y=0; y < (ssize_t) roi->height; y++)
809 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
810 if (p == (const Quantum *) NULL)
812 for (x=0; x < (ssize_t) roi->width; x++)
814 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
815 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
816 *q++=(float) (QuantumScale*GetPixelRed(image,p));
817 *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
818 p+=GetPixelChannels(image);
823 if (LocaleCompare(map,"BGRP") == 0)
825 for (y=0; y < (ssize_t) roi->height; y++)
827 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
828 if (p == (const Quantum *) NULL)
830 for (x=0; x < (ssize_t) roi->width; x++)
832 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
833 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
834 *q++=(float) (QuantumScale*GetPixelRed(image,p));
836 p+=GetPixelChannels(image);
841 if (LocaleCompare(map,"I") == 0)
843 for (y=0; y < (ssize_t) roi->height; y++)
845 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
846 if (p == (const Quantum *) NULL)
848 for (x=0; x < (ssize_t) roi->width; x++)
850 *q++=(float) (QuantumScale*GetPixelIntensity(image,p));
851 p+=GetPixelChannels(image);
856 if (LocaleCompare(map,"RGB") == 0)
858 for (y=0; y < (ssize_t) roi->height; y++)
860 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
861 if (p == (const Quantum *) NULL)
863 for (x=0; x < (ssize_t) roi->width; x++)
865 *q++=(float) (QuantumScale*GetPixelRed(image,p));
866 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
867 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
868 p+=GetPixelChannels(image);
873 if (LocaleCompare(map,"RGBA") == 0)
875 for (y=0; y < (ssize_t) roi->height; y++)
877 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
878 if (p == (const Quantum *) NULL)
880 for (x=0; x < (ssize_t) roi->width; x++)
882 *q++=(float) (QuantumScale*GetPixelRed(image,p));
883 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
884 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
885 *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
886 p+=GetPixelChannels(image);
891 if (LocaleCompare(map,"RGBP") == 0)
893 for (y=0; y < (ssize_t) roi->height; y++)
895 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
896 if (p == (const Quantum *) NULL)
898 for (x=0; x < (ssize_t) roi->width; x++)
900 *q++=(float) (QuantumScale*GetPixelRed(image,p));
901 *q++=(float) (QuantumScale*GetPixelGreen(image,p));
902 *q++=(float) (QuantumScale*GetPixelBlue(image,p));
904 p+=GetPixelChannels(image);
910 for (y=0; y < (ssize_t) roi->height; y++)
912 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
913 if (p == (const Quantum *) NULL)
915 for (x=0; x < (ssize_t) roi->width; x++)
920 for (i=0; i < (ssize_t) length; i++)
923 switch (quantum_map[i])
928 *q=(float) (QuantumScale*GetPixelRed(image,p));
934 *q=(float) (QuantumScale*GetPixelGreen(image,p));
940 *q=(float) (QuantumScale*GetPixelBlue(image,p));
945 *q=(float) (QuantumScale*((Quantum) (GetPixelAlpha(image,p))));
950 *q=(float) (QuantumScale*GetPixelAlpha(image,p));
955 if (image->colorspace == CMYKColorspace)
956 *q=(float) (QuantumScale* GetPixelBlack(image,p));
961 *q=(float) (QuantumScale*GetPixelIntensity(image,p));
969 p+=GetPixelChannels(image);
974 static void ExportLongPixel(Image *image,const RectangleInfo *roi,
975 const char *restrict map,const QuantumType *quantum_map,void *pixels,
976 ExceptionInfo *exception)
978 register const Quantum
984 register unsigned int
993 q=(unsigned int *) pixels;
994 if (LocaleCompare(map,"BGR") == 0)
996 for (y=0; y < (ssize_t) roi->height; y++)
998 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
999 if (p == (const Quantum *) NULL)
1001 for (x=0; x < (ssize_t) roi->width; x++)
1003 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1004 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1005 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1006 p+=GetPixelChannels(image);
1011 if (LocaleCompare(map,"BGRA") == 0)
1013 for (y=0; y < (ssize_t) roi->height; y++)
1015 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1016 if (p == (const Quantum *) NULL)
1018 for (x=0; x < (ssize_t) roi->width; x++)
1020 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1021 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1022 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1023 *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1024 p+=GetPixelChannels(image);
1029 if (LocaleCompare(map,"BGRP") == 0)
1031 for (y=0; y < (ssize_t) roi->height; y++)
1033 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1034 if (p == (const Quantum *) NULL)
1036 for (x=0; x < (ssize_t) roi->width; x++)
1038 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1039 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1040 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1042 p+=GetPixelChannels(image);
1047 if (LocaleCompare(map,"I") == 0)
1049 for (y=0; y < (ssize_t) roi->height; y++)
1051 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1052 if (p == (const Quantum *) NULL)
1054 for (x=0; x < (ssize_t) roi->width; x++)
1056 *q++=ScaleQuantumToLong(GetPixelIntensity(image,p));
1057 p+=GetPixelChannels(image);
1062 if (LocaleCompare(map,"RGB") == 0)
1064 for (y=0; y < (ssize_t) roi->height; y++)
1066 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1067 if (p == (const Quantum *) NULL)
1069 for (x=0; x < (ssize_t) roi->width; x++)
1071 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1072 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1073 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1074 p+=GetPixelChannels(image);
1079 if (LocaleCompare(map,"RGBA") == 0)
1081 for (y=0; y < (ssize_t) roi->height; y++)
1083 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1084 if (p == (const Quantum *) NULL)
1086 for (x=0; x < (ssize_t) roi->width; x++)
1088 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1089 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1090 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1091 *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1092 p+=GetPixelChannels(image);
1097 if (LocaleCompare(map,"RGBP") == 0)
1099 for (y=0; y < (ssize_t) roi->height; y++)
1101 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1102 if (p == (const Quantum *) NULL)
1104 for (x=0; x < (ssize_t) roi->width; x++)
1106 *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1107 *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1108 *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1110 p+=GetPixelChannels(image);
1116 for (y=0; y < (ssize_t) roi->height; y++)
1118 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1119 if (p == (const Quantum *) NULL)
1121 for (x=0; x < (ssize_t) roi->width; x++)
1126 for (i=0; i < (ssize_t) length; i++)
1129 switch (quantum_map[i])
1134 *q=ScaleQuantumToLong(GetPixelRed(image,p));
1138 case MagentaQuantum:
1140 *q=ScaleQuantumToLong(GetPixelGreen(image,p));
1146 *q=ScaleQuantumToLong(GetPixelBlue(image,p));
1151 *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1154 case OpacityQuantum:
1156 *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1161 if (image->colorspace == CMYKColorspace)
1162 *q=ScaleQuantumToLong(GetPixelBlack(image,p));
1167 *q=ScaleQuantumToLong(GetPixelIntensity(image,p));
1175 p+=GetPixelChannels(image);
1180 static void ExportLongLongPixel(Image *image,const RectangleInfo *roi,
1181 const char *restrict map,const QuantumType *quantum_map,void *pixels,
1182 ExceptionInfo *exception)
1184 register const Quantum
1190 register MagickSizeType
1199 q=(MagickSizeType *) pixels;
1200 if (LocaleCompare(map,"BGR") == 0)
1202 for (y=0; y < (ssize_t) roi->height; y++)
1204 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1205 if (p == (const Quantum *) NULL)
1207 for (x=0; x < (ssize_t) roi->width; x++)
1209 *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1210 *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1211 *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1212 p+=GetPixelChannels(image);
1217 if (LocaleCompare(map,"BGRA") == 0)
1219 for (y=0; y < (ssize_t) roi->height; y++)
1221 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1222 if (p == (const Quantum *) NULL)
1224 for (x=0; x < (ssize_t) roi->width; x++)
1226 *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1227 *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1228 *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1229 *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1230 p+=GetPixelChannels(image);
1235 if (LocaleCompare(map,"BGRP") == 0)
1237 for (y=0; y < (ssize_t) roi->height; y++)
1239 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1240 if (p == (const Quantum *) NULL)
1242 for (x=0; x < (ssize_t) roi->width; x++)
1244 *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1245 *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1246 *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1248 p+=GetPixelChannels(image);
1253 if (LocaleCompare(map,"I") == 0)
1255 for (y=0; y < (ssize_t) roi->height; y++)
1257 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1258 if (p == (const Quantum *) NULL)
1260 for (x=0; x < (ssize_t) roi->width; x++)
1262 *q++=ScaleQuantumToLongLong(GetPixelIntensity(image,p));
1263 p+=GetPixelChannels(image);
1268 if (LocaleCompare(map,"RGB") == 0)
1270 for (y=0; y < (ssize_t) roi->height; y++)
1272 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1273 if (p == (const Quantum *) NULL)
1275 for (x=0; x < (ssize_t) roi->width; x++)
1277 *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1278 *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1279 *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1280 p+=GetPixelChannels(image);
1285 if (LocaleCompare(map,"RGBA") == 0)
1287 for (y=0; y < (ssize_t) roi->height; y++)
1289 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1290 if (p == (const Quantum *) NULL)
1292 for (x=0; x < (ssize_t) roi->width; x++)
1294 *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1295 *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1296 *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1297 *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1298 p+=GetPixelChannels(image);
1303 if (LocaleCompare(map,"RGBP") == 0)
1305 for (y=0; y < (ssize_t) roi->height; y++)
1307 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1308 if (p == (const Quantum *) NULL)
1310 for (x=0; x < (ssize_t) roi->width; x++)
1312 *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1313 *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1314 *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1316 p+=GetPixelChannels(image);
1322 for (y=0; y < (ssize_t) roi->height; y++)
1324 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1325 if (p == (const Quantum *) NULL)
1327 for (x=0; x < (ssize_t) roi->width; x++)
1332 for (i=0; i < (ssize_t) length; i++)
1335 switch (quantum_map[i])
1340 *q=ScaleQuantumToLongLong(GetPixelRed(image,p));
1344 case MagentaQuantum:
1346 *q=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1352 *q=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1357 *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1360 case OpacityQuantum:
1362 *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1367 if (image->colorspace == CMYKColorspace)
1368 *q=ScaleQuantumToLongLong(GetPixelBlack(image,p));
1373 *q=ScaleQuantumToLongLong(GetPixelIntensity(image,p));
1381 p+=GetPixelChannels(image);
1386 static void ExportQuantumPixel(Image *image,const RectangleInfo *roi,
1387 const char *restrict map,const QuantumType *quantum_map,void *pixels,
1388 ExceptionInfo *exception)
1390 register const Quantum
1405 q=(Quantum *) pixels;
1406 if (LocaleCompare(map,"BGR") == 0)
1408 for (y=0; y < (ssize_t) roi->height; y++)
1410 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1411 if (p == (const Quantum *) NULL)
1413 for (x=0; x < (ssize_t) roi->width; x++)
1415 *q++=GetPixelBlue(image,p);
1416 *q++=GetPixelGreen(image,p);
1417 *q++=GetPixelRed(image,p);
1418 p+=GetPixelChannels(image);
1423 if (LocaleCompare(map,"BGRA") == 0)
1425 for (y=0; y < (ssize_t) roi->height; y++)
1427 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1428 if (p == (const Quantum *) NULL)
1430 for (x=0; x < (ssize_t) roi->width; x++)
1432 *q++=GetPixelBlue(image,p);
1433 *q++=GetPixelGreen(image,p);
1434 *q++=GetPixelRed(image,p);
1435 *q++=(Quantum) (GetPixelAlpha(image,p));
1436 p+=GetPixelChannels(image);
1441 if (LocaleCompare(map,"BGRP") == 0)
1443 for (y=0; y < (ssize_t) roi->height; y++)
1445 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1446 if (p == (const Quantum *) NULL)
1448 for (x=0; x < (ssize_t) roi->width; x++)
1450 *q++=GetPixelBlue(image,p);
1451 *q++=GetPixelGreen(image,p);
1452 *q++=GetPixelRed(image,p);
1454 p+=GetPixelChannels(image);
1459 if (LocaleCompare(map,"I") == 0)
1461 for (y=0; y < (ssize_t) roi->height; y++)
1463 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1464 if (p == (const Quantum *) NULL)
1466 for (x=0; x < (ssize_t) roi->width; x++)
1468 *q++=GetPixelIntensity(image,p);
1469 p+=GetPixelChannels(image);
1474 if (LocaleCompare(map,"RGB") == 0)
1476 for (y=0; y < (ssize_t) roi->height; y++)
1478 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1479 if (p == (const Quantum *) NULL)
1481 for (x=0; x < (ssize_t) roi->width; x++)
1483 *q++=GetPixelRed(image,p);
1484 *q++=GetPixelGreen(image,p);
1485 *q++=GetPixelBlue(image,p);
1486 p+=GetPixelChannels(image);
1491 if (LocaleCompare(map,"RGBA") == 0)
1493 for (y=0; y < (ssize_t) roi->height; y++)
1495 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1496 if (p == (const Quantum *) NULL)
1498 for (x=0; x < (ssize_t) roi->width; x++)
1500 *q++=GetPixelRed(image,p);
1501 *q++=GetPixelGreen(image,p);
1502 *q++=GetPixelBlue(image,p);
1503 *q++=(Quantum) (GetPixelAlpha(image,p));
1504 p+=GetPixelChannels(image);
1509 if (LocaleCompare(map,"RGBP") == 0)
1511 for (y=0; y < (ssize_t) roi->height; y++)
1513 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1514 if (p == (const Quantum *) NULL)
1516 for (x=0; x < (ssize_t) roi->width; x++)
1518 *q++=GetPixelRed(image,p);
1519 *q++=GetPixelGreen(image,p);
1520 *q++=GetPixelBlue(image,p);
1522 p+=GetPixelChannels(image);
1528 for (y=0; y < (ssize_t) roi->height; y++)
1530 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1531 if (p == (const Quantum *) NULL)
1533 for (x=0; x < (ssize_t) roi->width; x++)
1538 for (i=0; i < (ssize_t) length; i++)
1541 switch (quantum_map[i])
1546 *q=GetPixelRed(image,p);
1550 case MagentaQuantum:
1552 *q=GetPixelGreen(image,p);
1558 *q=GetPixelBlue(image,p);
1563 *q=GetPixelAlpha(image,p);
1566 case OpacityQuantum:
1568 *q=GetPixelAlpha(image,p);
1573 if (image->colorspace == CMYKColorspace)
1574 *q=GetPixelBlack(image,p);
1579 *q=(GetPixelIntensity(image,p));
1590 p+=GetPixelChannels(image);
1595 static void ExportShortPixel(Image *image,const RectangleInfo *roi,
1596 const char *restrict map,const QuantumType *quantum_map,void *pixels,
1597 ExceptionInfo *exception)
1599 register const Quantum
1605 register unsigned short
1614 q=(unsigned short *) pixels;
1615 if (LocaleCompare(map,"BGR") == 0)
1617 for (y=0; y < (ssize_t) roi->height; y++)
1619 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1620 if (p == (const Quantum *) NULL)
1622 for (x=0; x < (ssize_t) roi->width; x++)
1624 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1625 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1626 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1627 p+=GetPixelChannels(image);
1632 if (LocaleCompare(map,"BGRA") == 0)
1634 for (y=0; y < (ssize_t) roi->height; y++)
1636 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1637 if (p == (const Quantum *) NULL)
1639 for (x=0; x < (ssize_t) roi->width; x++)
1641 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1642 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1643 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1644 *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1645 p+=GetPixelChannels(image);
1650 if (LocaleCompare(map,"BGRP") == 0)
1652 for (y=0; y < (ssize_t) roi->height; y++)
1654 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1655 if (p == (const Quantum *) NULL)
1657 for (x=0; x < (ssize_t) roi->width; x++)
1659 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1660 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1661 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1663 p+=GetPixelChannels(image);
1668 if (LocaleCompare(map,"I") == 0)
1670 for (y=0; y < (ssize_t) roi->height; y++)
1672 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1673 if (p == (const Quantum *) NULL)
1675 for (x=0; x < (ssize_t) roi->width; x++)
1677 *q++=ScaleQuantumToShort(GetPixelIntensity(image,p));
1678 p+=GetPixelChannels(image);
1683 if (LocaleCompare(map,"RGB") == 0)
1685 for (y=0; y < (ssize_t) roi->height; y++)
1687 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1688 if (p == (const Quantum *) NULL)
1690 for (x=0; x < (ssize_t) roi->width; x++)
1692 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1693 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1694 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1695 p+=GetPixelChannels(image);
1700 if (LocaleCompare(map,"RGBA") == 0)
1702 for (y=0; y < (ssize_t) roi->height; y++)
1704 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1705 if (p == (const Quantum *) NULL)
1707 for (x=0; x < (ssize_t) roi->width; x++)
1709 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1710 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1711 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1712 *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1713 p+=GetPixelChannels(image);
1718 if (LocaleCompare(map,"RGBP") == 0)
1720 for (y=0; y < (ssize_t) roi->height; y++)
1722 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1723 if (p == (const Quantum *) NULL)
1725 for (x=0; x < (ssize_t) roi->width; x++)
1727 *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1728 *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1729 *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1731 p+=GetPixelChannels(image);
1737 for (y=0; y < (ssize_t) roi->height; y++)
1739 p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1740 if (p == (const Quantum *) NULL)
1742 for (x=0; x < (ssize_t) roi->width; x++)
1747 for (i=0; i < (ssize_t) length; i++)
1750 switch (quantum_map[i])
1755 *q=ScaleQuantumToShort(GetPixelRed(image,p));
1759 case MagentaQuantum:
1761 *q=ScaleQuantumToShort(GetPixelGreen(image,p));
1767 *q=ScaleQuantumToShort(GetPixelBlue(image,p));
1772 *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1775 case OpacityQuantum:
1777 *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1782 if (image->colorspace == CMYKColorspace)
1783 *q=ScaleQuantumToShort(GetPixelBlack(image,p));
1788 *q=ScaleQuantumToShort(GetPixelIntensity(image,p));
1796 p+=GetPixelChannels(image);
1801 MagickExport MagickBooleanType ExportImagePixels(Image *image,
1802 const ssize_t x,const ssize_t y,const size_t width,const size_t height,
1803 const char *map,const StorageType type,void *pixels,ExceptionInfo *exception)
1817 assert(image != (Image *) NULL);
1818 assert(image->signature == MagickSignature);
1819 if (image->debug != MagickFalse)
1820 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1822 quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
1823 if (quantum_map == (QuantumType *) NULL)
1825 (void) ThrowMagickException(exception,GetMagickModule(),
1826 ResourceLimitError,"MemoryAllocationFailed","'%s'",image->filename);
1827 return(MagickFalse);
1829 for (i=0; i < (ssize_t) length; i++)
1836 quantum_map[i]=AlphaQuantum;
1842 quantum_map[i]=BlueQuantum;
1848 quantum_map[i]=CyanQuantum;
1849 if (image->colorspace == CMYKColorspace)
1851 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1852 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1853 "ColorSeparatedImageRequired","'%s'",map);
1854 return(MagickFalse);
1859 quantum_map[i]=GreenQuantum;
1865 quantum_map[i]=IndexQuantum;
1871 quantum_map[i]=BlackQuantum;
1872 if (image->colorspace == CMYKColorspace)
1874 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1875 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1876 "ColorSeparatedImageRequired","'%s'",map);
1877 return(MagickFalse);
1882 quantum_map[i]=MagentaQuantum;
1883 if (image->colorspace == CMYKColorspace)
1885 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1886 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1887 "ColorSeparatedImageRequired","'%s'",map);
1888 return(MagickFalse);
1893 quantum_map[i]=OpacityQuantum;
1899 quantum_map[i]=UndefinedQuantum;
1905 quantum_map[i]=RedQuantum;
1911 quantum_map[i]=YellowQuantum;
1912 if (image->colorspace == CMYKColorspace)
1914 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1915 (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1916 "ColorSeparatedImageRequired","'%s'",map);
1917 return(MagickFalse);
1921 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1922 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
1923 "UnrecognizedPixelMap","'%s'",map);
1924 return(MagickFalse);
1936 ExportCharPixel(image,&roi,map,quantum_map,pixels,exception);
1941 ExportDoublePixel(image,&roi,map,quantum_map,pixels,exception);
1946 ExportFloatPixel(image,&roi,map,quantum_map,pixels,exception);
1951 ExportLongPixel(image,&roi,map,quantum_map,pixels,exception);
1956 ExportLongLongPixel(image,&roi,map,quantum_map,pixels,exception);
1961 ExportQuantumPixel(image,&roi,map,quantum_map,pixels,exception);
1966 ExportShortPixel(image,&roi,map,quantum_map,pixels,exception);
1971 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1972 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
1973 "UnrecognizedPixelMap","'%s'",map);
1977 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1982 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1986 % G e t P i x e l I n f o %
1990 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1992 % GetPixelInfo() initializes the PixelInfo structure.
1994 % The format of the GetPixelInfo method is:
1996 % GetPixelInfo(const Image *image,PixelInfo *pixel)
1998 % A description of each parameter follows:
2000 % o image: the image.
2002 % o pixel: Specifies a pointer to a PixelInfo structure.
2005 MagickExport void GetPixelInfo(const Image *image,PixelInfo *pixel)
2007 pixel->storage_class=DirectClass;
2008 pixel->colorspace=sRGBColorspace;
2009 pixel->alpha_trait=UndefinedPixelTrait;
2011 pixel->depth=MAGICKCORE_QUANTUM_DEPTH;
2016 pixel->alpha=(double) OpaqueAlpha;
2018 if (image == (const Image *) NULL)
2020 pixel->storage_class=image->storage_class;
2021 pixel->colorspace=image->colorspace;
2022 pixel->alpha_trait=image->alpha_trait;
2023 pixel->depth=image->depth;
2024 pixel->fuzz=image->fuzz;
2028 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2032 % I m p o r t I m a g e P i x e l s %
2036 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2038 % ImportImagePixels() accepts pixel data and stores in the image at the
2039 % location you specify. The method returns MagickTrue on success otherwise
2040 % MagickFalse if an error is encountered. The pixel data can be either char,
2041 % Quantum, short int, unsigned int, unsigned long long, float, or double in
2042 % the order specified by map.
2044 % Suppose your want to upload the first scanline of a 640x480 image from
2045 % character data in red-green-blue order:
2047 % ImportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels);
2049 % The format of the ImportImagePixels method is:
2051 % MagickBooleanType ImportImagePixels(Image *image,const ssize_t x,
2052 % const ssize_t y,const size_t width,const size_t height,
2053 % const char *map,const StorageType type,const void *pixels,
2054 % ExceptionInfo *exception)
2056 % A description of each parameter follows:
2058 % o image: the image.
2060 % o x,y,width,height: These values define the perimeter
2061 % of a region of pixels you want to define.
2063 % o map: This string reflects the expected ordering of the pixel array.
2064 % It can be any combination or order of R = red, G = green, B = blue,
2065 % A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
2066 % Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
2069 % o type: Define the data type of the pixels. Float and double types are
2070 % normalized to [0..1] otherwise [0..QuantumRange]. Choose from these
2071 % types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *),
2072 % LongPixel (unsigned int *), LongLongPixel (unsigned long long *),
2073 % QuantumPixel (Quantum *), or ShortPixel (unsigned short *).
2075 % o pixels: This array of values contain the pixel components as defined by
2076 % map and type. You must preallocate this array where the expected
2077 % length varies depending on the values of width, height, map, and type.
2079 % o exception: return any errors or warnings in this structure.
2083 static void ImportCharPixel(Image *image,const RectangleInfo *roi,
2084 const char *restrict map,const QuantumType *quantum_map,const void *pixels,
2085 ExceptionInfo *exception)
2087 register const unsigned char
2102 p=(const unsigned char *) pixels;
2103 if (LocaleCompare(map,"BGR") == 0)
2105 for (y=0; y < (ssize_t) roi->height; y++)
2107 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2108 if (q == (Quantum *) NULL)
2110 for (x=0; x < (ssize_t) roi->width; x++)
2112 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2113 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2114 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2115 q+=GetPixelChannels(image);
2117 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2122 if (LocaleCompare(map,"BGRA") == 0)
2124 for (y=0; y < (ssize_t) roi->height; y++)
2126 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2127 if (q == (Quantum *) NULL)
2129 for (x=0; x < (ssize_t) roi->width; x++)
2131 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2132 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2133 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2134 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2135 q+=GetPixelChannels(image);
2137 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2142 if (LocaleCompare(map,"BGRO") == 0)
2144 for (y=0; y < (ssize_t) roi->height; y++)
2146 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2147 if (q == (Quantum *) NULL)
2149 for (x=0; x < (ssize_t) roi->width; x++)
2151 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2152 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2153 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2154 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2155 q+=GetPixelChannels(image);
2157 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2162 if (LocaleCompare(map,"BGRP") == 0)
2164 for (y=0; y < (ssize_t) roi->height; y++)
2166 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2167 if (q == (Quantum *) NULL)
2169 for (x=0; x < (ssize_t) roi->width; x++)
2171 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2172 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2173 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2175 q+=GetPixelChannels(image);
2177 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2182 if (LocaleCompare(map,"I") == 0)
2184 for (y=0; y < (ssize_t) roi->height; y++)
2186 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2187 if (q == (Quantum *) NULL)
2189 for (x=0; x < (ssize_t) roi->width; x++)
2191 SetPixelGray(image,ScaleCharToQuantum(*p++),q);
2192 q+=GetPixelChannels(image);
2194 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2199 if (LocaleCompare(map,"RGB") == 0)
2201 for (y=0; y < (ssize_t) roi->height; y++)
2203 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2204 if (q == (Quantum *) NULL)
2206 for (x=0; x < (ssize_t) roi->width; x++)
2208 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2209 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2210 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2211 q+=GetPixelChannels(image);
2213 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2218 if (LocaleCompare(map,"RGBA") == 0)
2220 for (y=0; y < (ssize_t) roi->height; y++)
2222 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2223 if (q == (Quantum *) NULL)
2225 for (x=0; x < (ssize_t) roi->width; x++)
2227 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2228 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2229 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2230 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2231 q+=GetPixelChannels(image);
2233 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2238 if (LocaleCompare(map,"RGBO") == 0)
2240 for (y=0; y < (ssize_t) roi->height; y++)
2242 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2243 if (q == (Quantum *) NULL)
2245 for (x=0; x < (ssize_t) roi->width; x++)
2247 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2248 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2249 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2250 SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2251 q+=GetPixelChannels(image);
2253 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2258 if (LocaleCompare(map,"RGBP") == 0)
2260 for (y=0; y < (ssize_t) roi->height; y++)
2262 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2263 if (q == (Quantum *) NULL)
2265 for (x=0; x < (ssize_t) roi->width; x++)
2267 SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2268 SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2269 SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2271 q+=GetPixelChannels(image);
2273 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2279 for (y=0; y < (ssize_t) roi->height; y++)
2281 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2282 if (q == (Quantum *) NULL)
2284 for (x=0; x < (ssize_t) roi->width; x++)
2289 for (i=0; i < (ssize_t) length; i++)
2291 switch (quantum_map[i])
2296 SetPixelRed(image,ScaleCharToQuantum(*p),q);
2300 case MagentaQuantum:
2302 SetPixelGreen(image,ScaleCharToQuantum(*p),q);
2308 SetPixelBlue(image,ScaleCharToQuantum(*p),q);
2313 SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2316 case OpacityQuantum:
2318 SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2323 SetPixelBlack(image,ScaleCharToQuantum(*p),q);
2328 SetPixelGray(image,ScaleCharToQuantum(*p),q);
2336 q+=GetPixelChannels(image);
2338 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2343 static void ImportDoublePixel(Image *image,const RectangleInfo *roi,
2344 const char *restrict map,const QuantumType *quantum_map,const void *pixels,
2345 ExceptionInfo *exception)
2347 register const double
2362 p=(const double *) pixels;
2363 if (LocaleCompare(map,"BGR") == 0)
2365 for (y=0; y < (ssize_t) roi->height; y++)
2367 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2368 if (q == (Quantum *) NULL)
2370 for (x=0; x < (ssize_t) roi->width; x++)
2372 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2374 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2376 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2378 q+=GetPixelChannels(image);
2380 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2385 if (LocaleCompare(map,"BGRA") == 0)
2387 for (y=0; y < (ssize_t) roi->height; y++)
2389 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2390 if (q == (Quantum *) NULL)
2392 for (x=0; x < (ssize_t) roi->width; x++)
2394 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2396 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2398 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2400 SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2402 q+=GetPixelChannels(image);
2404 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2409 if (LocaleCompare(map,"BGRP") == 0)
2411 for (y=0; y < (ssize_t) roi->height; y++)
2413 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2414 if (q == (Quantum *) NULL)
2416 for (x=0; x < (ssize_t) roi->width; x++)
2418 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2420 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2422 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2425 q+=GetPixelChannels(image);
2427 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2432 if (LocaleCompare(map,"I") == 0)
2434 for (y=0; y < (ssize_t) roi->height; y++)
2436 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2437 if (q == (Quantum *) NULL)
2439 for (x=0; x < (ssize_t) roi->width; x++)
2441 SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
2443 q+=GetPixelChannels(image);
2445 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2450 if (LocaleCompare(map,"RGB") == 0)
2452 for (y=0; y < (ssize_t) roi->height; y++)
2454 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2455 if (q == (Quantum *) NULL)
2457 for (x=0; x < (ssize_t) roi->width; x++)
2459 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2461 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2463 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2465 q+=GetPixelChannels(image);
2467 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2472 if (LocaleCompare(map,"RGBA") == 0)
2474 for (y=0; y < (ssize_t) roi->height; y++)
2476 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2477 if (q == (Quantum *) NULL)
2479 for (x=0; x < (ssize_t) roi->width; x++)
2481 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2483 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2485 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2487 SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2489 q+=GetPixelChannels(image);
2491 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2496 if (LocaleCompare(map,"RGBP") == 0)
2498 for (y=0; y < (ssize_t) roi->height; y++)
2500 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2501 if (q == (Quantum *) NULL)
2503 for (x=0; x < (ssize_t) roi->width; x++)
2505 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2507 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2509 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2511 q+=GetPixelChannels(image);
2513 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2519 for (y=0; y < (ssize_t) roi->height; y++)
2521 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2522 if (q == (Quantum *) NULL)
2524 for (x=0; x < (ssize_t) roi->width; x++)
2529 for (i=0; i < (ssize_t) length; i++)
2531 switch (quantum_map[i])
2536 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2540 case MagentaQuantum:
2542 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2548 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2553 SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2556 case OpacityQuantum:
2558 SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2563 SetPixelBlack(image,ClampToQuantum(QuantumRange*(*p)),q);
2568 SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
2576 q+=GetPixelChannels(image);
2578 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2583 static void ImportFloatPixel(Image *image,const RectangleInfo *roi,
2584 const char *restrict map,const QuantumType *quantum_map,const void *pixels,
2585 ExceptionInfo *exception)
2587 register const float
2602 p=(const float *) pixels;
2603 if (LocaleCompare(map,"BGR") == 0)
2605 for (y=0; y < (ssize_t) roi->height; y++)
2607 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2608 if (q == (Quantum *) NULL)
2610 for (x=0; x < (ssize_t) roi->width; x++)
2612 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2614 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2616 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2618 q+=GetPixelChannels(image);
2620 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2625 if (LocaleCompare(map,"BGRA") == 0)
2627 for (y=0; y < (ssize_t) roi->height; y++)
2629 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2630 if (q == (Quantum *) NULL)
2632 for (x=0; x < (ssize_t) roi->width; x++)
2634 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2636 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2638 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2640 SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2642 q+=GetPixelChannels(image);
2644 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2649 if (LocaleCompare(map,"BGRP") == 0)
2651 for (y=0; y < (ssize_t) roi->height; y++)
2653 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2654 if (q == (Quantum *) NULL)
2656 for (x=0; x < (ssize_t) roi->width; x++)
2658 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2660 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2662 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2665 q+=GetPixelChannels(image);
2667 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2672 if (LocaleCompare(map,"I") == 0)
2674 for (y=0; y < (ssize_t) roi->height; y++)
2676 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2677 if (q == (Quantum *) NULL)
2679 for (x=0; x < (ssize_t) roi->width; x++)
2681 SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
2683 q+=GetPixelChannels(image);
2685 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2690 if (LocaleCompare(map,"RGB") == 0)
2692 for (y=0; y < (ssize_t) roi->height; y++)
2694 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2695 if (q == (Quantum *) NULL)
2697 for (x=0; x < (ssize_t) roi->width; x++)
2699 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2701 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2703 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2705 q+=GetPixelChannels(image);
2707 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2712 if (LocaleCompare(map,"RGBA") == 0)
2714 for (y=0; y < (ssize_t) roi->height; y++)
2716 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2717 if (q == (Quantum *) NULL)
2719 for (x=0; x < (ssize_t) roi->width; x++)
2721 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2723 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2725 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2727 SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2729 q+=GetPixelChannels(image);
2731 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2736 if (LocaleCompare(map,"RGBP") == 0)
2738 for (y=0; y < (ssize_t) roi->height; y++)
2740 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2741 if (q == (Quantum *) NULL)
2743 for (x=0; x < (ssize_t) roi->width; x++)
2745 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2747 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2749 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2751 q+=GetPixelChannels(image);
2753 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2759 for (y=0; y < (ssize_t) roi->height; y++)
2761 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2762 if (q == (Quantum *) NULL)
2764 for (x=0; x < (ssize_t) roi->width; x++)
2769 for (i=0; i < (ssize_t) length; i++)
2771 switch (quantum_map[i])
2776 SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2780 case MagentaQuantum:
2782 SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2788 SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2793 SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2796 case OpacityQuantum:
2798 SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2803 SetPixelBlack(image,ClampToQuantum(QuantumRange*(*p)),q);
2808 SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
2816 q+=GetPixelChannels(image);
2818 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2823 static void ImportLongPixel(Image *image,const RectangleInfo *roi,
2824 const char *restrict map,const QuantumType *quantum_map,const void *pixels,
2825 ExceptionInfo *exception)
2827 register const unsigned int
2842 p=(const unsigned int *) pixels;
2843 if (LocaleCompare(map,"BGR") == 0)
2845 for (y=0; y < (ssize_t) roi->height; y++)
2847 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2848 if (q == (Quantum *) NULL)
2850 for (x=0; x < (ssize_t) roi->width; x++)
2852 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2853 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2854 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2855 q+=GetPixelChannels(image);
2857 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2862 if (LocaleCompare(map,"BGRA") == 0)
2864 for (y=0; y < (ssize_t) roi->height; y++)
2866 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2867 if (q == (Quantum *) NULL)
2869 for (x=0; x < (ssize_t) roi->width; x++)
2871 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2872 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2873 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2874 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2875 q+=GetPixelChannels(image);
2877 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2882 if (LocaleCompare(map,"BGRP") == 0)
2884 for (y=0; y < (ssize_t) roi->height; y++)
2886 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2887 if (q == (Quantum *) NULL)
2889 for (x=0; x < (ssize_t) roi->width; x++)
2891 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2892 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2893 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2895 q+=GetPixelChannels(image);
2897 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2902 if (LocaleCompare(map,"I") == 0)
2904 for (y=0; y < (ssize_t) roi->height; y++)
2906 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2907 if (q == (Quantum *) NULL)
2909 for (x=0; x < (ssize_t) roi->width; x++)
2911 SetPixelGray(image,ScaleLongToQuantum(*p++),q);
2912 q+=GetPixelChannels(image);
2914 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2919 if (LocaleCompare(map,"RGB") == 0)
2921 for (y=0; y < (ssize_t) roi->height; y++)
2923 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2924 if (q == (Quantum *) NULL)
2926 for (x=0; x < (ssize_t) roi->width; x++)
2928 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2929 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2930 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2931 q+=GetPixelChannels(image);
2933 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2938 if (LocaleCompare(map,"RGBA") == 0)
2940 for (y=0; y < (ssize_t) roi->height; y++)
2942 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2943 if (q == (Quantum *) NULL)
2945 for (x=0; x < (ssize_t) roi->width; x++)
2947 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2948 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2949 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2950 SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2951 q+=GetPixelChannels(image);
2953 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2958 if (LocaleCompare(map,"RGBP") == 0)
2960 for (y=0; y < (ssize_t) roi->height; y++)
2962 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2963 if (q == (Quantum *) NULL)
2965 for (x=0; x < (ssize_t) roi->width; x++)
2967 SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2968 SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2969 SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2971 q+=GetPixelChannels(image);
2973 if (SyncAuthenticPixels(image,exception) == MagickFalse)
2979 for (y=0; y < (ssize_t) roi->height; y++)
2981 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2982 if (q == (Quantum *) NULL)
2984 for (x=0; x < (ssize_t) roi->width; x++)
2989 for (i=0; i < (ssize_t) length; i++)
2991 switch (quantum_map[i])
2996 SetPixelRed(image,ScaleLongToQuantum(*p),q);
3000 case MagentaQuantum:
3002 SetPixelGreen(image,ScaleLongToQuantum(*p),q);
3008 SetPixelBlue(image,ScaleLongToQuantum(*p),q);
3013 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3016 case OpacityQuantum:
3018 SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3023 SetPixelBlack(image,ScaleLongToQuantum(*p),q);
3028 SetPixelGray(image,ScaleLongToQuantum(*p),q);
3036 q+=GetPixelChannels(image);
3038 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3043 static void ImportLongLongPixel(Image *image,const RectangleInfo *roi,
3044 const char *restrict map,const QuantumType *quantum_map,const void *pixels,
3045 ExceptionInfo *exception)
3047 register const MagickSizeType
3062 p=(const MagickSizeType *) pixels;
3063 if (LocaleCompare(map,"BGR") == 0)
3065 for (y=0; y < (ssize_t) roi->height; y++)
3067 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3068 if (q == (Quantum *) NULL)
3070 for (x=0; x < (ssize_t) roi->width; x++)
3072 SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3073 SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3074 SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3075 q+=GetPixelChannels(image);
3077 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3082 if (LocaleCompare(map,"BGRA") == 0)
3084 for (y=0; y < (ssize_t) roi->height; y++)
3086 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3087 if (q == (Quantum *) NULL)
3089 for (x=0; x < (ssize_t) roi->width; x++)
3091 SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3092 SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3093 SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3094 SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q);
3095 q+=GetPixelChannels(image);
3097 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3102 if (LocaleCompare(map,"BGRP") == 0)
3104 for (y=0; y < (ssize_t) roi->height; y++)
3106 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3107 if (q == (Quantum *) NULL)
3109 for (x=0; x < (ssize_t) roi->width; x++)
3111 SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3112 SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3113 SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3115 q+=GetPixelChannels(image);
3117 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3122 if (LocaleCompare(map,"I") == 0)
3124 for (y=0; y < (ssize_t) roi->height; y++)
3126 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3127 if (q == (Quantum *) NULL)
3129 for (x=0; x < (ssize_t) roi->width; x++)
3131 SetPixelGray(image,ScaleLongLongToQuantum(*p++),q);
3132 q+=GetPixelChannels(image);
3134 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3139 if (LocaleCompare(map,"RGB") == 0)
3141 for (y=0; y < (ssize_t) roi->height; y++)
3143 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3144 if (q == (Quantum *) NULL)
3146 for (x=0; x < (ssize_t) roi->width; x++)
3148 SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3149 SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3150 SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3151 q+=GetPixelChannels(image);
3153 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3158 if (LocaleCompare(map,"RGBA") == 0)
3160 for (y=0; y < (ssize_t) roi->height; y++)
3162 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3163 if (q == (Quantum *) NULL)
3165 for (x=0; x < (ssize_t) roi->width; x++)
3167 SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3168 SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3169 SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3170 SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q);
3171 q+=GetPixelChannels(image);
3173 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3178 if (LocaleCompare(map,"RGBP") == 0)
3180 for (y=0; y < (ssize_t) roi->height; y++)
3182 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3183 if (q == (Quantum *) NULL)
3185 for (x=0; x < (ssize_t) roi->width; x++)
3187 SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3188 SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3189 SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3191 q+=GetPixelChannels(image);
3193 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3199 for (y=0; y < (ssize_t) roi->height; y++)
3201 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3202 if (q == (Quantum *) NULL)
3204 for (x=0; x < (ssize_t) roi->width; x++)
3209 for (i=0; i < (ssize_t) length; i++)
3211 switch (quantum_map[i])
3216 SetPixelRed(image,ScaleLongLongToQuantum(*p),q);
3220 case MagentaQuantum:
3222 SetPixelGreen(image,ScaleLongLongToQuantum(*p),q);
3228 SetPixelBlue(image,ScaleLongLongToQuantum(*p),q);
3233 SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q);
3236 case OpacityQuantum:
3238 SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q);
3243 SetPixelBlack(image,ScaleLongLongToQuantum(*p),q);
3248 SetPixelGray(image,ScaleLongLongToQuantum(*p),q);
3256 q+=GetPixelChannels(image);
3258 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3263 static void ImportQuantumPixel(Image *image,const RectangleInfo *roi,
3264 const char *restrict map,const QuantumType *quantum_map,const void *pixels,
3265 ExceptionInfo *exception)
3267 register const Quantum
3282 p=(const Quantum *) pixels;
3283 if (LocaleCompare(map,"BGR") == 0)
3285 for (y=0; y < (ssize_t) roi->height; y++)
3287 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3288 if (q == (Quantum *) NULL)
3290 for (x=0; x < (ssize_t) roi->width; x++)
3292 SetPixelBlue(image,*p++,q);
3293 SetPixelGreen(image,*p++,q);
3294 SetPixelRed(image,*p++,q);
3295 q+=GetPixelChannels(image);
3297 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3302 if (LocaleCompare(map,"BGRA") == 0)
3304 for (y=0; y < (ssize_t) roi->height; y++)
3306 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3307 if (q == (Quantum *) NULL)
3309 for (x=0; x < (ssize_t) roi->width; x++)
3311 SetPixelBlue(image,*p++,q);
3312 SetPixelGreen(image,*p++,q);
3313 SetPixelRed(image,*p++,q);
3314 SetPixelAlpha(image,*p++,q);
3315 q+=GetPixelChannels(image);
3317 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3322 if (LocaleCompare(map,"BGRP") == 0)
3324 for (y=0; y < (ssize_t) roi->height; y++)
3326 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3327 if (q == (Quantum *) NULL)
3329 for (x=0; x < (ssize_t) roi->width; x++)
3331 SetPixelBlue(image,*p++,q);
3332 SetPixelGreen(image,*p++,q);
3333 SetPixelRed(image,*p++,q);
3335 q+=GetPixelChannels(image);
3337 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3342 if (LocaleCompare(map,"I") == 0)
3344 for (y=0; y < (ssize_t) roi->height; y++)
3346 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3347 if (q == (Quantum *) NULL)
3349 for (x=0; x < (ssize_t) roi->width; x++)
3351 SetPixelGray(image,*p++,q);
3352 q+=GetPixelChannels(image);
3354 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3359 if (LocaleCompare(map,"RGB") == 0)
3361 for (y=0; y < (ssize_t) roi->height; y++)
3363 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3364 if (q == (Quantum *) NULL)
3366 for (x=0; x < (ssize_t) roi->width; x++)
3368 SetPixelRed(image,*p++,q);
3369 SetPixelGreen(image,*p++,q);
3370 SetPixelBlue(image,*p++,q);
3371 q+=GetPixelChannels(image);
3373 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3378 if (LocaleCompare(map,"RGBA") == 0)
3380 for (y=0; y < (ssize_t) roi->height; y++)
3382 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3383 if (q == (Quantum *) NULL)
3385 for (x=0; x < (ssize_t) roi->width; x++)
3387 SetPixelRed(image,*p++,q);
3388 SetPixelGreen(image,*p++,q);
3389 SetPixelBlue(image,*p++,q);
3390 SetPixelAlpha(image,*p++,q);
3391 q+=GetPixelChannels(image);
3393 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3398 if (LocaleCompare(map,"RGBP") == 0)
3400 for (y=0; y < (ssize_t) roi->height; y++)
3402 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3403 if (q == (Quantum *) NULL)
3405 for (x=0; x < (ssize_t) roi->width; x++)
3407 SetPixelRed(image,*p++,q);
3408 SetPixelGreen(image,*p++,q);
3409 SetPixelBlue(image,*p++,q);
3411 q+=GetPixelChannels(image);
3413 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3419 for (y=0; y < (ssize_t) roi->height; y++)
3421 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3422 if (q == (Quantum *) NULL)
3424 for (x=0; x < (ssize_t) roi->width; x++)
3429 for (i=0; i < (ssize_t) length; i++)
3431 switch (quantum_map[i])
3436 SetPixelRed(image,*p,q);
3440 case MagentaQuantum:
3442 SetPixelGreen(image,*p,q);
3448 SetPixelBlue(image,*p,q);
3453 SetPixelAlpha(image,*p,q);
3456 case OpacityQuantum:
3458 SetPixelAlpha(image,*p,q);
3463 SetPixelBlack(image,*p,q);
3468 SetPixelGray(image,*p,q);
3476 q+=GetPixelChannels(image);
3478 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3483 static void ImportShortPixel(Image *image,const RectangleInfo *roi,
3484 const char *restrict map,const QuantumType *quantum_map,const void *pixels,
3485 ExceptionInfo *exception)
3487 register const unsigned short
3502 p=(const unsigned short *) pixels;
3503 if (LocaleCompare(map,"BGR") == 0)
3505 for (y=0; y < (ssize_t) roi->height; y++)
3507 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3508 if (q == (Quantum *) NULL)
3510 for (x=0; x < (ssize_t) roi->width; x++)
3512 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3513 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3514 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3515 q+=GetPixelChannels(image);
3517 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3522 if (LocaleCompare(map,"BGRA") == 0)
3524 for (y=0; y < (ssize_t) roi->height; y++)
3526 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3527 if (q == (Quantum *) NULL)
3529 for (x=0; x < (ssize_t) roi->width; x++)
3531 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3532 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3533 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3534 SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3535 q+=GetPixelChannels(image);
3537 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3542 if (LocaleCompare(map,"BGRP") == 0)
3544 for (y=0; y < (ssize_t) roi->height; y++)
3546 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3547 if (q == (Quantum *) NULL)
3549 for (x=0; x < (ssize_t) roi->width; x++)
3551 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3552 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3553 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3555 q+=GetPixelChannels(image);
3557 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3562 if (LocaleCompare(map,"I") == 0)
3564 for (y=0; y < (ssize_t) roi->height; y++)
3566 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3567 if (q == (Quantum *) NULL)
3569 for (x=0; x < (ssize_t) roi->width; x++)
3571 SetPixelGray(image,ScaleShortToQuantum(*p++),q);
3572 q+=GetPixelChannels(image);
3574 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3579 if (LocaleCompare(map,"RGB") == 0)
3581 for (y=0; y < (ssize_t) roi->height; y++)
3583 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3584 if (q == (Quantum *) NULL)
3586 for (x=0; x < (ssize_t) roi->width; x++)
3588 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3589 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3590 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3591 q+=GetPixelChannels(image);
3593 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3598 if (LocaleCompare(map,"RGBA") == 0)
3600 for (y=0; y < (ssize_t) roi->height; y++)
3602 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3603 if (q == (Quantum *) NULL)
3605 for (x=0; x < (ssize_t) roi->width; x++)
3607 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3608 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3609 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3610 SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3611 q+=GetPixelChannels(image);
3613 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3618 if (LocaleCompare(map,"RGBP") == 0)
3620 for (y=0; y < (ssize_t) roi->height; y++)
3622 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3623 if (q == (Quantum *) NULL)
3625 for (x=0; x < (ssize_t) roi->width; x++)
3627 SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3628 SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3629 SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3631 q+=GetPixelChannels(image);
3633 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3639 for (y=0; y < (ssize_t) roi->height; y++)
3641 q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3642 if (q == (Quantum *) NULL)
3644 for (x=0; x < (ssize_t) roi->width; x++)
3649 for (i=0; i < (ssize_t) length; i++)
3651 switch (quantum_map[i])
3656 SetPixelRed(image,ScaleShortToQuantum(*p),q);
3660 case MagentaQuantum:
3662 SetPixelGreen(image,ScaleShortToQuantum(*p),q);
3668 SetPixelBlue(image,ScaleShortToQuantum(*p),q);
3673 SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3676 case OpacityQuantum:
3678 SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3683 SetPixelBlack(image,ScaleShortToQuantum(*p),q);
3688 SetPixelGray(image,ScaleShortToQuantum(*p),q);
3696 q+=GetPixelChannels(image);
3698 if (SyncAuthenticPixels(image,exception) == MagickFalse)
3703 MagickExport MagickBooleanType ImportImagePixels(Image *image,const ssize_t x,
3704 const ssize_t y,const size_t width,const size_t height,const char *map,
3705 const StorageType type,const void *pixels,ExceptionInfo *exception)
3720 Allocate image structure.
3722 assert(image != (Image *) NULL);
3723 assert(image->signature == MagickSignature);
3724 if (image->debug != MagickFalse)
3725 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
3727 quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
3728 if (quantum_map == (QuantumType *) NULL)
3729 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
3731 for (i=0; i < (ssize_t) length; i++)
3738 quantum_map[i]=AlphaQuantum;
3739 image->alpha_trait=BlendPixelTrait;
3745 quantum_map[i]=BlueQuantum;
3751 quantum_map[i]=CyanQuantum;
3752 (void) SetImageColorspace(image,CMYKColorspace,exception);
3758 quantum_map[i]=GreenQuantum;
3764 quantum_map[i]=BlackQuantum;
3765 (void) SetImageColorspace(image,CMYKColorspace,exception);
3771 quantum_map[i]=IndexQuantum;
3772 (void) SetImageColorspace(image,GRAYColorspace,exception);
3778 quantum_map[i]=MagentaQuantum;
3779 (void) SetImageColorspace(image,CMYKColorspace,exception);
3785 quantum_map[i]=OpacityQuantum;
3786 image->alpha_trait=BlendPixelTrait;
3792 quantum_map[i]=UndefinedQuantum;
3798 quantum_map[i]=RedQuantum;
3804 quantum_map[i]=YellowQuantum;
3805 (void) SetImageColorspace(image,CMYKColorspace,exception);
3810 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3811 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
3812 "UnrecognizedPixelMap","'%s'",map);
3813 return(MagickFalse);
3817 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
3818 return(MagickFalse);
3820 Transfer the pixels from the pixel data to the image.
3830 ImportCharPixel(image,&roi,map,quantum_map,pixels,exception);
3835 ImportDoublePixel(image,&roi,map,quantum_map,pixels,exception);
3840 ImportFloatPixel(image,&roi,map,quantum_map,pixels,exception);
3845 ImportLongPixel(image,&roi,map,quantum_map,pixels,exception);
3850 ImportLongLongPixel(image,&roi,map,quantum_map,pixels,exception);
3855 ImportQuantumPixel(image,&roi,map,quantum_map,pixels,exception);
3860 ImportShortPixel(image,&roi,map,quantum_map,pixels,exception);
3865 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3866 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
3867 "UnrecognizedPixelMap","'%s'",map);
3871 quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3876 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3880 + 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 %
3884 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3886 % InitializePixelChannelMap() defines the standard pixel component map.
3888 % The format of the InitializePixelChannelMap() method is:
3890 % void InitializePixelChannelMap(Image *image)
3892 % A description of each parameter follows:
3894 % o image: the image.
3897 MagickExport void InitializePixelChannelMap(Image *image)
3908 assert(image != (Image *) NULL);
3909 assert(image->signature == MagickSignature);
3910 (void) ResetMagickMemory(image->channel_map,0,MaxPixelChannels*
3911 sizeof(*image->channel_map));
3912 trait=UpdatePixelTrait;
3913 if (image->alpha_trait == BlendPixelTrait)
3914 trait=(PixelTrait) (trait | BlendPixelTrait);
3916 if (image->colorspace == GRAYColorspace)
3918 SetPixelChannelAttributes(image,BluePixelChannel,trait,n);
3919 SetPixelChannelAttributes(image,GreenPixelChannel,trait,n);
3920 SetPixelChannelAttributes(image,RedPixelChannel,trait,n++);
3924 SetPixelChannelAttributes(image,RedPixelChannel,trait,n++);
3925 SetPixelChannelAttributes(image,GreenPixelChannel,trait,n++);
3926 SetPixelChannelAttributes(image,BluePixelChannel,trait,n++);
3928 if (image->colorspace == CMYKColorspace)
3929 SetPixelChannelAttributes(image,BlackPixelChannel,trait,n++);
3930 if (image->alpha_trait != UndefinedPixelTrait)
3931 SetPixelChannelAttributes(image,AlphaPixelChannel,CopyPixelTrait,n++);
3932 if (image->storage_class == PseudoClass)
3933 SetPixelChannelAttributes(image,IndexPixelChannel,CopyPixelTrait,n++);
3934 if (image->mask != MagickFalse)
3935 SetPixelChannelAttributes(image,MaskPixelChannel,CopyPixelTrait,n++);
3936 assert((n+image->number_meta_channels) < MaxPixelChannels);
3937 for (i=0; i < (ssize_t) image->number_meta_channels; i++)
3938 SetPixelChannelAttributes(image,(PixelChannel) (MetaPixelChannel+i),
3939 CopyPixelTrait,n++);
3940 image->number_channels=(size_t) n;
3941 if (image->debug != MagickFalse)
3942 LogPixelChannels(image);
3943 (void) SetImageChannelMask(image,image->channel_mask);
3947 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3951 % I n t e r p o l a t e P i x e l C h a n n e l %
3955 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3957 % InterpolatePixelChannel() applies a pixel interpolation method between a
3958 % floating point coordinate and the pixels surrounding that coordinate. No
3959 % pixel area resampling, or scaling of the result is performed.
3961 % Interpolation is restricted to just the specified channel.
3963 % The format of the InterpolatePixelChannel method is:
3965 % MagickBooleanType InterpolatePixelChannel(const Image *image,
3966 % const CacheView *image_view,const PixelChannel channel,
3967 % const PixelInterpolateMethod method,const double x,const double y,
3968 % double *pixel,ExceptionInfo *exception)
3970 % A description of each parameter follows:
3972 % o image: the image.
3974 % o image_view: the image view.
3976 % o channel: the pixel channel to interpolate.
3978 % o method: the pixel color interpolation method.
3980 % o x,y: A double representing the current (x,y) position of the pixel.
3982 % o pixel: return the interpolated pixel here.
3984 % o exception: return any errors or warnings in this structure.
3988 static inline double MagickMax(const double x,const double y)
3995 static inline void CatromWeights(const double x,double (*weights)[4])
4003 Nicolas Robidoux' 10 flops (4* + 5- + 1+) refactoring of the computation
4004 of the standard four 1D Catmull-Rom weights. The sampling location is
4005 assumed between the second and third input pixel locations, and x is the
4006 position relative to the second input pixel location. Formulas originally
4007 derived for the VIPS (Virtual Image Processing System) library.
4009 alpha=(double) 1.0-x;
4010 beta=(double) (-0.5)*x*alpha;
4011 (*weights)[0]=alpha*beta;
4012 (*weights)[3]=x*beta;
4014 The following computation of the inner weights from the outer ones work
4015 for all Keys cubics.
4017 gamma=(*weights)[3]-(*weights)[0];
4018 (*weights)[1]=alpha-(*weights)[0]+gamma;
4019 (*weights)[2]=x-(*weights)[3]-gamma;
4022 static inline void SplineWeights(const double x,double (*weights)[4])
4029 Nicolas Robidoux' 12 flops (6* + 5- + 1+) refactoring of the
4030 computation of the standard four 1D cubic B-spline smoothing
4031 weights. The sampling location is assumed between the second and
4032 third input pixel locations, and x is the position relative to the
4033 second input pixel location.
4035 alpha=(double) 1.0-x;
4036 (*weights)[3]=(double) (1.0/6.0)*x*x*x;
4037 (*weights)[0]=(double) (1.0/6.0)*alpha*alpha*alpha;
4038 beta=(*weights)[3]-(*weights)[0];
4039 (*weights)[1]=alpha-(*weights)[0]+beta;
4040 (*weights)[2]=x-(*weights)[3]-beta;
4043 static inline double MeshInterpolate(const PointInfo *delta,const double p,
4044 const double x,const double y)
4046 return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
4050 static inline ssize_t NearestNeighbor(const double x)
4053 return((ssize_t) (x+0.5));
4054 return((ssize_t) (x-0.5));
4058 MagickExport MagickBooleanType InterpolatePixelChannel(const Image *image,
4059 const CacheView *image_view,const PixelChannel channel,
4060 const PixelInterpolateMethod method,const double x,const double y,
4061 double *pixel,ExceptionInfo *exception)
4074 register const Quantum
4084 PixelInterpolateMethod
4087 assert(image != (Image *) NULL);
4088 assert(image != (Image *) NULL);
4089 assert(image->signature == MagickSignature);
4090 assert(image_view != (CacheView *) NULL);
4093 traits=GetPixelChannelTraits(image,channel);
4094 x_offset=(ssize_t) floor(x);
4095 y_offset=(ssize_t) floor(y);
4096 interpolate = method;
4097 if ( interpolate == UndefinedInterpolatePixel )
4098 interpolate = image->interpolate;
4099 switch (interpolate)
4101 case AverageInterpolatePixel: /* nearest 4 neighbours */
4102 case Average9InterpolatePixel: /* nearest 9 neighbours */
4103 case Average16InterpolatePixel: /* nearest 16 neighbours */
4106 count=2; /* size of the area to average - default nearest 4 */
4108 if (interpolate == Average9InterpolatePixel)
4111 x_offset=(ssize_t) (floor(x+0.5)-1);
4112 y_offset=(ssize_t) (floor(y+0.5)-1);
4114 else if (interpolate == Average16InterpolatePixel)
4120 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,count,count,
4122 if (p == (const Quantum *) NULL)
4128 count*=count; /* Number of pixels to Average */
4129 if ((traits & BlendPixelTrait) == 0)
4130 for (i=0; i < (ssize_t) count; i++)
4133 pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4136 for (i=0; i < (ssize_t) count; i++)
4138 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4139 GetPixelChannels(image));
4140 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4142 for (i=0; i < (ssize_t) count; i++)
4144 gamma=MagickEpsilonReciprocal(alpha[i])/count;
4145 *pixel+=gamma*pixels[i];
4149 case BilinearInterpolatePixel:
4156 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4157 if (p == (const Quantum *) NULL)
4162 if ((traits & BlendPixelTrait) == 0)
4163 for (i=0; i < 4; i++)
4166 pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4169 for (i=0; i < 4; i++)
4171 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4172 GetPixelChannels(image));
4173 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4177 epsilon.x=1.0-delta.x;
4178 epsilon.y=1.0-delta.y;
4179 gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4180 (epsilon.x*alpha[2]+delta.x*alpha[3])));
4181 gamma=MagickEpsilonReciprocal(gamma);
4182 *pixel=gamma*(epsilon.y*(epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*
4183 (epsilon.x*pixels[2]+delta.x*pixels[3]));
4186 case BlendInterpolatePixel:
4188 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4189 if (p == (const Quantum *) NULL)
4194 if ((traits & BlendPixelTrait) == 0)
4195 for (i=0; i < 4; i++)
4198 pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4201 for (i=0; i < 4; i++)
4203 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4204 GetPixelChannels(image));
4205 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4207 gamma=1.0; /* number of pixels blended together (its variable) */
4208 for (i=0; i <= 1L; i++) {
4209 if ( y-y_offset >= 0.75 ) { /* take right pixels */
4210 alpha[i] = alpha[i+2];
4211 pixels[i] = pixels[i+2];
4213 else if ( y-y_offset > 0.25 ) {
4214 gamma = 2.0; /* blend both pixels in row */
4215 alpha[i] += alpha[i+2]; /* add up alpha weights */
4216 pixels[i] += pixels[i+2];
4219 if ( x-x_offset >= 0.75 ) { /* take bottom row blend */
4220 alpha[0] = alpha[1];
4221 pixels[0] = pixels[1];
4223 else if ( x-x_offset > 0.25 ) {
4224 gamma *= 2.0; /* blend both rows */
4225 alpha[0] += alpha[1]; /* add up alpha weights */
4226 pixels[0] += pixels[1];
4228 if (channel != AlphaPixelChannel)
4229 gamma=MagickEpsilonReciprocal(alpha[0]); /* (color) 1/alpha_weights */
4231 gamma=MagickEpsilonReciprocal(gamma); /* (alpha) 1/number_of_pixels */
4232 *pixel=gamma*pixels[0];
4235 case CatromInterpolatePixel:
4241 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4243 if (p == (const Quantum *) NULL)
4248 if ((traits & BlendPixelTrait) == 0)
4249 for (i=0; i < 16; i++)
4252 pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4255 for (i=0; i < 16; i++)
4257 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4258 GetPixelChannels(image));
4259 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4261 CatromWeights((double) (x-x_offset),&cx);
4262 CatromWeights((double) (y-y_offset),&cy);
4263 gamma=(channel == AlphaPixelChannel ? (double) 1.0 :
4264 MagickEpsilonReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4265 alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4266 alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4267 alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4268 cx[2]*alpha[14]+cx[3]*alpha[15])));
4269 *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+
4270 cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*
4271 pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+
4272 cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*
4273 pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15]));
4277 /* deprecated useless and very slow interpolator */
4278 case FilterInterpolatePixel:
4292 geometry.x=x_offset-1;
4293 geometry.y=y_offset-1;
4294 excerpt_image=ExcerptImage(image,&geometry,exception);
4295 if (excerpt_image == (Image *) NULL)
4300 filter_image=ResizeImage(excerpt_image,1,1,image->filter,exception);
4301 excerpt_image=DestroyImage(excerpt_image);
4302 if (filter_image == (Image *) NULL)
4304 filter_view=AcquireVirtualCacheView(filter_image,exception);
4305 p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
4306 if (p == (const Quantum *) NULL)
4309 *pixel=(double) GetPixelChannel(image,channel,p);
4310 filter_view=DestroyCacheView(filter_view);
4311 filter_image=DestroyImage(filter_image);
4315 case IntegerInterpolatePixel:
4317 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4318 if (p == (const Quantum *) NULL)
4323 *pixel=(double) GetPixelChannel(image,channel,p);
4326 case NearestInterpolatePixel:
4328 x_offset=(ssize_t) floor(x+0.5);
4329 y_offset=(ssize_t) floor(y+0.5);
4330 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4331 if (p == (const Quantum *) NULL)
4336 *pixel=(double) GetPixelChannel(image,channel,p);
4339 case MeshInterpolatePixel:
4345 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4346 if (p == (const Quantum *) NULL)
4351 if ((traits & BlendPixelTrait) == 0)
4352 for (i=0; i < 4; i++)
4355 pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4358 for (i=0; i < 4; i++)
4360 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4361 GetPixelChannels(image));
4362 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4366 luminance.x=GetPixelLuminance(image,p)-(double)
4367 GetPixelLuminance(image,p+3*GetPixelChannels(image));
4368 luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
4369 GetPixelLuminance(image,p+2*GetPixelChannels(image));
4370 if (fabs(luminance.x) < fabs(luminance.y))
4375 if (delta.x <= delta.y)
4378 Bottom-left triangle (pixel: 2, diagonal: 0-3).
4380 delta.y=1.0-delta.y;
4381 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4382 gamma=MagickEpsilonReciprocal(gamma);
4383 *pixel=gamma*MeshInterpolate(&delta,pixels[2],pixels[3],
4389 Top-right triangle (pixel: 1, diagonal: 0-3).
4391 delta.x=1.0-delta.x;
4392 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4393 gamma=MagickEpsilonReciprocal(gamma);
4394 *pixel=gamma*MeshInterpolate(&delta,pixels[1],pixels[0],
4403 if (delta.x <= (1.0-delta.y))
4406 Top-left triangle (pixel: 0, diagonal: 1-2).
4408 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4409 gamma=MagickEpsilonReciprocal(gamma);
4410 *pixel=gamma*MeshInterpolate(&delta,pixels[0],pixels[1],
4416 Bottom-right triangle (pixel: 3, diagonal: 1-2).
4418 delta.x=1.0-delta.x;
4419 delta.y=1.0-delta.y;
4420 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4421 gamma=MagickEpsilonReciprocal(gamma);
4422 *pixel=gamma*MeshInterpolate(&delta,pixels[3],pixels[2],
4428 case SplineInterpolatePixel:
4434 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4436 if (p == (const Quantum *) NULL)
4441 if ((traits & BlendPixelTrait) == 0)
4442 for (i=0; i < 16; i++)
4445 pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4448 for (i=0; i < 16; i++)
4450 alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4451 GetPixelChannels(image));
4452 pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4454 SplineWeights((double) (x-x_offset),&cx);
4455 SplineWeights((double) (y-y_offset),&cy);
4456 gamma=(channel == AlphaPixelChannel ? (double) 1.0 :
4457 MagickEpsilonReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4458 alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4459 alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4460 alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4461 cx[2]*alpha[14]+cx[3]*alpha[15])));
4462 *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+
4463 cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*
4464 pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+
4465 cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*
4466 pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15]));
4474 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4478 % I n t e r p o l a t e P i x e l C h a n n e l s %
4482 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4484 % InterpolatePixelChannels() applies a pixel interpolation method between a
4485 % floating point coordinate and the pixels surrounding that coordinate. No
4486 % pixel area resampling, or scaling of the result is performed.
4488 % Interpolation is restricted to just the current channel setting of the
4489 % destination image into which the color is to be stored
4491 % The format of the InterpolatePixelChannels method is:
4493 % MagickBooleanType InterpolatePixelChannels(const Image *source,
4494 % const CacheView *source_view,const Image *destination,
4495 % const PixelInterpolateMethod method,const double x,const double y,
4496 % Quantum *pixel,ExceptionInfo *exception)
4498 % A description of each parameter follows:
4500 % o source: the source.
4502 % o source_view: the source view.
4504 % o destination: the destination image, for the interpolated color
4506 % o method: the pixel color interpolation method.
4508 % o x,y: A double representing the current (x,y) position of the pixel.
4510 % o pixel: return the interpolated pixel here.
4512 % o exception: return any errors or warnings in this structure.
4515 MagickExport MagickBooleanType InterpolatePixelChannels(const Image *source,
4516 const CacheView *source_view,const Image *destination,
4517 const PixelInterpolateMethod method,const double x,const double y,
4518 Quantum *pixel,ExceptionInfo *exception)
4535 register const Quantum
4545 PixelInterpolateMethod
4548 assert(source != (Image *) NULL);
4549 assert(source != (Image *) NULL);
4550 assert(source->signature == MagickSignature);
4551 assert(source_view != (CacheView *) NULL);
4553 x_offset=(ssize_t) floor(x);
4554 y_offset=(ssize_t) floor(y);
4555 interpolate = method;
4556 if ( interpolate == UndefinedInterpolatePixel )
4557 interpolate = source->interpolate;
4558 switch (interpolate)
4560 case AverageInterpolatePixel: /* nearest 4 neighbours */
4561 case Average9InterpolatePixel: /* nearest 9 neighbours */
4562 case Average16InterpolatePixel: /* nearest 16 neighbours */
4565 count=2; /* size of the area to average - default nearest 4 */
4567 if (interpolate == Average9InterpolatePixel)
4570 x_offset=(ssize_t) (floor(x+0.5)-1);
4571 y_offset=(ssize_t) (floor(y+0.5)-1);
4573 else if (interpolate == Average16InterpolatePixel)
4579 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,count,count,
4581 if (p == (const Quantum *) NULL)
4586 count*=count; /* Number of pixels to Average */
4587 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4595 channel=GetPixelChannelChannel(source,i);
4596 traits=GetPixelChannelTraits(source,channel);
4597 destination_traits=GetPixelChannelTraits(destination,channel);
4598 if ((traits == UndefinedPixelTrait) ||
4599 (destination_traits == UndefinedPixelTrait))
4601 for (j=0; j < (ssize_t) count; j++)
4602 pixels[j]=(double) p[j*GetPixelChannels(source)+i];
4604 if ((traits & BlendPixelTrait) == 0)
4606 for (j=0; j < (ssize_t) count; j++)
4609 SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
4612 for (j=0; j < (ssize_t) count; j++)
4614 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4615 GetPixelChannels(source));
4616 pixels[j]*=alpha[j];
4617 gamma=MagickEpsilonReciprocal(alpha[j]);
4618 sum+=gamma*pixels[j];
4621 SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
4625 case BilinearInterpolatePixel:
4628 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4629 if (p == (const Quantum *) NULL)
4634 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4640 channel=GetPixelChannelChannel(source,i);
4641 traits=GetPixelChannelTraits(source,channel);
4642 destination_traits=GetPixelChannelTraits(destination,channel);
4643 if ((traits == UndefinedPixelTrait) ||
4644 (destination_traits == UndefinedPixelTrait))
4648 epsilon.x=1.0-delta.x;
4649 epsilon.y=1.0-delta.y;
4650 pixels[0]=(double) p[i];
4651 pixels[1]=(double) p[GetPixelChannels(source)+i];
4652 pixels[2]=(double) p[2*GetPixelChannels(source)+i];
4653 pixels[3]=(double) p[3*GetPixelChannels(source)+i];
4654 if ((traits & BlendPixelTrait) == 0)
4656 gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
4657 gamma=MagickEpsilonReciprocal(gamma);
4658 SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
4659 (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*
4660 pixels[2]+delta.x*pixels[3]))),pixel);
4663 alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4664 alpha[1]=QuantumScale*GetPixelAlpha(source,p+GetPixelChannels(source));
4665 alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4666 GetPixelChannels(source));
4667 alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4668 GetPixelChannels(source));
4669 pixels[0]*=alpha[0];
4670 pixels[1]*=alpha[1];
4671 pixels[2]*=alpha[2];
4672 pixels[3]*=alpha[3];
4673 gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4674 (epsilon.x*alpha[2]+delta.x*alpha[3])));
4675 gamma=MagickEpsilonReciprocal(gamma);
4676 SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
4677 (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+
4678 delta.x*pixels[3]))),pixel);
4682 case BlendInterpolatePixel:
4684 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4685 if (p == (const Quantum *) NULL)
4690 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4695 channel=GetPixelChannelChannel(source,i);
4696 traits=GetPixelChannelTraits(source,channel);
4697 destination_traits=GetPixelChannelTraits(destination,channel);
4698 if ((traits == UndefinedPixelTrait) ||
4699 (destination_traits == UndefinedPixelTrait))
4701 if ((traits & BlendPixelTrait) == 0)
4702 for (j=0; j < 4; j++)
4705 pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+channel];
4708 for (j=0; j < 4; j++)
4710 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4711 GetPixelChannels(source));
4712 pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+channel];
4714 gamma=1.0; /* number of pixels blended together (its variable) */
4715 for (j=0; j <= 1L; j++) {
4716 if ( y-y_offset >= 0.75 ) { /* take right pixels */
4717 alpha[j] = alpha[j+2];
4718 pixels[j] = pixels[j+2];
4720 else if ( y-y_offset > 0.25 ) {
4721 gamma = 2.0; /* blend both pixels in row */
4722 alpha[j] += alpha[j+2]; /* add up alpha weights */
4723 pixels[j] += pixels[j+2];
4726 if ( x-x_offset >= 0.75 ) { /* take bottom row blend */
4727 alpha[0] = alpha[1];
4728 pixels[0] = pixels[1];
4730 else if ( x-x_offset > 0.25 ) {
4731 gamma *= 2.0; /* blend both rows */
4732 alpha[0] += alpha[1]; /* add up alpha weights */
4733 pixels[0] += pixels[1];
4735 if ((traits & BlendPixelTrait) == 0)
4736 gamma=MagickEpsilonReciprocal(alpha[0]); /* (color) 1/alpha_weights */
4738 gamma=MagickEpsilonReciprocal(gamma); /* (alpha) 1/number_of_pixels */
4739 SetPixelChannel(destination,channel,ClampToQuantum(gamma*pixels[0]),
4744 case CatromInterpolatePixel:
4750 p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4752 if (p == (const Quantum *) NULL)
4757 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4762 channel=GetPixelChannelChannel(source,i);
4763 traits=GetPixelChannelTraits(source,channel);
4764 destination_traits=GetPixelChannelTraits(destination,channel);
4765 if ((traits == UndefinedPixelTrait) ||
4766 (destination_traits == UndefinedPixelTrait))
4768 if ((traits & BlendPixelTrait) == 0)
4769 for (j=0; j < 16; j++)
4772 pixels[j]=(double) p[j*GetPixelChannels(source)+i];
4775 for (j=0; j < 16; j++)
4777 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4778 GetPixelChannels(source));
4779 pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
4781 CatromWeights((double) (x-x_offset),&cx);
4782 CatromWeights((double) (y-y_offset),&cy);
4783 gamma=((traits & BlendPixelTrait) ? (double) (1.0) :
4784 MagickEpsilonReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4785 alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4786 alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4787 alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4788 cx[2]*alpha[14]+cx[3]*alpha[15])));
4789 SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]*
4790 pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]*
4791 (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+
4792 cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]*
4793 pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]*
4794 pixels[14]+cx[3]*pixels[15]))),pixel);
4799 /* deprecated useless and very slow interpolator */
4800 case FilterInterpolatePixel:
4802 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4814 channel=GetPixelChannelChannel(source,i);
4815 traits=GetPixelChannelTraits(source,channel);
4816 destination_traits=GetPixelChannelTraits(destination,channel);
4817 if ((traits == UndefinedPixelTrait) ||
4818 (destination_traits == UndefinedPixelTrait))
4822 geometry.x=x_offset-1;
4823 geometry.y=y_offset-1;
4824 excerpt_source=ExcerptImage(source,&geometry,exception);
4825 if (excerpt_source == (Image *) NULL)
4830 filter_source=ResizeImage(excerpt_source,1,1,source->filter,exception);
4831 excerpt_source=DestroyImage(excerpt_source);
4832 if (filter_source == (Image *) NULL)
4834 filter_view=AcquireVirtualCacheView(filter_source,exception);
4835 p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
4836 if (p == (const Quantum *) NULL)
4840 SetPixelChannel(destination,channel,p[i],pixel);
4842 filter_view=DestroyCacheView(filter_view);
4843 filter_source=DestroyImage(filter_source);
4848 case IntegerInterpolatePixel:
4850 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
4851 if (p == (const Quantum *) NULL)
4856 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4858 channel=GetPixelChannelChannel(source,i);
4859 traits=GetPixelChannelTraits(source,channel);
4860 destination_traits=GetPixelChannelTraits(destination,channel);
4861 if ((traits == UndefinedPixelTrait) ||
4862 (destination_traits == UndefinedPixelTrait))
4864 SetPixelChannel(destination,channel,p[i],pixel);
4868 case NearestInterpolatePixel:
4870 x_offset=(ssize_t) floor(x+0.5);
4871 y_offset=(ssize_t) floor(y+0.5);
4872 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
4873 if (p == (const Quantum *) NULL)
4878 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4880 channel=GetPixelChannelChannel(source,i);
4881 traits=GetPixelChannelTraits(source,channel);
4882 destination_traits=GetPixelChannelTraits(destination,channel);
4883 if ((traits == UndefinedPixelTrait) ||
4884 (destination_traits == UndefinedPixelTrait))
4886 SetPixelChannel(destination,channel,p[i],pixel);
4890 case MeshInterpolatePixel:
4892 p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4893 if (p == (const Quantum *) NULL)
4898 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4904 channel=GetPixelChannelChannel(source,i);
4905 traits=GetPixelChannelTraits(source,channel);
4906 destination_traits=GetPixelChannelTraits(destination,channel);
4907 if ((traits == UndefinedPixelTrait) ||
4908 (destination_traits == UndefinedPixelTrait))
4910 pixels[0]=(double) p[i];
4911 pixels[1]=(double) p[GetPixelChannels(source)+i];
4912 pixels[2]=(double) p[2*GetPixelChannels(source)+i];
4913 pixels[3]=(double) p[3*GetPixelChannels(source)+i];
4914 if ((traits & BlendPixelTrait) == 0)
4923 alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4924 alpha[1]=QuantumScale*GetPixelAlpha(source,p+
4925 GetPixelChannels(source));
4926 alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4927 GetPixelChannels(source));
4928 alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4929 GetPixelChannels(source));
4933 luminance.x=fabs((double)(
4934 GetPixelLuminance(source,p)
4935 -GetPixelLuminance(source,p+3*GetPixelChannels(source))));
4936 luminance.y=fabs((double)(
4937 GetPixelLuminance(source,p+GetPixelChannels(source))
4938 -GetPixelLuminance(source,p+2*GetPixelChannels(source))));
4939 if (luminance.x < luminance.y)
4944 if (delta.x <= delta.y)
4947 Bottom-left triangle (pixel: 2, diagonal: 0-3).
4949 delta.y=1.0-delta.y;
4950 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4951 gamma=MagickEpsilonReciprocal(gamma);
4952 SetPixelChannel(destination,channel,ClampToQuantum(gamma*
4953 MeshInterpolate(&delta,pixels[2],pixels[3],pixels[0])),pixel);
4958 Top-right triangle (pixel: 1, diagonal: 0-3).
4960 delta.x=1.0-delta.x;
4961 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4962 gamma=MagickEpsilonReciprocal(gamma);
4963 SetPixelChannel(destination,channel,ClampToQuantum(gamma*
4964 MeshInterpolate(&delta,pixels[1],pixels[0],pixels[3])),pixel);
4972 if (delta.x <= (1.0-delta.y))
4975 Top-left triangle (pixel: 0, diagonal: 1-2).
4977 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4978 gamma=MagickEpsilonReciprocal(gamma);
4979 SetPixelChannel(destination,channel,ClampToQuantum(gamma*
4980 MeshInterpolate(&delta,pixels[0],pixels[1],pixels[2])),pixel);
4985 Bottom-right triangle (pixel: 3, diagonal: 1-2).
4987 delta.x=1.0-delta.x;
4988 delta.y=1.0-delta.y;
4989 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4990 gamma=MagickEpsilonReciprocal(gamma);
4991 SetPixelChannel(destination,channel,ClampToQuantum(gamma*
4992 MeshInterpolate(&delta,pixels[3],pixels[2],pixels[1])),pixel);
4998 case SplineInterpolatePixel:
5004 p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
5006 if (p == (const Quantum *) NULL)
5011 for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
5016 channel=GetPixelChannelChannel(source,i);
5017 traits=GetPixelChannelTraits(source,channel);
5018 destination_traits=GetPixelChannelTraits(destination,channel);
5019 if ((traits == UndefinedPixelTrait) ||
5020 (destination_traits == UndefinedPixelTrait))
5022 if ((traits & BlendPixelTrait) == 0)
5023 for (j=0; j < 16; j++)
5026 pixels[j]=(double) p[j*GetPixelChannels(source)+i];
5029 for (j=0; j < 16; j++)
5031 alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
5032 GetPixelChannels(source));
5033 pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
5035 SplineWeights((double) (x-x_offset),&cx);
5036 SplineWeights((double) (y-y_offset),&cy);
5037 gamma=((traits & BlendPixelTrait) ? (double) (1.0) :
5038 MagickEpsilonReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
5039 alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
5040 alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
5041 alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
5042 cx[2]*alpha[14]+cx[3]*alpha[15])));
5043 SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]*
5044 pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]*
5045 (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+
5046 cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]*
5047 pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]*
5048 pixels[14]+cx[3]*pixels[15]))),pixel);
5057 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5061 % I n t e r p o l a t e P i x e l I n f o %
5065 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5067 % InterpolatePixelInfo() applies a pixel interpolation method between a
5068 % floating point coordinate and the pixels surrounding that coordinate. No
5069 % pixel area resampling, or scaling of the result is performed.
5071 % Interpolation is restricted to just RGBKA channels.
5073 % The format of the InterpolatePixelInfo method is:
5075 % MagickBooleanType InterpolatePixelInfo(const Image *image,
5076 % const CacheView *image_view,const PixelInterpolateMethod method,
5077 % const double x,const double y,PixelInfo *pixel,
5078 % ExceptionInfo *exception)
5080 % A description of each parameter follows:
5082 % o image: the image.
5084 % o image_view: the image view.
5086 % o method: the pixel color interpolation method.
5088 % o x,y: A double representing the current (x,y) position of the pixel.
5090 % o pixel: return the interpolated pixel here.
5092 % o exception: return any errors or warnings in this structure.
5096 static inline void AlphaBlendPixelInfo(const Image *image,
5097 const Quantum *pixel,PixelInfo *pixel_info,double *alpha)
5099 if (image->alpha_trait != BlendPixelTrait)
5102 pixel_info->red=(double) GetPixelRed(image,pixel);
5103 pixel_info->green=(double) GetPixelGreen(image,pixel);
5104 pixel_info->blue=(double) GetPixelBlue(image,pixel);
5105 pixel_info->black=0.0;
5106 if (image->colorspace == CMYKColorspace)
5107 pixel_info->black=(double) GetPixelBlack(image,pixel);
5108 pixel_info->alpha=(double) GetPixelAlpha(image,pixel);
5111 *alpha=QuantumScale*GetPixelAlpha(image,pixel);
5112 pixel_info->red=(*alpha*GetPixelRed(image,pixel));
5113 pixel_info->green=(*alpha*GetPixelGreen(image,pixel));
5114 pixel_info->blue=(*alpha*GetPixelBlue(image,pixel));
5115 pixel_info->black=0.0;
5116 if (image->colorspace == CMYKColorspace)
5117 pixel_info->black=(*alpha*GetPixelBlack(image,pixel));
5118 pixel_info->alpha=(double) GetPixelAlpha(image,pixel);
5121 MagickExport MagickBooleanType InterpolatePixelInfo(const Image *image,
5122 const CacheView *image_view,const PixelInterpolateMethod method,
5123 const double x,const double y,PixelInfo *pixel,ExceptionInfo *exception)
5135 register const Quantum
5145 PixelInterpolateMethod
5148 assert(image != (Image *) NULL);
5149 assert(image->signature == MagickSignature);
5150 assert(image_view != (CacheView *) NULL);
5152 x_offset=(ssize_t) floor(x);
5153 y_offset=(ssize_t) floor(y);
5154 interpolate = method;
5155 if ( interpolate == UndefinedInterpolatePixel )
5156 interpolate = image->interpolate;
5157 switch (interpolate)
5159 case AverageInterpolatePixel: /* nearest 4 neighbours */
5160 case Average9InterpolatePixel: /* nearest 9 neighbours */
5161 case Average16InterpolatePixel: /* nearest 16 neighbours */
5164 count=2; /* size of the area to average - default nearest 4 */
5166 if (interpolate == Average9InterpolatePixel)
5169 x_offset=(ssize_t) (floor(x+0.5)-1);
5170 y_offset=(ssize_t) (floor(y+0.5)-1);
5172 else if (interpolate == Average16InterpolatePixel)
5178 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,count,count,
5180 if (p == (const Quantum *) NULL)
5190 count*=count; /* number of pixels - square of size */
5191 for (i=0; i < (ssize_t) count; i++)
5193 AlphaBlendPixelInfo(image,p,pixels,alpha);
5194 gamma=MagickEpsilonReciprocal(alpha[0]);
5195 pixel->red += gamma*pixels[0].red;
5196 pixel->green += gamma*pixels[0].green;
5197 pixel->blue += gamma*pixels[0].blue;
5198 pixel->black += gamma*pixels[0].black;
5199 pixel->alpha += pixels[0].alpha;
5200 p += GetPixelChannels(image);
5202 gamma=1.0/count; /* average weighting of each pixel in area */
5203 pixel->red *= gamma;
5204 pixel->green *= gamma;
5205 pixel->blue *= gamma;
5206 pixel->black *= gamma;
5207 pixel->alpha *= gamma;
5210 case BackgroundInterpolatePixel:
5212 *pixel = image->background_color; /* Copy PixelInfo Structure */
5215 case BilinearInterpolatePixel:
5222 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
5223 if (p == (const Quantum *) NULL)
5228 for (i=0; i < 4L; i++)
5229 AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5232 epsilon.x=1.0-delta.x;
5233 epsilon.y=1.0-delta.y;
5234 gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
5235 (epsilon.x*alpha[2]+delta.x*alpha[3])));
5236 gamma=MagickEpsilonReciprocal(gamma);
5237 pixel->red=gamma*(epsilon.y*(epsilon.x*pixels[0].red+delta.x*
5238 pixels[1].red)+delta.y*(epsilon.x*pixels[2].red+delta.x*pixels[3].red));
5239 pixel->green=gamma*(epsilon.y*(epsilon.x*pixels[0].green+delta.x*
5240 pixels[1].green)+delta.y*(epsilon.x*pixels[2].green+delta.x*
5242 pixel->blue=gamma*(epsilon.y*(epsilon.x*pixels[0].blue+delta.x*
5243 pixels[1].blue)+delta.y*(epsilon.x*pixels[2].blue+delta.x*
5245 if (image->colorspace == CMYKColorspace)
5246 pixel->black=gamma*(epsilon.y*(epsilon.x*pixels[0].black+delta.x*
5247 pixels[1].black)+delta.y*(epsilon.x*pixels[2].black+delta.x*
5249 gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
5250 gamma=MagickEpsilonReciprocal(gamma);
5251 pixel->alpha=(epsilon.y*(epsilon.x*pixels[0].alpha+delta.x*
5252 pixels[1].alpha)+delta.y*(epsilon.x*pixels[2].alpha+delta.x*
5256 case BlendInterpolatePixel:
5258 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
5259 if (p == (const Quantum *) NULL)
5264 for (i=0; i < 4L; i++)
5265 AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5266 gamma=1.0; /* number of pixels blended together (its variable) */
5267 for (i=0; i <= 1L; i++) {
5268 if ( y-y_offset >= 0.75 ) { /* take right pixels */
5269 alpha[i] = alpha[i+2];
5270 pixels[i] = pixels[i+2];
5272 else if ( y-y_offset > 0.25 ) {
5273 gamma = 2.0; /* blend both pixels in row */
5274 alpha[i] += alpha[i+2]; /* add up alpha weights */
5275 pixels[i].red += pixels[i+2].red;
5276 pixels[i].green += pixels[i+2].green;
5277 pixels[i].blue += pixels[i+2].blue;
5278 pixels[i].black += pixels[i+2].black;
5279 pixels[i].alpha += pixels[i+2].alpha;
5282 if ( x-x_offset >= 0.75 ) {
5283 alpha[0] = alpha[1];
5284 pixels[0] = pixels[1];
5286 else if ( x-x_offset > 0.25 ) {
5287 gamma *= 2.0; /* blend both rows */
5288 alpha[0] += alpha[1]; /* add up alpha weights */
5289 pixels[0].red += pixels[1].red;
5290 pixels[0].green += pixels[1].green;
5291 pixels[0].blue += pixels[1].blue;
5292 pixels[0].black += pixels[1].black;
5293 pixels[0].alpha += pixels[1].alpha;
5296 alpha[0]=MagickEpsilonReciprocal(alpha[0]);
5297 pixel->red = alpha[0]*pixels[0].red;
5298 pixel->green = alpha[0]*pixels[0].green; /* divide by sum of alpha */
5299 pixel->blue = alpha[0]*pixels[0].blue;
5300 pixel->black = alpha[0]*pixels[0].black;
5301 pixel->alpha = gamma*pixels[0].alpha; /* divide by number of pixels */
5304 case CatromInterpolatePixel:
5310 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
5312 if (p == (const Quantum *) NULL)
5317 for (i=0; i < 16L; i++)
5318 AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5319 CatromWeights((double) (x-x_offset),&cx);
5320 CatromWeights((double) (y-y_offset),&cy);
5321 pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*
5322 pixels[1].red+cx[2]*pixels[2].red+cx[3]*
5323 pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]*
5324 pixels[5].red+cx[2]*pixels[6].red+cx[3]*
5325 pixels[7].red)+cy[2]*(cx[0]*pixels[8].red+cx[1]*
5326 pixels[9].red+cx[2]*pixels[10].red+cx[3]*
5327 pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*
5328 pixels[13].red+cx[2]*pixels[14].red+cx[3]*pixels[15].red));
5329 pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*
5330 pixels[1].green+cx[2]*pixels[2].green+cx[3]*
5331 pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+cx[1]*
5332 pixels[5].green+cx[2]*pixels[6].green+cx[3]*
5333 pixels[7].green)+cy[2]*(cx[0]*pixels[8].green+cx[1]*
5334 pixels[9].green+cx[2]*pixels[10].green+cx[3]*
5335 pixels[11].green)+cy[3]*(cx[0]*pixels[12].green+cx[1]*
5336 pixels[13].green+cx[2]*pixels[14].green+cx[3]*pixels[15].green));
5337 pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*
5338 pixels[1].blue+cx[2]*pixels[2].blue+cx[3]*
5339 pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]*
5340 pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*
5341 pixels[7].blue)+cy[2]*(cx[0]*pixels[8].blue+cx[1]*
5342 pixels[9].blue+cx[2]*pixels[10].blue+cx[3]*
5343 pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*
5344 pixels[13].blue+cx[2]*pixels[14].blue+cx[3]*pixels[15].blue));
5345 if (image->colorspace == CMYKColorspace)
5346 pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*
5347 pixels[1].black+cx[2]*pixels[2].black+cx[3]*
5348 pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+cx[1]*
5349 pixels[5].black+cx[2]*pixels[6].black+cx[3]*
5350 pixels[7].black)+cy[2]*(cx[0]*pixels[8].black+cx[1]*
5351 pixels[9].black+cx[2]*pixels[10].black+cx[3]*
5352 pixels[11].black)+cy[3]*(cx[0]*pixels[12].black+cx[1]*
5353 pixels[13].black+cx[2]*pixels[14].black+cx[3]*pixels[15].black));
5354 pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*
5355 pixels[1].alpha+cx[2]*pixels[2].alpha+cx[3]*
5356 pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+cx[1]*
5357 pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*
5358 pixels[7].alpha)+cy[2]*(cx[0]*pixels[8].alpha+cx[1]*
5359 pixels[9].alpha+cx[2]*pixels[10].alpha+cx[3]*
5360 pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+cx[1]*
5361 pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha));
5365 /* deprecated useless and very slow interpolator */
5366 case FilterInterpolatePixel:
5380 geometry.x=x_offset-1;
5381 geometry.y=y_offset-1;
5382 excerpt_image=ExcerptImage(image,&geometry,exception);
5383 if (excerpt_image == (Image *) NULL)
5388 filter_image=ResizeImage(excerpt_image,1,1,image->filter,exception);
5389 excerpt_image=DestroyImage(excerpt_image);
5390 if (filter_image == (Image *) NULL)
5392 filter_view=AcquireVirtualCacheView(filter_image,exception);
5393 p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
5394 if (p != (const Quantum *) NULL)
5395 GetPixelInfoPixel(image,p,pixel);
5396 filter_view=DestroyCacheView(filter_view);
5397 filter_image=DestroyImage(filter_image);
5401 case IntegerInterpolatePixel:
5403 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
5404 if (p == (const Quantum *) NULL)
5409 GetPixelInfoPixel(image,p,pixel);
5412 case MeshInterpolatePixel:
5418 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
5419 if (p == (const Quantum *) NULL)
5426 luminance.x=GetPixelLuminance(image,p)-(double)
5427 GetPixelLuminance(image,p+3*GetPixelChannels(image));
5428 luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
5429 GetPixelLuminance(image,p+2*GetPixelChannels(image));
5430 AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
5431 AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
5432 AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
5433 AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
5434 if (fabs(luminance.x) < fabs(luminance.y))
5439 if (delta.x <= delta.y)
5442 Bottom-left triangle (pixel: 2, diagonal: 0-3).
5444 delta.y=1.0-delta.y;
5445 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
5446 gamma=MagickEpsilonReciprocal(gamma);
5447 pixel->red=gamma*MeshInterpolate(&delta,pixels[2].red,
5448 pixels[3].red,pixels[0].red);
5449 pixel->green=gamma*MeshInterpolate(&delta,pixels[2].green,
5450 pixels[3].green,pixels[0].green);
5451 pixel->blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
5452 pixels[3].blue,pixels[0].blue);
5453 if (image->colorspace == CMYKColorspace)
5454 pixel->black=gamma*MeshInterpolate(&delta,pixels[2].black,
5455 pixels[3].black,pixels[0].black);
5456 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5457 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[2].alpha,
5458 pixels[3].alpha,pixels[0].alpha);
5463 Top-right triangle (pixel:1 , diagonal: 0-3).
5465 delta.x=1.0-delta.x;
5466 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
5467 gamma=MagickEpsilonReciprocal(gamma);
5468 pixel->red=gamma*MeshInterpolate(&delta,pixels[1].red,
5469 pixels[0].red,pixels[3].red);
5470 pixel->green=gamma*MeshInterpolate(&delta,pixels[1].green,
5471 pixels[0].green,pixels[3].green);
5472 pixel->blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
5473 pixels[0].blue,pixels[3].blue);
5474 if (image->colorspace == CMYKColorspace)
5475 pixel->black=gamma*MeshInterpolate(&delta,pixels[1].black,
5476 pixels[0].black,pixels[3].black);
5477 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5478 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[1].alpha,
5479 pixels[0].alpha,pixels[3].alpha);
5487 if (delta.x <= (1.0-delta.y))
5490 Top-left triangle (pixel: 0, diagonal: 1-2).
5492 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
5493 gamma=MagickEpsilonReciprocal(gamma);
5494 pixel->red=gamma*MeshInterpolate(&delta,pixels[0].red,
5495 pixels[1].red,pixels[2].red);
5496 pixel->green=gamma*MeshInterpolate(&delta,pixels[0].green,
5497 pixels[1].green,pixels[2].green);
5498 pixel->blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
5499 pixels[1].blue,pixels[2].blue);
5500 if (image->colorspace == CMYKColorspace)
5501 pixel->black=gamma*MeshInterpolate(&delta,pixels[0].black,
5502 pixels[1].black,pixels[2].black);
5503 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5504 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[0].alpha,
5505 pixels[1].alpha,pixels[2].alpha);
5510 Bottom-right triangle (pixel: 3, diagonal: 1-2).
5512 delta.x=1.0-delta.x;
5513 delta.y=1.0-delta.y;
5514 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
5515 gamma=MagickEpsilonReciprocal(gamma);
5516 pixel->red=gamma*MeshInterpolate(&delta,pixels[3].red,
5517 pixels[2].red,pixels[1].red);
5518 pixel->green=gamma*MeshInterpolate(&delta,pixels[3].green,
5519 pixels[2].green,pixels[1].green);
5520 pixel->blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
5521 pixels[2].blue,pixels[1].blue);
5522 if (image->colorspace == CMYKColorspace)
5523 pixel->black=gamma*MeshInterpolate(&delta,pixels[3].black,
5524 pixels[2].black,pixels[1].black);
5525 gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5526 pixel->alpha=gamma*MeshInterpolate(&delta,pixels[3].alpha,
5527 pixels[2].alpha,pixels[1].alpha);
5532 case NearestInterpolatePixel:
5534 x_offset=(ssize_t) floor(x+0.5);
5535 y_offset=(ssize_t) floor(y+0.5);
5536 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
5537 if (p == (const Quantum *) NULL)
5542 GetPixelInfoPixel(image,p,pixel);
5545 case SplineInterpolatePixel:
5551 p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
5553 if (p == (const Quantum *) NULL)
5558 for (i=0; i < 16L; i++)
5559 AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5560 SplineWeights((double) (x-x_offset),&cx);
5561 SplineWeights((double) (y-y_offset),&cy);
5562 pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*
5563 pixels[1].red+cx[2]*pixels[2].red+cx[3]*
5564 pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]*
5565 pixels[5].red+cx[2]*pixels[6].red+cx[3]*
5566 pixels[7].red)+cy[2]*(cx[0]*pixels[8].red+cx[1]*
5567 pixels[9].red+cx[2]*pixels[10].red+cx[3]*
5568 pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*
5569 pixels[13].red+cx[2]*pixels[14].red+cx[3]*pixels[15].red));
5570 pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*
5571 pixels[1].green+cx[2]*pixels[2].green+cx[3]*
5572 pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+cx[1]*
5573 pixels[5].green+cx[2]*pixels[6].green+cx[3]*
5574 pixels[7].green)+cy[2]*(cx[0]*pixels[8].green+cx[1]*
5575 pixels[9].green+cx[2]*pixels[10].green+cx[3]*
5576 pixels[11].green)+cy[3]*(cx[0]*pixels[12].green+cx[1]*
5577 pixels[13].green+cx[2]*pixels[14].green+cx[3]*pixels[15].green));
5578 pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*
5579 pixels[1].blue+cx[2]*pixels[2].blue+cx[3]*
5580 pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]*
5581 pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*
5582 pixels[7].blue)+cy[2]*(cx[0]*pixels[8].blue+cx[1]*
5583 pixels[9].blue+cx[2]*pixels[10].blue+cx[3]*
5584 pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*
5585 pixels[13].blue+cx[2]*pixels[14].blue+cx[3]*pixels[15].blue));
5586 if (image->colorspace == CMYKColorspace)
5587 pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*
5588 pixels[1].black+cx[2]*pixels[2].black+cx[3]*
5589 pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+cx[1]*
5590 pixels[5].black+cx[2]*pixels[6].black+cx[3]*
5591 pixels[7].black)+cy[2]*(cx[0]*pixels[8].black+cx[1]*
5592 pixels[9].black+cx[2]*pixels[10].black+cx[3]*
5593 pixels[11].black)+cy[3]*(cx[0]*pixels[12].black+cx[1]*
5594 pixels[13].black+cx[2]*pixels[14].black+cx[3]*pixels[15].black));
5595 pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*
5596 pixels[1].alpha+cx[2]*pixels[2].alpha+cx[3]*
5597 pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+cx[1]*
5598 pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*
5599 pixels[7].alpha)+cy[2]*(cx[0]*pixels[8].alpha+cx[1]*
5600 pixels[9].alpha+cx[2]*pixels[10].alpha+cx[3]*
5601 pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+cx[1]*
5602 pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha));
5610 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5614 + I s F u z z y E q u i v a l e n c e P i x e l %
5618 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5620 % IsFuzzyEquivalencePixel() returns MagickTrue if the distance between two
5621 % pixels is less than the specified distance in a linear three (or four)u
5622 % dimensional color space.
5624 % The format of the IsFuzzyEquivalencePixel method is:
5626 % void IsFuzzyEquivalencePixel(const Image *source,const Quantum *p,
5627 % const Image *destination,const Quantum *q)
5629 % A description of each parameter follows:
5631 % o source: the source image.
5635 % o destination: the destination image.
5640 MagickExport MagickBooleanType IsFuzzyEquivalencePixel(const Image *source,
5641 const Quantum *p,const Image *destination,const Quantum *q)
5651 fuzz=MagickMax(source->fuzz,(double) MagickSQ1_2)*MagickMax(
5652 destination->fuzz,(double) MagickSQ1_2);
5655 if (source->alpha_trait == BlendPixelTrait)
5658 Transparencies are involved - set alpha distance
5660 pixel=GetPixelAlpha(source,p)-(double)
5661 GetPixelAlpha(destination,q);
5662 distance=pixel*pixel;
5663 if (distance > fuzz)
5664 return(MagickFalse);
5666 Generate a alpha scaling factor to generate a 4D cone on colorspace
5667 Note that if one color is transparent, distance has no color component.
5669 scale=QuantumScale*GetPixelAlpha(source,p);
5670 scale*=QuantumScale*GetPixelAlpha(destination,q);
5671 if (scale <= MagickEpsilon)
5675 RGB or CMY color cube
5677 distance*=3.0; /* rescale appropriately */
5679 pixel=GetPixelRed(source,p)-(double) GetPixelRed(destination,q);
5680 if ((source->colorspace == HSLColorspace) ||
5681 (source->colorspace == HSBColorspace) ||
5682 (source->colorspace == HWBColorspace))
5685 Compute an arc distance for hue. It should be a vector angle of
5686 'S'/'W' length with 'L'/'B' forming appropriate cones.
5688 if (fabs((double) pixel) > (QuantumRange/2))
5689 pixel-=QuantumRange;
5692 distance+=scale*pixel*pixel;
5693 if (distance > fuzz)
5694 return(MagickFalse);
5695 pixel=GetPixelGreen(source,p)-(double) GetPixelGreen(destination,q);
5696 distance+=scale*pixel*pixel;
5697 if (distance > fuzz)
5698 return(MagickFalse);
5699 pixel=GetPixelBlue(source,p)-(double) GetPixelBlue(destination,q);
5700 distance+=scale*pixel*pixel;
5701 if (distance > fuzz)
5702 return(MagickFalse);
5707 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5711 + 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 %
5715 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5717 % IsFuzzyEquivalencePixelInfo() returns true if the distance between two
5718 % colors is less than the specified distance in a linear three (or four)
5719 % dimensional color space.
5721 % This implements the equivalent of:
5722 % fuzz < sqrt(color_distance^2 * u.a*v.a + alpha_distance^2)
5724 % Which produces a multi-dimensional cone for that colorspace along the
5725 % transparency vector.
5727 % For example for an RGB:
5728 % color_distance^2 = ( (u.r-v.r)^2 + (u.g-v.g)^2 + (u.b-v.b)^2 ) / 3
5730 % See http://www.imagemagick.org/Usage/bugs/fuzz_distance/
5732 % Hue colorspace distances need more work. Hue is not a distance, it is an
5735 % A check that q is in the same color space as p should be made and the
5736 % appropriate mapping made. -- Anthony Thyssen 8 December 2010
5738 % The format of the IsFuzzyEquivalencePixelInfo method is:
5740 % MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
5741 % const PixelInfo *q)
5743 % A description of each parameter follows:
5750 MagickExport MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
5761 if ((p->fuzz == 0.0) && (q->fuzz == 0.0))
5762 return(IsPixelInfoEquivalent(p,q));
5764 fuzz=MagickMax(q->fuzz,(double) MagickSQ1_2)*MagickMax(q->fuzz,
5765 (double) MagickSQ1_2);
5766 else if (q->fuzz == 0.0)
5767 fuzz=MagickMax(p->fuzz,(double) MagickSQ1_2)*MagickMax(p->fuzz,
5768 (double) MagickSQ1_2);
5770 fuzz=MagickMax(p->fuzz,(double) MagickSQ1_2)*MagickMax(q->fuzz,
5771 (double) MagickSQ1_2);
5774 if ((p->alpha_trait == BlendPixelTrait) || (q->alpha_trait == BlendPixelTrait))
5777 Transparencies are involved - set alpha distance.
5779 pixel=(p->alpha_trait == BlendPixelTrait ? p->alpha : OpaqueAlpha)-
5780 (q->alpha_trait == BlendPixelTrait ? q->alpha : OpaqueAlpha);
5781 distance=pixel*pixel;
5782 if (distance > fuzz)
5783 return(MagickFalse);
5785 Generate a alpha scaling factor to generate a 4D cone on colorspace.
5786 If one color is transparent, distance has no color component.
5788 if (p->alpha_trait == BlendPixelTrait)
5789 scale=(QuantumScale*p->alpha);
5790 if (q->alpha_trait == BlendPixelTrait)
5791 scale*=(QuantumScale*q->alpha);
5792 if (scale <= MagickEpsilon )
5796 CMYK create a CMY cube with a multi-dimensional cone toward black.
5798 if (p->colorspace == CMYKColorspace)
5800 pixel=p->black-q->black;
5801 distance+=pixel*pixel*scale;
5802 if (distance > fuzz)
5803 return(MagickFalse);
5804 scale*=(double) (QuantumScale*(QuantumRange-p->black));
5805 scale*=(double) (QuantumScale*(QuantumRange-q->black));
5808 RGB or CMY color cube.
5810 distance*=3.0; /* rescale appropriately */
5812 pixel=p->red-q->red;
5813 if ((p->colorspace == HSLColorspace) || (p->colorspace == HSBColorspace) ||
5814 (p->colorspace == HWBColorspace))
5817 This calculates a arc distance for hue-- it should be a vector angle
5818 of 'S'/'W' length with 'L'/'B' forming appropriate cones. In other
5819 words this is a hack - Anthony.
5821 if (fabs((double) pixel) > (QuantumRange/2))
5822 pixel-=QuantumRange;
5825 distance+=pixel*pixel*scale;
5826 if (distance > fuzz)
5827 return(MagickFalse);
5828 pixel=p->green-q->green;
5829 distance+=pixel*pixel*scale;
5830 if (distance > fuzz)
5831 return(MagickFalse);
5832 pixel=p->blue-q->blue;
5833 distance+=pixel*pixel*scale;
5834 if (distance > fuzz)
5835 return(MagickFalse);
5840 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5844 % S e t P i x e l C h a n n e l M a p M a s k %
5848 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5850 % SetPixelChannelMask() sets the pixel channel map from the specified
5853 % The format of the SetPixelChannelMask method is:
5855 % void SetPixelChannelMask(Image *image,const ChannelType channel_mask)
5857 % A description of each parameter follows:
5859 % o image: the image.
5861 % o channel_mask: the channel mask.
5864 MagickExport void SetPixelChannelMask(Image *image,
5865 const ChannelType channel_mask)
5867 #define GetChannelBit(mask,bit) (((size_t) (mask) >> (size_t) (bit)) & 0x01)
5872 if (image->debug != MagickFalse)
5873 (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%08x]", \
5874 image->filename,channel_mask); \
5875 image->channel_mask=channel_mask;
5876 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
5881 channel=GetPixelChannelChannel(image,i);
5882 SetPixelChannelTraits(image,channel,
5883 GetChannelBit(channel_mask,channel) == 0 ? CopyPixelTrait :
5884 image->alpha_trait != BlendPixelTrait || (channel == AlphaPixelChannel) ?
5885 UpdatePixelTrait : (PixelTrait) (UpdatePixelTrait | image->alpha_trait));
5887 if (image->storage_class == PseudoClass)
5888 SetPixelChannelTraits(image,IndexPixelChannel,CopyPixelTrait);
5889 if (image->mask != MagickFalse)
5890 SetPixelChannelTraits(image,MaskPixelChannel,CopyPixelTrait);
5891 if (image->debug != MagickFalse)
5892 LogPixelChannels(image);
5896 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5900 % S e t P i x e l M e t a C h a n n e l s %
5904 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5906 % SetPixelMetaChannels() sets the image meta channels.
5908 % The format of the SetPixelMetaChannels method is:
5910 % MagickBooleanType SetPixelMetaChannels(Image *image,
5911 % const size_t number_meta_channels,ExceptionInfo *exception)
5913 % A description of each parameter follows:
5915 % o image: the image.
5917 % o number_meta_channels: the number of meta channels.
5919 % o exception: return any errors or warnings in this structure.
5922 MagickExport MagickBooleanType SetPixelMetaChannels(Image *image,
5923 const size_t number_meta_channels,ExceptionInfo *exception)
5925 image->number_meta_channels=number_meta_channels;
5926 return(SyncImagePixelCache(image,exception));