[poppler] poppler/CairoOutputDev.cc

Adrian Johnson ajohnson at kemper.freedesktop.org
Mon Mar 26 01:48:28 PDT 2012


 poppler/CairoOutputDev.cc |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

New commits:
commit c40e2315cd796ba928969d13a761f5f19d8438fc
Author: Adrian Johnson <ajohnson at redneon.com>
Date:   Fri Mar 23 21:49:42 2012 +1030

    cairo: use a transparency group with setSoftMaskFromImageMask/unsetSoftMaskFromImageMask
    
    Drawing a tiling pattern between setSoftMaskFromImageMask and
    unsetSoftMaskFromImageMask clears the softmask.
    
    Similar to Splash, create a transparency group in
    setSoftMaskFromImageMask. Pop and paint the group in
    unsetSoftMaskFromImageMask. The saveState/restoreState is to ensure
    the softmask is restored before painting the group.
    
    Bug 47739

diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc
index 40c6fce..c021e4c 100644
--- a/poppler/CairoOutputDev.cc
+++ b/poppler/CairoOutputDev.cc
@@ -1859,12 +1859,28 @@ void CairoOutputDev::setSoftMaskFromImageMask(GfxState *state, Object *ref, Stre
     drawImageMaskRegular(state, ref, str, width, height, invert, gFalse, inlineImg);
   }
 
+  if (state->getFillColorSpace()->getMode() == csPattern) {
+    cairo_set_source_rgb (cairo, 1, 1, 1);
+    cairo_set_matrix (cairo, &mask_matrix);
+    cairo_mask (cairo, mask);
+  }
+
   if (mask)
     cairo_pattern_destroy (mask);
   mask = cairo_pop_group (cairo);
+
+  saveState(state);
+  double bbox[4] = {0,0,1,1}; // dummy
+  beginTransparencyGroup(state, bbox, state->getFillColorSpace(),
+                         gTrue, gFalse, gFalse);
 }
 
 void CairoOutputDev::unsetSoftMaskFromImageMask(GfxState *state) {
+  double bbox[4] = {0,0,1,1}; // dummy
+
+  endTransparencyGroup(state);
+  restoreState(state);
+  paintTransparencyGroup(state, bbox);
   clearSoftMask(state);
 }
 


More information about the poppler mailing list