2 Copyright 1999-2012 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 *restrict image,
33 const Quantum *restrict pixel)
35 if (image->channel_map[AlphaPixelChannel].traits == UndefinedPixelTrait)
37 return(pixel[image->channel_map[AlphaPixelChannel].offset]);
40 static inline PixelTrait GetPixelAlphaTraits(const Image *restrict image)
42 return(image->channel_map[AlphaPixelChannel].traits);
45 static inline Quantum GetPixelBlack(const Image *restrict image,
46 const Quantum *restrict pixel)
48 if (image->channel_map[BlackPixelChannel].traits == UndefinedPixelTrait)
50 return(pixel[image->channel_map[BlackPixelChannel].offset]);
53 static inline PixelTrait GetPixelBlackTraits(const Image *restrict image)
55 return(image->channel_map[BlackPixelChannel].traits);
58 static inline Quantum GetPixelBlue(const Image *restrict image,
59 const Quantum *restrict pixel)
61 return(pixel[image->channel_map[BluePixelChannel].offset]);
64 static inline PixelTrait GetPixelBlueTraits(const Image *restrict image)
66 return(image->channel_map[BluePixelChannel].traits);
69 static inline Quantum GetPixelCb(const Image *restrict image,
70 const Quantum *restrict pixel)
72 return(pixel[image->channel_map[CbPixelChannel].offset]);
75 static inline PixelTrait GetPixelCbTraits(const Image *restrict image)
77 return(image->channel_map[CbPixelChannel].traits);
80 static inline Quantum GetPixelChannel(const Image *restrict image,
81 const PixelChannel channel,const Quantum *restrict pixel)
83 if (image->channel_map[channel].traits == UndefinedPixelTrait)
85 return(pixel[image->channel_map[channel].offset]);
88 static inline PixelChannel GetPixelChannelMapChannel(
89 const Image *restrict image,const ssize_t offset)
91 return(image->channel_map[offset].channel);
94 static inline ssize_t GetPixelChannelMapOffset(const Image *restrict image,
95 const PixelChannel channel)
97 return(image->channel_map[channel].offset);
100 static inline PixelTrait GetPixelChannelMapTraits(const Image *restrict image,
101 const PixelChannel channel)
103 return(image->channel_map[channel].traits);
106 static inline size_t GetPixelChannels(const Image *restrict image)
108 return(image->number_channels);
111 static inline Quantum GetPixelCr(const Image *restrict image,
112 const Quantum *restrict pixel)
114 return(pixel[image->channel_map[CrPixelChannel].offset]);
117 static inline PixelTrait GetPixelCrTraits(const Image *restrict image)
119 return(image->channel_map[CrPixelChannel].traits);
122 static inline Quantum GetPixelCyan(const Image *restrict image,
123 const Quantum *restrict pixel)
125 return(pixel[image->channel_map[CyanPixelChannel].offset]);
128 static inline PixelTrait GetPixelCyanTraits(const Image *restrict image)
130 return(image->channel_map[CyanPixelChannel].traits);
133 static inline Quantum GetPixelGray(const Image *restrict image,
134 const Quantum *restrict pixel)
136 return(pixel[image->channel_map[GrayPixelChannel].offset]);
139 static inline PixelTrait GetPixelGrayTraits(const Image *restrict image)
141 return(image->channel_map[GrayPixelChannel].traits);
144 static inline Quantum GetPixelGreen(const Image *restrict image,
145 const Quantum *restrict pixel)
147 return(pixel[image->channel_map[GreenPixelChannel].offset]);
150 static inline PixelTrait GetPixelGreenTraits(const Image *restrict image)
152 return(image->channel_map[GreenPixelChannel].traits);
155 static inline Quantum GetPixelIndex(const Image *restrict image,
156 const Quantum *restrict pixel)
158 if (image->channel_map[IndexPixelChannel].traits == UndefinedPixelTrait)
160 return(pixel[image->channel_map[IndexPixelChannel].offset]);
163 static inline PixelTrait GetPixelIndexTraits(const Image *restrict image)
165 return(image->channel_map[IndexPixelChannel].traits);
168 static inline Quantum GetPixelInfoIntensity(
169 const PixelInfo *restrict pixel_info)
171 #if !defined(MAGICKCORE_HDRI_SUPPORT)
172 return((Quantum) (0.299*pixel_info->red+0.587*pixel_info->green+0.114*
173 pixel_info->blue+0.5));
175 return((Quantum) (0.299*pixel_info->red+0.587*pixel_info->green+0.114*
180 static inline Quantum GetPixelInfoLuminance(
181 const PixelInfo *restrict pixel_info)
186 #if !defined(MAGICKCORE_HDRI_SUPPORT)
187 luminance=(Quantum) (0.21267*pixel_info->red+0.71516*pixel_info->green+
188 0.07217*pixel_info->blue+0.5);
190 luminance=(Quantum) (0.21267*pixel_info->red+0.71516*pixel_info->green+
191 0.07217*pixel_info->blue);
193 return((Quantum) luminance);
196 static inline Quantum GetPixelIntensity(const Image *restrict image,
197 const Quantum *restrict pixel)
199 #if !defined(MAGICKCORE_HDRI_SUPPORT)
200 if ((pixel[image->channel_map[RedPixelChannel].offset] ==
201 pixel[image->channel_map[GreenPixelChannel].offset]) &&
202 (pixel[image->channel_map[GreenPixelChannel].offset] ==
203 pixel[image->channel_map[BluePixelChannel].offset]))
204 return(pixel[image->channel_map[RedPixelChannel].offset]);
205 return((Quantum) (0.299*pixel[image->channel_map[RedPixelChannel].offset]+
206 0.587*pixel[image->channel_map[GreenPixelChannel].offset]+0.114*
207 pixel[image->channel_map[BluePixelChannel].offset]+0.5));
214 alpha=pixel[image->channel_map[RedPixelChannel].offset]-(double)
215 pixel[image->channel_map[GreenPixelChannel].offset];
216 beta=pixel[image->channel_map[GreenPixelChannel].offset]-(double)
217 pixel[image->channel_map[BluePixelChannel].offset];
218 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
219 return(pixel[image->channel_map[RedPixelChannel].offset]);
220 return((Quantum) (0.299*pixel[image->channel_map[RedPixelChannel].offset]+
221 0.587*pixel[image->channel_map[GreenPixelChannel].offset]+0.114*
222 pixel[image->channel_map[BluePixelChannel].offset]));
227 static inline Quantum GetPixelLuminance(const Image *restrict image,
228 const Quantum *restrict pixel)
230 #if !defined(MAGICKCORE_HDRI_SUPPORT)
231 return((Quantum) (0.21267*pixel[image->channel_map[RedPixelChannel].offset]+
232 0.71516*pixel[image->channel_map[GreenPixelChannel].offset]+0.07217*
233 pixel[image->channel_map[BluePixelChannel].offset]+0.5));
235 return((Quantum) (0.21267*pixel[image->channel_map[RedPixelChannel].offset]+
236 0.71516*pixel[image->channel_map[GreenPixelChannel].offset]+0.07217*
237 pixel[image->channel_map[BluePixelChannel].offset]));
241 static inline Quantum GetPixelMagenta(const Image *restrict image,
242 const Quantum *restrict pixel)
244 return(pixel[image->channel_map[MagentaPixelChannel].offset]);
247 static inline PixelTrait GetPixelMagentaTraits(const Image *restrict image)
249 return(image->channel_map[MagentaPixelChannel].traits);
252 static inline size_t GetPixelMetaChannels(const Image *restrict image)
254 return(image->number_meta_channels);
257 static inline size_t GetPixelMetacontentExtent(const Image *restrict image)
259 return(image->metacontent_extent);
262 static inline Quantum GetPixelOpacity(const Image *restrict image,
263 const Quantum *restrict pixel)
265 if (image->channel_map[AlphaPixelChannel].traits == UndefinedPixelTrait)
266 return(QuantumRange-OpaqueAlpha);
267 return(QuantumRange-pixel[image->channel_map[AlphaPixelChannel].offset]);
270 static inline Quantum GetPixelRed(const Image *restrict image,
271 const Quantum *restrict pixel)
273 return(pixel[image->channel_map[RedPixelChannel].offset]);
276 static inline PixelTrait GetPixelRedTraits(const Image *restrict image)
278 return(image->channel_map[RedPixelChannel].traits);
281 static inline void GetPixelInfoPixel(const Image *restrict image,
282 const Quantum *restrict pixel,PixelInfo *restrict pixel_info)
284 pixel_info->red=(MagickRealType)
285 pixel[image->channel_map[RedPixelChannel].offset];
286 pixel_info->green=(MagickRealType)
287 pixel[image->channel_map[GreenPixelChannel].offset];
288 pixel_info->blue=(MagickRealType)
289 pixel[image->channel_map[BluePixelChannel].offset];
291 if (image->channel_map[BlackPixelChannel].traits != UndefinedPixelTrait)
292 pixel_info->black=(MagickRealType)
293 pixel[image->channel_map[BlackPixelChannel].offset];
294 pixel_info->alpha=OpaqueAlpha;
295 if (image->channel_map[AlphaPixelChannel].traits != UndefinedPixelTrait)
296 pixel_info->alpha=(MagickRealType)
297 pixel[image->channel_map[AlphaPixelChannel].offset];
299 if (image->channel_map[IndexPixelChannel].traits != UndefinedPixelTrait)
300 pixel_info->index=(MagickRealType)
301 pixel[image->channel_map[IndexPixelChannel].offset];
304 static inline PixelTrait GetPixelTraits(const Image *restrict image,
305 const PixelChannel channel)
307 return(image->channel_map[channel].traits);
310 static inline Quantum GetPixelY(const Image *restrict image,
311 const Quantum *restrict pixel)
313 return(pixel[image->channel_map[YPixelChannel].offset]);
316 static inline PixelTrait GetPixelYTraits(const Image *restrict image)
318 return(image->channel_map[YPixelChannel].traits);
321 static inline Quantum GetPixelYellow(const Image *restrict image,
322 const Quantum *restrict pixel)
324 return(pixel[image->channel_map[YellowPixelChannel].offset]);
327 static inline PixelTrait GetPixelYellowTraits(const Image *restrict image)
329 return(image->channel_map[YellowPixelChannel].traits);
332 static inline MagickBooleanType IsPixelEquivalent(const Image *restrict image,
333 const Quantum *restrict p,const PixelInfo *restrict q)
335 if (((double) p[image->channel_map[RedPixelChannel].offset] == q->red) &&
336 ((double) p[image->channel_map[GreenPixelChannel].offset] == q->green) &&
337 ((double) p[image->channel_map[BluePixelChannel].offset] == q->blue))
342 static inline MagickBooleanType IsPixelGray(const Image *restrict image,
343 const Quantum *restrict pixel)
345 #if !defined(MAGICKCORE_HDRI_SUPPORT)
346 if ((pixel[image->channel_map[RedPixelChannel].offset] ==
347 pixel[image->channel_map[GreenPixelChannel].offset]) &&
348 (pixel[image->channel_map[GreenPixelChannel].offset] ==
349 pixel[image->channel_map[BluePixelChannel].offset]))
357 alpha=pixel[image->channel_map[RedPixelChannel].offset]-(double)
358 pixel[image->channel_map[GreenPixelChannel].offset];
359 beta=pixel[image->channel_map[GreenPixelChannel].offset]-(double)
360 pixel[image->channel_map[BluePixelChannel].offset];
361 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
368 static inline MagickBooleanType IsPixelInfoEquivalent(
369 const PixelInfo *restrict p,const PixelInfo *restrict q)
371 if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
372 (fabs(p->alpha-OpaqueAlpha) > 0.5))
374 if ((q->matte != MagickFalse) && (p->matte == MagickFalse) &&
375 (fabs(q->alpha-OpaqueAlpha)) > 0.5)
377 if ((p->matte != MagickFalse) && (q->matte != MagickFalse))
379 if (fabs(p->alpha-q->alpha) > 0.5)
381 if (fabs(p->alpha-TransparentAlpha) <= 0.5)
384 if (fabs(p->red-q->red) > 0.5)
386 if (fabs(p->green-q->green) > 0.5)
388 if (fabs(p->blue-q->blue) > 0.5)
390 if ((p->colorspace == CMYKColorspace) && (fabs(p->black-q->black) > 0.5))
395 static inline MagickBooleanType IsPixelMonochrome(const Image *restrict image,
396 const Quantum *restrict pixel)
398 #if !defined(MAGICKCORE_HDRI_SUPPORT)
399 if (((pixel[image->channel_map[RedPixelChannel].offset] == 0) ||
400 (pixel[image->channel_map[RedPixelChannel].offset] == (Quantum) QuantumRange)) &&
401 (pixel[image->channel_map[RedPixelChannel].offset] ==
402 pixel[image->channel_map[GreenPixelChannel].offset]) &&
403 (pixel[image->channel_map[GreenPixelChannel].offset] ==
404 pixel[image->channel_map[BluePixelChannel].offset]))
412 alpha=pixel[image->channel_map[RedPixelChannel].offset]-(double)
413 pixel[image->channel_map[GreenPixelChannel].offset];
414 beta=pixel[image->channel_map[GreenPixelChannel].offset]-(double)
415 pixel[image->channel_map[BluePixelChannel].offset];
416 if (((fabs(pixel[image->channel_map[RedPixelChannel].offset]) <= MagickEpsilon) ||
417 (fabs(pixel[image->channel_map[RedPixelChannel].offset]-QuantumRange) <= MagickEpsilon)) &&
418 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
425 static inline MagickBooleanType IsPixelInfoGray(
426 const PixelInfo *restrict pixel_info)
428 #if !defined(MAGICKCORE_HDRI_SUPPORT)
429 if ((pixel_info->red == pixel_info->green) &&
430 (pixel_info->green == pixel_info->blue))
438 alpha=pixel_info->red-(double) pixel_info->green;
439 beta=pixel_info->green-(double) pixel_info->blue;
440 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
447 static inline MagickBooleanType IsPixelInfoMonochrome(
448 const PixelInfo *restrict pixel_info)
450 #if !defined(MAGICKCORE_HDRI_SUPPORT)
451 if (((pixel_info->red == 0) || (pixel_info->red == (Quantum) QuantumRange)) &&
452 (pixel_info->red == pixel_info->green) &&
453 (pixel_info->green == pixel_info->blue))
461 alpha=pixel_info->red-(double) pixel_info->green;
462 beta=pixel_info->green-(double) pixel_info->blue;
463 if (((fabs(pixel_info->red) <= MagickEpsilon) ||
464 (fabs(pixel_info->red-QuantumRange) <= MagickEpsilon)) &&
465 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
472 static inline void SetPixelAlpha(const Image *restrict image,
473 const Quantum alpha,Quantum *restrict pixel)
475 if (image->channel_map[AlphaPixelChannel].traits != UndefinedPixelTrait)
476 pixel[image->channel_map[AlphaPixelChannel].offset]=alpha;
479 static inline void SetPixelAlphaTraits(Image *image,const PixelTrait traits)
481 image->channel_map[AlphaPixelChannel].traits=traits;
484 static inline void SetPixelBlack(const Image *restrict image,
485 const Quantum black,Quantum *restrict pixel)
487 if (image->channel_map[BlackPixelChannel].traits != UndefinedPixelTrait)
488 pixel[image->channel_map[BlackPixelChannel].offset]=black;
491 static inline void SetPixelBlackTraits(Image *image,const PixelTrait traits)
493 image->channel_map[BlackPixelChannel].traits=traits;
496 static inline void SetPixelBlue(const Image *restrict image,const Quantum blue,
497 Quantum *restrict pixel)
499 pixel[image->channel_map[BluePixelChannel].offset]=blue;
502 static inline void SetPixelBlueTraits(Image *image,const PixelTrait traits)
504 image->channel_map[BluePixelChannel].traits=traits;
507 static inline void SetPixelCb(const Image *restrict image,const Quantum cb,
508 Quantum *restrict pixel)
510 pixel[image->channel_map[CbPixelChannel].offset]=cb;
513 static inline void SetPixelCbTraits(Image *image,const PixelTrait traits)
515 image->channel_map[CbPixelChannel].traits=traits;
518 static inline void SetPixelChannel(const Image *restrict image,
519 const PixelChannel channel,const Quantum quantum,Quantum *restrict pixel)
521 if (image->channel_map[channel].traits != UndefinedPixelTrait)
522 pixel[image->channel_map[channel].offset]=quantum;
525 static inline void SetPixelChannelMapChannel(const Image *restrict image,
526 const PixelChannel channel,const ssize_t offset)
528 image->channel_map[offset].channel=channel;
529 image->channel_map[channel].offset=offset;
532 static inline void SetPixelChannelMap(const Image *restrict image,
533 const PixelChannel channel,const PixelTrait traits,const ssize_t offset)
535 image->channel_map[offset].channel=channel;
536 image->channel_map[channel].offset=offset;
537 image->channel_map[channel].traits=traits;
540 static inline void SetPixelChannels(Image *image,const size_t number_channels)
542 image->number_channels=number_channels;
545 static inline void SetPixelChannelTraits(Image *image,
546 const PixelChannel channel,const PixelTrait traits)
548 image->channel_map[channel].traits=traits;
551 static inline void SetPixelChannelMapTraits(Image *image,
552 const PixelChannel channel,const PixelTrait traits)
554 image->channel_map[channel].traits=traits;
557 static inline void SetPixelCr(const Image *restrict image,const Quantum cr,
558 Quantum *restrict pixel)
560 pixel[image->channel_map[CrPixelChannel].offset]=cr;
563 static inline void SetPixelCrTraits(Image *image,const PixelTrait traits)
565 image->channel_map[CrPixelChannel].traits=traits;
568 static inline void SetPixelCyan(const Image *restrict image,const Quantum cyan,
569 Quantum *restrict pixel)
571 pixel[image->channel_map[CyanPixelChannel].offset]=cyan;
574 static inline void SetPixelGray(const Image *restrict image,const Quantum gray,
575 Quantum *restrict pixel)
577 pixel[image->channel_map[GrayPixelChannel].offset]=gray;
580 static inline void SetPixelGrayTraits(Image *image,const PixelTrait traits)
582 image->channel_map[GrayPixelChannel].traits=traits;
585 static inline void SetPixelGreen(const Image *restrict image,
586 const Quantum green,Quantum *restrict pixel)
588 pixel[image->channel_map[GreenPixelChannel].offset]=green;
591 static inline void SetPixelGreenTraits(Image *image,const PixelTrait traits)
593 image->channel_map[GreenPixelChannel].traits=traits;
596 static inline void SetPixelIndex(const Image *restrict image,
597 const Quantum index,Quantum *restrict pixel)
599 if (image->channel_map[IndexPixelChannel].traits != UndefinedPixelTrait)
600 pixel[image->channel_map[IndexPixelChannel].offset]=index;
603 static inline void SetPixelIndexTraits(Image *image,const PixelTrait traits)
605 image->channel_map[IndexPixelChannel].traits=traits;
608 static inline void SetPixelInfoPixel(const Image *restrict image,
609 const PixelInfo *restrict pixel_info,Quantum *restrict pixel)
611 pixel[image->channel_map[RedPixelChannel].offset]=
612 ClampToQuantum(pixel_info->red);
613 pixel[image->channel_map[GreenPixelChannel].offset]=
614 ClampToQuantum(pixel_info->green);
615 pixel[image->channel_map[BluePixelChannel].offset]=
616 ClampToQuantum(pixel_info->blue);
617 if (image->channel_map[BlackPixelChannel].traits != UndefinedPixelTrait)
618 pixel[image->channel_map[BlackPixelChannel].offset]=
619 ClampToQuantum(pixel_info->black);
620 if (image->channel_map[AlphaPixelChannel].traits != UndefinedPixelTrait)
621 pixel[image->channel_map[AlphaPixelChannel].offset]=pixel_info->matte ==
622 MagickFalse ? OpaqueAlpha : ClampToQuantum(pixel_info->alpha);
625 static inline void SetPixelMagenta(const Image *restrict image,
626 const Quantum magenta,Quantum *restrict pixel)
628 pixel[image->channel_map[MagentaPixelChannel].offset]=magenta;
631 static inline void SetPixelMagentaTraits(Image *image,const PixelTrait traits)
633 image->channel_map[MagentaPixelChannel].traits=traits;
636 static inline void SetPixelMetaChannels(Image *image,
637 const size_t number_meta_channels)
639 image->number_meta_channels=number_meta_channels;
642 static inline void SetPixelMetacontentExtent(Image *image,const size_t extent)
644 image->metacontent_extent=extent;
647 static inline void SetPixelOpacity(const Image *restrict image,
648 const Quantum alpha,Quantum *restrict pixel)
650 if (image->channel_map[AlphaPixelChannel].traits != UndefinedPixelTrait)
651 pixel[image->channel_map[AlphaPixelChannel].offset]=QuantumRange-alpha;
654 static inline void SetPixelRed(const Image *restrict image,const Quantum red,
655 Quantum *restrict pixel)
657 pixel[image->channel_map[RedPixelChannel].offset]=red;
660 static inline void SetPixelRedTraits(Image *image,const PixelTrait traits)
662 image->channel_map[RedPixelChannel].traits=traits;
665 static inline void SetPixelYellow(const Image *restrict image,
666 const Quantum yellow,Quantum *restrict pixel)
668 pixel[image->channel_map[YellowPixelChannel].offset]=yellow;
671 static inline void SetPixelYellowTraits(Image *image,const PixelTrait traits)
673 image->channel_map[YellowPixelChannel].traits=traits;
676 static inline void SetPixelY(const Image *restrict image,const Quantum y,
677 Quantum *restrict pixel)
679 pixel[image->channel_map[YPixelChannel].offset]=y;
682 static inline void SetPixelYTraits(Image *image,const PixelTrait traits)
684 image->channel_map[YPixelChannel].traits=traits;
687 #if defined(__cplusplus) || defined(c_plusplus)