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>
30 static inline Quantum GetPixelAlpha(const Image *image,const Quantum *pixel)
32 return(pixel[image->component_map[image->map][AlphaPixelComponent].component]);
35 static inline PixelTrait GetPixelAlphaTraits(const Image *image)
37 return(image->component_map[image->map][AlphaPixelComponent].traits);
40 static inline Quantum GetPixelBlack(const Image *image,const Quantum *pixel)
42 return(pixel[image->component_map[image->map][BlackPixelComponent].component]);
45 static inline PixelTrait GetPixelBlackTraits(const Image *image)
47 return(image->component_map[image->map][BlackPixelComponent].traits);
50 static inline Quantum GetPixelBlue(const Image *image,const Quantum *pixel)
52 return(pixel[image->component_map[image->map][BluePixelComponent].component]);
55 static inline PixelTrait GetPixelBlueTraits(const Image *image)
57 return(image->component_map[image->map][BluePixelComponent].traits);
60 static inline Quantum GetPixelCb(const Image *image,const Quantum *pixel)
62 return(pixel[image->component_map[image->map][CbPixelComponent].component]);
65 static inline Quantum GetPixelComponent(const Image *image,
66 const PixelComponent component,const Quantum *pixel)
68 return(pixel[image->component_map[image->map][component].component]);
71 static inline PixelTrait GetPixelComponentTraits(const Image *image,
72 const PixelComponent component)
74 return(image->component_map[image->map][component].traits);
77 static inline PixelTrait GetPixelCbTraits(const Image *image)
79 return(image->component_map[image->map][CbPixelComponent].traits);
82 static inline Quantum GetPixelComponentMapComponent(const Image *image,
83 const PixelComponent component)
85 return(image->component_map[image->map][component].component);
88 static inline PixelTrait GetPixelComponentMapTraits(const Image *image,
89 const PixelComponent component)
91 return(image->component_map[image->map][component].traits);
94 static inline size_t GetPixelComponents(const Image *image)
96 return(image->pixel_components);
99 static inline Quantum GetPixelCr(const Image *image,const Quantum *pixel)
101 return(pixel[image->component_map[image->map][CrPixelComponent].component]);
104 static inline PixelTrait GetPixelCrTraits(const Image *image)
106 return(image->component_map[image->map][CrPixelComponent].traits);
109 static inline Quantum GetPixelCyan(const Image *image,const Quantum *pixel)
111 return(pixel[image->component_map[image->map][CyanPixelComponent].component]);
114 static inline PixelTrait GetPixelCyanTraits(const Image *image)
116 return(image->component_map[image->map][CyanPixelComponent].traits);
119 static inline Quantum GetPixelGray(const Image *image,const Quantum *pixel)
121 return(pixel[image->component_map[image->map][GrayPixelComponent].component]);
124 static inline PixelTrait GetPixelGrayTraits(const Image *image)
126 return(image->component_map[image->map][GrayPixelComponent].traits);
129 static inline Quantum GetPixelGreen(const Image *image,const Quantum *pixel)
131 return(pixel[image->component_map[image->map][GreenPixelComponent].component]);
134 static inline PixelTrait GetPixelGreenTraits(const Image *image)
136 return(image->component_map[image->map][GreenPixelComponent].traits);
139 static inline Quantum GetPixelIndex(const Image *image,const Quantum *pixel)
141 return(pixel[image->component_map[image->map][IndexPixelComponent].component]);
144 static inline PixelTrait GetPixelIndexTraits(const Image *image)
146 return(image->component_map[image->map][IndexPixelComponent].traits);
149 static inline Quantum GetPixelInfoIntensity(const PixelInfo *pixel_info)
151 #if !defined(MAGICKCORE_HDRI_SUPPORT)
152 return((Quantum) (0.299*pixel_info->red+0.587*pixel_info->green+0.114*pixel_info->blue+0.5));
154 return((Quantum) (0.299*pixel_info->red+0.587*pixel_info->green+0.114*pixel_info->blue));
158 static inline Quantum GetPixelInfoLuminance(const PixelInfo *pixel_info)
163 #if !defined(MAGICKCORE_HDRI_SUPPORT)
164 luminance=(Quantum) (0.21267*pixel_info->red+0.71516*pixel_info->green+
165 0.07217*pixel_info->blue+0.5);
167 luminance=(Quantum) (0.21267*pixel_info->red+0.71516*pixel_info->green+
168 0.07217*pixel_info->blue);
170 return((Quantum) luminance);
173 static inline Quantum GetPixelMagenta(const Image *image,
174 const Quantum *pixel)
176 return(pixel[image->component_map[image->map][MagentaPixelComponent].component]);
179 static inline PixelTrait GetPixelMagentaTraits(const Image *image)
181 return(image->component_map[image->map][MagentaPixelComponent].traits);
184 static inline size_t GetPixelMetacontentExtent(const Image *image)
186 return(image->metacontent_extent);
189 static inline Quantum GetPixelRed(const Image *image,const Quantum *pixel)
191 return(pixel[image->component_map[image->map][RedPixelComponent].component]);
194 static inline PixelTrait GetPixelRedTraits(const Image *image)
196 return(image->component_map[image->map][RedPixelComponent].traits);
199 static inline void GetPixelPacket(const Image *image,const Quantum *pixel,
202 packet->red=GetPixelRed(image,pixel);
203 packet->green=GetPixelGreen(image,pixel);
204 packet->blue=GetPixelBlue(image,pixel);
205 packet->alpha=GetPixelAlpha(image,pixel);
208 static inline Quantum GetPixelPacketIntensity(const PixelPacket *pixel)
210 #if !defined(MAGICKCORE_HDRI_SUPPORT)
211 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
213 return((Quantum) (0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue+0.5));
220 alpha=pixel->red-pixel->green;
221 beta=pixel->green-pixel->blue;
222 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
224 return((Quantum) (0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue));
229 static inline PixelTrait GetPixelTraits(const Image *image,
230 const PixelComponent component)
232 return(image->component_map[image->map][component].traits);
235 static inline Quantum GetPixelY(const Image *image,const Quantum *pixel)
237 return(pixel[image->component_map[image->map][YPixelComponent].component]);
240 static inline PixelTrait GetPixelYTraits(const Image *image)
242 return(image->component_map[image->map][YPixelComponent].traits);
245 static inline Quantum GetPixelYellow(const Image *image,
246 const Quantum *pixel)
248 return(pixel[image->component_map[image->map][YellowPixelComponent].component]);
251 static inline PixelTrait GetPixelYellowTraits(const Image *image)
253 return(image->component_map[image->map][YellowPixelComponent].traits);
256 static inline MagickBooleanType IsPixelEquivalent(const Image *image,
257 const Quantum *p,const PixelPacket *q)
259 if ((GetPixelRed(image,p) == q->red) &&
260 (GetPixelGreen(image,p) == q->green) &&
261 (GetPixelBlue(image,p) == q->blue))
266 static inline MagickBooleanType IsPixelGray(const Image *image,
267 const Quantum *pixel)
269 #if !defined(MAGICKCORE_HDRI_SUPPORT)
270 if ((GetPixelRed(image,pixel) == GetPixelGreen(image,pixel)) &&
271 (GetPixelGreen(image,pixel) == GetPixelBlue(image,pixel)))
279 alpha=GetPixelRed(image,pixel)-(double) GetPixelGreen(image,pixel);
280 beta=GetPixelGreen(image,pixel)-(double) GetPixelBlue(image,pixel);
281 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
288 static inline MagickBooleanType IsPixelInfoEquivalent(const PixelInfo *p,
291 #if !defined(MAGICKCORE_HDRI_SUPPORT)
292 if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
293 (p->alpha != OpaqueAlpha))
295 if ((q->matte != MagickFalse) && (p->matte == MagickFalse) &&
296 (q->alpha != OpaqueAlpha))
298 if ((p->matte != MagickFalse) && (q->matte != MagickFalse))
300 if (p->alpha != q->alpha)
302 if (p->alpha == TransparentAlpha)
305 if (p->red != q->red)
307 if (p->green != q->green)
309 if (p->blue != q->blue)
311 if ((p->colorspace == CMYKColorspace) && (p->black != q->black))
314 if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
315 (fabs(p->alpha-OpaqueAlpha) > 0.5))
317 if ((q->matte != MagickFalse) && (p->matte == MagickFalse) &&
318 (fabs(q->alpha-OpaqueAlpha)) > 0.5)
320 if ((p->matte != MagickFalse) && (q->matte != MagickFalse))
322 if (fabs(p->alpha-q->alpha) > 0.5)
324 if (fabs(p->alpha-TransparentAlpha) <= 0.5)
327 if (fabs(p->red-q->red) > 0.5)
329 if (fabs(p->green-q->green) > 0.5)
331 if (fabs(p->blue-q->blue) > 0.5)
333 if ((p->colorspace == CMYKColorspace) && (fabs(p->black-q->black) > 0.5))
339 static inline MagickBooleanType IsPixelMonochrome(const Image *image,
340 const Quantum *pixel)
342 #if !defined(MAGICKCORE_HDRI_SUPPORT)
343 if (((GetPixelRed(image,pixel) == 0) ||
344 (GetPixelRed(image,pixel) == (Quantum) QuantumRange)) &&
345 (GetPixelRed(image,pixel) == GetPixelGreen(image,pixel)) &&
346 (GetPixelGreen(image,pixel) == GetPixelBlue(image,pixel)))
354 alpha=GetPixelRed(image,pixel)-(double) GetPixelGreen(image,pixel);
355 beta=GetPixelGreen(image,pixel)-(double) GetPixelBlue(image,pixel);
356 if (((fabs(GetPixelRed(image,pixel)) <= MagickEpsilon) ||
357 (fabs(GetPixelRed(image,pixel)-QuantumRange) <= MagickEpsilon)) &&
358 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
365 static inline MagickBooleanType IsPixelPacketEquivalent(const PixelPacket *p,
366 const PixelPacket *q)
368 if ((p->red == q->red) && (p->green == q->green) && (p->blue == q->blue))
373 static inline MagickBooleanType IsPixelPacketGray(const PixelPacket *pixel)
375 #if !defined(MAGICKCORE_HDRI_SUPPORT)
376 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
384 alpha=pixel->red-(double) pixel->green;
385 beta=pixel->green-(double) pixel->blue;
386 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
393 static inline MagickBooleanType IsPixelPacketMonochrome(
394 const PixelPacket *pixel)
396 #if !defined(MAGICKCORE_HDRI_SUPPORT)
397 if (((pixel->red == 0) || (pixel->red == (Quantum) QuantumRange)) &&
398 (pixel->red == pixel->green) && (pixel->green == pixel->blue))
406 alpha=pixel->red-(double) pixel->green;
407 beta=pixel->green-(double) pixel->blue;
408 if (((fabs(pixel->red) <= MagickEpsilon) ||
409 (fabs(pixel->red-QuantumRange) <= MagickEpsilon)) &&
410 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
417 static inline void SetPacketPixelInfo(const Image *image,
418 const PixelInfo *pixel_info,PixelPacket *packet)
420 packet->red=ClampToQuantum(pixel_info->red);
421 packet->green=ClampToQuantum(pixel_info->green);
422 packet->blue=ClampToQuantum(pixel_info->blue);
423 packet->alpha=ClampToQuantum(pixel_info->alpha);
424 if (image->colorspace == CMYKColorspace)
425 packet->black=ClampToQuantum(pixel_info->black);
426 if (image->storage_class == PseudoClass)
427 packet->index=ClampToQuantum(pixel_info->index);
430 static inline void SetPixelAlpha(const Image *image,const Quantum alpha,
433 pixel[image->component_map[image->map][AlphaPixelComponent].component]=alpha;
436 static inline void SetPixelAlphaTraits(Image *image,const PixelTrait traits)
438 image->component_map[image->map][AlphaPixelComponent].traits=traits;
441 static inline void SetPixelBlack(const Image *image,const Quantum black,
444 pixel[image->component_map[image->map][BlackPixelComponent].component]=black;
447 static inline void SetPixelBlackTraits(Image *image,const PixelTrait traits)
449 image->component_map[image->map][BlackPixelComponent].traits=traits;
452 static inline void SetPixelBlue(const Image *image,const Quantum blue,
455 pixel[image->component_map[image->map][BluePixelComponent].component]=blue;
458 static inline void SetPixelBlueTraits(Image *image,const PixelTrait traits)
460 image->component_map[image->map][BluePixelComponent].traits=traits;
463 static inline void SetPixelCb(const Image *image,const Quantum cb,
466 pixel[image->component_map[image->map][CbPixelComponent].component]=cb;
469 static inline void SetPixelCbTraits(Image *image,const PixelTrait traits)
471 image->component_map[image->map][CbPixelComponent].traits=traits;
474 static inline void SetPixelComponent(const Image *image,
475 const PixelComponent component,const Quantum quantum,Quantum *pixel)
477 pixel[image->component_map[image->map][component].component]=quantum;
480 static inline void SetPixelComponentMapComponent(const Image *image,
481 const PixelComponent component,const PixelComponent components)
483 image->component_map[image->map][component].component=components;
486 static inline void SetPixelComponents(Image *image,const size_t channels)
488 image->pixel_components=channels;
491 static inline void SetPixelComponentTraits(Image *image,
492 const PixelComponent component,const PixelTrait traits)
494 image->component_map[image->map][component].traits=traits;
497 static inline void SetPixelComponentMapTraits(Image *image,
498 const PixelComponent component,const PixelTrait traits)
500 image->component_map[image->map][component].traits=traits;
503 static inline void SetPixelCr(const Image *image,const Quantum cr,
506 pixel[image->component_map[image->map][CrPixelComponent].component]=cr;
509 static inline void SetPixelCrTraits(Image *image,const PixelTrait traits)
511 image->component_map[image->map][CrPixelComponent].traits=traits;
514 static inline void SetPixelCyan(const Image *image,const Quantum cyan,
517 pixel[image->component_map[image->map][CyanPixelComponent].component]=cyan;
520 static inline void SetPixelGray(const Image *image,const Quantum gray,
523 pixel[image->component_map[image->map][GrayPixelComponent].component]=gray;
526 static inline void SetPixelGrayTraits(Image *image,const PixelTrait traits)
528 image->component_map[image->map][GrayPixelComponent].traits=traits;
531 static inline void SetPixelGreen(const Image *image,const Quantum green,
534 pixel[image->component_map[image->map][GreenPixelComponent].component]=green;
537 static inline void SetPixelGreenTraits(Image *image,const PixelTrait traits)
539 image->component_map[image->map][GreenPixelComponent].traits=traits;
542 static inline void SetPixelIndex(const Image *image,const Quantum index,
545 pixel[image->component_map[image->map][IndexPixelComponent].component]=index;
548 static inline void SetPixelIndexTraits(Image *image,const PixelTrait traits)
550 image->component_map[image->map][IndexPixelComponent].traits=traits;
553 static inline void SetPixelInfo(const Image *image,const Quantum *pixel,
554 PixelInfo *pixel_info)
556 pixel_info->red=(MagickRealType) GetPixelRed(image,pixel);
557 pixel_info->green=(MagickRealType) GetPixelGreen(image,pixel);
558 pixel_info->blue=(MagickRealType) GetPixelBlue(image,pixel);
559 pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
560 if (image->colorspace == CMYKColorspace)
561 pixel_info->black=(MagickRealType) GetPixelBlack(image,pixel);
562 if (image->storage_class == PseudoClass)
563 pixel_info->index=(MagickRealType) GetPixelIndex(image,pixel);
566 static inline void SetPixelInfoBias(const Image *image,
567 PixelInfo *pixel_info)
570 Obsoleted by MorphologyApply().
572 pixel_info->red=image->bias;
573 pixel_info->green=image->bias;
574 pixel_info->blue=image->bias;
575 pixel_info->alpha=image->bias;
576 pixel_info->black=image->bias;
579 static inline void SetPixelInfoPacket(const Image *image,
580 const PixelPacket *pixel,PixelInfo *pixel_info)
582 pixel_info->red=(MagickRealType) pixel->red;
583 pixel_info->green=(MagickRealType) pixel->green;
584 pixel_info->blue=(MagickRealType) pixel->blue;
585 pixel_info->alpha=(MagickRealType) pixel->alpha;
586 if (image->colorspace == CMYKColorspace)
587 pixel_info->black=(MagickRealType) pixel->black;
588 if (image->storage_class == PseudoClass)
589 pixel_info->index=(MagickRealType) pixel->index;
592 static inline void SetPixelMagenta(const Image *image,const Quantum magenta,
595 pixel[image->component_map[image->map][MagentaPixelComponent].component]=
599 static inline void SetPixelMagentaTraits(Image *image,const PixelTrait traits)
601 image->component_map[image->map][MagentaPixelComponent].traits=traits;
604 static inline void SetPixelMetacontentExtent(Image *image,const size_t extent)
606 image->metacontent_extent=extent;
609 static inline void SetPixelRed(const Image *image,const Quantum red,
612 pixel[image->component_map[image->map][RedPixelComponent].component]=red;
615 static inline void SetPixelRedTraits(Image *image,const PixelTrait traits)
617 image->component_map[image->map][RedPixelComponent].traits=traits;
620 static inline void SetPixelPacket(const Image *image,const PixelPacket *packet,
623 SetPixelRed(image,packet->red,pixel);
624 SetPixelGreen(image,packet->green,pixel);
625 SetPixelBlue(image,packet->blue,pixel);
626 SetPixelAlpha(image,packet->alpha,pixel);
629 static inline void SetPixelPixelInfo(const Image *image,
630 const PixelInfo *pixel_info,Quantum *packet)
632 SetPixelRed(image,ClampToQuantum(pixel_info->red),packet);
633 SetPixelGreen(image,ClampToQuantum(pixel_info->green),packet);
634 SetPixelBlue(image,ClampToQuantum(pixel_info->blue),packet);
635 SetPixelAlpha(image,ClampToQuantum(pixel_info->alpha),packet);
636 if (image->colorspace == CMYKColorspace)
637 SetPixelBlack(image,ClampToQuantum(pixel_info->black),packet);
640 static inline void SetPixelYellow(const Image *image,const Quantum yellow,
643 pixel[image->component_map[image->map][YellowPixelComponent].component]=
647 static inline void SetPixelYellowTraits(Image *image,const PixelTrait traits)
649 image->component_map[image->map][YellowPixelComponent].traits=traits;
652 static inline void SetPixelY(const Image *image,const Quantum y,Quantum *pixel)
654 pixel[image->component_map[image->map][YPixelComponent].component]=y;
657 static inline void SetPixelYTraits(Image *image,const PixelTrait traits)
659 image->component_map[image->map][YPixelComponent].traits=traits;
662 static inline Quantum GetPixelIntensity(const Image *image,
663 const Quantum *pixel)
665 #if !defined(MAGICKCORE_HDRI_SUPPORT)
666 if ((GetPixelRed(image,pixel) == GetPixelGreen(image,pixel)) &&
667 (GetPixelGreen(image,pixel) == GetPixelBlue(image,pixel)))
668 return(GetPixelRed(image,pixel));
669 return((Quantum) (0.299*GetPixelRed(image,pixel)+0.587*
670 GetPixelGreen(image,pixel)+0.114*GetPixelBlue(image,pixel)+0.5));
677 alpha=GetPixelRed(image,pixel)-(double) GetPixelGreen(image,pixel);
678 beta=GetPixelGreen(image,pixel)-(double) GetPixelBlue(image,pixel);
679 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
680 return(GetPixelRed(image,pixel));
681 return((Quantum) (0.299*GetPixelRed(image,pixel)+0.587*
682 GetPixelGreen(image,pixel)+0.114*GetPixelBlue(image,pixel)));
687 #if defined(__cplusplus) || defined(c_plusplus)