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)
26 extern "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 
111 static 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 
124 static 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 
138 static 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 
176 static 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 
194 static 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 
227 static 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 
239 static 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