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