summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2005-05-23 15:04:49 +0200
committerTor Andersson <tor@ghostscript.com>2005-05-23 15:04:49 +0200
commit8bebcc1c8187906736e3f82b99ee07cb06df0326 (patch)
tree3c9d6e70e0c0dbe6197d46e591a9b2de16bd5fbd
parent0c6d8fbe737fcf6800723d5282fb0baa7b98d7ad (diff)
downloadmupdf-8bebcc1c8187906736e3f82b99ee07cb06df0326.tar.xz
support fillorder to be able to test with gs tiffcrle device
-rw-r--r--samus/sa_tiff.c139
-rw-r--r--stream/filt_faxd.c12
2 files changed, 105 insertions, 46 deletions
diff --git a/samus/sa_tiff.c b/samus/sa_tiff.c
index 74d04550..232da32f 100644
--- a/samus/sa_tiff.c
+++ b/samus/sa_tiff.c
@@ -23,21 +23,24 @@ struct sa_tiff_s
unsigned *colormap;
/* assorted tags */
- unsigned interpretation;
+ unsigned subfiletype;
+ unsigned photometric;
unsigned compression;
unsigned imagewidth;
unsigned imagelength;
unsigned samplesperpixel;
unsigned bitspersample;
+ unsigned planar;
unsigned xresolution;
unsigned yresolution;
unsigned resolutionunit;
+ unsigned fillorder;
};
enum
{
- TII = ('I' << 8) + 'I',
- TMM = ('M' << 8) + 'M',
+ TII = 0x4949, /* 'II' */
+ TMM = 0x4d4d, /* 'MM' */
TBYTE = 1,
TASCII = 2,
TSHORT = 3,
@@ -45,20 +48,60 @@ enum
TRATIONAL = 5
};
+#define NewSubfileType 254
#define ImageWidth 256
#define ImageLength 257
#define BitsPerSample 258
#define Compression 259
#define PhotometricInterpretation 262
+#define FillOrder 266
#define StripOffsets 273
#define SamplesPerPixel 277
#define RowsPerStrip 278
#define StripByteCounts 279
#define XResolution 282
#define YResolution 283
+#define PlanarConfiguration 284
#define ResolutionUnit 296
#define ColorMap 320
+static const unsigned char bitrev[256] =
+{
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+
static inline unsigned readshort(sa_tiff *tiff)
{
unsigned a = fz_readbyte(tiff->file);
@@ -106,15 +149,18 @@ tiffdebug(sa_tiff *tiff)
int i, n;
printf("TIFF <<\n");
+ printf("\t/NewSubfileType %u\n", tiff->subfiletype);
+ printf("\t/PhotometricInterpretation %u\n", tiff->photometric);
+ printf("\t/Compression %u\n", tiff->compression);
printf("\t/ImageWidth %u\n", tiff->imagewidth);
printf("\t/ImageLength %u\n", tiff->imagelength);
printf("\t/BitsPerSample %u\n", tiff->bitspersample);
- printf("\t/Compression %u\n", tiff->compression);
- printf("\t/PhotometricInterpretation %u\n", tiff->interpretation);
printf("\t/SamplesPerPixel %u\n", tiff->samplesperpixel);
+ printf("\t/PlanarConfiguration %u\n", tiff->planar);
printf("\t/XResolution %u\n", tiff->xresolution);
printf("\t/YResolution %u\n", tiff->yresolution);
printf("\t/ResolutionUnit %u\n", tiff->resolutionunit);
+ printf("\t/FillOrder %u\n", tiff->fillorder);
printf("\t/ColorMap $%p\n", tiff->colormap);
@@ -156,25 +202,26 @@ tiffreadstrips(sa_tiff *tiff)
fz_buffer *buf;
fz_file *file;
fz_filter *filter;
+ unsigned char tmp[512];
int row;
int strip;
int len;
+ int i;
printf("TIFF ");
printf("w=%d h=%d n=%d bpc=%d ",
tiff->imagewidth, tiff->imagelength,
tiff->samplesperpixel, tiff->bitspersample);
- switch (tiff->interpretation)
+ switch (tiff->photometric)
{
case 0: printf("WhiteIsZero "); break;
case 1: printf("BlackIsZero "); break;
case 2: printf("RGB "); break;
case 3: printf("RGBPal "); break;
case 5: printf("CMYK "); break;
- default:
- return fz_throw("ioerror: unknown color space in TIFF");
+ default: return fz_throw("ioerror: unknown TIFF color space: %d", tiff->photometric);
}
switch (tiff->compression)
@@ -187,7 +234,7 @@ printf("w=%d h=%d n=%d bpc=%d ",
case 2:
printf("CCITT ");
- if (tiff->interpretation != 0 && tiff->interpretation != 1)
+ if (tiff->photometric != 0 && tiff->photometric != 1)
return fz_throw("ioerror: ccitt encoding on color TIFF");
if (tiff->samplesperpixel != 1)
return fz_throw("ioerror: ccitt encoding on multi-component TIFF");
@@ -195,17 +242,12 @@ printf("w=%d h=%d n=%d bpc=%d ",
return fz_throw("ioerror: ccitt encoding on multi-bit TIFF");
error = fz_packobj(&params, "<<"
- "/K 0"
- "/EndOfLine false"
- "/EncodedByteAlign true"
- "/Columns %i"
- "/Rows %i"
- "/EndOfBlock false"
- "/BlackIs1 %b"
+ "/K 1 /EncodedByteAlign true /EndOfLine false /EndOfBlock false"
+ "/Columns %i /Rows %i /BlackIs1 %b"
">>",
tiff->imagewidth,
tiff->imagelength,
- tiff->interpretation == 0);
+ tiff->photometric == 0);
if (error)
return error;
@@ -222,16 +264,8 @@ printf("w=%d h=%d n=%d bpc=%d ",
return error;
break;
- case 3:
- return fz_throw("ioerror: unsupported compression (G3 Fax) in TIFF");
- case 4:
- return fz_throw("ioerror: unsupported compression (G4 Fax) in TIFF");
- case 5:
- return fz_throw("ioerror: unsupported compression (LZW) in TIFF");
- case 6:
- return fz_throw("ioerror: unsupported compression (JPEG) in TIFF");
default:
- return fz_throw("ioerror: unknown compression in TIFF");
+ return fz_throw("ioerror: unknown TIFF compression: %d", tiff->compression);
}
printf("\n");
@@ -254,22 +288,35 @@ printf("w=%d h=%d n=%d bpc=%d ",
for (row = 0; row < tiff->imagelength; row += tiff->rowsperstrip)
{
unsigned offset = tiff->stripoffsets[strip];
- unsigned length = tiff->stripbytecounts[strip];
- unsigned char buffer[length];
+ unsigned bytecount = tiff->stripbytecounts[strip];
fz_seek(tiff->file, offset, 0);
- len = fz_read(tiff->file, buffer, length);
- if (len < 0)
- return fz_ferror(tiff->file);
-
- len = fz_write(file, buffer, length);
- if (len < 0)
- return fz_ferror(file);
+ while (bytecount)
+ {
+ len = fz_read(tiff->file, tmp, MIN(bytecount, sizeof tmp));
+ if (len < 0)
+ return fz_ferror(tiff->file);
+ bytecount -= len;
+
+ if (tiff->fillorder == 2)
+ {
+ for (i = 0; i < len; i++)
+ tmp[i] = bitrev[tmp[i]];
+ }
+
+ len = fz_write(file, tmp, len);
+ if (len < 0)
+ return fz_ferror(file);
+ }
strip ++;
}
+ len = fz_flush(file);
+ if (len < 0)
+ return fz_ferror(file);
+
if (filter)
{
fz_popfilter(file);
@@ -278,7 +325,7 @@ printf("w=%d h=%d n=%d bpc=%d ",
fz_closefile(file);
- if (tiff->interpretation == 3 && tiff->colormap)
+ if (tiff->photometric == 3 && tiff->colormap)
{
/* TODO expand RGBPal datain buf via colormap to output */
printf(" read %d bytes (indexed)\n", buf->wp - buf->rp);
@@ -316,6 +363,9 @@ tiffreadtag(sa_tiff *tiff, unsigned offset)
switch (tag)
{
+ case NewSubfileType:
+ readtagval(&tiff->subfiletype, tiff, type, value, 1);
+ break;
case ImageWidth:
readtagval(&tiff->imagewidth, tiff, type, value, 1);
break;
@@ -329,7 +379,10 @@ tiffreadtag(sa_tiff *tiff, unsigned offset)
readtagval(&tiff->compression, tiff, type, value, 1);
break;
case PhotometricInterpretation:
- readtagval(&tiff->interpretation, tiff, type, value, 1);
+ readtagval(&tiff->photometric, tiff, type, value, 1);
+ break;
+ case FillOrder:
+ readtagval(&tiff->fillorder, tiff, type, value, 1);
break;
case SamplesPerPixel:
readtagval(&tiff->samplesperpixel, tiff, type, value, 1);
@@ -343,6 +396,9 @@ tiffreadtag(sa_tiff *tiff, unsigned offset)
case YResolution:
readtagval(&tiff->yresolution, tiff, type, value, 1);
break;
+ case PlanarConfiguration:
+ readtagval(&tiff->planar, tiff, type, value, 1);
+ break;
case ResolutionUnit:
readtagval(&tiff->resolutionunit, tiff, type, value, 1);
break;
@@ -397,6 +453,9 @@ tiffreadifd(sa_tiff *tiff, unsigned offset)
offset += 12;
}
+ if (getenv("TIFFDEBUG"))
+ tiffdebug(tiff);
+
return tiffreadstrips(tiff);
}
@@ -415,6 +474,9 @@ tiffreadifh(sa_tiff *tiff, fz_file *file)
tiff->samplesperpixel = 1;
tiff->resolutionunit = 2;
tiff->rowsperstrip = 0xFFFFFFFF;
+ tiff->fillorder = 1;
+ tiff->planar = 1;
+ tiff->subfiletype = 0;
/* get byte order marker */
tiff->order = TII;
@@ -458,9 +520,6 @@ sa_readtiff(fz_file *file)
error = tiffreadifh(&tiff, newfile);
- if (getenv("TIFFDEBUG"))
- tiffdebug(&tiff);
-
fz_free(tiff.colormap);
fz_free(tiff.stripoffsets);
fz_free(tiff.stripbytecounts);
diff --git a/stream/filt_faxd.c b/stream/filt_faxd.c
index ade56c73..19db9cb1 100644
--- a/stream/filt_faxd.c
+++ b/stream/filt_faxd.c
@@ -166,10 +166,10 @@ dec1d(fz_faxd *fax)
return fz_throw("ioerror: uncompressed data in faxd");
if (code < 0)
- return fz_throw("ioerror: invalid 1d code in faxd");
+ return fz_throw("ioerror: negative code in 1d faxd");
if (fax->a + code > fax->columns)
- return fz_throw("ioerror: invalid 1d data in faxd");
+ return fz_throw("ioerror: overflow in 1d faxd");
if (fax->c)
setbits(fax->dst, fax->a, fax->a + code);
@@ -207,10 +207,10 @@ dec2d(fz_faxd *fax)
return fz_throw("ioerror: uncompressed data in faxd");
if (code < 0)
- return fz_throw("ioerror: invalid 2d code in faxd");
+ return fz_throw("ioerror: negative code in 2d faxd");
if (fax->a + code > fax->columns)
- return fz_throw("ioerror: invalid 2d data in faxd");
+ return fz_throw("ioerror: overflow in 2d faxd");
if (fax->c)
setbits(fax->dst, fax->a, fax->a + code);
@@ -297,10 +297,10 @@ dec2d(fz_faxd *fax)
return fz_throw("ioerror: uncompressed data in faxd");
case ERROR:
- return fz_throw("ioerror: invalid 2d code in faxd");
+ return fz_throw("ioerror: invalid code in 2d faxd");
default:
- return fz_throw("ioerror: invalid 2d code in faxd (%d)", code);
+ return fz_throw("ioerror: invalid code in 2d faxd (%d)", code);
}
return 0;