summaryrefslogtreecommitdiff
path: root/pdf/pdf_interpret.c
diff options
context:
space:
mode:
Diffstat (limited to 'pdf/pdf_interpret.c')
-rw-r--r--pdf/pdf_interpret.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/pdf/pdf_interpret.c b/pdf/pdf_interpret.c
index e7555e24..21039f8c 100644
--- a/pdf/pdf_interpret.c
+++ b/pdf/pdf_interpret.c
@@ -82,6 +82,8 @@ struct pdf_csi_s
/* path object state */
fz_path *path;
+ int clip;
+ int clip_even_odd;
/* text object state */
fz_text *text;
@@ -241,14 +243,6 @@ pdf_show_image(pdf_csi *csi, fz_pixmap *image)
pdf_end_group(csi);
}
-static void pdf_show_clip(pdf_csi *csi, int even_odd)
-{
- pdf_gstate *gstate = csi->gstate + csi->gtop;
-
- gstate->clip_depth++;
- fz_clip_path(csi->dev, csi->path, NULL, even_odd, gstate->ctm);
-}
-
static void
pdf_show_path(pdf_csi *csi, int doclose, int dofill, int dostroke, int even_odd)
{
@@ -271,6 +265,12 @@ pdf_show_path(pdf_csi *csi, int doclose, int dofill, int dostroke, int even_odd)
if (dofill || dostroke)
pdf_begin_group(csi, bbox);
+ if (csi->clip)
+ {
+ gstate->clip_depth++;
+ fz_clip_path(csi->dev, path, NULL, csi->clip_even_odd, gstate->ctm);
+ }
+
if (dofill)
{
switch (gstate->fill.kind)
@@ -674,7 +674,9 @@ pdf_new_csi(pdf_xref *xref, fz_device *dev, fz_matrix ctm, char *target)
csi->xbalance = 0;
csi->in_text = 0;
- csi->path = fz_new_path(dev->ctx);
+ csi->path = fz_new_path(xref->ctx);
+ csi->clip = 0;
+ csi->clip_even_odd = 0;
csi->text = NULL;
csi->tlm = fz_identity;
@@ -1090,7 +1092,7 @@ pdf_run_xobject(pdf_csi *csi, fz_obj *resources, pdf_xobject *xobj, fz_matrix tr
fz_lineto(ctx, csi->path, xobj->bbox.x1, xobj->bbox.y1);
fz_lineto(ctx, csi->path, xobj->bbox.x0, xobj->bbox.y1);
fz_closepath(ctx, csi->path);
- pdf_show_clip(csi, 0);
+ csi->clip = 1;
pdf_show_path(csi, 0, 0, 0, 0);
/* run contents */
@@ -1702,12 +1704,14 @@ static void pdf_run_TJ(pdf_csi *csi)
static void pdf_run_W(pdf_csi *csi)
{
- pdf_show_clip(csi, 0);
+ csi->clip = 1;
+ csi->clip_even_odd = 0;
}
static void pdf_run_Wstar(pdf_csi *csi)
{
- pdf_show_clip(csi, 1);
+ csi->clip = 1;
+ csi->clip_even_odd = 1;
}
static void pdf_run_b(pdf_csi *csi)