]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/magick-type.h
(no commit message)
[imagemagick] / MagickCore / magick-type.h
index a70527ffa87650d1911787c4ed8db0db4d2e9850..6ea55bc3f3d6817fe26c92e0e3c142bce9e5895b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization
+  Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization
   dedicated to making software imaging solutions freely available.
   
   You may not use this file except in compliance with the License.
 #ifndef _MAGICKCORE_MAGICK_TYPE_H
 #define _MAGICKCORE_MAGICK_TYPE_H
 
+#include "MagickCore/magick-config.h"
+
 #if defined(__cplusplus) || defined(c_plusplus)
 extern "C" {
 #endif
 
-#include "MagickCore/magick-config.h"
-
 #if !defined(MAGICKCORE_QUANTUM_DEPTH)
 #define MAGICKCORE_QUANTUM_DEPTH  16
 #endif
 
-#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__MINGW32__)
+#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__MINGW32__) && !defined(__MINGW64__)
 #  define MagickLLConstant(c)  (MagickOffsetType) (c ## i64)
 #  define MagickULLConstant(c)  (MagickSizeType) (c ## ui64)
 #else
@@ -36,70 +36,70 @@ extern "C" {
 #  define MagickULLConstant(c)  (MagickSizeType) (c ## ULL)
 #endif
 
+#if !defined(MAGICKCORE_HAVE_DOUBLE_T)
+typedef double double_t;
+#endif
+#if !defined(MAGICKCORE_HAVE_FLOAT_T)
+typedef float float_t;
+#endif
+
 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
-#define MagickEpsilon  1.0e-6
-#define MagickHuge     1.0e6
 #define MaxColormapSize  256UL
 #define MaxMap  255UL
+typedef float_t MagickRealType;
 
-typedef double MagickRealType;
 #if defined(MAGICKCORE_HDRI_SUPPORT)
 typedef float Quantum;
 #define QuantumRange  255.0
 #define QuantumFormat  "%g"
 #else
 typedef unsigned char Quantum;
-#define QuantumRange  255
+#define QuantumRange  ((Quantum) 255)
 #define QuantumFormat  "%u"
 #endif
 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
-#define MagickEpsilon  1.0e-10
-#define MagickHuge     1.0e12
 #define MaxColormapSize  65536UL
 #define MaxMap  65535UL
+typedef float_t MagickRealType;
 
-typedef double MagickRealType;
 #if defined(MAGICKCORE_HDRI_SUPPORT)
 typedef float Quantum;
 #define QuantumRange  65535.0
 #define QuantumFormat  "%g"
 #else
 typedef unsigned short Quantum;
-#define QuantumRange  65535
+#define QuantumRange  ((Quantum) 65535)
 #define QuantumFormat  "%u"
 #endif
 #elif (MAGICKCORE_QUANTUM_DEPTH == 32)
-#define MagickEpsilon  1.0e-10
-#define MagickHuge     1.0e12
 #define MaxColormapSize  65536UL
 #define MaxMap  65535UL
+typedef float_t MagickRealType;
 
-typedef double MagickRealType;
 #if defined(MAGICKCORE_HDRI_SUPPORT)
 typedef float Quantum;
 #define QuantumRange  4294967295.0
 #define QuantumFormat  "%g"
 #else
 typedef unsigned int Quantum;
-#define QuantumRange  4294967295
+#define QuantumRange  ((Quantum) 4294967295)
 #define QuantumFormat  "%u"
 #endif
-#elif (MAGICKCORE_QUANTUM_DEPTH == 64) && defined(MAGICKCORE_HAVE_LONG_DOUBLE_WIDER)
-#define MagickEpsilon  1.0e-10
-#define MagickHuge     1.0e12
+#elif (MAGICKCORE_QUANTUM_DEPTH == 64)
+#define MAGICKCORE_HDRI_SUPPORT
 #define MaxColormapSize  65536UL
 #define MaxMap  65535UL
 
 typedef long double MagickRealType;
-typedef double Quantum;
+typedef double_t Quantum;
 #define QuantumRange  18446744073709551615.0
 #define QuantumFormat  "%g"
 #else
-#if !defined(_CH_)
-# error "MAGICKCORE_QUANTUM_DEPTH must be one of 8, 16, 32, or 64"
+#error "MAGICKCORE_QUANTUM_DEPTH must be one of 8, 16, 32, or 64"
 #endif
-#endif
-#define MagickPI     3.14159265358979323846264338327950288419716939937510L
+#define MagickEpsilon  (1.0e-15)
+#define MagickMaximumValue  1.79769313486231570E+308
+#define MagickMinimumValue   2.22507385850720140E-308
 #define QuantumScale  ((double) 1.0/(double) QuantumRange)
 
 /*
@@ -131,37 +131,10 @@ typedef MagickOffsetType QuantumAny;
 typedef MagickSizeType QuantumAny;
 #endif
 
-#define MaxPixelChannels  4096
-
 #if defined(macintosh)
 #define ExceptionInfo  MagickExceptionInfo
 #endif
 
-typedef enum
-{
-  UndefinedChannel,
-  RedChannel = 0x0001,
-  GrayChannel = 0x0001,
-  CyanChannel = 0x0001,
-  GreenChannel = 0x0002,
-  MagentaChannel = 0x0002,
-  BlueChannel = 0x0004,
-  YellowChannel = 0x0004,
-  AlphaChannel = 0x0008,
-  OpacityChannel = 0x0008,
-  BlackChannel = 0x0020,
-  CompositeChannels = 0x002F,
-  AllChannels = ~0L,
-  /*
-    Special purpose channel types.
-  */
-  TrueAlphaChannel = 0x0040, /* extract actual alpha channel from opacity */
-  RGBChannels = 0x0080,      /* set alpha from  grayscale mask in RGB */
-  GrayChannels = 0x0080,
-  SyncChannels = 0x0100,     /* channels should be modified equally */
-  DefaultChannels = ((AllChannels | SyncChannels) &~ OpacityChannel)
-} ChannelType;
-
 typedef enum
 {
   UndefinedClass,
@@ -175,6 +148,57 @@ typedef enum
   MagickTrue = 1
 } MagickBooleanType;
 
+/*
+   Define some short-hand macros for handling MagickBooleanType
+   and uses fast C typing with C boolean operations
+
+     Is  -- returns a MagickBooleanType (for storage)
+     If  -- returns C integer boolean (for if's and while's)
+
+   IfMagickTrue()     converts MagickBooleanType to C integer Boolean
+   IfMagickFalse()    Not the MagickBooleanType to C integer Boolean
+
+   IsMagickTrue()     converts a C integer boolean to a MagickBooleanType
+   IsMagickFalse()    converts and is also a MagickBooleanType 'not' operation
+
+   IsMagickNULL()
+   IsMagickNotNULL()  converts C pointers tests MagickBooleanType
+*/
+#if 1
+/* Fast C typing method assumes MagickBooleanType match 0,1 values */
+#  define IfMagickTrue(v)  ((int)(v))
+#  define IfMagickFalse(v) (!(int)(v))
+#  define IsMagickTrue(v)  ((MagickBooleanType)((int)(v)!=0))
+#  define IsMagickFalse(v) ((MagickBooleanType)(!(int)(v)))
+#  define IsMagickNot(v)   ((MagickBooleanType)(!(int)(v)))
+#else
+/* Do not depend MagickBooleanType's values */
+#  define IfMagickTrue(v)  ((v) != MagickFalse)
+#  define IfMagickFalse(v) ((v) == MagickFalse)
+#  define IsMagickTrue(v)  ((v)?MagickTrue:MagickFalse)
+#  define IsMagickFalse(v) ((v)?MagickFalse:MagickTrue)
+#  define IsMagickNot(v)   (IfMagickTrue(v)?MagickFalse:MagickTrue)
+#endif
+#define IfStringTrue(v)       IfMagickTrue(IsStringTrue(v))
+#define IfStringNotFalse(v)   IfMagickTrue(IsStringNotFalse(v))
+#define IsMagickNULL(v)       (((void *)(v) == NULL)?MagickTrue:MagickFalse)
+#define IsMagickNotNULL(v)    (((void *)(v) != NULL)?MagickTrue:MagickFalse)
+
+/*
+  The IsNaN and IfNan tests for special floating point numbers of
+  value NaN (not a number).  NaN's are defined as part of the IEEE standard
+  for floating point number representation, and need to be watched out for.
+  Morphology Kernels often use these special numbers as neighbourhood masks.
+
+  The special property that two NaN's are never equal, even if they are from
+  the same variable allows you to test if a value is special NaN value.
+
+  The macros are thus is only true if the value given is NaN.
+*/
+#  define IfNaN(a) ((a) != (a))
+#  define IsNaN(a) ((a) != (a)?MagickTrue:MagickFalse)
+
+
 typedef struct _BlobInfo BlobInfo;
 
 typedef struct _ExceptionInfo ExceptionInfo;