mupdf教程 五、pdf页面渲染

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);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值