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[AlphaPixelComponent].component]);
35 static inline Quantum GetPixelBlack(const Image *image,const Quantum *pixel)
37 return(pixel[image->component_map[BlackPixelComponent].component]);
40 static inline Quantum GetPixelBlue(const Image *image,const Quantum *pixel)
42 return(pixel[image->component_map[BluePixelComponent].component]);
45 static inline Quantum GetPixelCb(const Image *image,const Quantum *pixel)
47 return(pixel[image->component_map[CbPixelComponent].component]);
50 static inline size_t GetPixelChannels(const Image *image)
52 return(image->pixel_channels);
55 static inline Quantum GetPixelCr(const Image *image,const Quantum *pixel)
57 return(pixel[image->component_map[CrPixelComponent].component]);
60 static inline Quantum GetPixelCyan(const Image *image,const Quantum *pixel)
62 return(pixel[image->component_map[CyanPixelComponent].component]);
65 static inline Quantum GetPixelGray(const Image *image,const Quantum *pixel)
67 return(pixel[image->component_map[GrayPixelComponent].component]);
70 static inline Quantum GetPixelGreen(const Image *image,const Quantum *pixel)
72 return(pixel[image->component_map[GreenPixelComponent].component]);
75 static inline Quantum GetPixelIndex(const Image *image,const Quantum *pixel)
77 return(pixel[image->component_map[IndexPixelComponent].component]);
80 static inline Quantum GetPixelInfoIntensity(const PixelInfo *pixel_info)
82 #if !defined(MAGICKCORE_HDRI_SUPPORT)
83 return((Quantum) (0.299*pixel_info->red+0.587*pixel_info->green+0.114*pixel_info->blue+0.5));
85 return((Quantum) (0.299*pixel_info->red+0.587*pixel_info->green+0.114*pixel_info->blue));
89 static inline Quantum GetPixelInfoLuminance(const PixelInfo *pixel_info)
94 #if !defined(MAGICKCORE_HDRI_SUPPORT)
95 luminance=(Quantum) (0.21267*pixel_info->red+0.71516*pixel_info->green+
96 0.07217*pixel_info->blue+0.5);
98 luminance=(Quantum) (0.21267*pixel_info->red+0.71516*pixel_info->green+
99 0.07217*pixel_info->blue);
101 return((Quantum) luminance);
104 static inline Quantum GetPixelMagenta(const Image *image,
105 const Quantum *pixel)
107 return(pixel[image->component_map[MagentaPixelComponent].component]);
110 static inline size_t GetPixelMetacontentExtent(const Image *image)
112 return(image->metacontent_extent);
115 static inline Quantum GetPixelRed(const Image *image,const Quantum *pixel)
117 return(pixel[image->component_map[RedPixelComponent].component]);
120 static inline void GetPixelPacket(const Image *image,const Quantum *pixel,
123 packet->red=GetPixelRed(image,pixel);
124 packet->green=GetPixelGreen(image,pixel);
125 packet->blue=GetPixelBlue(image,pixel);
126 packet->alpha=GetPixelAlpha(image,pixel);
129 static inline Quantum GetPixelPacketIntensity(const PixelPacket *pixel)
131 #if !defined(MAGICKCORE_HDRI_SUPPORT)
132 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
134 return((Quantum) (0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue+0.5));
141 alpha=pixel->red-pixel->green;
142 beta=pixel->green-pixel->blue;
143 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
145 return((Quantum) (0.299*pixel->red+0.587*pixel->green+0.114*pixel->blue));
150 static inline Quantum GetPixelY(const Image *image,const Quantum *pixel)
152 return(pixel[image->component_map[YPixelComponent].component]);
155 static inline Quantum GetPixelYellow(const Image *image,
156 const Quantum *pixel)
158 return(pixel[image->component_map[YellowPixelComponent].component]);
161 static inline MagickBooleanType IsPixelEquivalent(const Image *image,
162 const Quantum *p,const PixelPacket *q)
164 if ((GetPixelRed(image,p) == q->red) &&
165 (GetPixelGreen(image,p) == q->green) &&
166 (GetPixelBlue(image,p) == q->blue))
171 static inline MagickBooleanType IsPixelGray(const Image *image,
172 const Quantum *pixel)
174 #if !defined(MAGICKCORE_HDRI_SUPPORT)
175 if ((GetPixelRed(image,pixel) == GetPixelGreen(image,pixel)) &&
176 (GetPixelGreen(image,pixel) == GetPixelBlue(image,pixel)))
184 alpha=GetPixelRed(image,pixel)-(double) GetPixelGreen(image,pixel);
185 beta=GetPixelGreen(image,pixel)-(double) GetPixelBlue(image,pixel);
186 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
193 static inline MagickBooleanType IsPixelInfoEquivalent(const PixelInfo *p,
196 #if !defined(MAGICKCORE_HDRI_SUPPORT)
197 if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
198 (p->alpha != OpaqueAlpha))
200 if ((q->matte != MagickFalse) && (p->matte == MagickFalse) &&
201 (q->alpha != OpaqueAlpha))
203 if ((p->matte != MagickFalse) && (q->matte != MagickFalse))
205 if (p->alpha != q->alpha)
207 if (p->alpha == TransparentAlpha)
210 if (p->red != q->red)
212 if (p->green != q->green)
214 if (p->blue != q->blue)
216 if ((p->colorspace == CMYKColorspace) && (p->black != q->black))
219 if ((p->matte != MagickFalse) && (q->matte == MagickFalse) &&
220 (fabs(p->alpha-OpaqueAlpha) > 0.5))
222 if ((q->matte != MagickFalse) && (p->matte == MagickFalse) &&
223 (fabs(q->alpha-OpaqueAlpha)) > 0.5)
225 if ((p->matte != MagickFalse) && (q->matte != MagickFalse))
227 if (fabs(p->alpha-q->alpha) > 0.5)
229 if (fabs(p->alpha-TransparentAlpha) <= 0.5)
232 if (fabs(p->red-q->red) > 0.5)
234 if (fabs(p->green-q->green) > 0.5)
236 if (fabs(p->blue-q->blue) > 0.5)
238 if ((p->colorspace == CMYKColorspace) && (fabs(p->black-q->black) > 0.5))
244 static inline MagickBooleanType IsPixelMonochrome(const Image *image,
245 const Quantum *pixel)
247 #if !defined(MAGICKCORE_HDRI_SUPPORT)
248 if (((GetPixelRed(image,pixel) == 0) ||
249 (GetPixelRed(image,pixel) == (Quantum) QuantumRange)) &&
250 (GetPixelRed(image,pixel) == GetPixelGreen(image,pixel)) &&
251 (GetPixelGreen(image,pixel) == GetPixelBlue(image,pixel)))
259 alpha=GetPixelRed(image,pixel)-(double) GetPixelGreen(image,pixel);
260 beta=GetPixelGreen(image,pixel)-(double) GetPixelBlue(image,pixel);
261 if (((fabs(GetPixelRed(image,pixel)) <= MagickEpsilon) ||
262 (fabs(GetPixelRed(image,pixel)-QuantumRange) <= MagickEpsilon)) &&
263 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
270 static inline MagickBooleanType IsPixelPacketEquivalent(const PixelPacket *p,
271 const PixelPacket *q)
273 if ((p->red == q->red) && (p->green == q->green) && (p->blue == q->blue))
278 static inline MagickBooleanType IsPixelPacketGray(const PixelPacket *pixel)
280 #if !defined(MAGICKCORE_HDRI_SUPPORT)
281 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
289 alpha=pixel->red-(double) pixel->green;
290 beta=pixel->green-(double) pixel->blue;
291 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
298 static inline MagickBooleanType IsPixelPacketMonochrome(
299 const PixelPacket *pixel)
301 #if !defined(MAGICKCORE_HDRI_SUPPORT)
302 if (((pixel->red == 0) || (pixel->red == (Quantum) QuantumRange)) &&
303 (pixel->red == pixel->green) && (pixel->green == pixel->blue))
311 alpha=pixel->red-(double) pixel->green;
312 beta=pixel->green-(double) pixel->blue;
313 if (((fabs(pixel->red) <= MagickEpsilon) ||
314 (fabs(pixel->red-QuantumRange) <= MagickEpsilon)) &&
315 (fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
322 static inline void SetPacketPixelInfo(const Image *image,
323 const PixelInfo *pixel_info,PixelPacket *packet)
325 packet->red=ClampToQuantum(pixel_info->red);
326 packet->green=ClampToQuantum(pixel_info->green);
327 packet->blue=ClampToQuantum(pixel_info->blue);
328 packet->alpha=ClampToQuantum(pixel_info->alpha);
329 if (image->colorspace == CMYKColorspace)
330 packet->black=ClampToQuantum(pixel_info->black);
331 if (image->storage_class == PseudoClass)
332 packet->index=ClampToQuantum(pixel_info->index);
335 static inline void SetPixelAlpha(const Image *image,const Quantum alpha,
338 pixel[image->component_map[AlphaPixelComponent].component]=alpha;
341 static inline void SetPixelBlack(const Image *image,const Quantum black,
344 pixel[image->component_map[BlackPixelComponent].component]=black;
347 static inline void SetPixelBlue(const Image *image,const Quantum blue,
350 pixel[image->component_map[BluePixelComponent].component]=blue;
353 static inline void SetPixelCb(const Image *image,const Quantum cb,
356 pixel[image->component_map[CbPixelComponent].component]=cb;
359 static inline void SetPixelChannels(Image *image,const size_t channels)
361 image->pixel_channels=channels;
364 static inline void SetPixelCr(const Image *image,const Quantum cr,
367 pixel[image->component_map[CrPixelComponent].component]=cr;
370 static inline void SetPixelCyan(const Image *image,const Quantum cyan,
373 pixel[image->component_map[CyanPixelComponent].component]=cyan;
376 static inline void SetPixelGray(const Image *image,const Quantum gray,
379 pixel[image->component_map[GrayPixelComponent].component]=gray;
382 static inline void SetPixelGreen(const Image *image,const Quantum green,
385 pixel[image->component_map[GreenPixelComponent].component]=green;
388 static inline void SetPixelIndex(const Image *image,const Quantum index,
391 pixel[image->component_map[IndexPixelComponent].component]=index;
394 static inline void SetPixelInfo(const Image *image,const Quantum *pixel,
395 PixelInfo *pixel_info)
397 pixel_info->red=(MagickRealType) GetPixelRed(image,pixel);
398 pixel_info->green=(MagickRealType) GetPixelGreen(image,pixel);
399 pixel_info->blue=(MagickRealType) GetPixelBlue(image,pixel);
400 pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
401 if (image->colorspace == CMYKColorspace)
402 pixel_info->black=(MagickRealType) GetPixelBlack(image,pixel);
403 if (image->storage_class == PseudoClass)
404 pixel_info->index=(MagickRealType) GetPixelIndex(image,pixel);
407 static inline void SetPixelInfoBias(const Image *image,
408 PixelInfo *pixel_info)
411 Obsoleted by MorphologyApply().
413 pixel_info->red=image->bias;
414 pixel_info->green=image->bias;
415 pixel_info->blue=image->bias;
416 pixel_info->alpha=image->bias;
417 pixel_info->black=image->bias;
420 static inline void SetPixelInfoPacket(const Image *image,
421 const PixelPacket *pixel,PixelInfo *pixel_info)
423 pixel_info->red=(MagickRealType) pixel->red;
424 pixel_info->green=(MagickRealType) pixel->green;
425 pixel_info->blue=(MagickRealType) pixel->blue;
426 pixel_info->alpha=(MagickRealType) pixel->alpha;
427 if (image->colorspace == CMYKColorspace)
428 pixel_info->black=(MagickRealType) pixel->black;
429 if (image->storage_class == PseudoClass)
430 pixel_info->index=(MagickRealType) pixel->index;
433 static inline void SetPixelMagenta(const Image *image,const Quantum magenta,
436 pixel[image->component_map[MagentaPixelComponent].component]=magenta;
439 static inline void SetPixelMetacontentExtent(Image *image,const size_t extent)
441 image->metacontent_extent=extent;
444 static inline void SetPixelRed(const Image *image,const Quantum red,
447 pixel[image->component_map[RedPixelComponent].component]=red;
450 static inline void SetPixelPacket(const Image *image,const PixelPacket *packet,
453 SetPixelRed(image,packet->red,pixel);
454 SetPixelGreen(image,packet->green,pixel);
455 SetPixelBlue(image,packet->blue,pixel);
456 SetPixelAlpha(image,packet->alpha,pixel);
459 static inline void SetPixelPixelInfo(const Image *image,
460 const PixelInfo *pixel_info,Quantum *packet)
462 SetPixelRed(image,ClampToQuantum(pixel_info->red),packet);
463 SetPixelGreen(image,ClampToQuantum(pixel_info->green),packet);
464 SetPixelBlue(image,ClampToQuantum(pixel_info->blue),packet);
465 SetPixelAlpha(image,ClampToQuantum(pixel_info->alpha),packet);
466 if (image->colorspace == CMYKColorspace)
467 SetPixelBlack(image,ClampToQuantum(pixel_info->black),packet);
470 static inline void SetPixelYellow(const Image *image,const Quantum yellow,
473 pixel[image->component_map[YellowPixelComponent].component]=yellow;
476 static inline void SetPixelY(const Image *image,const Quantum y,
479 pixel[image->component_map[YPixelComponent].component]=y;
482 static inline Quantum GetPixelIntensity(const Image *image,
483 const Quantum *pixel)
485 #if !defined(MAGICKCORE_HDRI_SUPPORT)
486 if ((GetPixelRed(image,pixel) == GetPixelGreen(image,pixel)) &&
487 (GetPixelGreen(image,pixel) == GetPixelBlue(image,pixel)))
488 return(GetPixelRed(image,pixel));
489 return((Quantum) (0.299*GetPixelRed(image,pixel)+0.587*
490 GetPixelGreen(image,pixel)+0.114*GetPixelBlue(image,pixel)+0.5));
497 alpha=GetPixelRed(image,pixel)-(double) GetPixelGreen(image,pixel);
498 beta=GetPixelGreen(image,pixel)-(double) GetPixelBlue(image,pixel);
499 if ((fabs(alpha) <= MagickEpsilon) && (fabs(beta) <= MagickEpsilon))
500 return(GetPixelRed(image,pixel));
501 return((Quantum) (0.299*GetPixelRed(image,pixel)+0.587*
502 GetPixelGreen(image,pixel)+0.114*GetPixelBlue(image,pixel)));
507 #if defined(__cplusplus) || defined(c_plusplus)