summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2011-04-01 02:24:08 +0200
committerTor Andersson <tor.andersson@artifex.com>2011-04-01 02:24:08 +0200
commit7c6ae0b110d0a29558305878482023ad7e8a66dc (patch)
treed405a91f844a96051d11db5d80c21cec27361aae
parent9c9674b3081bfd433460be934e2a792390474367 (diff)
downloadmupdf-7c6ae0b110d0a29558305878482023ad7e8a66dc.tar.xz
xps: Respect PathGeometry.Transform attribute.
-rw-r--r--fitz/fitz.h2
-rw-r--r--fitz/res_path.c36
-rw-r--r--xps/xpspath.c11
3 files changed, 41 insertions, 8 deletions
diff --git a/fitz/fitz.h b/fitz/fitz.h
index 5d3ba1c1..5cff40b8 100644
--- a/fitz/fitz.h
+++ b/fitz/fitz.h
@@ -830,6 +830,8 @@ void fz_curvetoy(fz_path*, float, float, float, float);
void fz_closepath(fz_path*);
void fz_freepath(fz_path *path);
+void fz_transformpath(fz_path *path, fz_matrix transform);
+
fz_path *fz_clonepath(fz_path *old);
fz_rect fz_boundpath(fz_path *path, fz_strokestate *stroke, fz_matrix ctm);
diff --git a/fitz/res_path.c b/fitz/res_path.c
index ebfb3cdc..b4ac415a 100644
--- a/fitz/res_path.c
+++ b/fitz/res_path.c
@@ -171,6 +171,42 @@ fz_boundpath(fz_path *path, fz_strokestate *stroke, fz_matrix ctm)
}
void
+fz_transformpath(fz_path *path, fz_matrix ctm)
+{
+ fz_point p;
+ int k, i = 0;
+
+ while (i < path->len)
+ {
+ switch (path->els[i++].k)
+ {
+ case FZ_CURVETO:
+ for (k = 0; k < 3; k++)
+ {
+ p.x = path->els[i].v;
+ p.y = path->els[i+1].v;
+ p = fz_transformpoint(ctm, p);
+ path->els[i].v = p.x;
+ path->els[i+1].v = p.y;
+ i += 2;
+ }
+ break;
+ case FZ_MOVETO:
+ case FZ_LINETO:
+ p.x = path->els[i].v;
+ p.y = path->els[i+1].v;
+ p = fz_transformpoint(ctm, p);
+ path->els[i].v = p.x;
+ path->els[i+1].v = p.y;
+ i += 2;
+ break;
+ case FZ_CLOSEPATH:
+ break;
+ }
+ }
+}
+
+void
fz_debugpath(fz_path *path, int indent)
{
float x, y;
diff --git a/xps/xpspath.c b/xps/xpspath.c
index d442698d..dd0d2ef3 100644
--- a/xps/xpspath.c
+++ b/xps/xpspath.c
@@ -741,25 +741,20 @@ xps_parse_path_geometry(xps_context *ctx, xps_resource *dict, xps_item *root, in
xps_parse_render_transform(ctx, transform_att, &transform);
if (transform_tag)
xps_parse_matrix_transform(ctx, transform_tag, &transform);
- // TODO: apply matrix
- if (transform_att || transform_tag)
- fz_warn("ignoring PathGeometry.Transform attribute");
if (figures_att)
- {
xps_parse_abbreviated_geometry(ctx, figures_att);
- }
-
if (figures_tag)
- {
xps_parse_path_figure(ctx, figures_tag, stroking);
- }
for (node = xps_down(root); node; node = xps_next(node))
{
if (!strcmp(xps_tag(node), "PathFigure"))
xps_parse_path_figure(ctx, node, stroking);
}
+
+ if (transform_att || transform_tag)
+ fz_transformpath(ctx->path, transform);
}
static int