MagickCore 6.9.11-60
Convert, Edit, Or Compose Bitmap Images
pixel-accessor.h
Go to the documentation of this file.
1/*
2 Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization
3 dedicated to making software imaging solutions freely available.
4
5 You may not use this file except in compliance with the License. You may
6 obtain a copy of the License at
7
8 https://imagemagick.org/script/license.php
9
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.
15
16 MagickCore pixel accessor methods.
17*/
18#ifndef MAGICKCORE_PIXEL_ACCESSOR_H
19#define MAGICKCORE_PIXEL_ACCESSOR_H
20
21#include <math.h>
22#include "magick/gem.h"
23#include "magick/pixel.h"
24
25#if defined(__cplusplus) || defined(c_plusplus)
26extern "C" {
27#endif
28
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) (QuantumRange-(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) \
52{ \
53 (packet)->red=GetPixelRed((pixel)); \
54 (packet)->green=GetPixelGreen((pixel)); \
55 (packet)->blue=GetPixelBlue((pixel)); \
56}
57#define GetPixelRGBO(pixel,packet) \
58{ \
59 (packet)->red=GetPixelRed((pixel)); \
60 (packet)->green=GetPixelGreen((pixel)); \
61 (packet)->blue=GetPixelBlue((pixel)); \
62 (packet)->opacity=GetPixelOpacity((pixel)); \
63}
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) (QuantumRange-(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) \
84{ \
85 SetPixelRed(pixel,(packet)->red); \
86 SetPixelGreen(pixel,(packet)->green); \
87 SetPixelBlue(pixel,(packet)->blue); \
88}
89#define SetPixelRGBA(pixel,packet) \
90{ \
91 SetPixelRed(pixel,(packet)->red); \
92 SetPixelGreen(pixel,(packet)->green); \
93 SetPixelBlue(pixel,(packet)->blue); \
94 SetPixelAlpha(pixel,(QuantumRange-(packet)->opacity)); \
95}
96#define SetPixelRGBO(pixel,packet) \
97{ \
98 SetPixelRed(pixel,(packet)->red); \
99 SetPixelGreen(pixel,(packet)->green); \
100 SetPixelBlue(pixel,(packet)->blue); \
101 SetPixelOpacity(pixel,(packet)->opacity); \
102}
103#define SetPixelYellow(pixel,value) ((pixel)->blue=(Quantum) (value))
104#define SetPixelY(pixel,value) ((pixel)->red=(Quantum) (value))
105
107{
108 return(x < 0.0f ? -x : x);
109}
110
111static inline Quantum ClampPixel(const MagickRealType value)
112{
113 if (value < 0.0f)
114 return((Quantum) 0);
115 if (value >= (MagickRealType) QuantumRange)
116 return((Quantum) QuantumRange);
117#if !defined(MAGICKCORE_HDRI_SUPPORT)
118 return((Quantum) (value+0.5f));
119#else
120 return((Quantum) value);
121#endif
122}
123
124static inline double PerceptibleReciprocal(const double x)
125{
126 double
127 sign;
128
129 /*
130 Return 1/x where x is perceptible (not unlimited or infinitesimal).
131 */
132 sign=x < 0.0 ? -1.0 : 1.0;
133 if ((sign*x) >= MagickEpsilon)
134 return(1.0/x);
135 return(sign/MagickEpsilon);
136}
137
138static inline double MagickSafeReciprocal(const double x)
139{
140 if ((x > -MagickEpsilon) && (x < MagickEpsilon))
141 return(1.0/MagickEpsilon);
142 return(1.0/x);
143}
144
145
147 const PixelPacket *magick_restrict pixel)
148{
150 intensity;
151
152 (void) image;
153 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
154 0.072186f*pixel->blue);
155 return(intensity);
156}
157
159 const Image *magick_restrict image,const PixelPacket *magick_restrict pixel)
160{
162 intensity;
163
164 if (image->colorspace != sRGBColorspace)
165 {
166 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
167 0.072186f*pixel->blue);
168 return(intensity);
169 }
170 intensity=(MagickRealType) (0.212656f*DecodePixelGamma((MagickRealType)
171 pixel->red)+0.715158f*DecodePixelGamma((MagickRealType) pixel->green)+
172 0.072186f*DecodePixelGamma((MagickRealType) pixel->blue));
173 return(intensity);
174}
175
176static inline MagickBooleanType IsPixelAtDepth(const Quantum pixel,
177 const QuantumAny range)
178{
179 Quantum
180 quantum;
181
182 if (range == 0)
183 return(MagickTrue);
184#if !defined(MAGICKCORE_HDRI_SUPPORT)
186 (((MagickRealType) range*pixel)/QuantumRange+0.5)))/range+0.5);
187#else
189 (((MagickRealType) range*pixel)/QuantumRange+0.5)))/range);
190#endif
191 return(pixel == quantum ? MagickTrue : MagickFalse);
192}
193
194static inline MagickBooleanType IsPixelGray(const PixelPacket *pixel)
195{
197 green_blue,
198 red_green;
199
200 red_green=(MagickRealType) pixel->red-pixel->green;
201 green_blue=(MagickRealType) pixel->green-pixel->blue;
202 if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
204 return(MagickTrue);
205 return(MagickFalse);
206}
207
209{
211 green_blue,
212 red,
213 red_green;
214
215 red=(MagickRealType) pixel->red;
216 if ((AbsolutePixelValue(red) >= MagickEpsilon) &&
218 return(MagickFalse);
219 red_green=(MagickRealType) pixel->red-pixel->green;
220 green_blue=(MagickRealType) pixel->green-pixel->blue;
221 if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
223 return(MagickTrue);
224 return(MagickFalse);
225}
226
227static inline Quantum PixelPacketIntensity(const PixelPacket *pixel)
228{
230 intensity;
231
232 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
233 return(pixel->red);
234 intensity=(MagickRealType) (0.212656*pixel->red+0.715158*pixel->green+
235 0.072186*pixel->blue);
236 return(ClampToQuantum(intensity));
237}
238
239static inline void SetPixelViaMagickPixel(const Image *magick_restrict image,
240 const MagickPixelPacket *magick_restrict magick_pixel,
242{
243 pixel->red=ClampToQuantum(magick_pixel->red);
244 pixel->green=ClampToQuantum(magick_pixel->green);
245 pixel->blue=ClampToQuantum(magick_pixel->blue);
246 if (image->matte != MagickFalse)
247 pixel->opacity=ClampToQuantum(magick_pixel->opacity);
248}
249
250#if defined(__cplusplus) || defined(c_plusplus)
251}
252#endif
253
254#endif
#define magick_restrict
Definition: MagickCore.h:41
@ sRGBColorspace
Definition: colorspace.h:40
MagickDoubleType MagickRealType
Definition: magick-type.h:129
#define QuantumRange
Definition: magick-type.h:90
unsigned short Quantum
Definition: magick-type.h:89
#define MagickEpsilon
Definition: magick-type.h:119
MagickSizeType QuantumAny
Definition: magick-type.h:161
MagickBooleanType
Definition: magick-type.h:203
@ MagickFalse
Definition: magick-type.h:204
@ MagickTrue
Definition: magick-type.h:205
#define QuantumScale
Definition: magick-type.h:124
static void SetPixelViaMagickPixel(const Image *magick_restrict image, const MagickPixelPacket *magick_restrict magick_pixel, PixelPacket *magick_restrict pixel)
Definition: pixel-accessor.h:239
static MagickBooleanType IsPixelMonochrome(const PixelPacket *pixel)
Definition: pixel-accessor.h:208
static double MagickSafeReciprocal(const double x)
Definition: pixel-accessor.h:138
static Quantum PixelPacketIntensity(const PixelPacket *pixel)
Definition: pixel-accessor.h:227
static Quantum ClampPixel(const MagickRealType value)
Definition: pixel-accessor.h:111
static MagickRealType GetPixelLuma(const Image *magick_restrict image, const PixelPacket *magick_restrict pixel)
Definition: pixel-accessor.h:146
static MagickBooleanType IsPixelAtDepth(const Quantum pixel, const QuantumAny range)
Definition: pixel-accessor.h:176
static double PerceptibleReciprocal(const double x)
Definition: pixel-accessor.h:124
static MagickRealType AbsolutePixelValue(const MagickRealType x)
Definition: pixel-accessor.h:106
static MagickBooleanType IsPixelGray(const PixelPacket *pixel)
Definition: pixel-accessor.h:194
static MagickRealType GetPixelLuminance(const Image *magick_restrict image, const PixelPacket *magick_restrict pixel)
Definition: pixel-accessor.h:158
MagickExport MagickRealType DecodePixelGamma(const MagickRealType pixel)
Definition: pixel.c:246
static Quantum ClampToQuantum(const MagickRealType quantum)
Definition: quantum.h:88
Definition: image.h:153
Definition: pixel.h:105
Definition: pixel.h:132
Quantum green
Definition: pixel.h:144
Quantum blue
Definition: pixel.h:143
Quantum red
Definition: pixel.h:145