4  * Copyright (c) 1988-1997 Sam Leffler 
   5  * Copyright (c) 1991-1997 Silicon Graphics, Inc. 
   7  * Permission to use, copy, modify, distribute, and sell this software and  
   8  * its documentation for any purpose is hereby granted without fee, provided 
   9  * that (i) the above copyright notices and this permission notice appear in 
  10  * all copies of the software and related documentation, and (ii) the names of 
  11  * Sam Leffler and Silicon Graphics may not be used in any advertising or 
  12  * publicity relating to the software without the specific, prior written 
  13  * permission of Sam Leffler and Silicon Graphics. 
  15  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,  
  16  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY  
  17  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.   
  19  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR 
  20  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, 
  21  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  22  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF  
  23  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE  
  30  * ``Library-private'' definitions. 
  33 #include <tif_config.h> 
  39 #ifdef HAVE_SYS_TYPES_H 
  40 # include <sys/types.h> 
  56 extern void *lfind(const void *, const void *, size_t *, size_t, 
  57                    int (*)(const void *, const void *)); 
  63 #ifndef STRIP_SIZE_DEFAULT 
  64 # define STRIP_SIZE_DEFAULT 8192 
  67 #define    streq(a,b)      (strcmp(a,b) == 0) 
  74 typedef struct client_info 
{ 
  75     struct client_info 
*next
; 
  81  * Typedefs for ``method pointers'' used internally. 
  83 typedef unsigned char tidataval_t
;      /* internal image data value type */ 
  84 typedef tidataval_t
* tidata_t
;          /* reference to internal image data */ 
  86 typedef void (*TIFFVoidMethod
)(TIFF
*); 
  87 typedef int (*TIFFBoolMethod
)(TIFF
*); 
  88 typedef int (*TIFFPreMethod
)(TIFF
*, tsample_t
); 
  89 typedef int (*TIFFCodeMethod
)(TIFF
*, tidata_t
, tsize_t
, tsample_t
); 
  90 typedef int (*TIFFSeekMethod
)(TIFF
*, uint32
); 
  91 typedef void (*TIFFPostMethod
)(TIFF
*, tidata_t
, tsize_t
); 
  92 typedef uint32 (*TIFFStripMethod
)(TIFF
*, uint32
); 
  93 typedef void (*TIFFTileMethod
)(TIFF
*, uint32
*, uint32
*); 
  96         char*           tif_name
;       /* name of open file */ 
  97         int             tif_fd
;         /* open file descriptor */ 
  98         int             tif_mode
;       /* open mode (O_*) */ 
 100 #define TIFF_FILLORDER          0x0003  /* natural bit fill order for machine */ 
 101 #define TIFF_DIRTYHEADER        0x0004  /* header must be written on close */ 
 102 #define TIFF_DIRTYDIRECT        0x0008  /* current directory must be written */ 
 103 #define TIFF_BUFFERSETUP        0x0010  /* data buffers setup */ 
 104 #define TIFF_CODERSETUP         0x0020  /* encoder/decoder setup done */ 
 105 #define TIFF_BEENWRITING        0x0040  /* written 1+ scanlines to file */ 
 106 #define TIFF_SWAB               0x0080  /* byte swap file information */ 
 107 #define TIFF_NOBITREV           0x0100  /* inhibit bit reversal logic */ 
 108 #define TIFF_MYBUFFER           0x0200  /* my raw data buffer; free on close */ 
 109 #define TIFF_ISTILED            0x0400  /* file is tile, not strip- based */ 
 110 #define TIFF_MAPPED             0x0800  /* file is mapped into memory */ 
 111 #define TIFF_POSTENCODE         0x1000  /* need call to postencode routine */ 
 112 #define TIFF_INSUBIFD           0x2000  /* currently writing a subifd */ 
 113 #define TIFF_UPSAMPLED          0x4000  /* library is doing data up-sampling */  
 114 #define TIFF_STRIPCHOP          0x8000  /* enable strip chopping support */ 
 115 #define TIFF_HEADERONLY         0x10000 /* read header only, do not process */ 
 116                                         /* the first directory */ 
 117         toff_t          tif_diroff
;     /* file offset of current directory */ 
 118         toff_t          tif_nextdiroff
; /* file offset of following directory */ 
 119         toff_t
*         tif_dirlist
;    /* list of offsets to already seen */ 
 120                                         /* directories to prevent IFD looping */ 
 121         uint16          tif_dirnumber
;  /* number of already seen directories */ 
 122         TIFFDirectory   tif_dir
;        /* internal rep of current directory */ 
 123         TIFFHeader      tif_header
;     /* file's header block */ 
 124         const int*      tif_typeshift
;  /* data type shift counts */ 
 125         const long*     tif_typemask
;   /* data type masks */ 
 126         uint32          tif_row
;        /* current scanline */ 
 127         tdir_t          tif_curdir
;     /* current directory (index) */ 
 128         tstrip_t        tif_curstrip
;   /* current strip for read/write */ 
 129         toff_t          tif_curoff
;     /* current offset for read/write */ 
 130         toff_t          tif_dataoff
;    /* current offset for writing dir */ 
 132         uint16          tif_nsubifd
;    /* remaining subifds to write */ 
 133         toff_t          tif_subifdoff
;  /* offset for patching SubIFD link */ 
 135         uint32          tif_col
;        /* current column (offset by row too) */ 
 136         ttile_t         tif_curtile
;    /* current tile for read/write */ 
 137         tsize_t         tif_tilesize
;   /* # of bytes in a tile */ 
 138 /* compression scheme hooks */ 
 139         int             tif_decodestatus
; 
 140         TIFFBoolMethod  tif_setupdecode
;/* called once before predecode */ 
 141         TIFFPreMethod   tif_predecode
;  /* pre- row/strip/tile decoding */ 
 142         TIFFBoolMethod  tif_setupencode
;/* called once before preencode */ 
 143         int             tif_encodestatus
; 
 144         TIFFPreMethod   tif_preencode
;  /* pre- row/strip/tile encoding */ 
 145         TIFFBoolMethod  tif_postencode
; /* post- row/strip/tile encoding */ 
 146         TIFFCodeMethod  tif_decoderow
;  /* scanline decoding routine */ 
 147         TIFFCodeMethod  tif_encoderow
;  /* scanline encoding routine */ 
 148         TIFFCodeMethod  tif_decodestrip
;/* strip decoding routine */ 
 149         TIFFCodeMethod  tif_encodestrip
;/* strip encoding routine */ 
 150         TIFFCodeMethod  tif_decodetile
; /* tile decoding routine */ 
 151         TIFFCodeMethod  tif_encodetile
; /* tile encoding routine */ 
 152         TIFFVoidMethod  tif_close
;      /* cleanup-on-close routine */ 
 153         TIFFSeekMethod  tif_seek
;       /* position within a strip routine */ 
 154         TIFFVoidMethod  tif_cleanup
;    /* cleanup state routine */ 
 155         TIFFStripMethod tif_defstripsize
;/* calculate/constrain strip size */ 
 156         TIFFTileMethod  tif_deftilesize
;/* calculate/constrain tile size */ 
 157         tidata_t        tif_data
;       /* compression scheme private data */ 
 158 /* input/output buffering */ 
 159         tsize_t         tif_scanlinesize
;/* # of bytes in a scanline */ 
 160         tsize_t         tif_scanlineskew
;/* scanline skew for reading strips */ 
 161         tidata_t        tif_rawdata
;    /* raw data buffer */ 
 162         tsize_t         tif_rawdatasize
;/* # of bytes in raw data buffer */ 
 163         tidata_t        tif_rawcp
;      /* current spot in raw buffer */ 
 164         tsize_t         tif_rawcc
;      /* bytes unread from raw buffer */ 
 165 /* memory-mapped file support */ 
 166         tidata_t        tif_base
;       /* base of mapped file */ 
 167         toff_t          tif_size
;       /* size of mapped file region (bytes) */ 
 168         TIFFMapFileProc tif_mapproc
;    /* map file method */ 
 169         TIFFUnmapFileProc tif_unmapproc
;/* unmap file method */ 
 170 /* input/output callback methods */ 
 171         thandle_t       tif_clientdata
; /* callback parameter */ 
 172         TIFFReadWriteProc tif_readproc
; /* read method */ 
 173         TIFFReadWriteProc tif_writeproc
;/* write method */ 
 174         TIFFSeekProc    tif_seekproc
;   /* lseek method */ 
 175         TIFFCloseProc   tif_closeproc
;  /* close method */ 
 176         TIFFSizeProc    tif_sizeproc
;   /* filesize method */ 
 177 /* post-decoding support */ 
 178         TIFFPostMethod  tif_postdecode
; /* post decoding routine */ 
 180         TIFFFieldInfo
** tif_fieldinfo
;  /* sorted table of registered tags */ 
 181         size_t          tif_nfields
;    /* # entries in registered tag table */ 
 182         const TIFFFieldInfo 
*tif_foundfield
;/* cached pointer to already found tag */ 
 183         TIFFTagMethods  tif_tagmethods
; /* tag get/set/print routines */ 
 184         TIFFClientInfoLink 
*tif_clientinfo
; /* extra client information. */ 
 187 #define isPseudoTag(t)  (t > 0xffff)    /* is tag value normal or pseudo */ 
 189 #define isTiled(tif)    (((tif)->tif_flags & TIFF_ISTILED) != 0) 
 190 #define isMapped(tif)   (((tif)->tif_flags & TIFF_MAPPED) != 0) 
 191 #define isFillOrder(tif, o)     (((tif)->tif_flags & (o)) != 0) 
 192 #define isUpSampled(tif)        (((tif)->tif_flags & TIFF_UPSAMPLED) != 0) 
 193 #define TIFFReadFile(tif, buf, size) \ 
 194         ((*(tif)->tif_readproc)((tif)->tif_clientdata,buf,size)) 
 195 #define TIFFWriteFile(tif, buf, size) \ 
 196         ((*(tif)->tif_writeproc)((tif)->tif_clientdata,buf,size)) 
 197 #define TIFFSeekFile(tif, off, whence) \ 
 198         ((*(tif)->tif_seekproc)((tif)->tif_clientdata,(toff_t)(off),whence)) 
 199 #define TIFFCloseFile(tif) \ 
 200         ((*(tif)->tif_closeproc)((tif)->tif_clientdata)) 
 201 #define TIFFGetFileSize(tif) \ 
 202         ((*(tif)->tif_sizeproc)((tif)->tif_clientdata)) 
 203 #define TIFFMapFileContents(tif, paddr, psize) \ 
 204         ((*(tif)->tif_mapproc)((tif)->tif_clientdata,paddr,psize)) 
 205 #define TIFFUnmapFileContents(tif, addr, size) \ 
 206         ((*(tif)->tif_unmapproc)((tif)->tif_clientdata,addr,size)) 
 209  * Default Read/Seek/Write definitions. 
 212 #define ReadOK(tif, buf, size) \ 
 213         (TIFFReadFile(tif, (tdata_t) buf, (tsize_t)(size)) == (tsize_t)(size)) 
 216 #define SeekOK(tif, off) \ 
 217         (TIFFSeekFile(tif, (toff_t) off, SEEK_SET) == (toff_t) off) 
 220 #define WriteOK(tif, buf, size) \ 
 221         (TIFFWriteFile(tif, (tdata_t) buf, (tsize_t) size) == (tsize_t) size) 
 224 /* NB: the uint32 casts are to silence certain ANSI-C compilers */ 
 225 #define TIFFhowmany(x, y) ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) 
 226 #define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3) 
 227 #define TIFFroundup(x, y) (TIFFhowmany(x,y)*(y)) 
 229 #define TIFFmax(A,B) ((A)>(B)?(A):(B)) 
 230 #define TIFFmin(A,B) ((A)<(B)?(A):(B)) 
 232 #define TIFFArrayCount(a) (sizeof (a) / sizeof ((a)[0])) 
 234 #if defined(__cplusplus) 
 237 extern  int _TIFFgetMode(const char*, const char*); 
 238 extern  int _TIFFNoRowEncode(TIFF
*, tidata_t
, tsize_t
, tsample_t
); 
 239 extern  int _TIFFNoStripEncode(TIFF
*, tidata_t
, tsize_t
, tsample_t
); 
 240 extern  int _TIFFNoTileEncode(TIFF
*, tidata_t
, tsize_t
, tsample_t
); 
 241 extern  int _TIFFNoRowDecode(TIFF
*, tidata_t
, tsize_t
, tsample_t
); 
 242 extern  int _TIFFNoStripDecode(TIFF
*, tidata_t
, tsize_t
, tsample_t
); 
 243 extern  int _TIFFNoTileDecode(TIFF
*, tidata_t
, tsize_t
, tsample_t
); 
 244 extern  void _TIFFNoPostDecode(TIFF
*, tidata_t
, tsize_t
); 
 245 extern  int  _TIFFNoPreCode (TIFF
*, tsample_t
);  
 246 extern  int _TIFFNoSeek(TIFF
*, uint32
); 
 247 extern  void _TIFFSwab16BitData(TIFF
*, tidata_t
, tsize_t
); 
 248 extern  void _TIFFSwab24BitData(TIFF
*, tidata_t
, tsize_t
); 
 249 extern  void _TIFFSwab32BitData(TIFF
*, tidata_t
, tsize_t
); 
 250 extern  void _TIFFSwab64BitData(TIFF
*, tidata_t
, tsize_t
); 
 251 extern  int TIFFFlushData1(TIFF
*); 
 252 extern  int TIFFDefaultDirectory(TIFF
*); 
 253 extern  void _TIFFSetDefaultCompressionState(TIFF
*); 
 254 extern  int TIFFSetCompressionScheme(TIFF
*, int); 
 255 extern  int TIFFSetDefaultCompressionState(TIFF
*); 
 256 extern  uint32 
_TIFFDefaultStripSize(TIFF
*, uint32
); 
 257 extern  void _TIFFDefaultTileSize(TIFF
*, uint32
*, uint32
*); 
 258 extern  int _TIFFDataSize(TIFFDataType
); 
 260 extern  void _TIFFsetByteArray(void**, void*, uint32
); 
 261 extern  void _TIFFsetString(char**, char*); 
 262 extern  void _TIFFsetShortArray(uint16
**, uint16
*, uint32
); 
 263 extern  void _TIFFsetLongArray(uint32
**, uint32
*, uint32
); 
 264 extern  void _TIFFsetFloatArray(float**, float*, uint32
); 
 265 extern  void _TIFFsetDoubleArray(double**, double*, uint32
); 
 267 extern  void _TIFFprintAscii(FILE*, const char*); 
 268 extern  void _TIFFprintAsciiTag(FILE*, const char*, const char*); 
 270 extern  TIFFErrorHandler _TIFFwarningHandler
; 
 271 extern  TIFFErrorHandler _TIFFerrorHandler
; 
 272 extern  TIFFErrorHandlerExt _TIFFwarningHandlerExt
; 
 273 extern  TIFFErrorHandlerExt _TIFFerrorHandlerExt
; 
 275 extern  tdata_t 
_TIFFCheckMalloc(TIFF
*, size_t, size_t, const char*); 
 277 extern  int TIFFInitDumpMode(TIFF
*, int); 
 278 #ifdef PACKBITS_SUPPORT 
 279 extern  int TIFFInitPackBits(TIFF
*, int); 
 282 extern  int TIFFInitCCITTRLE(TIFF
*, int), TIFFInitCCITTRLEW(TIFF
*, int); 
 283 extern  int TIFFInitCCITTFax3(TIFF
*, int), TIFFInitCCITTFax4(TIFF
*, int); 
 285 #ifdef THUNDER_SUPPORT 
 286 extern  int TIFFInitThunderScan(TIFF
*, int); 
 289 extern  int TIFFInitNeXT(TIFF
*, int); 
 292 extern  int TIFFInitLZW(TIFF
*, int); 
 295 extern  int TIFFInitOJPEG(TIFF
*, int); 
 298 extern  int TIFFInitJPEG(TIFF
*, int); 
 301 extern  int TIFFInitJBIG(TIFF
*, int); 
 304 extern  int TIFFInitZIP(TIFF
*, int); 
 306 #ifdef PIXARLOG_SUPPORT 
 307 extern  int TIFFInitPixarLog(TIFF
*, int); 
 309 #ifdef LOGLUV_SUPPORT 
 310 extern  int TIFFInitSGILog(TIFF
*, int); 
 313 extern  const TIFFCodec _TIFFBuiltinCODECS
[]; 
 315 extern  TIFFCodec _TIFFBuiltinCODECS
[]; 
 318 #if defined(__cplusplus) 
 321 #endif /* _TIFFIOP_ */ 
 323 /* vim: set ts=8 sts=8 sw=8 noet: */