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*);
|