diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2017-12-07 15:15:26 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2017-12-13 15:01:05 +0100 |
commit | eacd070190d0c7a7fbc905a2a292f38e282b5a82 (patch) | |
tree | 57971ec5acec6b5867cc313c3d2f6f6f619e35fe /source/xps | |
parent | fa9cd085533f68367c299e058ab3fbb7ad8a2dc6 (diff) | |
download | mupdf-eacd070190d0c7a7fbc905a2a292f38e282b5a82.tar.xz |
Parse XML using pool allocator.
This needs adding a fz_xml_doc type to hold the pool.
Diffstat (limited to 'source/xps')
-rw-r--r-- | source/xps/xps-doc.c | 92 | ||||
-rw-r--r-- | source/xps/xps-imp.h | 4 | ||||
-rw-r--r-- | source/xps/xps-link.c | 10 | ||||
-rw-r--r-- | source/xps/xps-outline.c | 23 | ||||
-rw-r--r-- | source/xps/xps-resource.c | 45 | ||||
-rw-r--r-- | source/xps/xps-tile.c | 7 |
6 files changed, 79 insertions, 102 deletions
diff --git a/source/xps/xps-doc.c b/source/xps/xps-doc.c index 9be8dec1..a58aab72 100644 --- a/source/xps/xps-doc.c +++ b/source/xps/xps-doc.c @@ -237,7 +237,7 @@ xps_parse_metadata_imp(fz_context *ctx, xps_document *doc, fz_xml *item, xps_fix static void xps_parse_metadata(fz_context *ctx, xps_document *doc, xps_part *part, xps_fixdoc *fixdoc) { - fz_xml *root; + fz_xml_doc *xml; char buf[1024]; char *s; @@ -258,9 +258,9 @@ xps_parse_metadata(fz_context *ctx, xps_document *doc, xps_part *part, xps_fixdo doc->base_uri = buf; doc->part_uri = part->name; - root = fz_parse_xml(ctx, part->data, 0); - xps_parse_metadata_imp(ctx, doc, root, fixdoc); - fz_drop_xml(ctx, root); + xml = fz_parse_xml(ctx, part->data, 0); + xps_parse_metadata_imp(ctx, doc, fz_xml_root(xml), fixdoc); + fz_drop_xml(ctx, xml); doc->base_uri = NULL; doc->part_uri = NULL; @@ -325,68 +325,56 @@ xps_count_pages(fz_context *ctx, fz_document *doc_) return doc->page_count; } -static fz_xml * +static fz_xml_doc * xps_load_fixed_page(fz_context *ctx, xps_document *doc, xps_fixpage *page) { xps_part *part; - fz_xml *root = NULL; + fz_xml_doc *xml = NULL; + fz_xml *root; char *width_att; char *height_att; part = xps_read_part(ctx, doc, page->name); fz_try(ctx) { - root = fz_parse_xml(ctx, part->data, 0); - } - fz_always(ctx) - { - xps_drop_part(ctx, doc, part); - } - fz_catch(ctx) - { - fz_rethrow_if(ctx, FZ_ERROR_TRYLATER); - root = NULL; - } - if (!root) - fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing root element"); + xml = fz_parse_xml(ctx, part->data, 0); - if (fz_xml_is_tag(root, "AlternateContent")) - { - fz_xml *node = xps_lookup_alternate_content(ctx, doc, root); - if (!node) + root = fz_xml_root(xml); + if (!root) + fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing root element"); + + if (fz_xml_is_tag(root, "AlternateContent")) { - fz_drop_xml(ctx, root); - fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing alternate root element"); + fz_xml *node = xps_lookup_alternate_content(ctx, doc, root); + if (!node) + fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing alternate root element"); + fz_detach_xml(ctx, xml, node); + root = node; } - fz_detach_xml(node); - fz_drop_xml(ctx, root); - root = node; - } - if (!fz_xml_is_tag(root, "FixedPage")) - { - fz_drop_xml(ctx, root); - fz_throw(ctx, FZ_ERROR_GENERIC, "expected FixedPage element"); + if (!fz_xml_is_tag(root, "FixedPage")) + fz_throw(ctx, FZ_ERROR_GENERIC, "expected FixedPage element"); + width_att = fz_xml_att(root, "Width"); + if (!width_att) + fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Width"); + height_att = fz_xml_att(root, "Height"); + if (!height_att) + fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Height"); + + page->width = atoi(width_att); + page->height = atoi(height_att); } - - width_att = fz_xml_att(root, "Width"); - if (!width_att) + fz_always(ctx) { - fz_drop_xml(ctx, root); - fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Width"); + xps_drop_part(ctx, doc, part); } - - height_att = fz_xml_att(root, "Height"); - if (!height_att) + fz_catch(ctx) { - fz_drop_xml(ctx, root); - fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Height"); + fz_drop_xml(ctx, xml); + fz_rethrow(ctx); } - page->width = atoi(width_att); - page->height = atoi(height_att); - - return root; + return xml; } static fz_rect * @@ -404,7 +392,7 @@ xps_drop_page_imp(fz_context *ctx, fz_page *page_) { xps_page *page = (xps_page*)page_; fz_drop_document(ctx, &page->doc->super); - fz_drop_xml(ctx, page->root); + fz_drop_xml(ctx, page->xml); } fz_page * @@ -413,7 +401,7 @@ xps_load_page(fz_context *ctx, fz_document *doc_, int number) xps_document *doc = (xps_document*)doc_; xps_page *page = NULL; xps_fixpage *fix; - fz_xml *root; + fz_xml_doc *xml; int n = 0; fz_var(page); @@ -422,7 +410,7 @@ xps_load_page(fz_context *ctx, fz_document *doc_, int number) { if (n == number) { - root = xps_load_fixed_page(ctx, doc, fix); + xml = xps_load_fixed_page(ctx, doc, fix); fz_try(ctx) { page = fz_new_derived_page(ctx, xps_page); @@ -433,11 +421,11 @@ xps_load_page(fz_context *ctx, fz_document *doc_, int number) page->doc = (xps_document*) fz_keep_document(ctx, (fz_document*)doc); page->fix = fix; - page->root = root; + page->xml = xml; } fz_catch(ctx) { - fz_drop_xml(ctx, root); + fz_drop_xml(ctx, xml); fz_rethrow(ctx); } return (fz_page*)page; diff --git a/source/xps/xps-imp.h b/source/xps/xps-imp.h index 7eff5670..1d2baaf0 100644 --- a/source/xps/xps-imp.h +++ b/source/xps/xps-imp.h @@ -69,7 +69,7 @@ struct xps_page_s fz_page super; xps_document *doc; xps_fixpage *fix; - fz_xml *root; + fz_xml_doc *xml; }; struct xps_target_s @@ -126,7 +126,7 @@ struct xps_resource_s { char *name; char *base_uri; /* only used in the head nodes */ - fz_xml *base_xml; /* only used in the head nodes, to free the xml document */ + fz_xml_doc *base_xml; /* only used in the head nodes, to free the xml document */ fz_xml *data; xps_resource *next; xps_resource *parent; /* up to the previous dict in the stack */ diff --git a/source/xps/xps-link.c b/source/xps/xps-link.c index c26a8d99..59b4d1a5 100644 --- a/source/xps/xps-link.c +++ b/source/xps/xps-link.c @@ -161,12 +161,14 @@ xps_load_links_in_element(fz_context *ctx, xps_document *doc, const fz_matrix *c static void xps_load_links_in_fixed_page(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, xps_page *page, fz_link **link) { - fz_xml *node, *resource_tag; + fz_xml *root, *node, *resource_tag; xps_resource *dict = NULL; char base_uri[1024]; char *s; - if (!page->root) + root = fz_xml_root(page->xml); + + if (!root) return; fz_strlcpy(base_uri, page->fix->name, sizeof base_uri); @@ -174,11 +176,11 @@ xps_load_links_in_fixed_page(fz_context *ctx, xps_document *doc, const fz_matrix if (s) s[1] = 0; - resource_tag = fz_xml_down(fz_xml_find_down(page->root, "FixedPage.Resources")); + resource_tag = fz_xml_down(fz_xml_find_down(root, "FixedPage.Resources")); if (resource_tag) dict = xps_parse_resource_dictionary(ctx, doc, base_uri, resource_tag); - for (node = fz_xml_down(page->root); node; node = fz_xml_next(node)) + for (node = fz_xml_down(root); node; node = fz_xml_next(node)) xps_load_links_in_element(ctx, doc, ctm, base_uri, dict, node, link); if (dict) diff --git a/source/xps/xps-outline.c b/source/xps/xps-outline.c index 61736992..bf43f251 100644 --- a/source/xps/xps-outline.c +++ b/source/xps/xps-outline.c @@ -83,37 +83,26 @@ static fz_outline * xps_load_document_structure(fz_context *ctx, xps_document *doc, xps_fixdoc *fixdoc) { xps_part *part; - fz_xml *root = NULL; + fz_xml_doc *xml = NULL; fz_outline *outline = NULL; + fz_var(xml); + part = xps_read_part(ctx, doc, fixdoc->outline); fz_try(ctx) { - root = fz_parse_xml(ctx, part->data, 0); + xml = fz_parse_xml(ctx, part->data, 0); + outline = xps_parse_document_structure(ctx, doc, fz_xml_root(xml)); } fz_always(ctx) { + fz_drop_xml(ctx, xml); xps_drop_part(ctx, doc, part); } fz_catch(ctx) { fz_rethrow(ctx); } - if (!root) - return NULL; - - fz_try(ctx) - { - outline = xps_parse_document_structure(ctx, doc, root); - } - fz_always(ctx) - { - fz_drop_xml(ctx, root); - } - fz_catch(ctx) - { - fz_rethrow(ctx); - } return outline; } diff --git a/source/xps/xps-resource.c b/source/xps/xps-resource.c index 8e81ab83..4a344902 100644 --- a/source/xps/xps-resource.c +++ b/source/xps/xps-resource.c @@ -59,48 +59,45 @@ xps_parse_remote_resource_dictionary(fz_context *ctx, xps_document *doc, char *b { char part_name[1024]; char part_uri[1024]; - xps_resource *dict; xps_part *part; - fz_xml *xml = NULL; + xps_resource *dict = NULL; + fz_xml_doc *xml = NULL; char *s; + fz_var(xml); + /* External resource dictionaries MUST NOT reference other resource dictionaries */ xps_resolve_url(ctx, doc, part_name, base_uri, source_att, sizeof part_name); + part = xps_read_part(ctx, doc, part_name); fz_try(ctx) { xml = fz_parse_xml(ctx, part->data, 0); + if (!fz_xml_is_tag(fz_xml_root(xml), "ResourceDictionary")) + fz_throw(ctx, FZ_ERROR_GENERIC, "expected ResourceDictionary element"); + + fz_strlcpy(part_uri, part_name, sizeof part_uri); + s = strrchr(part_uri, '/'); + if (s) + s[1] = 0; + + dict = xps_parse_resource_dictionary(ctx, doc, part_uri, fz_xml_root(xml)); + if (dict) + { + dict->base_xml = xml; /* pass on ownership */ + xml = NULL; + } } fz_always(ctx) { xps_drop_part(ctx, doc, part); + fz_drop_xml(ctx, xml); } fz_catch(ctx) { - fz_rethrow_if(ctx, FZ_ERROR_TRYLATER); - xml = NULL; + fz_rethrow(ctx); } - if (!xml) - return NULL; - - if (!fz_xml_is_tag(xml, "ResourceDictionary")) - { - fz_drop_xml(ctx, xml); - fz_throw(ctx, FZ_ERROR_GENERIC, "expected ResourceDictionary element"); - } - - fz_strlcpy(part_uri, part_name, sizeof part_uri); - s = strrchr(part_uri, '/'); - if (s) - s[1] = 0; - - dict = xps_parse_resource_dictionary(ctx, doc, part_uri, xml); - if (dict) - dict->base_xml = xml; /* pass on ownership */ - else - fz_drop_xml(ctx, xml); - return dict; } diff --git a/source/xps/xps-tile.c b/source/xps/xps-tile.c index f0e196a0..3e144123 100644 --- a/source/xps/xps-tile.c +++ b/source/xps/xps-tile.c @@ -331,7 +331,7 @@ xps_parse_canvas(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const void xps_parse_fixed_page(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, xps_page *page) { - fz_xml *node; + fz_xml *root, *node; xps_resource *dict; char base_uri[1024]; fz_rect area; @@ -348,7 +348,8 @@ xps_parse_fixed_page(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, x doc->opacity_top = 0; doc->opacity[0] = 1; - if (!page->root) + root = fz_xml_root(page->xml); + if (!root) return; area = fz_unit_rect; @@ -356,7 +357,7 @@ xps_parse_fixed_page(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, x fz_try(ctx) { - for (node = fz_xml_down(page->root); node; node = fz_xml_next(node)) + for (node = fz_xml_down(root); node; node = fz_xml_next(node)) { if (fz_xml_is_tag(node, "FixedPage.Resources") && fz_xml_down(node)) { |