home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
gbmsrc.zip
/
gbmtifh.h
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-30
|
8KB
|
201 lines
/*
gbmtifh.h - Interface to TIFF file handling stuff
Added #defines for many more tags.
Added #defines for most of the new TIFF 6.0 tags.
Added #defines for the new tag field types.
Reading numeric tags will now accept signed field types too.
*/
#define TE_OK 0
#define TE_MEM 1
#define TE_VERSION 2
#define TE_N_TAGS 3
#define TE_TAG_TYPE 4
#define TE_N_IFD 5
/*
Image tags used in TIFF files. The types given with each one is what they
usually are. A program should not assume that this is always the case.
The most sensible way of handling things that could be short or long is to
use the numeric_tag() predicate and the value_of_tag() functions.
*/
/*...stags:0:*/
#define T_NEWSUBFILETYPE 254 /* data is long */
#define T_SUBFILETYPE 255 /* data is short */
#define T_IMAGEWIDTH 256 /* data is a short */
#define T_IMAGELENGTH 257 /* data is a short */
#define T_BITSPERSAMPLE 258 /* data is a short */
#define T_COMPRESSION 259 /* data is a short */
#define T_PHOTOMETRIC 262 /* data is short */
#define T_THRESHOLDING 263 /* data is short */
#define T_CELLWIDTH 264
#define T_CELLLENGTH 265
#define T_FILLORDER 266 /* data is short */
#define T_DOCNAME 269 /* data is ASCII */
#define T_DESCRIPTION 270 /* data is ASCII */
#define T_MAKE 271 /* data is ASCII */
#define T_MODEL 272 /* data is ASCII */
#define T_STRIPOFFSETS 273 /* data is short or long */
#define T_ORIENTATION 274 /* data is short */
#define T_SAMPLESPERPIXEL 277 /* data is short */
#define T_ROWSPERSTRIP 278 /* data is short or long */
#define T_STRIPBYTECOUNTS 279 /* data is short */
#define T_MINSAMPLEVALUE 280 /* data is short or long */
#define T_MAXSAMPLEVALUE 281 /* data is short or long */
#define T_XRESOLUTION 282 /* data is rational */
#define T_YRESOLUTION 283 /* data is rational */
#define T_PLANARCONFIG 284 /* data is short */
#define T_PAGENAME 285 /* data is ASCII */
#define T_XPOSITION 286
#define T_YPOSITION 287
#define T_FREEOFFSETS 288
#define T_FREEBYTECOUNTS 289
#define T_GRAYRESPONSEUNIT 290 /* data is a short */
#define T_GRAYRESPONSECURVE 291 /* data is a set of shorts */
#define T_GROUP3OPTIONS 292 /* data is a long */
#define T_GROUP4OPTIONS 293 /* data is a long */
#define T_RESOLUTIONUNIT 296 /* data is short */
#define T_PAGENUMBER 297 /* data is 2 shorts */
#define T_COLORRESPONSECURVES 301 /* data is 3 sets of shorts */
#define T_SOFTWARE 305 /* data is ASCII */
#define T_DATETIME 306
#define T_ARTIST 315 /* data is ASCII */
#define T_HOSTCOMPUTER 316 /* data is ASCII */
#define T_PREDICTOR 317 /* data is a short */
#define T_WHITEPOINT 318
#define T_PRIMARYCHROMA 319 /* data us 6 rationals */
#define T_COLORMAP 320 /* data is 3 sets of shorts */
#define T_HALFTONEHINTS 321 /* data is 2 shorts */
#define T_TILEWIDTH 322 /* data is 1 short */
#define T_TILELENGTH 323 /* data is 1 short */
#define T_TILEOFFSETS 324 /* data is # tiles long */
#define T_TILEBYTECOUNTS 325 /* data is # tiles long */
#define T_INKSET 332 /* data is 1 short */
#define T_INKNAMES 333 /* data is ASCII */
#define T_NUMBEROFINKS 334 /* data is 1 short */
#define T_DOTRANGE 336 /* data is 2 or 2 * samples per pixel bytes or shorts */
#define T_TARGETPRINTER 337 /* data is ASCII */
#define T_EXTRASAMPLES 338 /* data is 1 short */
#define T_SAMPLEFORMAT 339 /* data is samples per pixel shorts */
#define T_SMINSAMPLEVALUE 340 /* data is samples per pixel ? */
#define T_SMAXSAMPLEVALUE 341 /* data is samples per pixel ? */
#define T_TRANSFERRANGE 342 /* data is 6 shorts */
#define T_JPEGPROC 512 /* data is 1 short */
#define T_JPEGINTERCHANGEFMT 513 /* data is 1 long */
#define T_JPEGINTERCHANGEFMTLEN 514 /* data is 1 long */
#define T_JPEGRESTARTINTERVAL 515 /* data is 1 short */
#define T_JPEGLOSSLESSPRED 517 /* data is samples per pixel shorts */
#define T_JPEGPOINTTRANSFORMS 518 /* data is samples per pixel shorts */
#define T_JPEGOTABLES 519 /* data is samples per pixel longs */
#define T_JPEGDCTABLES 520 /* data is samples per pixel longs */
#define T_JPEGACTABLES 521 /* data is samples per pixel longs */
#define T_COEFFICIENTS 529 /* data is 3 rationals */
#define T_SUBSAMPLING 530 /* data is 2 shorts */
#define T_REFERENCEBLACKWHITE 532 /* data is 6 rationals */
/*...e*/
typedef struct { long numerator, denominator; } rational;
#define D_BYTE 1 /* data is unsigned 8 bit */
#define D_ASCII 2 /* data is ASCIIZ string */
#define D_SHORT 3 /* data is unsigned 16 bit */
#define D_LONG 4 /* data is unsigned 32 bit */
#define D_RATIONAL 5 /* data is 2 LONGs */
#define D_SBYTE 6 /* data is signed 8 bit */
#define D_UNDEFINED 7 /* data 8 bit anything */
#define D_SSHORT 8 /* data is signed 16 bit */
#define D_SLONG 9 /* data is signed 32 bit */
#define D_SRATIONAL 10 /* data is 2 SLONGs */
#define D_FLOAT 11 /* data is 4-byte IEEE format */
#define D_DOUBLE 12 /* data is 8-byte IEEE format */
typedef struct
{
short type;
short data_type;
long length;
void *value;
} TAG;
#define MAX_TAGS 200
typedef struct
{
short n_tags;
TAG tags [MAX_TAGS];
} IFD;
typedef struct
{
short byte_order;
short version_no;
IFD *ifd;
} IFH;
#ifndef _GBMTIFH_
/*
Proposed method for loading a TIFF file :-
1) Open file.
2) Use read_ifh_and_ifd() to get header.
If an error occurs returned error code not TE_OK.
3) Use locate_tag() and value_of_tag() etc. to test presence and
validity of tags.
4) In particular use value_of_tag_n() to get at T_STRIPOFFSETS,
to extract the offsets into the file where the raw data is.
5) Read the raw data.
6) Close the file.
7) Free the IFH structure using free_ifh().
*/
extern int read_ifh_and_ifd(int fd, int n_ifds_to_skip, IFH **ifh_return);
extern BOOLEAN numeric_tag(TAG *tag);
extern long value_of_tag(TAG *tag);
extern long value_of_tag_n(TAG *tag, int n);
extern TAG *locate_tag(IFD *ifd, short type);
extern void free_ifh(IFH *ifh);
/*
Proposed method for saving a TIFF file :-
1) Open file
If fails use tiff_errno.
2) Use make_ifh() to create an empty IFH (and its IFD).
If fails then out of memory.
3) Setup all the tags - those that you don't know set to 0.
If fails then out of memory.
4) Use write_ifh_and_ifd() to write the IFH.
If fails look at tiff_errno.
5) Write all the raw data to the file, using ftell() to
keep a record of where strips start and how long they are.
6) In particular update tags T_STRIPOFFSETS and T_STRIPBYTECOUNTS.
7) Use write_ifd() to rewrite the IFD.
8) Close the file.
9) Use free_ifh() to deallocate the IFH.
It is important to realise that a second write of the IFD is necessary since
the StripOffsets and StripByteCounts tags cannot be known until the compressed
data has actually been written. Although the TIFF spec allows us to write the
compressed data BEFORE we write the IFD, I find that some programs (notably
the IBM utility IDUCNVT.EXE) insist that the IFD is before the data).
*/
extern IFH *make_ifh(void);
extern BOOLEAN add_byte_tag(IFD *ifd, short type, byte *value, int n);
extern BOOLEAN add_ascii_tag(IFD *ifd, short type, char *value);
extern BOOLEAN add_short_tag(IFD *ifd, short type, short *value, int n);
extern BOOLEAN add_long_tag(IFD *ifd, short type, long *value, int n);
extern BOOLEAN add_rational_tag(IFD *ifd, short type, rational *value, int n);
extern BOOLEAN write_ifh_and_ifd(IFH *ifh, int fd);
extern void update_byte_tag(IFD *ifd, short type, byte *value);
extern void update_ascii_tag(IFD *ifd, short type, char *value);
extern void update_short_tag(IFD *ifd, short type, short *value);
extern void update_long_tag(IFD *ifd, short type, long *value);
extern void update_rational_tag(IFD *ifd, short type, rational *value);
extern BOOLEAN update_ifd(IFD *ifd, int fd);
#endif