summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/pdfapp.c68
-rw-r--r--fitz/fitz-internal.h1
-rw-r--r--fitz/fitz.h15
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.