static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repaint, int transition, int searching)
{
char buf[MAX_TITLE];
fz_device *idev = NULL;
fz_device *tdev;
fz_colorspace *colorspace;
fz_matrix ctm;
fz_rect bounds;
fz_irect ibounds;
fz_cookie cookie = { 0 };
if (!app->nowaitcursor)
wincursor(app, WAIT);
if (!app->transitions_enabled || !app->presentation_mode)
transition = 0;
if (transition)
{
app->old_image = app->image;
app->image = NULL;
app->imgw = 0;
app->imgh = 0;
}
/* Always reload page if it was flagged incomplete */
if (app->incomplete)
loadpage = 1;
if (loadpage)
{
fz_rect mediabox;
pdfapp_loadpage(app, searching);
/* Zero search hit position */
app->hit_count = 0;
/* Extract text */
fz_try(app->ctx)
mediabox = fz_bound_page(app->ctx, app->page);
fz_catch(app->ctx)
{
fz_rethrow_unless(app->ctx, FZ_ERROR_TRYLATER);
fz_ignore_error(app->ctx);
mediabox = fz_make_rect(0, 0, 100, 100);
app->incomplete = 1;
}
app->page_text = fz_new_stext_page(app->ctx, mediabox);
if (app->page_list || app->annotations_list)
{
tdev = fz_new_stext_device(app->ctx, app->page_text, NULL);
fz_try(app->ctx)
{
pdfapp_runpage(app, tdev, fz_identity, fz_infinite_rect, &cookie);
fz_close_device(app->ctx, tdev);
}
fz_always(app->ctx)
fz_drop_device(app->ctx, tdev);
fz_catch(app->ctx)
fz_rethrow(app->ctx);
}
}
if (drawpage)
{
char buf2[64];
size_t len;
sprintf(buf2, " - %d/%d (%g dpi)",
app->pageno, app->pagecount, app->resolution);
len = MAX_TITLE-strlen(buf2);
if (strlen(app->doctitle) >= len)
{
fz_strlcpy(buf, app->doctitle, len-3);
fz_strlcat(buf, "...", MAX_TITLE);
fz_strlcat(buf, buf2, MAX_TITLE);
}
else
{
fz_strlcpy(buf, app->doctitle, MAX_TITLE);
fz_strlcat(buf, buf2, MAX_TITLE);
}
wintitle(app, buf);
pdfapp_viewctm(&ctm, app);
bounds = fz_transform_rect(app->page_bbox, ctm);
ibounds = fz_round_rect(bounds);
bounds = fz_rect_from_irect(ibounds);
/* Draw */
fz_drop_pixmap(app->ctx, app->image);
if (app->grayscale)
colorspace = fz_device_gray(app->ctx);
else
colorspace = app->colorspace;
app->image = NULL;
app->imgw = 0;
app->imgh = 0;
fz_var(app->image);
fz_var(idev);
fz_try(app->ctx)
{
app->image = fz_new_pixmap_with_bbox(app->ctx, colorspace, ibounds, app->seps, 1);
app->imgw = fz_pixmap_width(app->ctx, app->image);
app->imgh = fz_pixmap_height(app->ctx, app->image);
fz_clear_pixmap_with_value(app->ctx, app->image, 255);
if (app->page_list || app->annotations_list)
{
idev = fz_new_draw_device(app->ctx, fz_identity, app->image);
pdfapp_runpage(app, idev, ctm, bounds, &cookie);
fz_close_device(app->ctx, idev);
}
if (app->invert)
{
fz_invert_pixmap_luminance(app->ctx, app->image);
fz_gamma_pixmap(app->ctx, app->image, 1 / 1.4f);
}
if (app->tint)
fz_tint_pixmap(app->ctx, app->image, 0, app->tint_white);
}
fz_always(app->ctx)
fz_drop_device(app->ctx, idev);
fz_catch(app->ctx)
cookie.errors++;
}
if (transition && drawpage)
{
app->new_image = app->image;
app->image = NULL;
app->imgw = 0;
app->imgh = 0;
if (app->grayscale)
colorspace = fz_device_gray(app->ctx);
else
colorspace = app->colorspace;
app->image = fz_new_pixmap_with_bbox(app->ctx, colorspace, ibounds, app->seps, 1);
app->imgw = fz_pixmap_width(app->ctx, app->image);
app->imgh = fz_pixmap_height(app->ctx, app->image);
app->duration = 0;
fz_page_presentation(app->ctx, app->page, &app->transition, &app->duration);
if (app->duration == 0)
app->duration = app->presentation_time_in_seconds;
app->in_transit = fz_generate_transition(app->ctx, app->image, app->old_image, app->new_image, 0, &app->transition);
if (!app->in_transit)
{
if (app->duration != 0)
winadvancetimer(app, app->duration);
}
app->start_time = clock();
}
if (repaint)
{
pdfapp_panview(app, app->panx, app->pany);
if (!app->image)
{
/* there is no image to blit, but there might be an error message */
winresize(app, app->layout_w, app->layout_h);
}
else if (app->shrinkwrap)
{
int w = app->imgw;
int h = app->imgh;
if (app->winw == w)
app->panx = 0;
if (app->winh == h)
app->pany = 0;
if (w > app->scrw * 90 / 100)
w = app->scrw * 90 / 100;
if (h > app->scrh * 90 / 100)
h = app->scrh * 90 / 100;
if (w != app->winw || h != app->winh)
winresize(app, w, h);
}
winrepaint(app);
wincursor(app, ARROW);
}
if (cookie.errors && app->errored == 0)
{
app->errored = 1;
pdfapp_warn(app, "Errors found on page. Page rendering may be incomplete.");
}
fz_flush_warnings(app->ctx);
}
mupdf教程 五、pdf页面渲染
最新推荐文章于 2024-07-15 16:08:41 发布