这一章主要描述了mupdf渲染页面资源,标注,和小部件的大致流程,详细流程将在后面的章节详细描述。
1,渲染页面资源
1.1)创建空页面显示链表 fz_display_list 对象,app->page_list = fz_new_display_list(app->ctx, fz_infinite_rect);
1.2)为页面显示链表创建渲染设备 fz_device对象 mdev = fz_new_list_device(app->ctx, app->page_list);具体实现见附录一。
1.3)页面渲染 fz_run_page_contents(app->ctx, app->page, mdev, fz_identity, &cookie);//具体实现请关注后面的章节。
2,渲染标注资源
2.1)创建空标注显示链表 app->annotations_list = fz_new_display_list(app->ctx, fz_infinite_rect);
2.2)为标注显示链表创建渲染设备 mdev = fz_new_list_device(app->ctx, app->annotations_list);
2.3)普通标注渲染 fz_run_page_annots(app->ctx, app->page, mdev, fz_identity, &cookie);
2.4)小部件渲染 fz_run_page_widgets(app->ctx, app->page, mdev, fz_identity, &cookie);
附录一
fz_device *
fz_new_list_device(fz_context *ctx, fz_display_list *list)
{
fz_list_device *dev;
dev = fz_new_derived_device(ctx, fz_list_device);
dev->super.fill_path = fz_list_fill_path;
dev->super.stroke_path = fz_list_stroke_path;
dev->super.clip_path = fz_list_clip_path;
dev->super.clip_stroke_path = fz_list_clip_stroke_path;
dev->super.fill_text = fz_list_fill_text;
dev->super.stroke_text = fz_list_stroke_text;
dev->super.clip_text = fz_list_clip_text;
dev->super.clip_stroke_text = fz_list_clip_stroke_text;
dev->super.ignore_text = fz_list_ignore_text;
dev->super.fill_shade = fz_list_fill_shade;
dev->super.fill_image = fz_list_fill_image;
dev->super.fill_image_mask = fz_list_fill_image_mask;
dev->super.clip_image_mask = fz_list_clip_image_mask;
dev->super.pop_clip = fz_list_pop_clip;
dev->super.begin_mask = fz_list_begin_mask;
dev->super.end_mask = fz_list_end_mask;
dev->super.begin_group = fz_list_begin_group;
dev->super.end_group = fz_list_end_group;
dev->super.begin_tile = fz_list_begin_tile;
dev->super.end_tile = fz_list_end_tile;
dev->super.render_flags = fz_list_render_flags;
dev->super.set_default_colorspaces = fz_list_set_default_colorspaces;
dev->super.begin_layer = fz_list_begin_layer;
dev->super.end_layer = fz_list_end_layer;
dev->super.drop_device = fz_list_drop_device;
dev->list = fz_keep_display_list(ctx, list);
dev->path = NULL;
dev->alpha = 1.0f;
dev->ctm = fz_identity;
dev->stroke = NULL;
dev->colorspace = fz_keep_colorspace(ctx, fz_device_gray(ctx));
memset(dev->color, 0, sizeof(float)*FZ_MAX_COLORS);
dev->top = 0;
dev->tiled = 0;
return &dev->super;
}