2 Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization
3 dedicated to making software imaging solutions freely available.
5 You may not use this file except in compliance with the License.
6 obtain a copy of the License at
8 http://www.imagemagick.org/script/license.php
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
16 MagickCore pixel accessor methods.
18 #ifndef _MAGICKCORE_PIXEL_ACCESSOR_H
19 #define _MAGICKCORE_PIXEL_ACCESSOR_H
21 #if defined(__cplusplus) || defined(c_plusplus)
26 #include <MagickCore/cache-view.h>
27 #include <MagickCore/color.h>
28 #include <MagickCore/image.h>
32 static inline Quantum GetPixelAlpha(const Image *image,const Quantum *pixel)
34 return(pixel[image->channel_map[AlphaPixelChannel].channel]);
37 static inline PixelTrait GetPixelAlphaTraits(const Image *image)
39 return(image->channel_map[AlphaPixelChannel].traits);
42 static inline Quantum GetPixelBlack(const Image *image,const Quantum *pixel)
44 return(pixel[image->channel_map[BlackPixelChannel].channel]);
47 static inline PixelTrait GetPixelBlackTraits(const Image *image)
49 return(image->channel_map[BlackPixelChannel].traits);
52 static inline Quantum GetPixelBlue(const Image *image,const Quantum *pixel)
54 return(pixel[image->channel_map[BluePixelChannel].channel]);
57 static inline PixelTrait GetPixelBlueTraits(const Image *image)
59 return(image->channel_map[BluePixelChannel].traits);
62 static inline Quantum GetPixelCb(const Image *image,const Quantum *pixel)
64 return(pixel[image->channel_map[CbPixelChannel].channel]);
67 static inline PixelTrait GetPixelCbTraits(const Image *image)
69 return(image->channel_map[CbPixelChannel].traits);
72 static inline Quantum GetPixelChannel(const Image *image,
73 const PixelChannel channel,const Quantum *pixel)
75 return(pixel[image->channel_map[channel].channel]);
78 static inline PixelChannel GetPixelChannelMapChannel(const Image *image,
79 const PixelChannel channel)
81 return(image->channel_map[channel].channel);
84 static inline PixelTrait GetPixelChannelMapTraits(const Image *image,
85 const PixelChannel channel)
87 return(image->channel_map[channel].traits);
90 static inline size_t GetPixelChannels(const Image *image)
92 return(image->number_channels);
95 static inline Quantum GetPixelCr(const Image *image,const Quantum *pixel)
97 return(pixel[image->channel_map[CrPixelChannel].channel]);
100 static inline PixelTrait GetPixelCrTraits(const Image *image)
102 return(image->channel_map[CrPixelChannel].traits);
105 static inline Quantum GetPixelCyan(const Image *image,const Quantum *pixel)
107 return(pixel[image->channel_map[CyanPixelChannel].channel]);
110 static inline PixelTrait GetPixelCyanTraits(const Image *image)
112 return(image->channel_map[CyanPixelChannel].traits);
115 static inline Quantum GetPixelGray(const Image *image,const Quantum *pixel)
117 return(pixel[image->channel_map[GrayPixelChannel].channel]);
120 static inline PixelTrait GetPixelGrayTraits(const Image *image)
122 return(image->channel_map[GrayPixelChannel].traits);
125 static inline Quantum GetPixelGreen(const Image *image,const Quantum *pixel)
127 return(pixel[image->channel_map[GreenPixelChannel].channel]);
130 static inline PixelTrait GetPixelGreenTraits(const Image *image)
132 return(image->channel_map[GreenPixelChannel].traits);
135 static inline Quantum GetPixelIndex(const Image *image,const Quantum *pixel)
137 return(pixel[image->channel_map[IndexPixelChannel].channel]);
140 static inline PixelTrait GetPixelIndexTraits(const Image *image)
142 return(image->channel_map[IndexPixelChannel].traits);
145 static inline Quantum GetPixelInfoIntensity(const PixelInfo *pixel_info)
147 #if !defined(MAGICKCORE_HDRI_SUPPORT)
148 return((Quantum) (0.299*pixel_info->red+0.587*pixel_info->green+0.114*
149 pixel_info->blue+0.5));
151 return((Quantum) (0.299*pixel_info->red+0.587*pixel_info->green+0.114*
156 static inline Quantum GetPixelInfoLuminance(const PixelInfo *pixel_info)
161 #if !defined(MAGICKCORE_HDRI_SUPPORT)
162 luminance=(Quantum) (0.21267*pixel_info->red+0.71516*pixel_info->green+
163 0.07217*pixel_info->blue+0.5);
165 luminance=(Quantum) (0.21267*pixel_info->red+0.71516*pixel_info->green+
166 0.07217*pixel_info->blue);
168 return((Quantum) luminance);
171 static inline Quantum GetPixelMagenta(const Image *image,const Quantum *pixel)
173 return(pixel[image->channel_map[MagentaPixelChannel].channel]);
176 static inline PixelTrait GetPixelMagentaTraits(const Image *image)
178 return(image->channel_map[MagentaPixelChannel].traits);
181 static inline size_t GetPixelMetaChannels(const Image *image)
183 return(image->number_meta_channels);
186 static inline size_t GetPixelMetacontentExtent(const Image *image)
188 return(image->metacontent_extent);
191 static inline Quantum GetPixelRed(const Image *image,const Quantum *pixel)
193 return(pixel[image->channel_map[RedPixelChannel].channel]);
196 static inline PixelTrait GetPixelRedTraits(const Image *image)
198 return(image->channel_map[RedPixelChannel].traits);
201 static inline void GetPixelPacket(const Image *image,const Quantum *pixel,
204 packet->red=GetPixelRed(image,pixel);
205 packet->green=GetPixelGreen(image,pixel);
206 packet->blue=GetPixelBlue(image,pixel);
207 packet->alpha=GetPixelAlpha(image,pixel);
210 static inline Quantum GetPixelPacketIntensity(const PixelPacket *pixel)
212 #if !defined(MAGICKCORE_HDRI_SUPPORT)
213 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
215 return((Quantum) (0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue+0.5));
222 alpha=pixel->red-pixel->green;
223 beta=pixel->green-pixel->blue;
224 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
226 return((Quantum) (0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue));
231 static inline PixelTrait GetPixelTraits(const Image *image,
232 const PixelChannel channel)
234 return(image->channel_map[channel].traits);
237 static inline Quantum GetPixelY(const Image *image,const Quantum *pixel)
239 return(pixel[image->channel_map[YPixelChannel].channel]);
242 static inline PixelTrait GetPixelYTraits(const Image *image)
244 return(image->channel_map[YPixelChannel].traits);
247 static inline Quantum GetPixelYellow(const Image *image,const Quantum *pixel)
249 return(pixel[image->channel_map[YellowPixelChannel].channel]);
252 static inline PixelTrait GetPixelYellowTraits(const Image *image)
254 return(image->channel_map[YellowPixelChannel].traits);
257 static inline MagickBooleanType IsPixelEquivalent(const Image *image,
258 const Quantum *p,const PixelPacket *q)
260 if ((GetPixelRed(image,p) == q->red) &&
261 (GetPixelGreen(image,p) == q->green) &&
262 (GetPixelBlue(image,p) == q->blue))
267 static inline MagickBooleanType IsPixelGray(const Image *image,
268 const Quantum *pixel)
270 #if !defined(MAGICKCORE_HDRI_SUPPORT)
271 if ((GetPixelRed(image,pixel) == GetPixelGreen(image,pixel)) &&
272 (GetPixelGreen(image,pixel) == GetPixelBlue(image,pixel)))
280 alpha=GetPixelRed(image,pixel)-(double) GetPixelGreen(image,pixel);
281 beta=GetPixelGreen(image,pixel)-(double) GetPixelBlue(image,pixel);
282 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
289 static inline MagickBooleanType IsPixelInfoEquivalent(const PixelInfo *p,
292 if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
293 (fabs(p->alpha-OpaqueAlpha) > 0.5))
295 if ((q->matte != MagickFalse) && (p->matte == MagickFalse) &&
296 (fabs(q->alpha-OpaqueAlpha)) > 0.5)
298 if ((p->matte != MagickFalse) && (q->matte != MagickFalse))
300 if (fabs(p->alpha-q->alpha) > 0.5)
302 if (fabs(p->alpha-TransparentAlpha) <= 0.5)
305 if (fabs(p->red-q->red) > 0.5)
307 if (fabs(p->green-q->green) > 0.5)
309 if (fabs(p->blue-q->blue) > 0.5)
311 if ((p->colorspace == CMYKColorspace) && (fabs(p->black-q->black) > 0.5))
316 static inline MagickBooleanType IsPixelMonochrome(const Image *image,
317 const Quantum *pixel)
319 #if !defined(MAGICKCORE_HDRI_SUPPORT)
320 if (((GetPixelRed(image,pixel) == 0) ||
321 (GetPixelRed(image,pixel) == (Quantum) QuantumRange)) &&
322 (GetPixelRed(image,pixel) == GetPixelGreen(image,pixel)) &&
323 (GetPixelGreen(image,pixel) == GetPixelBlue(image,pixel)))
331 alpha=GetPixelRed(image,pixel)-(double) GetPixelGreen(image,pixel);
332 beta=GetPixelGreen(image,pixel)-(double) GetPixelBlue(image,pixel);
333 if (((fabs(GetPixelRed(image,pixel)) <= MagickEpsilon) ||
334 (fabs(GetPixelRed(image,pixel)-QuantumRange) <= MagickEpsilon)) &&
335 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
342 static inline MagickBooleanType IsPixelPacketEquivalent(const PixelPacket *p,
343 const PixelPacket *q)
345 if ((p->red == q->red) && (p->green == q->green) && (p->blue == q->blue))
350 static inline MagickBooleanType IsPixelPacketGray(const PixelPacket *pixel)
352 #if !defined(MAGICKCORE_HDRI_SUPPORT)
353 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
361 alpha=pixel->red-(double) pixel->green;
362 beta=pixel->green-(double) pixel->blue;
363 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
370 static inline MagickBooleanType IsPixelPacketMonochrome(
371 const PixelPacket *pixel)
373 #if !defined(MAGICKCORE_HDRI_SUPPORT)
374 if (((pixel->red == 0) || (pixel->red == (Quantum) QuantumRange)) &&
375 (pixel->red == pixel->green) && (pixel->green == pixel->blue))
383 alpha=pixel->red-(double) pixel->green;
384 beta=pixel->green-(double) pixel->blue;
385 if (((fabs(pixel->red) <= MagickEpsilon) ||
386 (fabs(pixel->red-QuantumRange) <= MagickEpsilon)) &&
387 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
394 static inline void SetPacketPixelInfo(const Image *image,
395 const PixelInfo *pixel_info,PixelPacket *packet)
397 packet->red=ClampToQuantum(pixel_info->red);
398 packet->green=ClampToQuantum(pixel_info->green);
399 packet->blue=ClampToQuantum(pixel_info->blue);
400 packet->alpha=ClampToQuantum(pixel_info->alpha);
401 if (image->colorspace == CMYKColorspace)
402 packet->black=ClampToQuantum(pixel_info->black);
403 if (image->storage_class == PseudoClass)
404 packet->index=ClampToQuantum(pixel_info->index);
407 static inline void SetPixelAlpha(const Image *image,const Quantum alpha,
410 pixel[image->channel_map[AlphaPixelChannel].channel]=alpha;
413 static inline void SetPixelAlphaTraits(Image *image,const PixelTrait traits)
415 image->channel_map[AlphaPixelChannel].traits=traits;
418 static inline void SetPixelBlack(const Image *image,const Quantum black,
421 pixel[image->channel_map[BlackPixelChannel].channel]=black;
424 static inline void SetPixelBlackTraits(Image *image,const PixelTrait traits)
426 image->channel_map[BlackPixelChannel].traits=traits;
429 static inline void SetPixelBlue(const Image *image,const Quantum blue,
432 pixel[image->channel_map[BluePixelChannel].channel]=blue;
435 static inline void SetPixelBlueTraits(Image *image,const PixelTrait traits)
437 image->channel_map[BluePixelChannel].traits=traits;
440 static inline void SetPixelCb(const Image *image,const Quantum cb,
443 pixel[image->channel_map[CbPixelChannel].channel]=cb;
446 static inline void SetPixelCbTraits(Image *image,const PixelTrait traits)
448 image->channel_map[CbPixelChannel].traits=traits;
451 static inline void SetPixelChannel(const Image *image,
452 const PixelChannel channel,const Quantum quantum,Quantum *pixel)
454 pixel[image->channel_map[channel].channel]=quantum;
457 static inline void SetPixelChannelMapChannel(const Image *image,
458 const PixelChannel channel,const PixelChannel channels)
460 image->channel_map[channel].channel=channels;
463 static inline void SetPixelChannels(Image *image,const size_t number_channels)
465 image->number_channels=number_channels;
468 static inline void SetPixelChannelTraits(Image *image,
469 const PixelChannel channel,const PixelTrait traits)
471 image->channel_map[channel].traits=traits;
474 static inline void SetPixelChannelMapTraits(Image *image,
475 const PixelChannel channel,const PixelTrait traits)
477 image->channel_map[channel].traits=traits;
480 static inline void SetPixelCr(const Image *image,const Quantum cr,
483 pixel[image->channel_map[CrPixelChannel].channel]=cr;
486 static inline void SetPixelCrTraits(Image *image,const PixelTrait traits)
488 image->channel_map[CrPixelChannel].traits=traits;
491 static inline void SetPixelCyan(const Image *image,const Quantum cyan,
494 pixel[image->channel_map[CyanPixelChannel].channel]=cyan;
497 static inline void SetPixelGray(const Image *image,const Quantum gray,
500 pixel[image->channel_map[GrayPixelChannel].channel]=gray;
503 static inline void SetPixelGrayTraits(Image *image,const PixelTrait traits)
505 image->channel_map[GrayPixelChannel].traits=traits;
508 static inline void SetPixelGreen(const Image *image,const Quantum green,
511 pixel[image->channel_map[GreenPixelChannel].channel]=green;
514 static inline void SetPixelGreenTraits(Image *image,const PixelTrait traits)
516 image->channel_map[GreenPixelChannel].traits=traits;
519 static inline void SetPixelIndex(const Image *image,const Quantum index,
522 pixel[image->channel_map[IndexPixelChannel].channel]=index;
525 static inline void SetPixelIndexTraits(Image *image,const PixelTrait traits)
527 image->channel_map[IndexPixelChannel].traits=traits;
530 static inline void SetPixelInfo(const Image *image,const Quantum *pixel,
531 PixelInfo *pixel_info)
533 pixel_info->red=(MagickRealType) GetPixelRed(image,pixel);
534 pixel_info->green=(MagickRealType) GetPixelGreen(image,pixel);
535 pixel_info->blue=(MagickRealType) GetPixelBlue(image,pixel);
536 pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
537 if (image->colorspace == CMYKColorspace)
538 pixel_info->black=(MagickRealType) GetPixelBlack(image,pixel);
539 if (image->storage_class == PseudoClass)
540 pixel_info->index=(MagickRealType) GetPixelIndex(image,pixel);
543 static inline void SetPixelInfoBias(const Image *image,PixelInfo *pixel_info)
546 Obsoleted by MorphologyApply().
548 pixel_info->red=image->bias;
549 pixel_info->green=image->bias;
550 pixel_info->blue=image->bias;
551 pixel_info->alpha=image->bias;
552 pixel_info->black=image->bias;
555 static inline void SetPixelInfoPacket(const Image *image,
556 const PixelPacket *pixel,PixelInfo *pixel_info)
558 pixel_info->red=(MagickRealType) pixel->red;
559 pixel_info->green=(MagickRealType) pixel->green;
560 pixel_info->blue=(MagickRealType) pixel->blue;
561 pixel_info->alpha=(MagickRealType) pixel->alpha;
562 if (image->colorspace == CMYKColorspace)
563 pixel_info->black=(MagickRealType) pixel->black;
564 if (image->storage_class == PseudoClass)
565 pixel_info->index=(MagickRealType) pixel->index;
568 static inline void SetPixelMagenta(const Image *image,const Quantum magenta,
571 pixel[image->channel_map[MagentaPixelChannel].channel]=magenta;
574 static inline void SetPixelMagentaTraits(Image *image,const PixelTrait traits)
576 image->channel_map[MagentaPixelChannel].traits=traits;
579 static inline void SetPixelMetaChannels(Image *image,
580 const size_t number_meta_channels)
582 image->number_meta_channels=number_meta_channels;
585 static inline void SetPixelMetacontentExtent(Image *image,const size_t extent)
587 image->metacontent_extent=extent;
590 static inline void SetPixelRed(const Image *image,const Quantum red,
593 pixel[image->channel_map[RedPixelChannel].channel]=red;
596 static inline void SetPixelRedTraits(Image *image,const PixelTrait traits)
598 image->channel_map[RedPixelChannel].traits=traits;
601 static inline void SetPixelPacket(const Image *image,const PixelPacket *packet,
604 SetPixelRed(image,packet->red,pixel);
605 SetPixelGreen(image,packet->green,pixel);
606 SetPixelBlue(image,packet->blue,pixel);
607 SetPixelAlpha(image,packet->alpha,pixel);
610 static inline void SetPixelPixelInfo(const Image *image,
611 const PixelInfo *pixel_info,Quantum *packet)
613 SetPixelRed(image,ClampToQuantum(pixel_info->red),packet);
614 SetPixelGreen(image,ClampToQuantum(pixel_info->green),packet);
615 SetPixelBlue(image,ClampToQuantum(pixel_info->blue),packet);
616 SetPixelAlpha(image,ClampToQuantum(pixel_info->alpha),packet);
617 if (image->colorspace == CMYKColorspace)
618 SetPixelBlack(image,ClampToQuantum(pixel_info->black),packet);
621 static inline void SetPixelYellow(const Image *image,const Quantum yellow,
624 pixel[image->channel_map[YellowPixelChannel].channel]=yellow;
627 static inline void SetPixelYellowTraits(Image *image,const PixelTrait traits)
629 image->channel_map[YellowPixelChannel].traits=traits;
632 static inline void SetPixelY(const Image *image,const Quantum y,Quantum *pixel)
634 pixel[image->channel_map[YPixelChannel].channel]=y;
637 static inline void SetPixelYTraits(Image *image,const PixelTrait traits)
639 image->channel_map[YPixelChannel].traits=traits;
642 static inline Quantum GetPixelIntensity(const Image *image,const Quantum *pixel)
644 #if !defined(MAGICKCORE_HDRI_SUPPORT)
645 if ((GetPixelRed(image,pixel) == GetPixelGreen(image,pixel)) &&
646 (GetPixelGreen(image,pixel) == GetPixelBlue(image,pixel)))
647 return(GetPixelRed(image,pixel));
648 return((Quantum) (0.299*GetPixelRed(image,pixel)+0.587*
649 GetPixelGreen(image,pixel)+0.114*GetPixelBlue(image,pixel)+0.5));
656 alpha=GetPixelRed(image,pixel)-(double) GetPixelGreen(image,pixel);
657 beta=GetPixelGreen(image,pixel)-(double) GetPixelBlue(image,pixel);
658 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
659 return(GetPixelRed(image,pixel));
660 return((Quantum) (0.299*GetPixelRed(image,pixel)+0.587*
661 GetPixelGreen(image,pixel)+0.114*GetPixelBlue(image,pixel)));
666 static inline Quantum GetPixelLuminance(const Image *image,const Quantum *pixel)
668 #if !defined(MAGICKCORE_HDRI_SUPPORT)
669 return((Quantum) (0.21267*GetPixelRed(image,pixel)+0.71516*
670 GetPixelGreen(image,pixel)+0.07217*GetPixelBlue(image,pixel)+0.5));
672 return((Quantum) (0.21267*GetPixelRed(image,pixel)+0.71516*
673 GetPixelGreen(image,pixel)+0.07217*GetPixelBlue(image,pixel)));
677 #if defined(__cplusplus) || defined(c_plusplus)