poppler/CairoOutputDev.cc | 34 ++++++++++++++++++++++++++++++++-- poppler/CairoOutputDev.h | 5 +++++ 2 files changed, 37 insertions(+), 2 deletions(-)
New commits: commit 121c44db0884f0d70ba1470a66aa78441257c421 Author: Adrian Johnson <[email protected]> Date: Fri Mar 20 23:25:19 2009 +1030 Fix cairo luminosity smask when cairo ctm != identity diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index fd93e05..91e1d04 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -949,8 +949,22 @@ void CairoOutputDev::setSoftMask(GfxState * state, double * bbox, GBool alpha, * So we paint the group to an image surface convert it to a luminocity map * and then use that as the mask. */ - double x1, y1, x2, y2; + double x1, y1, x2, y2, tmp; cairo_clip_extents(cairo, &x1, &y1, &x2, &y2); + cairo_user_to_device(cairo, &x1, &y1); + cairo_user_to_device(cairo, &x2, &y2); + if (x1 > x2) { + tmp = x1; + x1 = x2; + x2 = tmp; + } + + if (y1 > y2) { + tmp = y1; + y1 = y2; + y2 = tmp; + } + int width = (int)(ceil(x2) - floor(x1)); int height = (int)(ceil(y2) - floor(y1)); commit 3f55aff56a1d2002ba79f3efba5eb77e94575439 Author: Adrian Johnson <[email protected]> Date: Thu Mar 19 22:34:23 2009 +1030 Fix bug in cairo backend with nested masks The previous smask was not restored after a q/Q pair or form xobject. diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index 822d66d..fd93e05 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -132,6 +132,7 @@ CairoOutputDev::CairoOutputDev() { t3_glyph_has_bbox = gFalse; groupColorSpaceStack = NULL; + maskStack = NULL; group = NULL; mask = NULL; shape = NULL; @@ -242,6 +243,11 @@ void CairoOutputDev::saveState(GfxState *state) { cairo_save (cairo); if (cairo_shape) cairo_save (cairo_shape); + + MaskStack *ms = new MaskStack; + ms->mask = cairo_pattern_reference(mask); + ms->next = maskStack; + maskStack = ms; } void CairoOutputDev::restoreState(GfxState *state) { @@ -256,6 +262,14 @@ void CairoOutputDev::restoreState(GfxState *state) { updateStrokeColor(state); updateFillOpacity(state); updateStrokeOpacity(state); + + MaskStack* ms = maskStack; + if (mask) + cairo_pattern_destroy(mask); + + mask = ms->mask; + maskStack = ms->next; + delete ms; } void CairoOutputDev::updateAll(GfxState *state) { @@ -1024,7 +1038,9 @@ void CairoOutputDev::popTransparencyGroup() { void CairoOutputDev::clearSoftMask(GfxState * /*state*/) { - //XXX: should we be doing anything here? + if (mask) + cairo_pattern_destroy(mask); + mask = NULL; } void CairoOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, diff --git a/poppler/CairoOutputDev.h b/poppler/CairoOutputDev.h index 1e410c1..5ec2bf0 100644 --- a/poppler/CairoOutputDev.h +++ b/poppler/CairoOutputDev.h @@ -271,6 +271,11 @@ protected: GfxColorSpace *cs; struct ColorSpaceStack *next; } * groupColorSpaceStack; + + struct MaskStack { + cairo_pattern_t *mask; + struct MaskStack *next; + } *maskStack; }; //------------------------------------------------------------------------ _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
