MagickCore 7.1.1
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 const Quantum scaled = quantum/257.0f;
121 if (scaled >= 255.0f)
122 return((unsigned char) 255);
123 return((unsigned char) (scaled+0.5f));
124#endif
125}
126#elif (MAGICKCORE_QUANTUM_DEPTH == 32)
127static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
128{
129#if !defined(MAGICKCORE_HDRI_SUPPORT)
130 return((unsigned char) ((quantum+MagickULLConstant(8421504))/
131 MagickULLConstant(16843009)));
132#else
133 if ((IsNaN(quantum) != 0) || (quantum <= 0.0))
134 return(0);
135 const Quantum scaled = quantum/16843009.0;
136 if (scaled >= 255.0)
137 return((unsigned char) 255);
138 return((unsigned char) (scaled+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 const Quantum scaled = quantum/72340172838076673.0;
150 if (scaled >= 255.0)
151 return((unsigned char) 255);
152 return((unsigned char) (scaled+0.5));
153#endif
154}
155#endif
156
157extern MagickExport EndianType
158 GetQuantumEndian(const QuantumInfo *);
159
160extern MagickExport MagickBooleanType
161 SetQuantumDepth(const Image *,QuantumInfo *,const size_t),
162 SetQuantumEndian(const Image *,QuantumInfo *,const EndianType),
163 SetQuantumFormat(const Image *,QuantumInfo *,const QuantumFormatType),
164 SetQuantumPad(const Image *,QuantumInfo *,const size_t);
165
166extern MagickExport QuantumFormatType
167 GetQuantumFormat(const QuantumInfo *);
168
169extern MagickExport QuantumInfo
170 *AcquireQuantumInfo(const ImageInfo *,Image *),
171 *DestroyQuantumInfo(QuantumInfo *);
172
173extern MagickExport QuantumType
174 GetQuantumType(Image *,ExceptionInfo *);
175
176extern MagickExport size_t
177 ExportQuantumPixels(const Image *,CacheView *,QuantumInfo *,const QuantumType,
178 unsigned char *magick_restrict,ExceptionInfo *),
179 GetQuantumExtent(const Image *,const QuantumInfo *,const QuantumType),
180 ImportQuantumPixels(const Image *,CacheView *,QuantumInfo *,const QuantumType,
181 const unsigned char *magick_restrict,ExceptionInfo *);
182
183extern MagickExport unsigned char
184 *GetQuantumPixels(const QuantumInfo *);
185
186extern MagickExport void
187 GetQuantumInfo(const ImageInfo *,QuantumInfo *),
188 SetQuantumAlphaType(QuantumInfo *,const QuantumAlphaType),
189 SetQuantumImageType(Image *,const QuantumType),
190 SetQuantumMinIsWhite(QuantumInfo *,const MagickBooleanType),
191 SetQuantumPack(QuantumInfo *,const MagickBooleanType),
192 SetQuantumQuantum(QuantumInfo *,const size_t),
193 SetQuantumScale(QuantumInfo *,const double);
194
195#if defined(__cplusplus) || defined(c_plusplus)
196}
197#endif
198
199#endif