summaryrefslogtreecommitdiff
path: root/pdf/pdf_page.c
diff options
context:
space:
mode:
authorRobin Watts <Robin.Watts@artifex.com>2011-10-04 18:44:19 +0100
committerRobin Watts <Robin.Watts@artifex.com>2011-10-04 18:44:19 +0100
commitd208be26537db558edb70236ae517cea31b7ebab (patch)
tree57da95b97e354a53bd4517a42010e90968f007d9 /pdf/pdf_page.c
parentba46cad4b09bb957085900a203206c8fa5868cd4 (diff)
downloadmupdf-d208be26537db558edb70236ae517cea31b7ebab.tar.xz
Move to exception handling rather than error passing throughout.
This frees us from passing errors back everywhere, and hence enables us to pass results back as return values. Rather than having to explicitly check for errors everywhere and bubble them, we now allow exception handling to do the work for us; the downside to this is that we no longer emit as much debugging information as we did before (though this could be put back in). For now, the debugging information we have lost has been retained in comments with 'RJW:' at the start. This code needs fuller testing, but is being committed as a work in progress.
Diffstat (limited to 'pdf/pdf_page.c')
-rw-r--r--pdf/pdf_page.c69
1 files changed, 31 insertions, 38 deletions
diff --git a/pdf/pdf_page.c b/pdf/pdf_page.c
index 9c67edf0..c97eb9b4 100644
--- a/pdf/pdf_page.c
+++ b/pdf/pdf_page.c
@@ -95,7 +95,7 @@ pdf_load_page_tree_node(pdf_xref *xref, fz_obj *node, struct info info)
}
}
-fz_error
+void
pdf_load_page_tree(pdf_xref *xref)
{
struct info info;
@@ -105,9 +105,9 @@ pdf_load_page_tree(pdf_xref *xref)
fz_obj *count = fz_dict_gets(pages, "Count");
if (!fz_is_dict(pages))
- return fz_error_make("missing page tree");
+ fz_throw(ctx, "missing page tree");
if (!fz_is_int(count))
- return fz_error_make("missing page count");
+ fz_throw(ctx, "missing page count");
xref->page_cap = fz_to_int(count);
xref->page_len = 0;
@@ -120,8 +120,6 @@ pdf_load_page_tree(pdf_xref *xref)
info.rotate = NULL;
pdf_load_page_tree_node(xref, pages, info);
-
- return fz_okay;
}
/* We need to know whether to install a page-level transparency group */
@@ -202,10 +200,9 @@ found:
/* we need to combine all sub-streams into one for the content stream interpreter */
-static fz_error
-pdf_load_page_contents_array(fz_buffer **bigbufp, pdf_xref *xref, fz_obj *list)
+static fz_buffer *
+pdf_load_page_contents_array(pdf_xref *xref, fz_obj *list)
{
- fz_error error;
fz_buffer *big;
fz_buffer *one;
int i, n;
@@ -217,10 +214,13 @@ pdf_load_page_contents_array(fz_buffer **bigbufp, pdf_xref *xref, fz_obj *list)
for (i = 0; i < n; i++)
{
fz_obj *stm = fz_array_get(list, i);
- error = pdf_load_stream(&one, xref, fz_to_num(stm), fz_to_gen(stm));
- if (error)
+ fz_try(ctx)
{
- fz_error_handle(error, "cannot load content stream part %d/%d", i + 1, n);
+ one = pdf_load_stream(xref, fz_to_num(stm), fz_to_gen(stm));
+ }
+ fz_catch(ctx)
+ {
+ fz_warn(ctx, "cannot load content stream part %d/%d", i + 1, n);
continue;
}
@@ -236,44 +236,35 @@ pdf_load_page_contents_array(fz_buffer **bigbufp, pdf_xref *xref, fz_obj *list)
if (n > 0 && big->len == 0)
{
fz_drop_buffer(ctx, big);
- return fz_error_make("cannot load content stream");
+ fz_throw(ctx, "cannot load content stream");
}
- *bigbufp = big;
- return fz_okay;
+ return big;
}
-static fz_error
-pdf_load_page_contents(fz_buffer **bufp, pdf_xref *xref, fz_obj *obj)
+static fz_buffer *
+pdf_load_page_contents(pdf_xref *xref, fz_obj *obj)
{
- fz_error error;
fz_context *ctx = xref->ctx;
if (fz_is_array(obj))
{
- error = pdf_load_page_contents_array(bufp, xref, obj);
- if (error)
- return fz_error_note(error, "cannot load content stream array");
+ return pdf_load_page_contents_array(xref, obj);
+ /* RJW: "cannot load content stream array" */
}
else if (pdf_is_stream(xref, fz_to_num(obj), fz_to_gen(obj)))
{
- error = pdf_load_stream(bufp, xref, fz_to_num(obj), fz_to_gen(obj));
- if (error)
- return fz_error_note(error, "cannot load content stream (%d 0 R)", fz_to_num(obj));
- }
- else
- {
- fz_warn(ctx, "page contents missing, leaving page blank");
- *bufp = fz_new_buffer(ctx, 0);
+ return pdf_load_stream(xref, fz_to_num(obj), fz_to_gen(obj));
+ /* RJW: "cannot load content stream (%d 0 R)", fz_to_num(obj) */
}
- return fz_okay;
+ fz_warn(ctx, "page contents missing, leaving page blank");
+ return fz_new_buffer(ctx, 0);
}
-fz_error
-pdf_load_page(pdf_page **pagep, pdf_xref *xref, int number)
+pdf_page *
+pdf_load_page(pdf_xref *xref, int number)
{
- fz_error error;
pdf_page *page;
pdf_annot *annot;
fz_obj *pageobj, *pageref;
@@ -282,7 +273,7 @@ pdf_load_page(pdf_page **pagep, pdf_xref *xref, int number)
fz_context *ctx = xref->ctx;
if (number < 0 || number >= xref->page_len)
- return fz_error_make("cannot find page %d", number + 1);
+ fz_throw(ctx, "cannot find page %d", number + 1);
/* Ensure that we have a store for resource objects */
if (!xref->store)
@@ -341,11 +332,14 @@ pdf_load_page(pdf_page **pagep, pdf_xref *xref, int number)
fz_keep_obj(page->resources);
obj = fz_dict_gets(pageobj, "Contents");
- error = pdf_load_page_contents(&page->contents, xref, obj);
- if (error)
+ fz_try(ctx)
+ {
+ page->contents = pdf_load_page_contents(xref, obj);
+ }
+ fz_catch(ctx)
{
pdf_free_page(ctx, page);
- return fz_error_note(error, "cannot load page %d contents (%d 0 R)", number + 1, fz_to_num(pageref));
+ fz_throw(ctx, "cannot load page %d contents (%d 0 R)", number + 1, fz_to_num(pageref));
}
if (pdf_resources_use_blending(ctx, page->resources))
@@ -355,8 +349,7 @@ pdf_load_page(pdf_page **pagep, pdf_xref *xref, int number)
if (pdf_resources_use_blending(ctx, annot->ap->resources))
page->transparency = 1;
- *pagep = page;
- return fz_okay;
+ return page;
}
void