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)) 106 static inline MagickRealType AbsolutePixelValue(
const MagickRealType x)
108 return(x < 0.0 ? -x : x);
111 static 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);
124 static inline double PerceptibleReciprocal(
const double x)
132 sign=x < 0.0 ? -1.0 : 1.0;
133 if ((sign*x) >= MagickEpsilon)
135 return(sign/MagickEpsilon);
138 static inline MagickRealType GetPixelLuma(
139 const Image *magick_restrict image,
const PixelPacket *magick_restrict pixel)
145 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
146 0.072186f*pixel->blue);
150 static inline MagickRealType GetPixelLuminance(
151 const Image *magick_restrict image,
const PixelPacket *magick_restrict pixel)
156 if (image->colorspace != sRGBColorspace)
158 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
159 0.072186f*pixel->blue);
162 intensity=(MagickRealType) (0.212656*DecodePixelGamma((MagickRealType)
163 pixel->red)+0.715158*DecodePixelGamma((MagickRealType) pixel->green)+
164 0.072186*DecodePixelGamma((MagickRealType) pixel->blue));
168 static inline void GetPixelPacketRGBA(
const Quantum red,
const Quantum green,
169 const Quantum blue,
const Quantum opacity,
PixelPacket *magick_restrict pixel)
174 pixel->opacity=opacity;
177 static inline MagickBooleanType IsPixelAtDepth(
const Quantum pixel,
178 const QuantumAny range)
185 #if !defined(MAGICKCORE_HDRI_SUPPORT) 186 quantum=(Quantum) (((MagickRealType) QuantumRange*((QuantumAny)
187 (((MagickRealType) range*pixel)/QuantumRange+0.5)))/range+0.5);
189 quantum=(Quantum) (((MagickRealType) QuantumRange*((QuantumAny)
190 (((MagickRealType) range*(MagickRealType) pixel)/(MagickRealType) QuantumRange+
191 0.5)))/(MagickRealType) range);
193 return(pixel == quantum ? MagickTrue : MagickFalse);
196 static inline MagickBooleanType IsPixelGray(
const PixelPacket *pixel)
202 red_green=(MagickRealType) pixel->red-(MagickRealType) pixel->green;
203 green_blue=(MagickRealType) pixel->green-(MagickRealType) pixel->blue;
204 if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
205 ((QuantumScale*AbsolutePixelValue(green_blue)) < MagickEpsilon))
210 static inline MagickBooleanType IsPixelMonochrome(
218 red=(MagickRealType) pixel->red;
219 if ((AbsolutePixelValue(red) >= MagickEpsilon) &&
220 (AbsolutePixelValue(red-(
double) QuantumRange) >= MagickEpsilon))
222 red_green=(MagickRealType) pixel->red-(
double) pixel->green;
223 green_blue=(MagickRealType) pixel->green-(
double) pixel->blue;
224 if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
225 ((QuantumScale*AbsolutePixelValue(green_blue)) < MagickEpsilon))
230 static inline Quantum PixelPacketIntensity(
const PixelPacket *pixel)
235 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
237 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
238 0.072186f*pixel->blue);
239 return(ClampToQuantum(intensity));
242 static inline void SetPixelViaMagickPixel(
const Image *magick_restrict image,
246 pixel->red=ClampToQuantum(magick_pixel->red);
247 pixel->green=ClampToQuantum(magick_pixel->green);
248 pixel->blue=ClampToQuantum(magick_pixel->blue);
249 if (image->matte != MagickFalse)
250 pixel->opacity=ClampToQuantum(magick_pixel->opacity);
253 #if defined(__cplusplus) || defined(c_plusplus)