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

📄 splashoutputdev.cc

📁 这是一个做pdf阅读器的源代码文件,是大家学习阅读器资料的很好参考
💻 CC
📖 第 1 页 / 共 5 页
字号:
	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      break;    }  }  if (colorMode == splashModeMono1) {    srcMode = splashModeMono8;  } else {    srcMode = colorMode;  }  src = maskColors ? &alphaImageSrc : &imageSrc;  splash->drawImage(src, &imgData, srcMode, maskColors ? gTrue : gFalse,		    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 colorLine,				      Guchar *alphaLine) {  SplashOutMaskedImageData *imgData = (SplashOutMaskedImageData *)data;  Guchar *p, *aq;  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 = colorLine, aq = alphaLine;       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++ = 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::drawMaskedImage(GfxState *state, Object *ref,				      Stream *str, int width, int height,				      GfxImageColorMap *colorMap,				      Stream *maskStr, int maskWidth,				      int maskHeight, GBool maskInvert) {  GfxImageColorMap *maskColorMap;  Object maskDecode, decodeLow, decodeHigh;  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;  // If the mask is higher resolution than the image, use  // drawSoftMaskedImage() instead.  if (maskWidth > width || maskHeight > height) {    decodeLow.initInt(maskInvert ? 0 : 1);    decodeHigh.initInt(maskInvert ? 1 : 0);    maskDecode.initArray(xref);    maskDecode.arrayAdd(&decodeLow);    maskDecode.arrayAdd(&decodeHigh);    maskColorMap = new GfxImageColorMap(1, &maskDecode,					new GfxDeviceGrayColorSpace());    maskDecode.free();    drawSoftMaskedImage(state, ref, str, width, height, colorMap,			maskStr, maskWidth, maskHeight, maskColorMap);    delete maskColorMap;  } else {    //----- 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, gFalse);    maskSplash = new Splash(maskBitmap, gFalse);    maskColor[0] = 0;    maskSplash->clear(maskColor);    maskColor[0] = 0xff;    maskSplash->setFillPattern(new SplashSolidColor(maskColor));    maskSplash->fillImageMask(&imageMaskSrc, &imgMaskData,			      maskWidth, maskHeight, mat, gFalse);    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:      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;	  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      }    }    if (colorMode == splashModeMono1) {      srcMode = splashModeMono8;    } else {      srcMode = colorMode;    }    splash->drawImage(&maskedImageSrc, &imgData, srcMode, gTrue,		      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, gFalse);  maskSplash = new Splash(maskBitmap, vectorAntialias);  maskColor[0] = 0;  maskSplash->clear(maskColor);  maskSplash->drawImage(&imageSrc, &imgMaskData, splashModeMono8, gFalse,			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:    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;	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    }  }  if (colorMode == splashModeMono1) {    srcMode = splashModeMono8;  } else {    srcMode = colorMode;  }  splash->drawImage(&imageSrc, &imgData, srcMode, gFalse, width, height, mat);  splash->setSoftMask(NULL);  gfree(imgData.lookup);  delete imgData.imgStr;  str->close();}void SplashOutputDev::beginTransparencyGroup(GfxState *state, double *bbox,					     GfxColorSpace *blendingColorSpace,					     GBool isolated, GBool knockout,					     GBool forSoftMask) {  SplashTransparencyGroup *transpGroup;  SplashColor color;  double xMin, yMin, xMax, yMax, x, y;  int tx, ty, w, h;  // transform the bbox  state->transform(bbox[0], bbox[1], &x, &y);  xMin = xMax = x;  yMin = yMax = y;  state->transform(bbox[0], bbox[3], &x, &y);  if (x < xMin) {    xMin = x;  } else if (x > xMax) {    xMax = x;  }  if (y < yMin) {    yMin = y;  } else if (y > yMax) {    yMax = y;  }  state->transform(bbox[2], bbox[1], &x, &y);  if (x < xMin) {    xMin = x;  } else if (x > xMax) {    xMax = x;  }  if (y < yMin) {    yMin = y;  } else if (y > yMax) {    yMax = y;  }  state->transform(bbox[2], bbox[3], &x, &y);  if (x < xMin) {    xMin = x;  } else if (x > xMax) {    xMax = x;  }  if (y < yMin) {    yMin = y;  } else if (y > yMax) {    yMax = y;  }  tx = (int)floor(xMin);  if (tx < 0) {    tx = 0;  } else if (tx > bitmap->getWidth()) {    tx = bitmap->getWidth();  }  ty = (int)floor(yMin);  if (ty < 0) {    ty = 0;  } else if (ty > bitmap->getHeight()) {    ty = bitmap->getHeight();  }  w = (int)ceil(xMax) - tx + 1;  if (tx + w > bitmap->getWidth()) {    w = bitmap->getWidth() - tx;  }  if (w < 1) {    w = 1;  }  h = (int)ceil(yMax) - ty + 1;  if (ty + h > bitmap->getHeight()) {    h = bitmap->getHeight() - ty;  }  if (h < 1) {    h = 1;  }  // push a new stack entry  transpGroup = new SplashTransparencyGroup();  transpGroup->tx = tx;  transpGroup->ty = ty;  transpGroup->blendingColorSpace = blendingColorSpace;  transpGroup->isolated = isolated;  transpGroup->next = transpGroupStack;  transpGroupStack = transpGroup;  // save state  transpGroup->origBitmap = bitmap;  transpGroup->origSplash = splash;  //~ this ignores the blendingColorSpace arg  // create the temporary bitmap  bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, gTrue,			    bitmapTopDown);   splash = new Splash(bitmap, vectorAntialias,		      transpGroup->origSplash->getScreen());  if (isolated) {    switch (colorMode) {    case splashModeMono1:    case splashModeMono8:      color[0] = 0;      break;    case splashModeRGB8:    case splashModeBGR8:      color[0] = color[1] = color[2] = 0;      break;#if SPLASH_CMYK    case splashModeCMYK8:      color[0] = color[1] = color[2] = color[3] = 0;   

⌨️ 快捷键说明

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