1
//========================================================================
5
// Copyright 1996-2003 Glyph & Cog, LLC
7
//========================================================================
14
#ifdef USE_GCC_PRAGMAS
24
//------------------------------------------------------------------------
37
strWeird // internal-use stream types
40
enum StreamColorSpaceMode {
47
//------------------------------------------------------------------------
49
// This is in Stream.h instead of Decrypt.h to avoid really annoying
50
// include file dependency loops.
56
//------------------------------------------------------------------------
57
// Stream (base class)
58
//------------------------------------------------------------------------
69
// Reference counting.
70
int incRef() { return ++ref; }
71
int decRef() { return --ref; }
73
// Get kind of stream.
74
virtual StreamKind getKind() = 0;
76
// Reset stream to beginning.
77
virtual void reset() = 0;
79
// Close down the stream.
82
// Get next char from stream.
83
virtual int getChar() = 0;
85
// Peek at next char in stream.
86
virtual int lookChar() = 0;
88
// Get next char from stream without using the predictor.
89
// This is only used by StreamPredictor.
90
virtual int getRawChar();
92
// Get next line from stream.
93
virtual char *getLine(char *buf, int size);
95
// Get current position in file.
96
virtual int getPos() = 0;
98
// Go to a position in the stream. If <dir> is negative, the
99
// position is from the end of the file; otherwise the position is
100
// from the start of the file.
101
virtual void setPos(Guint pos, int dir = 0) = 0;
103
// Get PostScript command for the filter(s).
104
virtual GString *getPSFilter(int psLevel, char *indent);
106
// Does this stream type potentially contain non-printable chars?
107
virtual GBool isBinary(GBool last = gTrue) = 0;
109
// Get the BaseStream of this stream.
110
virtual BaseStream *getBaseStream() = 0;
112
// Get the stream after the last decoder (this may be a BaseStream
113
// or a DecryptStream).
114
virtual Stream *getUndecodedStream() = 0;
116
// Get the dictionary associated with this stream.
117
virtual Dict *getDict() = 0;
119
// Is this an encoding filter?
120
virtual GBool isEncoder() { return gFalse; }
122
// Get image parameters which are defined by the stream contents.
123
virtual void getImageParams(int *bitsPerComponent,
124
StreamColorSpaceMode *csMode) {}
126
// Return the next stream in the "stack".
127
virtual Stream *getNextStream() { return NULL; }
129
// Add filters to this stream according to the parameters in <dict>.
130
// Returns the new stream.
131
Stream *addFilters(Object *dict);
135
Stream *makeFilter(char *name, Stream *str, Object *params);
137
int ref; // reference count
140
//------------------------------------------------------------------------
143
// This is the base class for all streams that read directly from a file.
144
//------------------------------------------------------------------------
146
class BaseStream: public Stream {
149
BaseStream(Object *dictA);
150
virtual ~BaseStream();
151
virtual Stream *makeSubStream(Guint start, GBool limited,
152
Guint length, Object *dict) = 0;
153
virtual void setPos(Guint pos, int dir = 0) = 0;
154
virtual GBool isBinary(GBool last = gTrue) { return last; }
155
virtual BaseStream *getBaseStream() { return this; }
156
virtual Stream *getUndecodedStream() { return this; }
157
virtual Dict *getDict() { return dict.getDict(); }
158
virtual GString *getFileName() { return NULL; }
160
// Get/set position of first byte of stream within the file.
161
virtual Guint getStart() = 0;
162
virtual void moveStart(int delta) = 0;
169
//------------------------------------------------------------------------
172
// This is the base class for all streams that filter another stream.
173
//------------------------------------------------------------------------
175
class FilterStream: public Stream {
178
FilterStream(Stream *strA);
179
virtual ~FilterStream();
180
virtual void close();
181
virtual int getPos() { return str->getPos(); }
182
virtual void setPos(Guint pos, int dir = 0);
183
virtual BaseStream *getBaseStream() { return str->getBaseStream(); }
184
virtual Stream *getUndecodedStream() { return str->getUndecodedStream(); }
185
virtual Dict *getDict() { return str->getDict(); }
186
virtual Stream *getNextStream() { return str; }
193
//------------------------------------------------------------------------
195
//------------------------------------------------------------------------
200
// Create an image stream object for an image with the specified
201
// parameters. Note that these are the actual image parameters,
202
// which may be different from the predictor parameters.
203
ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA);
210
// Gets the next pixel from the stream. <pix> should be able to hold
211
// at least nComps elements. Returns false at end of file.
212
GBool getPixel(Guchar *pix);
214
// Returns a pointer to the next line of pixels. Returns NULL at
218
// Skip an entire line from the image.
223
Stream *str; // base stream
224
int width; // pixels per line
225
int nComps; // components per pixel
226
int nBits; // bits per component
227
int nVals; // components per line
228
Guchar *imgLine; // line buffer
229
int imgIdx; // current index in imgLine
232
//------------------------------------------------------------------------
234
//------------------------------------------------------------------------
236
class StreamPredictor {
239
// Create a predictor object. Note that the parameters are for the
240
// predictor, and may not match the actual image parameters.
241
StreamPredictor(Stream *strA, int predictorA,
242
int widthA, int nCompsA, int nBitsA);
246
GBool isOk() { return ok; }
255
Stream *str; // base stream
256
int predictor; // predictor
257
int width; // pixels per line
258
int nComps; // components per pixel
259
int nBits; // bits per component
260
int nVals; // components per line
261
int pixBytes; // bytes per pixel
262
int rowBytes; // bytes per line
263
Guchar *predLine; // line buffer
264
int predIdx; // current index in predLine
268
//------------------------------------------------------------------------
270
//------------------------------------------------------------------------
272
#define fileStreamBufSize 256
274
class FileStream: public BaseStream {
277
FileStream(FILE *fA, Guint startA, GBool limitedA,
278
Guint lengthA, Object *dictA);
279
virtual ~FileStream();
280
virtual Stream *makeSubStream(Guint startA, GBool limitedA,
281
Guint lengthA, Object *dictA);
282
virtual StreamKind getKind() { return strFile; }
283
virtual void reset();
284
virtual void close();
285
virtual int getChar()
286
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
287
virtual int lookChar()
288
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
289
virtual int getPos() { return bufPos + (bufPtr - buf); }
290
virtual void setPos(Guint pos, int dir = 0);
291
virtual Guint getStart() { return start; }
292
virtual void moveStart(int delta);
302
char buf[fileStreamBufSize];
310
//------------------------------------------------------------------------
312
//------------------------------------------------------------------------
314
class MemStream: public BaseStream {
317
MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA);
318
virtual ~MemStream();
319
virtual Stream *makeSubStream(Guint start, GBool limited,
320
Guint lengthA, Object *dictA);
321
virtual StreamKind getKind() { return strWeird; }
322
virtual void reset();
323
virtual void close();
324
virtual int getChar()
325
{ return (bufPtr < bufEnd) ? (*bufPtr++ & 0xff) : EOF; }
326
virtual int lookChar()
327
{ return (bufPtr < bufEnd) ? (*bufPtr & 0xff) : EOF; }
328
virtual int getPos() { return (int)(bufPtr - buf); }
329
virtual void setPos(Guint pos, int dir = 0);
330
virtual Guint getStart() { return start; }
331
virtual void moveStart(int delta);
343
//------------------------------------------------------------------------
346
// This is a special stream type used for embedded streams (inline
347
// images). It reads directly from the base stream -- after the
348
// EmbedStream is deleted, reads from the base stream will proceed where
349
// the BaseStream left off. Note that this is very different behavior
350
// that creating a new FileStream (using makeSubStream).
351
//------------------------------------------------------------------------
353
class EmbedStream: public BaseStream {
356
EmbedStream(Stream *strA, Object *dictA, GBool limitedA, Guint lengthA);
357
virtual ~EmbedStream();
358
virtual Stream *makeSubStream(Guint start, GBool limitedA,
359
Guint lengthA, Object *dictA);
360
virtual StreamKind getKind() { return str->getKind(); }
361
virtual void reset() {}
362
virtual int getChar();
363
virtual int lookChar();
364
virtual int getPos() { return str->getPos(); }
365
virtual void setPos(Guint pos, int dir = 0);
366
virtual Guint getStart();
367
virtual void moveStart(int delta);
376
//------------------------------------------------------------------------
378
//------------------------------------------------------------------------
380
class ASCIIHexStream: public FilterStream {
383
ASCIIHexStream(Stream *strA);
384
virtual ~ASCIIHexStream();
385
virtual StreamKind getKind() { return strASCIIHex; }
386
virtual void reset();
387
virtual int getChar()
388
{ int c = lookChar(); buf = EOF; return c; }
389
virtual int lookChar();
390
virtual GString *getPSFilter(int psLevel, char *indent);
391
virtual GBool isBinary(GBool last = gTrue);
399
//------------------------------------------------------------------------
401
//------------------------------------------------------------------------
403
class ASCII85Stream: public FilterStream {
406
ASCII85Stream(Stream *strA);
407
virtual ~ASCII85Stream();
408
virtual StreamKind getKind() { return strASCII85; }
409
virtual void reset();
410
virtual int getChar()
411
{ int ch = lookChar(); ++index; return ch; }
412
virtual int lookChar();
413
virtual GString *getPSFilter(int psLevel, char *indent);
414
virtual GBool isBinary(GBool last = gTrue);
424
//------------------------------------------------------------------------
426
//------------------------------------------------------------------------
428
class LZWStream: public FilterStream {
431
LZWStream(Stream *strA, int predictor, int columns, int colors,
432
int bits, int earlyA);
433
virtual ~LZWStream();
434
virtual StreamKind getKind() { return strLZW; }
435
virtual void reset();
436
virtual int getChar();
437
virtual int lookChar();
438
virtual int getRawChar();
439
virtual GString *getPSFilter(int psLevel, char *indent);
440
virtual GBool isBinary(GBool last = gTrue);
444
StreamPredictor *pred; // predictor
445
int early; // early parameter
446
GBool eof; // true if at eof
447
int inputBuf; // input buffer
448
int inputBits; // number of bits in input buffer
449
struct { // decoding table
454
int nextCode; // next code to be used
455
int nextBits; // number of bits in next code word
456
int prevCode; // previous code used in stream
457
int newChar; // next char to be added to table
458
Guchar seqBuf[4097]; // buffer for current sequence
459
int seqLength; // length of current sequence
460
int seqIndex; // index into current sequence
461
GBool first; // first code after a table clear
463
GBool processNextCode();
468
//------------------------------------------------------------------------
470
//------------------------------------------------------------------------
472
class RunLengthStream: public FilterStream {
475
RunLengthStream(Stream *strA);
476
virtual ~RunLengthStream();
477
virtual StreamKind getKind() { return strRunLength; }
478
virtual void reset();
479
virtual int getChar()
480
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
481
virtual int lookChar()
482
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
483
virtual GString *getPSFilter(int psLevel, char *indent);
484
virtual GBool isBinary(GBool last = gTrue);
488
char buf[128]; // buffer
489
char *bufPtr; // next char to read
490
char *bufEnd; // end of buffer
496
//------------------------------------------------------------------------
498
//------------------------------------------------------------------------
500
struct CCITTCodeTable;
502
class CCITTFaxStream: public FilterStream {
505
CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA,
506
GBool byteAlignA, int columnsA, int rowsA,
507
GBool endOfBlockA, GBool blackA);
508
virtual ~CCITTFaxStream();
509
virtual StreamKind getKind() { return strCCITTFax; }
510
virtual void reset();
511
virtual int getChar()
512
{ int c = lookChar(); buf = EOF; return c; }
513
virtual int lookChar();
514
virtual GString *getPSFilter(int psLevel, char *indent);
515
virtual GBool isBinary(GBool last = gTrue);
519
int encoding; // 'K' parameter
520
GBool endOfLine; // 'EndOfLine' parameter
521
GBool byteAlign; // 'EncodedByteAlign' parameter
522
int columns; // 'Columns' parameter
523
int rows; // 'Rows' parameter
524
GBool endOfBlock; // 'EndOfBlock' parameter
525
GBool black; // 'BlackIs1' parameter
526
GBool eof; // true if at eof
527
GBool nextLine2D; // true if next line uses 2D encoding
528
int row; // current row
529
int inputBuf; // input buffer
530
int inputBits; // number of bits in input buffer
531
int *codingLine; // coding line changing elements
532
int *refLine; // reference line changing elements
533
int a0i; // index into codingLine
534
GBool err; // error on current line
535
int outputBits; // remaining ouput bits
536
int buf; // character buffer
538
void addPixels(int a1, int black);
539
void addPixelsNeg(int a1, int black);
540
short getTwoDimCode();
541
short getWhiteCode();
542
short getBlackCode();
543
short lookBits(int n);
544
void eatBits(int n) { if ((inputBits -= n) < 0) inputBits = 0; }
547
//------------------------------------------------------------------------
549
//------------------------------------------------------------------------
551
// DCT component info
553
int id; // component ID
554
int hSample, vSample; // horiz/vert sampling resolutions
555
int quantTable; // quantization table number
556
int prevDC; // DC coefficient accumulator
560
GBool comp[4]; // comp[i] is set if component i is
561
// included in this scan
562
int numComps; // number of components in the scan
563
int dcHuffTable[4]; // DC Huffman table numbers
564
int acHuffTable[4]; // AC Huffman table numbers
565
int firstCoeff, lastCoeff; // first and last DCT coefficient
566
int ah, al; // successive approximation parameters
569
// DCT Huffman decoding table
570
struct DCTHuffTable {
571
Guchar firstSym[17]; // first symbol for this bit length
572
Gushort firstCode[17]; // first code for this bit length
573
Gushort numCodes[17]; // number of codes of this bit length
574
Guchar sym[256]; // symbols
577
class DCTStream: public FilterStream {
580
DCTStream(Stream *strA, int colorXformA);
581
virtual ~DCTStream();
582
virtual StreamKind getKind() { return strDCT; }
583
virtual void reset();
584
virtual void close();
585
virtual int getChar();
586
virtual int lookChar();
587
virtual GString *getPSFilter(int psLevel, char *indent);
588
virtual GBool isBinary(GBool last = gTrue);
589
Stream *getRawStream() { return str; }
593
GBool progressive; // set if in progressive mode
594
GBool interleaved; // set if in interleaved mode
595
int width, height; // image size
596
int mcuWidth, mcuHeight; // size of min coding unit, in data units
597
int bufWidth, bufHeight; // frameBuf size
598
DCTCompInfo compInfo[4]; // info for each component
599
DCTScanInfo scanInfo; // info for the current scan
600
int numComps; // number of components in image
601
int colorXform; // color transform: -1 = unspecified
603
// 1 = YUV/YUVK -> RGB/CMYK
604
GBool gotJFIFMarker; // set if APP0 JFIF marker was present
605
GBool gotAdobeMarker; // set if APP14 Adobe marker was present
606
int restartInterval; // restart interval, in MCUs
607
Gushort quantTables[4][64]; // quantization tables
608
int numQuantTables; // number of quantization tables
609
DCTHuffTable dcHuffTables[4]; // DC Huffman tables
610
DCTHuffTable acHuffTables[4]; // AC Huffman tables
611
int numDCHuffTables; // number of DC Huffman tables
612
int numACHuffTables; // number of AC Huffman tables
613
Guchar *rowBuf[4][32]; // buffer for one MCU (non-progressive mode)
614
int *frameBuf[4]; // buffer for frame (progressive mode)
615
int comp, x, y, dy; // current position within image/MCU
616
int restartCtr; // MCUs left until restart
617
int restartMarker; // next restart marker
618
int eobRun; // number of EOBs left in the current run
619
int inputBuf; // input buffer for variable length codes
620
int inputBits; // number of valid bits in input buffer
625
GBool readDataUnit(DCTHuffTable *dcHuffTable,
626
DCTHuffTable *acHuffTable,
627
int *prevDC, int data[64]);
628
GBool readProgressiveDataUnit(DCTHuffTable *dcHuffTable,
629
DCTHuffTable *acHuffTable,
630
int *prevDC, int data[64]);
632
void transformDataUnit(Gushort *quantTable,
633
int dataIn[64], Guchar dataOut[64]);
634
int readHuffSym(DCTHuffTable *table);
635
int readAmp(int size);
638
GBool readBaselineSOF();
639
GBool readProgressiveSOF();
640
GBool readScanInfo();
641
GBool readQuantTables();
642
GBool readHuffmanTables();
643
GBool readRestartInterval();
644
GBool readJFIFMarker();
645
GBool readAdobeMarker();
651
//------------------------------------------------------------------------
653
//------------------------------------------------------------------------
655
#define flateWindow 32768 // buffer size
656
#define flateMask (flateWindow-1)
657
#define flateMaxHuffman 15 // max Huffman code length
658
#define flateMaxCodeLenCodes 19 // max # code length codes
659
#define flateMaxLitCodes 288 // max # literal codes
660
#define flateMaxDistCodes 30 // max # distance codes
662
// Huffman code table entry
664
Gushort len; // code length, in bits
665
Gushort val; // value represented by this code
668
struct FlateHuffmanTab {
673
// Decoding info for length and distance code words
675
int bits; // # extra bits
676
int first; // first length/distance
679
class FlateStream: public FilterStream {
682
FlateStream(Stream *strA, int predictor, int columns,
683
int colors, int bits);
684
virtual ~FlateStream();
685
virtual StreamKind getKind() { return strFlate; }
686
virtual void reset();
687
virtual int getChar();
688
virtual int lookChar();
689
virtual int getRawChar();
690
virtual GString *getPSFilter(int psLevel, char *indent);
691
virtual GBool isBinary(GBool last = gTrue);
695
StreamPredictor *pred; // predictor
696
Guchar buf[flateWindow]; // output data buffer
697
int index; // current index into output buffer
698
int remain; // number valid bytes in output buffer
699
int codeBuf; // input buffer
700
int codeSize; // number of bits in input buffer
701
int // literal and distance code lengths
702
codeLengths[flateMaxLitCodes + flateMaxDistCodes];
703
FlateHuffmanTab litCodeTab; // literal code table
704
FlateHuffmanTab distCodeTab; // distance code table
705
GBool compressedBlock; // set if reading a compressed block
706
int blockLen; // remaining length of uncompressed block
707
GBool endOfBlock; // set when end of block is reached
708
GBool eof; // set when end of stream is reached
710
static int // code length code reordering
711
codeLenCodeMap[flateMaxCodeLenCodes];
712
static FlateDecode // length decoding info
713
lengthDecode[flateMaxLitCodes-257];
714
static FlateDecode // distance decoding info
715
distDecode[flateMaxDistCodes];
716
static FlateHuffmanTab // fixed literal code table
718
static FlateHuffmanTab // fixed distance code table
723
void loadFixedCodes();
724
GBool readDynamicCodes();
725
void compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab);
726
int getHuffmanCodeWord(FlateHuffmanTab *tab);
727
int getCodeWord(int bits);
730
//------------------------------------------------------------------------
732
//------------------------------------------------------------------------
734
class EOFStream: public FilterStream {
737
EOFStream(Stream *strA);
738
virtual ~EOFStream();
739
virtual StreamKind getKind() { return strWeird; }
740
virtual void reset() {}
741
virtual int getChar() { return EOF; }
742
virtual int lookChar() { return EOF; }
743
virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
744
virtual GBool isBinary(GBool last = gTrue) { return gFalse; }
747
//------------------------------------------------------------------------
748
// FixedLengthEncoder
749
//------------------------------------------------------------------------
751
class FixedLengthEncoder: public FilterStream {
754
FixedLengthEncoder(Stream *strA, int lengthA);
755
~FixedLengthEncoder();
756
virtual StreamKind getKind() { return strWeird; }
757
virtual void reset();
758
virtual int getChar();
759
virtual int lookChar();
760
virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
761
virtual GBool isBinary(GBool last = gTrue);
762
virtual GBool isEncoder() { return gTrue; }
770
//------------------------------------------------------------------------
772
//------------------------------------------------------------------------
774
class ASCIIHexEncoder: public FilterStream {
777
ASCIIHexEncoder(Stream *strA);
778
virtual ~ASCIIHexEncoder();
779
virtual StreamKind getKind() { return strWeird; }
780
virtual void reset();
781
virtual int getChar()
782
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
783
virtual int lookChar()
784
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
785
virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
786
virtual GBool isBinary(GBool last = gTrue) { return gFalse; }
787
virtual GBool isEncoder() { return gTrue; }
800
//------------------------------------------------------------------------
802
//------------------------------------------------------------------------
804
class ASCII85Encoder: public FilterStream {
807
ASCII85Encoder(Stream *strA);
808
virtual ~ASCII85Encoder();
809
virtual StreamKind getKind() { return strWeird; }
810
virtual void reset();
811
virtual int getChar()
812
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
813
virtual int lookChar()
814
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
815
virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
816
virtual GBool isBinary(GBool last = gTrue) { return gFalse; }
817
virtual GBool isEncoder() { return gTrue; }
830
//------------------------------------------------------------------------
832
//------------------------------------------------------------------------
834
class RunLengthEncoder: public FilterStream {
837
RunLengthEncoder(Stream *strA);
838
virtual ~RunLengthEncoder();
839
virtual StreamKind getKind() { return strWeird; }
840
virtual void reset();
841
virtual int getChar()
842
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
843
virtual int lookChar()
844
{ return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
845
virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
846
virtual GBool isBinary(GBool last = gTrue) { return gTrue; }
847
virtual GBool isEncoder() { return gTrue; }