summaryrefslogtreecommitdiff
path: root/mupdf
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@hotmail.com>2009-06-23 01:34:57 +0200
committerSebastian Rasmussen <sebras@hotmail.com>2009-06-23 01:34:57 +0200
commit5cd18f797207d359398f37d5029e65d4db22ab00 (patch)
tree5864fd2af83908075ea72b54e2a1bf7f71cf23cd /mupdf
parent44eb22213b1b5573e645a3b464df076a6f667420 (diff)
downloadmupdf-5cd18f797207d359398f37d5029e65d4db22ab00.tar.xz
Preload XObject group attributes properly, including transparency.
Diffstat (limited to 'mupdf')
-rw-r--r--mupdf/mupdf.h1
-rw-r--r--mupdf/pdf_interpret.c17
-rw-r--r--mupdf/pdf_xobject.c35
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)