From 4cda8ae62880a807a3b19d68b5407eafeea6e338 Mon Sep 17 00:00:00 2001 From: Tor Andersson <tor.andersson@artifex.com> Date: Mon, 2 Jul 2018 12:06:05 +0200 Subject: Return true if any annots have new APs in pdf_update_page. --- include/mupdf/pdf/document.h | 32 ++++++++++++++++++-------------- source/pdf/pdf-form.c | 14 +++++++------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/include/mupdf/pdf/document.h b/include/mupdf/pdf/document.h index 5ab0fa2c..57e726d3 100644 --- a/include/mupdf/pdf/document.h +++ b/include/mupdf/pdf/document.h @@ -514,20 +514,24 @@ int pdf_add_portfolio_entry(fz_context *ctx, pdf_document *doc, void pdf_set_portfolio_entry_info(fz_context *ctx, pdf_document *doc, int entry, int schema_entry, pdf_obj *data); /* - pdf_update_page: update a page for the sake of changes caused by a call - to pdf_pass_event. pdf_update_page regenerates any appearance streams that - are out of date, checks for cases where different appearance streams - should be selected because of state changes, and records internally - each annotation that has changed appearance. The list of changed annotations - is then available via querying the annot->changed flag. Note that a call to - pdf_pass_event for one page may lead to changes on any other, so an app - should call pdf_update_page for every page it currently displays. Also - it is important that the pdf_page object is the one used to last render - the page. If instead the app were to drop the page and reload it then - a call to pdf_update_page would not reliably be able to report all changed - areas. -*/ -void pdf_update_page(fz_context *ctx, pdf_page *page); + pdf_update_page: Update a page for the sake of changes caused by a call + to pdf_pass_event or annotation editing functions. + + pdf_update_page regenerates any appearance streams that are out of + date, checks for cases where different appearance streams should be + selected because of state changes, and records internally each + annotation that has changed appearance. + + Each annotation that has changed has its has_new_ap flag set to true. + + Note that a call to pdf_pass_event for one page may lead to changes on + any other, so an app should call pdf_update_page for every page it + currently displays. Also it is important that the pdf_page object is + the one used to last render the page. If instead the app were to drop + the page and reload it then a call to pdf_update_page would not + reliably be able to report all changed areas. +*/ +int pdf_update_page(fz_context *ctx, pdf_page *page); /* Determine whether changes have been made since the diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c index 93b88e2c..16811edd 100644 --- a/source/pdf/pdf-form.c +++ b/source/pdf/pdf-form.c @@ -42,14 +42,10 @@ static void pdf_field_mark_dirty(fz_context *ctx, pdf_document *doc, pdf_obj *fi if (kids) { int i, n = pdf_array_len(ctx, kids); - for (i = 0; i < n; i++) pdf_field_mark_dirty(ctx, doc, pdf_array_get(ctx, kids, i)); } - else - { - pdf_dirty_obj(ctx, field); - } + pdf_dirty_obj(ctx, field); } static void update_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *obj, const char *text) @@ -622,14 +618,18 @@ int pdf_pass_event(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_ui_ev return changed; } -void pdf_update_page(fz_context *ctx, pdf_page *page) +int +pdf_update_page(fz_context *ctx, pdf_page *page) { pdf_annot *annot; - + int changed = 0; for (annot = page->annots; annot; annot = annot->next) { pdf_update_annot(ctx, annot); + if (annot->has_new_ap) + changed = 1; } + return changed; } pdf_widget *pdf_focused_widget(fz_context *ctx, pdf_document *doc) -- cgit v1.2.3