1 /*
2 Copyright 1999-2019 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 quantum inline methods.
17 */
18 #ifndef MAGICKCORE_QUANTUM_H
19 #define MAGICKCORE_QUANTUM_H
20
21 #include "MagickCore/image.h"
22 #include "MagickCore/semaphore.h"
23
24 #if defined(__cplusplus) || defined(c_plusplus)
25 extern "C" {
26 #endif
27
28 typedef enum
29 {
30 UndefinedEndian,
31 LSBEndian,
32 MSBEndian
33 } EndianType;
34
35 typedef enum
36 {
37 UndefinedQuantumAlpha,
38 AssociatedQuantumAlpha,
39 DisassociatedQuantumAlpha
40 } QuantumAlphaType;
41
42 typedef enum
43 {
44 UndefinedQuantumFormat,
45 FloatingPointQuantumFormat,
46 SignedQuantumFormat,
47 UnsignedQuantumFormat
48 } QuantumFormatType;
49
50 typedef enum
51 {
52 UndefinedQuantum,
53 AlphaQuantum,
54 BGRAQuantum,
55 BGROQuantum,
56 BGRQuantum,
57 BlackQuantum,
58 BlueQuantum,
59 CbYCrAQuantum,
60 CbYCrQuantum,
61 CbYCrYQuantum,
62 CMYKAQuantum,
63 CMYKOQuantum,
64 CMYKQuantum,
65 CyanQuantum,
66 GrayAlphaQuantum,
67 GrayQuantum,
68 GreenQuantum,
69 IndexAlphaQuantum,
70 IndexQuantum,
71 MagentaQuantum,
72 OpacityQuantum,
73 RedQuantum,
74 RGBAQuantum,
75 RGBOQuantum,
76 RGBPadQuantum,
77 RGBQuantum,
78 YellowQuantum
79 } QuantumType;
80
81 typedef struct _QuantumInfo
82 QuantumInfo;
83
ClampToQuantum(const MagickRealType value)84 static inline Quantum ClampToQuantum(const MagickRealType value)
85 {
86 #if defined(MAGICKCORE_HDRI_SUPPORT)
87 return((Quantum) value);
88 #else
89 if (value <= 0.0f)
90 return((Quantum) 0);
91 if (value >= (MagickRealType) QuantumRange)
92 return(QuantumRange);
93 return((Quantum) (value+0.5f));
94 #endif
95 }
96
97 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
ScaleQuantumToChar(const Quantum quantum)98 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
99 {
100 #if !defined(MAGICKCORE_HDRI_SUPPORT)
101 return((unsigned char) quantum);
102 #else
103 if (quantum <= 0.0)
104 return(0);
105 if (quantum >= 255.0)
106 return(255);
107 return((unsigned char) (quantum+0.5));
108 #endif
109 }
110 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
ScaleQuantumToChar(const Quantum quantum)111 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
112 {
113 #if !defined(MAGICKCORE_HDRI_SUPPORT)
114 return((unsigned char) (((quantum+128UL)-((quantum+128UL) >> 8)) >> 8));
115 #else
116 if (quantum <= 0.0)
117 return(0);
118 if ((quantum/257.0) >= 255.0)
119 return(255);
120 return((unsigned char) (quantum/257.0+0.5));
121 #endif
122 }
123 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
ScaleQuantumToChar(const Quantum quantum)124 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
125 {
126 #if !defined(MAGICKCORE_HDRI_SUPPORT)
127 return((unsigned char) ((quantum+MagickULLConstant(8421504))/
128 MagickULLConstant(16843009)));
129 #else
130 if (quantum <= 0.0)
131 return(0);
132 if ((quantum/16843009.0) >= 255.0)
133 return(255);
134 return((unsigned char) (quantum/16843009.0+0.5));
135 #endif
136 }
137 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
ScaleQuantumToChar(const Quantum quantum)138 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
139 {
140 #if !defined(MAGICKCORE_HDRI_SUPPORT)
141 return((unsigned char) (quantum/72340172838076673.0+0.5));
142 #else
143 if (quantum <= 0.0)
144 return(0);
145 if ((quantum/72340172838076673.0) >= 255.0)
146 return(255);
147 return((unsigned char) (quantum/72340172838076673.0+0.5));
148 #endif
149 }
150 #endif
151
152 extern MagickExport EndianType
153 GetQuantumEndian(const QuantumInfo *);
154
155 extern MagickExport MagickBooleanType
156 SetQuantumDepth(const Image *,QuantumInfo *,const size_t),
157 SetQuantumEndian(const Image *,QuantumInfo *,const EndianType),
158 SetQuantumFormat(const Image *,QuantumInfo *,const QuantumFormatType),
159 SetQuantumPad(const Image *,QuantumInfo *,const size_t);
160
161 extern MagickExport QuantumFormatType
162 GetQuantumFormat(const QuantumInfo *);
163
164 extern MagickExport QuantumInfo
165 *AcquireQuantumInfo(const ImageInfo *,Image *),
166 *DestroyQuantumInfo(QuantumInfo *);
167
168 extern MagickExport QuantumType
169 GetQuantumType(Image *,ExceptionInfo *);
170
171 extern MagickExport size_t
172 ExportQuantumPixels(const Image *,CacheView *,QuantumInfo *,const QuantumType,
173 unsigned char *magick_restrict,ExceptionInfo *),
174 GetQuantumExtent(const Image *,const QuantumInfo *,const QuantumType),
175 ImportQuantumPixels(const Image *,CacheView *,QuantumInfo *,const QuantumType,
176 const unsigned char *magick_restrict,ExceptionInfo *);
177
178 extern MagickExport unsigned char
179 *GetQuantumPixels(const QuantumInfo *);
180
181 extern MagickExport void
182 GetQuantumInfo(const ImageInfo *,QuantumInfo *),
183 SetQuantumAlphaType(QuantumInfo *,const QuantumAlphaType),
184 SetQuantumImageType(Image *,const QuantumType),
185 SetQuantumMinIsWhite(QuantumInfo *,const MagickBooleanType),
186 SetQuantumPack(QuantumInfo *,const MagickBooleanType),
187 SetQuantumQuantum(QuantumInfo *,const size_t),
188 SetQuantumScale(QuantumInfo *,const double);
189
190 #if defined(__cplusplus) || defined(c_plusplus)
191 }
192 #endif
193
194 #endif
195