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