summaryrefslogtreecommitdiff
path: root/apps/pdfapp.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/pdfapp.c')
-rw-r--r--apps/pdfapp.c140
1 files changed, 83 insertions, 57 deletions
diff --git a/apps/pdfapp.c b/apps/pdfapp.c
index 0ef61e2d..7dabd93e 100644
--- a/apps/pdfapp.c
+++ b/apps/pdfapp.c
@@ -68,12 +68,13 @@ char *pdfapp_usage(pdfapp_t *app)
;
}
-void pdfapp_init(pdfapp_t *app)
+void pdfapp_init(fz_context *ctx, pdfapp_t *app)
{
memset(app, 0, sizeof(pdfapp_t));
app->scrw = 640;
app->scrh = 480;
app->resolution = 72;
+ app->ctx = ctx;
}
void pdfapp_invert(pdfapp_t *app, fz_bbox rect)
@@ -99,20 +100,25 @@ void pdfapp_invert(pdfapp_t *app, fz_bbox rect)
static void pdfapp_open_pdf(pdfapp_t *app, char *filename, int fd)
{
- fz_error error;
fz_stream *file;
char *password = "";
fz_obj *obj;
fz_obj *info;
+ fz_context *ctx = app->ctx;
/*
* Open PDF and load xref table
*/
- file = fz_open_fd(fd);
- error = pdf_open_xref_with_stream(&app->xref, file, NULL);
- if (error)
- pdfapp_error(app, fz_rethrow(error, "cannot open document '%s'", filename));
+ file = fz_open_fd(ctx, fd);
+ fz_try(ctx)
+ {
+ app->xref = pdf_open_xref_with_stream(file, NULL);
+ }
+ fz_catch(ctx)
+ {
+ pdfapp_error(app, fz_error_note(1, "cannot open document '%s'", filename));
+ }
fz_close(file);
/*
@@ -144,7 +150,7 @@ static void pdfapp_open_pdf(pdfapp_t *app, char *filename, int fd)
{
obj = fz_dict_gets(info, "Title");
if (obj)
- app->doctitle = pdf_to_utf8(obj);
+ app->doctitle = pdf_to_utf8(ctx, obj);
}
if (!app->doctitle)
{
@@ -153,32 +159,41 @@ static void pdfapp_open_pdf(pdfapp_t *app, char *filename, int fd)
app->doctitle = strrchr(app->doctitle, '\\') + 1;
if (strrchr(app->doctitle, '/'))
app->doctitle = strrchr(app->doctitle, '/') + 1;
- app->doctitle = fz_strdup(app->doctitle);
+ app->doctitle = fz_strdup(ctx, app->doctitle);
}
/*
* Start at first page
*/
- error = pdf_load_page_tree(app->xref);
- if (error)
- pdfapp_error(app, fz_rethrow(error, "cannot load page tree"));
+ fz_try(ctx)
+ {
+ pdf_load_page_tree(app->xref);
+ }
+ fz_catch(ctx)
+ {
+ pdfapp_error(app, fz_error_note(1, "cannot load page tree"));
+ }
app->pagecount = pdf_count_pages(app->xref);
}
static void pdfapp_open_xps(pdfapp_t *app, char *filename, int fd)
{
- fz_error error;
fz_stream *file;
- file = fz_open_fd(fd);
- error = xps_open_stream(&app->xps, file);
- if (error)
- pdfapp_error(app, fz_rethrow(error, "cannot open document '%s'", filename));
+ file = fz_open_fd(app->ctx, fd);
+ fz_try(app->ctx)
+ {
+ app->xps = xps_open_stream(file);
+ }
+ fz_catch(app->ctx)
+ {
+ pdfapp_error(app, fz_error_note(-1, "cannot open document '%s'", filename));
+ }
fz_close(file);
- app->doctitle = fz_strdup(filename);
+ app->doctitle = fz_strdup(app->ctx, filename);
app->pagecount = xps_count_pages(app->xps);
}
@@ -190,7 +205,7 @@ void pdfapp_open(pdfapp_t *app, char *filename, int fd, int reload)
else
pdfapp_open_pdf(app, filename, fd);
- app->cache = fz_new_glyph_cache();
+ app->cache = fz_new_glyph_cache(app->ctx);
if (app->pageno < 1)
app->pageno = 1;
@@ -215,27 +230,27 @@ void pdfapp_open(pdfapp_t *app, char *filename, int fd, int reload)
void pdfapp_close(pdfapp_t *app)
{
if (app->page_list)
- fz_free_display_list(app->page_list);
+ fz_free_display_list(app->ctx, app->page_list);
app->page_list = NULL;
if (app->page_text)
- fz_free_text_span(app->page_text);
+ fz_free_text_span(app->ctx, app->page_text);
app->page_text = NULL;
if (app->page_links)
- pdf_free_link(app->page_links);
+ pdf_free_link(app->ctx, app->page_links);
app->page_links = NULL;
if (app->doctitle)
- fz_free(app->doctitle);
+ fz_free(app->ctx, app->doctitle);
app->doctitle = NULL;
if (app->cache)
- fz_free_glyph_cache(app->cache);
+ fz_free_glyph_cache(app->ctx, app->cache);
app->cache = NULL;
if (app->image)
- fz_drop_pixmap(app->image);
+ fz_drop_pixmap(app->ctx, app->image);
app->image = NULL;
if (app->outline)
@@ -245,7 +260,7 @@ void pdfapp_close(pdfapp_t *app)
if (app->xref)
{
if (app->xref->store)
- pdf_free_store(app->xref->store);
+ pdf_free_store(app->ctx, app->xref->store);
app->xref->store = NULL;
pdf_free_xref(app->xref);
@@ -258,7 +273,7 @@ void pdfapp_close(pdfapp_t *app)
app->xps = NULL;
}
- fz_flush_warnings();
+ fz_flush_warnings(app->ctx);
}
static fz_matrix pdfapp_viewctm(pdfapp_t *app)
@@ -301,12 +316,16 @@ static void pdfapp_panview(pdfapp_t *app, int newx, int newy)
static void pdfapp_loadpage_pdf(pdfapp_t *app)
{
pdf_page *page;
- fz_error error;
fz_device *mdev;
- error = pdf_load_page(&page, app->xref, app->pageno - 1);
- if (error)
- pdfapp_error(app, error);
+ fz_try(app->ctx)
+ {
+ page = pdf_load_page(app->xref, app->pageno - 1);
+ }
+ fz_catch(app->ctx)
+ {
+ pdfapp_error(app, 1);
+ }
app->page_bbox = page->mediabox;
app->page_rotate = page->rotate;
@@ -314,30 +333,36 @@ static void pdfapp_loadpage_pdf(pdfapp_t *app)
page->links = NULL;
/* Create display list */
- app->page_list = fz_new_display_list();
- mdev = fz_new_list_device(app->page_list);
- error = pdf_run_page(app->xref, page, mdev, fz_identity);
- if (error)
+ app->page_list = fz_new_display_list(app->ctx);
+ mdev = fz_new_list_device(app->ctx, app->page_list);
+ fz_try(app->ctx)
{
- error = fz_rethrow(error, "cannot draw page %d in '%s'", app->pageno, app->doctitle);
- pdfapp_error(app, error);
+ pdf_run_page(app->xref, page, mdev, fz_identity);
+ }
+ fz_catch(app->ctx)
+ {
+ pdfapp_error(app, fz_error_note(-1, "cannot draw page %d in '%s'", app->pageno, app->doctitle));
}
fz_free_device(mdev);
- pdf_free_page(page);
+ pdf_free_page(app->ctx, page);
- pdf_age_store(app->xref->store, 3);
+ pdf_age_store(app->ctx, app->xref->store, 3);
}
static void pdfapp_loadpage_xps(pdfapp_t *app)
{
xps_page *page;
fz_device *mdev;
- fz_error error;
- error = xps_load_page(&page, app->xps, app->pageno - 1);
- if (error)
- pdfapp_error(app, fz_rethrow(error, "cannot load page %d in file '%s'", app->pageno, app->doctitle));
+ fz_try(app->ctx)
+ {
+ page = xps_load_page(app->xps, app->pageno - 1);
+ }
+ fz_catch(app->ctx)
+ {
+ pdfapp_error(app, fz_error_note(1, "cannot load page %d in file '%s'", app->pageno, app->doctitle));
+ }
app->page_bbox.x0 = 0;
app->page_bbox.y0 = 0;
@@ -347,8 +372,8 @@ static void pdfapp_loadpage_xps(pdfapp_t *app)
app->page_links = NULL;
/* Create display list */
- app->page_list = fz_new_display_list();
- mdev = fz_new_list_device(app->page_list);
+ app->page_list = fz_new_display_list(app->ctx);
+ mdev = fz_new_list_device(app->ctx, app->page_list);
app->xps->dev = mdev;
xps_parse_fixed_page(app->xps, fz_identity, page);
app->xps->dev = NULL;
@@ -371,11 +396,11 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai
if (loadpage)
{
if (app->page_list)
- fz_free_display_list(app->page_list);
+ fz_free_display_list(app->ctx, app->page_list);
if (app->page_text)
- fz_free_text_span(app->page_text);
+ fz_free_text_span(app->ctx, app->page_text);
if (app->page_links)
- pdf_free_link(app->page_links);
+ pdf_free_link(app->ctx, app->page_links);
if (app->xref)
pdfapp_loadpage_pdf(app);
@@ -387,8 +412,8 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai
app->hitlen = 0;
/* Extract text */
- app->page_text = fz_new_text_span();
- tdev = fz_new_text_device(app->page_text);
+ app->page_text = fz_new_text_span(app->ctx);
+ tdev = fz_new_text_device(app->ctx, app->page_text);
fz_execute_display_list(app->page_list, tdev, fz_identity, fz_infinite_bbox);
fz_free_device(tdev);
}
@@ -404,7 +429,7 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai
/* Draw */
if (app->image)
- fz_drop_pixmap(app->image);
+ fz_drop_pixmap(app->ctx, app->image);
if (app->grayscale)
colorspace = fz_device_gray;
else
@@ -413,9 +438,9 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai
#else
colorspace = fz_device_rgb;
#endif
- app->image = fz_new_pixmap_with_rect(colorspace, bbox);
+ app->image = fz_new_pixmap_with_rect(app->ctx, colorspace, bbox);
fz_clear_pixmap_with_color(app->image, 255);
- idev = fz_new_draw_device(app->cache, app->image);
+ idev = fz_new_draw_device(app->ctx, app->cache, app->image);
fz_execute_display_list(app->page_list, idev, ctm, bbox);
fz_free_device(idev);
}
@@ -445,17 +470,18 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai
wincursor(app, ARROW);
}
- fz_flush_warnings();
+ fz_flush_warnings(app->ctx);
}
static void pdfapp_gotouri(pdfapp_t *app, fz_obj *uri)
{
char *buf;
- buf = fz_malloc(fz_to_str_len(uri) + 1);
- memcpy(buf, fz_to_str_buf(uri), fz_to_str_len(uri));
- buf[fz_to_str_len(uri)] = 0;
+ int n = fz_to_str_len(uri);
+ buf = fz_malloc(app->ctx, n + 1);
+ memcpy(buf, fz_to_str_buf(uri), n);
+ buf[n] = 0;
winopenuri(app, buf);
- fz_free(buf);
+ fz_free(app->ctx, buf);
}
static void pdfapp_gotopage(pdfapp_t *app, fz_obj *obj)