MagickCore  7.1.2-29
Convert, Edit, Or Compose Bitmap Images
image-private.h
1 /*
2  Copyright @ 1999 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/license/
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 image private methods.
17 */
18 #ifndef MAGICKCORE_IMAGE_PRIVATE_H
19 #define MAGICKCORE_IMAGE_PRIVATE_H
20 
21 #if defined(__cplusplus) || defined(c_plusplus)
22 extern "C" {
23 #endif
24 
25 #define MagickMax(x,y) (((x) > (y)) ? (x) : (y))
26 #define MagickMin(x,y) (((x) < (y)) ? (x) : (y))
27 
28 #include "MagickCore/pixel-accessor.h"
29 #include "MagickCore/quantum-private.h"
30 
31 #define BackgroundColor "#ffffff" /* white */
32 #define BackgroundColorRGBA QuantumRange,QuantumRange,QuantumRange,OpaqueAlpha
33 #define BorderColor "#dfdfdf" /* gray */
34 #define BorderColorRGBA ScaleShortToQuantum(0xdfdf),\
35  ScaleShortToQuantum(0xdfdf),ScaleShortToQuantum(0xdfdf),OpaqueAlpha
36 #define DefaultResolution 72.0
37 #define DefaultTileFrame "15x15+3+3"
38 #define DefaultTileGeometry "120x120+4+3>"
39 #define DefaultTileLabel "%f\n%G\n%b"
40 #define ForegroundColor "#000" /* black */
41 #define ForegroundColorRGBA 0,0,0,OpaqueAlpha
42 #define LoadImagesTag "Load/Images"
43 #define LoadImageTag "Load/Image"
44 #define Magick2PI 6.28318530717958647692528676655900576839433879875020
45 #define MagickAbsoluteValue(x) ((x) < 0 ? -(x) : (x))
46 #define MagickPHI 1.61803398874989484820458683436563811772030917980576
47 #define MagickPI2 1.57079632679489661923132169163975144209858469968755
48 #define MagickPI 3.1415926535897932384626433832795028841971693993751058209749445923078164062
49 #define MagickSQ1_2 0.70710678118654752440084436210484903928483593768847
50 #define MagickSQ2 1.41421356237309504880168872420969807856967187537695
51 #define MagickSQ2PI 2.50662827463100024161235523934010416269302368164062
52 #define MAGICK_UCHAR_MAX (UCHAR_MAX)
53 #define MAGICK_UINT_MAX (UINT_MAX)
54 #define MAGICK_ULONG_MAX (ULONG_MAX)
55 #define MAGICK_USHORT_MAX (USHRT_MAX)
56 #define MatteColor "#bdbdbd" /* gray */
57 #define MatteColorRGBA ScaleShortToQuantum(0xbdbd),\
58  ScaleShortToQuantum(0xbdbd),ScaleShortToQuantum(0xbdbd),OpaqueAlpha
59 #define PSDensityGeometry "72.0x72.0"
60 #define PSPageGeometry "612x792"
61 #define SaveImagesTag "Save/Images"
62 #define SaveImageTag "Save/Image"
63 #define TransparentColor "#00000000" /* transparent black */
64 #define TransparentColorRGBA (Quantum) 0,(Quantum) 0,(Quantum) 0,TransparentAlpha
65 #define UndefinedCompressionQuality 0UL
66 #define UndefinedTicksPerSecond 100L
67 
68 static inline int CastDoubleToInt(const double x)
69 {
70  double
71  value;
72 
73  if (IsNaN(x) != 0)
74  {
75  errno=ERANGE;
76  return(0);
77  }
78  value=(x < 0.0) ? ceil(x) : floor(x);
79  if (value < 0.0)
80  {
81  errno=ERANGE;
82  return(0);
83  }
84  if (value >= ((double) MAGICK_INT_MAX))
85  {
86  errno=ERANGE;
87  return(MAGICK_INT_MAX);
88  }
89  return((int) value);
90 }
91 
92 static inline ptrdiff_t CastDoubleToPtrdiffT(const double x)
93 {
94  double
95  value;
96 
97  if (IsNaN(x) != 0)
98  {
99  errno=ERANGE;
100  return(0);
101  }
102  value=(x < 0.0) ? ceil(x) : floor(x);
103  if (value < ((double) MAGICK_PTRDIFF_MIN))
104  {
105  errno=ERANGE;
106  return(MAGICK_PTRDIFF_MIN);
107  }
108  if (value >= ((double) MAGICK_PTRDIFF_MAX))
109  {
110  errno=ERANGE;
111  return(MAGICK_PTRDIFF_MAX);
112  }
113  return((ptrdiff_t) value);
114 }
115 
116 static inline QuantumAny CastDoubleToQuantumAny(const double x)
117 {
118  double
119  value;
120 
121  if (IsNaN(x) != 0)
122  {
123  errno=ERANGE;
124  return(0);
125  }
126  value=(x < 0.0) ? ceil(x) : floor(x);
127  if (value < 0.0)
128  {
129  errno=ERANGE;
130  return(0);
131  }
132  if (value >= ((double) ((QuantumAny) ~0)))
133  {
134  errno=ERANGE;
135  return((QuantumAny) ~0);
136  }
137  return((QuantumAny) value);
138 }
139 
140 static inline size_t CastDoubleToSizeT(const double x)
141 {
142  double
143  value;
144 
145  if (IsNaN(x) != 0)
146  {
147  errno=ERANGE;
148  return(0);
149  }
150  value=(x < 0.0) ? ceil(x) : floor(x);
151  if (value < 0.0)
152  {
153  errno=ERANGE;
154  return(0);
155  }
156  if (value >= ((double) MAGICK_SIZE_MAX))
157  {
158  errno=ERANGE;
159  return(MAGICK_SIZE_MAX);
160  }
161  return((size_t) value);
162 }
163 
164 static inline ssize_t CastDoubleToSsizeT(const double x)
165 {
166  double
167  value;
168 
169  if (IsNaN(x) != 0)
170  {
171  errno=ERANGE;
172  return(0);
173  }
174  value=(x < 0.0) ? ceil(x) : floor(x);
175  if (value < ((double) MAGICK_SSIZE_MIN))
176  {
177  errno=ERANGE;
178  return((ssize_t) MAGICK_SSIZE_MIN);
179  }
180  if (value >= ((double) MAGICK_SSIZE_MAX))
181  {
182  errno=ERANGE;
183  return((ssize_t) MAGICK_SSIZE_MAX);
184  }
185  return((ssize_t) value);
186 }
187 
188 static inline unsigned char CastDoubleToUChar(const double x)
189 {
190  double
191  value;
192 
193  if (IsNaN(x) != 0)
194  {
195  errno=ERANGE;
196  return(0);
197  }
198  value=(x < 0.0) ? ceil(x) : floor(x);
199  if (value < 0.0)
200  {
201  errno=ERANGE;
202  return(0);
203  }
204  if (value >= ((double) MAGICK_UCHAR_MAX))
205  {
206  errno=ERANGE;
207  return(MAGICK_UCHAR_MAX);
208  }
209  return((unsigned char) value);
210 }
211 
212 static inline unsigned int CastDoubleToUInt(const double x)
213 {
214  double
215  value;
216 
217  if (IsNaN(x) != 0)
218  {
219  errno=ERANGE;
220  return(0);
221  }
222  value=(x < 0.0) ? ceil(x) : floor(x);
223  if (value < 0.0)
224  {
225  errno=ERANGE;
226  return(0);
227  }
228  if (value >= ((double) MAGICK_UINT_MAX))
229  {
230  errno=ERANGE;
231  return(MAGICK_UINT_MAX);
232  }
233  return((unsigned int) value);
234 }
235 
236 static inline unsigned short CastDoubleToUShort(const double x)
237 {
238  double
239  value;
240 
241  if (IsNaN(x) != 0)
242  {
243  errno=ERANGE;
244  return(0);
245  }
246  value=(x < 0.0) ? ceil(x) : floor(x);
247  if (value < 0.0)
248  {
249  errno=ERANGE;
250  return(0);
251  }
252  if (value >= ((double) MAGICK_USHORT_MAX))
253  {
254  errno=ERANGE;
255  return(MAGICK_USHORT_MAX);
256  }
257  return((unsigned short) value);
258 }
259 
260 static inline double DegreesToRadians(const double degrees)
261 {
262  return((double) (MagickPI*degrees/180.0));
263 }
264 
265 static inline size_t GetImageChannels(const Image *image)
266 {
267  ssize_t
268  i;
269 
270  size_t
271  channels;
272 
273  channels=0;
274  for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
275  {
276  PixelChannel channel = GetPixelChannelChannel(image,i);
277  PixelTrait traits = GetPixelChannelTraits(image,channel);
278  if ((traits & UpdatePixelTrait) != 0)
279  channels++;
280  }
281  return(channels == 0 ? (size_t) 1 : channels);
282 }
283 
284 static inline double RadiansToDegrees(const double radians)
285 {
286  return((double) (180.0*radians/MagickPI));
287 }
288 
289 static inline unsigned char ScaleColor5to8(const unsigned int color)
290 {
291  return((unsigned char) (((color) << 3) | ((color) >> 2)));
292 }
293 
294 static inline unsigned char ScaleColor6to8(const unsigned int color)
295 {
296  return((unsigned char) (((color) << 2) | ((color) >> 4)));
297 }
298 
299 static inline unsigned int ScaleColor8to5(const unsigned char color)
300 {
301  return((unsigned int) (((color) & ~0x07) >> 3));
302 }
303 
304 static inline unsigned int ScaleColor8to6(const unsigned char color)
305 {
306  return((unsigned int) (((color) & ~0x03) >> 2));
307 }
308 
309 #if defined(__cplusplus) || defined(c_plusplus)
310 }
311 #endif
312 
313 #endif
Definition: image.h:132