summaryrefslogtreecommitdiff
path: root/source/xps
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2017-12-07 15:15:26 +0100
committerTor Andersson <tor.andersson@artifex.com>2017-12-13 15:01:05 +0100
commiteacd070190d0c7a7fbc905a2a292f38e282b5a82 (patch)
tree57971ec5acec6b5867cc313c3d2f6f6f619e35fe /source/xps
parentfa9cd085533f68367c299e058ab3fbb7ad8a2dc6 (diff)
downloadmupdf-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.c92
-rw-r--r--source/xps/xps-imp.h4
-rw-r--r--source/xps/xps-link.c10
-rw-r--r--source/xps/xps-outline.c23
-rw-r--r--source/xps/xps-resource.c45
-rw-r--r--source/xps/xps-tile.c7
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))
{