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 value)
00089 {
00090 #if defined(MAGICKCORE_HDRI_SUPPORT)
00091 if (value < DBL_MIN)
00092 return((Quantum) DBL_MIN);
00093 if (value > DBL_MAX)
00094 return((Quantum) DBL_MAX);
00095 return((Quantum) value);
00096 #else
00097 if (value <= 0.0f)
00098 return((Quantum) 0);
00099 if (value >= (MagickRealType) QuantumRange)
00100 return(QuantumRange);
00101 return((Quantum) (value+0.5f));
00102 #endif
00103 }
00104
00105 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
00106 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00107 {
00108 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00109 return((unsigned char) quantum);
00110 #else
00111 if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00112 return(0);
00113 if (quantum >= 255.0)
00114 return(255);
00115 return((unsigned char) (quantum+0.5));
00116 #endif
00117 }
00118 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
00119 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00120 {
00121 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00122 return((unsigned char) (((quantum+128UL)-((quantum+128UL) >> 8)) >> 8));
00123 #else
00124 if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00125 return(0);
00126 if ((quantum/257.0) >= 255.0)
00127 return(255);
00128 return((unsigned char) (quantum/257.0+0.5));
00129 #endif
00130 }
00131 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
00132 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00133 {
00134 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00135 return((unsigned char) ((quantum+MagickULLConstant(8421504))/
00136 MagickULLConstant(16843009)));
00137 #else
00138 if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00139 return(0);
00140 if ((quantum/16843009.0) >= 255.0)
00141 return(255);
00142 return((unsigned char) (quantum/16843009.0+0.5));
00143 #endif
00144 }
00145 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
00146 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00147 {
00148 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00149 return((unsigned char) (quantum/72340172838076673.0+0.5));
00150 #else
00151 if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00152 return(0);
00153 if ((quantum/72340172838076673.0) >= 255.0)
00154 return(255);
00155 return((unsigned char) (quantum/72340172838076673.0+0.5));
00156 #endif
00157 }
00158 #endif
00159
00160 extern MagickExport EndianType
00161 GetQuantumEndian(const QuantumInfo *);
00162
00163 extern MagickExport MagickBooleanType
00164 SetQuantumDepth(const Image *,QuantumInfo *,const size_t),
00165 SetQuantumEndian(const Image *,QuantumInfo *,const EndianType),
00166 SetQuantumFormat(const Image *,QuantumInfo *,const QuantumFormatType),
00167 SetQuantumPad(const Image *,QuantumInfo *,const size_t);
00168
00169 extern MagickExport QuantumFormatType
00170 GetQuantumFormat(const QuantumInfo *);
00171
00172 extern MagickExport QuantumInfo
00173 *AcquireQuantumInfo(const ImageInfo *,Image *),
00174 *DestroyQuantumInfo(QuantumInfo *);
00175
00176 extern MagickExport QuantumType
00177 GetQuantumType(Image *,ExceptionInfo *);
00178
00179 extern MagickExport size_t
00180 ExportQuantumPixels(const Image *,const CacheView *,const QuantumInfo *,
00181 const QuantumType,unsigned char *magick_restrict,ExceptionInfo *),
00182 GetQuantumExtent(const Image *,const QuantumInfo *,const QuantumType),
00183 ImportQuantumPixels(Image *,CacheView *,const QuantumInfo *,const QuantumType,
00184 const unsigned char *magick_restrict,ExceptionInfo *);
00185
00186 extern MagickExport unsigned char
00187 *GetQuantumPixels(const QuantumInfo *);
00188
00189 extern MagickExport void
00190 GetQuantumInfo(const ImageInfo *,QuantumInfo *),
00191 SetQuantumAlphaType(QuantumInfo *,const QuantumAlphaType),
00192 SetQuantumImageType(Image *,const QuantumType),
00193 SetQuantumMinIsWhite(QuantumInfo *,const MagickBooleanType),
00194 SetQuantumPack(QuantumInfo *,const MagickBooleanType),
00195 SetQuantumQuantum(QuantumInfo *,const size_t),
00196 SetQuantumScale(QuantumInfo *,const double);
00197
00198 #if defined(__cplusplus) || defined(c_plusplus)
00199 }
00200 #endif
00201
00202 #endif