diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc index 21d7be6..7860f6b 100644 --- a/poppler/SplashOutputDev.cc +++ b/poppler/SplashOutputDev.cc @@ -1230,6 +1230,9 @@ void SplashOutputDev::updateRender(GfxState *state) { if (rm == 7 && haveCSPattern) { haveCSPattern = gFalse; restoreState(state); + } else if (haveCSPattern) { + savedRender = rm; + state->setRender((savedRender == 2) ? 6 : 7); } } @@ -1620,7 +1623,7 @@ void SplashOutputDev::drawChar(GfxState *state, double x, double y, // fill if (!(render & 1)) { - if (!state->getFillColorSpace()->isNonMarking()) { + if (!haveCSPattern && !state->getFillColorSpace()->isNonMarking()) { splash->fillChar((SplashCoord)x, (SplashCoord)y, code, font); } } @@ -1930,7 +1933,7 @@ void SplashOutputDev::beginTextObject(GfxState *state) { haveCSPattern = gTrue; saveState(state); savedRender = state->getRender(); - state->setRender(7); + state->setRender((savedRender == 2) ? 6 : 7); } } @@ -1980,20 +1983,20 @@ GBool SplashOutputDev::imageMaskSrc(void *data, SplashColorPtr line) { } void SplashOutputDev::endMaskClip(GfxState * state) { - double bbox[4] = {0,0,1,1}; // dummy - /* transfer mask to alpha channel! */ - // memcpy(maskBitmap->getAlphaPtr(), maskBitmap->getDataPtr(), bitmap->getRowSize() * bitmap->getHeight()); - // memset(maskBitmap->getDataPtr(), 0, bitmap->getRowSize() * bitmap->getHeight()); - int c; - Guchar *dest = bitmap->getAlphaPtr(); - Guchar *src = maskBitmap->getDataPtr(); - for (c= 0; c < maskBitmap->getRowSize() * maskBitmap->getHeight(); c++) { - dest[c] = src[c]; - } - delete maskBitmap; - maskBitmap = NULL; - endTransparencyGroup(state); - paintTransparencyGroup(state, bbox); + double bbox[4] = {0,0,1,1}; // dummy + /* transfer mask to alpha channel! */ + // memcpy(maskBitmap->getAlphaPtr(), maskBitmap->getDataPtr(), bitmap->getRowSize() * bitmap->getHeight()); + // memset(maskBitmap->getDataPtr(), 0, bitmap->getRowSize() * bitmap->getHeight()); + int c; + Guchar *dest = bitmap->getAlphaPtr(); + Guchar *src = maskBitmap->getDataPtr(); + for (c= 0; c < maskBitmap->getRowSize() * maskBitmap->getHeight(); c++) { + dest[c] = src[c]; + } + delete maskBitmap; + maskBitmap = NULL; + endTransparencyGroup(state); + paintTransparencyGroup(state, bbox); } void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, @@ -2027,29 +2030,29 @@ void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, if (state->getFillColorSpace()->getMode() == csPattern) { Splash *maskSplash; - SplashColor maskColor; - - /* from beginTransparencyGroup: */ - // push a new stack entry - SplashTransparencyGroup *transpGroup = new SplashTransparencyGroup(); - transpGroup->tx = 0; - transpGroup->ty = 0; - transpGroup->blendingColorSpace = NULL; - transpGroup->isolated = gFalse; - 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(bitmap->getWidth(), bitmap->getHeight(), bitmapRowPad, colorMode, gTrue, - bitmapTopDown); - splash = new Splash(bitmap, vectorAntialias, - transpGroup->origSplash->getScreen()); + SplashColor maskColor; + + /* from beginTransparencyGroup: */ + // push a new stack entry + SplashTransparencyGroup *transpGroup = new SplashTransparencyGroup(); + transpGroup->tx = 0; + transpGroup->ty = 0; + transpGroup->blendingColorSpace = NULL; + transpGroup->isolated = gFalse; + 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(bitmap->getWidth(), bitmap->getHeight(), bitmapRowPad, colorMode, gTrue, + bitmapTopDown); + splash = new Splash(bitmap, vectorAntialias, + transpGroup->origSplash->getScreen()); splash->blitTransparent(transpGroup->origBitmap, 0, 0, 0, 0, bitmap->getWidth(), bitmap->getHeight()); - splash->setInNonIsolatedGroup(transpGroup->origBitmap, 0, 0); - transpGroup->tBitmap = bitmap; + splash->setInNonIsolatedGroup(transpGroup->origBitmap, 0, 0); + transpGroup->tBitmap = bitmap; maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), 1, splashModeMono8, gFalse); maskSplash = new Splash(maskBitmap, vectorAntialias); @@ -3176,4 +3179,4 @@ void SplashOutputDev::setVectorAntialias(GBool vaa) { void SplashOutputDev::setFreeTypeHinting(GBool enable) { enableFreeTypeHinting = enable; -} +} \ No newline at end of file