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 + -
显示快捷键?