summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fitz/dev_draw.c4
-rw-r--r--mupdf/mupdf.h1
-rw-r--r--mupdf/pdf_build.c8
-rw-r--r--mupdf/pdf_interpret.c33
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"))
{