diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2018-07-06 14:20:26 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2018-08-10 12:09:10 +0200 |
commit | 0abcccc4aab4d893ac2a0ef116ff1f0c006fbc30 (patch) | |
tree | 8fe312208afaf28e2d759f4a1c53ec4ef131124f /source | |
parent | 6f8cb5606e426084160eaec82e9c11966e7fb5f4 (diff) | |
download | mupdf-0abcccc4aab4d893ac2a0ef116ff1f0c006fbc30.tar.xz |
Rejig pdf_update_page and pdf_update_annot.
The intent is for a user to iterate over the annotations on a page calling
pdf_update_annot for each one. If this function returns true, then the
annotation has changed since the last time it was called, and the user
needs to re-render.
pdf_update_page is a simple loop over the annotations on a page, for use
if you only care about page level granularity.
Users should no longer look at or change the pdf_annot.has_new_ap field.
Diffstat (limited to 'source')
-rw-r--r-- | source/pdf/pdf-appearance.c | 7 | ||||
-rw-r--r-- | source/pdf/pdf-form.c | 3 | ||||
-rw-r--r-- | source/tools/murun.c | 26 |
3 files changed, 33 insertions, 3 deletions
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c index 67a01fa9..fb5b8343 100644 --- a/source/pdf/pdf-appearance.c +++ b/source/pdf/pdf-appearance.c @@ -1373,11 +1373,12 @@ void pdf_update_appearance(fz_context *ctx, pdf_annot *annot) } } -void +int pdf_update_annot(fz_context *ctx, pdf_annot *annot) { pdf_document *doc = annot->page->doc; pdf_obj *obj, *ap, *as, *n; + int changed = 0; /* TODO: handle form field updates without using the annot pdf_obj dirty flag */ obj = annot->obj; @@ -1415,4 +1416,8 @@ pdf_update_annot(fz_context *ctx, pdf_annot *annot) annot->has_new_ap = 1; } } + + changed = annot->has_new_ap; + annot->has_new_ap = 0; + return changed; } diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c index 8521d63d..d6969ce7 100644 --- a/source/pdf/pdf-form.c +++ b/source/pdf/pdf-form.c @@ -633,8 +633,7 @@ pdf_update_page(fz_context *ctx, pdf_page *page) int changed = 0; for (annot = page->annots; annot; annot = annot->next) { - pdf_update_annot(ctx, annot); - if (annot->has_new_ap) + if (pdf_update_annot(ctx, annot)) changed = 1; } return changed; diff --git a/source/tools/murun.c b/source/tools/murun.c index c6ad673f..02144df4 100644 --- a/source/tools/murun.c +++ b/source/tools/murun.c @@ -4040,6 +4040,18 @@ static void ffi_PDFPage_deleteAnnotation(js_State *J) rethrow(J); } +static void ffi_PDFPage_update(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_page *page = js_touserdata(J, 0, "pdf_page"); + int changed = 0; + fz_try(ctx) + changed = pdf_update_page(ctx, page); + fz_catch(ctx) + rethrow(J); + js_pushboolean(J, changed); +} + static void ffi_PDFAnnotation_getType(js_State *J) { fz_context *ctx = js_getcontext(J); @@ -4435,6 +4447,18 @@ static void ffi_PDFAnnotation_updateAppearance(js_State *J) rethrow(J); } +static void ffi_PDFAnnotation_update(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + pdf_annot *annot = js_touserdata(J, 0, "pdf_annot"); + int changed = 0; + fz_try(ctx) + changed = pdf_update_annot(ctx, annot); + fz_catch(ctx) + rethrow(J); + js_pushboolean(J, changed); +} + #endif /* FZ_ENABLE_PDF */ int murun_main(int argc, char **argv) @@ -4737,6 +4761,7 @@ int murun_main(int argc, char **argv) { jsB_propfun(J, "PDFPage.createAnnotation", ffi_PDFPage_createAnnotation, 1); jsB_propfun(J, "PDFPage.deleteAnnotation", ffi_PDFPage_deleteAnnotation, 1); + jsB_propfun(J, "PDFPage.update", ffi_PDFPage_update, 0); } js_setregistry(J, "pdf_page"); @@ -4765,6 +4790,7 @@ int murun_main(int argc, char **argv) jsB_propfun(J, "PDFAnnotation.getModificationDate", ffi_PDFAnnotation_getModificationDate, 0); jsB_propfun(J, "PDFAnnotation.setModificationDate", ffi_PDFAnnotation_setModificationDate, 0); jsB_propfun(J, "PDFAnnotation.updateAppearance", ffi_PDFAnnotation_updateAppearance, 0); + jsB_propfun(J, "PDFAnnotation.update", ffi_PDFAnnotation_update, 0); } js_setregistry(J, "pdf_annot"); |