summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2012-10-29 11:24:39 +0000
committerPaul Gardiner <paulg.artifex@glidos.net>2012-10-29 11:28:04 +0000
commit05219d086a5136ee19f643cf062bd5c0d3aef5d3 (patch)
treef7c2bb0d13b508c1bde2651295e04b68d05dbcf1 /apps
parentc16cadec123f6150cee4008aa4836fbb8ffb0db6 (diff)
downloadmupdf-05219d086a5136ee19f643cf062bd5c0d3aef5d3.tar.xz
Support partial update in pdfapp.c
Diffstat (limited to 'apps')
-rw-r--r--apps/pdfapp.c68
1 files changed, 44 insertions, 24 deletions
diff --git a/apps/pdfapp.c b/apps/pdfapp.c
index 50a213aa..0b684744 100644
--- a/apps/pdfapp.c
+++ b/apps/pdfapp.c
@@ -23,6 +23,7 @@ enum panning
};
static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repaint, int transition);
+static void pdfapp_updatepage(pdfapp_t *app);
static void pdfapp_warn(pdfapp_t *app, const char *fmt, ...)
{
@@ -485,6 +486,34 @@ static void pdfapp_recreate_annotationslist(pdfapp_t *app)
#define MAX_TITLE 256
+static void pdfapp_updatepage(pdfapp_t *app)
+{
+ fz_interactive *idoc = fz_interact(app->doc);
+ fz_device *idev;
+ fz_matrix ctm = pdfapp_viewctm(app);
+ fz_annot *annot;
+
+ fz_update_page(idoc, app->page);
+ pdfapp_recreate_annotationslist(app);
+
+ while ((annot = fz_poll_changed_annot(idoc, app->page)) != NULL)
+ {
+ fz_bbox bbox = fz_round_rect(fz_transform_rect(ctm, fz_bound_annot(app->doc, annot)));
+ fz_clear_pixmap_rect_with_value(app->ctx, app->image, 255, bbox);
+ idev = fz_new_draw_device_with_bbox(app->ctx, app->image, bbox);
+
+ if (app->page_list)
+ fz_run_display_list(app->page_list, idev, ctm, bbox, NULL);
+ if (app->annotations_list)
+ fz_run_display_list(app->annotations_list, idev, ctm, bbox, NULL);
+
+ fz_free_device(idev);
+ }
+
+
+ pdfapp_showpage(app, 0, 0, 1, 0);
+}
+
static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repaint, int transition)
{
char buf[MAX_TITLE];
@@ -506,32 +535,24 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai
if (loadpage)
{
- if (loadpage == 1)
- {
- pdfapp_loadpage(app);
+ pdfapp_loadpage(app);
- /* Zero search hit position */
- app->hit = -1;
- app->hitlen = 0;
+ /* Zero search hit position */
+ app->hit = -1;
+ app->hitlen = 0;
- /* Extract text */
- app->page_sheet = fz_new_text_sheet(app->ctx);
- app->page_text = fz_new_text_page(app->ctx, app->page_bbox);
+ /* Extract text */
+ app->page_sheet = fz_new_text_sheet(app->ctx);
+ app->page_text = fz_new_text_page(app->ctx, app->page_bbox);
- if (app->page_list || app->annotations_list)
- {
- tdev = fz_new_text_device(app->ctx, app->page_sheet, app->page_text);
- if (app->page_list)
- fz_run_display_list(app->page_list, tdev, fz_identity, fz_infinite_bbox, &cookie);
- if (app->annotations_list)
- fz_run_display_list(app->annotations_list, tdev, fz_identity, fz_infinite_bbox, &cookie);
- fz_free_device(tdev);
- }
- }
- else
+ if (app->page_list || app->annotations_list)
{
- /* pdfapp_onmouse passes loadpage == 2, meaning only recreate the annotations list */
- pdfapp_recreate_annotationslist(app);
+ tdev = fz_new_text_device(app->ctx, app->page_sheet, app->page_text);
+ if (app->page_list)
+ fz_run_display_list(app->page_list, tdev, fz_identity, fz_infinite_bbox, &cookie);
+ if (app->annotations_list)
+ fz_run_display_list(app->annotations_list, tdev, fz_identity, fz_infinite_bbox, &cookie);
+ fz_free_device(tdev);
}
}
@@ -1336,8 +1357,7 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
}
app->nowaitcursor = 1;
- fz_update_page(idoc, app->page, NULL, NULL);
- pdfapp_showpage(app, 2, 1, 1, 0);
+ pdfapp_updatepage(app);
app->nowaitcursor = 0;
processed = 1;
}