diff options
Diffstat (limited to 'contrib/tags')
-rw-r--r-- | contrib/tags/Makefile.gcc | 56 | ||||
-rw-r--r-- | contrib/tags/Makefile.mpw | 67 | ||||
-rw-r--r-- | contrib/tags/README | 116 | ||||
-rw-r--r-- | contrib/tags/listtif.c | 32 | ||||
-rw-r--r-- | contrib/tags/maketif.c | 70 | ||||
-rw-r--r-- | contrib/tags/xtif_dir.c | 343 | ||||
-rw-r--r-- | contrib/tags/xtiffio.h | 52 | ||||
-rw-r--r-- | contrib/tags/xtiffiop.h | 65 |
8 files changed, 801 insertions, 0 deletions
diff --git a/contrib/tags/Makefile.gcc b/contrib/tags/Makefile.gcc new file mode 100644 index 00000000..eeceb750 --- /dev/null +++ b/contrib/tags/Makefile.gcc @@ -0,0 +1,56 @@ +# Makefile for XLIBTIFF +# +# Written by: Niles Ritter +# +# This Makefile is for use with gcc (2.2.2 or later) +# +DESTDIR=. +# +AR = /usr/bin/ar +AROPTS = rc +RANLIB = /usr/bin/ranlib +NULL= + +TIFFLIB=../../libtiff +PORT=../.. + +IPATH= -I. -I${TIFFLIB} -I${PORT} +CONF_LIBRARY=\ + ${NULL} +CC= gcc +COPTS= -g +CFLAGS= ${COPTS} ${IPATH} ${CONF_LIBRARY} +# +LIBS= ./libxtiff.a ${TIFFLIB}/libtiff.a -lm + +OBJS= \ + xtif_dir.o \ + maketif.o \ + listtif.o \ + ${NULL} + +PROGS= maketif listtif +LIBXTIFF= libxtiff.a +ALL= ${LIBXTIFF} ${PROGS} + +all: ${ALL} + +library: ${LIBXTIFF} + +test: ${PROGS} + ./maketif + ./listtif + +maketif: maketif.o libxtiff.a + ${CC} ${COPTS} maketif.o ${LIBS} -o maketif + +listtif: listtif.o libxtiff.a + ${CC} ${COPTS} listtif.o ${LIBS} -o listtif + +libxtiff.a: xtif_dir.o + ${AR} ${AROPTS} libxtiff.a xtif_dir.o + ${RANLIB} libxtiff.a + +clean: + rm -f ${ALL} ${OBJS} core a.out newtif.tif + diff --git a/contrib/tags/Makefile.mpw b/contrib/tags/Makefile.mpw new file mode 100644 index 00000000..92f506f3 --- /dev/null +++ b/contrib/tags/Makefile.mpw @@ -0,0 +1,67 @@ +#*********************************************************************** +# +# MPW build file for example LIBXTIFF utilities +# +# written by Niles D. Ritter. +# +CC = c +AR = lib -o +RM = delete -y +LN = duplicate -y + +#debug option +#DEBUG= -sym full +DEBUG= + +# data/code model options +#MODEL= +MODEL= -model far + +TIFFLIB = :::libtiff: + +LINK.c = Link {LDFLAGS} +.o Ä .c + {CC} {DEBUG} {CFLAGS} {CPPFLAGS} {Default}.c -o {Default}.o +LDFLAGS = {DEBUG} {MODEL} -c 'MPS ' -t MPST -w +CFLAGS = {MODEL} +CPPFLAGS = -I {TIFFLIB} +OBJS = maketif.o listtif.o xtif_dir.o +CLEANOBJS = maketif.o listtif.o xtif_dir.o +CLEANOTHER = newtif.tif +CLEANINC = +LIBS = {TIFFLIB}libtiff.o ¶ + libxtiff.o ¶ + "{CLibraries}"StdClib.o ¶ + "{Libraries}"Stubs.o ¶ + "{Libraries}"Runtime.o ¶ + "{Libraries}"Interface.o + +PROGS= maketif listtif +LIBXTIFF= libxtiff.o +ALL= {LIBXTIFF} {PROGS} + +all Ä {ALL} + +library Ä {LIBXTIFF} + +test Ä {PROGS} + maketif + listtif + +compile Ä {OBJS} + +maketif Ä maketif.o libxtiff.o + {LINK.c} -o maketif maketif.o {LIBS} + +listtif Ä listtif.o libxtiff.o + {LINK.c} -o listtif listtif.o {LIBS} + +libxtiff.o Ä xtif_dir.o + lib -o libxtiff.o xtif_dir.o + +clean Ä + {RM} {CLEANOBJS} || set status 0 + {RM} {LIBXTIFF} || set status 0 + {RM} {PROGS} || set status 0 + {RM} Å.tif || set status 0 + diff --git a/contrib/tags/README b/contrib/tags/README new file mode 100644 index 00000000..2d096100 --- /dev/null +++ b/contrib/tags/README @@ -0,0 +1,116 @@ + +Client module for adding to LIBTIFF tagset +------------------------------------------- + Author: Niles Ritter + + +In the past, users of the "libtiff" package had to modify the +source code of the library if they required additional private tags +or codes not recognized by libtiff. Thus, whenever +a new revision of libtiff came out the client would have to +perform modifications to six or seven different files to re-install +their tags. + +The latest versions of libtiff now provide client software new routines, +giving them the opportunity to install private extensions at runtime, +rather than compile-time. This means that the client may encapsulate +all of their private tags into a separate module, which need only +be recompiled when new versions of libtiff are released; no manual +editing of files is required. + +How it works +------------ + +The mechanism for overriding the tag access has been enabled with +a single new routine, which has the following calling sequence: + + TIFFExtendProc old_extender; + + old_extender = TIFFSetTagExtender(tag_extender); + +which must be called prior to opening or creating TIFF files. + +This routine sets a static pointer to the user-specified function +<tag_extender>, which in turn is called by TIFFDefaultDirectory(), +just after the usual TIFFSetField() and TIFFGetField() methods +are defined, and just before the compression tag is set. It also +returns a pointer to the previously-defined value of the tag-extender, +so that multiple clients may be installed. + +The TIFFExtendProc method that you define should be used to override +the TIFF file's "vsetfield" and "vgetfield" methods, so that you +can trap your new, private tags, and install their values into +a private directory structure. For your convienience, a new pointer +has also been added to the "TIFF" file structure: + + tidata_t tif_clientdir; /* client TIFF directory */ + +into which you may install whatever private directory structures you like. +You should also override the tag-printing method from within your +"vsetfield" method, to permit the symbolic printing of your new tags. + + +Example Client Code: +-------------------- + +An example module has been provided as a template for installing +your own tags into a client tag extender. The module is called +"xtif_dir.c", and defines all of the interface routines, tag field +access, tag printing, etc. for most purpose. + +To see how the client module operates, there are three "fake" +tags currently installed. If you use the existing makefile you can +build them with: + + make all -f Makefile.gcc !or Makefile.mpw + maketif + listtif + +This will build two example programs called "maketif" and "listtif" +and then run them. These programs do nothing more than create a small +file called "newtif.tif", install the fake tags, and then list them out +using TIFFPrintDirectory(). + +Installing Private Tags +----------------------- + +To use this module for installing your own tags, edit each of the files + + xtif_dir.c + xtiffio.h + xtiffiop.h + +and search for the string "XXX". At these locations the comments +will direct you how to install your own tag values, define their +types, etc. Three examples tags are currently installed, demonstrating +how to implement multi-valued tags, single-valued tags, and ASCII tags. +The examples are not valid, registered tags, so you must replace them with +your own. + +To test the routines, also edit the test programs "maketif.c" and +"listtif.c" and replace the portions of the code that set the +private tag values and list them. + +Once you have edited these files, you may build the client module +with the Makefile provided, and run the test programs. + +To use these files in your own code, the "xtif_dir.c" module defines +replacement routines for the standard "TIFFOpen()" "TIFFFdOpen", +and "TIFFClose()" routines, called XTIFFOpen, XTIFFFdOpen and XTIFFClose. +You must use these routines in order to have the extended tag handlers +installed. Once installed, the standard TIFFGetField() and TIFFSetField +routines may be used as before. + +Adding Extended Tags to "tools" +------------------------------- +To create an extended-tag savvy "tiffinfo" program or other utility, you may +simply recompile and link the tools to your "libxtiff" library, adding + + -DTIFFOpen=XTIFFOpen -DTIFFClose=XTIFFClose -DTIFFFdOpen=XTIFFFdOpen + +to the compile statement. + +Bugs, Comments Etc: +------------------ + Send all reports and suggestions to ndr@tazboy.jpl.nasa.gov + (Niles Ritter). diff --git a/contrib/tags/listtif.c b/contrib/tags/listtif.c new file mode 100644 index 00000000..2ea12cea --- /dev/null +++ b/contrib/tags/listtif.c @@ -0,0 +1,32 @@ +/* + * listtif.c -- lists a tiff file. + */ + +#include "xtiffio.h" +#include <stdlib.h> + +void main(int argc,char *argv[]) +{ + char *fname="newtif.tif"; + int flags; + + TIFF *tif=(TIFF*)0; /* TIFF-level descriptor */ + + if (argc>1) fname=argv[1]; + + tif=XTIFFOpen(fname,"r"); + if (!tif) goto failure; + + /* We want the double array listed */ + flags = TIFFPRINT_MYMULTIDOUBLES; + + TIFFPrintDirectory(tif,stdout,flags); + XTIFFClose(tif); + exit (0); + +failure: + printf("failure in listtif\n"); + if (tif) XTIFFClose(tif); + exit (-1); +} + diff --git a/contrib/tags/maketif.c b/contrib/tags/maketif.c new file mode 100644 index 00000000..aad6f153 --- /dev/null +++ b/contrib/tags/maketif.c @@ -0,0 +1,70 @@ +/* + * maketif.c -- creates a little TIFF file, with + * the XTIFF extended tiff example tags. + */ + +#include <stdlib.h> +#include "xtiffio.h" + + +void SetUpTIFFDirectory(TIFF *tif); +void WriteImage(TIFF *tif); + +#define WIDTH 20 +#define HEIGHT 20 + +void main() +{ + TIFF *tif=(TIFF*)0; /* TIFF-level descriptor */ + + tif=XTIFFOpen("newtif.tif","w"); + if (!tif) goto failure; + + SetUpTIFFDirectory(tif); + WriteImage(tif); + + XTIFFClose(tif); + exit (0); + +failure: + printf("failure in maketif\n"); + if (tif) XTIFFClose(tif); + exit (-1); +} + + +void SetUpTIFFDirectory(TIFF *tif) +{ + double mymulti[6]={0.0,1.0,2.0, 3.1415926, 5.0,1.0}; + uint32 mysingle=3456; + char *ascii="This file was produced by Steven Spielberg. NOT"; + + TIFFSetField(tif,TIFFTAG_IMAGEWIDTH,WIDTH); + TIFFSetField(tif,TIFFTAG_IMAGELENGTH,HEIGHT); + TIFFSetField(tif,TIFFTAG_COMPRESSION,COMPRESSION_NONE); + TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_MINISBLACK); + TIFFSetField(tif,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG); + TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE,8); + TIFFSetField(tif,TIFFTAG_ROWSPERSTRIP,20); + + /* Install the extended TIFF tag examples */ + TIFFSetField(tif,TIFFTAG_EXAMPLE_MULTI,6,mymulti); + TIFFSetField(tif,TIFFTAG_EXAMPLE_SINGLE,mysingle); + TIFFSetField(tif,TIFFTAG_EXAMPLE_ASCII,ascii); +} + + +void WriteImage(TIFF *tif) +{ + int i; + char buffer[WIDTH]; + + memset(buffer,0,sizeof(buffer)); + for (i=0;i<HEIGHT;i++) + if (!TIFFWriteScanline(tif, buffer, i, 0)) + TIFFError("WriteImage","failure in WriteScanline\n"); +} + + + + diff --git a/contrib/tags/xtif_dir.c b/contrib/tags/xtif_dir.c new file mode 100644 index 00000000..c9137aac --- /dev/null +++ b/contrib/tags/xtif_dir.c @@ -0,0 +1,343 @@ +/* + * xtif_dir.c + * + * Extended TIFF Directory Tag Support. + * + * You may use this file as a template to add your own + * extended tags to the library. Only the parts of the code + * marked with "XXX" require modification. Three example tags + * are shown; you should replace them with your own. + * + * Author: Niles D. Ritter + */ + +#include "xtiffiop.h" +#include <stdio.h> + +/* Tiff info structure. + * + * Entry format: + * { TAGNUMBER, ReadCount, WriteCount, DataType, FIELDNUM, + * OkToChange, PassDirCountOnSet, AsciiName } + * + * For ReadCount, WriteCount, -1 = unknown; used for mult-valued + * tags and ASCII. + */ + +static const TIFFFieldInfo xtiffFieldInfo[] = { + + /* XXX Replace these example tags with your own extended tags */ + { TIFFTAG_EXAMPLE_MULTI, -1,-1, TIFF_DOUBLE, FIELD_EXAMPLE_MULTI, + TRUE, TRUE, "MyMultivaluedTag" }, + { TIFFTAG_EXAMPLE_SINGLE, 1, 1, TIFF_LONG, FIELD_EXAMPLE_SINGLE, + TRUE, FALSE, "MySingleLongTag" }, + { TIFFTAG_EXAMPLE_ASCII, -1,-1, TIFF_ASCII, FIELD_EXAMPLE_ASCII, + TRUE, FALSE, "MyAsciiTag" }, +}; +#define N(a) (sizeof (a) / sizeof (a[0])) + + +static void +_XTIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) +{ + xtiff *xt = XTIFFDIR(tif); + XTIFFDirectory *xd = &xt->xtif_dir; + int i,num; + + /* call the inherited method */ + if (PARENT(xt,printdir)) + (PARENT(xt,printdir))(tif,fd,flags); + + /* XXX Add field printing here. Replace the three example + * tags implemented below with your own. + */ + + fprintf(fd,"--My Example Tags--\n"); + + /* Our first example tag may have a lot of values, so we + * will only print them out if the TIFFPRINT_MYMULTIDOUBLES + * flag is passed into the print method. + */ + if (TIFFFieldSet(tif,FIELD_EXAMPLE_MULTI)) + { + fprintf(fd, " My Multi-Valued Doubles:"); + if (flags & TIFFPRINT_MYMULTIDOUBLES) + { + double *value = xd->xd_example_multi; + + num = xd->xd_num_multi; + fprintf(fd,"("); + for (i=0;i<num;i++) fprintf(fd, " %lg", *value++); + fprintf(fd,")\n"); + } else + fprintf(fd, "(present)\n"); + } + + if (TIFFFieldSet(tif,FIELD_EXAMPLE_SINGLE)) + { + fprintf(fd, " My Single Long Tag: %lu\n", xd->xd_example_single); + } + + if (TIFFFieldSet(tif,FIELD_EXAMPLE_ASCII)) + { + _TIFFprintAsciiTag(fd,"My ASCII Tag", + xd->xd_example_ascii); + } +} + +static int +_XTIFFVSetField(TIFF* tif, ttag_t tag, va_list ap) +{ + xtiff *xt = XTIFFDIR(tif); + XTIFFDirectory* xd = &xt->xtif_dir; + int status = 1; + uint32 v32=0; + int i=0, v=0; + va_list ap1 = ap; + + /* va_start is called by the calling routine */ + + switch (tag) { + /* + * XXX put your extended tags here; replace the implemented + * example tags with your own. + */ + case TIFFTAG_EXAMPLE_MULTI: + /* multi-valued tags need to store the count as well */ + xd->xd_num_multi = (uint16) va_arg(ap, int); + _TIFFsetDoubleArray(&xd->xd_example_multi, va_arg(ap, double*), + (long) xd->xd_num_multi); + break; + case TIFFTAG_EXAMPLE_SINGLE: + xd->xd_example_single = va_arg(ap, uint32); + break; + case TIFFTAG_EXAMPLE_ASCII: + _TIFFsetString(&xd->xd_example_ascii, va_arg(ap, char*)); + break; + default: + /* call the inherited method */ + return (PARENT(xt,vsetfield))(tif,tag,ap); + break; + } + if (status) { + /* we have to override the print method here, + * after the compression tags have gotten to it. + * This makes sense because the only time we would + * need the extended print method is if an extended + * tag is set by the reader. + */ + if (!(xt->xtif_flags & XTIFFP_PRINT)) + { + PARENT(xt,printdir) = TIFFMEMBER(tif,printdir); + TIFFMEMBER(tif,printdir) = _XTIFFPrintDirectory; + xt->xtif_flags |= XTIFFP_PRINT; + } + TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit); + tif->tif_flags |= TIFF_DIRTYDIRECT; + } + va_end(ap); + return (status); +badvalue: + TIFFError(tif->tif_name, "%d: Bad value for \"%s\"", v, + _TIFFFieldWithTag(tif, tag)->field_name); + va_end(ap); + return (0); +badvalue32: + TIFFError(tif->tif_name, "%ld: Bad value for \"%s\"", v32, + _TIFFFieldWithTag(tif, tag)->field_name); + va_end(ap); + return (0); +} + + +static int +_XTIFFVGetField(TIFF* tif, ttag_t tag, va_list ap) +{ + xtiff *xt = XTIFFDIR(tif); + XTIFFDirectory* xd = &xt->xtif_dir; + + switch (tag) { + /* + * XXX put your extended tags here; replace the implemented + * example tags with your own. + */ + case TIFFTAG_EXAMPLE_MULTI: + *va_arg(ap, uint16*) = xd->xd_num_multi; + *va_arg(ap, double**) = xd->xd_example_multi; + break; + case TIFFTAG_EXAMPLE_ASCII: + *va_arg(ap, char**) = xd->xd_example_ascii; + break; + case TIFFTAG_EXAMPLE_SINGLE: + *va_arg(ap, uint32*) = xd->xd_example_single; + break; + default: + /* return inherited method */ + return (PARENT(xt,vgetfield))(tif,tag,ap); + break; + } + return (1); +} + +#define CleanupField(member) { \ + if (xd->member) { \ + _TIFFfree(xd->member); \ + xd->member = 0; \ + } \ +} +/* + * Release storage associated with a directory. + */ +static void +_XTIFFFreeDirectory(xtiff* xt) +{ + XTIFFDirectory* xd = &xt->xtif_dir; + + /* + * XXX - Purge all Your allocated memory except + * for the xtiff directory itself. This includes + * all fields that require a _TIFFsetXXX call in + * _XTIFFVSetField(). + */ + + CleanupField(xd_example_multi); + CleanupField(xd_example_ascii); + +} +#undef CleanupField + +static void _XTIFFLocalDefaultDirectory(TIFF *tif) +{ + xtiff *xt = XTIFFDIR(tif); + XTIFFDirectory* xd = &xt->xtif_dir; + + /* Install the extended Tag field info */ + _TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo)); + + /* + * free up any dynamically allocated arrays + * before the new directory is read in. + */ + + _XTIFFFreeDirectory(xt); + _TIFFmemset(xt,0,sizeof(xtiff)); + + /* Override the tag access methods */ + + PARENT(xt,vsetfield) = TIFFMEMBER(tif,vsetfield); + TIFFMEMBER(tif,vsetfield) = _XTIFFVSetField; + PARENT(xt,vgetfield) = TIFFMEMBER(tif,vgetfield); + TIFFMEMBER(tif,vgetfield) = _XTIFFVGetField; + + /* + * XXX Set up any default values here. + */ + + xd->xd_example_single = 234; +} + + + +/********************************************************************** + * Nothing below this line should need to be changed. + **********************************************************************/ + +static TIFFExtendProc _ParentExtender; + +/* + * This is the callback procedure, and is + * called by the DefaultDirectory method + * every time a new TIFF directory is opened. + */ + +static void +_XTIFFDefaultDirectory(TIFF *tif) +{ + xtiff *xt; + + /* Allocate Directory Structure if first time, and install it */ + if (!(tif->tif_flags & XTIFF_INITIALIZED)) + { + xt = _TIFFmalloc(sizeof(xtiff)); + if (!xt) + { + /* handle memory allocation failure here ! */ + return; + } + _TIFFmemset(xt,0,sizeof(xtiff)); + /* + * Install into TIFF structure. + */ + TIFFMEMBER(tif,clientdir) = (tidata_t)xt; + tif->tif_flags |= XTIFF_INITIALIZED; /* dont do this again! */ + } + + /* set up our own defaults */ + _XTIFFLocalDefaultDirectory(tif); + + /* Since an XTIFF client module may have overridden + * the default directory method, we call it now to + * allow it to set up the rest of its own methods. + */ + + if (_ParentExtender) + (*_ParentExtender)(tif); + +} + +/* + * XTIFF Initializer -- sets up the callback + * procedure for the TIFF module. + */ + +static +void _XTIFFInitialize(void) +{ + static first_time=1; + + if (! first_time) return; /* Been there. Done that. */ + first_time = 0; + + /* Grab the inherited method and install */ + _ParentExtender = TIFFSetTagExtender(_XTIFFDefaultDirectory); +} + + +/* + * Public File I/O Routines. + */ +TIFF* +XTIFFOpen(const char* name, const char* mode) +{ + /* Set up the callback */ + _XTIFFInitialize(); + + /* Open the file; the callback will set everything up + */ + return TIFFOpen(name, mode); +} + +TIFF* +XTIFFFdOpen(int fd, const char* name, const char* mode) +{ + /* Set up the callback */ + _XTIFFInitialize(); + + /* Open the file; the callback will set everything up + */ + return TIFFFdOpen(fd, name, mode); +} + + +void +XTIFFClose(TIFF *tif) +{ + xtiff *xt = XTIFFDIR(tif); + + /* call inherited function first */ + TIFFClose(tif); + + /* Free up extended allocated memory */ + _XTIFFFreeDirectory(xt); + _TIFFfree(xt); +} diff --git a/contrib/tags/xtiffio.h b/contrib/tags/xtiffio.h new file mode 100644 index 00000000..2aea724d --- /dev/null +++ b/contrib/tags/xtiffio.h @@ -0,0 +1,52 @@ +/* + * xtiffio.h -- Public interface to Extended TIFF tags + * + * This is a template for defining a client module + * which supports tag extensions to the standard libtiff + * set. Only portions of the code marked "XXX" need to + * be changed to support your tag set. + * + * written by: Niles D. Ritter + */ + +#ifndef __xtiffio_h +#define __xtiffio_h + +#include "tiffio.h" + +/* + * XXX Define your private Tag names and values here + */ + +/* These tags are not valid, but are provided for example */ +#define TIFFTAG_EXAMPLE_MULTI 61234 +#define TIFFTAG_EXAMPLE_SINGLE 61235 +#define TIFFTAG_EXAMPLE_ASCII 61236 + +/* + * XXX Define Printing method flags. These + * flags may be passed in to TIFFPrintDirectory() to + * indicate that those particular field values should + * be printed out in full, rather than just an indicator + * of whether they are present or not. + */ +#define TIFFPRINT_MYMULTIDOUBLES 0x80000000 + +/********************************************************************** + * Nothing below this line should need to be changed by the user. + **********************************************************************/ + +#if defined(__cplusplus) +extern "C" { +#endif + +extern TIFF* XTIFFOpen(const char* name, const char* mode); +extern TIFF* XTIFFFdOpen(int fd, const char* name, const char* mode); +extern void XTIFFClose(TIFF *tif); + +#if defined(__cplusplus) +} +#endif + +#endif /* __xtiffio_h */ + diff --git a/contrib/tags/xtiffiop.h b/contrib/tags/xtiffiop.h new file mode 100644 index 00000000..0d3f1f2c --- /dev/null +++ b/contrib/tags/xtiffiop.h @@ -0,0 +1,65 @@ +/* + * Private Extended TIFF library interface. + * + * uses private LIBTIFF interface. + * + * The portions of this module marked "XXX" should be + * modified to support your tags instead. + * + * written by: Niles D. Ritter + * + */ + +#ifndef __xtiffiop_h +#define __xtiffiop_h + +#include "tiffiop.h" +#include "xtiffio.h" + +/********************************************************************** + * User Configuration + **********************************************************************/ + +/* XXX - Define number of your extended tags here */ +#define NUM_XFIELD 3 +#define XFIELD_BASE (FIELD_LAST-NUM_XFIELD) + +/* XXX - Define your Tag Fields here */ +#define FIELD_EXAMPLE_MULTI (XFIELD_BASE+0) +#define FIELD_EXAMPLE_SINGLE (XFIELD_BASE+1) +#define FIELD_EXAMPLE_ASCII (XFIELD_BASE+2) + + +/* XXX - Define Private directory tag structure here */ +struct XTIFFDirectory { + uint16 xd_num_multi; /* dir-count for the multi tag */ + double* xd_example_multi; + uint32 xd_example_single; + char* xd_example_ascii; +}; +typedef struct XTIFFDirectory XTIFFDirectory; + +/********************************************************************** + * Nothing below this line should need to be changed by the user. + **********************************************************************/ + +struct xtiff { + TIFF *xtif_tif; /* parent TIFF pointer */ + uint32 xtif_flags; +#define XTIFFP_PRINT 0x00000001 + XTIFFDirectory xtif_dir; /* internal rep of current directory */ + TIFFVSetMethod xtif_vsetfield; /* inherited tag set routine */ + TIFFVGetMethod xtif_vgetfield; /* inherited tag get routine */ + TIFFPrintMethod xtif_printdir; /* inherited dir print method */ +}; +typedef struct xtiff xtiff; + + +#define PARENT(xt,pmember) ((xt)->xtif_ ## pmember) +#define TIFFMEMBER(tf,pmember) ((tf)->tif_ ## pmember) +#define XTIFFDIR(tif) ((xtiff *)TIFFMEMBER(tif,clientdir)) + +/* Extended TIFF flags */ +#define XTIFF_INITIALIZED 0x80000000 + +#endif /* __xtiffiop_h */ |