diff options
-rw-r--r-- | fitz/fitz.h | 2 | ||||
-rw-r--r-- | fitz/res_path.c | 36 | ||||
-rw-r--r-- | xps/xpspath.c | 11 |
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 |