56 int incRef() {
return ++ref; }
57 int decRef() {
return --ref; }
60 virtual StreamKind getKind() = 0;
63 virtual void reset() = 0;
69 virtual int getChar() = 0;
72 virtual int lookChar() = 0;
76 virtual int getRawChar();
79 virtual char *getLine(
char *buf,
int size);
82 virtual int getPos() = 0;
87 virtual void setPos(Guint pos,
int dir = 0) = 0;
90 virtual GString *getPSFilter(
const char *indent);
93 virtual GBool isBinary(GBool last = gTrue) = 0;
96 virtual BaseStream *getBaseStream() = 0;
99 virtual Dict *getDict() = 0;
102 virtual GBool isEncoder() {
return gFalse; }
106 Stream *addFilters(Object *dict);
110 Stream *makeFilter(
const char *name, Stream *str, Object *params);
121class BaseStream:
public Stream {
124 BaseStream(Object *dictA);
125 virtual ~BaseStream();
126 virtual Stream *makeSubStream(Guint start, GBool limited,
127 Guint length, Object *dict) = 0;
128 virtual void setPos(Guint pos,
int dir = 0) = 0;
129 virtual BaseStream *getBaseStream() {
return this; }
130 virtual Dict *getDict() {
return dict.getDict(); }
133 virtual Guint getStart() = 0;
134 virtual void moveStart(
int delta) = 0;
138 virtual void doDecryption(Guchar *fileKey,
int keyLength,
139 int objNum,
int objGen);
159class FilterStream:
public Stream {
162 FilterStream(Stream *strA);
163 virtual ~FilterStream();
164 virtual void close();
165 virtual int getPos() {
return str->getPos(); }
166 virtual void setPos(Guint pos,
int dir = 0);
167 virtual BaseStream *getBaseStream() {
return str->getBaseStream(); }
168 virtual Dict *getDict() {
return str->getDict(); }
185 ImageStream(Stream *strA,
int widthA,
int nCompsA,
int nBitsA);
194 GBool getPixel(Guchar *pix);
218class StreamPredictor {
223 StreamPredictor(Stream *strA,
int predictorA,
224 int widthA,
int nCompsA,
int nBitsA);
230 GBool isOk() {
return ok; }
253#define fileStreamBufSize 256
255class FileStream:
public BaseStream {
258 FileStream(FILE *fA, Guint startA, GBool limitedA,
259 Guint lengthA, Object *dictA);
260 virtual ~FileStream();
261 virtual Stream *makeSubStream(Guint startA, GBool limitedA,
262 Guint lengthA, Object *dictA);
263 virtual StreamKind getKind() {
return strFile; }
264 virtual void reset();
265 virtual void close();
266 virtual int getChar()
267 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
268 virtual int lookChar()
269 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
270 virtual int getPos() {
return bufPos + (bufPtr - buf); }
271 virtual void setPos(Guint pos,
int dir = 0);
272 virtual GBool isBinary(GBool last = gTrue) {
return last; }
273 virtual Guint getStart() {
return start; }
274 virtual void moveStart(
int delta);
284 char buf[fileStreamBufSize];
296class MemStream:
public BaseStream {
299 MemStream(
char *bufA, Guint lengthA, Object *dictA);
300 virtual ~MemStream();
301 virtual Stream *makeSubStream(Guint start, GBool limited,
302 Guint lengthA, Object *dictA);
303 virtual StreamKind getKind() {
return strWeird; }
304 virtual void reset();
305 virtual void close();
306 virtual int getChar()
307 {
return (bufPtr < bufEnd) ? (*bufPtr++ & 0xff) : EOF; }
308 virtual int lookChar()
309 {
return (bufPtr < bufEnd) ? (*bufPtr & 0xff) : EOF; }
310 virtual int getPos() {
return bufPtr - buf; }
311 virtual void setPos(Guint pos,
int dir = 0);
312 virtual GBool isBinary(GBool last = gTrue) {
return last; }
313 virtual Guint getStart() {
return 0; }
314 virtual void moveStart(
int delta);
316 virtual void doDecryption(Guchar *fileKey,
int keyLength,
317 int objNum,
int objGen);
339class EmbedStream:
public BaseStream {
342 EmbedStream(Stream *strA, Object *dictA);
343 virtual ~EmbedStream();
344 virtual Stream *makeSubStream(Guint start, GBool limited,
345 Guint length, Object *dictA);
346 virtual StreamKind getKind() {
return str->getKind(); }
347 virtual void reset() {}
348 virtual int getChar() {
return str->getChar(); }
349 virtual int lookChar() {
return str->lookChar(); }
350 virtual int getPos() {
return str->getPos(); }
351 virtual void setPos(Guint pos,
int dir = 0);
352 virtual GBool isBinary(GBool last = gTrue) {
return last; }
353 virtual Guint getStart();
354 virtual void moveStart(
int delta);
365class ASCIIHexStream:
public FilterStream {
368 ASCIIHexStream(Stream *strA);
369 virtual ~ASCIIHexStream();
370 virtual StreamKind getKind() {
return strASCIIHex; }
371 virtual void reset();
372 virtual int getChar()
373 {
int c = lookChar(); buf = EOF;
return c; }
374 virtual int lookChar();
375 virtual GString *getPSFilter(
const char *indent);
376 virtual GBool isBinary(GBool last = gTrue);
388class ASCII85Stream:
public FilterStream {
391 ASCII85Stream(Stream *strA);
392 virtual ~ASCII85Stream();
393 virtual StreamKind getKind() {
return strASCII85; }
394 virtual void reset();
395 virtual int getChar()
396 {
int ch = lookChar(); ++index;
return ch; }
397 virtual int lookChar();
398 virtual GString *getPSFilter(
const char *indent);
399 virtual GBool isBinary(GBool last = gTrue);
413class LZWStream:
public FilterStream {
416 LZWStream(Stream *strA,
int predictor,
int columns,
int colors,
417 int bits,
int earlyA);
418 virtual ~LZWStream();
419 virtual StreamKind getKind() {
return strLZW; }
420 virtual void reset();
421 virtual int getChar();
422 virtual int lookChar();
423 virtual int getRawChar();
424 virtual GString *getPSFilter(
const char *indent);
425 virtual GBool isBinary(GBool last = gTrue);
429 StreamPredictor *pred;
448 GBool processNextCode();
457class RunLengthStream:
public FilterStream {
460 RunLengthStream(Stream *strA);
461 virtual ~RunLengthStream();
462 virtual StreamKind getKind() {
return strRunLength; }
463 virtual void reset();
464 virtual int getChar()
465 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
466 virtual int lookChar()
467 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
468 virtual GString *getPSFilter(
const char *indent);
469 virtual GBool isBinary(GBool last = gTrue);
485struct CCITTCodeTable;
487class CCITTFaxStream:
public FilterStream {
490 CCITTFaxStream(Stream *strA,
int encodingA, GBool endOfLineA,
491 GBool byteAlignA,
int columnsA,
int rowsA,
492 GBool endOfBlockA, GBool blackA);
493 virtual ~CCITTFaxStream();
494 virtual StreamKind getKind() {
return strCCITTFax; }
495 virtual void reset();
496 virtual int getChar()
497 {
int c = lookChar(); buf = EOF;
return c; }
498 virtual int lookChar();
499 virtual GString *getPSFilter(
const char *indent);
500 virtual GBool isBinary(GBool last = gTrue);
524 void addPixels(
int a1,
int black);
525 void addPixelsNeg(
int a1,
int black);
527 short getTwoDimCode();
528 short getWhiteCode();
529 short getBlackCode();
530 short lookBits(
int n);
531 void eatBits(
int n) { inputBits -= n; }
541 int hSample, vSample;
552 int firstCoeff, lastCoeff;
559 Gushort firstCode[17];
560 Gushort numCodes[17];
564class DCTStream:
public FilterStream {
567 DCTStream(Stream *strA);
568 virtual ~DCTStream();
569 virtual StreamKind getKind() {
return strDCT; }
570 virtual void reset();
571 virtual int getChar();
572 virtual int lookChar();
573 virtual GString *getPSFilter(
const char *indent);
574 virtual GBool isBinary(GBool last = gTrue);
575 Stream *getRawStream() {
return str; }
582 int mcuWidth, mcuHeight;
583 int bufWidth, bufHeight;
584 DCTCompInfo compInfo[4];
585 DCTScanInfo scanInfo;
588 GBool gotAdobeMarker;
590 Guchar quantTables[4][64];
592 DCTHuffTable dcHuffTables[4];
593 DCTHuffTable acHuffTables[4];
596 Guchar *rowBuf[4][32];
608 GBool readDataUnit(DCTHuffTable *dcHuffTable,
609 DCTHuffTable *acHuffTable,
610 int *prevDC,
int data[64]);
611 GBool readProgressiveDataUnit(DCTHuffTable *dcHuffTable,
612 DCTHuffTable *acHuffTable,
613 int *prevDC,
int data[64]);
615 void transformDataUnit(Guchar *quantTable,
616 int dataIn[64], Guchar dataOut[64]);
617 int readHuffSym(DCTHuffTable *table);
618 int readAmp(
int size);
621 GBool readBaselineSOF();
622 GBool readProgressiveSOF();
623 GBool readScanInfo();
624 GBool readQuantTables();
625 GBool readHuffmanTables();
626 GBool readRestartInterval();
627 GBool readAdobeMarker();
637#define flateWindow 32768
638#define flateMask (flateWindow-1)
639#define flateMaxHuffman 15
640#define flateMaxCodeLenCodes 19
641#define flateMaxLitCodes 288
642#define flateMaxDistCodes 30
650struct FlateHuffmanTab {
661class FlateStream:
public FilterStream {
664 FlateStream(Stream *strA,
int predictor,
int columns,
665 int colors,
int bits);
666 virtual ~FlateStream();
667 virtual StreamKind getKind() {
return strFlate; }
668 virtual void reset();
669 virtual int getChar();
670 virtual int lookChar();
671 virtual int getRawChar();
672 virtual GString *getPSFilter(
const char *indent);
673 virtual GBool isBinary(GBool last = gTrue);
677 StreamPredictor *pred;
678 Guchar buf[flateWindow];
684 codeLengths[flateMaxLitCodes + flateMaxDistCodes];
685 FlateHuffmanTab litCodeTab;
686 FlateHuffmanTab distCodeTab;
687 GBool compressedBlock;
693 codeLenCodeMap[flateMaxCodeLenCodes];
695 lengthDecode[flateMaxLitCodes-257];
697 distDecode[flateMaxDistCodes];
701 void loadFixedCodes();
702 GBool readDynamicCodes();
703 void compHuffmanCodes(
int *lengths,
int n, FlateHuffmanTab *tab);
704 int getHuffmanCodeWord(FlateHuffmanTab *tab);
705 int getCodeWord(
int bits);
712class EOFStream:
public FilterStream {
715 EOFStream(Stream *strA);
716 virtual ~EOFStream();
717 virtual StreamKind getKind() {
return strWeird; }
718 virtual void reset() {}
719 virtual int getChar() {
return EOF; }
720 virtual int lookChar() {
return EOF; }
721 virtual GString *getPSFilter(
const char *) {
return NULL; }
722 virtual GBool isBinary(GBool = gTrue) {
return gFalse; }
729class FixedLengthEncoder:
public FilterStream {
732 FixedLengthEncoder(Stream *strA,
int lengthA);
733 ~FixedLengthEncoder();
734 virtual StreamKind getKind() {
return strWeird; }
735 virtual void reset();
736 virtual void close();
737 virtual int getChar();
738 virtual int lookChar();
739 virtual GString *getPSFilter(
const char *) {
return NULL; }
740 virtual GBool isBinary(GBool = gTrue) {
return gFalse; }
741 virtual GBool isEncoder() {
return gTrue; }
753class ASCIIHexEncoder:
public FilterStream {
756 ASCIIHexEncoder(Stream *strA);
757 virtual ~ASCIIHexEncoder();
758 virtual StreamKind getKind() {
return strWeird; }
759 virtual void reset();
760 virtual void close();
761 virtual int getChar()
762 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
763 virtual int lookChar()
764 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
765 virtual GString *getPSFilter(
const char *) {
return NULL; }
766 virtual GBool isBinary(GBool = gTrue) {
return gFalse; }
767 virtual GBool isEncoder() {
return gTrue; }
784class ASCII85Encoder:
public FilterStream {
787 ASCII85Encoder(Stream *strA);
788 virtual ~ASCII85Encoder();
789 virtual StreamKind getKind() {
return strWeird; }
790 virtual void reset();
791 virtual void close();
792 virtual int getChar()
793 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
794 virtual int lookChar()
795 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
796 virtual GString *getPSFilter(
const char *) {
return NULL; }
797 virtual GBool isBinary(GBool = gTrue) {
return gFalse; }
798 virtual GBool isEncoder() {
return gTrue; }
815class RunLengthEncoder:
public FilterStream {
818 RunLengthEncoder(Stream *strA);
819 virtual ~RunLengthEncoder();
820 virtual StreamKind getKind() {
return strWeird; }
821 virtual void reset();
822 virtual void close();
823 virtual int getChar()
824 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
825 virtual int lookChar()
826 {
return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
827 virtual GString *getPSFilter(
const char *) {
return NULL; }
828 virtual GBool isBinary(GBool = gTrue) {
return gFalse; }
829 virtual GBool isEncoder() {
return gTrue; }