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
139 const PixelPacket *magick_restrict pixel)
140{
142 intensity;
143
144 (void) image;
145 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
146 0.072186f*pixel->blue);
147 return(intensity);
148}
149
151 const Image *magick_restrict image,const PixelPacket *magick_restrict pixel)
152{
154 intensity;
155
156 if (image->colorspace != sRGBColorspace)
157 {
158 intensity=(MagickRealType) (0.212656f*pixel->red+0.715158f*pixel->green+
159 0.072186f*pixel->blue);
160 return(intensity);
161 }
162 intensity=(MagickRealType) (0.212656f*DecodePixelGamma((MagickRealType)
163 pixel->red)+0.715158f*DecodePixelGamma((MagickRealType) pixel->green)+
164 0.072186f*DecodePixelGamma((MagickRealType) pixel->blue));
165 return(intensity);
166}
167
168static inline MagickBooleanType IsPixelAtDepth(const Quantum pixel,
169 const QuantumAny range)
170{
171 Quantum
172 quantum;
173
174 if (range == 0)
175 return(MagickTrue);
176#if !defined(MAGICKCORE_HDRI_SUPPORT)
178 (((MagickRealType) range*pixel)/QuantumRange+0.5)))/range+0.5);
179#else
181 (((MagickRealType) range*pixel)/QuantumRange+0.5)))/range);
182#endif
183 return(pixel == quantum ? MagickTrue : MagickFalse);
184}
185
186static inline MagickBooleanType IsPixelGray(const PixelPacket *pixel)
187{
189 green_blue,
190 red_green;
191
192 red_green=(MagickRealType) pixel->red-pixel->green;
193 green_blue=(MagickRealType) pixel->green-pixel->blue;
194 if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
196 return(MagickTrue);
197 return(MagickFalse);
198}
199
201{
203 green_blue,
204 red,
205 red_green;
206
207 red=(MagickRealType) pixel->red;
208 if ((AbsolutePixelValue(red) >= MagickEpsilon) &&
210 return(MagickFalse);
211 red_green=(MagickRealType) pixel->red-pixel->green;
212 green_blue=(MagickRealType) pixel->green-pixel->blue;
213 if (((QuantumScale*AbsolutePixelValue(red_green)) < MagickEpsilon) &&
215 return(MagickTrue);
216 return(MagickFalse);
217}
218
219static inline Quantum PixelPacketIntensity(const PixelPacket *pixel)
220{
222 intensity;
223
224 if ((pixel->red == pixel->green) && (pixel->green == pixel->blue))
225 return(pixel->red);
226 intensity=(MagickRealType) (0.212656*pixel->red+0.715158*pixel->green+
227 0.072186*pixel->blue);
228 return(ClampToQuantum(intensity));
229}
230
231static inline void SetPixelViaMagickPixel(const Image *magick_restrict image,
232 const MagickPixelPacket *magick_restrict magick_pixel,
234{
235 pixel->red=ClampToQuantum(magick_pixel->red);
236 pixel->green=ClampToQuantum(magick_pixel->green);
237 pixel->blue=ClampToQuantum(magick_pixel->blue);
238 if (image->matte != MagickFalse)
239 pixel->opacity=ClampToQuantum(magick_pixel->opacity);
240}
241
242#if defined(__cplusplus) || defined(c_plusplus)
243}
244#endif
245
246#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:231
static MagickBooleanType IsPixelMonochrome(const PixelPacket *pixel)
Definition: pixel-accessor.h:200
static Quantum PixelPacketIntensity(const PixelPacket *pixel)
Definition: pixel-accessor.h:219
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:138
static MagickBooleanType IsPixelAtDepth(const Quantum pixel, const QuantumAny range)
Definition: pixel-accessor.h:168
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:186
static MagickRealType GetPixelLuminance(const Image *magick_restrict image, const PixelPacket *magick_restrict pixel)
Definition: pixel-accessor.h:150
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