From bff6387d72f873f26f73b78d5f75a40f708197c3 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 5 Oct 2015 16:51:32 +0200 Subject: xps: Simplify transform attribute/tag parsing. --- source/xps/xps-common.c | 15 +++++++++++++-- source/xps/xps-glyphs.c | 12 ++---------- source/xps/xps-gradient.c | 13 ++++--------- source/xps/xps-path.c | 14 ++------------ source/xps/xps-tile.c | 44 ++++++++++++++++---------------------------- 5 files changed, 37 insertions(+), 61 deletions(-) (limited to 'source') diff --git a/source/xps/xps-common.c b/source/xps/xps-common.c index 667b0631..104b6c1b 100644 --- a/source/xps/xps-common.c +++ b/source/xps/xps-common.c @@ -130,7 +130,7 @@ xps_end_opacity(fz_context *ctx, xps_document *doc, char *base_uri, xps_resource } } -void +static void xps_parse_render_transform(fz_context *ctx, xps_document *doc, char *transform, fz_matrix *matrix) { float args[6]; @@ -155,7 +155,7 @@ xps_parse_render_transform(fz_context *ctx, xps_document *doc, char *transform, matrix->e = args[4]; matrix->f = args[5]; } -void +static void xps_parse_matrix_transform(fz_context *ctx, xps_document *doc, fz_xml *root, fz_matrix *matrix) { char *transform; @@ -170,6 +170,17 @@ xps_parse_matrix_transform(fz_context *ctx, xps_document *doc, fz_xml *root, fz_ } } +void +xps_parse_transform(fz_context *ctx, xps_document *doc, char *att, fz_xml *tag, fz_matrix *transform, const fz_matrix *ctm) +{ + *transform = fz_identity; + if (att) + xps_parse_render_transform(ctx, doc, att, transform); + if (tag) + xps_parse_matrix_transform(ctx, doc, tag, transform); + fz_concat(transform, transform, ctm); +} + void xps_parse_rectangle(fz_context *ctx, xps_document *doc, char *text, fz_rect *rect) { diff --git a/source/xps/xps-glyphs.c b/source/xps/xps-glyphs.c index e15eb726..eea7caa5 100644 --- a/source/xps/xps-glyphs.c +++ b/source/xps/xps-glyphs.c @@ -423,7 +423,7 @@ xps_parse_glyphs(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, fz_text *text; fz_rect area; - fz_matrix local_ctm = *ctm; + fz_matrix local_ctm; /* * Extract attributes and extended attributes. @@ -563,15 +563,7 @@ xps_parse_glyphs(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, * Set up graphics state. */ - if (transform_att || transform_tag) - { - fz_matrix transform; - if (transform_att) - xps_parse_render_transform(ctx, doc, transform_att, &transform); - if (transform_tag) - xps_parse_matrix_transform(ctx, doc, transform_tag, &transform); - fz_concat(&local_ctm, &transform, &local_ctm); - } + xps_parse_transform(ctx, doc, transform_att, transform_tag, &local_ctm, ctm); if (clip_att || clip_tag) xps_clip(ctx, doc, &local_ctm, dict, clip_att, clip_tag); diff --git a/source/xps/xps-gradient.c b/source/xps/xps-gradient.c index 234d6d42..5150ca61 100644 --- a/source/xps/xps-gradient.c +++ b/source/xps/xps-gradient.c @@ -449,7 +449,7 @@ xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ct struct stop stop_list[MAX_STOPS]; int stop_count; - fz_matrix transform; + fz_matrix local_ctm; int spread_method; opacity_att = fz_xml_att(root, "Opacity"); @@ -481,12 +481,7 @@ xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ct spread_method = SPREAD_REPEAT; } - transform = fz_identity; - if (transform_att) - xps_parse_render_transform(ctx, doc, transform_att, &transform); - if (transform_tag) - xps_parse_matrix_transform(ctx, doc, transform_tag, &transform); - fz_concat(&transform, &transform, ctm); + xps_parse_transform(ctx, doc, transform_att, transform_tag, &local_ctm, ctm); if (!stop_tag) { fz_warn(ctx, "missing gradient stops tag"); @@ -500,9 +495,9 @@ xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ct return; } - xps_begin_opacity(ctx, doc, &transform, area, base_uri, dict, opacity_att, NULL); + xps_begin_opacity(ctx, doc, &local_ctm, area, base_uri, dict, opacity_att, NULL); - draw(ctx, doc, &transform, area, stop_list, stop_count, root, spread_method); + draw(ctx, doc, &local_ctm, area, stop_list, stop_count, root, spread_method); xps_end_opacity(ctx, doc, base_uri, dict, opacity_att, NULL); } diff --git a/source/xps/xps-path.c b/source/xps/xps-path.c index 8c352272..1d76a123 100644 --- a/source/xps/xps-path.c +++ b/source/xps/xps-path.c @@ -716,11 +716,7 @@ xps_parse_path_geometry(fz_context *ctx, xps_document *doc, xps_resource *dict, *fill_rule = 0; } - transform = fz_identity; - if (transform_att) - xps_parse_render_transform(ctx, doc, transform_att, &transform); - if (transform_tag) - xps_parse_matrix_transform(ctx, doc, transform_tag, &transform); + xps_parse_transform(ctx, doc, transform_att, transform_tag, &transform, &fz_identity); if (figures_att) path = xps_parse_abbreviated_geometry(ctx, doc, figures_att, fill_rule); @@ -817,7 +813,6 @@ xps_parse_path(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, char *b char *navigate_uri_att; fz_stroke_state *stroke = NULL; - fz_matrix transform; float samples[FZ_MAX_COLORS]; fz_colorspace *colorspace; fz_path *path = NULL; @@ -967,12 +962,7 @@ xps_parse_path(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, char *b } } - transform = fz_identity; - if (transform_att) - xps_parse_render_transform(ctx, doc, transform_att, &transform); - if (transform_tag) - xps_parse_matrix_transform(ctx, doc, transform_tag, &transform); - fz_concat(&local_ctm, &transform, ctm); + xps_parse_transform(ctx, doc, transform_att, transform_tag, &local_ctm, ctm); if (clip_att || clip_tag) xps_clip(ctx, doc, &local_ctm, dict, clip_att, clip_tag); diff --git a/source/xps/xps-tile.c b/source/xps/xps-tile.c index a74ef562..3921d1ce 100644 --- a/source/xps/xps-tile.c +++ b/source/xps/xps-tile.c @@ -81,7 +81,7 @@ xps_parse_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, fz_xml *transform_tag = NULL; - fz_matrix transform; + fz_matrix local_ctm; fz_rect viewbox; fz_rect viewport; float xstep, ystep; @@ -110,12 +110,7 @@ xps_parse_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL); - transform = fz_identity; - if (transform_att) - xps_parse_render_transform(ctx, doc, transform_att, &transform); - if (transform_tag) - xps_parse_matrix_transform(ctx, doc, transform_tag, &transform); - fz_concat(&transform, &transform, ctm); + xps_parse_transform(ctx, doc, transform_att, transform_tag, &local_ctm, ctm); viewbox = fz_unit_rect; if (viewbox_att) @@ -162,18 +157,18 @@ xps_parse_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, if (tile_mode == TILE_FLIP_Y || tile_mode == TILE_FLIP_X_Y) ystep *= 2; - xps_begin_opacity(ctx, doc, &transform, area, base_uri, dict, opacity_att, NULL); + xps_begin_opacity(ctx, doc, &local_ctm, area, base_uri, dict, opacity_att, NULL); - fz_pre_translate(&transform, viewport.x0, viewport.y0); - fz_pre_scale(&transform, xscale, yscale); - fz_pre_translate(&transform, -viewbox.x0, -viewbox.y0); + fz_pre_translate(&local_ctm, viewport.x0, viewport.y0); + fz_pre_scale(&local_ctm, xscale, yscale); + fz_pre_translate(&local_ctm, -viewbox.x0, -viewbox.y0); if (tile_mode != TILE_NONE) { int x0, y0, x1, y1; fz_matrix invctm; fz_rect local_area = *area; - fz_transform_rect(&local_area, fz_invert_matrix(&invctm, &transform)); + fz_transform_rect(&local_area, fz_invert_matrix(&invctm, &local_ctm)); x0 = floorf(local_area.x0 / xstep); y0 = floorf(local_area.y0 / ystep); x1 = ceilf(local_area.x1 / xstep); @@ -188,8 +183,8 @@ xps_parse_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, fz_rect bigview = viewbox; bigview.x1 = bigview.x0 + xstep; bigview.y1 = bigview.y0 + ystep; - fz_begin_tile(ctx, dev, &local_area, &bigview, xstep, ystep, &transform); - xps_paint_tiling_brush(ctx, doc, &transform, &viewbox, tile_mode, &c); + fz_begin_tile(ctx, dev, &local_area, &bigview, xstep, ystep, &local_ctm); + xps_paint_tiling_brush(ctx, doc, &local_ctm, &viewbox, tile_mode, &c); fz_end_tile(ctx, dev); } else @@ -199,7 +194,7 @@ xps_parse_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, { for (x = x0; x < x1; x++) { - fz_matrix ttm = transform; + fz_matrix ttm = local_ctm; fz_pre_translate(&ttm, xstep * x, ystep * y); xps_paint_tiling_brush(ctx, doc, &ttm, &viewbox, tile_mode, &c); } @@ -208,7 +203,7 @@ xps_parse_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, } else { - xps_paint_tiling_brush(ctx, doc, &transform, &viewbox, tile_mode, &c); + xps_paint_tiling_brush(ctx, doc, &local_ctm, &viewbox, tile_mode, &c); } xps_end_opacity(ctx, doc, base_uri, dict, opacity_att, NULL); @@ -267,7 +262,7 @@ xps_parse_canvas(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_xml *clip_tag = NULL; fz_xml *opacity_mask_tag = NULL; - fz_matrix transform; + fz_matrix local_ctm; transform_att = fz_xml_att(root, "RenderTransform"); clip_att = fz_xml_att(root, "Clip"); @@ -307,25 +302,18 @@ xps_parse_canvas(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const xps_resolve_resource_reference(ctx, doc, dict, &clip_att, &clip_tag, NULL); xps_resolve_resource_reference(ctx, doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri); - transform = fz_identity; - if (transform_att) - xps_parse_render_transform(ctx, doc, transform_att, &transform); - if (transform_tag) - xps_parse_matrix_transform(ctx, doc, transform_tag, &transform); - fz_concat(&transform, &transform, ctm); + xps_parse_transform(ctx, doc, transform_att, transform_tag, &local_ctm, ctm); if (navigate_uri_att) xps_add_link(ctx, doc, area, base_uri, navigate_uri_att); if (clip_att || clip_tag) - xps_clip(ctx, doc, &transform, dict, clip_att, clip_tag); + xps_clip(ctx, doc, &local_ctm, dict, clip_att, clip_tag); - xps_begin_opacity(ctx, doc, &transform, area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag); + xps_begin_opacity(ctx, doc, &local_ctm, area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag); for (node = fz_xml_down(root); node; node = fz_xml_next(node)) - { - xps_parse_element(ctx, doc, &transform, area, base_uri, dict, node); - } + xps_parse_element(ctx, doc, &local_ctm, area, base_uri, dict, node); xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag); -- cgit v1.2.3