diff options
-rw-r--r-- | fitz/dev_draw.c | 4 | ||||
-rw-r--r-- | mupdf/mupdf.h | 1 | ||||
-rw-r--r-- | mupdf/pdf_build.c | 8 | ||||
-rw-r--r-- | mupdf/pdf_interpret.c | 33 |
4 files changed, 25 insertions, 21 deletions
diff --git a/fitz/dev_draw.c b/fitz/dev_draw.c index 5c2445ae..0e7e8138 100644 --- a/fitz/dev_draw.c +++ b/fitz/dev_draw.c @@ -17,6 +17,7 @@ struct fz_drawdevice_s fz_pixmap *dest; fz_bbox scissor; + int top; struct { fz_bbox scissor; fz_pixmap *dest; @@ -24,7 +25,6 @@ struct fz_drawdevice_s fz_blendmode blendmode; int luminosity; } stack[STACKSIZE]; - int top; }; static void @@ -876,8 +876,6 @@ fz_drawendmask(void *user) /* convert to alpha mask */ temp = fz_alphafromgray(mask, luminosity); -fz_writepng(mask, "softmask-1.png", 1); -fz_writepng(temp, "softmask-2.png", 1); fz_droppixmap(mask); /* create new dest scratch buffer */ diff --git a/mupdf/mupdf.h b/mupdf/mupdf.h index 8c9acdd4..2489d792 100644 --- a/mupdf/mupdf.h +++ b/mupdf/mupdf.h @@ -554,7 +554,6 @@ struct pdf_material_s fz_colorspace *cs; pdf_pattern *pattern; fz_shade *shade; - float parentalpha; float alpha; float v[32]; }; diff --git a/mupdf/pdf_build.c b/mupdf/pdf_build.c index ff57d0fc..63360841 100644 --- a/mupdf/pdf_build.c +++ b/mupdf/pdf_build.c @@ -20,7 +20,6 @@ pdf_initgstate(pdf_gstate *gs, fz_matrix ctm) gs->stroke.v[0] = 0; gs->stroke.pattern = nil; gs->stroke.shade = nil; - gs->stroke.parentalpha = 1; gs->stroke.alpha = 1; gs->fill.kind = PDF_MCOLOR; @@ -28,7 +27,6 @@ pdf_initgstate(pdf_gstate *gs, fz_matrix ctm) gs->fill.v[0] = 0; gs->fill.pattern = nil; gs->fill.shade = nil; - gs->fill.parentalpha = 1; gs->fill.alpha = 1; gs->charspace = 0; @@ -226,6 +224,9 @@ pdf_showshade(pdf_csi *csi, fz_shade *shd) pdf_gstate *gstate = csi->gstate + csi->gtop; fz_rect bbox; + if (gstate->fill.alpha < 1) + fz_warn("ignoring ca for shading: %g", gstate->fill.alpha); + bbox = fz_boundshade(shd, gstate->ctm); if (gstate->blendmode != FZ_BNORMAL) @@ -244,6 +245,9 @@ pdf_showimage(pdf_csi *csi, pdf_image *image) fz_pixmap *tile, *mask; fz_rect bbox; + if (gstate->fill.alpha < 1) + fz_warn("ignoring ca for image: %g", gstate->fill.alpha); + bbox = fz_transformrect(gstate->ctm, fz_unitrect); if (gstate->blendmode != FZ_BNORMAL) diff --git a/mupdf/pdf_interpret.c b/mupdf/pdf_interpret.c index c8a2d0f6..4551ac82 100644 --- a/mupdf/pdf_interpret.c +++ b/mupdf/pdf_interpret.c @@ -151,44 +151,45 @@ pdf_runxobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj) pdf_gstate *gstate; fz_matrix oldtopctm; int oldtop; - pdf_xobject *softmask = nil; + int popmask; pdf_gsave(csi); gstate = csi->gstate + csi->gtop; oldtop = csi->gtop; - - gstate->stroke.parentalpha = gstate->stroke.alpha; - gstate->fill.parentalpha = gstate->fill.alpha; + popmask = 0; /* apply xobject's transform matrix */ gstate->ctm = fz_concat(xobj->matrix, gstate->ctm); - /* reset alpha to 1.0 when starting a new Transparency group */ + /* apply soft mask, create transparency group and reset state */ if (xobj->transparency) { if (gstate->softmask) { - softmask = gstate->softmask; + pdf_xobject *softmask = gstate->softmask; + fz_rect bbox = fz_transformrect(gstate->ctm, xobj->bbox); + gstate->softmask = nil; + popmask = 1; - fz_rect bbox = fz_transformrect(gstate->ctm, xobj->bbox); - fz_matrix oldctm = gstate->ctm; csi->dev->beginmask(csi->dev->user, bbox, gstate->luminosity, nil, nil); pdf_runxobject(csi, nil, softmask); csi->dev->endmask(csi->dev->user); - gstate->ctm = oldctm; pdf_dropxobject(softmask); } + if (gstate->fill.alpha < 1) + fz_warn("ignoring ca for xobject: %g", gstate->fill.alpha); + csi->dev->begingroup(csi->dev->user, fz_transformrect(gstate->ctm, xobj->bbox), xobj->isolated, xobj->knockout, gstate->blendmode); gstate->blendmode = FZ_BNORMAL; - gstate->stroke.alpha = gstate->stroke.parentalpha; - gstate->fill.alpha = gstate->fill.parentalpha; + gstate->stroke.alpha = 1; + gstate->fill.alpha = 1; } /* clip to the bounds */ @@ -220,11 +221,12 @@ pdf_runxobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj) pdf_grestore(csi); + /* wrap up transparency stacks */ + if (xobj->transparency) { csi->dev->endgroup(csi->dev->user); - - if (softmask) + if (popmask) csi->dev->popclip(csi->dev->user); } @@ -330,9 +332,10 @@ pdf_runextgstate(pdf_csi *csi, pdf_gstate *gstate, fz_obj *rdb, fz_obj *extgstat } else if (!strcmp(s, "CA")) - gstate->stroke.alpha = gstate->stroke.parentalpha * fz_toreal(val); + gstate->stroke.alpha = fz_toreal(val); + else if (!strcmp(s, "ca")) - gstate->fill.alpha = gstate->fill.parentalpha * fz_toreal(val); + gstate->fill.alpha = fz_toreal(val); else if (!strcmp(s, "BM")) { |