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

📄 splashoutputdev.cc

📁 将pdf文档转换为高质量的html文档
💻 CC
📖 第 1 页 / 共 5 页
字号:
    }  }  switch (colorMode) {  case splashModeMono1:  case splashModeMono8:    srcMode = maskColors ? splashModeAMono8 : splashModeMono8;    break;  case splashModeRGB8:    srcMode = maskColors ? splashModeARGB8 : splashModeRGB8;    break;  case splashModeBGR8:    srcMode = maskColors ? splashModeBGRA8 : splashModeBGR8;    break;#if SPLASH_CMYK  case splashModeCMYK8:    srcMode = maskColors ? splashModeACMYK8 : splashModeCMYK8;    break;#endif  default:    //~ unimplemented    srcMode = splashModeRGB8;    break;  }    src = maskColors ? &alphaImageSrc : &imageSrc;  splash->drawImage(src, &imgData, srcMode, width, height, mat);  if (inlineImg) {    while (imgData.y < height) {      imgData.imgStr->getLine();      ++imgData.y;    }  }  gfree(imgData.lookup);  delete imgData.imgStr;  str->close();}struct SplashOutMaskedImageData {  ImageStream *imgStr;  GfxImageColorMap *colorMap;  SplashBitmap *mask;  SplashColorPtr lookup;  SplashColorMode colorMode;  int width, height, y;};GBool SplashOutputDev::maskedImageSrc(void *data, SplashColorPtr line) {  SplashOutMaskedImageData *imgData = (SplashOutMaskedImageData *)data;  Guchar *p;  SplashColor maskColor;  SplashColorPtr q, col;  GfxRGB rgb;  GfxGray gray;#if SPLASH_CMYK  GfxCMYK cmyk;#endif  Guchar alpha;  int nComps, x;  if (imgData->y == imgData->height) {    return gFalse;  }  nComps = imgData->colorMap->getNumPixelComps();  for (x = 0, p = imgData->imgStr->getLine(), q = line;       x < imgData->width;       ++x, p += nComps) {    imgData->mask->getPixel(x, imgData->y, maskColor);    alpha = maskColor[0] ? 0xff : 0x00;    if (imgData->lookup) {      switch (imgData->colorMode) {      case splashModeMono1:      case splashModeMono8:	*q++ = alpha;	*q++ = imgData->lookup[*p];	break;      case splashModeRGB8:	*q++ = alpha;	col = &imgData->lookup[3 * *p];	*q++ = col[0];	*q++ = col[1];	*q++ = col[2];	break;      case splashModeBGR8:	col = &imgData->lookup[3 * *p];	*q++ = col[0];	*q++ = col[1];	*q++ = col[2];	*q++ = alpha;	break;#if SPLASH_CMYK      case splashModeCMYK8:	*q++ = alpha;	col = &imgData->lookup[4 * *p];	*q++ = col[0];	*q++ = col[1];	*q++ = col[2];	*q++ = col[3];	break;#endif      case splashModeAMono8:      case splashModeARGB8:      case splashModeBGRA8:#if SPLASH_CMYK      case splashModeACMYK8:#endif	//~ unimplemented	break;      }    } else {      switch (imgData->colorMode) {      case splashModeMono1:      case splashModeMono8:	imgData->colorMap->getGray(p, &gray);	*q++ = alpha;	*q++ = colToByte(gray);	break;      case splashModeRGB8:	imgData->colorMap->getRGB(p, &rgb);	*q++ = alpha;	*q++ = colToByte(rgb.r);	*q++ = colToByte(rgb.g);	*q++ = colToByte(rgb.b);	break;      case splashModeBGR8:	imgData->colorMap->getRGB(p, &rgb);	*q++ = colToByte(rgb.b);	*q++ = colToByte(rgb.g);	*q++ = colToByte(rgb.r);	*q++ = alpha;	break;#if SPLASH_CMYK      case splashModeCMYK8:	imgData->colorMap->getCMYK(p, &cmyk);	*q++ = alpha;	*q++ = colToByte(cmyk.c);	*q++ = colToByte(cmyk.m);	*q++ = colToByte(cmyk.y);	*q++ = colToByte(cmyk.k);	break;#endif      case splashModeAMono8:      case splashModeARGB8:      case splashModeBGRA8:#if SPLASH_CMYK      case splashModeACMYK8:#endif	//~ unimplemented	break;      }    }  }  ++imgData->y;  return gTrue;}void SplashOutputDev::drawMaskedImage(GfxState *state, Object *ref,				      Stream *str, int width, int height,				      GfxImageColorMap *colorMap,				      Stream *maskStr, int maskWidth,				      int maskHeight, GBool maskInvert) {  double *ctm;  SplashCoord mat[6];  SplashOutMaskedImageData imgData;  SplashOutImageMaskData imgMaskData;  SplashColorMode srcMode;  SplashBitmap *maskBitmap;  Splash *maskSplash;  SplashColor maskColor;  GfxGray gray;  GfxRGB rgb;#if SPLASH_CMYK  GfxCMYK cmyk;#endif  Guchar pix;  int n, i;  //----- scale the mask image to the same size as the source image  mat[0] = (SplashCoord)width;  mat[1] = 0;  mat[2] = 0;  mat[3] = (SplashCoord)height;  mat[4] = 0;  mat[5] = 0;  imgMaskData.imgStr = new ImageStream(maskStr, maskWidth, 1, 1);  imgMaskData.imgStr->reset();  imgMaskData.invert = maskInvert ? 0 : 1;  imgMaskData.width = maskWidth;  imgMaskData.height = maskHeight;  imgMaskData.y = 0;  maskBitmap = new SplashBitmap(width, height, 1, splashModeMono1);  maskSplash = new Splash(maskBitmap);  maskColor[0] = 0;  maskSplash->clear(maskColor);  maskColor[0] = 1;  maskSplash->setFillPattern(new SplashSolidColor(maskColor));  maskSplash->fillImageMask(&imageMaskSrc, &imgMaskData,			    maskWidth, maskHeight, mat);  delete imgMaskData.imgStr;  maskStr->close();  delete maskSplash;  //----- draw the source image  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.mask = maskBitmap;  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:      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;    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.b);	imgData.lookup[3*i+1] = colToByte(rgb.g);	imgData.lookup[3*i+2] = colToByte(rgb.r);      }      break;#if SPLASH_CMYK    case splashModeCMYK8:      imgData.lookup = (SplashColorPtr)gmalloc(4 * n);      for (i = 0; i < n; ++i) {	pix = (Guchar)i;	colorMap->getCMYK(&pix, &cmyk);	imgData.lookup[4*i] = colToByte(cmyk.c);	imgData.lookup[4*i+1] = colToByte(cmyk.m);	imgData.lookup[4*i+2] = colToByte(cmyk.y);	imgData.lookup[4*i+3] = colToByte(cmyk.k);      }      break;#endif    default:      //~ unimplemented      break;    }  }  switch (colorMode) {  case splashModeMono1:  case splashModeMono8:    srcMode = splashModeAMono8;    break;  case splashModeRGB8:    srcMode = splashModeARGB8;    break;  case splashModeBGR8:    srcMode = splashModeBGRA8;    break;#if SPLASH_CMYK  case splashModeCMYK8:    srcMode = splashModeACMYK8;    break;#endif  default:    //~ unimplemented    srcMode = splashModeARGB8;    break;  }    splash->drawImage(&maskedImageSrc, &imgData, srcMode, width, height, mat);  delete maskBitmap;  gfree(imgData.lookup);  delete imgData.imgStr;  str->close();}void SplashOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref,					  Stream *str, int width, int height,					  GfxImageColorMap *colorMap,					  Stream *maskStr,					  int maskWidth, int maskHeight,					  GfxImageColorMap *maskColorMap) {  double *ctm;  SplashCoord mat[6];  SplashOutImageData imgData;  SplashOutImageData imgMaskData;  SplashColorMode srcMode;  SplashBitmap *maskBitmap;  Splash *maskSplash;  SplashColor maskColor;  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];  //----- set up the soft mask  imgMaskData.imgStr = new ImageStream(maskStr, maskWidth,				       maskColorMap->getNumPixelComps(),				       maskColorMap->getBits());  imgMaskData.imgStr->reset();  imgMaskData.colorMap = maskColorMap;  imgMaskData.maskColors = NULL;  imgMaskData.colorMode = splashModeMono8;  imgMaskData.width = maskWidth;  imgMaskData.height = maskHeight;  imgMaskData.y = 0;  n = 1 << maskColorMap->getBits();  imgMaskData.lookup = (SplashColorPtr)gmalloc(n);  for (i = 0; i < n; ++i) {    pix = (Guchar)i;    maskColorMap->getGray(&pix, &gray);    imgMaskData.lookup[i] = colToByte(gray);  }  maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(),				1, splashModeMono8);  maskSplash = new Splash(maskBitmap);  maskColor[0] = 0;  maskSplash->clear(maskColor);  maskSplash->drawImage(&imageSrc, &imgMaskData,			splashModeMono8, maskWidth, maskHeight, mat);  delete imgMaskData.imgStr;  maskStr->close();  gfree(imgMaskData.lookup);  delete maskSplash;  splash->setSoftMask(maskBitmap);  //----- draw the source image  imgData.imgStr = new ImageStream(str, width,				   colorMap->getNumPixelComps(),				   colorMap->getBits());  imgData.imgStr->reset();  imgData.colorMap = colorMap;  imgData.maskColors = NULL;  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:      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;    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.b);	imgData.lookup[3*i+1] = colToByte(rgb.g);	imgData.lookup[3*i+2] = colToByte(rgb.r);      }      break;#if SPLASH_CMYK    case splashModeCMYK8:      imgData.lookup = (SplashColorPtr)gmalloc(4 * n);      for (i = 0; i < n; ++i) {	pix = (Guchar)i;	colorMap->getCMYK(&pix, &cmyk);	imgData.lookup[4*i] = colToByte(cmyk.c);	imgData.lookup[4*i+1] = colToByte(cmyk.m);	imgData.lookup[4*i+2] = colToByte(cmyk.y);	imgData.lookup[4*i+3] = colToByte(cmyk.k);      }      break;#endif    default:      //~ unimplemented      break;    }  }  switch (colorMode) {  case splashModeMono1:  case splashModeMono8:    srcMode = splashModeMono8;    break;  case splashModeRGB8:    srcMode = splashModeRGB8;    break;  case splashModeBGR8:    srcMode = splashModeBGR8;    break;#if SPLASH_CMYK  case splashModeCMYK8:    srcMode = splashModeCMYK8;    break;#endif  default:    //~ unimplemented    srcMode = splashModeRGB8;    break;  }    splash->drawImage(&imageSrc, &imgData, srcMode, width, height, mat);  splash->setSoftMask(NULL);  gfree(imgData.lookup);  delete imgData.imgStr;  str->close();}void SplashOutputDev::setPaperColor(SplashColorPtr paperColorA) {  splashColorCopy(paperColor, paperColorA);}int SplashOutputDev::getBitmapWidth() {  return bitmap->getWidth();}int SplashOutputDev::getBitmapHeight() {  return bitmap->getHeight();}SplashBitmap *SplashOutputDev::takeBitmap() {  SplashBitmap *ret;  ret = bitmap;  bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode, bitmapTopDown);  return ret;}void SplashOutputDev::getModRegion(int *xMin, int *yMin,				   int *xMax, int *yMax) {  splash->getModRegion(xMin, yMin, xMax, yMax);}void SplashOutputDev::clearModRegion() {  splash->clearModRegion();}void SplashOutputDev::setFillColor(int r, int g, int b) {  GfxRGB rgb;  GfxGray gray;#if SPLASH_CMYK  GfxCMYK cmyk;#endif  rgb.r = byteToCol(r);  rgb.g = byteToCol(g);  rgb.b = byteToCol(b);  gray = (GfxColorComp)(0

⌨️ 快捷键说明

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