MagickCore 7.1.2-0
Convert, Edit, Or Compose Bitmap Images
Loading...
Searching...
No Matches
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/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 <float.h>
22#include "MagickCore/image.h"
23#include "MagickCore/semaphore.h"
24
25#if defined(__cplusplus) || defined(c_plusplus)
26extern "C" {
27#endif
28
29typedef enum
30{
31 UndefinedEndian,
32 LSBEndian,
33 MSBEndian
34} EndianType;
35
36typedef enum
37{
38 UndefinedQuantumAlpha,
39 AssociatedQuantumAlpha,
40 DisassociatedQuantumAlpha
41} QuantumAlphaType;
42
43typedef enum
44{
45 UndefinedQuantumFormat,
46 FloatingPointQuantumFormat,
47 SignedQuantumFormat,
48 UnsignedQuantumFormat
49} QuantumFormatType;
50
51typedef 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
83typedef struct _QuantumInfo
85
86static 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)
100static 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)
113static 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)
129static 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)
146static 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
163extern MagickExport EndianType
164 GetQuantumEndian(const QuantumInfo *);
165
166extern 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 SetQuantumPad(const Image *,QuantumInfo *,const size_t);
171
172extern MagickExport QuantumFormatType
173 GetQuantumFormat(const QuantumInfo *);
174
175extern MagickExport QuantumInfo
176 *AcquireQuantumInfo(const ImageInfo *,Image *),
177 *DestroyQuantumInfo(QuantumInfo *);
178
179extern MagickExport QuantumType
180 GetQuantumType(Image *,ExceptionInfo *);
181
182extern MagickExport size_t
183 ExportQuantumPixels(const Image *,CacheView *,QuantumInfo *,const QuantumType,
184 unsigned char *magick_restrict,ExceptionInfo *),
185 GetQuantumExtent(const Image *,const QuantumInfo *,const QuantumType),
186 ImportQuantumPixels(const Image *,CacheView *,QuantumInfo *,const QuantumType,
187 const unsigned char *magick_restrict,ExceptionInfo *);
188
189extern MagickExport unsigned char
190 *GetQuantumPixels(const QuantumInfo *);
191
192extern MagickExport void
193 GetQuantumInfo(const ImageInfo *,QuantumInfo *),
194 SetQuantumAlphaType(QuantumInfo *,const QuantumAlphaType),
195 SetQuantumImageType(Image *,const QuantumType),
196 SetQuantumMinIsWhite(QuantumInfo *,const MagickBooleanType),
197 SetQuantumPack(QuantumInfo *,const MagickBooleanType),
198 SetQuantumQuantum(QuantumInfo *,const size_t),
199 SetQuantumScale(QuantumInfo *,const double);
200
201#if defined(__cplusplus) || defined(c_plusplus)
202}
203#endif
204
205#endif