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

Generated on 26 Oct 2019 for MagickCore by  doxygen 1.6.1