⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jbig2stream.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 5 页
字号:
  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 **)gmallocn(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 *globalsStreamA):  FilterStream(strA){  pageBitmap = NULL;  arithDecoder = new JArithmeticDecoder();  genericRegionStats = new JArithmeticDecoderStats(1 << 1);  refinementRegionStats = new JArithmeticDecoderStats(1 << 1);  iadhStats = new JArithmeticDecoderStats(1 << 9);  iadwStats = new JArithmeticDecoderStats(1 << 9);  iaexStats = new JArithmeticDecoderStats(1 << 9);  iaaiStats = new JArithmeticDecoderStats(1 << 9);  iadtStats = new JArithmeticDecoderStats(1 << 9);  iaitStats = new JArithmeticDecoderStats(1 << 9);  iafsStats = new JArithmeticDecoderStats(1 << 9);  iadsStats = new JArithmeticDecoderStats(1 << 9);  iardxStats = new JArithmeticDecoderStats(1 << 9);  iardyStats = new JArithmeticDecoderStats(1 << 9);  iardwStats = new JArithmeticDecoderStats(1 << 9);  iardhStats = new JArithmeticDecoderStats(1 << 9);  iariStats = new JArithmeticDecoderStats(1 << 9);  iaidStats = new JArithmeticDecoderStats(1 << 1);  huffDecoder = new JBIG2HuffmanDecoder();  mmrDecoder = new JBIG2MMRDecoder();  globalsStreamA->copy(&globalsStream);  segments = globalSegments = NULL;  curStr = NULL;  dataPtr = dataEnd = NULL;}JBIG2Stream::~JBIG2Stream() {  close();  globalsStream.free();  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;  delete str;}void JBIG2Stream::reset() {  // read the globals stream  globalSegments = new GList();  if (globalsStream.isStream()) {    segments = globalSegments;    curStr = globalsStream.getStream();    curStr->reset();    arithDecoder->setStream(curStr);    huffDecoder->setStream(curStr);    mmrDecoder->setStream(curStr);    readSegments();    curStr->close();  }  // read the main stream  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 = dataEnd = NULL;  }}void JBIG2Stream::close() {  if (pageBitmap) {    delete pageBitmap;    pageBitmap = NULL;  }  if (segments) {    deleteGList(segments, JBIG2Segment);    segments = NULL;  }  if (globalSegments) {    deleteGList(globalSegments, JBIG2Segment);    globalSegments = NULL;  }  dataPtr = dataEnd = NULL;  FilterStream::close();}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(int psLevel, 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 *)gmallocn(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:      if (!readSymbolDictSeg(segNum, segLength, refSegs, nRefSegs)) {	goto syntaxError;      }      break;    case 4:      readTextRegionSeg(segNum, gFalse, gFalse, segLength, refSegs, nRefSegs);      break;    case 6:      readTextRegionSeg(segNum, gTrue, gFalse, segLength, refSegs, nRefSegs);      break;    case 7:      readTextRegionSeg(segNum, gTrue, gTrue, segLength, refSegs, nRefSegs);      break;    case 16:      readPatternDictSeg(segNum, segLength);      break;    case 20:      readHalftoneRegionSeg(segNum, gFalse, gFalse, segLength,			    refSegs, nRefSegs);      break;    case 22:      readHalftoneRegionSeg(segNum, gTrue, gFalse, segLength,			    refSegs, nRefSegs);      break;    case 23:      readHalftoneRegionSeg(segNum, gTrue, gTrue, segLength,			    refSegs, nRefSegs);      break;    case 36:      readGenericRegionSeg(segNum, gFalse, gFalse, segLength);      break;    case 38:      readGenericRegionSeg(segNum, gTrue, gFalse, segLength);      break;    case 39:      readGenericRegionSeg(segNum, gTrue, gTrue, segLength);      break;    case 40:      readGenericRefinementRegionSeg(segNum, gFalse, gFalse, segLength,				     refSegs, nRefSegs);      break;    case 42:      readGenericRefinementRegionSeg(segNum, gTrue, gFalse, segLength,				     refSegs, nRefSegs);      break;    case 43:      readGenericRefinementRegionSeg(segNum, gTrue, gTrue, segLength,				     refSegs, nRefSegs);      break;    case 48:      readPageInfoSeg(segLength);      break;    case 50:      readEndOfStripeSeg(segLength);      break;    case 52:      readProfilesSeg(segLength);      break;    case 53:      readCodeTableSeg(segNum, segLength);      break;    case 62:      readExtensionSeg(segLength);      break;    default:      error(getPos(), "Unknown segment type in JBIG2 stream");      for (i = 0; i < segLength; ++i) {	if ((c1 = curStr->getChar()) == EOF) {	  goto eofError2;	}      }      break;    }    gfree(refSegs);  }  return; syntaxError:  gfree(refSegs);  return; eofError2:  gfree(refSegs); eofError1:  error(getPos(), "Unexpected EOF in JBIG2 stream");}GBool JBIG2Stream::readSymbolDictSeg(Guint segNum, Guint length,				     Guint *refSegs, Guint nRefSegs) {  JBIG2SymbolDict *symbolDict;  JBIG2HuffmanTable *huffDHTable, *huffDWTable;  JBIG2HuffmanTable *huffBMSizeTable, *huffAggInstTable;  JBIG2Segment *seg;  GList *codeTables;  JBIG2SymbolDict *inputSymbolDict;  Guint flags, sdTemplate, sdrTemplate, huff, refAgg;  Guint huffDH, huffDW, huffBMSize, huffAggInst;  Guint contextUsed, contextRetained;  int sdATX[4], sdATY[4], sdrATX[2], sdrATY[2];  Guint numExSyms, numNewSyms, numInputSyms, symCodeLen;  JBIG2Bitmap **bitmaps;  JBIG2Bitmap *collBitmap, *refBitmap;  Guint *symWidths;  Guint symHeight, symWidth, totalWidth, x, symID;  int dh, dw, refAggNum, refDX, refDY, bmSize;  GBool ex;  int run, cnt;  Guint i, j, k;  Guchar *p;  // symbol dictionary flags  if (!readUWord(&flags)) {    goto eofError;  }  sdTemplate = (flags >> 10) & 3;  sdrTemplate = (flags >> 12) & 1;  huff = flags & 1;  refAgg = (flags >> 1) & 1;  huffDH = (flags >> 2) & 3;  huffDW = (flags >> 4) & 3;  huffBMSize = (flags >> 6) & 1;  huffAggInst = (flags >> 7) & 1;  contextUsed = (flags >> 8) & 1;  contextRetained = (flags >> 9) & 1;  // symbol dictionary AT flags  if (!huff) {    if (sdTemplate == 0) {      if (!readByte(&sdATX[0]) ||	  !readByte(&sdATY[0]) ||	  !readByte(&sdATX[1]) ||	  !readByte(&sdATY[1]) ||	  !readByte(&sdATX[2]) ||	  !readByte(&sdATY[2]) ||	  !readByte(&sdATX[3]) ||	  !readByte(&sdATY[3])) {	goto eofError;      }    } else {      if (!readByte(&sdATX[0]) ||	  !readByte(&sdATY[0])) {	goto eofError;      }    }  }  // symbol dictionary refinement AT flags  if (refAgg && !sdrTemplate) {    if (!readByte(&sdrATX[0]) ||	!readByte(&sdrATY[0]) ||	!readByte(&sdrATX[1]) ||	!readByte(&sdrATY[1])) {      goto eofError;    }  }  // SDNUMEXSYMS and SDNUMNEWSYMS  if (!readULong(&numExSyms) || !readULong(&numNewSyms)) {    goto eofError;  }  // get referenced segments: input symbol dictionaries and code tables  codeTables = new GList();  numInputSyms = 0;  for (i = 0; i < nRefSegs; ++i) {    seg = findSegment(refSegs[i]);    if (seg->getType() == jbig2SegSymbolDict) {      numInputSyms += ((JBIG2SymbolDict *)seg)->getSize();    } else if (seg->getType() == jbig2SegCodeTable) {      codeTables->append(seg);    }  }  // compute symbol code length  symCodeLen = 0;  i = 1;  while (i < numInputSyms + numNewSyms) {    ++symCodeLen;    i <<= 1;  }  // get the input symbol bitmaps  bitmaps = (JBIG2Bitmap **)gmallocn(numInputSyms + numNewSyms,				     sizeof(JBIG2Bitmap *));  for (i = 0; i < numInputSyms + numNewSyms; ++i) {    bitmaps[i] = NULL;  }  k = 0;  inputSymbolDict = NULL;  for (i = 0; i < nRefSegs; ++i) {    seg = findSegment(refSegs[i]);    if (seg->getType() == jbig2SegSymbolDict) {      inputSymbolDict = (JBIG2SymbolDict *)seg;      for (j = 0; j < inputSymbolDict->getSize(); ++j) {	bitmaps[k++] = inputSymbolDict->getBitmap(j);      }    }  }  // get the Huffman tables  huffDHTable = huffDWTable = NULL; // make gcc happy  huffBMSizeTable = huffAggInstTable = NULL; // make gcc happy  i = 0;  if (huff) {    if (huffDH == 0) {      huffDHTable = huffTableD;    } else if (huffDH == 1) {      huffDHTable = huffTableE;    } else {      huffDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffDW == 0) {      huffDWTable = huffTableB;    } else if (huffDW == 1) {      huffDWTable = huffTableC;    } else {      huffDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffBMSize == 0) {      huffBMSizeTable = huffTableA;    } else {      huffBMSizeTable =	  ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffAggInst == 0) {      huffAggInstTable = huffTableA;    } else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -