diff options
-rw-r--r-- | apps/pdfapp.c | 68 | ||||
-rw-r--r-- | fitz/fitz-internal.h | 1 | ||||
-rw-r--r-- | fitz/fitz.h | 15 |
3 files changed, 59 insertions, 25 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; } diff --git a/fitz/fitz-internal.h b/fitz/fitz-internal.h index 9726dbf7..76a3e774 100644 --- a/fitz/fitz-internal.h +++ b/fitz/fitz-internal.h @@ -828,7 +828,6 @@ struct fz_pixmap_s void fz_free_pixmap_imp(fz_context *ctx, fz_storable *pix); -void fz_clear_pixmap_rect_with_value(fz_context *ctx, fz_pixmap *pix, int value, fz_bbox r); void fz_copy_pixmap_rect(fz_context *ctx, fz_pixmap *dest, fz_pixmap *src, fz_bbox r); void fz_premultiply_pixmap(fz_context *ctx, fz_pixmap *pix); fz_pixmap *fz_alpha_from_gray(fz_context *ctx, fz_pixmap *gray, int luminosity); diff --git a/fitz/fitz.h b/fitz/fitz.h index 89d9038f..0d5a52c0 100644 --- a/fitz/fitz.h +++ b/fitz/fitz.h @@ -1392,6 +1392,21 @@ unsigned char *fz_pixmap_samples(fz_context *ctx, fz_pixmap *pix); void fz_clear_pixmap_with_value(fz_context *ctx, fz_pixmap *pix, int value); /* + fz_clear_pixmap_with_value: Clears a subrect of a pixmap with the given value. + + pix: The pixmap to clear. + + value: Values in the range 0 to 255 are valid. Each component + sample for each pixel in the pixmap will be set to this value, + while alpha will always be set to 255 (non-transparent). + + r: the rectangle. + + Does not throw exceptions. +*/ +void fz_clear_pixmap_rect_with_value(fz_context *ctx, fz_pixmap *pix, int value, fz_bbox r); + +/* fz_clear_pixmap_with_value: Sets all components (including alpha) of all pixels in a pixmap to 0. |