18#ifndef MAGICKCORE_PIXEL_ACCESSOR_H
19#define MAGICKCORE_PIXEL_ACCESSOR_H
22#include "magick/gem.h"
23#include "magick/pixel.h"
25#if defined(__cplusplus) || defined(c_plusplus)
29#define ClampPixelRed(pixel) ClampToQuantum((pixel)->red)
30#define ClampPixelGreen(pixel) ClampToQuantum((pixel)->green)
31#define ClampPixelBlue(pixel) ClampToQuantum((pixel)->blue)
32#define ClampPixelIndex(indexes) ClampToQuantum(*(indexes))
33#define ClampPixelOpacity(pixel) ClampToQuantum((pixel)->opacity)
34#define GetPixela(pixel) ((pixel)->green)
35#define GetPixelb(pixel) ((pixel)->blue)
36#define GetPixelAlpha(pixel) ((double) QuantumRange-(double) (pixel)->opacity)
37#define GetPixelBlack(indexes) (*(indexes))
38#define GetPixelBlue(pixel) ((pixel)->blue)
39#define GetPixelCb(pixel) ((pixel)->green)
40#define GetPixelCr(pixel) ((pixel)->blue)
41#define GetPixelCyan(pixel) ((pixel)->red)
42#define GetPixelGray(pixel) ((pixel)->red)
43#define GetPixelGreen(pixel) ((pixel)->green)
44#define GetPixelIndex(indexes) (*(indexes))
45#define GetPixelL(pixel) ((pixel)->red)
46#define GetPixelLabel(pixel) ((ssize_t) (pixel)->red)
47#define GetPixelMagenta(pixel) ((pixel)->green)
48#define GetPixelNext(pixel) ((pixel)+1)
49#define GetPixelOpacity(pixel) ((pixel)->opacity)
50#define GetPixelRed(pixel) ((pixel)->red)
51#define GetPixelRGB(pixel,packet) \
53 (packet)->red=GetPixelRed((pixel)); \
54 (packet)->green=GetPixelGreen((pixel)); \
55 (packet)->blue=GetPixelBlue((pixel)); \
57#define GetPixelRGBO(pixel,packet) \
59 (packet)->red=GetPixelRed((pixel)); \
60 (packet)->green=GetPixelGreen((pixel)); \
61 (packet)->blue=GetPixelBlue((pixel)); \
62 (packet)->opacity=GetPixelOpacity((pixel)); \
64#define GetPixelY(pixel) ((pixel)->red)
65#define GetPixelYellow(pixel) ((pixel)->blue)
66#define SetPixela(pixel,value) ((pixel)->green=(Quantum) (value))
67#define SetPixelAlpha(pixel,value) \
68 ((pixel)->opacity=(Quantum) ((double) QuantumRange-(double) (value)))
69#define SetPixelb(pixel,value) ((pixel)->blue=(Quantum) (value))
70#define SetPixelBlack(indexes,value) (*(indexes)=(Quantum) (value))
71#define SetPixelBlue(pixel,value) ((pixel)->blue=(Quantum) (value))
72#define SetPixelCb(pixel,value) ((pixel)->green=(Quantum) (value))
73#define SetPixelCr(pixel,value) ((pixel)->blue=(Quantum) (value))
74#define SetPixelCyan(pixel,value) ((pixel)->red=(Quantum) (value))
75#define SetPixelGray(pixel,value) \
76 ((pixel)->red=(pixel)->green=(pixel)->blue=(Quantum) (value))
77#define SetPixelGreen(pixel,value) ((pixel)->green=(Quantum) (value))
78#define SetPixelIndex(indexes,value) (*(indexes)=(IndexPacket) (value))
79#define SetPixelL(pixel,value) ((pixel)->red=(Quantum) (value))
80#define SetPixelMagenta(pixel,value) ((pixel)->green=(Quantum) (value))
81#define SetPixelOpacity(pixel,value) ((pixel)->opacity=(Quantum) (value))
82#define SetPixelRed(pixel,value) ((pixel)->red=(Quantum) (value))
83#define SetPixelRgb(pixel,packet) \
85 SetPixelRed(pixel,(packet)->red); \
86 SetPixelGreen(pixel,(packet)->green); \
87 SetPixelBlue(pixel,(packet)->blue); \
89#define SetPixelRGBA(pixel,packet) \
91 SetPixelRed(pixel,(packet)->red); \
92 SetPixelGreen(pixel,(packet)->green); \
93 SetPixelBlue(pixel,(packet)->blue); \
94 SetPixelAlpha(pixel,(QuantumRange-(packet)->opacity)); \
96#define SetPixelRGBO(pixel,packet) \
98 SetPixelRed(pixel,(packet)->red); \
99 SetPixelGreen(pixel,(packet)->green); \
100 SetPixelBlue(pixel,(packet)->blue); \
101 SetPixelOpacity(pixel,(packet)->opacity); \
103#define SetPixelYellow(pixel,value) ((pixel)->blue=(Quantum) (value))
104#define SetPixelY(pixel,value) ((pixel)->red=(Quantum) (value))
106static inline MagickRealType AbsolutePixelValue(
const MagickRealType x)
108 return(x < 0.0 ? -x : x);
111static inline Quantum ClampPixel(
const MagickRealType value)
115 if (value >= (MagickRealType) QuantumRange)
116 return((Quantum) QuantumRange);
117#if !defined(MAGICKCORE_HDRI_SUPPORT)
118 return((Quantum) (value+0.5));
120 return((Quantum) value);
124static inline MagickRealType GetPixelLuma(
125 const Image *magick_restrict image,
const PixelPacket *magick_restrict pixel)
131 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
132 0.072186f*pixel->blue);
136static inline MagickRealType GetPixelLuminance(
137 const Image *magick_restrict image,
const PixelPacket *magick_restrict pixel)
142 if (image->colorspace != sRGBColorspace)
144 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
145 0.072186f*pixel->blue);
148 intensity=(MagickRealType) (0.212656*DecodePixelGamma((MagickRealType)
149 pixel->red)+0.715158*DecodePixelGamma((MagickRealType) pixel->green)+
150 0.072186*DecodePixelGamma((MagickRealType) pixel->blue));
154static inline void GetPixelPacketRGBA(
const Quantum red,
const Quantum green,
155 const Quantum blue,
const Quantum opacity,PixelPacket *magick_restrict pixel)
160 pixel->opacity=opacity;
163static inline MagickBooleanType IsPixelAtDepth(
const Quantum pixel,
164 const QuantumAny range)
171#if !defined(MAGICKCORE_HDRI_SUPPORT)
172 quantum=(Quantum) (((MagickRealType) QuantumRange*((QuantumAny)
173 (((MagickRealType) range*pixel)/QuantumRange+0.5)))/range+0.5);
175 quantum=(Quantum) (((MagickRealType) QuantumRange*((QuantumAny)
176 (((MagickRealType) range*(MagickRealType) pixel)/(MagickRealType) QuantumRange+
177 0.5)))/(MagickRealType) range);
179 return(pixel == quantum ? MagickTrue : MagickFalse);
182static inline MagickBooleanType IsPixelGray(
const PixelPacket *pixel)
188 red_green=(MagickRealType) pixel->red-(MagickRealType) pixel->green;
189 green_blue=(MagickRealType) pixel->green-(MagickRealType) pixel->blue;
190 if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
191 ((QuantumScale*AbsolutePixelValue(green_blue)) < MagickEpsilon))
196static inline MagickBooleanType IsPixelMonochrome(
197 const PixelPacket *pixel)
204 red=(MagickRealType) pixel->red;
205 if ((AbsolutePixelValue(red) >= MagickEpsilon) &&
206 (AbsolutePixelValue(red-(
double) QuantumRange) >= MagickEpsilon))
208 red_green=(MagickRealType) pixel->red-(
double) pixel->green;
209 green_blue=(MagickRealType) pixel->green-(
double) pixel->blue;
210 if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
211 ((QuantumScale*AbsolutePixelValue(green_blue)) < MagickEpsilon))
216static inline Quantum PixelPacketIntensity(
const PixelPacket *pixel)
221 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
223 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
224 0.072186f*pixel->blue);
225 return(ClampToQuantum(intensity));
228static inline void SetPixelViaMagickPixel(
const Image *magick_restrict image,
229 const MagickPixelPacket *magick_restrict magick_pixel,
230 PixelPacket *magick_restrict pixel)
232 pixel->red=ClampToQuantum(magick_pixel->red);
233 pixel->green=ClampToQuantum(magick_pixel->green);
234 pixel->blue=ClampToQuantum(magick_pixel->blue);
235 if (image->matte != MagickFalse)
236 pixel->opacity=ClampToQuantum(magick_pixel->opacity);
239#if defined(__cplusplus) || defined(c_plusplus)