MagickCore 7.1.2
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
84 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 SetQuantumMetaChannel(const Image *,QuantumInfo *,const ssize_t),
171 SetQuantumPad(const Image *,QuantumInfo *,const size_t);
172
173extern MagickExport QuantumFormatType
174 GetQuantumFormat(const QuantumInfo *);
175
176extern MagickExport QuantumInfo
177 *AcquireQuantumInfo(const ImageInfo *,Image *),
178 *DestroyQuantumInfo(QuantumInfo *);
179
180extern MagickExport QuantumType
181 GetQuantumType(Image *,ExceptionInfo *);
182
183extern 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
190extern MagickExport unsigned char
191 *GetQuantumPixels(const QuantumInfo *);
192
193extern 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