blob: af63a6733776a1d8afb9b6f6434b3e6979ac5f18 [file] [log] [blame]
//========================================================================
//
// JBIG2Stream.h
//
// Copyright 2002-2003 Glyph & Cog, LLC
//
//========================================================================
//========================================================================
//
// Modified under the Poppler project - http://poppler.freedesktop.org
//
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
// Copyright (C) 2009 David Benjamin <davidben@mit.edu>
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2015 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
// Copyright (C) 2019-2021 Oliver Sander <oliver.sander@tu-dresden.de>
// Copyright (C) 2019 Volker Krause <vkrause@kde.org>
// Copyright (C) 2019, 2021 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2019, 2020 Even Rouault <even.rouault@spatialys.com>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
//
//========================================================================
#ifndef JBIG2STREAM_H
#define JBIG2STREAM_H
#include "Object.h"
#include "Stream.h"
class JBIG2Segment;
class JBIG2Bitmap;
class JArithmeticDecoder;
class JArithmeticDecoderStats;
class JBIG2HuffmanDecoder;
struct JBIG2HuffmanTable;
class JBIG2MMRDecoder;
//------------------------------------------------------------------------
class JBIG2Stream : public FilterStream
{
public:
JBIG2Stream(Stream *strA, Object &&globalsStreamA, Object *globalsStreamRefA);
~JBIG2Stream() override;
StreamKind getKind() const override { return strJBIG2; }
void reset() override;
void close() override;
Goffset getPos() override;
int getChar() override;
int lookChar() override;
GooString *getPSFilter(int psLevel, const char *indent) override;
bool isBinary(bool last = true) const override;
virtual Object *getGlobalsStream() { return &globalsStream; }
virtual Ref getGlobalsStreamRef() { return globalsStreamRef; }
private:
bool hasGetChars() override { return true; }
int getChars(int nChars, unsigned char *buffer) override;
void readSegments();
bool readSymbolDictSeg(unsigned int segNum, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs);
void readTextRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs);
std::unique_ptr<JBIG2Bitmap> readTextRegion(bool huff, bool refine, int w, int h, unsigned int numInstances, unsigned int logStrips, int numSyms, const JBIG2HuffmanTable *symCodeTab, unsigned int symCodeLen, JBIG2Bitmap **syms,
unsigned int defPixel, unsigned int combOp, unsigned int transposed, unsigned int refCorner, int sOffset, const JBIG2HuffmanTable *huffFSTable, const JBIG2HuffmanTable *huffDSTable,
const JBIG2HuffmanTable *huffDTTable, const JBIG2HuffmanTable *huffRDWTable, const JBIG2HuffmanTable *huffRDHTable, const JBIG2HuffmanTable *huffRDXTable,
const JBIG2HuffmanTable *huffRDYTable, const JBIG2HuffmanTable *huffRSizeTable, unsigned int templ, int *atx, int *aty);
void readPatternDictSeg(unsigned int segNum, unsigned int length);
void readHalftoneRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs);
void readGenericRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length);
void mmrAddPixels(int a1, int blackPixels, int *codingLine, int *a0i, int w);
void mmrAddPixelsNeg(int a1, int blackPixels, int *codingLine, int *a0i, int w);
std::unique_ptr<JBIG2Bitmap> readGenericBitmap(bool mmr, int w, int h, int templ, bool tpgdOn, bool useSkip, JBIG2Bitmap *skip, int *atx, int *aty, int mmrDataLength);
void readGenericRefinementRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs);
std::unique_ptr<JBIG2Bitmap> readGenericRefinementRegion(int w, int h, int templ, bool tpgrOn, JBIG2Bitmap *refBitmap, int refDX, int refDY, int *atx, int *aty);
void readPageInfoSeg(unsigned int length);
void readEndOfStripeSeg(unsigned int length);
void readProfilesSeg(unsigned int length);
void readCodeTableSeg(unsigned int segNum, unsigned int length);
void readExtensionSeg(unsigned int length);
JBIG2Segment *findSegment(unsigned int segNum);
void discardSegment(unsigned int segNum);
void resetGenericStats(unsigned int templ, JArithmeticDecoderStats *prevStats);
void resetRefinementStats(unsigned int templ, JArithmeticDecoderStats *prevStats);
bool resetIntStats(int symCodeLen);
bool readUByte(unsigned int *x);
bool readByte(int *x);
bool readUWord(unsigned int *x);
bool readULong(unsigned int *x);
bool readLong(int *x);
Object globalsStream;
Ref globalsStreamRef;
unsigned int pageW, pageH, curPageH;
unsigned int pageDefPixel;
JBIG2Bitmap *pageBitmap;
unsigned int defCombOp;
std::vector<std::unique_ptr<JBIG2Segment>> segments;
std::vector<std::unique_ptr<JBIG2Segment>> globalSegments;
Stream *curStr;
unsigned char *dataPtr;
unsigned char *dataEnd;
unsigned int byteCounter;
JArithmeticDecoder *arithDecoder;
JArithmeticDecoderStats *genericRegionStats;
JArithmeticDecoderStats *refinementRegionStats;
JArithmeticDecoderStats *iadhStats;
JArithmeticDecoderStats *iadwStats;
JArithmeticDecoderStats *iaexStats;
JArithmeticDecoderStats *iaaiStats;
JArithmeticDecoderStats *iadtStats;
JArithmeticDecoderStats *iaitStats;
JArithmeticDecoderStats *iafsStats;
JArithmeticDecoderStats *iadsStats;
JArithmeticDecoderStats *iardxStats;
JArithmeticDecoderStats *iardyStats;
JArithmeticDecoderStats *iardwStats;
JArithmeticDecoderStats *iardhStats;
JArithmeticDecoderStats *iariStats;
JArithmeticDecoderStats *iaidStats;
JBIG2HuffmanDecoder *huffDecoder;
JBIG2MMRDecoder *mmrDecoder;
};
#endif