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 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

Generated on 26 Oct 2019 for MagickCore by  doxygen 1.6.1