diff options
-rw-r--r-- | mupdf/mupdf.h | 1 | ||||
-rw-r--r-- | mupdf/pdf_interpret.c | 17 | ||||
-rw-r--r-- | mupdf/pdf_xobject.c | 35 |
3 files changed, 35 insertions, 18 deletions
diff --git a/mupdf/mupdf.h b/mupdf/mupdf.h index 9100edee..bd19bf14 100644 --- a/mupdf/mupdf.h +++ b/mupdf/mupdf.h @@ -277,6 +277,7 @@ struct pdf_xobject_s fz_rect bbox; int isolated; int knockout; + int transparency; fz_obj *resources; fz_buffer *contents; }; diff --git a/mupdf/pdf_interpret.c b/mupdf/pdf_interpret.c index 7b6c5b9d..e55f029e 100644 --- a/mupdf/pdf_interpret.c +++ b/mupdf/pdf_interpret.c @@ -155,7 +155,7 @@ pdf_dropcsi(pdf_csi *csi) */ static fz_error -runxobject(pdf_csi *csi, pdf_xref *xref, pdf_xobject *xobj, int istransparency) +runxobject(pdf_csi *csi, pdf_xref *xref, pdf_xobject *xobj) { fz_error error; fz_node *transform; @@ -174,7 +174,7 @@ runxobject(pdf_csi *csi, pdf_xref *xref, pdf_xobject *xobj, int istransparency) gstate->fill.parentalpha = gstate->fill.alpha; /* reset alpha to 1.0 when starting a new Transparency group */ - if (istransparency) + if (xobj->transparency) { gstate->stroke.alpha = gstate->stroke.parentalpha; gstate->fill.alpha = gstate->fill.parentalpha; @@ -919,23 +919,12 @@ Lsetcolor: if (xobj) { - int istransparency = 0; - /* Inherit parent resources, in case this one was empty */ if (!xobj->resources) xobj->resources = fz_keepobj(rdb); clearstack(csi); - /* check if it is a Transparency group */ - obj = fz_dictgets(dict, "Group"); - if (obj) { - obj = fz_dictgets(obj, "S"); - - if (!strcmp(fz_toname(obj), "Transparency")) - istransparency = 1; - } - - error = runxobject(csi, xref, xobj, istransparency); + error = runxobject(csi, xref, xobj); if (error) return fz_rethrow(error, "cannot draw xobject"); } diff --git a/mupdf/pdf_xobject.c b/mupdf/pdf_xobject.c index 8bb802a5..7c425fc0 100644 --- a/mupdf/pdf_xobject.c +++ b/mupdf/pdf_xobject.c @@ -51,13 +51,40 @@ pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict, fz_obj *ref) form->matrix.c, form->matrix.d, form->matrix.e, form->matrix.f); - obj = fz_dictgets(dict, "I"); - form->isolated = fz_tobool(obj); - obj = fz_dictgets(dict, "K"); - form->knockout = fz_tobool(obj); + form->isolated = 0; + form->knockout = 0; + form->transparency = 0; + + obj = fz_dictgets(dict, "Group"); + if (obj) + { + fz_obj *attrs = obj; + + error = pdf_resolve(&attrs, xref); + if (error) + { + fz_dropobj(attrs); + error = fz_rethrow(error, "cannot resolve xobject group attributes"); + goto cleanup; + } + + obj = fz_dictgets(attrs, "I"); + form->isolated = fz_tobool(obj); + obj = fz_dictgets(attrs, "K"); + form->knockout = fz_tobool(obj); + + obj = fz_dictgets(attrs, "S"); + if (!strcmp(fz_toname(obj), "Transparency")) + { + form->transparency = 1; + } + + fz_dropobj(attrs); + } pdf_logrsrc("isolated %d\n", form->isolated); pdf_logrsrc("knockout %d\n", form->knockout); + pdf_logrsrc("transparency %d\n", form->transparency); obj = fz_dictgets(dict, "Resources"); if (obj) |