jbig2stream.cc
来自「source code: Covert TXT to PDF」· CC 代码 · 共 2,563 行 · 第 1/5 页
CC
2,563 行
void JBIG2Bitmap::clearToZero() { memset(data, 0, h * line);}void JBIG2Bitmap::clearToOne() { memset(data, 0xff, h * line);}void JBIG2Bitmap::duplicateRow(int yDest, int ySrc) { memcpy(data + yDest * line, data + ySrc * line, line);}void JBIG2Bitmap::combine(JBIG2Bitmap *bitmap, int x, int y, Guint combOp) { int x0, x1, y0, y1, xx, yy; Guchar *srcPtr, *destPtr; Guint src0, src1, src, dest, s1, s2, m1, m2, m3; GBool oneByte; if (y < 0) { y0 = -y; } else { y0 = 0; } if (y + bitmap->h > h) { y1 = h - y; } else { y1 = bitmap->h; } if (y0 >= y1) { return; } if (x >= 0) { x0 = x & ~7; } else { x0 = 0; } x1 = x + bitmap->w; if (x1 > w) { x1 = w; } if (x0 >= x1) { return; } s1 = x & 7; s2 = 8 - s1; m1 = 0xff >> (x1 & 7); m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7)); m3 = (0xff >> s1) & m2; oneByte = x0 == ((x1 - 1) & ~7); for (yy = y0; yy < y1; ++yy) { // one byte per line -- need to mask both left and right side if (oneByte) { if (x >= 0) { destPtr = data + (y + yy) * line + (x >> 3); srcPtr = bitmap->data + yy * bitmap->line; dest = *destPtr; src1 = *srcPtr; switch (combOp) { case 0: // or dest |= (src1 >> s1) & m2; break; case 1: // and dest &= ((0xff00 | src1) >> s1) | m1; break; case 2: // xor dest ^= (src1 >> s1) & m2; break; case 3: // xnor dest ^= ((src1 ^ 0xff) >> s1) & m2; break; case 4: // replace dest = (dest & ~m3) | ((src1 >> s1) & m3); break; } *destPtr = dest; } else { destPtr = data + (y + yy) * line; srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3); dest = *destPtr; src1 = *srcPtr; switch (combOp) { case 0: // or dest |= src1 & m2; break; case 1: // and dest &= src1 | m1; break; case 2: // xor dest ^= src1 & m2; break; case 3: // xnor dest ^= (src1 ^ 0xff) & m2; break; case 4: // replace dest = (src1 & m2) | (dest & m1); break; } *destPtr = dest; } // multiple bytes per line -- need to mask left side of left-most // byte and right side of right-most byte } else { // left-most byte if (x >= 0) { destPtr = data + (y + yy) * line + (x >> 3); srcPtr = bitmap->data + yy * bitmap->line; src1 = *srcPtr++; dest = *destPtr; switch (combOp) { case 0: // or dest |= src1 >> s1; break; case 1: // and dest &= (0xff00 | src1) >> s1; break; case 2: // xor dest ^= src1 >> s1; break; case 3: // xnor dest ^= (src1 ^ 0xff) >> s1; break; case 4: // replace dest = (dest & (0xff << s2)) | (src1 >> s1); break; } *destPtr++ = dest; xx = x0 + 8; } else { destPtr = data + (y + yy) * line; srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3); src1 = *srcPtr++; xx = x0; } // middle bytes for (; xx < x1 - 8; xx += 8) { dest = *destPtr; src0 = src1; src1 = *srcPtr++; src = (((src0 << 8) | src1) >> s1) & 0xff; switch (combOp) { case 0: // or dest |= src; break; case 1: // and dest &= src; break; case 2: // xor dest ^= src; break; case 3: // xnor dest ^= src ^ 0xff; break; case 4: // replace dest = src; break; } *destPtr++ = dest; } // right-most byte dest = *destPtr; src0 = src1; src1 = *srcPtr++; src = (((src0 << 8) | src1) >> s1) & 0xff; switch (combOp) { case 0: // or dest |= src & m2; break; case 1: // and dest &= src | m1; break; case 2: // xor dest ^= src & m2; break; case 3: // xnor dest ^= (src ^ 0xff) & m2; break; case 4: // replace dest = (src & m2) | (dest & m1); break; } *destPtr = dest; } }}//------------------------------------------------------------------------// JBIG2SymbolDict//------------------------------------------------------------------------class JBIG2SymbolDict: public JBIG2Segment {public: JBIG2SymbolDict(Guint segNumA, Guint sizeA); virtual ~JBIG2SymbolDict(); virtual JBIG2SegmentType getType() { return jbig2SegSymbolDict; } Guint getSize() { return size; } void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; } JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; } void setGenericRegionStats(JBIG2ArithmeticDecoderStats *stats) { genericRegionStats = stats; } void setRefinementRegionStats(JBIG2ArithmeticDecoderStats *stats) { refinementRegionStats = stats; } JBIG2ArithmeticDecoderStats *getGenericRegionStats() { return genericRegionStats; } JBIG2ArithmeticDecoderStats *getRefinementRegionStats() { return refinementRegionStats; }private: Guint size; JBIG2Bitmap **bitmaps; JBIG2ArithmeticDecoderStats *genericRegionStats; JBIG2ArithmeticDecoderStats *refinementRegionStats;};JBIG2SymbolDict::JBIG2SymbolDict(Guint segNumA, Guint sizeA): JBIG2Segment(segNumA){ size = sizeA; bitmaps = (JBIG2Bitmap **)gmalloc(size * sizeof(JBIG2Bitmap *)); genericRegionStats = NULL; refinementRegionStats = NULL;}JBIG2SymbolDict::~JBIG2SymbolDict() { Guint i; for (i = 0; i < size; ++i) { delete bitmaps[i]; } gfree(bitmaps); if (genericRegionStats) { delete genericRegionStats; } if (refinementRegionStats) { delete refinementRegionStats; }}//------------------------------------------------------------------------// JBIG2PatternDict//------------------------------------------------------------------------class JBIG2PatternDict: public JBIG2Segment {public: JBIG2PatternDict(Guint segNumA, Guint sizeA); virtual ~JBIG2PatternDict(); virtual JBIG2SegmentType getType() { return jbig2SegPatternDict; } Guint getSize() { return size; } void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; } JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; }private: Guint size; JBIG2Bitmap **bitmaps;};JBIG2PatternDict::JBIG2PatternDict(Guint segNumA, Guint sizeA): JBIG2Segment(segNumA){ size = sizeA; bitmaps = (JBIG2Bitmap **)gmalloc(size * sizeof(JBIG2Bitmap *));}JBIG2PatternDict::~JBIG2PatternDict() { Guint i; for (i = 0; i < size; ++i) { delete bitmaps[i]; } gfree(bitmaps);}//------------------------------------------------------------------------// JBIG2CodeTable//------------------------------------------------------------------------class JBIG2CodeTable: public JBIG2Segment {public: JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA); virtual ~JBIG2CodeTable(); virtual JBIG2SegmentType getType() { return jbig2SegCodeTable; } JBIG2HuffmanTable *getHuffTable() { return table; }private: JBIG2HuffmanTable *table;};JBIG2CodeTable::JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA): JBIG2Segment(segNumA){ table = tableA;}JBIG2CodeTable::~JBIG2CodeTable() { gfree(table);}//------------------------------------------------------------------------// JBIG2Stream//------------------------------------------------------------------------JBIG2Stream::JBIG2Stream(Stream *strA, Object *globalsStream): FilterStream(strA){ pageBitmap = NULL; arithDecoder = new JBIG2ArithmeticDecoder(); genericRegionStats = new JBIG2ArithmeticDecoderStats(1); refinementRegionStats = new JBIG2ArithmeticDecoderStats(1); iadhStats = new JBIG2ArithmeticDecoderStats(9); iadwStats = new JBIG2ArithmeticDecoderStats(9); iaexStats = new JBIG2ArithmeticDecoderStats(9); iaaiStats = new JBIG2ArithmeticDecoderStats(9); iadtStats = new JBIG2ArithmeticDecoderStats(9); iaitStats = new JBIG2ArithmeticDecoderStats(9); iafsStats = new JBIG2ArithmeticDecoderStats(9); iadsStats = new JBIG2ArithmeticDecoderStats(9); iardxStats = new JBIG2ArithmeticDecoderStats(9); iardyStats = new JBIG2ArithmeticDecoderStats(9); iardwStats = new JBIG2ArithmeticDecoderStats(9); iardhStats = new JBIG2ArithmeticDecoderStats(9); iariStats = new JBIG2ArithmeticDecoderStats(9); iaidStats = new JBIG2ArithmeticDecoderStats(1); huffDecoder = new JBIG2HuffmanDecoder(); mmrDecoder = new JBIG2MMRDecoder(); segments = new GList(); if (globalsStream->isStream()) { curStr = globalsStream->getStream(); curStr->reset(); arithDecoder->setStream(curStr); huffDecoder->setStream(curStr); mmrDecoder->setStream(curStr); readSegments(); } globalSegments = segments; segments = NULL; curStr = NULL; dataPtr = dataEnd = NULL;}JBIG2Stream::~JBIG2Stream() { delete arithDecoder; delete genericRegionStats; delete refinementRegionStats; delete iadhStats; delete iadwStats; delete iaexStats; delete iaaiStats; delete iadtStats; delete iaitStats; delete iafsStats; delete iadsStats; delete iardxStats; delete iardyStats; delete iardwStats; delete iardhStats; delete iariStats; delete iaidStats; delete huffDecoder; delete mmrDecoder; if (pageBitmap) { delete pageBitmap; } if (segments) { deleteGList(segments, JBIG2Segment); } if (globalSegments) { deleteGList(globalSegments, JBIG2Segment); } delete str;}void JBIG2Stream::reset() { if (pageBitmap) { delete pageBitmap; pageBitmap = NULL; } if (segments) { deleteGList(segments, JBIG2Segment); } segments = new GList(); curStr = str; curStr->reset(); arithDecoder->setStream(curStr); huffDecoder->setStream(curStr); mmrDecoder->setStream(curStr); readSegments(); if (pageBitmap) { dataPtr = pageBitmap->getDataPtr(); dataEnd = dataPtr + pageBitmap->getDataSize(); } else { dataPtr = NULL; }}int JBIG2Stream::getChar() { if (dataPtr && dataPtr < dataEnd) { return (*dataPtr++ ^ 0xff) & 0xff; } return EOF;}int JBIG2Stream::lookChar() { if (dataPtr && dataPtr < dataEnd) { return (*dataPtr ^ 0xff) & 0xff; } return EOF;}GString *JBIG2Stream::getPSFilter(char *indent) { return NULL;}GBool JBIG2Stream::isBinary(GBool last) { return str->isBinary(gTrue);}void JBIG2Stream::readSegments() { Guint segNum, segFlags, segType, page, segLength; Guint refFlags, nRefSegs; Guint *refSegs; int c1, c2, c3; Guint i; while (readULong(&segNum)) { // segment header flags if (!readUByte(&segFlags)) { goto eofError1; } segType = segFlags & 0x3f; // referred-to segment count and retention flags if (!readUByte(&refFlags)) { goto eofError1; } nRefSegs = refFlags >> 5; if (nRefSegs == 7) { if ((c1 = curStr->getChar()) == EOF || (c2 = curStr->getChar()) == EOF || (c3 = curStr->getChar()) == EOF) { goto eofError1; } refFlags = (refFlags << 24) | (c1 << 16) | (c2 << 8) | c3; nRefSegs = refFlags & 0x1fffffff; for (i = 0; i < (nRefSegs + 9) >> 3; ++i) { c1 = curStr->getChar(); } } // referred-to segment numbers refSegs = (Guint *)gmalloc(nRefSegs * sizeof(Guint)); if (segNum <= 256) { for (i = 0; i < nRefSegs; ++i) { if (!readUByte(&refSegs[i])) { goto eofError2; } } } else if (segNum <= 65536) { for (i = 0; i < nRefSegs; ++i) { if (!readUWord(&refSegs[i])) { goto eofError2; } } } else { for (i = 0; i < nRefSegs; ++i) { if (!readULong(&refSegs[i])) { goto eofError2; } } } // segment page association if (segFlags & 0x40) { if (!readULong(&page)) { goto eofError2; } } else { if (!readUByte(&page)) { goto eofError2; } } // segment data length if (!readULong(&segLength)) { goto eofError2; } // read the segment data switch (segType) { case 0: readSymbolDictSeg(segNum, segLength, refSegs, nRefSegs); break; case 4:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?