cyfile.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:7k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. /* module: cyfile.h echo image header file */
  5. /* @(#)cyfile.h 1.30 */
  6. /* globals */
  7. /* Internal types, These modules all assume the following types:
  8.  *
  9.  * char 1 byte signed integer, -128...127
  10.  * unsigned char 1 byte unsigned integer, 0...255
  11.  * short 2 byte signed integer, -32,768...32,767
  12.  * unsigned short 2 byte unsigned integer, 0...65,535
  13.  * long 4 byte signed integer, -2,147,483,648...2,147,483,647
  14.  * unsigned long 4 byte unsigned integer, 0...4,294,967,295
  15.  * real a real variable natural to the machine
  16.  * int at least as long as short
  17.  * unsigned int at least as long as unsigned short
  18.  *
  19.  * All other types are to be enclosed in #ifdefs.
  20.  */
  21. /* file constants, unpacked */
  22. #define MAXR (0x00007fff<<gs->rshift)
  23. #define MAXRGS(gs)  (0x00007fff<<(gs)->rshift)
  24. #define MINR 0
  25.   /*#define VOID (0xffff8000<<gs->rshift)*/
  26. #define VOIDGS(gs) (0xffff8000<<(gs)->rshift)
  27. #ifndef NULL
  28. #define NULL 0 /* null address */
  29. #endif
  30. /* math tools */
  31. #ifndef MAX
  32. #define MAX(a,b) ((a)>(b)?(a):(b)) /* return greater of a and b */
  33. #endif
  34. #ifndef MIN
  35. #define MIN(a,b) ((a)<(b)?(a):(b)) /* return lesser of a and b */
  36. #endif
  37. #ifndef ABS
  38. #define ABS(i) ((i)<0?-(i):(i)) /* integer absolute value */
  39. #endif
  40. #define DELTA(a,b) (ABS((a)-(b))) /* int absolute difference */
  41. #define SCALE(n,s) ((((n)*(s))+50)/100) /* int scale n by s percent */
  42. #define WRAPP(n,m) (if((n)>=(m))(n)-=(m)) /* modulo positive wrap */
  43. #define WRAPN(n,m) (if((n)<0)(n)+=(m)) /* modulo positive wrap */
  44. /* unit conversions */
  45. #define UMTOI(um) ((real)(um)*3.937e-5) /* microns (um) to float inch */
  46. #define ITOUM(um) ((int)((um)*2.54e4)) /* inches to int microns */
  47. #define URTOD(ur) ((real)(ur)*5.7296e-5) /* urads to float degrees */
  48. #define DTOUR(deg) ((int)((deg)*1.74533e4) /* degrees to int urads */
  49. #define DTOR(deg) ((deg)*1.7453292e-2) /* degrees to float radians */
  50. #define RTOD(rad) ((rad)*57.295779) /* radians to float degrees */
  51. #define URTOR(ur) ((real)(ur)*1.e-6) /* radians to urads */
  52. #define RTOUR(ur) (int)((ur)*1.e6) /* radians to urads */
  53. /* this structure defines 'grid file format'.  the file consists of
  54.  * a parameter table followed immediatly by the data table.  the offset
  55.  * to the start of the data table is the second parameter and is therefore
  56.  * fifth thru eighth bytes of the file (msb first).
  57.  *
  58.  * the parameters nlg and nlt are important for accessing the data.  nlg
  59.  * is the number of longitude entries in the table.  nlt is the number of
  60.  * latitudes in the table.  nlt * nlg * 2 gives the number of bytes in the
  61.  * table.
  62.  *
  63.  * the table is a set of radius values in a cylindrical coordinate space.
  64.  * each radius value is stored in a 2 byte integer which when shifted
  65.  * left by RSHIFT bits yields a radius in microns (4 byte long integer).
  66.  * the radius values are stored in longitudnal groups of nlt values.  there
  67.  * are nlg of these groups, one for each longitude of the cylinder.
  68.  *
  69.  * the functions GETR() and PUTR() defined below are usually all that is
  70.  * required to fetch and store values in the table when it is in memory.
  71.  * the parameters ltincr and lgincr define the distance between adjacent
  72.  * latitudes (microns) and adjacent longitudes (microradians) respectively.
  73.  *
  74.  * There are two formats for this header, one portable, one not so
  75.  * portable.  The older non-portable type is binary and has the value
  76.  * 122 decimal ('z') in the fifth byte.  The portable header has a 'r'
  77.  * in the fifth byte.  The portable header is in ascii and has the form
  78.  * [name=value],... where name is a defined ascii symbol and value is a
  79.  * string value for the symbol.  Format is variable and assignments are
  80.  * separated by white space or commas.
  81.  *
  82.  * See header.c for details.
  83.  */
  84. #define NAMELEN 40
  85. #define CREATE_MODE 0644 /* create image files with this mode */
  86. typedef struct {
  87. /* internal private variables */
  88. short *base; /* base of data buffer */
  89. long offset; /* file offset to start of data, bytes */
  90. /* file parameters */
  91. char name[NAMELEN]; /* subject name */
  92. time_t time; /* original creation time */
  93. short camera; /* camera id number */
  94. short setup; /* camera setup code */
  95. char saved; /* file has been saved since modified */
  96. char valid; /* file buffer is valid */
  97. /* data parameters */
  98. short nlt; /* number of latitude intervals */
  99. short nlg; /* number of longitude intervals */
  100. short rshift; /* shift to compress/expand radius data */
  101. short lgshift; /* shift to extract longitude from addr */
  102. long flags; /* misc file state flags, see below */
  103. long ltincr; /* distance between latitudes, um */
  104. long lgincr; /* distance between longitudes, urad */
  105. long ltsize; /* nlat * ltincr, um */
  106. long lgsize; /* nlg * lgincr, urad (always 2pi in urads) */
  107. /* user parameters */
  108. char filled; /* fill flag, useless */
  109. short smoothed; /* smooth pass counter */
  110. short ltmin, ltmax; /* latitude window limits, inclusive */
  111. short lgmin, lgmax; /* longitude window limits, inclusive */
  112. long rmin, rmax; /* radius range, from last run of rminmax */
  113. # ifdef IRIS
  114. long float scale; /* current scale */
  115. long float rprop; /* current radius proportion */
  116. # else
  117. double scale; /* current scale */
  118. double rprop; /* current radius proportion */
  119. # endif
  120. } GSPEC;
  121. /* macros for standardizing the use of the grid data. gs is a pointer to the
  122.  * applicable GSSPEC table.  index is the offset of a data item in the
  123.  * data. lt and lg are latitude and longitude indicies. r is the radius
  124.  * in microns (um) of a data point. z is a position along the cylindrical
  125.  * axis in microns. a is an angular coordinate around the cylinder in 
  126.  * microradians (urad).
  127.  *
  128.  * INDEX generates an index value from latitude and logitude indicies.
  129.  * ADDR returns the absolute address of a data item.
  130.  * PUTR and GETR are used to store and retrieve data from the image.
  131.  */
  132. #define INDEX(gs, lt, lg) ((lg) * (gs)->nlt + (lt))
  133. #define ADDR(gs, lt, lg) ((gs)->base + INDEX(gs, lt, lg))
  134. #ifdef HIGHC
  135. # define GETR(gs, lt, lg)       getr(gs,lt,lg)
  136. # define PUTR(gs, lt, lg, r)       putr(gs,lt,lg,r)
  137. #else
  138. # define PUTR(gs, lt, lg, r) (*ADDR(gs, lt, lg) = (r) >> (gs)->rshift)
  139. # define GETR(gs, lt, lg) ((int)*ADDR(gs, lt, lg) << (gs)->rshift)
  140. #endif
  141. /* flag bits for gs->flags */
  142. #define FLAG_RESERVED 0x000000ff /* older files have ones here, ignore */
  143. #define FLAG_CARTESIAN 0x00000100 /* data is cartesian (vs. cyl) */
  144. #define FLAG_OLDHEADER 0x00000200 /* please write file with old header */
  145. #define FLAG_BILATERAL 0x00000400 /* bilateral image, ie: nus hands */
  146. #define FLAG_COLOR 0x00000800 /* image has associated color file */
  147. #define FLAG_THETARIGHT 0x00001000 /* theta is right hand rule */
  148. #define FLAG_INSIDE_OUT 0x00002000 /* inside surface is outside */
  149. /* non-int public functions */
  150. extern GSPEC *cyread(GSPEC *gs,int fd);
  151. extern int cywrite(GSPEC *gs,int fd);
  152. extern void cyfree(GSPEC *gs);
  153. extern long getr(register GSPEC *gs,register int lt,register int lg);
  154. extern void putr(register GSPEC *gs,register int lt,register int lg,
  155.  register int r);
  156. extern int gsget(GSPEC *gs,int fd);
  157. extern int gsput(GSPEC *gs,int fd);
  158. extern int gdget(GSPEC *gs,int fd);
  159. extern int gdput(GSPEC *gs,int fd);
  160. extern int gdallo(GSPEC *gs);
  161. extern long getheader(int fd);
  162. extern int getvalue(char *name,char *dest,int length);
  163. extern int makegsheader(GSPEC *gs);
  164. extern int writegsheader(GSPEC *gs,int fd);
  165. #ifdef __cplusplus
  166. }
  167. #endif