quantum.h

Go to the documentation of this file.
00001 /*
00002   Copyright 1999-2019 ImageMagick Studio LLC, a non-profit organization
00003   dedicated to making software imaging solutions freely available.
00004 
00005   You may not use this file except in compliance with the License.  You may
00006   obtain a copy of the License at
00007 
00008     https://imagemagick.org/script/license.php
00009 
00010   Unless required by applicable law or agreed to in writing, software
00011   distributed under the License is distributed on an "AS IS" BASIS,
00012   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013   See the License for the specific language governing permissions and
00014   limitations under the License.
00015 
00016   MagickCore quantum inline methods.
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,  /* deprecated */
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 quantum)
00089 {
00090 #if defined(MAGICKCORE_HDRI_SUPPORT)
00091   return((Quantum) quantum);
00092 #else
00093   if (quantum <= 0.0f)
00094     return((Quantum) 0);
00095   if (quantum >= (MagickRealType) QuantumRange)
00096     return(QuantumRange);
00097   return((Quantum) (quantum+0.5f));
00098 #endif
00099 }
00100 
00101 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
00102 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00103 {
00104 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00105   return((unsigned char) quantum);
00106 #else
00107   if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00108     return(0);
00109   if (quantum >= 255.0)
00110     return(255);
00111   return((unsigned char) (quantum+0.5));
00112 #endif
00113 }
00114 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
00115 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00116 {
00117 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00118   return((unsigned char) (((quantum+128UL)-((quantum+128UL) >> 8)) >> 8));
00119 #else
00120   if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00121     return(0);
00122   if ((quantum/257.0) >= 255.0)
00123     return(255);
00124   return((unsigned char) (quantum/257.0+0.5));
00125 #endif
00126 }
00127 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
00128 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00129 {
00130 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00131   return((unsigned char) ((quantum+MagickULLConstant(8421504))/
00132     MagickULLConstant(16843009)));
00133 #else
00134   if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00135     return(0);
00136   if ((quantum/16843009.0) >= 255.0)
00137     return(255);
00138   return((unsigned char) (quantum/16843009.0+0.5));
00139 #endif
00140 }
00141 #elif (MAGICKCORE_QUANTUM_DEPTH == 64)
00142 static inline unsigned char ScaleQuantumToChar(const Quantum quantum)
00143 {
00144 #if !defined(MAGICKCORE_HDRI_SUPPORT)
00145   return((unsigned char) (quantum/72340172838076673.0+0.5));
00146 #else
00147   if ((IsNaN(quantum) != MagickFalse) || (quantum <= 0.0))
00148     return(0);
00149   if ((quantum/72340172838076673.0) >= 255.0)
00150     return(255);
00151   return((unsigned char) (quantum/72340172838076673.0+0.5));
00152 #endif
00153 }
00154 #endif
00155 
00156 extern MagickExport EndianType
00157   GetQuantumEndian(const QuantumInfo *);
00158 
00159 extern MagickExport MagickBooleanType
00160   SetQuantumDepth(const Image *,QuantumInfo *,const size_t),
00161   SetQuantumEndian(const Image *,QuantumInfo *,const EndianType),
00162   SetQuantumFormat(const Image *,QuantumInfo *,const QuantumFormatType),
00163   SetQuantumPad(const Image *,QuantumInfo *,const size_t);
00164 
00165 extern MagickExport QuantumFormatType
00166   GetQuantumFormat(const QuantumInfo *);
00167 
00168 extern MagickExport QuantumInfo
00169   *AcquireQuantumInfo(const ImageInfo *,Image *),
00170   *DestroyQuantumInfo(QuantumInfo *);
00171 
00172 extern MagickExport QuantumType
00173   GetQuantumType(Image *,ExceptionInfo *);
00174 
00175 extern MagickExport size_t
00176   ExportQuantumPixels(const Image *,const CacheView *,const QuantumInfo *,
00177     const QuantumType,unsigned char *magick_restrict,ExceptionInfo *),
00178   GetQuantumExtent(const Image *,const QuantumInfo *,const QuantumType),
00179   ImportQuantumPixels(Image *,CacheView *,const QuantumInfo *,const QuantumType,
00180     const unsigned char *magick_restrict,ExceptionInfo *);
00181 
00182 extern MagickExport unsigned char
00183   *GetQuantumPixels(const QuantumInfo *);
00184 
00185 extern MagickExport void
00186   GetQuantumInfo(const ImageInfo *,QuantumInfo *),
00187   SetQuantumAlphaType(QuantumInfo *,const QuantumAlphaType),
00188   SetQuantumImageType(Image *,const QuantumType),
00189   SetQuantumMinIsWhite(QuantumInfo *,const MagickBooleanType),
00190   SetQuantumPack(QuantumInfo *,const MagickBooleanType),
00191   SetQuantumQuantum(QuantumInfo *,const size_t),
00192   SetQuantumScale(QuantumInfo *,const double);
00193 
00194 #if defined(__cplusplus) || defined(c_plusplus)
00195 }
00196 #endif
00197 
00198 #endif

Generated on 29 Oct 2019 for MagickCore by  doxygen 1.6.1