jbig2stream.cc

来自「source code: Covert TXT to PDF」· CC 代码 · 共 2,563 行 · 第 1/5 页

CC
2,563
字号
  // get the Huffman tables  huffFSTable = huffDSTable = huffDTTable = NULL; // make gcc happy  huffRDWTable = huffRDHTable = NULL; // make gcc happy  huffRDXTable = huffRDYTable = huffRSizeTable = NULL; // make gcc happy  i = 0;  if (huff) {    if (huffFS == 0) {      huffFSTable = huffTableF;    } else if (huffFS == 1) {      huffFSTable = huffTableG;    } else {      huffFSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffDS == 0) {      huffDSTable = huffTableH;    } else if (huffDS == 1) {      huffDSTable = huffTableI;    } else if (huffDS == 2) {      huffDSTable = huffTableJ;    } else {      huffDSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffDT == 0) {      huffDTTable = huffTableK;    } else if (huffDT == 1) {      huffDTTable = huffTableL;    } else if (huffDT == 2) {      huffDTTable = huffTableM;    } else {      huffDTTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffRDW == 0) {      huffRDWTable = huffTableN;    } else if (huffRDW == 1) {      huffRDWTable = huffTableO;    } else {      huffRDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffRDH == 0) {      huffRDHTable = huffTableN;    } else if (huffRDH == 1) {      huffRDHTable = huffTableO;    } else {      huffRDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffRDX == 0) {      huffRDXTable = huffTableN;    } else if (huffRDX == 1) {      huffRDXTable = huffTableO;    } else {      huffRDXTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffRDY == 0) {      huffRDYTable = huffTableN;    } else if (huffRDY == 1) {      huffRDYTable = huffTableO;    } else {      huffRDYTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }    if (huffRSize == 0) {      huffRSizeTable = huffTableA;    } else {      huffRSizeTable =	  ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();    }  }  delete codeTables;  // symbol ID Huffman decoding table  if (huff) {    huffDecoder->reset();    for (i = 0; i < 32; ++i) {      runLengthTab[i].val = i;      runLengthTab[i].prefixLen = huffDecoder->readBits(4);      runLengthTab[i].rangeLen = 0;    }    runLengthTab[32].val = 0x103;    runLengthTab[32].prefixLen = huffDecoder->readBits(4);    runLengthTab[32].rangeLen = 2;    runLengthTab[33].val = 0x203;    runLengthTab[33].prefixLen = huffDecoder->readBits(4);    runLengthTab[33].rangeLen = 3;    runLengthTab[34].val = 0x20b;    runLengthTab[34].prefixLen = huffDecoder->readBits(4);    runLengthTab[34].rangeLen = 7;    runLengthTab[35].rangeLen = jbig2HuffmanEOT;    huffDecoder->buildTable(runLengthTab, 35);    symCodeTab = (JBIG2HuffmanTable *)gmalloc((numSyms + 1) *					      sizeof(JBIG2HuffmanTable));    for (i = 0; i < numSyms; ++i) {      symCodeTab[i].val = i;      symCodeTab[i].rangeLen = 0;    }    i = 0;    while (i < numSyms) {      huffDecoder->decodeInt(&j, runLengthTab);      if (j > 0x200) {	for (j -= 0x200; j && i < numSyms; --j) {	  symCodeTab[i++].prefixLen = 0;	}      } else if (j > 0x100) {	for (j -= 0x100; j && i < numSyms; --j) {	  symCodeTab[i].prefixLen = symCodeTab[i-1].prefixLen;	  ++i;	}      } else {	symCodeTab[i++].prefixLen = j;      }    }    symCodeTab[numSyms].rangeLen = jbig2HuffmanEOT;    huffDecoder->buildTable(symCodeTab, numSyms);    huffDecoder->reset();  // set up the arithmetic decoder  } else {    symCodeTab = NULL;    resetIntStats(symCodeLen);    if (refine) {      resetRefinementStats(templ, NULL);    }    arithDecoder->start();  }  bitmap = readTextRegion(huff, refine, w, h, numInstances,			  logStrips, numSyms, symCodeTab, symCodeLen, syms,			  defPixel, combOp, transposed, refCorner, sOffset,			  huffFSTable, huffDSTable, huffDTTable,			  huffRDWTable, huffRDHTable,			  huffRDXTable, huffRDYTable, huffRSizeTable,			  templ, atx, aty);  gfree(syms);  // combine the region bitmap into the page bitmap  if (imm) {    if (pageH == 0xffffffff && y + h > curPageH) {      pageBitmap->expand(y + h, pageDefPixel);    }    pageBitmap->combine(bitmap, x, y, extCombOp);    delete bitmap;  // store the region bitmap  } else {    bitmap->setSegNum(segNum);    segments->append(bitmap);  }  // clean up the Huffman decoder  if (huff) {    gfree(symCodeTab);  }  return; eofError:  error(getPos(), "Unexpected EOF in JBIG2 stream");}JBIG2Bitmap *JBIG2Stream::readTextRegion(GBool huff, GBool refine,					 int w, int h,					 Guint numInstances,					 Guint logStrips,					 int numSyms,					 JBIG2HuffmanTable *symCodeTab,					 Guint symCodeLen,					 JBIG2Bitmap **syms,					 Guint defPixel, Guint combOp,					 Guint transposed, Guint refCorner,					 Guint sOffset,					 JBIG2HuffmanTable *huffFSTable,					 JBIG2HuffmanTable *huffDSTable,					 JBIG2HuffmanTable *huffDTTable,					 JBIG2HuffmanTable *huffRDWTable,					 JBIG2HuffmanTable *huffRDHTable,					 JBIG2HuffmanTable *huffRDXTable,					 JBIG2HuffmanTable *huffRDYTable,					 JBIG2HuffmanTable *huffRSizeTable,					 Guint templ,					 int *atx, int *aty) {  JBIG2Bitmap *bitmap;  JBIG2Bitmap *symbolBitmap;  Guint strips;  int t, dt, tt, s, ds, sFirst, j;  int rdw, rdh, rdx, rdy, ri, refDX, refDY, bmSize;  Guint symID, inst, bw, bh;  strips = 1 << logStrips;  // allocate the bitmap  bitmap = new JBIG2Bitmap(0, w, h);  if (defPixel) {    bitmap->clearToOne();  } else {    bitmap->clearToZero();  }  // decode initial T value  if (huff) {    huffDecoder->decodeInt(&t, huffDTTable);  } else {    arithDecoder->decodeInt(&t, iadtStats);  }  t *= -strips;  inst = 0;  sFirst = 0;  while (inst < numInstances) {    // decode delta-T    if (huff) {      huffDecoder->decodeInt(&dt, huffDTTable);    } else {      arithDecoder->decodeInt(&dt, iadtStats);    }    t += dt * strips;    // first S value    if (huff) {      huffDecoder->decodeInt(&ds, huffFSTable);    } else {      arithDecoder->decodeInt(&ds, iafsStats);    }    sFirst += ds;    s = sFirst;    // read the instances    while (1) {      // T value      if (strips == 1) {	dt = 0;      } else if (huff) {	dt = huffDecoder->readBits(logStrips);      } else {	arithDecoder->decodeInt(&dt, iaitStats);      }      tt = t + dt;      // symbol ID      if (huff) {	if (symCodeTab) {	  huffDecoder->decodeInt(&j, symCodeTab);	  symID = (Guint)j;	} else {	  symID = huffDecoder->readBits(symCodeLen);	}      } else {	symID = arithDecoder->decodeIAID(symCodeLen, iaidStats);      }      // get the symbol bitmap      symbolBitmap = NULL;      if (refine) {	if (huff) {	  ri = (int)huffDecoder->readBit();	} else {	  arithDecoder->decodeInt(&ri, iariStats);	}      } else {	ri = 0;      }      if (ri) {	if (huff) {	  huffDecoder->decodeInt(&rdw, huffRDWTable);	  huffDecoder->decodeInt(&rdh, huffRDHTable);	  huffDecoder->decodeInt(&rdx, huffRDXTable);	  huffDecoder->decodeInt(&rdy, huffRDYTable);	  huffDecoder->decodeInt(&bmSize, huffRSizeTable);	  huffDecoder->reset();	  arithDecoder->start();	} else {	  arithDecoder->decodeInt(&rdw, iardwStats);	  arithDecoder->decodeInt(&rdh, iardhStats);	  arithDecoder->decodeInt(&rdx, iardxStats);	  arithDecoder->decodeInt(&rdy, iardyStats);	}	refDX = ((rdw >= 0) ? rdw : rdw - 1) / 2 + rdx;	refDY = ((rdh >= 0) ? rdh : rdh - 1) / 2 + rdy;	symbolBitmap =	  readGenericRefinementRegion(rdw + syms[symID]->getWidth(),				      rdh + syms[symID]->getHeight(),				      templ, gFalse, syms[symID],				      refDX, refDY, atx, aty);	//~ do we need to use the bmSize value here (in Huffman mode)?      } else {	symbolBitmap = syms[symID];      }      // combine the symbol bitmap into the region bitmap      //~ something is wrong here - refCorner shouldn't degenerate into      //~   two cases      bw = symbolBitmap->getWidth() - 1;      bh = symbolBitmap->getHeight() - 1;      if (transposed) {	switch (refCorner) {	case 0: // bottom left	  bitmap->combine(symbolBitmap, tt, s, combOp);	  break;	case 1: // top left	  bitmap->combine(symbolBitmap, tt, s, combOp);	  break;	case 2: // bottom right	  bitmap->combine(symbolBitmap, tt - bw, s, combOp);	  break;	case 3: // top right	  bitmap->combine(symbolBitmap, tt - bw, s, combOp);	  break;	}	s += bh;      } else {	switch (refCorner) {	case 0: // bottom left	  bitmap->combine(symbolBitmap, s, tt - bh, combOp);	  break;	case 1: // top left	  bitmap->combine(symbolBitmap, s, tt, combOp);	  break;	case 2: // bottom right	  bitmap->combine(symbolBitmap, s, tt - bh, combOp);	  break;	case 3: // top right	  bitmap->combine(symbolBitmap, s, tt, combOp);	  break;	}	s += bw;      }      if (ri) {	delete symbolBitmap;      }      // next instance      ++inst;      // next S value      if (huff) {	if (!huffDecoder->decodeInt(&ds, huffDSTable)) {	  break;	}      } else {	if (!arithDecoder->decodeInt(&ds, iadsStats)) {	  break;	}      }      s += sOffset + ds;    }  }  return bitmap;}void JBIG2Stream::readPatternDictSeg(Guint segNum, Guint length) {  JBIG2PatternDict *patternDict;  JBIG2Bitmap *bitmap;  Guint flags, patternW, patternH, grayMax, templ, mmr;  int atx[4], aty[4];  Guint i, x;  // halftone dictionary flags, pattern width and height, max gray value  if (!readUByte(&flags) ||      !readUByte(&patternW) ||      !readUByte(&patternH) ||      !readULong(&grayMax)) {    goto eofError;  }  templ = (flags >> 1) & 3;  mmr = flags & 1;  // set up the arithmetic decoder  if (!mmr) {    resetGenericStats(templ, NULL);    arithDecoder->start();  }  // read the bitmap  atx[0] = -patternW; aty[0] =  0;  atx[1] = -3;        aty[1] = -1;  atx[2] =  2;        aty[2] = -2;  atx[3] = -2;        aty[3] = -2;  bitmap = readGenericBitmap(mmr, (grayMax + 1) * patternW, patternH,			     templ, gFalse, gFalse, NULL,			     atx, aty, length - 7);  // create the pattern dict object  patternDict = new JBIG2PatternDict(segNum, grayMax + 1);  // split up the bitmap  x = 0;  for (i = 0; i <= grayMax; ++i) {    patternDict->setBitmap(i, bitmap->getSlice(x, 0, patternW, patternH));    x += patternW;  }  // free memory  delete bitmap;  // store the new pattern dict  segments->append(patternDict);  return; eofError:  error(getPos(), "Unexpected EOF in JBIG2 stream");}void JBIG2Stream::readHalftoneRegionSeg(Guint segNum, GBool imm,					GBool lossless, Guint length,					Guint *refSegs, Guint nRefSegs) {  JBIG2Bitmap *bitmap;  JBIG2Segment *seg;  JBIG2PatternDict *patternDict;  JBIG2Bitmap *skipBitmap;  Guint *grayImg;  JBIG2Bitmap *grayBitmap;  JBIG2Bitmap *patternBitmap;  Guint w, h, x, y, segInfoFlags, extCombOp;  Guint flags, mmr, templ, enableSkip, combOp;  Guint gridW, gridH, stepX, stepY, patW, patH;  int atx[4], aty[4];  int gridX, gridY, xx, yy, bit, j;  Guint bpp, m, n, i;  // region segment info field  if (!readULong(&w) || !readULong(&h) ||      !readULong(&x) || !readULong(&y) ||      !readUByte(&segInfoFlags)) {    goto eofError;  }  extCombOp = segInfoFlags & 7;  // rest of the halftone region header  if (!readUByte(&flags)) {    goto eofError;  }  mmr = flags & 1;  templ = (flags >> 1) & 3;  enableSkip = (flags >> 3) & 1;  combOp = (flags >> 4) & 7;  if (!readULong(&gridW) || !readULong(&gridH) ||      !readLong(&gridX) || !readLong(&gridY) ||      !readUWord(&stepX) || !readUWord(&stepY)) {    goto eofError;  }  // get pattern dictionary  if (nRefSegs != 1) {    error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment");    return;  }  seg = findSegment(refSegs[0]);  if (seg->getType() != jbig2SegPatternDict) {    error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment");    return;  }  patternDict = (JBIG2PatternDict *)seg;  bpp = 0;  i = 1;  while (i < patternDict->getSize()) {    ++bpp;    i <<= 1;  }  patW = patternDict->getBitmap(0)->getWidth();  patH = patternDict->getBitmap(0)->getHeight();  // set up the arithmetic decoder  if (!mmr) {    resetGenericStats(templ, NULL);    arithDecoder->start();  }  // allocate the bitmap  bitmap = new JBIG2Bitmap(segNum, w, h);  if (flags & 0x80) { // HDEFPIXEL    bitmap->clearToOne();  } else {    bitmap->clearToZero();  }  // compute the skip bitmap  skipBitmap = NULL;  if (enableSkip) {    skipBitmap = new JBIG2Bitmap(0, gridW, gridH);    skipBitmap->clearToZero();    for (m = 0; m < gridH; ++m) {      xx = gridX + m * stepY;      yy = gridY + m * stepX;      for (n = 0; n < gridW; ++n) {	if (((xx + (int)patW) >> 8) <= 0 || (xx >> 8) >= (int)w ||	    ((yy + (int)patH) >> 8) <= 0 || (yy >> 8) >= (int)h) {	  skipBitmap->setPixel(n, m);	}      }    }  }  // read the gray-scale image  grayImg = (Guint *)gmalloc(gridW * gridH * sizeof(Guint));  memset(grayImg, 0, gridW * gridH * sizeof(Guint));  atx[0] = templ <= 1 ? 3 : 2;  aty[0] = -1;  atx[1] = -3;                  aty[1] = -1;  atx[2] =  2;                  aty[2] = -2;  atx[3] = -2;                  aty[3] = -2;  for (j = bpp - 1; j >= 0; --j) {    grayBitmap = readGenericBitmap(mmr, gridW, gridH, templ, gFalse,				   enableSkip, skipBitmap, atx, aty, -1);    i = 0;    for (m = 0; m < gridH; ++m) {      for (n = 0; n < gridW; ++n) {	bit = grayBitmap->getPixel(n, m) ^ (grayImg[i] & 1);

⌨️ 快捷键说明

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