poppler/Gfx.cc | 137 +++++++++++++++++++++------------------------ poppler/Gfx.h | 4 - poppler/SplashOutputDev.cc | 41 ++++++++++++- poppler/SplashOutputDev.h | 3 poppler/TextOutputDev.cc | 1 poppler/TextOutputDev.h | 1 6 files changed, 108 insertions(+), 79 deletions(-)
New commits: commit ccf238b32e236f69c0507a5421ac2649dfa8d865 Author: Thomas Freitag <[email protected]> Date: Wed Apr 21 19:21:37 2010 +0100 Improve colorizing text and masks in pattern colorspace Bug #27482 diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc index 85d657b..8a7dfee 100644 --- a/poppler/Gfx.cc +++ b/poppler/Gfx.cc @@ -1304,24 +1304,19 @@ void Gfx::opSetFillGray(Object args[], int numArgs) { doPatternFill(gTrue); } out->restoreState(state); - state->setFillPattern(NULL); - state->setFillColorSpace(new GfxDeviceGrayColorSpace()); - out->updateFillColorSpace(state); - color.c[0] = dblToCol(args[0].getNum()); - state->setFillColor(&color); - out->updateFillColor(state); + } + state->setFillPattern(NULL); + state->setFillColorSpace(new GfxDeviceGrayColorSpace()); + out->updateFillColorSpace(state); + color.c[0] = dblToCol(args[0].getNum()); + state->setFillColor(&color); + out->updateFillColor(state); + if (textHaveCSPattern) { out->beginTextObject(state); out->updateRender(state); out->updateTextMat(state); out->updateTextPos(state); textHaveCSPattern = gFalse; - } else { - state->setFillPattern(NULL); - state->setFillColorSpace(new GfxDeviceGrayColorSpace()); - out->updateFillColorSpace(state); - color.c[0] = dblToCol(args[0].getNum()); - state->setFillColor(&color); - out->updateFillColor(state); } } @@ -1341,19 +1336,27 @@ void Gfx::opSetFillCMYKColor(Object args[], int numArgs) { int i; if (textHaveCSPattern) { - colorSpaceText = new GfxDeviceCMYKColorSpace(); - for (i = 0; i < 4; ++i) { - colorText.c[i] = dblToCol(args[i].getNum()); - } - } else { - state->setFillPattern(NULL); - state->setFillColorSpace(new GfxDeviceCMYKColorSpace()); - out->updateFillColorSpace(state); - for (i = 0; i < 4; ++i) { - color.c[i] = dblToCol(args[i].getNum()); + GBool needFill = out->deviceHasTextClip(state); + out->endTextObject(state); + if (needFill) { + doPatternFill(gTrue); } - state->setFillColor(&color); - out->updateFillColor(state); + out->restoreState(state); + } + state->setFillPattern(NULL); + state->setFillColorSpace(new GfxDeviceCMYKColorSpace()); + out->updateFillColorSpace(state); + for (i = 0; i < 4; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setFillColor(&color); + out->updateFillColor(state); + if (textHaveCSPattern) { + out->beginTextObject(state); + out->updateRender(state); + out->updateTextMat(state); + out->updateTextPos(state); + textHaveCSPattern = gFalse; } } @@ -1376,19 +1379,27 @@ void Gfx::opSetFillRGBColor(Object args[], int numArgs) { int i; if (textHaveCSPattern) { - colorSpaceText = new GfxDeviceRGBColorSpace(); - for (i = 0; i < 3; ++i) { - colorText.c[i] = dblToCol(args[i].getNum()); - } - } else { - state->setFillPattern(NULL); - state->setFillColorSpace(new GfxDeviceRGBColorSpace()); - out->updateFillColorSpace(state); - for (i = 0; i < 3; ++i) { - color.c[i] = dblToCol(args[i].getNum()); + GBool needFill = out->deviceHasTextClip(state); + out->endTextObject(state); + if (needFill) { + doPatternFill(gTrue); } - state->setFillColor(&color); - out->updateFillColor(state); + out->restoreState(state); + } + state->setFillPattern(NULL); + state->setFillColorSpace(new GfxDeviceRGBColorSpace()); + out->updateFillColorSpace(state); + for (i = 0; i < 3; ++i) { + color.c[i] = dblToCol(args[i].getNum()); + } + state->setFillColor(&color); + out->updateFillColor(state); + if (textHaveCSPattern) { + out->beginTextObject(state); + out->updateRender(state); + out->updateTextMat(state); + out->updateTextPos(state); + textHaveCSPattern = gFalse; } } @@ -1411,7 +1422,6 @@ void Gfx::opSetFillColorSpace(Object args[], int numArgs) { GfxColorSpace *colorSpace; GfxColor color; - state->setFillPattern(NULL); res->lookupColorSpace(args[0].getName(), &obj); if (obj.isNull()) { colorSpace = GfxColorSpace::parse(&args[0], this); @@ -1420,35 +1430,29 @@ void Gfx::opSetFillColorSpace(Object args[], int numArgs) { } obj.free(); if (colorSpace) { + if (textHaveCSPattern) { + GBool needFill = out->deviceHasTextClip(state); + out->endTextObject(state); + if (needFill) { + doPatternFill(gTrue); + } + out->restoreState(state); + } + state->setFillPattern(NULL); state->setFillColorSpace(colorSpace); out->updateFillColorSpace(state); colorSpace->getDefaultColor(&color); state->setFillColor(&color); out->updateFillColor(state); - if (drawText) { - if (colorSpace->getMode() == csPattern) { - if (out->supportTextCSPattern(state) && textHaveCSPattern) { - GBool needFill = out->deviceHasTextClip(state); - out->endTextObject(state); - if (needFill) - doPatternFill(gTrue); - out->restoreState(state); - } - colorSpaceText = NULL; - textHaveCSPattern = gTrue; - out->beginTextObject(state); - } else if (textHaveCSPattern) { - GBool needFill = out->deviceHasTextClip(state); - out->endTextObject(state); - if (needFill) { - doPatternFill(gTrue); - } - out->beginTextObject(state); - out->updateRender(state); - out->updateTextMat(state); - out->updateTextPos(state); - textHaveCSPattern = gFalse; - } + if (textHaveCSPattern) { + out->beginTextObject(state); + out->updateRender(state); + out->updateTextMat(state); + out->updateTextPos(state); + textHaveCSPattern = colorSpace->getMode() == csPattern; + } else if (drawText && out->supportTextCSPattern(state)) { + out->beginTextObject(state); + textHaveCSPattern = gTrue; } } else { error(getPos(), "Bad color space (fill)"); @@ -3329,7 +3333,6 @@ void Gfx::opBeginText(Object args[], int numArgs) { out->updateTextPos(state); fontChanged = gTrue; if (out->supportTextCSPattern(state)) { - colorSpaceText = NULL; textHaveCSPattern = gTrue; } } @@ -3343,14 +3346,6 @@ void Gfx::opEndText(Object args[], int numArgs) { doPatternFill(gTrue); } out->restoreState(state); - if (colorSpaceText != NULL) { - state->setFillPattern(NULL); - state->setFillColorSpace(colorSpaceText); - out->updateFillColorSpace(state); - state->setFillColor(&colorText); - out->updateFillColor(state); - colorSpaceText = NULL; - } } textHaveCSPattern = gFalse; } diff --git a/poppler/Gfx.h b/poppler/Gfx.h index 3e12509..f1a8964 100644 --- a/poppler/Gfx.h +++ b/poppler/Gfx.h @@ -18,7 +18,7 @@ // Copyright (C) 2008 Brad Hards <[email protected]> // Copyright (C) 2008, 2010 Carlos Garcia Campos <[email protected]> // Copyright (C) 2009 Albert Astals Cid <[email protected]> -// Copyright (C) 2009 Thomas Freitag <[email protected]> +// Copyright (C) 2009, 2010 Thomas Freitag <[email protected]> // Copyright (C) 2010 David Benjamin <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -196,8 +196,6 @@ private: GBool drawText; // in text drawing GBool maskHaveCSPattern; // in mask drawing and mask has pattern colorspace GBool commandAborted; // did the previous command abort the drawing? - GfxColorSpace *colorSpaceText;// colorspace after text has filled with pattern - GfxColor colorText; // fill color after after text has filled with pattern GfxResources *res; // resource stack int updateLevel; diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc index bb5cb7f..00aae92 100644 --- a/poppler/SplashOutputDev.cc +++ b/poppler/SplashOutputDev.cc @@ -1974,7 +1974,20 @@ GBool SplashOutputDev::imageMaskSrc(void *data, SplashColorPtr line) { } void SplashOutputDev::endMaskClip(GfxState * state) { - splash->setSoftMask(NULL); + 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, @@ -2007,10 +2020,31 @@ void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, imgMaskData.y = 0; if (state->getFillColorSpace()->getMode() == csPattern) { - SplashBitmap *maskBitmap; 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()); + splash->blitTransparent(transpGroup->origBitmap, 0, 0, 0, 0, bitmap->getWidth(), bitmap->getHeight()); + splash->setInNonIsolatedGroup(transpGroup->origBitmap, 0, 0); + transpGroup->tBitmap = bitmap; + maskBitmap = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), 1, splashModeMono8, gFalse); maskSplash = new Splash(maskBitmap, vectorAntialias); maskColor[0] = 0; @@ -2019,7 +2053,6 @@ void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, maskSplash->setFillPattern(new SplashSolidColor(maskColor)); maskSplash->fillImageMask(&imageMaskSrc, &imgMaskData, width, height, mat, t3GlyphStack != NULL); delete maskSplash; - splash->setSoftMask(maskBitmap); } else { splash->fillImageMask(&imageMaskSrc, &imgMaskData, width, height, mat, t3GlyphStack != NULL); if (inlineImg) { diff --git a/poppler/SplashOutputDev.h b/poppler/SplashOutputDev.h index df33850..37b771a 100644 --- a/poppler/SplashOutputDev.h +++ b/poppler/SplashOutputDev.h @@ -14,7 +14,7 @@ // under GPL version 2 or later // // Copyright (C) 2005 Takashi Iwai <[email protected]> -// Copyright (C) 2009 Thomas Freitag <[email protected]> +// Copyright (C) 2009, 2010 Thomas Freitag <[email protected]> // Copyright (C) 2009 Carlos Garcia Campos <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -277,6 +277,7 @@ private: SplashTransparencyGroup * // transparency group stack transpGroupStack; + SplashBitmap *maskBitmap; // for image masks in pattern colorspace }; #endif commit 8e86dfb328d94939ecf390d34af533b831b2837b Author: Albert Astals Cid <[email protected]> Date: Wed Apr 21 19:19:53 2010 +0100 Add copyright diff --git a/poppler/TextOutputDev.cc b/poppler/TextOutputDev.cc index e03cc8d..afca5f2 100644 --- a/poppler/TextOutputDev.cc +++ b/poppler/TextOutputDev.cc @@ -22,6 +22,7 @@ // Copyright (C) 2008, 2010 Hib Eris <[email protected]> // Copyright (C) 2009 Ross Moore <[email protected]> // Copyright (C) 2009 Kovid Goyal <[email protected]> +// Copyright (C) 2010 Brian Ewins <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git diff --git a/poppler/TextOutputDev.h b/poppler/TextOutputDev.h index 62e2d4c..cceec20 100644 --- a/poppler/TextOutputDev.h +++ b/poppler/TextOutputDev.h @@ -15,6 +15,7 @@ // Copyright (C) 2007-2008 Carlos Garcia Campos <[email protected]> // Copyright (C) 2007 Adrian Johnson <[email protected]> // Copyright (C) 2008 Albert Astals Cid <[email protected]> +// Copyright (C) 2010 Brian Ewins <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
