csftypes.h

来自「支持各种栅格图像和矢量图像读取的库」· C头文件 代码 · 共 417 行

H
417
字号
#ifndef INCLUDED_CSFTYPES# define INCLUDED_CSFTYPES#ifdef USE_IN_GDAL#include "cpl_port.h"#endif#ifdef __cplusplus extern "C" { #define CSF_IN_GLOBAL_NS ::#else #define CSF_IN_GLOBAL_NS#endif#ifdef CSF_V1# error include file CSF version 2 used while CSF_V1 is defined#endif/* MACHINE AND OPERATING SYSTEM DEPENDENT SECTION: * (LOOK AND CONFIGURE YOUR MACHINE/OS) *  - Retype all types for file i/o *  - Define endian mode *  - Compliance mode (POSIX/XOPEN) */#ifdef THINK_C# error read notes in csftypes.h  /* Some history:   *   THINK C 3.0:   *     - does not know the keyword signed   *     - uses a 12-byte for double if compiled with   *       the in-line 68881 option   */#endif /* the only 64 bit cpu we tested on:  * -ifdef __alpha  * don't use long  * -define CSF_4BYTE_INT_SIZE_SPECIFIER long  */#define CSF_4BYTE_INT_SIZE_SPECIFIER/* some old C++ compiler complains * about signed */#ifdef SIGNED_NOT_IMPL# define CSF_SIGNED_SPECIFIER#else# define CSF_SIGNED_SPECIFIER signed#endif/* the last-character figure is the * size in bytes of the data type */typedef CSF_SIGNED_SPECIFIER char INT1;typedef unsigned             char UINT1;#ifdef USE_IN_GDALtypedef GInt16   INT2;typedef GInt32   INT4;typedef GUInt16 UINT2;typedef GUInt32  UINT4;#elsetypedef CSF_SIGNED_SPECIFIER short                        int  INT2;typedef CSF_SIGNED_SPECIFIER CSF_4BYTE_INT_SIZE_SPECIFIER int  INT4;typedef unsigned             short                        int  UINT2;typedef unsigned             CSF_4BYTE_INT_SIZE_SPECIFIER int  UINT4;#endif#undef CSF_4BYTE_INT_SIZE_SPECIFIER#undef CSF_SIGNED_SPECIFIERtypedef float               REAL4; /* IEEE-754 32-bit */typedef double              REAL8; /* IEEE-754 64-bit *//* 64 bit specifier not yet used * but here is some code */#if defined(__GCC__) || defined(__MINGW32__)/* assume gcc, gcc likes it like this */typedef          long long  CSF_INT8;typedef unsigned long long  CSF_UINT8;#else#if defined(WIN32)typedef          __int64    CSF_INT8;typedef unsigned __int64    CSF_UINT8;#endif#endif/* endian mode * DEFINE WITH -D or find here */#ifndef CPU_BIG_ENDIAN# ifndef CPU_LITTLE_ENDIAN#ifdef USE_IN_GDAL  /* GDAL CPL STYLE */# ifdef CPL_LSB#  define CPU_LITTLE_ENDIAN# endif# ifdef CPL_MSB#  define CPU_BIG_ENDIAN# endif#else /* probe a few: */#ifdef _AIX/* IBM AIX defines this on RS/6000 */# define CPU_BIG_ENDIAN#endif#ifdef sparc/* both cc and gcc defines this in SunOS */# define CPU_BIG_ENDIAN#endif/* * #ifdef mips * worked once on the SGI machines * but mips has both endian architectures * # define CPU_BIG_ENDIAN * #endif */#ifdef __alpha/* DEC alpha defines this * tested on OSF1 planet V4.0 1229 alpha *   in combo with egcs/gcc 2.95.2 */#  define CPU_LITTLE_ENDIAN#endif#ifdef __i386__/* linux/gcc defines this on intel 80x86 platform */#  define CPU_LITTLE_ENDIAN#endif#ifdef _M_IX86/* Borland C defines this *//* Win32/MSC defines this on intel 80x86 platform */#  define CPU_LITTLE_ENDIAN#endif#ifdef __hppa/* cc and gcc defines this on HP PA risc platform */#  define CPU_BIG_ENDIAN#endif/* endif probing */# endif /* endif no ENDIAN defined */# endif#endif/* POSIX or XOPEN compliance *  The only need for the POSIX or even XOPEN superset *  over ANSI-C are *  M_PI    HP-UX complained about that and it seems in XOPEN * solution: *  M_PI is defined in situ in source files if it is not defined *    (most times in math.h) * we probe a few systems to find if we may define it */#ifdef __hpux# ifndef _XOPEN_SOURCE#  define _XOPEN_SOURCE# endif#endif/* END OF MACHINE AND OPERATING SYSTEM DEPENDENT SECTION * NO NEED TO EDIT ANYTHING BELOW THIS POINT *//* PROJECTION *//* version 1 types, no longer used */#define PT_XY  0  /* XY-field (= PT_YINCT2B)                            */#define PT_UTM 1  /* Universal Transverse Mercator (= PT_YDECT2B)                            */#define PT_LATLON 2  /* Lattitude / Longitude (= PT_YDECT2B)                            */#define PT_CART        3  /* Carthesian (= PT_YDECT2B)                            */#define PT_RDM 4  /* Rijks Driehoek Metingen stelsel (= PT_YDECT2B)                            *//* the only difference we make is whether Y increases from * top to bottom or decreases from top to bottom */typedef enum CSF_PT {	/* * these two can be returned by or passed to a csf2 function */	PT_YINCT2B=0,    /* Y increase from top to bottom */	PT_YDECT2B=1,    /* Y decrease from top to bottom */	/* * this one CANNOT be returned by NOR passed to a csf2 function */	PT_UNDEFINED=100 /* just some value different from the rest */} CSF_PT;/* DATATYPE * A.K.A. VALUESCALE *//* historical errors don't use them: * #define VS_NOTCLASSIFIED 2	 * #define VS_CONTINUES 	 2 * * NOTE new VS_* types must be different from CR_* values *      VS_BOOLEAN       0xE0 => 224 *      VS_NOMINAL       0xE2 => 226 *      VS_ORDINAL       0xF2 => 242 *      VS_SCALAR        0xEB => 235 *      VS_DIRECTION     0xFB => 251 *      VS_LDD           0xF0 => 240 *      VS_VECTOR        0xEC => 236 *      VS_VECTOR        0xEC vector, not used yet */typedef enum CSF_VS {	/* * version 1 datatypes,	 * these can be returned by BUT NOT passed to a csf2 function	 */        VS_NOTDETERMINED=0, /* version 1  */        VS_CLASSIFIED   =1, /* version 1  */        VS_CONTINUOUS 	=2, /* version 1  */        /* * version 2 datatypes	 * these two can be returned by or passed to a csf2 function	 */        VS_BOOLEAN      =0xE0,/* boolean, always UINT1, values: 0,1 or MV_UINT1 */        VS_NOMINAL      =0xE2,/* nominal, UINT1 or INT4 */        VS_ORDINAL      =0xF2,/* ordinal, UINT1 or INT4 */        VS_SCALAR       =0xEB,/* scalar, REAL4 or (maybe) REAL8 */        VS_DIRECTION    =0xFB,/* directional REAL4 or (maybe) REAL8, -1 means no direction */        VS_LDD          =0xF0,/* local drain direction, always UINT1, values: 1-9 or MV_UINT1 */	/* * this one CANNOT be returned by NOR passed to a csf2 function */	VS_UNDEFINED    =100 /* just some value different from the rest */} CSF_VS;/* CELL REPRESENTATION   CR_UINT1      0x00 =>   0   CR_INT4       0x26 =>  38   CR_REAL4      0x5A =>  90   CR_INT1	 0x04 =>   4   CR_INT2	 0x15 =>  21   CR_UINT2	 0x11 =>  17   CR_UINT4	 0x22 =>  34   CR_REAL8	 0xDB => 219   for vector types   CR_VECT4	0x??   CR_VECT8	0x?? */typedef enum CSF_CR {       /* * preferred version 2 cell representations        */	CR_UINT1      =0x00, /*  boolean, ldd and small nominal and small ordinal */	CR_INT4       =0x26, /*  large nominal and large ordinal */	CR_REAL4      =0x5A, /*  single scalar and single directional */       /* * other version 2 cell representations        */	CR_REAL8      =0xDB, /* double scalar or directional, and also the only type that	                      * can hold all	                      * cell representation without loss of precision	                      */       /* * version 1 cell representations	* these can be returned by BUT NOT passed to a csf2 function        */	CR_INT1	      =0x04, /* . */	CR_INT2	      =0x15, /* . */	CR_UINT2      =0x11, /* . */	CR_UINT4      =0x22, /* . */	/* * this one CANNOT be returned by NOR passed to a csf2 function */        CR_UNDEFINED  =100 /* just some value different from the rest */} CSF_CR;/* how to get the cellsize from these type identifiers */#define CSF_SIZE_MASK 		((size_t)0x03)#define CSF_SIGN_MASK		((size_t)0x04)#define CSF_FLOAT_MASK		((size_t)0x08)#define CSF_FLOAT_SIGN_MASK	((size_t)0x0C)#define CSF_SIZE_MV_MASK	((size_t)0x30)#define CSF_SKIP_MASK		((size_t)0xC0)/* low nibble is uniq for every CR_VALUE: */#define CSF_UNIQ_MASK	((size_t)0x0F)#define CSF_POS_SIZE_MV_MASK 	((size_t)4)#define CSF_POS_SKIP_MASK       ((size_t)6)#define CSF_UNIQ_CR_MASK(type)  ((size_t)((type) & CSF_UNIQ_MASK))#define LOG_CELLSIZE(type)  	((size_t)((type) & CSF_SIZE_MASK))#define CELLSIZE(type)  	((size_t)(1 << LOG_CELLSIZE(type)))#define CSFSIZEOF(nr, type)	((size_t)(((size_t)nr) << LOG_CELLSIZE(type)))#include <float.h> /* FLT_MIN, DBL_MAX, DBL_MAX, FLT_MAX */#define MV_INT1   ((CSF_IN_GLOBAL_NS INT1)-128)#define MV_INT2   ((CSF_IN_GLOBAL_NS INT2)-32768)/* cl C4146 has it right  #define MV_INT4   ((CSF_IN_GLOBAL_NS INT4)-2147483648)   is dangerous */#define MV_INT4   ((CSF_IN_GLOBAL_NS INT4)0x80000000L)#define MV_UINT1  ((CSF_IN_GLOBAL_NS UINT1)0xFF)#define MV_UINT2  ((CSF_IN_GLOBAL_NS UINT2)0xFFFF)#define MV_UINT4  ((CSF_IN_GLOBAL_NS UINT4)0xFFFFFFFFL)#define INT2_MIN  ((INT2)(MV_INT2+1))#define INT2_MAX  ((INT2)0x7FFF)#define UINT1_MIN ((UINT1)0)#define UINT1_MAX ((UINT1)(MV_UINT1-1))#define INT4_MIN   ((INT4)(MV_INT4+1))#define INT4_MAX   ((INT4)0x7FFFFFFFL)#define REAL4_MIN  ((REAL4)(FLT_MIN))#define REAL4_MAX  ((REAL4)(FLT_MAX))#define REAL8_MIN  ((REAL8)(DBL_MIN))#define REAL8_MAX  ((REAL8)(DBL_MAX))/* x is a pointer to a value */#define IS_MV_UINT1(x)	((*((const CSF_IN_GLOBAL_NS UINT1 *)x)) == MV_UINT1)#define IS_MV_UINT2(x)	((*((const CSF_IN_GLOBAL_NS UINT2 *)x)) == MV_UINT2)#define IS_MV_UINT4(x)	((*((const CSF_IN_GLOBAL_NS UINT4 *)x)) == MV_UINT4)#define IS_MV_INT1(x)	((*((const CSF_IN_GLOBAL_NS INT1 *)x)) == MV_INT1)#define IS_MV_INT2(x)	((*((const CSF_IN_GLOBAL_NS INT2 *)x)) == MV_INT2)#define IS_MV_INT4(x)	((*((const CSF_IN_GLOBAL_NS INT4 *)x)) == MV_INT4)/* MV_REAL4 and MV_REAL8 are bitpatterns with all 1's that * are NAN's * MV_REAL4 has the same bitpattern as a MV_UINT4 * MV_REAL8 has the same bitpattern as two MV_UINT4's *          only the first 32 bits already identify a NAN,  *          so that's what we test */#ifdef CPU_LITTLE_ENDIAN# ifdef CPU_BIG_ENDIAN#  error CPU_BIG_ENDIAN and CPU_LITTLE_ENDIAN are both defined# endif# ifdef INTEL16#  define IS_MV_REAL4(x) (((const UINT2 *)(x))[1] == MV_UINT2)#  define IS_MV_REAL8(x) (((const UINT2 *)(x))[3] == MV_UINT2)# else#  define IS_MV_REAL4(x) ((*((const CSF_IN_GLOBAL_NS UINT4 *)(x))) == MV_UINT4)#  define IS_MV_REAL8(x) (((const CSF_IN_GLOBAL_NS UINT4 *)(x))[1] == MV_UINT4)# endif#else# ifdef CPU_BIG_ENDIAN#  ifdef CPU_LITTLE_ENDIAN#   error CPU_BIG_ENDIAN and CPU_LITTLE_ENDIAN are both defined#  endif#  define IS_MV_REAL4(x) (((const UINT4 *)(x))[0] == MV_UINT4)#  define IS_MV_REAL8(x) (((const UINT4 *)(x))[0] == MV_UINT4)# else#  error BYTE ORDER NOT SPECIFIED (CPU_LITTLE_ENDIAN or CPU_BIG_ENDIAN)# endif#endif/* some special values */#define LDD_PIT          5#define DIR_NODIRECTION -1/* some special macro's * x is a pointer */#define SET_MV_UINT1(x)	( (*((UINT1 *)(x))) = MV_UINT1)#define SET_MV_UINT2(x)	( (*((UINT2 *)(x))) = MV_UINT2)#define SET_MV_UINT4(x)	( (*((UINT4 *)(x))) = MV_UINT4)#define SET_MV_INT1(x)	( (*(( INT1 *)(x))) = MV_INT1)#define SET_MV_INT2(x)	( (*(( INT2 *)(x))) = MV_INT2)#define SET_MV_INT4(x)	( (*(( INT4 *)(x))) = MV_INT4)#define	SET_MV_REAL4(x)	((*(CSF_IN_GLOBAL_NS UINT4 *)(x)) = MV_UINT4)#define	SET_MV_REAL8(x)	SET_MV_REAL4((x)),SET_MV_REAL4((((CSF_IN_GLOBAL_NS UINT4 *)(x))+1))/* copy of floats  by typecasting to * an integer since MV_REAL? is a NAN */#define	COPY_REAL4(dest,src) ( (*(UINT4 *)(dest)) = (*(const UINT4 *)(src)) )#define	COPY_REAL8(dest,src) COPY_REAL4((dest),(src)),\		COPY_REAL4( (((UINT4 *)(dest))+1),(((const UINT4 *)(src))+1) )#ifdef __cplusplus };#endif#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?