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

📄 splashoutputdev.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 5 页
字号:
				       (int)ceil(xMax) - (int)floor(xMin) + 3,				       (int)ceil(yMax) - (int)floor(yMin) + 3,				       validBBox,				       colorMode != splashModeMono1);    }  }  t3Font = t3FontCache[0];  // is the glyph in the cache?  i = (code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc;  for (j = 0; j < t3Font->cacheAssoc; ++j) {    if ((t3Font->cacheTags[i+j].mru & 0x8000) &&	t3Font->cacheTags[i+j].code == code) {      drawType3Glyph(t3Font, &t3Font->cacheTags[i+j],		     t3Font->cacheData + (i+j) * t3Font->glyphSize);      return gTrue;    }  }  // push a new Type 3 glyph record  t3gs = new T3GlyphStack();  t3gs->next = t3GlyphStack;  t3GlyphStack = t3gs;  t3GlyphStack->code = code;  t3GlyphStack->cache = t3Font;  t3GlyphStack->cacheTag = NULL;  t3GlyphStack->cacheData = NULL;  return gFalse;}void SplashOutputDev::endType3Char(GfxState *state) {  T3GlyphStack *t3gs;  double *ctm;  if (t3GlyphStack->cacheTag) {    memcpy(t3GlyphStack->cacheData, bitmap->getDataPtr(),	   t3GlyphStack->cache->glyphSize);    delete bitmap;    delete splash;    bitmap = t3GlyphStack->origBitmap;    splash = t3GlyphStack->origSplash;    ctm = state->getCTM();    state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3],		  t3GlyphStack->origCTM4, t3GlyphStack->origCTM5);    updateCTM(state, 0, 0, 0, 0, 0, 0);    drawType3Glyph(t3GlyphStack->cache,		   t3GlyphStack->cacheTag, t3GlyphStack->cacheData);  }  t3gs = t3GlyphStack;  t3GlyphStack = t3gs->next;  delete t3gs;}void SplashOutputDev::type3D0(GfxState *state, double wx, double wy) {}void SplashOutputDev::type3D1(GfxState *state, double wx, double wy,			      double llx, double lly, double urx, double ury) {  double *ctm;  T3FontCache *t3Font;  SplashColor color;  double xt, yt, xMin, xMax, yMin, yMax, x1, y1;  int i, j;  t3Font = t3GlyphStack->cache;  // check for a valid bbox  state->transform(0, 0, &xt, &yt);  state->transform(llx, lly, &x1, &y1);  xMin = xMax = x1;  yMin = yMax = y1;  state->transform(llx, ury, &x1, &y1);  if (x1 < xMin) {    xMin = x1;  } else if (x1 > xMax) {    xMax = x1;  }  if (y1 < yMin) {    yMin = y1;  } else if (y1 > yMax) {    yMax = y1;  }  state->transform(urx, lly, &x1, &y1);  if (x1 < xMin) {    xMin = x1;  } else if (x1 > xMax) {    xMax = x1;  }  if (y1 < yMin) {    yMin = y1;  } else if (y1 > yMax) {    yMax = y1;  }  state->transform(urx, ury, &x1, &y1);  if (x1 < xMin) {    xMin = x1;  } else if (x1 > xMax) {    xMax = x1;  }  if (y1 < yMin) {    yMin = y1;  } else if (y1 > yMax) {    yMax = y1;  }  if (xMin - xt < t3Font->glyphX ||      yMin - yt < t3Font->glyphY ||      xMax - xt > t3Font->glyphX + t3Font->glyphW ||      yMax - yt > t3Font->glyphY + t3Font->glyphH) {    if (t3Font->validBBox) {      error(-1, "Bad bounding box in Type 3 glyph");    }    return;  }  // allocate a cache entry  i = (t3GlyphStack->code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc;  for (j = 0; j < t3Font->cacheAssoc; ++j) {    if ((t3Font->cacheTags[i+j].mru & 0x7fff) == t3Font->cacheAssoc - 1) {      t3Font->cacheTags[i+j].mru = 0x8000;      t3Font->cacheTags[i+j].code = t3GlyphStack->code;      t3GlyphStack->cacheTag = &t3Font->cacheTags[i+j];      t3GlyphStack->cacheData = t3Font->cacheData + (i+j) * t3Font->glyphSize;    } else {      ++t3Font->cacheTags[i+j].mru;    }  }  // save state  t3GlyphStack->origBitmap = bitmap;  t3GlyphStack->origSplash = splash;  ctm = state->getCTM();  t3GlyphStack->origCTM4 = ctm[4];  t3GlyphStack->origCTM5 = ctm[5];  // create the temporary bitmap  if (colorMode == splashModeMono1) {    bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1,			      splashModeMono1, gFalse);    splash = new Splash(bitmap, gFalse,			t3GlyphStack->origSplash->getScreen());    color[0] = 0;    splash->clear(color);    color[0] = 1;  } else {    bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, 1,			      splashModeMono8, gFalse);    splash = new Splash(bitmap, vectorAntialias,			t3GlyphStack->origSplash->getScreen());    color[0] = 0x00;    splash->clear(color);    color[0] = 0xff;  }  splash->setFillPattern(new SplashSolidColor(color));  splash->setStrokePattern(new SplashSolidColor(color));  //~ this should copy other state from t3GlyphStack->origSplash?  state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3],		-t3Font->glyphX, -t3Font->glyphY);  updateCTM(state, 0, 0, 0, 0, 0, 0);}void SplashOutputDev::drawType3Glyph(T3FontCache *t3Font,				     T3FontCacheTag *tag, Guchar *data) {  SplashGlyphBitmap glyph;  glyph.x = -t3Font->glyphX;  glyph.y = -t3Font->glyphY;  glyph.w = t3Font->glyphW;  glyph.h = t3Font->glyphH;  glyph.aa = colorMode != splashModeMono1;  glyph.data = data;  glyph.freeData = gFalse;  splash->fillGlyph(0, 0, &glyph);}void SplashOutputDev::endTextObject(GfxState *state) {  if (textClipPath) {    splash->clipToPath(textClipPath, gFalse);    delete textClipPath;    textClipPath = NULL;  }}struct SplashOutImageMaskData {  ImageStream *imgStr;  GBool invert;  int width, height, y;};GBool SplashOutputDev::imageMaskSrc(void *data, SplashColorPtr line) {  SplashOutImageMaskData *imgMaskData = (SplashOutImageMaskData *)data;  Guchar *p;  SplashColorPtr q;  int x;  if (imgMaskData->y == imgMaskData->height) {    return gFalse;  }  for (x = 0, p = imgMaskData->imgStr->getLine(), q = line;       x < imgMaskData->width;       ++x) {    *q++ = *p++ ^ imgMaskData->invert;  }  ++imgMaskData->y;  return gTrue;}void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,				    int width, int height, GBool invert,				    GBool inlineImg) {  double *ctm;  SplashCoord mat[6];  SplashOutImageMaskData imgMaskData;  if (state->getFillColorSpace()->isNonMarking()) {    return;  }  ctm = state->getCTM();  mat[0] = ctm[0];  mat[1] = ctm[1];  mat[2] = -ctm[2];  mat[3] = -ctm[3];  mat[4] = ctm[2] + ctm[4];  mat[5] = ctm[3] + ctm[5];  imgMaskData.imgStr = new ImageStream(str, width, 1, 1);  imgMaskData.imgStr->reset();  imgMaskData.invert = invert ? 0 : 1;  imgMaskData.width = width;  imgMaskData.height = height;  imgMaskData.y = 0;  splash->fillImageMask(&imageMaskSrc, &imgMaskData, width, height, mat,			t3GlyphStack != NULL);  if (inlineImg) {    while (imgMaskData.y < height) {      imgMaskData.imgStr->getLine();      ++imgMaskData.y;    }  }  delete imgMaskData.imgStr;  str->close();}struct SplashOutImageData {  ImageStream *imgStr;  GfxImageColorMap *colorMap;  SplashColorPtr lookup;  int *maskColors;  SplashColorMode colorMode;  int width, height, y;};GBool SplashOutputDev::imageSrc(void *data, SplashColorPtr colorLine,				Guchar *alphaLine) {  SplashOutImageData *imgData = (SplashOutImageData *)data;  Guchar *p;  SplashColorPtr q, col;  GfxRGB rgb;  GfxGray gray;#if SPLASH_CMYK  GfxCMYK cmyk;#endif  int nComps, x;  if (imgData->y == imgData->height) {    return gFalse;  }  nComps = imgData->colorMap->getNumPixelComps();  if (imgData->lookup) {    switch (imgData->colorMode) {    case splashModeMono1:    case splashModeMono8:      for (x = 0, p = imgData->imgStr->getLine(), q = colorLine;	   x < imgData->width;	   ++x, ++p) {	*q++ = imgData->lookup[*p];      }      break;    case splashModeRGB8:    case splashModeBGR8:      for (x = 0, p = imgData->imgStr->getLine(), q = colorLine;	   x < imgData->width;	   ++x, ++p) {	col = &imgData->lookup[3 * *p];	*q++ = col[0];	*q++ = col[1];	*q++ = col[2];      }      break;#if SPLASH_CMYK    case splashModeCMYK8:      for (x = 0, p = imgData->imgStr->getLine(), q = colorLine;	   x < imgData->width;	   ++x, ++p) {	col = &imgData->lookup[4 * *p];	*q++ = col[0];	*q++ = col[1];	*q++ = col[2];	*q++ = col[3];      }      break;#endif    }  } else {    switch (imgData->colorMode) {    case splashModeMono1:    case splashModeMono8:      for (x = 0, p = imgData->imgStr->getLine(), q = colorLine;	   x < imgData->width;	   ++x, p += nComps) {	imgData->colorMap->getGray(p, &gray);	*q++ = colToByte(gray);      }      break;    case splashModeRGB8:    case splashModeBGR8:      for (x = 0, p = imgData->imgStr->getLine(), q = colorLine;	   x < imgData->width;	   ++x, p += nComps) {	imgData->colorMap->getRGB(p, &rgb);	*q++ = colToByte(rgb.r);	*q++ = colToByte(rgb.g);	*q++ = colToByte(rgb.b);      }      break;#if SPLASH_CMYK    case splashModeCMYK8:      for (x = 0, p = imgData->imgStr->getLine(), q = colorLine;	   x < imgData->width;	   ++x, p += nComps) {	imgData->colorMap->getCMYK(p, &cmyk);	*q++ = colToByte(cmyk.c);	*q++ = colToByte(cmyk.m);	*q++ = colToByte(cmyk.y);	*q++ = colToByte(cmyk.k);      }      break;#endif    }  }  ++imgData->y;  return gTrue;}GBool SplashOutputDev::alphaImageSrc(void *data, SplashColorPtr colorLine,				     Guchar *alphaLine) {  SplashOutImageData *imgData = (SplashOutImageData *)data;  Guchar *p, *aq;  SplashColorPtr q, col;  GfxRGB rgb;  GfxGray gray;#if SPLASH_CMYK  GfxCMYK cmyk;#endif  Guchar alpha;  int nComps, x, i;  if (imgData->y == imgData->height) {    return gFalse;  }  nComps = imgData->colorMap->getNumPixelComps();  for (x = 0, p = imgData->imgStr->getLine(), q = colorLine, aq = alphaLine;       x < imgData->width;       ++x, p += nComps) {    alpha = 0;    for (i = 0; i < nComps; ++i) {      if (p[i] < imgData->maskColors[2*i] ||	  p[i] > imgData->maskColors[2*i+1]) {	alpha = 0xff;	break;      }    }    if (imgData->lookup) {      switch (imgData->colorMode) {      case splashModeMono1:      case splashModeMono8:	*q++ = imgData->lookup[*p];	*aq++ = alpha;	break;      case splashModeRGB8:      case splashModeBGR8:	col = &imgData->lookup[3 * *p];	*q++ = col[0];	*q++ = col[1];	*q++ = col[2];	*aq++ = alpha;	break;#if SPLASH_CMYK      case splashModeCMYK8:	col = &imgData->lookup[4 * *p];	*q++ = col[0];	*q++ = col[1];	*q++ = col[2];	*q++ = col[3];	*aq++ = alpha;	break;#endif      }    } else {      switch (imgData->colorMode) {      case splashModeMono1:      case splashModeMono8:	imgData->colorMap->getGray(p, &gray);	*q++ = colToByte(gray);	*aq++ = alpha;	break;      case splashModeRGB8:      case splashModeBGR8:	imgData->colorMap->getRGB(p, &rgb);	*q++ = colToByte(rgb.r);	*q++ = colToByte(rgb.g);	*q++ = colToByte(rgb.b);	*aq++ = alpha;	break;#if SPLASH_CMYK      case splashModeCMYK8:	imgData->colorMap->getCMYK(p, &cmyk);	*q++ = colToByte(cmyk.c);	*q++ = colToByte(cmyk.m);	*q++ = colToByte(cmyk.y);	*q++ = colToByte(cmyk.k);	*aq++ = alpha;	break;#endif      }    }  }  ++imgData->y;  return gTrue;}void SplashOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,				int width, int height,				GfxImageColorMap *colorMap,				int *maskColors, GBool inlineImg) {  double *ctm;  SplashCoord mat[6];  SplashOutImageData imgData;  SplashColorMode srcMode;  SplashImageSource src;  GfxGray gray;  GfxRGB rgb;#if SPLASH_CMYK  GfxCMYK cmyk;#endif  Guchar pix;  int n, i;  ctm = state->getCTM();  mat[0] = ctm[0];  mat[1] = ctm[1];  mat[2] = -ctm[2];  mat[3] = -ctm[3];  mat[4] = ctm[2] + ctm[4];  mat[5] = ctm[3] + ctm[5];  imgData.imgStr = new ImageStream(str, width,				   colorMap->getNumPixelComps(),				   colorMap->getBits());  imgData.imgStr->reset();  imgData.colorMap = colorMap;  imgData.maskColors = maskColors;  imgData.colorMode = colorMode;  imgData.width = width;  imgData.height = height;  imgData.y = 0;  // special case for one-channel (monochrome/gray/separation) images:  // build a lookup table here  imgData.lookup = NULL;  if (colorMap->getNumPixelComps() == 1) {    n = 1 << colorMap->getBits();    switch (colorMode) {    case splashModeMono1:    case splashModeMono8:      imgData.lookup = (SplashColorPtr)gmalloc(n);      for (i = 0; i < n; ++i) {	pix = (Guchar)i;	colorMap->getGray(&pix, &gray);	imgData.lookup[i] = colToByte(gray);      }      break;    case splashModeRGB8:    case splashModeBGR8:      imgData.lookup = (SplashColorPtr)gmalloc(3 * n);      for (i = 0; i < n; ++i) {	pix = (Guchar)i;	colorMap->getRGB(&pix, &rgb);	imgData.lookup[3*i] = colToByte(rgb.r);	imgData.lookup[3*i+1] = colToByte(rgb.g);	imgData.lookup[3*i+2] = colToByte(rgb.b);      }      break;#if SPLASH_CMYK    case splashModeCMYK8:      imgData.lookup = (SplashColorPtr)gmalloc(4 * n);      for (i = 0; i < n; ++i) {	pix = (Guchar)i;

⌨️ 快捷键说明

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