summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-06-16 16:34:17 +0200
committerTor Andersson <tor.andersson@artifex.com>2016-06-17 14:53:21 +0200
commit602cc73633568beec1afe7068bb3a1040b20bba0 (patch)
tree84cb02e9c58af4e70e36b7a0878b0de1d49f6ec4
parentccaf716d6c3f20731aaed277653cf3b1be4e218b (diff)
downloadmupdf-602cc73633568beec1afe7068bb3a1040b20bba0.tar.xz
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.
-rw-r--r--docs/mutool/run.html4
-rw-r--r--include/mupdf/fitz/display-list.h6
-rw-r--r--platform/x11/pdfapp.c6
-rw-r--r--source/fitz/font.c2
-rw-r--r--source/fitz/list-device.c4
-rw-r--r--source/fitz/util.c3
-rw-r--r--source/pdf/pdf-appearance.c10
-rw-r--r--source/tools/mudraw.c3
-rw-r--r--source/tools/murun.c5
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.
<dl>
-<dt>new DisplayList()
-<dd>Create an empty display list.
+<dt>new DisplayList(mediabox)
+<dd>Create an empty display list. The mediabox rect has the bounds of the page in points.
<dt>DisplayList#run(device, transform)
<dd>Play back the recorded device calls onto the device.
<dt>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);