/*
- 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
# 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)
/*
#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) &~ AlphaChannel)
-} ChannelType;
-
typedef enum
{
UndefinedClass,
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;