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=pixel[image->channel_map[RedPixelChannel].channel];
205 packet->green=pixel[image->channel_map[GreenPixelChannel].channel];
206 packet->blue=pixel[image->channel_map[BluePixelChannel].channel];
207 packet->alpha=pixel[image->channel_map[AlphaPixelChannel].channel];
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 ((p[image->channel_map[RedPixelChannel].channel] == q->red) &&
261 (p[image->channel_map[GreenPixelChannel].channel] == q->green) &&
262 (p[image->channel_map[BluePixelChannel].channel] == q->blue))
267 static inline MagickBooleanType IsPixelGray(const Image *image,
268 const Quantum *pixel)
270 #if !defined(MAGICKCORE_HDRI_SUPPORT)
271 if ((pixel[image->channel_map[RedPixelChannel].channel] ==
272 pixel[image->channel_map[GreenPixelChannel].channel]) &&
273 (pixel[image->channel_map[GreenPixelChannel].channel] ==
274 pixel[image->channel_map[BluePixelChannel].channel]))
282 alpha=pixel[image->channel_map[RedPixelChannel].channel]-(double)
283 pixel[image->channel_map[GreenPixelChannel].channel];
284 beta=pixel[image->channel_map[GreenPixelChannel].channel]-(double)
285 pixel[image->channel_map[BluePixelChannel].channel];
286 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
293 static inline MagickBooleanType IsPixelInfoEquivalent(const PixelInfo *p,
296 if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
297 (fabs(p->alpha-OpaqueAlpha) > 0.5))
299 if ((q->matte != MagickFalse) && (p->matte == MagickFalse) &&
300 (fabs(q->alpha-OpaqueAlpha)) > 0.5)
302 if ((p->matte != MagickFalse) && (q->matte != MagickFalse))
304 if (fabs(p->alpha-q->alpha) > 0.5)
306 if (fabs(p->alpha-TransparentAlpha) <= 0.5)
309 if (fabs(p->red-q->red) > 0.5)
311 if (fabs(p->green-q->green) > 0.5)
313 if (fabs(p->blue-q->blue) > 0.5)
315 if ((p->colorspace == CMYKColorspace) && (fabs(p->black-q->black) > 0.5))
320 static inline MagickBooleanType IsPixelMonochrome(const Image *image,
321 const Quantum *pixel)
323 #if !defined(MAGICKCORE_HDRI_SUPPORT)
324 if (((pixel[image->channel_map[RedPixelChannel].channel] == 0) ||
325 (pixel[image->channel_map[RedPixelChannel].channel] == (Quantum) QuantumRange)) &&
326 (pixel[image->channel_map[RedPixelChannel].channel] ==
327 pixel[image->channel_map[GreenPixelChannel].channel]) &&
328 (pixel[image->channel_map[GreenPixelChannel].channel] ==
329 pixel[image->channel_map[BluePixelChannel].channel]))
337 alpha=pixel[image->channel_map[RedPixelChannel].channel]-(double)
338 pixel[image->channel_map[GreenPixelChannel].channel];
339 beta=pixel[image->channel_map[GreenPixelChannel].channel]-(double)
340 pixel[image->channel_map[BluePixelChannel].channel];
341 if (((fabs(pixel[image->channel_map[RedPixelChannel].channel]) <= MagickEpsilon) ||
342 (fabs(pixel[image->channel_map[RedPixelChannel].channel]-QuantumRange) <= MagickEpsilon)) &&
343 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
350 static inline MagickBooleanType IsPixelPacketEquivalent(const PixelPacket *p,
351 const PixelPacket *q)
353 if ((p->red == q->red) && (p->green == q->green) && (p->blue == q->blue))
358 static inline MagickBooleanType IsPixelPacketGray(const PixelPacket *pixel)
360 #if !defined(MAGICKCORE_HDRI_SUPPORT)
361 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
369 alpha=pixel->red-(double) pixel->green;
370 beta=pixel->green-(double) pixel->blue;
371 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
378 static inline MagickBooleanType IsPixelPacketMonochrome(
379 const PixelPacket *pixel)
381 #if !defined(MAGICKCORE_HDRI_SUPPORT)
382 if (((pixel->red == 0) || (pixel->red == (Quantum) QuantumRange)) &&
383 (pixel->red == pixel->green) && (pixel->green == pixel->blue))
391 alpha=pixel->red-(double) pixel->green;
392 beta=pixel->green-(double) pixel->blue;
393 if (((fabs(pixel->red) <= MagickEpsilon) ||
394 (fabs(pixel->red-QuantumRange) <= MagickEpsilon)) &&
395 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
402 static inline void SetPacketPixelInfo(const Image *image,
403 const PixelInfo *pixel_info,PixelPacket *packet)
405 packet->red=ClampToQuantum(pixel_info->red);
406 packet->green=ClampToQuantum(pixel_info->green);
407 packet->blue=ClampToQuantum(pixel_info->blue);
408 packet->alpha=ClampToQuantum(pixel_info->alpha);
409 if (image->colorspace == CMYKColorspace)
410 packet->black=ClampToQuantum(pixel_info->black);
411 if (image->storage_class == PseudoClass)
412 packet->index=ClampToQuantum(pixel_info->index);
415 static inline void SetPixelAlpha(const Image *image,const Quantum alpha,
418 pixel[image->channel_map[AlphaPixelChannel].channel]=alpha;
421 static inline void SetPixelAlphaTraits(Image *image,const PixelTrait traits)
423 image->channel_map[AlphaPixelChannel].traits=traits;
426 static inline void SetPixelBlack(const Image *image,const Quantum black,
429 pixel[image->channel_map[BlackPixelChannel].channel]=black;
432 static inline void SetPixelBlackTraits(Image *image,const PixelTrait traits)
434 image->channel_map[BlackPixelChannel].traits=traits;
437 static inline void SetPixelBlue(const Image *image,const Quantum blue,
440 pixel[image->channel_map[BluePixelChannel].channel]=blue;
443 static inline void SetPixelBlueTraits(Image *image,const PixelTrait traits)
445 image->channel_map[BluePixelChannel].traits=traits;
448 static inline void SetPixelCb(const Image *image,const Quantum cb,
451 pixel[image->channel_map[CbPixelChannel].channel]=cb;
454 static inline void SetPixelCbTraits(Image *image,const PixelTrait traits)
456 image->channel_map[CbPixelChannel].traits=traits;
459 static inline void SetPixelChannel(const Image *image,
460 const PixelChannel channel,const Quantum quantum,Quantum *pixel)
462 pixel[image->channel_map[channel].channel]=quantum;
465 static inline void SetPixelChannelMapChannel(const Image *image,
466 const PixelChannel channel,const PixelChannel channels)
468 image->channel_map[channel].channel=channels;
471 static inline void SetPixelChannels(Image *image,const size_t number_channels)
473 image->number_channels=number_channels;
476 static inline void SetPixelChannelTraits(Image *image,
477 const PixelChannel channel,const PixelTrait traits)
479 image->channel_map[channel].traits=traits;
482 static inline void SetPixelChannelMapTraits(Image *image,
483 const PixelChannel channel,const PixelTrait traits)
485 image->channel_map[channel].traits=traits;
488 static inline void SetPixelCr(const Image *image,const Quantum cr,
491 pixel[image->channel_map[CrPixelChannel].channel]=cr;
494 static inline void SetPixelCrTraits(Image *image,const PixelTrait traits)
496 image->channel_map[CrPixelChannel].traits=traits;
499 static inline void SetPixelCyan(const Image *image,const Quantum cyan,
502 pixel[image->channel_map[CyanPixelChannel].channel]=cyan;
505 static inline void SetPixelGray(const Image *image,const Quantum gray,
508 pixel[image->channel_map[GrayPixelChannel].channel]=gray;
511 static inline void SetPixelGrayTraits(Image *image,const PixelTrait traits)
513 image->channel_map[GrayPixelChannel].traits=traits;
516 static inline void SetPixelGreen(const Image *image,const Quantum green,
519 pixel[image->channel_map[GreenPixelChannel].channel]=green;
522 static inline void SetPixelGreenTraits(Image *image,const PixelTrait traits)
524 image->channel_map[GreenPixelChannel].traits=traits;
527 static inline void SetPixelIndex(const Image *image,const Quantum index,
530 pixel[image->channel_map[IndexPixelChannel].channel]=index;
533 static inline void SetPixelIndexTraits(Image *image,const PixelTrait traits)
535 image->channel_map[IndexPixelChannel].traits=traits;
538 static inline void SetPixelInfo(const Image *image,const Quantum *pixel,
539 PixelInfo *pixel_info)
541 pixel_info->red=(MagickRealType)
542 pixel[image->channel_map[RedPixelChannel].channel];
543 pixel_info->green=(MagickRealType)
544 pixel[image->channel_map[GreenPixelChannel].channel];
545 pixel_info->blue=(MagickRealType)
546 pixel[image->channel_map[BluePixelChannel].channel];
547 if (image->colorspace == CMYKColorspace)
548 pixel_info->black=(MagickRealType)
549 pixel[image->channel_map[BlackPixelChannel].channel];
550 pixel_info->alpha=(MagickRealType)
551 pixel[image->channel_map[AlphaPixelChannel].channel];
552 if (image->storage_class == PseudoClass)
553 pixel_info->index=(MagickRealType)
554 pixel[image->channel_map[IndexPixelChannel].channel];
557 static inline void SetPixelInfoBias(const Image *image,PixelInfo *pixel_info)
560 Obsoleted by MorphologyApply().
562 pixel_info->red=image->bias;
563 pixel_info->green=image->bias;
564 pixel_info->blue=image->bias;
565 pixel_info->alpha=image->bias;
566 pixel_info->black=image->bias;
569 static inline void SetPixelInfoPacket(const Image *image,
570 const PixelPacket *pixel,PixelInfo *pixel_info)
572 pixel_info->red=(MagickRealType) pixel->red;
573 pixel_info->green=(MagickRealType) pixel->green;
574 pixel_info->blue=(MagickRealType) pixel->blue;
575 pixel_info->alpha=(MagickRealType) pixel->alpha;
576 if (image->colorspace == CMYKColorspace)
577 pixel_info->black=(MagickRealType) pixel->black;
578 if (image->storage_class == PseudoClass)
579 pixel_info->index=(MagickRealType) pixel->index;
582 static inline void SetPixelMagenta(const Image *image,const Quantum magenta,
585 pixel[image->channel_map[MagentaPixelChannel].channel]=magenta;
588 static inline void SetPixelMagentaTraits(Image *image,const PixelTrait traits)
590 image->channel_map[MagentaPixelChannel].traits=traits;
593 static inline void SetPixelMetaChannels(Image *image,
594 const size_t number_meta_channels)
596 image->number_meta_channels=number_meta_channels;
599 static inline void SetPixelMetacontentExtent(Image *image,const size_t extent)
601 image->metacontent_extent=extent;
604 static inline void SetPixelRed(const Image *image,const Quantum red,
607 pixel[image->channel_map[RedPixelChannel].channel]=red;
610 static inline void SetPixelRedTraits(Image *image,const PixelTrait traits)
612 image->channel_map[RedPixelChannel].traits=traits;
615 static inline void SetPixelPacket(const Image *image,const PixelPacket *packet,
618 pixel[image->channel_map[RedPixelChannel].channel]=packet->red;
619 pixel[image->channel_map[GreenPixelChannel].channel]=packet->green;
620 pixel[image->channel_map[BluePixelChannel].channel]=packet->blue;
621 pixel[image->channel_map[AlphaPixelChannel].channel]=packet->alpha;
624 static inline void SetPixelPixelInfo(const Image *image,
625 const PixelInfo *pixel_info,Quantum *pixel)
627 pixel[image->channel_map[RedPixelChannel].channel]=
628 ClampToQuantum(pixel_info->red);
629 pixel[image->channel_map[GreenPixelChannel].channel]=
630 ClampToQuantum(pixel_info->green);
631 pixel[image->channel_map[BluePixelChannel].channel]=
632 ClampToQuantum(pixel_info->blue);
633 pixel[image->channel_map[AlphaPixelChannel].channel]=
634 ClampToQuantum(pixel_info->alpha);
635 if (image->colorspace == CMYKColorspace)
636 pixel[image->channel_map[BlackPixelChannel].channel]=
637 ClampToQuantum(pixel_info->black);
640 static inline void SetPixelYellow(const Image *image,const Quantum yellow,
643 pixel[image->channel_map[YellowPixelChannel].channel]=yellow;
646 static inline void SetPixelYellowTraits(Image *image,const PixelTrait traits)
648 image->channel_map[YellowPixelChannel].traits=traits;
651 static inline void SetPixelY(const Image *image,const Quantum y,Quantum *pixel)
653 pixel[image->channel_map[YPixelChannel].channel]=y;
656 static inline void SetPixelYTraits(Image *image,const PixelTrait traits)
658 image->channel_map[YPixelChannel].traits=traits;
661 static inline Quantum GetPixelIntensity(const Image *image,const Quantum *pixel)
663 #if !defined(MAGICKCORE_HDRI_SUPPORT)
664 if ((pixel[image->channel_map[RedPixelChannel].channel] ==
665 pixel[image->channel_map[GreenPixelChannel].channel]) &&
666 (pixel[image->channel_map[GreenPixelChannel].channel] ==
667 pixel[image->channel_map[BluePixelChannel].channel]))
668 return(pixel[image->channel_map[RedPixelChannel].channel]);
669 return((Quantum) (0.299*pixel[image->channel_map[RedPixelChannel].channel]+
670 0.587*pixel[image->channel_map[GreenPixelChannel].channel]+0.114*
671 pixel[image->channel_map[BluePixelChannel].channel]+0.5));
678 alpha=pixel[image->channel_map[RedPixelChannel].channel]-(double)
679 pixel[image->channel_map[GreenPixelChannel].channel];
680 beta=pixel[image->channel_map[GreenPixelChannel].channel]-(double)
681 pixel[image->channel_map[BluePixelChannel].channel];
682 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
683 return(pixel[image->channel_map[RedPixelChannel].channel]);
684 return((Quantum) (0.299*pixel[image->channel_map[RedPixelChannel].channel]+
685 0.587*pixel[image->channel_map[GreenPixelChannel].channel]+0.114*
686 pixel[image->channel_map[BluePixelChannel].channel]));
691 static inline Quantum GetPixelLuminance(const Image *image,const Quantum *pixel)
693 #if !defined(MAGICKCORE_HDRI_SUPPORT)
694 return((Quantum) (0.21267*pixel[image->channel_map[RedPixelChannel].channel]+
695 0.71516*pixel[image->channel_map[GreenPixelChannel].channel]+0.07217*
696 pixel[image->channel_map[BluePixelChannel].channel]+0.5));
698 return((Quantum) (0.21267*pixel[image->channel_map[RedPixelChannel].channel]+
699 0.71516*pixel[image->channel_map[GreenPixelChannel].channel]+0.07217*
700 pixel[image->channel_map[BluePixelChannel].channel]));
704 #if defined(__cplusplus) || defined(c_plusplus)