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