summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-page.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-03-01 20:18:48 +0100
committerTor Andersson <tor.andersson@artifex.com>2016-03-01 21:57:41 +0100
commitf8751e3c36525a4ce69242c36b89e7d7116ffac2 (patch)
treed9be3be26e8b3f3f1ff8dbbe6716ea6827e70a2d /source/pdf/pdf-page.c
parentfbf50daa7e81ee111df3091048a9336ac29d371f (diff)
downloadmupdf-f8751e3c36525a4ce69242c36b89e7d7116ffac2.tar.xz
Don't use pdf_page struct when creating pages.
Diffstat (limited to 'source/pdf/pdf-page.c')
-rw-r--r--source/pdf/pdf-page.c186
1 files changed, 59 insertions, 127 deletions
diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c
index 7242b16a..a74c388a 100644
--- a/source/pdf/pdf-page.c
+++ b/source/pdf/pdf-page.c
@@ -621,153 +621,85 @@ pdf_delete_page(fz_context *ctx, pdf_document *doc, int at)
}
void
-pdf_insert_page(fz_context *ctx, pdf_document *doc, pdf_page *page, int at)
+pdf_delete_page_range(fz_context *ctx, pdf_document *doc, int start, int end)
{
- int count = pdf_count_pages(ctx, doc);
- pdf_obj *parent, *kids;
- pdf_obj *page_ref;
- int i;
-
- page_ref = pdf_add_object(ctx, doc, page->me);
+ while (start < end)
+ pdf_delete_page(ctx, doc, start++);
+}
+pdf_obj *
+pdf_add_page(fz_context *ctx, pdf_document *doc, const fz_rect *mediabox, int rotate, fz_buffer *contents, pdf_obj *resources)
+{
+ pdf_obj *page_obj = pdf_new_dict(ctx, doc, 5);
fz_try(ctx)
{
- if (count == 0)
- {
- pdf_obj *root = pdf_dict_get(ctx, pdf_trailer(ctx, doc), PDF_NAME_Root);
- parent = pdf_dict_get(ctx, root, PDF_NAME_Pages);
- if (!parent)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page tree");
-
- kids = pdf_dict_get(ctx, parent, PDF_NAME_Kids);
- if (!kids)
- fz_throw(ctx, FZ_ERROR_GENERIC, "malformed page tree");
-
- pdf_array_insert(ctx, kids, page_ref, 0);
- }
- else if (at >= count)
- {
- if (at == INT_MAX)
- at = count;
-
- if (at > count)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot insert page beyond end of page tree");
+ pdf_dict_put_drop(ctx, page_obj, PDF_NAME_Type, PDF_NAME_Page);
+ pdf_dict_put_drop(ctx, page_obj, PDF_NAME_MediaBox, pdf_new_rect(ctx, doc, mediabox));
+ pdf_dict_put_drop(ctx, page_obj, PDF_NAME_Rotate, pdf_new_int(ctx, doc, rotate));
+ pdf_dict_put_drop(ctx, page_obj, PDF_NAME_Contents, pdf_add_stream(ctx, doc, contents));
- /* append after last page */
- pdf_lookup_page_loc(ctx, doc, count - 1, &parent, &i);
- kids = pdf_dict_get(ctx, parent, PDF_NAME_Kids);
- pdf_array_insert(ctx, kids, page_ref, i + 1);
- }
+ if (pdf_is_indirect(ctx, resources))
+ pdf_dict_put(ctx, page_obj, PDF_NAME_Resources, resources);
else
- {
- /* insert before found page */
- pdf_lookup_page_loc(ctx, doc, at, &parent, &i);
- kids = pdf_dict_get(ctx, parent, PDF_NAME_Kids);
- pdf_array_insert(ctx, kids, page_ref, i);
- }
-
- pdf_dict_put(ctx, page->me, PDF_NAME_Parent, parent);
-
- /* Adjust page counts */
- while (parent)
- {
- int count = pdf_to_int(ctx, pdf_dict_get(ctx, parent, PDF_NAME_Count));
- pdf_dict_put_drop(ctx, parent, PDF_NAME_Count, pdf_new_int(ctx, doc, count + 1));
- parent = pdf_dict_get(ctx, parent, PDF_NAME_Parent);
- }
-
- }
- fz_always(ctx)
- {
- pdf_drop_obj(ctx, page_ref);
+ pdf_dict_put_drop(ctx, page_obj, PDF_NAME_Resources, pdf_add_object(ctx, doc, resources));
}
fz_catch(ctx)
{
+ pdf_drop_obj(ctx, page_obj);
fz_rethrow(ctx);
}
-
- doc->page_count = 0; /* invalidate cached value */
+ return pdf_add_object_drop(ctx, doc, page_obj);
}
void
-pdf_delete_page_range(fz_context *ctx, pdf_document *doc, int start, int end)
+pdf_insert_page(fz_context *ctx, pdf_document *doc, int at, pdf_obj *page_ref)
{
- while (start < end)
- pdf_delete_page(ctx, doc, start++);
-}
-
-pdf_page *
-pdf_create_page(fz_context *ctx, pdf_document *doc, const fz_rect *mediabox, int rotate,
- fz_buffer *contents, pdf_obj *resources)
-{
- pdf_page *page = NULL;
- pdf_obj *pageobj, *obj;
- float userunit = 1;
- fz_matrix ctm, tmp;
- fz_rect realbox;
+ int count = pdf_count_pages(ctx, doc);
+ pdf_obj *parent, *kids;
+ int i;
- page = pdf_new_page(ctx, doc);
- obj = NULL;
- fz_var(obj);
+ if (at < 0)
+ at = count;
+ if (at == INT_MAX)
+ at = count;
+ if (at > count)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot insert page beyond end of page tree");
- fz_try(ctx)
+ if (count == 0)
{
- page->me = pageobj = pdf_new_dict(ctx, doc, 4);
-
- pdf_dict_put_drop(ctx, pageobj, PDF_NAME_Type, PDF_NAME_Page);
-
- page->mediabox.x0 = fz_min(mediabox->x0, mediabox->x1) * userunit;
- page->mediabox.y0 = fz_min(mediabox->y0, mediabox->y1) * userunit;
- page->mediabox.x1 = fz_max(mediabox->x0, mediabox->x1) * userunit;
- page->mediabox.y1 = fz_max(mediabox->y0, mediabox->y1) * userunit;
- pdf_dict_put_drop(ctx, pageobj, PDF_NAME_MediaBox, pdf_new_rect(ctx, doc, &page->mediabox));
-
- /* Snap page->rotate to 0, 90, 180 or 270 */
- if (page->rotate < 0)
- page->rotate = 360 - ((-page->rotate) % 360);
- if (page->rotate >= 360)
- page->rotate = page->rotate % 360;
- page->rotate = 90 * ((page->rotate + 45) / 90);
- if (page->rotate > 360)
- page->rotate = 0;
- pdf_dict_put_drop(ctx, pageobj, PDF_NAME_Rotate, pdf_new_int(ctx, doc, page->rotate));
-
- fz_pre_rotate(fz_scale(&ctm, 1, -1), -page->rotate);
- realbox = page->mediabox;
- fz_transform_rect(&realbox, &ctm);
- fz_pre_scale(fz_translate(&tmp, -realbox.x0, -realbox.y0), userunit, userunit);
- fz_concat(&ctm, &ctm, &tmp);
- page->ctm = ctm;
-
- if (contents != NULL)
- {
- obj = pdf_new_dict(ctx, doc, 4);
- page->contents = pdf_add_object(ctx, doc, obj);
- pdf_update_stream(ctx, doc, page->contents, contents, 0);
- pdf_drop_obj(ctx, obj);
- obj = NULL;
- pdf_dict_put(ctx, pageobj, PDF_NAME_Contents, page->contents);
- }
-
- if (resources != NULL)
- {
- if (pdf_is_indirect(ctx, resources))
- pdf_dict_put(ctx, pageobj, PDF_NAME_Resources, resources);
- else
- {
- pdf_obj *ref = pdf_add_object(ctx, doc, resources);
- pdf_dict_put(ctx, pageobj, PDF_NAME_Resources, ref);
- pdf_drop_obj(ctx, ref);
- }
- }
+ pdf_obj *root = pdf_dict_get(ctx, pdf_trailer(ctx, doc), PDF_NAME_Root);
+ parent = pdf_dict_get(ctx, root, PDF_NAME_Pages);
+ if (!parent)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page tree");
+ kids = pdf_dict_get(ctx, parent, PDF_NAME_Kids);
+ if (!kids)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "malformed page tree");
+ pdf_array_insert(ctx, kids, page_ref, 0);
}
- fz_catch(ctx)
+ else if (at == count)
+ {
+ /* append after last page */
+ pdf_lookup_page_loc(ctx, doc, count - 1, &parent, &i);
+ kids = pdf_dict_get(ctx, parent, PDF_NAME_Kids);
+ pdf_array_insert(ctx, kids, page_ref, i + 1);
+ }
+ else
{
- pdf_drop_obj(ctx, page->me);
- pdf_drop_obj(ctx, obj);
- fz_free(ctx, page);
- fz_rethrow_message(ctx, "Failed to create page");
+ /* insert before found page */
+ pdf_lookup_page_loc(ctx, doc, at, &parent, &i);
+ kids = pdf_dict_get(ctx, parent, PDF_NAME_Kids);
+ pdf_array_insert(ctx, kids, page_ref, i);
}
- return page;
+ pdf_dict_put(ctx, page_ref, PDF_NAME_Parent, parent);
+
+ /* Adjust page counts */
+ while (parent)
+ {
+ int count = pdf_to_int(ctx, pdf_dict_get(ctx, parent, PDF_NAME_Count));
+ pdf_dict_put_drop(ctx, parent, PDF_NAME_Count, pdf_new_int(ctx, doc, count + 1));
+ parent = pdf_dict_get(ctx, parent, PDF_NAME_Parent);
+ }
+
+ doc->page_count = 0; /* invalidate cached value */
}