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