summaryrefslogtreecommitdiff
path: root/source/xps
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2017-06-12 18:06:08 +0800
committerSebastian Rasmussen <sebras@gmail.com>2017-06-28 22:36:31 +0800
commit4f6cc867cd8b4f69f6cb3203dde5e3e113400101 (patch)
tree1eb72eb73d33e32fd396bd4a1ff570550bb2b9f3 /source/xps
parent08b24ce7759f388ce9059dea987ba99f1ec0288a (diff)
downloadmupdf-4f6cc867cd8b4f69f6cb3203dde5e3e113400101.tar.xz
xps: Make sure to drop path and stroke state in case of error.
Diffstat (limited to 'source/xps')
-rw-r--r--source/xps/xps-path.c119
1 files changed, 62 insertions, 57 deletions
diff --git a/source/xps/xps-path.c b/source/xps/xps-path.c
index c9bd64e0..6faeb0ca 100644
--- a/source/xps/xps-path.c
+++ b/source/xps/xps-path.c
@@ -968,75 +968,80 @@ xps_parse_path(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, char *b
if (clip_att || clip_tag)
xps_clip(ctx, doc, &local_ctm, dict, clip_att, clip_tag);
- fill_rule = 0;
- if (data_att)
- path = xps_parse_abbreviated_geometry(ctx, doc, data_att, &fill_rule);
- else if (data_tag)
+ fz_try(ctx)
{
- path = xps_parse_path_geometry(ctx, doc, dict, data_tag, 0, &fill_rule);
- if (stroke_att || stroke_tag)
- stroke_path = xps_parse_path_geometry(ctx, doc, dict, data_tag, 1, &fill_rule);
- }
- if (!stroke_path)
- stroke_path = path;
+ fill_rule = 0;
+ if (data_att)
+ path = xps_parse_abbreviated_geometry(ctx, doc, data_att, &fill_rule);
+ else if (data_tag)
+ {
+ path = xps_parse_path_geometry(ctx, doc, dict, data_tag, 0, &fill_rule);
+ // /home/sebras/src/jxr/fts_06xx.xps
+ if (stroke_att || stroke_tag)
+ stroke_path = xps_parse_path_geometry(ctx, doc, dict, data_tag, 1, &fill_rule);
+ }
+ if (!stroke_path)
+ stroke_path = path;
- if (stroke_att || stroke_tag)
- {
- fz_bound_path(ctx, stroke_path, stroke, &local_ctm, &area);
- if (stroke_path != path && (fill_att || fill_tag)) {
- fz_rect bounds;
- fz_bound_path(ctx, path, NULL, &local_ctm, &bounds);
- fz_union_rect(&area, &bounds);
+ if (stroke_att || stroke_tag)
+ {
+ fz_bound_path(ctx, stroke_path, stroke, &local_ctm, &area);
+ if (stroke_path != path && (fill_att || fill_tag)) {
+ fz_rect bounds;
+ fz_bound_path(ctx, path, NULL, &local_ctm, &bounds);
+ fz_union_rect(&area, &bounds);
+ }
}
- }
- else
- fz_bound_path(ctx, path, NULL, &local_ctm, &area);
+ else
+ fz_bound_path(ctx, path, NULL, &local_ctm, &area);
- xps_begin_opacity(ctx, doc, &local_ctm, &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);
- if (fill_att)
- {
- xps_parse_color(ctx, doc, base_uri, fill_att, &colorspace, samples);
- if (fill_opacity_att)
- samples[0] *= fz_atof(fill_opacity_att);
- xps_set_color(ctx, doc, colorspace, samples);
+ if (fill_att)
+ {
+ xps_parse_color(ctx, doc, base_uri, fill_att, &colorspace, samples);
+ if (fill_opacity_att)
+ samples[0] *= fz_atof(fill_opacity_att);
+ xps_set_color(ctx, doc, colorspace, samples);
+ fz_fill_path(ctx, dev, path, fill_rule == 0, &local_ctm,
+ doc->colorspace, doc->color, doc->alpha, NULL);
+ }
- fz_fill_path(ctx, dev, path, fill_rule == 0, &local_ctm,
- doc->colorspace, doc->color, doc->alpha, NULL);
- }
+ if (fill_tag)
+ {
+ fz_clip_path(ctx, dev, path, fill_rule == 0, &local_ctm, &area);
+ xps_parse_brush(ctx, doc, &local_ctm, &area, fill_uri, dict, fill_tag);
+ fz_pop_clip(ctx, dev);
+ }
- if (fill_tag)
- {
- fz_clip_path(ctx, dev, path, fill_rule == 0, &local_ctm, &area);
- xps_parse_brush(ctx, doc, &local_ctm, &area, fill_uri, dict, fill_tag);
- fz_pop_clip(ctx, dev);
- }
+ if (stroke_att)
+ {
+ xps_parse_color(ctx, doc, base_uri, stroke_att, &colorspace, samples);
+ if (stroke_opacity_att)
+ samples[0] *= fz_atof(stroke_opacity_att);
+ xps_set_color(ctx, doc, colorspace, samples);
+ fz_stroke_path(ctx, dev, stroke_path, stroke, &local_ctm,
+ doc->colorspace, doc->color, doc->alpha, NULL);
+ }
- if (stroke_att)
- {
- xps_parse_color(ctx, doc, base_uri, stroke_att, &colorspace, samples);
- if (stroke_opacity_att)
- samples[0] *= fz_atof(stroke_opacity_att);
- xps_set_color(ctx, doc, colorspace, samples);
+ if (stroke_tag)
+ {
+ fz_clip_stroke_path(ctx, dev, stroke_path, stroke, &local_ctm, &area);
+ xps_parse_brush(ctx, doc, &local_ctm, &area, stroke_uri, dict, stroke_tag);
+ fz_pop_clip(ctx, dev);
+ }
- fz_stroke_path(ctx, dev, stroke_path, stroke, &local_ctm,
- doc->colorspace, doc->color, doc->alpha, NULL);
+ xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
}
-
- if (stroke_tag)
+ fz_always(ctx)
{
- fz_clip_stroke_path(ctx, dev, stroke_path, stroke, &local_ctm, &area);
- xps_parse_brush(ctx, doc, &local_ctm, &area, stroke_uri, dict, stroke_tag);
- fz_pop_clip(ctx, dev);
+ if (stroke_path != path)
+ fz_drop_path(ctx, stroke_path);
+ fz_drop_path(ctx, path);
+ fz_drop_stroke_state(ctx, stroke);
}
-
- xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
-
- if (stroke_path != path)
- fz_drop_path(ctx, stroke_path);
- fz_drop_path(ctx, path);
- path = NULL;
- fz_drop_stroke_state(ctx, stroke);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
if (clip_att || clip_tag)
fz_pop_clip(ctx, dev);