summaryrefslogtreecommitdiff
path: root/source/xps
diff options
context:
space:
mode:
Diffstat (limited to 'source/xps')
-rw-r--r--source/xps/xps-common.c56
-rw-r--r--source/xps/xps-doc.c269
-rw-r--r--source/xps/xps-glyphs.c123
-rw-r--r--source/xps/xps-gradient.c96
-rw-r--r--source/xps/xps-image.c50
-rw-r--r--source/xps/xps-outline.c56
-rw-r--r--source/xps/xps-path.c259
-rw-r--r--source/xps/xps-resource.c47
-rw-r--r--source/xps/xps-tile.c131
-rw-r--r--source/xps/xps-util.c12
-rw-r--r--source/xps/xps-zip.c90
11 files changed, 599 insertions, 590 deletions
diff --git a/source/xps/xps-common.c b/source/xps/xps-common.c
index 04b78d2b..667b0631 100644
--- a/source/xps/xps-common.c
+++ b/source/xps/xps-common.c
@@ -9,7 +9,7 @@ static inline int unhex(int a)
}
fz_xml *
-xps_lookup_alternate_content(fz_xml *node)
+xps_lookup_alternate_content(fz_context *ctx, xps_document *doc, fz_xml *node)
{
for (node = fz_xml_down(node); node; node = fz_xml_next(node))
{
@@ -29,48 +29,49 @@ xps_lookup_alternate_content(fz_xml *node)
}
void
-xps_parse_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node)
+xps_parse_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node)
{
if (doc->cookie && doc->cookie->abort)
return;
/* SolidColorBrushes are handled in a special case and will never show up here */
if (fz_xml_is_tag(node, "ImageBrush"))
- xps_parse_image_brush(doc, ctm, area, base_uri, dict, node);
+ xps_parse_image_brush(ctx, doc, ctm, area, base_uri, dict, node);
else if (fz_xml_is_tag(node, "VisualBrush"))
- xps_parse_visual_brush(doc, ctm, area, base_uri, dict, node);
+ xps_parse_visual_brush(ctx, doc, ctm, area, base_uri, dict, node);
else if (fz_xml_is_tag(node, "LinearGradientBrush"))
- xps_parse_linear_gradient_brush(doc, ctm, area, base_uri, dict, node);
+ xps_parse_linear_gradient_brush(ctx, doc, ctm, area, base_uri, dict, node);
else if (fz_xml_is_tag(node, "RadialGradientBrush"))
- xps_parse_radial_gradient_brush(doc, ctm, area, base_uri, dict, node);
+ xps_parse_radial_gradient_brush(ctx, doc, ctm, area, base_uri, dict, node);
else
- fz_warn(doc->ctx, "unknown brush tag: %s", fz_xml_tag(node));
+ fz_warn(ctx, "unknown brush tag: %s", fz_xml_tag(node));
}
void
-xps_parse_element(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node)
+xps_parse_element(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node)
{
if (doc->cookie && doc->cookie->abort)
return;
if (fz_xml_is_tag(node, "Path"))
- xps_parse_path(doc, ctm, base_uri, dict, node);
+ xps_parse_path(ctx, doc, ctm, base_uri, dict, node);
if (fz_xml_is_tag(node, "Glyphs"))
- xps_parse_glyphs(doc, ctm, base_uri, dict, node);
+ xps_parse_glyphs(ctx, doc, ctm, base_uri, dict, node);
if (fz_xml_is_tag(node, "Canvas"))
- xps_parse_canvas(doc, ctm, area, base_uri, dict, node);
+ xps_parse_canvas(ctx, doc, ctm, area, base_uri, dict, node);
if (fz_xml_is_tag(node, "AlternateContent"))
{
- node = xps_lookup_alternate_content(node);
+ node = xps_lookup_alternate_content(ctx, doc, node);
if (node)
- xps_parse_element(doc, ctm, area, base_uri, dict, node);
+ xps_parse_element(ctx, doc, ctm, area, base_uri, dict, node);
}
/* skip unknown tags (like Foo.Resources and similar) */
}
void
-xps_begin_opacity(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_begin_opacity(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict,
char *opacity_att, fz_xml *opacity_mask_tag)
{
+ fz_device *dev = doc->dev;
float opacity;
if (!opacity_att && !opacity_mask_tag)
@@ -90,7 +91,7 @@ xps_begin_opacity(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
{
fz_colorspace *colorspace;
float samples[FZ_MAX_COLORS];
- xps_parse_color(doc, base_uri, scb_color_att, &colorspace, samples);
+ xps_parse_color(ctx, doc, base_uri, scb_color_att, &colorspace, samples);
opacity = opacity * samples[0];
}
opacity_mask_tag = NULL;
@@ -104,16 +105,18 @@ xps_begin_opacity(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
if (opacity_mask_tag)
{
- fz_begin_mask(doc->dev, area, 0, NULL, NULL);
- xps_parse_brush(doc, ctm, area, base_uri, dict, opacity_mask_tag);
- fz_end_mask(doc->dev);
+ fz_begin_mask(ctx, dev, area, 0, NULL, NULL);
+ xps_parse_brush(ctx, doc, ctm, area, base_uri, dict, opacity_mask_tag);
+ fz_end_mask(ctx, dev);
}
}
void
-xps_end_opacity(xps_document *doc, char *base_uri, xps_resource *dict,
+xps_end_opacity(fz_context *ctx, xps_document *doc, char *base_uri, xps_resource *dict,
char *opacity_att, fz_xml *opacity_mask_tag)
{
+ fz_device *dev = doc->dev;
+
if (!opacity_att && !opacity_mask_tag)
return;
@@ -123,12 +126,12 @@ xps_end_opacity(xps_document *doc, char *base_uri, xps_resource *dict,
if (opacity_mask_tag)
{
if (strcmp(fz_xml_tag(opacity_mask_tag), "SolidColorBrush"))
- fz_pop_clip(doc->dev);
+ fz_pop_clip(ctx, dev);
}
}
void
-xps_parse_render_transform(xps_document *doc, char *transform, fz_matrix *matrix)
+xps_parse_render_transform(fz_context *ctx, xps_document *doc, char *transform, fz_matrix *matrix)
{
float args[6];
char *s = transform;
@@ -153,7 +156,7 @@ xps_parse_render_transform(xps_document *doc, char *transform, fz_matrix *matrix
}
void
-xps_parse_matrix_transform(xps_document *doc, fz_xml *root, fz_matrix *matrix)
+xps_parse_matrix_transform(fz_context *ctx, xps_document *doc, fz_xml *root, fz_matrix *matrix)
{
char *transform;
@@ -163,12 +166,12 @@ xps_parse_matrix_transform(xps_document *doc, fz_xml *root, fz_matrix *matrix)
{
transform = fz_xml_att(root, "Matrix");
if (transform)
- xps_parse_render_transform(doc, transform, matrix);
+ xps_parse_render_transform(ctx, doc, transform, matrix);
}
}
void
-xps_parse_rectangle(xps_document *doc, char *text, fz_rect *rect)
+xps_parse_rectangle(fz_context *ctx, xps_document *doc, char *text, fz_rect *rect)
{
float args[4];
char *s = text;
@@ -205,10 +208,9 @@ static int count_commas(char *s)
}
void
-xps_parse_color(xps_document *doc, char *base_uri, char *string,
+xps_parse_color(fz_context *ctx, xps_document *doc, char *base_uri, char *string,
fz_colorspace **csp, float *samples)
{
- fz_context *ctx = doc->ctx;
char *p;
int i, n;
char buf[1024];
@@ -307,7 +309,7 @@ xps_parse_color(xps_document *doc, char *base_uri, char *string,
}
void
-xps_set_color(xps_document *doc, fz_colorspace *colorspace, float *samples)
+xps_set_color(fz_context *ctx, xps_document *doc, fz_colorspace *colorspace, float *samples)
{
int i;
doc->colorspace = colorspace;
diff --git a/source/xps/xps-doc.c b/source/xps/xps-doc.c
index 2b8cee8e..41823d56 100644
--- a/source/xps/xps-doc.c
+++ b/source/xps/xps-doc.c
@@ -15,7 +15,7 @@
"http://schemas.openxps.org/oxps/v1.0/documentstructure"
static void
-xps_rels_for_part(char *buf, char *name, int buflen)
+xps_rels_for_part(fz_context *ctx, xps_document *doc, char *buf, char *name, int buflen)
{
char *p, *basename;
p = strrchr(name, '/');
@@ -34,10 +34,10 @@ xps_rels_for_part(char *buf, char *name, int buflen)
*/
void
-xps_print_page_list(xps_document *doc)
+xps_print_page_list(fz_context *ctx, xps_document *doc)
{
xps_fixdoc *fixdoc = doc->first_fixdoc;
- xps_page *page = doc->first_page;
+ xps_fixpage *page = doc->first_page;
if (doc->start_part)
printf("start part %s\n", doc->start_part);
@@ -56,7 +56,7 @@ xps_print_page_list(xps_document *doc)
}
static void
-xps_add_fixed_document(xps_document *doc, char *name)
+xps_add_fixed_document(fz_context *ctx, xps_document *doc, char *name)
{
xps_fixdoc *fixdoc;
@@ -65,8 +65,8 @@ xps_add_fixed_document(xps_document *doc, char *name)
if (!strcmp(fixdoc->name, name))
return;
- fixdoc = fz_malloc_struct(doc->ctx, xps_fixdoc);
- fixdoc->name = fz_strdup(doc->ctx, name);
+ fixdoc = fz_malloc_struct(ctx, xps_fixdoc);
+ fixdoc->name = fz_strdup(ctx, name);
fixdoc->outline = NULL;
fixdoc->next = NULL;
@@ -83,7 +83,7 @@ xps_add_fixed_document(xps_document *doc, char *name)
}
void
-xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *target_uri)
+xps_add_link(fz_context *ctx, xps_document *doc, const fz_rect *area, char *base_uri, char *target_uri)
{
int len;
char *buffer = NULL;
@@ -91,7 +91,6 @@ xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *targe
xps_target *target;
fz_link_dest dest;
fz_link *link;
- fz_context *ctx = doc->ctx;
fz_var(buffer);
@@ -102,9 +101,9 @@ xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *targe
{
len = 2 + (base_uri ? strlen(base_uri) : 0) +
(target_uri ? strlen(target_uri) : 0);
- buffer = fz_malloc(doc->ctx, len);
- xps_resolve_url(buffer, base_uri, target_uri, len);
- if (xps_url_is_remote(buffer))
+ buffer = fz_malloc(ctx, len);
+ xps_resolve_url(ctx, doc, buffer, base_uri, target_uri, len);
+ if (xps_url_is_remote(ctx, doc, buffer))
{
dest.kind = FZ_LINK_URI;
dest.ld.uri.is_map = 0;
@@ -140,13 +139,13 @@ xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *targe
dest.ld.gotor.new_window = 0;
}
- link = fz_new_link(doc->ctx, area, dest);
+ link = fz_new_link(ctx, area, dest);
link->next = doc->current_page->links;
doc->current_page->links = link;
}
fz_always(ctx)
{
- fz_free(doc->ctx, buffer);
+ fz_free(ctx, buffer);
}
fz_catch(ctx)
{
@@ -154,32 +153,23 @@ xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *targe
}
}
-fz_link *
-xps_load_links(xps_document *doc, xps_page *page)
-{
- if (!page->links_resolved)
- fz_warn(doc->ctx, "xps_load_links before page has been executed!");
- return fz_keep_link(doc->ctx, page->links);
-}
-
static void
-xps_add_fixed_page(xps_document *doc, char *name, int width, int height)
+xps_add_fixed_page(fz_context *ctx, xps_document *doc, char *name, int width, int height)
{
- xps_page *page;
+ xps_fixpage *page;
/* Check for duplicates first */
for (page = doc->first_page; page; page = page->next)
if (!strcmp(page->name, name))
return;
- page = fz_malloc_struct(doc->ctx, xps_page);
- page->name = fz_strdup(doc->ctx, name);
+ page = fz_malloc_struct(ctx, xps_fixpage);
+ page->name = fz_strdup(ctx, name);
page->number = doc->page_count++;
page->width = width;
page->height = height;
page->links = NULL;
page->links_resolved = 0;
- page->root = NULL;
page->next = NULL;
if (!doc->first_page)
@@ -195,18 +185,18 @@ xps_add_fixed_page(xps_document *doc, char *name, int width, int height)
}
static void
-xps_add_link_target(xps_document *doc, char *name)
+xps_add_link_target(fz_context *ctx, xps_document *doc, char *name)
{
- xps_page *page = doc->last_page;
- xps_target *target = fz_malloc_struct(doc->ctx, xps_target);
- target->name = fz_strdup(doc->ctx, name);
+ xps_fixpage *page = doc->last_page;
+ xps_target *target = fz_malloc_struct(ctx, xps_target);
+ target->name = fz_strdup(ctx, name);
target->page = page->number;
target->next = doc->target;
doc->target = target;
}
int
-xps_lookup_link_target(xps_document *doc, char *target_uri)
+xps_lookup_link_target(fz_context *ctx, xps_document *doc, char *target_uri)
{
xps_target *target;
char *needle = strrchr(target_uri, '#');
@@ -218,29 +208,28 @@ xps_lookup_link_target(xps_document *doc, char *target_uri)
}
static void
-xps_drop_link_targets(xps_document *doc)
+xps_drop_link_targets(fz_context *ctx, xps_document *doc)
{
xps_target *target = doc->target, *next;
while (target)
{
next = target->next;
- fz_free(doc->ctx, target->name);
- fz_free(doc->ctx, target);
+ fz_free(ctx, target->name);
+ fz_free(ctx, target);
target = next;
}
}
static void
-xps_drop_fixed_pages(xps_document *doc)
+xps_drop_fixed_pages(fz_context *ctx, xps_document *doc)
{
- xps_page *page = doc->first_page;
+ xps_fixpage *page = doc->first_page;
while (page)
{
- xps_page *next = page->next;
- xps_drop_page(doc, page);
- fz_drop_link(doc->ctx, page->links);
- fz_free(doc->ctx, page->name);
- fz_free(doc->ctx, page);
+ xps_fixpage *next = page->next;
+ fz_drop_link(ctx, page->links);
+ fz_free(ctx, page->name);
+ fz_free(ctx, page);
page = next;
}
doc->first_page = NULL;
@@ -248,15 +237,15 @@ xps_drop_fixed_pages(xps_document *doc)
}
static void
-xps_drop_fixed_documents(xps_document *doc)
+xps_drop_fixed_documents(fz_context *ctx, xps_document *doc)
{
xps_fixdoc *fixdoc = doc->first_fixdoc;
while (fixdoc)
{
xps_fixdoc *next = fixdoc->next;
- fz_free(doc->ctx, fixdoc->name);
- fz_free(doc->ctx, fixdoc->outline);
- fz_free(doc->ctx, fixdoc);
+ fz_free(ctx, fixdoc->name);
+ fz_free(ctx, fixdoc->outline);
+ fz_free(ctx, fixdoc);
fixdoc = next;
}
doc->first_fixdoc = NULL;
@@ -264,11 +253,11 @@ xps_drop_fixed_documents(xps_document *doc)
}
void
-xps_drop_page_list(xps_document *doc)
+xps_drop_page_list(fz_context *ctx, xps_document *doc)
{
- xps_drop_fixed_documents(doc);
- xps_drop_fixed_pages(doc);
- xps_drop_link_targets(doc);
+ xps_drop_fixed_documents(ctx, doc);
+ xps_drop_fixed_pages(ctx, doc);
+ xps_drop_link_targets(ctx, doc);
}
/*
@@ -276,7 +265,7 @@ xps_drop_page_list(xps_document *doc)
*/
static void
-xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
+xps_parse_metadata_imp(fz_context *ctx, xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
{
while (item)
{
@@ -287,13 +276,13 @@ xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
if (target && type)
{
char tgtbuf[1024];
- xps_resolve_url(tgtbuf, doc->base_uri, target, sizeof tgtbuf);
+ xps_resolve_url(ctx, doc, tgtbuf, doc->base_uri, target, sizeof tgtbuf);
if (!strcmp(type, REL_START_PART) || !strcmp(type, REL_START_PART_OXPS))
- doc->start_part = fz_strdup(doc->ctx, tgtbuf);
+ doc->start_part = fz_strdup(ctx, tgtbuf);
if ((!strcmp(type, REL_DOC_STRUCTURE) || !strcmp(type, REL_DOC_STRUCTURE_OXPS)) && fixdoc)
- fixdoc->outline = fz_strdup(doc->ctx, tgtbuf);
+ fixdoc->outline = fz_strdup(ctx, tgtbuf);
if (!fz_xml_att(item, "Id"))
- fz_warn(doc->ctx, "missing relationship id for %s", target);
+ fz_warn(ctx, "missing relationship id for %s", target);
}
}
@@ -303,8 +292,8 @@ xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
if (source)
{
char srcbuf[1024];
- xps_resolve_url(srcbuf, doc->base_uri, source, sizeof srcbuf);
- xps_add_fixed_document(doc, srcbuf);
+ xps_resolve_url(ctx, doc, srcbuf, doc->base_uri, source, sizeof srcbuf);
+ xps_add_fixed_document(ctx, doc, srcbuf);
}
}
@@ -318,8 +307,8 @@ xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
if (source)
{
char srcbuf[1024];
- xps_resolve_url(srcbuf, doc->base_uri, source, sizeof srcbuf);
- xps_add_fixed_page(doc, srcbuf, width, height);
+ xps_resolve_url(ctx, doc, srcbuf, doc->base_uri, source, sizeof srcbuf);
+ xps_add_fixed_page(ctx, doc, srcbuf, width, height);
}
}
@@ -327,17 +316,17 @@ xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
{
char *name = fz_xml_att(item, "Name");
if (name)
- xps_add_link_target(doc, name);
+ xps_add_link_target(ctx, doc, name);
}
- xps_parse_metadata_imp(doc, fz_xml_down(item), fixdoc);
+ xps_parse_metadata_imp(ctx, doc, fz_xml_down(item), fixdoc);
item = fz_xml_next(item);
}
}
static void
-xps_parse_metadata(xps_document *doc, xps_part *part, xps_fixdoc *fixdoc)
+xps_parse_metadata(fz_context *ctx, xps_document *doc, xps_part *part, xps_fixdoc *fixdoc)
{
fz_xml *root;
char buf[1024];
@@ -360,31 +349,30 @@ xps_parse_metadata(xps_document *doc, xps_part *part, xps_fixdoc *fixdoc)
doc->base_uri = buf;
doc->part_uri = part->name;
- root = fz_parse_xml(doc->ctx, part->data, part->size, 0);
- xps_parse_metadata_imp(doc, root, fixdoc);
- fz_drop_xml(doc->ctx, root);
+ root = fz_parse_xml(ctx, part->data, part->size, 0);
+ xps_parse_metadata_imp(ctx, doc, root, fixdoc);
+ fz_drop_xml(ctx, root);
doc->base_uri = NULL;
doc->part_uri = NULL;
}
static void
-xps_read_and_process_metadata_part(xps_document *doc, char *name, xps_fixdoc *fixdoc)
+xps_read_and_process_metadata_part(fz_context *ctx, xps_document *doc, char *name, xps_fixdoc *fixdoc)
{
- fz_context *ctx = doc->ctx;
xps_part *part;
- if (!xps_has_part(doc, name))
+ if (!xps_has_part(ctx, doc, name))
return;
- part = xps_read_part(doc, name);
+ part = xps_read_part(ctx, doc, name);
fz_try(ctx)
{
- xps_parse_metadata(doc, part, fixdoc);
+ xps_parse_metadata(ctx, doc, part, fixdoc);
}
fz_always(ctx)
{
- xps_drop_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
fz_catch(ctx)
{
@@ -393,57 +381,56 @@ xps_read_and_process_metadata_part(xps_document *doc, char *name, xps_fixdoc *fi
}
void
-xps_read_page_list(xps_document *doc)
+xps_read_page_list(fz_context *ctx, xps_document *doc)
{
xps_fixdoc *fixdoc;
- xps_read_and_process_metadata_part(doc, "/_rels/.rels", NULL);
+ xps_read_and_process_metadata_part(ctx, doc, "/_rels/.rels", NULL);
if (!doc->start_part)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find fixed document sequence start part");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find fixed document sequence start part");
- xps_read_and_process_metadata_part(doc, doc->start_part, NULL);
+ xps_read_and_process_metadata_part(ctx, doc, doc->start_part, NULL);
for (fixdoc = doc->first_fixdoc; fixdoc; fixdoc = fixdoc->next)
{
char relbuf[1024];
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- xps_rels_for_part(relbuf, fixdoc->name, sizeof relbuf);
- xps_read_and_process_metadata_part(doc, relbuf, fixdoc);
+ xps_rels_for_part(ctx, doc, relbuf, fixdoc->name, sizeof relbuf);
+ xps_read_and_process_metadata_part(ctx, doc, relbuf, fixdoc);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot process FixedDocument rels part");
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot process FixedDocument rels part");
}
- xps_read_and_process_metadata_part(doc, fixdoc->name, fixdoc);
+ xps_read_and_process_metadata_part(ctx, doc, fixdoc->name, fixdoc);
}
}
int
-xps_count_pages(xps_document *doc)
+xps_count_pages(fz_context *ctx, xps_document *doc)
{
return doc->page_count;
}
-static void
-xps_load_fixed_page(xps_document *doc, xps_page *page)
+static fz_xml *
+xps_load_fixed_page(fz_context *ctx, xps_document *doc, xps_fixpage *page)
{
xps_part *part;
fz_xml *root;
char *width_att;
char *height_att;
- fz_context *ctx = doc->ctx;
- part = xps_read_part(doc, page->name);
+ part = xps_read_part(ctx, doc, page->name);
fz_try(ctx)
{
- root = fz_parse_xml(doc->ctx, part->data, part->size, 0);
+ root = fz_parse_xml(ctx, part->data, part->size, 0);
}
fz_always(ctx)
{
- xps_drop_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
fz_catch(ctx)
{
@@ -451,89 +438,117 @@ xps_load_fixed_page(xps_document *doc, xps_page *page)
root = NULL;
}
if (!root)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "FixedPage missing root element");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing root element");
if (fz_xml_is_tag(root, "AlternateContent"))
{
- fz_xml *node = xps_lookup_alternate_content(root);
+ fz_xml *node = xps_lookup_alternate_content(ctx, doc, root);
if (!node)
{
- fz_drop_xml(doc->ctx, root);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "FixedPage missing alternate root element");
+ fz_drop_xml(ctx, root);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing alternate root element");
}
fz_detach_xml(node);
- fz_drop_xml(doc->ctx, root);
+ fz_drop_xml(ctx, root);
root = node;
}
if (strcmp(fz_xml_tag(root), "FixedPage"))
{
- fz_drop_xml(doc->ctx, root);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected FixedPage element");
+ fz_drop_xml(ctx, root);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected FixedPage element");
}
width_att = fz_xml_att(root, "Width");
if (!width_att)
{
- fz_drop_xml(doc->ctx, root);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Width");
+ fz_drop_xml(ctx, root);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Width");
}
height_att = fz_xml_att(root, "Height");
if (!height_att)
{
- fz_drop_xml(doc->ctx, root);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Height");
+ fz_drop_xml(ctx, root);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Height");
}
page->width = atoi(width_att);
page->height = atoi(height_att);
- page->root = root;
+
+ return root;
}
-xps_page *
-xps_load_page(xps_document *doc, int number)
+fz_link *
+xps_load_links(fz_context *ctx, xps_page *page)
{
- xps_page *page;
- int n = 0;
-
- for (page = doc->first_page; page; page = page->next)
- {
- if (n == number)
- {
- doc->current_page = page;
- if (!page->root)
- xps_load_fixed_page(doc, page);
- return page;
- }
- n ++;
- }
-
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page %d", number + 1);
+ if (!page->fix->links_resolved)
+ fz_warn(ctx, "xps_load_links before page has been executed!");
+ return fz_keep_link(ctx, page->fix->links);
}
fz_rect *
-xps_bound_page(xps_document *doc, xps_page *page, fz_rect *bounds)
+xps_bound_page(fz_context *ctx, xps_page *page, fz_rect *bounds)
{
bounds->x0 = bounds->y0 = 0;
- bounds->x1 = page->width * 72.0f / 96.0f;
- bounds->y1 = page->height * 72.0f / 96.0f;
+ bounds->x1 = page->fix->width * 72.0f / 96.0f;
+ bounds->y1 = page->fix->height * 72.0f / 96.0f;
return bounds;
}
void
-xps_drop_page(xps_document *doc, xps_page *page)
+xps_drop_page_imp(fz_context *ctx, xps_page *page)
{
if (page == NULL)
return;
- /* only free the XML contents */
- if (page->root)
- fz_drop_xml(doc->ctx, page->root);
- page->root = NULL;
+ fz_drop_document(ctx, &page->doc->super);
+ fz_drop_xml(ctx, page->root);
+}
+
+xps_page *
+xps_load_page(fz_context *ctx, xps_document *doc, int number)
+{
+ xps_page *page = NULL;
+ xps_fixpage *fix;
+ fz_xml *root;
+ int n = 0;
+
+ fz_var(page);
+
+ for (fix = doc->first_page; fix; fix = fix->next)
+ {
+ if (n == number)
+ {
+ doc->current_page = fix;
+
+ root = xps_load_fixed_page(ctx, doc, fix);
+ fz_try(ctx)
+ {
+ page = fz_new_page(ctx, sizeof *page);
+ page->super.load_links = (fz_page_load_links_fn *)xps_load_links;
+ page->super.bound_page = (fz_page_bound_page_fn *)xps_bound_page;
+ page->super.run_page_contents = (fz_page_run_page_contents_fn *)xps_run_page;
+ page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)xps_drop_page_imp;
+
+ page->doc = (xps_document*) fz_keep_document(ctx, &doc->super);
+ page->fix = fix;
+ page->root = root;
+ }
+ fz_catch(ctx)
+ {
+ fz_drop_xml(ctx, root);
+ fz_rethrow(ctx);
+ }
+ return page;
+ }
+ n ++;
+ }
+
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page %d", number + 1);
}
static int
-xps_recognize(fz_context *doc, const char *magic)
+xps_recognize(fz_context *ctx, const char *magic)
{
char *ext = strrchr(magic, '.');
diff --git a/source/xps/xps-glyphs.c b/source/xps/xps-glyphs.c
index 4f030be0..e15eb726 100644
--- a/source/xps/xps-glyphs.c
+++ b/source/xps/xps-glyphs.c
@@ -52,12 +52,11 @@ xps_encode_font_char(fz_font *font, int code)
}
void
-xps_measure_font_glyph(xps_document *doc, fz_font *font, int gid, xps_glyph_metrics *mtx)
+xps_measure_font_glyph(fz_context *ctx, xps_document *doc, fz_font *font, int gid, xps_glyph_metrics *mtx)
{
int mask = FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM;
FT_Face face = font->ft_face;
FT_Fixed hadv = 0, vadv = 0;
- fz_context *ctx = doc->ctx;
fz_lock(ctx, FZ_LOCK_FREETYPE);
FT_Get_Advance(face, gid, mask, &hadv);
@@ -70,21 +69,21 @@ xps_measure_font_glyph(xps_document *doc, fz_font *font, int gid, xps_glyph_metr
}
static fz_font *
-xps_lookup_font(xps_document *doc, char *name)
+xps_lookup_font(fz_context *ctx, xps_document *doc, char *name)
{
xps_font_cache *cache;
for (cache = doc->font_table; cache; cache = cache->next)
if (!xps_strcasecmp(cache->name, name))
- return fz_keep_font(doc->ctx, cache->font);
+ return fz_keep_font(ctx, cache->font);
return NULL;
}
static void
-xps_insert_font(xps_document *doc, char *name, fz_font *font)
+xps_insert_font(fz_context *ctx, xps_document *doc, char *name, fz_font *font)
{
- xps_font_cache *cache = fz_malloc_struct(doc->ctx, xps_font_cache);
- cache->name = fz_strdup(doc->ctx, name);
- cache->font = fz_keep_font(doc->ctx, font);
+ xps_font_cache *cache = fz_malloc_struct(ctx, xps_font_cache);
+ cache->name = fz_strdup(ctx, name);
+ cache->font = fz_keep_font(ctx, font);
cache->next = doc->font_table;
doc->font_table = cache;
}
@@ -94,7 +93,7 @@ xps_insert_font(xps_document *doc, char *name, fz_font *font)
* data with the GUID in the fontname.
*/
static void
-xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
+xps_deobfuscate_font_resource(fz_context *ctx, xps_document *doc, xps_part *part)
{
unsigned char buf[33];
unsigned char key[16];
@@ -103,7 +102,7 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
if (part->size < 32)
{
- fz_warn(doc->ctx, "insufficient data for font deobfuscation");
+ fz_warn(ctx, "insufficient data for font deobfuscation");
return;
}
@@ -120,7 +119,7 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
if (i != 32)
{
- fz_warn(doc->ctx, "cannot extract GUID from obfuscated font part name");
+ fz_warn(ctx, "cannot extract GUID from obfuscated font part name");
return;
}
@@ -135,7 +134,7 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
}
static void
-xps_select_best_font_encoding(xps_document *doc, fz_font *font)
+xps_select_best_font_encoding(fz_context *ctx, xps_document *doc, fz_font *font)
{
static struct { int pid, eid; } xps_cmap_list[] =
{
@@ -166,7 +165,7 @@ xps_select_best_font_encoding(xps_document *doc, fz_font *font)
}
}
- fz_warn(doc->ctx, "cannot find a suitable cmap");
+ fz_warn(ctx, "cannot find a suitable cmap");
}
/*
@@ -257,7 +256,7 @@ xps_parse_glyph_metrics(char *s, float *advance, float *uofs, float *vofs)
* Calculate metrics for positioning.
*/
static fz_text *
-xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
+xps_parse_glyphs_imp(fz_context *ctx, xps_document *doc, const fz_matrix *ctm,
fz_font *font, float size, float originx, float originy,
int is_sideways, int bidi_level,
char *indices, char *unicode)
@@ -273,7 +272,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
int un = 0;
if (!unicode && !indices)
- fz_warn(doc->ctx, "glyphs element with neither characters nor indices");
+ fz_warn(ctx, "glyphs element with neither characters nor indices");
if (us)
{
@@ -289,7 +288,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
else
fz_scale(&tm, size, -size);
- text = fz_new_text(doc->ctx, font, &tm, is_sideways);
+ text = fz_new_text(ctx, font, &tm, is_sideways);
while ((us && un > 0) || (is && *is))
{
@@ -331,7 +330,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
if (glyph_index == -1)
glyph_index = xps_encode_font_char(font, char_code);
- xps_measure_font_glyph(doc, font, glyph_index, &mtx);
+ xps_measure_font_glyph(ctx, doc, font, glyph_index, &mtx);
if (is_sideways)
advance = mtx.vadv * 100;
else if (bidi_level & 1)
@@ -366,7 +365,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
f = y - v_offset;
}
- fz_add_text(doc->ctx, text, glyph_index, char_code, e, f);
+ fz_add_text(ctx, text, glyph_index, char_code, e, f);
x += advance * 0.01f * size;
}
@@ -376,9 +375,11 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
}
void
-xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
+xps_parse_glyphs(fz_context *ctx, xps_document *doc, const fz_matrix *ctm,
char *base_uri, xps_resource *dict, fz_xml *root)
{
+ fz_device *dev = doc->dev;
+
fz_xml *node;
char *fill_uri;
@@ -459,17 +460,17 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
fill_uri = base_uri;
opacity_mask_uri = base_uri;
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &clip_att, &clip_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &fill_att, &fill_tag, &fill_uri);
- xps_resolve_resource_reference(doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &clip_att, &clip_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &fill_att, &fill_tag, &fill_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
/*
* Check that we have all the necessary information.
*/
if (!font_size_att || !font_uri_att || !origin_x_att || !origin_y_att) {
- fz_warn(doc->ctx, "missing attributes in glyphs element");
+ fz_warn(ctx, "missing attributes in glyphs element");
return;
}
@@ -486,7 +487,7 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
* Find and load the font resource
*/
- xps_resolve_url(partname, base_uri, font_uri_att, sizeof partname);
+ xps_resolve_url(ctx, doc, partname, base_uri, font_uri_att, sizeof partname);
subfont = strrchr(partname, '#');
if (subfont)
{
@@ -506,45 +507,45 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
fz_strlcat(fakename, "#BoldItalic", sizeof fakename);
}
- font = xps_lookup_font(doc, fakename);
+ font = xps_lookup_font(ctx, doc, fakename);
if (!font)
{
fz_buffer *buf = NULL;
fz_var(buf);
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- part = xps_read_part(doc, partname);
+ part = xps_read_part(ctx, doc, partname);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot find font resource part '%s'", partname);
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot find font resource part '%s'", partname);
return;
}
/* deobfuscate if necessary */
if (strstr(part->name, ".odttf"))
- xps_deobfuscate_font_resource(doc, part);
+ xps_deobfuscate_font_resource(ctx, doc, part);
if (strstr(part->name, ".ODTTF"))
- xps_deobfuscate_font_resource(doc, part);
+ xps_deobfuscate_font_resource(ctx, doc, part);
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- buf = fz_new_buffer_from_data(doc->ctx, part->data, part->size);
+ buf = fz_new_buffer_from_data(ctx, part->data, part->size);
/* part->data is now owned by buf */
part->data = NULL;
- font = fz_new_font_from_buffer(doc->ctx, NULL, buf, subfontid, 1);
+ font = fz_new_font_from_buffer(ctx, NULL, buf, subfontid, 1);
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- fz_drop_buffer(doc->ctx, buf);
- xps_drop_part(doc, part);
+ fz_drop_buffer(ctx, buf);
+ xps_drop_part(ctx, doc, part);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot load font resource '%s'", partname);
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot load font resource '%s'", partname);
return;
}
@@ -554,8 +555,8 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
font->ft_italic = !!strstr(style_att, "Italic");
}
- xps_select_best_font_encoding(doc, font);
- xps_insert_font(doc, fakename, font);
+ xps_select_best_font_encoding(ctx, doc, font);
+ xps_insert_font(ctx, doc, fakename, font);
}
/*
@@ -566,27 +567,27 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
{
fz_matrix transform;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&local_ctm, &transform, &local_ctm);
}
if (clip_att || clip_tag)
- xps_clip(doc, &local_ctm, dict, clip_att, clip_tag);
+ xps_clip(ctx, doc, &local_ctm, dict, clip_att, clip_tag);
font_size = fz_atof(font_size_att);
- text = xps_parse_glyphs_imp(doc, &local_ctm, font, font_size,
+ text = xps_parse_glyphs_imp(ctx, doc, &local_ctm, font, font_size,
fz_atof(origin_x_att), fz_atof(origin_y_att),
is_sideways, bidi_level, indices_att, unicode_att);
- fz_bound_text(doc->ctx, text, NULL, &local_ctm, &area);
+ fz_bound_text(ctx, text, NULL, &local_ctm, &area);
if (navigate_uri_att)
- xps_add_link(doc, &area, base_uri, navigate_uri_att);
+ xps_add_link(ctx, doc, &area, base_uri, navigate_uri_att);
- xps_begin_opacity(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 it's a solid color brush fill/stroke do a simple fill */
@@ -602,12 +603,12 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
float samples[FZ_MAX_COLORS];
fz_colorspace *colorspace;
- xps_parse_color(doc, base_uri, fill_att, &colorspace, samples);
+ 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(doc, colorspace, samples);
+ xps_set_color(ctx, doc, colorspace, samples);
- fz_fill_text(doc->dev, text, &local_ctm,
+ fz_fill_text(ctx, dev, text, &local_ctm,
doc->colorspace, doc->color, doc->alpha);
}
@@ -615,17 +616,17 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
if (fill_tag)
{
- fz_clip_text(doc->dev, text, &local_ctm, 0);
- xps_parse_brush(doc, &local_ctm, &area, fill_uri, dict, fill_tag);
- fz_pop_clip(doc->dev);
+ fz_clip_text(ctx, dev, text, &local_ctm, 0);
+ xps_parse_brush(ctx, doc, &local_ctm, &area, fill_uri, dict, fill_tag);
+ fz_pop_clip(ctx, dev);
}
- xps_end_opacity(doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
- fz_drop_text(doc->ctx, text);
+ fz_drop_text(ctx, text);
if (clip_att || clip_tag)
- fz_pop_clip(doc->dev);
+ fz_pop_clip(ctx, dev);
- fz_drop_font(doc->ctx, font);
+ fz_drop_font(ctx, font);
}
diff --git a/source/xps/xps-gradient.c b/source/xps/xps-gradient.c
index d156a406..f3a9f8e8 100644
--- a/source/xps/xps-gradient.c
+++ b/source/xps/xps-gradient.c
@@ -35,7 +35,7 @@ static inline float lerp(float a, float b, float x)
}
static int
-xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
+xps_parse_gradient_stops(fz_context *ctx, xps_document *doc, char *base_uri, fz_xml *node,
struct stop *stops, int maxcount)
{
fz_colorspace *colorspace;
@@ -60,9 +60,9 @@ xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
stops[count].offset = fz_atof(offset);
stops[count].index = count;
- xps_parse_color(doc, base_uri, color, &colorspace, sample);
+ xps_parse_color(ctx, doc, base_uri, color, &colorspace, sample);
- fz_convert_color(doc->ctx, fz_device_rgb(doc->ctx), rgb, colorspace, sample + 1);
+ fz_convert_color(ctx, fz_device_rgb(ctx), rgb, colorspace, sample + 1);
stops[count].r = rgb[0];
stops[count].g = rgb[1];
@@ -77,7 +77,7 @@ xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
if (count == 0)
{
- fz_warn(doc->ctx, "gradient brush has no gradient stops");
+ fz_warn(ctx, "gradient brush has no gradient stops");
stops[0].offset = 0;
stops[0].r = 0;
stops[0].g = 0;
@@ -92,7 +92,7 @@ xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
}
if (count == maxcount)
- fz_warn(doc->ctx, "gradient brush exceeded maximum number of gradient stops");
+ fz_warn(ctx, "gradient brush exceeded maximum number of gradient stops");
/* Postprocess to make sure the range of offsets is 0.0 to 1.0 */
@@ -175,7 +175,7 @@ xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
}
static void
-xps_sample_gradient_stops(fz_shade *shade, struct stop *stops, int count)
+xps_sample_gradient_stops(fz_context *ctx, xps_document *doc, fz_shade *shade, struct stop *stops, int count)
{
float offset, d;
int i, k;
@@ -204,18 +204,19 @@ xps_sample_gradient_stops(fz_shade *shade, struct stop *stops, int count)
*/
static void
-xps_draw_one_radial_gradient(xps_document *doc, const fz_matrix *ctm,
+xps_draw_one_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm,
struct stop *stops, int count,
int extend,
float x0, float y0, float r0,
float x1, float y1, float r1)
{
+ fz_device *dev = doc->dev;
fz_shade *shade;
/* TODO: this (and the stuff in pdf_shade) should move to res_shade.c */
- shade = fz_malloc_struct(doc->ctx, fz_shade);
+ shade = fz_malloc_struct(ctx, fz_shade);
FZ_INIT_STORABLE(shade, 1, fz_drop_shade_imp);
- shade->colorspace = fz_device_rgb(doc->ctx);
+ shade->colorspace = fz_device_rgb(ctx);
shade->bbox = fz_infinite_rect;
shade->matrix = fz_identity;
shade->use_background = 0;
@@ -224,7 +225,7 @@ xps_draw_one_radial_gradient(xps_document *doc, const fz_matrix *ctm,
shade->u.l_or_r.extend[0] = extend;
shade->u.l_or_r.extend[1] = extend;
- xps_sample_gradient_stops(shade, stops, count);
+ xps_sample_gradient_stops(ctx, doc, shade, stops, count);
shade->u.l_or_r.coords[0][0] = x0;
shade->u.l_or_r.coords[0][1] = y0;
@@ -233,9 +234,9 @@ xps_draw_one_radial_gradient(xps_document *doc, const fz_matrix *ctm,
shade->u.l_or_r.coords[1][1] = y1;
shade->u.l_or_r.coords[1][2] = r1;
- fz_fill_shade(doc->dev, shade, ctm, 1);
+ fz_fill_shade(ctx, dev, shade, ctm, 1);
- fz_drop_shade(doc->ctx, shade);
+ fz_drop_shade(ctx, shade);
}
/*
@@ -243,17 +244,18 @@ xps_draw_one_radial_gradient(xps_document *doc, const fz_matrix *ctm,
*/
static void
-xps_draw_one_linear_gradient(xps_document *doc, const fz_matrix *ctm,
+xps_draw_one_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm,
struct stop *stops, int count,
int extend,
float x0, float y0, float x1, float y1)
{
+ fz_device *dev = doc->dev;
fz_shade *shade;
/* TODO: this (and the stuff in pdf_shade) should move to res_shade.c */
- shade = fz_malloc_struct(doc->ctx, fz_shade);
+ shade = fz_malloc_struct(ctx, fz_shade);
FZ_INIT_STORABLE(shade, 1, fz_drop_shade_imp);
- shade->colorspace = fz_device_rgb(doc->ctx);
+ shade->colorspace = fz_device_rgb(ctx);
shade->bbox = fz_infinite_rect;
shade->matrix = fz_identity;
shade->use_background = 0;
@@ -262,7 +264,7 @@ xps_draw_one_linear_gradient(xps_document *doc, const fz_matrix *ctm,
shade->u.l_or_r.extend[0] = extend;
shade->u.l_or_r.extend[1] = extend;
- xps_sample_gradient_stops(shade, stops, count);
+ xps_sample_gradient_stops(ctx, doc, shade, stops, count);
shade->u.l_or_r.coords[0][0] = x0;
shade->u.l_or_r.coords[0][1] = y0;
@@ -271,9 +273,9 @@ xps_draw_one_linear_gradient(xps_document *doc, const fz_matrix *ctm,
shade->u.l_or_r.coords[1][1] = y1;
shade->u.l_or_r.coords[1][2] = 0;
- fz_fill_shade(doc->dev, shade, ctm, doc->opacity[doc->opacity_top]);
+ fz_fill_shade(ctx, dev, shade, ctm, doc->opacity[doc->opacity_top]);
- fz_drop_shade(doc->ctx, shade);
+ fz_drop_shade(ctx, shade);
}
/*
@@ -292,7 +294,7 @@ static inline float point_inside_circle(float px, float py, float x, float y, fl
}
static void
-xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_draw_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
struct stop *stops, int count,
fz_xml *root, int spread)
{
@@ -317,9 +319,9 @@ xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
yrad = 1.0;
if (origin_att)
- xps_parse_point(origin_att, &x0, &y0);
+ xps_parse_point(ctx, doc, origin_att, &x0, &y0);
if (center_att)
- xps_parse_point(center_att, &x1, &y1);
+ xps_parse_point(ctx, doc, center_att, &x1, &y1);
if (radius_x_att)
xrad = fz_atof(radius_x_att);
if (radius_y_att)
@@ -353,7 +355,7 @@ xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
if (spread == SPREAD_REPEAT)
{
for (i = ma - 1; i >= 0; i--)
- xps_draw_one_radial_gradient(doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad);
+ xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad);
}
else if (spread == SPREAD_REFLECT)
{
@@ -361,13 +363,13 @@ xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
ma++;
for (i = ma - 2; i >= 0; i -= 2)
{
- xps_draw_one_radial_gradient(doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad);
- xps_draw_one_radial_gradient(doc, &local_ctm, stops, count, 0, x0, y0, r0 + (i + 2) * xrad, x1, y1, r1 + i * xrad);
+ xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad);
+ xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 0, x0, y0, r0 + (i + 2) * xrad, x1, y1, r1 + i * xrad);
}
}
else
{
- xps_draw_one_radial_gradient(doc, &local_ctm, stops, count, 1, x0, y0, r0, x1, y1, r1);
+ xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 1, x0, y0, r0, x1, y1, r1);
}
}
@@ -377,7 +379,7 @@ xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
*/
static void
-xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_draw_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
struct stop *stops, int count,
fz_xml *root, int spread)
{
@@ -395,9 +397,9 @@ xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
x1 = y1 = 1;
if (start_point_att)
- xps_parse_point(start_point_att, &x0, &y0);
+ xps_parse_point(ctx, doc, start_point_att, &x0, &y0);
if (end_point_att)
- xps_parse_point(end_point_att, &x1, &y1);
+ xps_parse_point(ctx, doc, end_point_att, &x1, &y1);
p1.x = x0; p1.y = y0; p2.x = x1; p2.y = y1;
fz_transform_rect(&local_area, fz_invert_matrix(&inv, ctm));
@@ -415,7 +417,7 @@ xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
if (spread == SPREAD_REPEAT)
{
for (i = mi; i < ma; i++)
- xps_draw_one_linear_gradient(doc, ctm, stops, count, 0, x0 + i * dx, y0 + i * dy, x1 + i * dx, y1 + i * dy);
+ xps_draw_one_linear_gradient(ctx, doc, ctm, stops, count, 0, x0 + i * dx, y0 + i * dy, x1 + i * dx, y1 + i * dy);
}
else if (spread == SPREAD_REFLECT)
{
@@ -423,13 +425,13 @@ xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
mi--;
for (i = mi; i < ma; i += 2)
{
- xps_draw_one_linear_gradient(doc, ctm, stops, count, 0, x0 + i * dx, y0 + i * dy, x1 + i * dx, y1 + i * dy);
- xps_draw_one_linear_gradient(doc, ctm, stops, count, 0, x0 + (i + 2) * dx, y0 + (i + 2) * dy, x1 + i * dx, y1 + i * dy);
+ xps_draw_one_linear_gradient(ctx, doc, ctm, stops, count, 0, x0 + i * dx, y0 + i * dy, x1 + i * dx, y1 + i * dy);
+ xps_draw_one_linear_gradient(ctx, doc, ctm, stops, count, 0, x0 + (i + 2) * dx, y0 + (i + 2) * dy, x1 + i * dx, y1 + i * dy);
}
}
else
{
- xps_draw_one_linear_gradient(doc, ctm, stops, count, 1, x0, y0, x1, y1);
+ xps_draw_one_linear_gradient(ctx, doc, ctm, stops, count, 1, x0, y0, x1, y1);
}
}
@@ -439,9 +441,9 @@ xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
*/
static void
-xps_parse_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root,
- void (*draw)(xps_document *, const fz_matrix*, const fz_rect *, struct stop *, int, fz_xml *, int))
+ void (*draw)(fz_context *ctx, xps_document *, const fz_matrix*, const fz_rect *, struct stop *, int, fz_xml *, int))
{
fz_xml *node;
@@ -473,7 +475,7 @@ xps_parse_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect
stop_tag = fz_xml_down(node);
}
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
spread_method = SPREAD_PAD;
if (spread_att)
@@ -488,40 +490,40 @@ xps_parse_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect
transform = fz_identity;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&transform, &transform, ctm);
if (!stop_tag) {
- fz_warn(doc->ctx, "missing gradient stops tag");
+ fz_warn(ctx, "missing gradient stops tag");
return;
}
- stop_count = xps_parse_gradient_stops(doc, base_uri, stop_tag, stop_list, MAX_STOPS);
+ stop_count = xps_parse_gradient_stops(ctx, doc, base_uri, stop_tag, stop_list, MAX_STOPS);
if (stop_count == 0)
{
- fz_warn(doc->ctx, "no gradient stops found");
+ fz_warn(ctx, "no gradient stops found");
return;
}
- xps_begin_opacity(doc, &transform, area, base_uri, dict, opacity_att, NULL);
+ xps_begin_opacity(ctx, doc, &transform, area, base_uri, dict, opacity_att, NULL);
- draw(doc, &transform, area, stop_list, stop_count, root, spread_method);
+ draw(ctx, doc, &transform, area, stop_list, stop_count, root, spread_method);
- xps_end_opacity(doc, base_uri, dict, opacity_att, NULL);
+ xps_end_opacity(ctx, doc, base_uri, dict, opacity_att, NULL);
}
void
-xps_parse_linear_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_linear_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root)
{
- xps_parse_gradient_brush(doc, ctm, area, base_uri, dict, root, xps_draw_linear_gradient);
+ xps_parse_gradient_brush(ctx, doc, ctm, area, base_uri, dict, root, xps_draw_linear_gradient);
}
void
-xps_parse_radial_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_radial_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root)
{
- xps_parse_gradient_brush(doc, ctm, area, base_uri, dict, root, xps_draw_radial_gradient);
+ xps_parse_gradient_brush(ctx, doc, ctm, area, base_uri, dict, root, xps_draw_radial_gradient);
}
diff --git a/source/xps/xps-image.c b/source/xps/xps-image.c
index d9b2ad11..b0d00a2f 100644
--- a/source/xps/xps-image.c
+++ b/source/xps/xps-image.c
@@ -1,7 +1,7 @@
#include "mupdf/xps.h"
static fz_image *
-xps_load_image(fz_context *ctx, xps_part *part)
+xps_load_image(fz_context *ctx, xps_document *doc, xps_part *part)
{
/* Ownership of data always passes in here */
unsigned char *data = part->data;
@@ -11,7 +11,7 @@ xps_load_image(fz_context *ctx, xps_part *part)
/* FIXME: area unused! */
static void
-xps_paint_image_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict,
+xps_paint_image_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict,
fz_xml *root, void *vimage)
{
fz_image *image = vimage;
@@ -23,11 +23,11 @@ xps_paint_image_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *ar
xs = image->w * 96 / image->xres;
ys = image->h * 96 / image->yres;
fz_pre_scale(&local_ctm, xs, ys);
- fz_fill_image(doc->dev, image, &local_ctm, doc->opacity[doc->opacity_top]);
+ fz_fill_image(ctx, doc->dev, image, &local_ctm, doc->opacity[doc->opacity_top]);
}
static void
-xps_find_image_brush_source_part(xps_document *doc, char *base_uri, fz_xml *root, xps_part **image_part, xps_part **profile_part)
+xps_find_image_brush_source_part(fz_context *ctx, xps_document *doc, char *base_uri, fz_xml *root, xps_part **image_part, xps_part **profile_part)
{
char *image_source_att;
char buf[1024];
@@ -38,7 +38,7 @@ xps_find_image_brush_source_part(xps_document *doc, char *base_uri, fz_xml *root
image_source_att = fz_xml_att(root, "ImageSource");
if (!image_source_att)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find image source attribute");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find image source attribute");
/* "{ColorConvertedBitmap /Resources/Image.tiff /Resources/Profile.icc}" */
if (strstr(image_source_att, "{ColorConvertedBitmap") == image_source_att)
@@ -69,20 +69,20 @@ xps_find_image_brush_source_part(xps_document *doc, char *base_uri, fz_xml *root
}
if (!image_name)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find image source");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find image source");
if (image_part)
{
- xps_resolve_url(partname, base_uri, image_name, sizeof partname);
- *image_part = xps_read_part(doc, partname);
+ xps_resolve_url(ctx, doc, partname, base_uri, image_name, sizeof partname);
+ *image_part = xps_read_part(ctx, doc, partname);
}
if (profile_part)
{
if (profile_name)
{
- xps_resolve_url(partname, base_uri, profile_name, sizeof partname);
- *profile_part = xps_read_part(doc, partname);
+ xps_resolve_url(ctx, doc, partname, base_uri, profile_name, sizeof partname);
+ *profile_part = xps_read_part(ctx, doc, partname);
}
else
*profile_part = NULL;
@@ -90,40 +90,40 @@ xps_find_image_brush_source_part(xps_document *doc, char *base_uri, fz_xml *root
}
void
-xps_parse_image_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_image_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root)
{
xps_part *part;
fz_image *image;
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- xps_find_image_brush_source_part(doc, base_uri, root, &part, NULL);
+ xps_find_image_brush_source_part(ctx, doc, base_uri, root, &part, NULL);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot find image source");
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot find image source");
return;
}
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- image = xps_load_image(doc->ctx, part);
+ image = xps_load_image(ctx, doc, part);
image->invert_cmyk_jpeg = 1;
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- xps_drop_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot decode image resource");
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot decode image resource");
return;
}
- xps_parse_tiling_brush(doc, ctm, area, base_uri, dict, root, xps_paint_image_brush, image);
+ xps_parse_tiling_brush(ctx, doc, ctm, area, base_uri, dict, root, xps_paint_image_brush, image);
- fz_drop_image(doc->ctx, image);
+ fz_drop_image(ctx, image);
}
diff --git a/source/xps/xps-outline.c b/source/xps/xps-outline.c
index 3b088d78..b6e68c29 100644
--- a/source/xps/xps-outline.c
+++ b/source/xps/xps-outline.c
@@ -5,17 +5,17 @@
*/
static fz_outline *
-xps_lookup_last_outline_at_level(fz_outline *node, int level, int target_level)
+xps_lookup_last_outline_at_level(fz_context *ctx, xps_document *doc, fz_outline *node, int level, int target_level)
{
while (node->next)
node = node->next;
if (level == target_level || !node->down)
return node;
- return xps_lookup_last_outline_at_level(node->down, level + 1, target_level);
+ return xps_lookup_last_outline_at_level(ctx, doc, node->down, level + 1, target_level);
}
static fz_outline *
-xps_parse_document_outline(xps_document *doc, fz_xml *root)
+xps_parse_document_outline(fz_context *ctx, xps_document *doc, fz_xml *root)
{
fz_xml *node;
fz_outline *head = NULL, *entry, *tail;
@@ -30,11 +30,11 @@ xps_parse_document_outline(xps_document *doc, fz_xml *root)
if (!target || !description)
continue;
- entry = fz_malloc_struct(doc->ctx, fz_outline);
- entry->title = fz_strdup(doc->ctx, description);
+ entry = fz_malloc_struct(ctx, fz_outline);
+ entry->title = fz_strdup(ctx, description);
entry->dest.kind = FZ_LINK_GOTO;
entry->dest.ld.gotor.flags = 0;
- entry->dest.ld.gotor.page = xps_lookup_link_target(doc, target);
+ entry->dest.ld.gotor.page = xps_lookup_link_target(ctx, doc, target);
entry->down = NULL;
entry->next = NULL;
@@ -46,7 +46,7 @@ xps_parse_document_outline(xps_document *doc, fz_xml *root)
}
else
{
- tail = xps_lookup_last_outline_at_level(head, 1, this_level);
+ tail = xps_lookup_last_outline_at_level(ctx, doc, head, 1, this_level);
if (this_level > last_level)
tail->down = entry;
else
@@ -60,7 +60,7 @@ xps_parse_document_outline(xps_document *doc, fz_xml *root)
}
static fz_outline *
-xps_parse_document_structure(xps_document *doc, fz_xml *root)
+xps_parse_document_structure(fz_context *ctx, xps_document *doc, fz_xml *root)
{
fz_xml *node;
if (fz_xml_is_tag(root, "DocumentStructure"))
@@ -70,53 +70,53 @@ xps_parse_document_structure(xps_document *doc, fz_xml *root)
{
node = fz_xml_down(node);
if (node && fz_xml_is_tag(node, "DocumentOutline"))
- return xps_parse_document_outline(doc, node);
+ return xps_parse_document_outline(ctx, doc, node);
}
}
return NULL;
}
static fz_outline *
-xps_load_document_structure(xps_document *doc, xps_fixdoc *fixdoc)
+xps_load_document_structure(fz_context *ctx, xps_document *doc, xps_fixdoc *fixdoc)
{
xps_part *part;
fz_xml *root;
fz_outline *outline;
- part = xps_read_part(doc, fixdoc->outline);
- fz_try(doc->ctx)
+ part = xps_read_part(ctx, doc, fixdoc->outline);
+ fz_try(ctx)
{
- root = fz_parse_xml(doc->ctx, part->data, part->size, 0);
+ root = fz_parse_xml(ctx, part->data, part->size, 0);
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- xps_drop_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow(doc->ctx);
+ fz_rethrow(ctx);
}
if (!root)
return NULL;
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- outline = xps_parse_document_structure(doc, root);
+ outline = xps_parse_document_structure(ctx, doc, root);
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- fz_drop_xml(doc->ctx, root);
+ fz_drop_xml(ctx, root);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow(doc->ctx);
+ fz_rethrow(ctx);
}
return outline;
}
fz_outline *
-xps_load_outline(xps_document *doc)
+xps_load_outline(fz_context *ctx, xps_document *doc)
{
xps_fixdoc *fixdoc;
fz_outline *head = NULL, *tail, *outline;
@@ -125,13 +125,13 @@ xps_load_outline(xps_document *doc)
{
if (fixdoc->outline)
{
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- outline = xps_load_document_structure(doc, fixdoc);
+ outline = xps_load_document_structure(ctx, doc, fixdoc);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
outline = NULL;
}
if (!outline)
diff --git a/source/xps/xps-path.c b/source/xps/xps-path.c
index ee412d64..e1245a9a 100644
--- a/source/xps/xps-path.c
+++ b/source/xps/xps-path.c
@@ -1,7 +1,7 @@
#include "mupdf/xps.h"
static char *
-xps_parse_float_array(char *s, int num, float *x)
+xps_parse_float_array(fz_context *ctx, xps_document *doc, char *s, int num, float *x)
{
int k = 0;
@@ -24,12 +24,12 @@ xps_parse_float_array(char *s, int num, float *x)
}
char *
-xps_parse_point(char *s_in, float *x, float *y)
+xps_parse_point(fz_context *ctx, xps_document *doc, char *s_in, float *x, float *y)
{
char *s_out = s_in;
float xy[2];
- s_out = xps_parse_float_array(s_out, 2, &xy[0]);
+ s_out = xps_parse_float_array(ctx, doc, s_out, 2, &xy[0]);
*x = xy[0];
*y = xy[1];
return s_out;
@@ -44,7 +44,7 @@ xps_parse_point(char *s_in, float *x, float *y)
* calculated by th0, and on exit, a point is generated for us at th0.
*/
static void
-xps_draw_arc_segment(fz_context *doc, fz_path *path, const fz_matrix *mtx, float th0, float th1, int iscw)
+xps_draw_arc_segment(fz_context *ctx, xps_document *doc, fz_path *path, const fz_matrix *mtx, float th0, float th1, int iscw)
{
float t, d;
fz_point p;
@@ -59,7 +59,7 @@ xps_draw_arc_segment(fz_context *doc, fz_path *path, const fz_matrix *mtx, float
for (t = th0 + d; t < th1 - d/2; t += d)
{
fz_transform_point_xy(&p, mtx, cosf(t), sinf(t));
- fz_lineto(doc, path, p.x, p.y);
+ fz_lineto(ctx, path, p.x, p.y);
}
}
else
@@ -68,7 +68,7 @@ xps_draw_arc_segment(fz_context *doc, fz_path *path, const fz_matrix *mtx, float
for (t = th0 - d; t > th1 + d/2; t -= d)
{
fz_transform_point_xy(&p, mtx, cosf(t), sinf(t));
- fz_lineto(doc, path, p.x, p.y);
+ fz_lineto(ctx, path, p.x, p.y);
}
}
}
@@ -106,7 +106,7 @@ angle_between(const fz_point u, const fz_point v)
If is_clockwise, then the arc sweeps clockwise.
*/
static void
-xps_draw_arc(fz_context *doc, fz_path *path,
+xps_draw_arc(fz_context *ctx, xps_document *doc, fz_path *path,
float size_x, float size_y, float rotation_angle,
int is_large_arc, int is_clockwise,
float point_x, float point_y)
@@ -122,7 +122,7 @@ xps_draw_arc(fz_context *doc, fz_path *path,
float sign;
float th1, dth;
- pt = fz_currentpoint(doc, path);
+ pt = fz_currentpoint(ctx, path);
x1 = pt.x;
y1 = pt.y;
x2 = point_x;
@@ -146,7 +146,7 @@ xps_draw_arc(fz_context *doc, fz_path *path,
ry = fabsf(ry);
if (rx < 0.001f || ry < 0.001f || (x1 == x2 && y1 == y2))
{
- fz_lineto(doc, path, x2, y2);
+ fz_lineto(ctx, path, x2, y2);
return;
}
@@ -203,9 +203,9 @@ xps_draw_arc(fz_context *doc, fz_path *path,
}
fz_pre_scale(fz_pre_rotate(fz_translate(&mtx, cx, cy), rotation_angle), rx, ry);
- xps_draw_arc_segment(doc, path, &mtx, th1, th1 + dth, is_clockwise);
+ xps_draw_arc_segment(ctx, doc, path, &mtx, th1, th1 + dth, is_clockwise);
- fz_lineto(doc, path, point_x, point_y);
+ fz_lineto(ctx, path, point_x, point_y);
}
/*
@@ -215,7 +215,7 @@ xps_draw_arc(fz_context *doc, fz_path *path,
*/
static fz_path *
-xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
+xps_parse_abbreviated_geometry(fz_context *ctx, xps_document *doc, char *geom, int *fill_rule)
{
fz_path *path;
char **args;
@@ -228,9 +228,9 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
float smooth_x, smooth_y; /* saved cubic bezier control point for smooth curves */
int reset_smooth;
- path = fz_new_path(doc->ctx);
+ path = fz_new_path(ctx);
- args = fz_malloc_array(doc->ctx, strlen(geom) + 1, sizeof(char*));
+ args = fz_malloc_array(ctx, strlen(geom) + 1, sizeof(char*));
pargs = args;
while (*s)
@@ -288,51 +288,51 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'M':
if (i + 1 >= n) break;
- fz_moveto(doc->ctx, path, fz_atof(args[i]), fz_atof(args[i+1]));
+ fz_moveto(ctx, path, fz_atof(args[i]), fz_atof(args[i+1]));
i += 2;
break;
case 'm':
if (i + 1 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_moveto(doc->ctx, path, pt.x + fz_atof(args[i]), pt.y + fz_atof(args[i+1]));
+ pt = fz_currentpoint(ctx, path);
+ fz_moveto(ctx, path, pt.x + fz_atof(args[i]), pt.y + fz_atof(args[i+1]));
i += 2;
break;
case 'L':
if (i + 1 >= n) break;
- fz_lineto(doc->ctx, path, fz_atof(args[i]), fz_atof(args[i+1]));
+ fz_lineto(ctx, path, fz_atof(args[i]), fz_atof(args[i+1]));
i += 2;
break;
case 'l':
if (i + 1 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, pt.x + fz_atof(args[i]), pt.y + fz_atof(args[i+1]));
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, pt.x + fz_atof(args[i]), pt.y + fz_atof(args[i+1]));
i += 2;
break;
case 'H':
if (i >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, fz_atof(args[i]), pt.y);
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, fz_atof(args[i]), pt.y);
i += 1;
break;
case 'h':
if (i >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, pt.x + fz_atof(args[i]), pt.y);
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, pt.x + fz_atof(args[i]), pt.y);
i += 1;
break;
case 'V':
if (i >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, pt.x, fz_atof(args[i]));
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, pt.x, fz_atof(args[i]));
i += 1;
break;
case 'v':
if (i >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, pt.x, pt.y + fz_atof(args[i]));
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, pt.x, pt.y + fz_atof(args[i]));
i += 1;
break;
@@ -344,7 +344,7 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
y2 = fz_atof(args[i+3]);
x3 = fz_atof(args[i+4]);
y3 = fz_atof(args[i+5]);
- fz_curveto(doc->ctx, path, x1, y1, x2, y2, x3, y3);
+ fz_curveto(ctx, path, x1, y1, x2, y2, x3, y3);
i += 6;
reset_smooth = 0;
smooth_x = x3 - x2;
@@ -353,14 +353,14 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'c':
if (i + 5 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]) + pt.x;
y1 = fz_atof(args[i+1]) + pt.y;
x2 = fz_atof(args[i+2]) + pt.x;
y2 = fz_atof(args[i+3]) + pt.y;
x3 = fz_atof(args[i+4]) + pt.x;
y3 = fz_atof(args[i+5]) + pt.y;
- fz_curveto(doc->ctx, path, x1, y1, x2, y2, x3, y3);
+ fz_curveto(ctx, path, x1, y1, x2, y2, x3, y3);
i += 6;
reset_smooth = 0;
smooth_x = x3 - x2;
@@ -369,12 +369,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'S':
if (i + 3 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]);
y1 = fz_atof(args[i+1]);
x2 = fz_atof(args[i+2]);
y2 = fz_atof(args[i+3]);
- fz_curveto(doc->ctx, path, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
+ fz_curveto(ctx, path, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
i += 4;
reset_smooth = 0;
smooth_x = x2 - x1;
@@ -383,12 +383,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 's':
if (i + 3 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]) + pt.x;
y1 = fz_atof(args[i+1]) + pt.y;
x2 = fz_atof(args[i+2]) + pt.x;
y2 = fz_atof(args[i+3]) + pt.y;
- fz_curveto(doc->ctx, path, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
+ fz_curveto(ctx, path, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
i += 4;
reset_smooth = 0;
smooth_x = x2 - x1;
@@ -397,12 +397,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'Q':
if (i + 3 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]);
y1 = fz_atof(args[i+1]);
x2 = fz_atof(args[i+2]);
y2 = fz_atof(args[i+3]);
- fz_curveto(doc->ctx, path,
+ fz_curveto(ctx, path,
(pt.x + 2 * x1) / 3, (pt.y + 2 * y1) / 3,
(x2 + 2 * x1) / 3, (y2 + 2 * y1) / 3,
x2, y2);
@@ -410,12 +410,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
break;
case 'q':
if (i + 3 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]) + pt.x;
y1 = fz_atof(args[i+1]) + pt.y;
x2 = fz_atof(args[i+2]) + pt.x;
y2 = fz_atof(args[i+3]) + pt.y;
- fz_curveto(doc->ctx, path,
+ fz_curveto(ctx, path,
(pt.x + 2 * x1) / 3, (pt.y + 2 * y1) / 3,
(x2 + 2 * x1) / 3, (y2 + 2 * y1) / 3,
x2, y2);
@@ -424,7 +424,7 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'A':
if (i + 6 >= n) break;
- xps_draw_arc(doc->ctx, path,
+ xps_draw_arc(ctx, doc, path,
fz_atof(args[i+0]), fz_atof(args[i+1]), fz_atof(args[i+2]),
atoi(args[i+3]), atoi(args[i+4]),
fz_atof(args[i+5]), fz_atof(args[i+6]));
@@ -432,8 +432,8 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
break;
case 'a':
if (i + 6 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- xps_draw_arc(doc->ctx, path,
+ pt = fz_currentpoint(ctx, path);
+ xps_draw_arc(ctx, doc, path,
fz_atof(args[i+0]), fz_atof(args[i+1]), fz_atof(args[i+2]),
atoi(args[i+3]), atoi(args[i+4]),
fz_atof(args[i+5]) + pt.x, fz_atof(args[i+6]) + pt.y);
@@ -442,12 +442,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'Z':
case 'z':
- fz_closepath(doc->ctx, path);
+ fz_closepath(ctx, path);
break;
default:
/* eek */
- fz_warn(doc->ctx, "ignoring invalid command '%c'", cmd);
+ fz_warn(ctx, "ignoring invalid command '%c'", cmd);
/* Skip any trailing numbers to avoid an infinite loop */
while (i < n && (args[i][0] == '+' || args[i][0] == '.' || args[i][0] == '-' || (args[i][0] >= '0' && args[i][0] <= '9')))
i ++;
@@ -457,12 +457,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
old = cmd;
}
- fz_free(doc->ctx, args);
+ fz_free(ctx, args);
return path;
}
static void
-xps_parse_arc_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
+xps_parse_arc_segment(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
{
/* ArcSegment pretty much follows the SVG algorithm for converting an
* arc in endpoint representation to an arc in centerpoint
@@ -484,7 +484,7 @@ xps_parse_arc_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking
if (!point_att || !size_att || !rotation_angle_att || !is_large_arc_att || !sweep_direction_att)
{
- fz_warn(doc, "ArcSegment element is missing attributes");
+ fz_warn(ctx, "ArcSegment element is missing attributes");
return;
}
@@ -497,23 +497,23 @@ xps_parse_arc_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking
point_x = point_y = 0;
size_x = size_y = 0;
- xps_parse_point(point_att, &point_x, &point_y);
- xps_parse_point(size_att, &size_x, &size_y);
+ xps_parse_point(ctx, doc, point_att, &point_x, &point_y);
+ xps_parse_point(ctx, doc, size_att, &size_x, &size_y);
rotation_angle = fz_atof(rotation_angle_att);
is_large_arc = !strcmp(is_large_arc_att, "true");
is_clockwise = !strcmp(sweep_direction_att, "Clockwise");
if (stroking && !is_stroked)
{
- fz_moveto(doc, path, point_x, point_y);
+ fz_moveto(ctx, path, point_x, point_y);
return;
}
- xps_draw_arc(doc, path, size_x, size_y, rotation_angle, is_large_arc, is_clockwise, point_x, point_y);
+ xps_draw_arc(ctx, doc, path, size_x, size_y, rotation_angle, is_large_arc, is_clockwise, point_x, point_y);
}
static void
-xps_parse_poly_quadratic_bezier_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
+xps_parse_poly_quadratic_bezier_segment(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
{
char *points_att = fz_xml_att(root, "Points");
char *is_stroked_att = fz_xml_att(root, "IsStroked");
@@ -525,7 +525,7 @@ xps_parse_poly_quadratic_bezier_segment(fz_context *doc, fz_path *path, fz_xml *
if (!points_att)
{
- fz_warn(doc, "PolyQuadraticBezierSegment element has no points");
+ fz_warn(ctx, "PolyQuadraticBezierSegment element has no points");
return;
}
@@ -540,18 +540,18 @@ xps_parse_poly_quadratic_bezier_segment(fz_context *doc, fz_path *path, fz_xml *
while (*s != 0)
{
while (*s == ' ') s++;
- s = xps_parse_point(s, &x[n], &y[n]);
+ s = xps_parse_point(ctx, doc, s, &x[n], &y[n]);
n ++;
if (n == 2)
{
if (stroking && !is_stroked)
{
- fz_moveto(doc, path, x[1], y[1]);
+ fz_moveto(ctx, path, x[1], y[1]);
}
else
{
- pt = fz_currentpoint(doc, path);
- fz_curveto(doc, path,
+ pt = fz_currentpoint(ctx, path);
+ fz_curveto(ctx, path,
(pt.x + 2 * x[0]) / 3, (pt.y + 2 * y[0]) / 3,
(x[1] + 2 * x[0]) / 3, (y[1] + 2 * y[0]) / 3,
x[1], y[1]);
@@ -562,7 +562,7 @@ xps_parse_poly_quadratic_bezier_segment(fz_context *doc, fz_path *path, fz_xml *
}
static void
-xps_parse_poly_bezier_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
+xps_parse_poly_bezier_segment(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
{
char *points_att = fz_xml_att(root, "Points");
char *is_stroked_att = fz_xml_att(root, "IsStroked");
@@ -573,7 +573,7 @@ xps_parse_poly_bezier_segment(fz_context *doc, fz_path *path, fz_xml *root, int
if (!points_att)
{
- fz_warn(doc, "PolyBezierSegment element has no points");
+ fz_warn(ctx, "PolyBezierSegment element has no points");
return;
}
@@ -588,21 +588,21 @@ xps_parse_poly_bezier_segment(fz_context *doc, fz_path *path, fz_xml *root, int
while (*s != 0)
{
while (*s == ' ') s++;
- s = xps_parse_point(s, &x[n], &y[n]);
+ s = xps_parse_point(ctx, doc, s, &x[n], &y[n]);
n ++;
if (n == 3)
{
if (stroking && !is_stroked)
- fz_moveto(doc, path, x[2], y[2]);
+ fz_moveto(ctx, path, x[2], y[2]);
else
- fz_curveto(doc, path, x[0], y[0], x[1], y[1], x[2], y[2]);
+ fz_curveto(ctx, path, x[0], y[0], x[1], y[1], x[2], y[2]);
n = 0;
}
}
}
static void
-xps_parse_poly_line_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
+xps_parse_poly_line_segment(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
{
char *points_att = fz_xml_att(root, "Points");
char *is_stroked_att = fz_xml_att(root, "IsStroked");
@@ -612,7 +612,7 @@ xps_parse_poly_line_segment(fz_context *doc, fz_path *path, fz_xml *root, int st
if (!points_att)
{
- fz_warn(doc, "PolyLineSegment element has no points");
+ fz_warn(ctx, "PolyLineSegment element has no points");
return;
}
@@ -626,16 +626,16 @@ xps_parse_poly_line_segment(fz_context *doc, fz_path *path, fz_xml *root, int st
while (*s != 0)
{
while (*s == ' ') s++;
- s = xps_parse_point(s, &x, &y);
+ s = xps_parse_point(ctx, doc, s, &x, &y);
if (stroking && !is_stroked)
- fz_moveto(doc, path, x, y);
+ fz_moveto(ctx, path, x, y);
else
- fz_lineto(doc, path, x, y);
+ fz_lineto(ctx, path, x, y);
}
}
static void
-xps_parse_path_figure(fz_context *doc, fz_path *path, fz_xml *root, int stroking)
+xps_parse_path_figure(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking)
{
fz_xml *node;
@@ -659,36 +659,36 @@ xps_parse_path_figure(fz_context *doc, fz_path *path, fz_xml *root, int stroking
if (is_filled_att)
is_filled = !strcmp(is_filled_att, "true");
if (start_point_att)
- xps_parse_point(start_point_att, &start_x, &start_y);
+ xps_parse_point(ctx, doc, start_point_att, &start_x, &start_y);
if (!stroking && !is_filled) /* not filled, when filling */
return;
- fz_moveto(doc, path, start_x, start_y);
+ fz_moveto(ctx, path, start_x, start_y);
for (node = fz_xml_down(root); node; node = fz_xml_next(node))
{
if (fz_xml_is_tag(node, "ArcSegment"))
- xps_parse_arc_segment(doc, path, node, stroking, &skipped_stroke);
+ xps_parse_arc_segment(ctx, doc, path, node, stroking, &skipped_stroke);
if (fz_xml_is_tag(node, "PolyBezierSegment"))
- xps_parse_poly_bezier_segment(doc, path, node, stroking, &skipped_stroke);
+ xps_parse_poly_bezier_segment(ctx, doc, path, node, stroking, &skipped_stroke);
if (fz_xml_is_tag(node, "PolyLineSegment"))
- xps_parse_poly_line_segment(doc, path, node, stroking, &skipped_stroke);
+ xps_parse_poly_line_segment(ctx, doc, path, node, stroking, &skipped_stroke);
if (fz_xml_is_tag(node, "PolyQuadraticBezierSegment"))
- xps_parse_poly_quadratic_bezier_segment(doc, path, node, stroking, &skipped_stroke);
+ xps_parse_poly_quadratic_bezier_segment(ctx, doc, path, node, stroking, &skipped_stroke);
}
if (is_closed)
{
if (stroking && skipped_stroke)
- fz_lineto(doc, path, start_x, start_y); /* we've skipped using fz_moveto... */
+ fz_lineto(ctx, path, start_x, start_y); /* we've skipped using fz_moveto... */
else
- fz_closepath(doc, path); /* no skipped segments, safe to closepath properly */
+ fz_closepath(ctx, path); /* no skipped segments, safe to closepath properly */
}
}
fz_path *
-xps_parse_path_geometry(xps_document *doc, xps_resource *dict, fz_xml *root, int stroking, int *fill_rule)
+xps_parse_path_geometry(fz_context *ctx, xps_document *doc, xps_resource *dict, fz_xml *root, int stroking, int *fill_rule)
{
fz_xml *node;
@@ -712,8 +712,8 @@ xps_parse_path_geometry(xps_document *doc, xps_resource *dict, fz_xml *root, int
transform_tag = fz_xml_down(node);
}
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &figures_att, &figures_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &figures_att, &figures_tag, NULL);
if (fill_rule_att)
{
@@ -725,26 +725,26 @@ xps_parse_path_geometry(xps_document *doc, xps_resource *dict, fz_xml *root, int
transform = fz_identity;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
if (figures_att)
- path = xps_parse_abbreviated_geometry(doc, figures_att, fill_rule);
+ path = xps_parse_abbreviated_geometry(ctx, doc, figures_att, fill_rule);
else
- path = fz_new_path(doc->ctx);
+ path = fz_new_path(ctx);
if (figures_tag)
- xps_parse_path_figure(doc->ctx, path, figures_tag, stroking);
+ xps_parse_path_figure(ctx, doc, path, figures_tag, stroking);
for (node = fz_xml_down(root); node; node = fz_xml_next(node))
{
if (fz_xml_is_tag(node, "PathFigure"))
- xps_parse_path_figure(doc->ctx, path, node, stroking);
+ xps_parse_path_figure(ctx, doc, path, node, stroking);
}
if (transform_att || transform_tag)
- fz_transform_path(doc->ctx, path, &transform);
+ fz_transform_path(ctx, path, &transform);
return path;
}
@@ -763,19 +763,20 @@ xps_parse_line_cap(char *attr)
}
void
-xps_clip(xps_document *doc, const fz_matrix *ctm, xps_resource *dict, char *clip_att, fz_xml *clip_tag)
+xps_clip(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, xps_resource *dict, char *clip_att, fz_xml *clip_tag)
{
+ fz_device *dev = doc->dev;
fz_path *path;
int fill_rule = 0;
if (clip_att)
- path = xps_parse_abbreviated_geometry(doc, clip_att, &fill_rule);
+ path = xps_parse_abbreviated_geometry(ctx, doc, clip_att, &fill_rule);
else if (clip_tag)
- path = xps_parse_path_geometry(doc, dict, clip_tag, 0, &fill_rule);
+ path = xps_parse_path_geometry(ctx, doc, dict, clip_tag, 0, &fill_rule);
else
- path = fz_new_path(doc->ctx);
- fz_clip_path(doc->dev, path, NULL, fill_rule == 0, ctm);
- fz_drop_path(doc->ctx, path);
+ path = fz_new_path(ctx);
+ fz_clip_path(ctx, dev, path, NULL, fill_rule == 0, ctm);
+ fz_drop_path(ctx, path);
}
/*
@@ -784,8 +785,10 @@ xps_clip(xps_document *doc, const fz_matrix *ctm, xps_resource *dict, char *clip
*/
void
-xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *root)
+xps_parse_path(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *root)
{
+ fz_device *dev = doc->dev;
+
fz_xml *node;
char *fill_uri;
@@ -873,12 +876,12 @@ xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_reso
stroke_uri = base_uri;
opacity_mask_uri = base_uri;
- xps_resolve_resource_reference(doc, dict, &data_att, &data_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &clip_att, &clip_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &fill_att, &fill_tag, &fill_uri);
- xps_resolve_resource_reference(doc, dict, &stroke_att, &stroke_tag, &stroke_uri);
- xps_resolve_resource_reference(doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &data_att, &data_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &clip_att, &clip_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &fill_att, &fill_tag, &fill_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &stroke_att, &stroke_tag, &stroke_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
/*
* Act on the information we have gathered:
@@ -918,7 +921,7 @@ xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_reso
s++;
}
}
- stroke = fz_new_stroke_state_with_dash_len(doc->ctx, dash_len);
+ stroke = fz_new_stroke_state_with_dash_len(ctx, dash_len);
stroke->start_cap = xps_parse_line_cap(stroke_start_line_cap_att);
stroke->dash_cap = xps_parse_line_cap(stroke_dash_cap_att);
stroke->end_cap = xps_parse_line_cap(stroke_end_line_cap_att);
@@ -973,87 +976,87 @@ xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_reso
transform = fz_identity;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&local_ctm, &transform, ctm);
if (clip_att || clip_tag)
- xps_clip(doc, &local_ctm, dict, 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(doc, data_att, &fill_rule);
+ path = xps_parse_abbreviated_geometry(ctx, doc, data_att, &fill_rule);
else if (data_tag)
{
- path = xps_parse_path_geometry(doc, dict, data_tag, 0, &fill_rule);
+ path = xps_parse_path_geometry(ctx, doc, dict, data_tag, 0, &fill_rule);
if (stroke_att || stroke_tag)
- stroke_path = xps_parse_path_geometry(doc, dict, data_tag, 1, &fill_rule);
+ 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(doc->ctx, stroke_path, stroke, &local_ctm, &area);
+ fz_bound_path(ctx, stroke_path, stroke, &local_ctm, &area);
if (stroke_path != path && (fill_att || fill_tag)) {
fz_rect bounds;
- fz_bound_path(doc->ctx, path, NULL, &local_ctm, &bounds);
+ fz_bound_path(ctx, path, NULL, &local_ctm, &bounds);
fz_union_rect(&area, &bounds);
}
}
else
- fz_bound_path(doc->ctx, path, NULL, &local_ctm, &area);
+ fz_bound_path(ctx, path, NULL, &local_ctm, &area);
if (navigate_uri_att)
- xps_add_link(doc, &area, base_uri, navigate_uri_att);
+ xps_add_link(ctx, doc, &area, base_uri, navigate_uri_att);
- xps_begin_opacity(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(doc, base_uri, fill_att, &colorspace, samples);
+ 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(doc, colorspace, samples);
+ xps_set_color(ctx, doc, colorspace, samples);
- fz_fill_path(doc->dev, path, fill_rule == 0, &local_ctm,
+ fz_fill_path(ctx, dev, path, fill_rule == 0, &local_ctm,
doc->colorspace, doc->color, doc->alpha);
}
if (fill_tag)
{
- fz_clip_path(doc->dev, path, &area, fill_rule == 0, &local_ctm);
- xps_parse_brush(doc, &local_ctm, &area, fill_uri, dict, fill_tag);
- fz_pop_clip(doc->dev);
+ fz_clip_path(ctx, dev, path, &area, fill_rule == 0, &local_ctm);
+ xps_parse_brush(ctx, doc, &local_ctm, &area, fill_uri, dict, fill_tag);
+ fz_pop_clip(ctx, dev);
}
if (stroke_att)
{
- xps_parse_color(doc, base_uri, stroke_att, &colorspace, samples);
+ 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(doc, colorspace, samples);
+ xps_set_color(ctx, doc, colorspace, samples);
- fz_stroke_path(doc->dev, stroke_path, stroke, &local_ctm,
+ fz_stroke_path(ctx, dev, stroke_path, stroke, &local_ctm,
doc->colorspace, doc->color, doc->alpha);
}
if (stroke_tag)
{
- fz_clip_stroke_path(doc->dev, stroke_path, &area, stroke, &local_ctm);
- xps_parse_brush(doc, &local_ctm, &area, stroke_uri, dict, stroke_tag);
- fz_pop_clip(doc->dev);
+ fz_clip_stroke_path(ctx, dev, stroke_path, &area, stroke, &local_ctm);
+ xps_parse_brush(ctx, doc, &local_ctm, &area, stroke_uri, dict, stroke_tag);
+ fz_pop_clip(ctx, dev);
}
- xps_end_opacity(doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
if (stroke_path != path)
- fz_drop_path(doc->ctx, stroke_path);
- fz_drop_path(doc->ctx, path);
+ fz_drop_path(ctx, stroke_path);
+ fz_drop_path(ctx, path);
path = NULL;
- fz_drop_stroke_state(doc->ctx, stroke);
+ fz_drop_stroke_state(ctx, stroke);
if (clip_att || clip_tag)
- fz_pop_clip(doc->dev);
+ fz_pop_clip(ctx, dev);
}
diff --git a/source/xps/xps-resource.c b/source/xps/xps-resource.c
index 6600f7c6..712ed1cc 100644
--- a/source/xps/xps-resource.c
+++ b/source/xps/xps-resource.c
@@ -1,7 +1,7 @@
#include "mupdf/xps.h"
static fz_xml *
-xps_lookup_resource(xps_document *doc, xps_resource *dict, char *name, char **urip)
+xps_lookup_resource(fz_context *ctx, xps_document *doc, xps_resource *dict, char *name, char **urip)
{
xps_resource *head, *node;
for (head = dict; head; head = head->parent)
@@ -20,7 +20,7 @@ xps_lookup_resource(xps_document *doc, xps_resource *dict, char *name, char **ur
}
static fz_xml *
-xps_parse_resource_reference(xps_document *doc, xps_resource *dict, char *att, char **urip)
+xps_parse_resource_reference(fz_context *ctx, xps_document *doc, xps_resource *dict, char *att, char **urip)
{
char name[1024];
char *s;
@@ -33,16 +33,16 @@ xps_parse_resource_reference(xps_document *doc, xps_resource *dict, char *att, c
if (s)
*s = 0;
- return xps_lookup_resource(doc, dict, name, urip);
+ return xps_lookup_resource(ctx, doc, dict, name, urip);
}
void
-xps_resolve_resource_reference(xps_document *doc, xps_resource *dict,
+xps_resolve_resource_reference(fz_context *ctx, xps_document *doc, xps_resource *dict,
char **attp, fz_xml **tagp, char **urip)
{
if (*attp)
{
- fz_xml *rsrc = xps_parse_resource_reference(doc, dict, *attp, urip);
+ fz_xml *rsrc = xps_parse_resource_reference(ctx, doc, dict, *attp, urip);
if (rsrc)
{
*attp = NULL;
@@ -52,7 +52,7 @@ xps_resolve_resource_reference(xps_document *doc, xps_resource *dict,
}
static xps_resource *
-xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *source_att)
+xps_parse_remote_resource_dictionary(fz_context *ctx, xps_document *doc, char *base_uri, char *source_att)
{
char part_name[1024];
char part_uri[1024];
@@ -60,18 +60,17 @@ xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *so
xps_part *part;
fz_xml *xml;
char *s;
- fz_context *ctx = doc->ctx;
/* External resource dictionaries MUST NOT reference other resource dictionaries */
- xps_resolve_url(part_name, base_uri, source_att, sizeof part_name);
- part = xps_read_part(doc, part_name);
+ 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(doc->ctx, part->data, part->size, 0);
+ xml = fz_parse_xml(ctx, part->data, part->size, 0);
}
fz_always(ctx)
{
- xps_drop_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
fz_catch(ctx)
{
@@ -84,8 +83,8 @@ xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *so
if (strcmp(fz_xml_tag(xml), "ResourceDictionary"))
{
- fz_drop_xml(doc->ctx, xml);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected ResourceDictionary element");
+ fz_drop_xml(ctx, xml);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected ResourceDictionary element");
}
fz_strlcpy(part_uri, part_name, sizeof part_uri);
@@ -93,7 +92,7 @@ xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *so
if (s)
s[1] = 0;
- dict = xps_parse_resource_dictionary(doc, part_uri, xml);
+ dict = xps_parse_resource_dictionary(ctx, doc, part_uri, xml);
if (dict)
dict->base_xml = xml; /* pass on ownership */
@@ -101,7 +100,7 @@ xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *so
}
xps_resource *
-xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root)
+xps_parse_resource_dictionary(fz_context *ctx, xps_document *doc, char *base_uri, fz_xml *root)
{
xps_resource *head;
xps_resource *entry;
@@ -111,7 +110,7 @@ xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root)
source = fz_xml_att(root, "Source");
if (source)
- return xps_parse_remote_resource_dictionary(doc, base_uri, source);
+ return xps_parse_remote_resource_dictionary(ctx, doc, base_uri, source);
head = NULL;
@@ -120,7 +119,7 @@ xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root)
key = fz_xml_att(node, "x:Key");
if (key)
{
- entry = fz_malloc_struct(doc->ctx, xps_resource);
+ entry = fz_malloc_struct(ctx, xps_resource);
entry->name = key;
entry->base_uri = NULL;
entry->base_xml = NULL;
@@ -132,29 +131,29 @@ xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root)
}
if (head)
- head->base_uri = fz_strdup(doc->ctx, base_uri);
+ head->base_uri = fz_strdup(ctx, base_uri);
return head;
}
void
-xps_drop_resource_dictionary(xps_document *doc, xps_resource *dict)
+xps_drop_resource_dictionary(fz_context *ctx, xps_document *doc, xps_resource *dict)
{
xps_resource *next;
while (dict)
{
next = dict->next;
if (dict->base_xml)
- fz_drop_xml(doc->ctx, dict->base_xml);
+ fz_drop_xml(ctx, dict->base_xml);
if (dict->base_uri)
- fz_free(doc->ctx, dict->base_uri);
- fz_free(doc->ctx, dict);
+ fz_free(ctx, dict->base_uri);
+ fz_free(ctx, dict);
dict = next;
}
}
void
-xps_print_resource_dictionary(xps_resource *dict)
+xps_print_resource_dictionary(fz_context *ctx, xps_document *doc, xps_resource *dict)
{
while (dict)
{
@@ -164,7 +163,7 @@ xps_print_resource_dictionary(xps_resource *dict)
if (dict->parent)
{
printf("PARENT = {\n");
- xps_print_resource_dictionary(dict->parent);
+ xps_print_resource_dictionary(ctx, doc, dict->parent);
printf("}\n");
}
dict = dict->next;
diff --git a/source/xps/xps-tile.c b/source/xps/xps-tile.c
index b7e0ec19..a74ef562 100644
--- a/source/xps/xps-tile.c
+++ b/source/xps/xps-tile.c
@@ -15,58 +15,61 @@ struct closure
xps_resource *dict;
fz_xml *root;
void *user;
- void (*func)(xps_document*, const fz_matrix *, const fz_rect *, char*, xps_resource*, fz_xml*, void*);
+ void (*func)(fz_context *ctx, xps_document*, const fz_matrix *, const fz_rect *, char*, xps_resource*, fz_xml*, void*);
};
static void
-xps_paint_tiling_brush_clipped(xps_document *doc, const fz_matrix *ctm, const fz_rect *viewbox, struct closure *c)
+xps_paint_tiling_brush_clipped(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *viewbox, struct closure *c)
{
- fz_path *path = fz_new_path(doc->ctx);
- fz_moveto(doc->ctx, path, viewbox->x0, viewbox->y0);
- fz_lineto(doc->ctx, path, viewbox->x0, viewbox->y1);
- fz_lineto(doc->ctx, path, viewbox->x1, viewbox->y1);
- fz_lineto(doc->ctx, path, viewbox->x1, viewbox->y0);
- fz_closepath(doc->ctx, path);
- fz_clip_path(doc->dev, path, NULL, 0, ctm);
- fz_drop_path(doc->ctx, path);
- c->func(doc, ctm, viewbox, c->base_uri, c->dict, c->root, c->user);
- fz_pop_clip(doc->dev);
+ fz_device *dev = doc->dev;
+
+ fz_path *path = fz_new_path(ctx);
+ fz_moveto(ctx, path, viewbox->x0, viewbox->y0);
+ fz_lineto(ctx, path, viewbox->x0, viewbox->y1);
+ fz_lineto(ctx, path, viewbox->x1, viewbox->y1);
+ fz_lineto(ctx, path, viewbox->x1, viewbox->y0);
+ fz_closepath(ctx, path);
+ fz_clip_path(ctx, dev, path, NULL, 0, ctm);
+ fz_drop_path(ctx, path);
+ c->func(ctx, doc, ctm, viewbox, c->base_uri, c->dict, c->root, c->user);
+ fz_pop_clip(ctx, dev);
}
static void
-xps_paint_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *viewbox, int tile_mode, struct closure *c)
+xps_paint_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *viewbox, int tile_mode, struct closure *c)
{
fz_matrix ttm;
- xps_paint_tiling_brush_clipped(doc, ctm, viewbox, c);
+ xps_paint_tiling_brush_clipped(ctx, doc, ctm, viewbox, c);
if (tile_mode == TILE_FLIP_X || tile_mode == TILE_FLIP_X_Y)
{
ttm = *ctm;
fz_pre_scale(fz_pre_translate(&ttm, viewbox->x1 * 2, 0), -1, 1);
- xps_paint_tiling_brush_clipped(doc, &ttm, viewbox, c);
+ xps_paint_tiling_brush_clipped(ctx, doc, &ttm, viewbox, c);
}
if (tile_mode == TILE_FLIP_Y || tile_mode == TILE_FLIP_X_Y)
{
ttm = *ctm;
fz_pre_scale(fz_pre_translate(&ttm, 0, viewbox->y1 * 2), 1, -1);
- xps_paint_tiling_brush_clipped(doc, &ttm, viewbox, c);
+ xps_paint_tiling_brush_clipped(ctx, doc, &ttm, viewbox, c);
}
if (tile_mode == TILE_FLIP_X_Y)
{
ttm = *ctm;
fz_pre_scale(fz_pre_translate(&ttm, viewbox->x1 * 2, viewbox->y1 * 2), -1, -1);
- xps_paint_tiling_brush_clipped(doc, &ttm, viewbox, c);
+ xps_paint_tiling_brush_clipped(ctx, doc, &ttm, viewbox, c);
}
}
void
-xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root,
- void (*func)(xps_document*, const fz_matrix*, const fz_rect*, char*, xps_resource*, fz_xml*, void*), void *user)
+ void (*func)(fz_context *ctx, xps_document*, const fz_matrix*, const fz_rect*, char*, xps_resource*, fz_xml*, void*), void *user)
{
+ fz_device *dev = doc->dev;
fz_xml *node;
struct closure c;
@@ -105,27 +108,27 @@ xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
transform_tag = fz_xml_down(node);
}
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
transform = fz_identity;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&transform, &transform, ctm);
viewbox = fz_unit_rect;
if (viewbox_att)
- xps_parse_rectangle(doc, viewbox_att, &viewbox);
+ xps_parse_rectangle(ctx, doc, viewbox_att, &viewbox);
viewport = fz_unit_rect;
if (viewport_att)
- xps_parse_rectangle(doc, viewport_att, &viewport);
+ xps_parse_rectangle(ctx, doc, viewport_att, &viewport);
if (fabsf(viewport.x1 - viewport.x0) < 0.01f || fabsf(viewport.y1 - viewport.y0) < 0.01f)
- fz_warn(doc->ctx, "not drawing tile for viewport size %.4f x %.4f", viewport.x1 - viewport.x0, viewport.y1 - viewport.y0);
+ fz_warn(ctx, "not drawing tile for viewport size %.4f x %.4f", viewport.x1 - viewport.x0, viewport.y1 - viewport.y0);
else if (fabsf(viewbox.x1 - viewbox.x0) < 0.01f || fabsf(viewbox.y1 - viewbox.y0) < 0.01f)
- fz_warn(doc->ctx, "not drawing tile for viewbox size %.4f x %.4f", viewbox.x1 - viewbox.x0, viewbox.y1 - viewbox.y0);
+ fz_warn(ctx, "not drawing tile for viewbox size %.4f x %.4f", viewbox.x1 - viewbox.x0, viewbox.y1 - viewbox.y0);
/* some sanity checks on the viewport/viewbox size */
if (fabsf(viewport.x1 - viewport.x0) < 0.01f) return;
@@ -159,7 +162,7 @@ xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
if (tile_mode == TILE_FLIP_Y || tile_mode == TILE_FLIP_X_Y)
ystep *= 2;
- xps_begin_opacity(doc, &transform, area, base_uri, dict, opacity_att, NULL);
+ xps_begin_opacity(ctx, doc, &transform, area, base_uri, dict, opacity_att, NULL);
fz_pre_translate(&transform, viewport.x0, viewport.y0);
fz_pre_scale(&transform, xscale, yscale);
@@ -185,9 +188,9 @@ xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
fz_rect bigview = viewbox;
bigview.x1 = bigview.x0 + xstep;
bigview.y1 = bigview.y0 + ystep;
- fz_begin_tile(doc->dev, &local_area, &bigview, xstep, ystep, &transform);
- xps_paint_tiling_brush(doc, &transform, &viewbox, tile_mode, &c);
- fz_end_tile(doc->dev);
+ fz_begin_tile(ctx, dev, &local_area, &bigview, xstep, ystep, &transform);
+ xps_paint_tiling_brush(ctx, doc, &transform, &viewbox, tile_mode, &c);
+ fz_end_tile(ctx, dev);
}
else
{
@@ -198,28 +201,28 @@ xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
{
fz_matrix ttm = transform;
fz_pre_translate(&ttm, xstep * x, ystep * y);
- xps_paint_tiling_brush(doc, &ttm, &viewbox, tile_mode, &c);
+ xps_paint_tiling_brush(ctx, doc, &ttm, &viewbox, tile_mode, &c);
}
}
}
}
else
{
- xps_paint_tiling_brush(doc, &transform, &viewbox, tile_mode, &c);
+ xps_paint_tiling_brush(ctx, doc, &transform, &viewbox, tile_mode, &c);
}
- xps_end_opacity(doc, base_uri, dict, opacity_att, NULL);
+ xps_end_opacity(ctx, doc, base_uri, dict, opacity_att, NULL);
}
static void
-xps_paint_visual_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_paint_visual_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root, void *visual_tag)
{
- xps_parse_element(doc, ctm, area, base_uri, dict, (fz_xml *)visual_tag);
+ xps_parse_element(ctx, doc, ctm, area, base_uri, dict, (fz_xml *)visual_tag);
}
void
-xps_parse_visual_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_visual_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root)
{
fz_xml *node;
@@ -237,18 +240,19 @@ xps_parse_visual_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
}
visual_uri = base_uri;
- xps_resolve_resource_reference(doc, dict, &visual_att, &visual_tag, &visual_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &visual_att, &visual_tag, &visual_uri);
if (visual_tag)
{
- xps_parse_tiling_brush(doc, ctm, area,
+ xps_parse_tiling_brush(ctx, doc, ctm, area,
visual_uri, dict, root, xps_paint_visual_brush, visual_tag);
}
}
void
-xps_parse_canvas(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *root)
+xps_parse_canvas(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *root)
{
+ fz_device *dev = doc->dev;
xps_resource *new_dict = NULL;
fz_xml *node;
char *opacity_mask_uri;
@@ -277,11 +281,11 @@ xps_parse_canvas(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, c
{
if (new_dict)
{
- fz_warn(doc->ctx, "ignoring follow-up resource dictionaries");
+ fz_warn(ctx, "ignoring follow-up resource dictionaries");
}
else
{
- new_dict = xps_parse_resource_dictionary(doc, base_uri, fz_xml_down(node));
+ new_dict = xps_parse_resource_dictionary(ctx, doc, base_uri, fz_xml_down(node));
if (new_dict)
{
new_dict->parent = dict;
@@ -299,41 +303,41 @@ xps_parse_canvas(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, c
}
opacity_mask_uri = base_uri;
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &clip_att, &clip_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
+ 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(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&transform, &transform, ctm);
if (navigate_uri_att)
- xps_add_link(doc, area, base_uri, navigate_uri_att);
+ xps_add_link(ctx, doc, area, base_uri, navigate_uri_att);
if (clip_att || clip_tag)
- xps_clip(doc, &transform, dict, clip_att, clip_tag);
+ xps_clip(ctx, doc, &transform, dict, clip_att, clip_tag);
- xps_begin_opacity(doc, &transform, area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_begin_opacity(ctx, doc, &transform, 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(doc, &transform, area, base_uri, dict, node);
+ xps_parse_element(ctx, doc, &transform, area, base_uri, dict, node);
}
- xps_end_opacity(doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
if (clip_att || clip_tag)
- fz_pop_clip(doc->dev);
+ fz_pop_clip(ctx, dev);
if (new_dict)
- xps_drop_resource_dictionary(doc, new_dict);
+ xps_drop_resource_dictionary(ctx, doc, new_dict);
}
void
-xps_parse_fixed_page(xps_document *doc, const fz_matrix *ctm, xps_page *page)
+xps_parse_fixed_page(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, xps_page *page)
{
fz_xml *node;
xps_resource *dict;
@@ -342,7 +346,7 @@ xps_parse_fixed_page(xps_document *doc, const fz_matrix *ctm, xps_page *page)
char *s;
fz_matrix scm;
- fz_strlcpy(base_uri, page->name, sizeof base_uri);
+ fz_strlcpy(base_uri, page->fix->name, sizeof base_uri);
s = strrchr(base_uri, '/');
if (s)
s[1] = 0;
@@ -356,35 +360,36 @@ xps_parse_fixed_page(xps_document *doc, const fz_matrix *ctm, xps_page *page)
return;
area = fz_unit_rect;
- fz_transform_rect(&area, fz_scale(&scm, page->width, page->height));
+ fz_transform_rect(&area, fz_scale(&scm, page->fix->width, page->fix->height));
for (node = fz_xml_down(page->root); node; node = fz_xml_next(node))
{
if (fz_xml_is_tag(node, "FixedPage.Resources") && fz_xml_down(node))
{
if (dict)
- fz_warn(doc->ctx, "ignoring follow-up resource dictionaries");
+ fz_warn(ctx, "ignoring follow-up resource dictionaries");
else
- dict = xps_parse_resource_dictionary(doc, base_uri, fz_xml_down(node));
+ dict = xps_parse_resource_dictionary(ctx, doc, base_uri, fz_xml_down(node));
}
- xps_parse_element(doc, ctm, &area, base_uri, dict, node);
+ xps_parse_element(ctx, doc, ctm, &area, base_uri, dict, node);
}
if (dict)
- xps_drop_resource_dictionary(doc, dict);
+ xps_drop_resource_dictionary(ctx, doc, dict);
}
void
-xps_run_page(xps_document *doc, xps_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+xps_run_page(fz_context *ctx, xps_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
+ xps_document *doc = page->doc;
fz_matrix page_ctm = *ctm;
fz_pre_scale(&page_ctm, 72.0f / 96.0f, 72.0f / 96.0f);
doc->cookie = cookie;
doc->dev = dev;
- xps_parse_fixed_page(doc, &page_ctm, page);
+ xps_parse_fixed_page(ctx, doc, &page_ctm, page);
doc->cookie = NULL;
doc->dev = NULL;
- page->links_resolved = 1;
+ page->fix->links_resolved = 1;
}
diff --git a/source/xps/xps-util.c b/source/xps/xps-util.c
index a74dc30f..5d708eaa 100644
--- a/source/xps/xps-util.c
+++ b/source/xps/xps-util.c
@@ -81,7 +81,7 @@ skip_authority(char *path)
#define SEP(x) ((x)=='/' || (x) == 0)
static char *
-xps_clean_path(char *name)
+clean_path(char *name)
{
char *p, *q, *dotdot, *start;
int rooted;
@@ -138,7 +138,7 @@ xps_clean_path(char *name)
}
void
-xps_resolve_url(char *output, char *base_uri, char *path, int output_size)
+xps_resolve_url(fz_context *ctx, xps_document *doc, char *output, char *base_uri, char *path, int output_size)
{
char *p = skip_authority(skip_scheme(path));
@@ -153,13 +153,11 @@ xps_resolve_url(char *output, char *base_uri, char *path, int output_size)
fz_strlcat(output, "/", output_size);
fz_strlcat(output, path, output_size);
}
- xps_clean_path(output);
+ clean_path(output);
}
int
-xps_url_is_remote(char *path)
+xps_url_is_remote(fz_context *ctx, xps_document *doc, char *path)
{
- char *p = skip_authority(skip_scheme(path));
-
- return p != path;
+ return path != skip_authority(skip_scheme(path));
}
diff --git a/source/xps/xps-zip.c b/source/xps/xps-zip.c
index a8f25114..ab8c60d7 100644
--- a/source/xps/xps-zip.c
+++ b/source/xps/xps-zip.c
@@ -1,45 +1,44 @@
#include "mupdf/xps.h"
-static void xps_init_document(xps_document *doc);
+static void xps_init_document(fz_context *ctx, xps_document *doc);
xps_part *
-xps_new_part(xps_document *doc, char *name, unsigned char *data, int size)
+xps_new_part(fz_context *ctx, xps_document *doc, char *name, unsigned char *data, int size)
{
xps_part *part;
- part = fz_malloc_struct(doc->ctx, xps_part);
- fz_try(doc->ctx)
+ part = fz_malloc_struct(ctx, xps_part);
+ fz_try(ctx)
{
- part->name = fz_strdup(doc->ctx, name);
+ part->name = fz_strdup(ctx, name);
part->data = data;
part->size = size;
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_free(doc->ctx, part->name);
- fz_free(doc->ctx, part->data);
- fz_free(doc->ctx, part);
- fz_rethrow(doc->ctx);
+ fz_free(ctx, part->name);
+ fz_free(ctx, part->data);
+ fz_free(ctx, part);
+ fz_rethrow(ctx);
}
return part;
}
void
-xps_drop_part(xps_document *doc, xps_part *part)
+xps_drop_part(fz_context *ctx, xps_document *doc, xps_part *part)
{
- fz_free(doc->ctx, part->name);
- fz_free(doc->ctx, part->data);
- fz_free(doc->ctx, part);
+ fz_free(ctx, part->name);
+ fz_free(ctx, part->data);
+ fz_free(ctx, part);
}
/*
* Read and interleave split parts from a ZIP file.
*/
xps_part *
-xps_read_part(xps_document *doc, char *partname)
+xps_read_part(fz_context *ctx, xps_document *doc, char *partname)
{
- fz_context *ctx = doc->ctx;
fz_archive *zip = doc->zip;
fz_buffer *buf, *tmp;
char path[2048];
@@ -100,22 +99,22 @@ xps_read_part(xps_document *doc, char *partname)
size = buf->len - 1;
fz_free(ctx, buf);
- return xps_new_part(doc, partname, data, size);
+ return xps_new_part(ctx, doc, partname, data, size);
}
int
-xps_has_part(xps_document *doc, char *name)
+xps_has_part(fz_context *ctx, xps_document *doc, char *name)
{
char buf[2048];
if (name[0] == '/')
name++;
- if (fz_has_archive_entry(doc->ctx, doc->zip, name))
+ if (fz_has_archive_entry(ctx, doc->zip, name))
return 1;
sprintf(buf, "%s/[0].piece", name);
- if (fz_has_archive_entry(doc->ctx, doc->zip, buf))
+ if (fz_has_archive_entry(ctx, doc->zip, buf))
return 1;
sprintf(buf, "%s/[0].last.piece", name);
- if (fz_has_archive_entry(doc->ctx, doc->zip, buf))
+ if (fz_has_archive_entry(ctx, doc->zip, buf))
return 1;
return 0;
}
@@ -126,17 +125,16 @@ xps_open_document_with_directory(fz_context *ctx, const char *directory)
xps_document *doc;
doc = fz_malloc_struct(ctx, xps_document);
- xps_init_document(doc);
- doc->ctx = ctx;
+ xps_init_document(ctx, doc);
doc->zip = fz_open_directory(ctx, directory);
fz_try(ctx)
{
- xps_read_page_list(doc);
+ xps_read_page_list(ctx, doc);
}
fz_catch(ctx)
{
- xps_close_document(doc);
+ xps_close_document(ctx, doc);
fz_rethrow(ctx);
}
@@ -149,17 +147,16 @@ xps_open_document_with_stream(fz_context *ctx, fz_stream *file)
xps_document *doc;
doc = fz_malloc_struct(ctx, xps_document);
- xps_init_document(doc);
- doc->ctx = ctx;
+ xps_init_document(ctx, doc);
fz_try(ctx)
{
doc->zip = fz_open_archive_with_stream(ctx, file);
- xps_read_page_list(doc);
+ xps_read_page_list(ctx, doc);
}
fz_catch(ctx)
{
- xps_close_document(doc);
+ xps_close_document(ctx, doc);
fz_rethrow(ctx);
}
@@ -194,7 +191,7 @@ xps_open_document(fz_context *ctx, const char *filename)
}
fz_always(ctx)
{
- fz_drop_stream(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
@@ -204,7 +201,7 @@ xps_open_document(fz_context *ctx, const char *filename)
}
void
-xps_close_document(xps_document *doc)
+xps_close_document(fz_context *ctx, xps_document *doc)
{
xps_font_cache *font, *next;
@@ -212,26 +209,26 @@ xps_close_document(xps_document *doc)
return;
if (doc->zip)
- fz_drop_archive(doc->ctx, doc->zip);
+ fz_drop_archive(ctx, doc->zip);
font = doc->font_table;
while (font)
{
next = font->next;
- fz_drop_font(doc->ctx, font->font);
- fz_free(doc->ctx, font->name);
- fz_free(doc->ctx, font);
+ fz_drop_font(ctx, font->font);
+ fz_free(ctx, font->name);
+ fz_free(ctx, font);
font = next;
}
- xps_drop_page_list(doc);
+ xps_drop_page_list(ctx, doc);
- fz_free(doc->ctx, doc->start_part);
- fz_free(doc->ctx, doc);
+ fz_free(ctx, doc->start_part);
+ fz_free(ctx, doc);
}
static int
-xps_meta(xps_document *doc, int key, void *ptr, int size)
+xps_meta(fz_context *ctx, xps_document *doc, int key, void *ptr, int size)
{
switch (key)
{
@@ -244,25 +241,12 @@ xps_meta(xps_document *doc, int key, void *ptr, int size)
}
static void
-xps_rebind(xps_document *doc, fz_context *ctx)
-{
- doc->ctx = ctx;
- fz_rebind_archive(doc->zip, ctx);
- fz_rebind_device(doc->dev, ctx);
-}
-
-static void
-xps_init_document(xps_document *doc)
+xps_init_document(fz_context *ctx, xps_document *doc)
{
doc->super.refs = 1;
doc->super.close = (fz_document_close_fn *)xps_close_document;
doc->super.load_outline = (fz_document_load_outline_fn *)xps_load_outline;
doc->super.count_pages = (fz_document_count_pages_fn *)xps_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)xps_load_page;
- doc->super.load_links = (fz_document_load_links_fn *)xps_load_links;
- doc->super.bound_page = (fz_document_bound_page_fn *)xps_bound_page;
- doc->super.run_page_contents = (fz_document_run_page_contents_fn *)xps_run_page;
- doc->super.free_page = (fz_document_free_page_fn *)xps_drop_page;
doc->super.meta = (fz_document_meta_fn *)xps_meta;
- doc->super.rebind = (fz_document_rebind_fn *)xps_rebind;
}