diff options
Diffstat (limited to 'platform')
-rw-r--r-- | platform/x11/jstest_main.c | 6 | ||||
-rw-r--r-- | platform/x11/pdfapp.c | 94 | ||||
-rw-r--r-- | platform/x11/pdfapp.h | 2 | ||||
-rw-r--r-- | platform/x11/win_main.c | 9 | ||||
-rw-r--r-- | platform/x11/x11_main.c | 8 |
5 files changed, 95 insertions, 24 deletions
diff --git a/platform/x11/jstest_main.c b/platform/x11/jstest_main.c index 98fec194..e83cbfe3 100644 --- a/platform/x11/jstest_main.c +++ b/platform/x11/jstest_main.c @@ -152,12 +152,6 @@ void windocopy(pdfapp_t *app) { } -void winreloadfile(pdfapp_t *app) -{ - pdfapp_close(app); - pdfapp_open(app, filename, 1); -} - void winreloadpage(pdfapp_t *app) { } diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c index 3eda4c6f..651b3844 100644 --- a/platform/x11/pdfapp.c +++ b/platform/x11/pdfapp.c @@ -133,6 +133,17 @@ void pdfapp_invert(pdfapp_t *app, const fz_rect *rect) fz_invert_pixmap_rect(app->ctx, app->image, fz_round_rect(&b, rect)); } +void pdfapp_reloadfile(pdfapp_t *app) +{ + fz_context *ctx = app->ctx; + char *filename = app->docpath; + + app->docpath = NULL; + pdfapp_close(app); + pdfapp_open(app, filename, 1); + fz_free(ctx, filename); +} + static void event_cb(fz_context *ctx, pdf_document *doc, pdf_doc_event *event, void *data) { pdfapp_t *app = (pdfapp_t *)data; @@ -208,6 +219,75 @@ pdfapp_more_data(void *app_, int complete) } #endif +static int make_fake_doc(pdfapp_t *app) +{ + fz_context *ctx = app->ctx; + fz_matrix ctm = { 1, 0, 0, 1, 0, 0 }; + fz_rect bounds; + pdf_page *newpage = NULL; + pdf_document *pdf = NULL; + fz_device *dev = NULL; + fz_path *path = NULL; + fz_stroke_state stroke = fz_default_stroke_state; + float red[3] = { 1, 0, 0 }; + int i; + + fz_var(pdf); + fz_var(dev); + fz_var(newpage); + + fz_try(ctx) + { + pdf = pdf_create_document(ctx); + app->doc = &pdf->super; + bounds.x0 = 0; + bounds.y0 = 0; + bounds.x1 = app->winw; + bounds.y1 = app->winh; + + newpage = pdf_create_page(ctx, pdf, bounds, 72, 0); + + dev = pdf_page_write(ctx, pdf, newpage); + + /* Now the page content */ + fz_begin_page(ctx, dev, &bounds, &ctm); + + path = fz_new_path(ctx); + fz_moveto(ctx, path, 0, 0); + fz_lineto(ctx, path, bounds.x1, bounds.y1); + fz_moveto(ctx, path, 0, bounds.y1); + fz_lineto(ctx, path, bounds.x1, 0); + + stroke.linewidth = fz_min(bounds.x1, bounds.y1)/4; + + fz_stroke_path(ctx, dev, path, &stroke, &ctm, fz_device_rgb(ctx), red, 1); + + fz_end_page(ctx, dev); + + fz_drop_device(ctx, dev); + dev = NULL; + + /* Create enough copies of our blank(ish) page so that the + * page number is preserved if and when a subsequent load + * works. */ + for (i = 0; i < app->pagecount; i++) + pdf_insert_page(ctx, pdf, newpage, INT_MAX); + } + fz_always(ctx) + { + fz_drop_path(ctx, path); + pdf_drop_page(ctx, newpage); + fz_drop_device(ctx, dev); + dev = NULL; + } + fz_catch(ctx) + { + fz_rethrow(ctx); + } + + return 0; +} + void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps) { fz_context *ctx = app->ctx; @@ -215,8 +295,6 @@ void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps) fz_try(ctx) { - pdf_document *idoc; - fz_register_document_handlers(ctx); #ifdef HAVE_CURL @@ -270,6 +348,16 @@ void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps) break; } } + } + fz_catch(ctx) + { + if (!reload || make_fake_doc(app)) + pdfapp_error(app, "cannot open document"); + } + + fz_try(ctx) + { + pdf_document *idoc; idoc = pdf_specifics(app->ctx, app->doc); @@ -1332,7 +1420,7 @@ void pdfapp_onkey(pdfapp_t *app, int c, int modifiers) case 'r': panto = DONT_PAN; oldpage = -1; - winreloadfile(app); + pdfapp_reloadfile(app); break; /* diff --git a/platform/x11/pdfapp.h b/platform/x11/pdfapp.h index 3c298b67..5d748ad6 100644 --- a/platform/x11/pdfapp.h +++ b/platform/x11/pdfapp.h @@ -32,7 +32,6 @@ extern int winchoiceinput(pdfapp_t*, int nopts, char *opts[], int *nvals, char * extern void winopenuri(pdfapp_t*, char *s); extern void wincursor(pdfapp_t*, int curs); extern void windocopy(pdfapp_t*); -extern void winreloadfile(pdfapp_t*); extern void windrawstring(pdfapp_t*, int x, int y, char *s); extern void winclose(pdfapp_t*); extern void winhelp(pdfapp_t*); @@ -141,6 +140,7 @@ void pdfapp_open(pdfapp_t *app, char *filename, int reload); void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps); void pdfapp_close(pdfapp_t *app); int pdfapp_preclose(pdfapp_t *app); +void pdfapp_reloadfile(pdfapp_t *app); char *pdfapp_version(pdfapp_t *app); char *pdfapp_usage(pdfapp_t *app); diff --git a/platform/x11/win_main.c b/platform/x11/win_main.c index 32121f5f..444e8d67 100644 --- a/platform/x11/win_main.c +++ b/platform/x11/win_main.c @@ -650,8 +650,10 @@ void winopen() static void do_close(pdfapp_t *app) { + fz_context *ctx = app->ctx; pdfapp_close(app); free(dibinf); + fz_drop_context(ctx); } void winclose(pdfapp_t *app) @@ -881,12 +883,6 @@ void windocopy(pdfapp_t *app) justcopied = 1; /* keep inversion around for a while... */ } -void winreloadfile(pdfapp_t *app) -{ - pdfapp_close(app); - pdfapp_open(app, filename, 1); -} - void winreloadpage(pdfapp_t *app) { SendMessage(hwndview, WM_APP, 0, 0); @@ -1229,7 +1225,6 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShow } do_close(&gapp); - fz_drop_context(ctx); return 0; } diff --git a/platform/x11/x11_main.c b/platform/x11/x11_main.c index 085c58d8..0da79469 100644 --- a/platform/x11/x11_main.c +++ b/platform/x11/x11_main.c @@ -713,12 +713,6 @@ void winreloadpage(pdfapp_t *app) XCloseDisplay(dpy); } -void winreloadfile(pdfapp_t *app) -{ - pdfapp_close(app); - pdfapp_open(app, filename, 1); -} - void winopenuri(pdfapp_t *app, char *buf) { char *browser = getenv("BROWSER"); @@ -1078,7 +1072,7 @@ int main(int argc, char **argv) { if (reloading) { - winreloadfile(&gapp); + pdfapp_reloadfile(&gapp); reloading = 0; } } |