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