]> granicus.if.org Git - imagemagick/blob - MagickCore/quantum.h
(no commit message)
[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 MagickRealType 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 >= (MagickRealType) 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 QuantumInfo
159   *AcquireQuantumInfo(const ImageInfo *,Image *),
160   *DestroyQuantumInfo(QuantumInfo *);
161
162 extern MagickExport QuantumType
163   GetQuantumType(Image *,ExceptionInfo *);
164
165 extern MagickExport size_t
166   ExportQuantumPixels(Image *,CacheView *,const QuantumInfo *,const QuantumType,
167     unsigned char *,ExceptionInfo *),
168   GetQuantumExtent(const Image *,const QuantumInfo *,const QuantumType),
169   ImportQuantumPixels(Image *,CacheView *,const QuantumInfo *,const QuantumType,
170     const unsigned char *,ExceptionInfo *);
171
172 extern MagickExport unsigned char
173   *GetQuantumPixels(const QuantumInfo *);
174
175 extern MagickExport void
176   GetQuantumInfo(const ImageInfo *,QuantumInfo *),
177   SetQuantumAlphaType(QuantumInfo *,const QuantumAlphaType),
178   SetQuantumImageType(Image *,const QuantumType),
179   SetQuantumMinIsWhite(QuantumInfo *,const MagickBooleanType),
180   SetQuantumPack(QuantumInfo *,const MagickBooleanType),
181   SetQuantumQuantum(QuantumInfo *,const size_t),
182   SetQuantumScale(QuantumInfo *,const double);
183
184 #if defined(__cplusplus) || defined(c_plusplus)
185 }
186 #endif
187
188 #endif