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