typedef enum { BE, LE, } End; typedef enum { Izero, Ibyte, Iascii, Ishort, Ilong, Irat, Isbyte, Iundef, Isshort, Islong, Israt, Ifloat, Idbl, Iinfinite, } IFDtype; typedef struct { ulong n; ulong d; } Rational; // IFDS are ARRAYS typedef struct { int tag; IFDtype type; ulong n; uchar roffset[4]; ulong offset; union { char *cp; short *sp; long *lp; Rational *rp; double *dp; }; } IFD; typedef struct { End order; ulong ifd0; int n; int alloc; IFD *ifds; int bpp; // derived. uchar *rawimge; uchar *rawimg; } Tiff; typedef enum { Zzero = 1, Zccitt, Zgroup3, Zgroup4, Zlzw, Zjpeg, Zpack = 32773, } Ztype; typedef enum { Pwhitezero, Pblackzero, Prgb, Prgbcmap, Prgba, Pcmyk, PYCbCr, PCIELab, } Ptype; typedef enum { Tsubfiletype = 0x0fe, // long Twidth = 0x100, Tlength = 0x101, Tbitspersample = 0x102, Tcompression = 0x103, Tphotometric = 0x106, Tthresholding = 0x107, Tcellwidth = 0x108, Tcelllength = 0x109, Thwmodel = 0x110, Tfillorder = 0x10a, Timagedesc = 0x10e, Tstripoffsets = 0x111, Torientation = 0x112, Tsamplespp = 0x115, Trowsperstrip = 0x116, Tstripbytecounts = 0x117, // AFTER compression Txresolution = 0x11a, // Rational Tyresolution = 0x11b, Tplanarconf = 0x11c, Tresolutionunit = 0x128, Tpageno = 0x129, Tsoftware = 0x131, Tdatetime = 0x132, Tartist = 0x13b, Tcomputer = 0x13c, Tpredictor = 0x13d, Tcolormap = 0x140, Textrasamples = 0x152, // 1 == premult α, 2 matte // Tcopyright = 0x8298, Tend, } Itype; #define debug(...) if(dflag) fprint(2, __VA_ARGS__) extern int dflag; extern int rflag; long Btiffshorts(Biobuf *b, short *p, int n, End o); long Btifflongs(Biobuf *b, long *p, int n, End o); int tiffexpand(Tiff*); long tiffimglen(Tiff*); char* tiffzstr(ushort); int tiffunz(Tiff *, ushort, Biobuf*, int); int tiffhuff(Biobuf *, uchar *, int, int, ulong); long lookifd(Tiff *, int); IFD* lookifdptr(Tiff *, Itype); long ifdidx(IFD*, int); ulong tiffchan(Tiff *t); char* tiffchantostr(Tiff *t, char *s); void dirty(Tiff*);