summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2015-10-05 16:51:32 +0200
committerTor Andersson <tor.andersson@artifex.com>2015-10-06 11:20:30 +0200
commitbff6387d72f873f26f73b78d5f75a40f708197c3 (patch)
treefb8c120f26e0e5758e1b1f507d9e9a48117eed06 /source
parent56c0babe3bd6941382072a5b8209236d801a4201 (diff)
downloadmupdf-bff6387d72f873f26f73b78d5f75a40f708197c3.tar.xz
xps: Simplify transform attribute/tag parsing.
Diffstat (limited to 'source')
-rw-r--r--source/xps/xps-common.c15
-rw-r--r--source/xps/xps-glyphs.c12
-rw-r--r--source/xps/xps-gradient.c13
-rw-r--r--source/xps/xps-path.c14
-rw-r--r--source/xps/xps-tile.c44
5 files changed, 37 insertions, 61 deletions
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;
@@ -171,6 +171,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)
{
float args[4];
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);