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

📄 stream.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 5 页
字号:
    for (n = 10; n <= 13; ++n) {      code = lookBits(n);      if (n < 13) {	code <<= 13 - n;      }      p = &blackTab1[code];      if (p->bits == n) {	eatBits(n);	return p->n;      }    }  }  error(getPos(), "Bad black code (%04x) in CCITTFax stream", code);  // eat a bit and return a positive number so that the caller doesn't  // go into an infinite loop  eatBits(1);  return 1;}short CCITTFaxStream::lookBits(int n) {  int c;  while (inputBits < n) {    if ((c = str->getChar()) == EOF) {      if (inputBits == 0) {	return EOF;      }      // near the end of the stream, the caller may ask for more bits      // than are available, but there may still be a valid code in      // however many bits are available -- we need to return correct      // data in this case      return (inputBuf << (n - inputBits)) & (0xffff >> (16 - n));    }    inputBuf = (inputBuf << 8) + c;    inputBits += 8;  }  return (inputBuf >> (inputBits - n)) & (0xffff >> (16 - n));}GString *CCITTFaxStream::getPSFilter(int psLevel, char *indent) {  GString *s;  char s1[50];  if (psLevel < 2) {    return NULL;  }  if (!(s = str->getPSFilter(psLevel, indent))) {    return NULL;  }  s->append(indent)->append("<< ");  if (encoding != 0) {    sprintf(s1, "/K %d ", encoding);    s->append(s1);  }  if (endOfLine) {    s->append("/EndOfLine true ");  }  if (byteAlign) {    s->append("/EncodedByteAlign true ");  }  sprintf(s1, "/Columns %d ", columns);  s->append(s1);  if (rows != 0) {    sprintf(s1, "/Rows %d ", rows);    s->append(s1);  }  if (!endOfBlock) {    s->append("/EndOfBlock false ");  }  if (black) {    s->append("/BlackIs1 true ");  }  s->append(">> /CCITTFaxDecode filter\n");  return s;}GBool CCITTFaxStream::isBinary(GBool last) {  return str->isBinary(gTrue);}//------------------------------------------------------------------------// DCTStream//------------------------------------------------------------------------// IDCT constants (20.12 fixed point format)#define dctCos1    4017		// cos(pi/16)#define dctSin1     799		// sin(pi/16)#define dctCos3    3406		// cos(3*pi/16)#define dctSin3    2276		// sin(3*pi/16)#define dctCos6    1567		// cos(6*pi/16)#define dctSin6    3784		// sin(6*pi/16)#define dctSqrt2   5793		// sqrt(2)#define dctSqrt1d2 2896		// sqrt(2) / 2// color conversion parameters (16.16 fixed point format)#define dctCrToR   91881	//  1.4020#define dctCbToG  -22553	// -0.3441363#define dctCrToG  -46802	// -0.71413636#define dctCbToB  116130	//  1.772// clip [-256,511] --> [0,255]#define dctClipOffset 256static Guchar dctClip[768];static int dctClipInit = 0;// zig zag decode mapstatic int dctZigZag[64] = {   0,   1,  8,  16,  9,  2,   3, 10, 17, 24,  32, 25, 18, 11, 4,   5, 12, 19, 26, 33, 40,  48, 41, 34, 27, 20, 13,  6,   7, 14, 21, 28, 35, 42, 49, 56,  57, 50, 43, 36, 29, 22, 15,  23, 30, 37, 44, 51, 58,  59, 52, 45, 38, 31,  39, 46, 53, 60,  61, 54, 47,  55, 62,  63};DCTStream::DCTStream(Stream *strA, GBool colorXformA):    FilterStream(strA) {  int i, j;  colorXform = colorXformA;  progressive = interleaved = gFalse;  width = height = 0;  mcuWidth = mcuHeight = 0;  numComps = 0;  comp = 0;  x = y = dy = 0;  for (i = 0; i < 4; ++i) {    for (j = 0; j < 32; ++j) {      rowBuf[i][j] = NULL;    }    frameBuf[i] = NULL;  }  if (!dctClipInit) {    for (i = -256; i < 0; ++i)      dctClip[dctClipOffset + i] = 0;    for (i = 0; i < 256; ++i)      dctClip[dctClipOffset + i] = i;    for (i = 256; i < 512; ++i)      dctClip[dctClipOffset + i] = 255;    dctClipInit = 1;  }}DCTStream::~DCTStream() {  close();  delete str;}void DCTStream::reset() {  int i, j;  str->reset();  progressive = interleaved = gFalse;  width = height = 0;  numComps = 0;  numQuantTables = 0;  numDCHuffTables = 0;  numACHuffTables = 0;  gotJFIFMarker = gFalse;  gotAdobeMarker = gFalse;  restartInterval = 0;  if (!readHeader()) {    y = height;    return;  }  // compute MCU size  if (numComps == 1) {    compInfo[0].hSample = compInfo[0].vSample = 1;  }  mcuWidth = compInfo[0].hSample;  mcuHeight = compInfo[0].vSample;  for (i = 1; i < numComps; ++i) {    if (compInfo[i].hSample > mcuWidth) {      mcuWidth = compInfo[i].hSample;    }    if (compInfo[i].vSample > mcuHeight) {      mcuHeight = compInfo[i].vSample;    }  }  mcuWidth *= 8;  mcuHeight *= 8;  // figure out color transform  if (colorXform == -1) {    if (numComps == 3) {      if (gotJFIFMarker) {	colorXform = 1;      } else if (compInfo[0].id == 82 && compInfo[1].id == 71 &&		 compInfo[2].id == 66) { // ASCII "RGB"	colorXform = 0;      } else {	colorXform = 1;      }    } else {      colorXform = 0;    }  }  if (progressive || !interleaved) {    // allocate a buffer for the whole image    bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth;    bufHeight = ((height + mcuHeight - 1) / mcuHeight) * mcuHeight;    for (i = 0; i < numComps; ++i) {      frameBuf[i] = (int *)gmallocn(bufWidth * bufHeight, sizeof(int));      memset(frameBuf[i], 0, bufWidth * bufHeight * sizeof(int));    }    // read the image data    do {      restartMarker = 0xd0;      restart();      readScan();    } while (readHeader());    // decode    decodeImage();    // initialize counters    comp = 0;    x = 0;    y = 0;  } else {    // allocate a buffer for one row of MCUs    bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth;    for (i = 0; i < numComps; ++i) {      for (j = 0; j < mcuHeight; ++j) {	rowBuf[i][j] = (Guchar *)gmallocn(bufWidth, sizeof(Guchar));      }    }    // initialize counters    comp = 0;    x = 0;    y = 0;    dy = mcuHeight;    restartMarker = 0xd0;    restart();  }}void DCTStream::close() {  int i, j;  for (i = 0; i < 4; ++i) {    for (j = 0; j < 32; ++j) {      gfree(rowBuf[i][j]);      rowBuf[i][j] = NULL;    }    gfree(frameBuf[i]);    frameBuf[i] = NULL;  }  FilterStream::close();}int DCTStream::getChar() {  int c;  if (y >= height) {    return EOF;  }  if (progressive || !interleaved) {    c = frameBuf[comp][y * bufWidth + x];    if (++comp == numComps) {      comp = 0;      if (++x == width) {	x = 0;	++y;      }    }  } else {    if (dy >= mcuHeight) {      if (!readMCURow()) {	y = height;	return EOF;      }      comp = 0;      x = 0;      dy = 0;    }    c = rowBuf[comp][dy][x];    if (++comp == numComps) {      comp = 0;      if (++x == width) {	x = 0;	++y;	++dy;	if (y == height) {	  readTrailer();	}      }    }  }  return c;}int DCTStream::lookChar() {  if (y >= height) {    return EOF;  }  if (progressive || !interleaved) {    return frameBuf[comp][y * bufWidth + x];  } else {    if (dy >= mcuHeight) {      if (!readMCURow()) {	y = height;	return EOF;      }      comp = 0;      x = 0;      dy = 0;    }    return rowBuf[comp][dy][x];  }}void DCTStream::restart() {  int i;  inputBits = 0;  restartCtr = restartInterval;  for (i = 0; i < numComps; ++i) {    compInfo[i].prevDC = 0;  }  eobRun = 0;}// Read one row of MCUs from a sequential JPEG stream.GBool DCTStream::readMCURow() {  int data1[64];  Guchar data2[64];  Guchar *p1, *p2;  int pY, pCb, pCr, pR, pG, pB;  int h, v, horiz, vert, hSub, vSub;  int x1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i;  int c;  for (x1 = 0; x1 < width; x1 += mcuWidth) {    // deal with restart marker    if (restartInterval > 0 && restartCtr == 0) {      c = readMarker();      if (c != restartMarker) {	error(getPos(), "Bad DCT data: incorrect restart marker");	return gFalse;      }      if (++restartMarker == 0xd8)	restartMarker = 0xd0;      restart();    }    // read one MCU    for (cc = 0; cc < numComps; ++cc) {      h = compInfo[cc].hSample;      v = compInfo[cc].vSample;      horiz = mcuWidth / h;      vert = mcuHeight / v;      hSub = horiz / 8;      vSub = vert / 8;      for (y2 = 0; y2 < mcuHeight; y2 += vert) {	for (x2 = 0; x2 < mcuWidth; x2 += horiz) {	  if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]],			    &acHuffTables[scanInfo.acHuffTable[cc]],			    &compInfo[cc].prevDC,			    data1)) {	    return gFalse;	  }	  transformDataUnit(quantTables[compInfo[cc].quantTable],			    data1, data2);	  if (hSub == 1 && vSub == 1) {	    for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {	      p1 = &rowBuf[cc][y2+y3][x1+x2];	      p1[0] = data2[i];	      p1[1] = data2[i+1];	      p1[2] = data2[i+2];	      p1[3] = data2[i+3];	      p1[4] = data2[i+4];	      p1[5] = data2[i+5];	      p1[6] = data2[i+6];	      p1[7] = data2[i+7];	    }	  } else if (hSub == 2 && vSub == 2) {	    for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) {	      p1 = &rowBuf[cc][y2+y3][x1+x2];	      p2 = &rowBuf[cc][y2+y3+1][x1+x2];	      p1[0] = p1[1] = p2[0] = p2[1] = data2[i];	      p1[2] = p1[3] = p2[2] = p2[3] = data2[i+1];	      p1[4] = p1[5] = p2[4] = p2[5] = data2[i+2];	      p1[6] = p1[7] = p2[6] = p2[7] = data2[i+3];	      p1[8] = p1[9] = p2[8] = p2[9] = data2[i+4];	      p1[10] = p1[11] = p2[10] = p2[11] = data2[i+5];	      p1[12] = p1[13] = p2[12] = p2[13] = data2[i+6];	      p1[14] = p1[15] = p2[14] = p2[15] = data2[i+7];	    }	  } else {	    i = 0;	    for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) {	      for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) {		for (y5 = 0; y5 < vSub; ++y5)		  for (x5 = 0; x5 < hSub; ++x5)		    rowBuf[cc][y2+y4+y5][x1+x2+x4+x5] = data2[i];		++i;	      }	    }	  }	}      }    }    --restartCtr;    // color space conversion    if (colorXform) {      // convert YCbCr to RGB      if (numComps == 3) {	for (y2 = 0; y2 < mcuHeight; ++y2) {	  for (x2 = 0; x2 < mcuWidth; ++x2) {	    pY = rowBuf[0][y2][x1+x2];	    pCb = rowBuf[1][y2][x1+x2] - 128;	    pCr = rowBuf[2][y2][x1+x2] - 128;	    pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;	    rowBuf[0][y2][x1+x2] = dctClip[dctClipOffset + pR];	    pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16;	    rowBuf[1][y2][x1+x2] = dctClip[dctClipOffset + pG];	    pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;	    rowBuf[2][y2][x1+x2] = dctClip[dctClipOffset + pB];	  }	}      // convert YCbCrK to CMYK (K is passed through unchanged)      } else if (numComps == 4) {	for (y2 = 0; y2 < mcuHeight; ++y2) {	  for (x2 = 0; x2 < mcuWidth; ++x2) {	    pY = rowBuf[0][y2][x1+x2];	    pCb = rowBuf[1][y2][x1+x2] - 128;	    pCr = rowBuf[2][y2][x1+x2] - 128;	    pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;	    rowBuf[0][y2][x1+x2] = 255 - dctClip[dctClipOffset + pR];	    pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16;	    rowBuf[1][y2][x1+x2] = 255 - dctClip[dctClipOffset + pG];	    pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;	    rowBuf[2][y2][x1+x2] = 255 - dctClip[dctClipOffset + pB];	  }	}      }    }  }  return gTrue;}// Read one scan from a progressive or non-interleaved JPEG stream.void DCTStream::readScan() {  int data[64];  int x1, y1, dx1, dy1, x2, y2, y3, cc, i;  int h, v, horiz, vert, vSub;  int *p1;  int c;  if (scanInfo.numComps == 1) {    for (cc = 0; cc < numComps; ++cc) {      if (scanInfo.comp[cc]) {	break;      }    }    dx1 = mcuWidth / compInfo[cc].hSample;    dy1 = mcuHeight / compInfo[cc].vSample;  } else {    dx1 = mcuWidth;    dy1 = mcuHeight;  }  for (y1 = 0; y1 < height; y1 += dy1) {    for (x1 = 0; x1 < width; x1 += dx1) {      // deal with restart marker      if (restartInterval > 0 && restartCtr == 0) {	c = readMarker();	if (c != restartMarker) {	  error(getPos(), "Bad DCT data: incorrect restart marker");	  return;	}	if (++restartMarker == 0xd8) {	  restartMarker = 0xd0;	}	restart();      }      // read one MCU      for (cc = 0; cc < numComps; ++cc) {	if (!scanInfo.comp[cc]) {	  continue;	}	h = compInfo[cc].hSample;	v = compInfo[cc].vSample;	horiz = mcuWidth / h;	vert = mcuHeight / v;	vSub = vert / 8;	for (y2 = 0; y2 < dy1; y2 += vert) {	  for (x2 = 0; x2 < dx1; x2 += horiz) {	    // pull out the current values	    p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];	    for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {	      data[i] = p1[0];	      data[i+1] = p1[1];	      data[i+2] = p1[2];	      data[i+3] = p1[3];	      data[i+4] = p1[4];	      data[i+5] = p1[5];	      data[i+6] = p1[6];	      data[i+7] = p1[7];	      p1 += bufWidth * vSub;	    }	    // read one data unit	    if (progressive) {	      if (!readProgressiveDataUnit(		       &dcHuffTables[scanInfo.dcHuffTable[cc]],		       &acHuffTables[scanInfo.acHuffTable[cc]],		       &compInfo[cc].prevDC,		       data)) {		return;	      }	    } else {	      if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]],				&acHuffTables[scanInfo.acHuffTable[cc]],				&compInfo[cc].prevDC,				data)) {		return;	      }	    }	    // add the data unit into frameBuf	    p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];	    for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {	      p1[0] = data[i];	      p1[1] = data[i+1];	      p1[2] = data[i+2];	      p1[3] = data[i+3];	      p1[4] = data[i+4];	      p1[5] = data[i+5];	      p1[6] = data[i+6];	      p1[7] = data[i+7];	      p1 += bufWidth * vSub;	    }	  }	}      }      --restartCtr;    }  }}// Read one data unit from a sequential JPEG stream.GBool DCTStream::readDataUnit(DCTHuffTable *dcHuffTable,			      DCTHuffTable *acHuffTable,			      int *prevDC, int data[64]) {  int run, size, amp;  int c;  int i, j;  if ((size = readHuffSym(dcHuffTable)) == 9999) {    return gFalse;  }  if (size > 0) {    if ((amp = readAmp(size)) == 9999) {      return gFalse;    }

⌨️ 快捷键说明

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