]> granicus.if.org Git - imagemagick/blob - MagickCore/quantum.h
Fix CLUT interpolation method
[imagemagick] / MagickCore / quantum.h
1 /*
2   Copyright 1999-2008 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.
6   obtain a copy of the License at
7
8     http://www.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 #if defined(__cplusplus) || defined(c_plusplus)
22 extern "C" {
23 #endif
24
25 #include "MagickCore/semaphore.h"
26
27 #define RoundToQuantum(quantum)  ClampToQuantum(quantum)
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 } QuantumType;
81
82 typedef struct _QuantumInfo
83   QuantumInfo;
84
85 static inline Quantum ClampToQuantum(const double value)
86 {
87 #if defined(MAGICKCORE_HDRI_SUPPORT)
88   return((Quantum) value);
89 #else
90   if (value <= 0.0)
91     return((Quantum) 0);
92   if (value >= (double) QuantumRange)
93     return((Quantum) QuantumRange);
94   return((Quantum) (value+0.5));
95 #endif
96 }
97
98 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
99 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
100 {
101 #if !defined(MAGICKCORE_HDRI_SUPPORT)
102   return((unsigned char) quantum);
103 #else
104   if (quantum <= 0.0)
105     return(0);
106   if (quantum >= 255.0)
107     return(255);
108   return((unsigned char) (quantum+0.5));
109 #endif
110 }
111 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
112 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
113 {
114 #if !defined(MAGICKCORE_HDRI_SUPPORT)
115   return((unsigned char) (((quantum+128UL)-((quantum+128UL) >> 8)) >> 8));
116 #else
117   if (quantum <= 0.0)
118     return(0);
119   if ((quantum/257.0) >= 255.0)
120     return(255);
121   return((unsigned char) (quantum/257.0+0.5));
122 #endif
123 }
124 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
125 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
126 {
127 #if !defined(MAGICKCORE_HDRI_SUPPORT)
128   return((unsigned char) ((quantum+MagickULLConstant(8421504))/
129     MagickULLConstant(16843009)));
130 #else
131   if (quantum <= 0.0)
132     return(0);
133   if ((quantum/16843009.0) >= 255.0)
134     return(255);
135   return((unsigned char) (quantum/16843009.0+0.5));
136 #endif
137 }
138 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
139 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
140 {
141 #if !defined(MAGICKCORE_HDRI_SUPPORT)
142   return((unsigned char) (quantum/72340172838076673.0+0.5));
143 #else
144   if (quantum <= 0.0)
145     return(0);
146   if ((quantum/72340172838076673.0) >= 255.0)
147     return(255);
148   return((unsigned char) (quantum/72340172838076673.0+0.5));
149 #endif
150 }
151 #endif
152
153 extern MagickExport MagickBooleanType
154   SetQuantumDepth(const Image *,QuantumInfo *,const size_t),
155   SetQuantumFormat(const Image *,QuantumInfo *,const QuantumFormatType),
156   SetQuantumPad(const Image *,QuantumInfo *,const size_t);
157
158 extern MagickExport QuantumFormatType
159   GetQuantumFormat(const QuantumInfo *);
160
161 extern MagickExport QuantumInfo
162   *AcquireQuantumInfo(const ImageInfo *,Image *),
163   *DestroyQuantumInfo(QuantumInfo *);
164
165 extern MagickExport QuantumType
166   GetQuantumType(Image *,ExceptionInfo *);
167
168 extern MagickExport size_t
169   ExportQuantumPixels(const Image *,CacheView *,QuantumInfo *,const QuantumType,
170     unsigned char *,ExceptionInfo *),
171   GetQuantumExtent(const Image *,const QuantumInfo *,const QuantumType),
172   ImportQuantumPixels(const Image *,CacheView *,QuantumInfo *,const QuantumType,
173     const unsigned char *,ExceptionInfo *);
174
175 extern MagickExport unsigned char
176   *GetQuantumPixels(const QuantumInfo *);
177
178 extern MagickExport void
179   GetQuantumInfo(const ImageInfo *,QuantumInfo *),
180   SetQuantumAlphaType(QuantumInfo *,const QuantumAlphaType),
181   SetQuantumImageType(Image *,const QuantumType),
182   SetQuantumMinIsWhite(QuantumInfo *,const MagickBooleanType),
183   SetQuantumPack(QuantumInfo *,const MagickBooleanType),
184   SetQuantumQuantum(QuantumInfo *,const size_t),
185   SetQuantumScale(QuantumInfo *,const double);
186
187 #if defined(__cplusplus) || defined(c_plusplus)
188 }
189 #endif
190
191 #endif