From 602cc73633568beec1afe7068bb3a1040b20bba0 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Thu, 16 Jun 2016 16:34:17 +0200 Subject: Add mediabox argument to fz_new_display_list. To return the proper size from fz_bound_display_list, which has been broken since the begin_page device call was removed. --- docs/mutool/run.html | 4 ++-- include/mupdf/fitz/display-list.h | 6 ++++-- platform/x11/pdfapp.c | 6 +++--- source/fitz/font.c | 2 +- source/fitz/list-device.c | 4 ++-- source/fitz/util.c | 3 ++- source/pdf/pdf-appearance.c | 10 +++++----- source/tools/mudraw.c | 3 ++- source/tools/murun.c | 5 +++-- 9 files changed, 24 insertions(+), 19 deletions(-) diff --git a/docs/mutool/run.html b/docs/mutool/run.html index 44eedec0..48c47d81 100644 --- a/docs/mutool/run.html +++ b/docs/mutool/run.html @@ -272,8 +272,8 @@ since then you can avoid reinterpreting the page each time. Be aware though, tha will keep all the graphics required in memory, so will increase the amount of memory required.
-
new DisplayList() -
Create an empty display list. +
new DisplayList(mediabox) +
Create an empty display list. The mediabox rect has the bounds of the page in points.
DisplayList#run(device, transform)
Play back the recorded device calls onto the device.
DisplayList#toPixmap(transform, colorspace, alpha) diff --git a/include/mupdf/fitz/display-list.h b/include/mupdf/fitz/display-list.h index 3881aa28..a7f7fa00 100644 --- a/include/mupdf/fitz/display-list.h +++ b/include/mupdf/fitz/display-list.h @@ -29,8 +29,10 @@ typedef struct fz_display_list_s fz_display_list; A display list contains drawing commands (text, images, etc.). Use fz_new_list_device for populating the list. + + mediabox: Bounds of the page (in points) represented by the display list. */ -fz_display_list *fz_new_display_list(fz_context *ctx); +fz_display_list *fz_new_display_list(fz_context *ctx, const fz_rect *mediabox); /* fz_new_list_device: Create a rendering device for a display list. @@ -89,7 +91,7 @@ fz_display_list *fz_keep_display_list(fz_context *ctx, fz_display_list *list); void fz_drop_display_list(fz_context *ctx, fz_display_list *list); /* - fz_bound_display_list: Return the bounding box of the pages recorded in a display list. + fz_bound_display_list: Return the bounding box of the page recorded in a display list. */ fz_rect *fz_bound_display_list(fz_context *ctx, fz_display_list *list, fz_rect *bounds); diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c index 2b650442..532c217b 100644 --- a/platform/x11/pdfapp.c +++ b/platform/x11/pdfapp.c @@ -669,7 +669,7 @@ static void pdfapp_loadpage(pdfapp_t *app, int no_cache) { fz_annot *annot; /* Create display lists */ - app->page_list = fz_new_display_list(app->ctx); + app->page_list = fz_new_display_list(app->ctx, NULL); mdev = fz_new_list_device(app->ctx, app->page_list); if (no_cache) fz_enable_device_hints(app->ctx, mdev, FZ_NO_CACHE); @@ -677,7 +677,7 @@ static void pdfapp_loadpage(pdfapp_t *app, int no_cache) fz_run_page_contents(app->ctx, app->page, mdev, &fz_identity, &cookie); fz_drop_device(app->ctx, mdev); mdev = NULL; - app->annotations_list = fz_new_display_list(app->ctx); + app->annotations_list = fz_new_display_list(app->ctx, NULL); mdev = fz_new_list_device(app->ctx, app->annotations_list); for (annot = fz_first_annot(app->ctx, app->page); annot; annot = fz_next_annot(app->ctx, annot)) fz_run_annot(app->ctx, annot, mdev, &fz_identity, &cookie); @@ -737,7 +737,7 @@ static void pdfapp_recreate_annotationslist(pdfapp_t *app) { fz_annot *annot; /* Create display list */ - app->annotations_list = fz_new_display_list(app->ctx); + app->annotations_list = fz_new_display_list(app->ctx, NULL); mdev = fz_new_list_device(app->ctx, app->annotations_list); for (annot = fz_first_annot(app->ctx, app->page); annot; annot = fz_next_annot(app->ctx, annot)) fz_run_annot(app->ctx, annot, mdev, &fz_identity, &cookie); diff --git a/source/fitz/font.c b/source/fitz/font.c index d534212c..792e1875 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -1131,7 +1131,7 @@ fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth) /* We've not already loaded this one! */ assert(font->t3lists[gid] == NULL); - font->t3lists[gid] = fz_new_display_list(ctx); + font->t3lists[gid] = fz_new_display_list(ctx, &font->bbox); dev = fz_new_list_device(ctx, font->t3lists[gid]); dev->flags = FZ_DEVFLAG_FILLCOLOR_UNDEFINED | diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c index 5f7d69c8..18af0e20 100644 --- a/source/fitz/list-device.c +++ b/source/fitz/list-device.c @@ -1352,12 +1352,12 @@ fz_drop_display_list_imp(fz_context *ctx, fz_storable *list_) } fz_display_list * -fz_new_display_list(fz_context *ctx) +fz_new_display_list(fz_context *ctx, const fz_rect *mediabox) { fz_display_list *list = fz_malloc_struct(ctx, fz_display_list); FZ_INIT_STORABLE(list, 1, fz_drop_display_list_imp); list->list = NULL; - list->mediabox = fz_empty_rect; + list->mediabox = mediabox ? *mediabox : fz_empty_rect; list->max = 0; list->len = 0; return list; diff --git a/source/fitz/util.c b/source/fitz/util.c index 425d2181..d17cb18c 100644 --- a/source/fitz/util.c +++ b/source/fitz/util.c @@ -4,9 +4,10 @@ fz_display_list * fz_new_display_list_from_page(fz_context *ctx, fz_page *page) { fz_display_list *list; + fz_rect bounds; fz_device *dev; - list = fz_new_display_list(ctx); + list = fz_new_display_list(ctx, fz_bound_page(ctx, page, &bounds)); fz_try(ctx) { diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c index 5eb9c56b..8773ac05 100644 --- a/source/pdf/pdf-appearance.c +++ b/source/pdf/pdf-appearance.c @@ -1709,7 +1709,7 @@ void pdf_set_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *an for (i = 0; i < n; i++) fz_include_point_in_rect(&rect, &qp[i]); - strike_list = fz_new_display_list(ctx); + strike_list = fz_new_display_list(ctx, NULL); dev = fz_new_list_device(ctx, strike_list); for (i = 0; i < n; i += 4) @@ -1831,7 +1831,7 @@ void pdf_update_ink_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *an n = pdf_array_len(ctx, list); - strike_list = fz_new_display_list(ctx); + strike_list = fz_new_display_list(ctx, NULL); dev = fz_new_list_device(ctx, strike_list); path = fz_new_path(ctx); stroke = fz_new_stroke_state(ctx); @@ -2109,7 +2109,7 @@ void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_an fz_matrix tm; pdf_to_rect(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME_Rect), &rect); - dlist = fz_new_display_list(ctx); + dlist = fz_new_display_list(ctx, NULL); dev = fz_new_list_device(ctx, dlist); stroke = fz_new_stroke_state(ctx); stroke->linewidth = outline_thickness; @@ -2197,7 +2197,7 @@ void pdf_update_free_text_annot_appearance(fz_context *ctx, pdf_document *doc, p text = layout_text(ctx, &font_rec, contents, pos.x, pos.y); - dlist = fz_new_display_list(ctx); + dlist = fz_new_display_list(ctx, NULL); dev = fz_new_list_device(ctx, dlist); fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f); @@ -2370,7 +2370,7 @@ void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot fz_matrix logo_tm; unsigned char *bufstr; - dlist = fz_new_display_list(ctx); + dlist = fz_new_display_list(ctx, NULL); dev = fz_new_list_device(ctx, dlist); path = fz_new_path(ctx); diff --git a/source/tools/mudraw.c b/source/tools/mudraw.c index 20a6524d..ecdadc22 100644 --- a/source/tools/mudraw.c +++ b/source/tools/mudraw.c @@ -1100,6 +1100,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum) int start; fz_cookie cookie = { 0 }; int first_page = !output_append; + fz_rect bounds; fz_var(list); fz_var(dev); @@ -1116,7 +1117,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum) { fz_try(ctx) { - list = fz_new_display_list(ctx); + list = fz_new_display_list(ctx, fz_bound_page(ctx, page, &bounds)); dev = fz_new_list_device(ctx, list); if (lowmemory) fz_enable_device_hints(ctx, dev, FZ_NO_CACHE); diff --git a/source/tools/murun.c b/source/tools/murun.c index e9d66742..5315a4f3 100644 --- a/source/tools/murun.c +++ b/source/tools/murun.c @@ -2035,10 +2035,11 @@ static void ffi_Path_rect(js_State *J) static void ffi_new_DisplayList(js_State *J) { fz_context *ctx = js_getcontext(J); + fz_rect mediabox = js_iscoercible(J, 1) ? ffi_torect(J, 1) : fz_empty_rect; fz_display_list *list; fz_try(ctx) - list = fz_new_display_list(ctx); + list = fz_new_display_list(ctx, &mediabox); fz_catch(ctx) rethrow(J); @@ -3322,7 +3323,7 @@ int murun_main(int argc, char **argv) jsB_propcon(J, "fz_font", "Font", ffi_new_Font, 2); jsB_propcon(J, "fz_text", "Text", ffi_new_Text, 0); jsB_propcon(J, "fz_path", "Path", ffi_new_Path, 0); - jsB_propcon(J, "fz_display_list", "DisplayList", ffi_new_DisplayList, 0); + jsB_propcon(J, "fz_display_list", "DisplayList", ffi_new_DisplayList, 1); jsB_propcon(J, "fz_device", "DrawDevice", ffi_new_DrawDevice, 2); jsB_propcon(J, "fz_device", "DisplayListDevice", ffi_new_DisplayListDevice, 1); jsB_propcon(J, "fz_document_writer", "DocumentWriter", ffi_new_DocumentWriter, 3); -- cgit v1.2.3