summaryrefslogtreecommitdiff
path: root/source/xps/xps-zip.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2015-01-21 16:42:45 +0100
committerTor Andersson <tor.andersson@artifex.com>2015-02-17 18:05:39 +0100
commitf84a189d5f94250e46d2cbd1a75aba00130e2dd6 (patch)
tree8ee614ab90de1baa8941f91ae4946ed5c2e70721 /source/xps/xps-zip.c
parent681039767f2ccc72e236246178893eb0989169c9 (diff)
downloadmupdf-f84a189d5f94250e46d2cbd1a75aba00130e2dd6.tar.xz
Add ctx parameter and remove embedded contexts for API regularity.
Purge several embedded contexts: Remove embedded context in fz_output. Remove embedded context in fz_stream. Remove embedded context in fz_device. Remove fz_rebind_stream (since it is no longer necessary). Remove embedded context in svg_device. Remove embedded context in XML parser. Add ctx argument to fz_document functions. Remove embedded context in fz_document. Remove embedded context in pdf_document. Remove embedded context in pdf_obj. Make fz_page independent of fz_document in the interface. We shouldn't need to pass the document to all functions handling a page. If a page is tied to the source document, it's redundant; otherwise it's just pointless. Fix reference counting oddity in fz_new_image_from_pixmap.
Diffstat (limited to 'source/xps/xps-zip.c')
-rw-r--r--source/xps/xps-zip.c90
1 files changed, 37 insertions, 53 deletions
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;
}