00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef MAGICKCORE_QUANTUM_H
00019 #define MAGICKCORE_QUANTUM_H
00020
00021 #include <float.h>
00022 #include "magick/image.h"
00023 #include "magick/semaphore.h"
00024
00025 #if defined(__cplusplus) || defined(c_plusplus)
00026 extern "C" {
00027 #endif
00028
00029 #define RoundToQuantum(quantum) ClampToQuantum(quantum)
00030
00031 typedef enum
00032 {
00033 UndefinedEndian,
00034 LSBEndian,
00035 MSBEndian
00036 } EndianType;
00037
00038 typedef enum
00039 {
00040 UndefinedQuantumAlpha,
00041 AssociatedQuantumAlpha,
00042 DisassociatedQuantumAlpha
00043 } QuantumAlphaType;
00044
00045 typedef enum
00046 {
00047 UndefinedQuantumFormat,
00048 FloatingPointQuantumFormat,
00049 SignedQuantumFormat,
00050 UnsignedQuantumFormat
00051 } QuantumFormatType;
00052
00053 typedef enum
00054 {
00055 UndefinedQuantum,
00056 AlphaQuantum,
00057 BlackQuantum,
00058 BlueQuantum,
00059 CMYKAQuantum,
00060 CMYKQuantum,
00061 CyanQuantum,
00062 GrayAlphaQuantum,
00063 GrayQuantum,
00064 GreenQuantum,
00065 IndexAlphaQuantum,
00066 IndexQuantum,
00067 MagentaQuantum,
00068 OpacityQuantum,
00069 RedQuantum,
00070 RGBAQuantum,
00071 BGRAQuantum,
00072 RGBOQuantum,
00073 RGBQuantum,
00074 YellowQuantum,
00075 GrayPadQuantum,
00076 RGBPadQuantum,
00077 CbYCrYQuantum,
00078 CbYCrQuantum,
00079 CbYCrAQuantum,
00080 CMYKOQuantum,
00081 BGRQuantum,
00082 BGROQuantum
00083 } QuantumType;
00084
00085 typedef struct _QuantumInfo
00086 QuantumInfo;
00087
00088 static inline Quantum ClampToQuantum(const MagickRealType quantum)
00089 {
00090 #if defined(MAGICKCORE_HDRI_SUPPORT)
00091 return((Quantum) quantum);
00092 #else
00093 if (quantum <= 0.0f)
00094 return((Quantum) 0);
00095 if (quantum >= (MagickRealType) QuantumRange)
00096 return(QuantumRange);
00097 return((Quantum) (quantum+0.5f));
00098 #endif
00099 }
00100
00101 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
00102 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00103 {
00104 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00105 return((unsigned char) quantum);
00106 #else
00107 if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00108 return(0);
00109 if (quantum >= 255.0)
00110 return(255);
00111 return((unsigned char) (quantum+0.5));
00112 #endif
00113 }
00114 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
00115 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00116 {
00117 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00118 return((unsigned char) (((quantum+128UL)-((quantum+128UL) >> 8)) >> 8));
00119 #else
00120 if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00121 return(0);
00122 if ((quantum/257.0) >= 255.0)
00123 return(255);
00124 return((unsigned char) (quantum/257.0+0.5));
00125 #endif
00126 }
00127 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
00128 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00129 {
00130 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00131 return((unsigned char) ((quantum+MagickULLConstant(8421504))/
00132 MagickULLConstant(16843009)));
00133 #else
00134 if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00135 return(0);
00136 if ((quantum/16843009.0) >= 255.0)
00137 return(255);
00138 return((unsigned char) (quantum/16843009.0+0.5));
00139 #endif
00140 }
00141 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
00142 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00143 {
00144 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00145 return((unsigned char) (quantum/72340172838076673.0+0.5));
00146 #else
00147 if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00148 return(0);
00149 if ((quantum/72340172838076673.0) >= 255.0)
00150 return(255);
00151 return((unsigned char) (quantum/72340172838076673.0+0.5));
00152 #endif
00153 }
00154 #endif
00155
00156 extern MagickExport EndianType
00157 GetQuantumEndian(const QuantumInfo *);
00158
00159 extern MagickExport MagickBooleanType
00160 SetQuantumDepth(const Image *,QuantumInfo *,const size_t),
00161 SetQuantumEndian(const Image *,QuantumInfo *,const EndianType),
00162 SetQuantumFormat(const Image *,QuantumInfo *,const QuantumFormatType),
00163 SetQuantumPad(const Image *,QuantumInfo *,const size_t);
00164
00165 extern MagickExport QuantumFormatType
00166 GetQuantumFormat(const QuantumInfo *);
00167
00168 extern MagickExport QuantumInfo
00169 *AcquireQuantumInfo(const ImageInfo *,Image *),
00170 *DestroyQuantumInfo(QuantumInfo *);
00171
00172 extern MagickExport QuantumType
00173 GetQuantumType(Image *,ExceptionInfo *);
00174
00175 extern MagickExport size_t
00176 ExportQuantumPixels(const Image *,const CacheView *,const QuantumInfo *,
00177 const QuantumType,unsigned char *magick_restrict,ExceptionInfo *),
00178 GetQuantumExtent(const Image *,const QuantumInfo *,const QuantumType),
00179 ImportQuantumPixels(Image *,CacheView *,const QuantumInfo *,const QuantumType,
00180 const unsigned char *magick_restrict,ExceptionInfo *);
00181
00182 extern MagickExport unsigned char
00183 *GetQuantumPixels(const QuantumInfo *);
00184
00185 extern MagickExport void
00186 GetQuantumInfo(const ImageInfo *,QuantumInfo *),
00187 SetQuantumAlphaType(QuantumInfo *,const QuantumAlphaType),
00188 SetQuantumImageType(Image *,const QuantumType),
00189 SetQuantumMinIsWhite(QuantumInfo *,const MagickBooleanType),
00190 SetQuantumPack(QuantumInfo *,const MagickBooleanType),
00191 SetQuantumQuantum(QuantumInfo *,const size_t),
00192 SetQuantumScale(QuantumInfo *,const double);
00193
00194 #if defined(__cplusplus) || defined(c_plusplus)
00195 }
00196 #endif
00197
00198 #endif