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