mupdf源码分析(七)显示之页面渲染
本章主要分析mupdf页面内容的渲染,接口是fz_run_page_contents,下面将详细介绍这个接口。
接口声明
/*
*接口说明:在一个设备上渲染一个页面。只有主页内容,没有注释
* page 页面对象
* dev 渲染设备对象
* transform 转换矩阵
* cookie 与调用方的通信机制
*/
void fz_run_page_contents(fz_context *ctx, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie);
接口实现 流程主要是通过pdf_run_page_contents->pdf_run_page_contents_with_usage接口实现的。
1,设置设备色彩空间 fz_set_default_colorspaces(ctx, dev, default_cs);//将色彩空间加入设备显示链表中
2,获取页面显示矩阵
pdf_page_transform(ctx, page, &mediabox, &page_ctm);
ctm = fz_concat(page_ctm, ctm);
mediabox = fz_transform_rect(mediabox, ctm);
3,获取页面资源 resources = pdf_page_resources(ctx, page);//Resources
4,获取页面内容 contents = pdf_page_contents(ctx, page);//Contents
5,设置pdf处理器结构 proc = pdf_new_run_processor(ctx, dev, ctm, usage, NULL, default_cs, cookie);具体实现见附录一。
6,处理页面内容 pdf_process_contents(ctx, proc, doc, resources, contents, cookie);
6.1)初始化pdf_lexbuf 结构 pdf_lexbuf_init(ctx, &buf, PDF_LEXBUF_SMALL);
6.2)初始化 pdf_csi结构 pdf_init_csi(ctx, &csi, doc, rdb, &buf, cookie);
6.3)打开内容流 stm = pdf_open_contents_stream(ctx, doc, stmobj);
6.4)处理内容流 pdf_process_stream(ctx, proc, &csi, stm);
附录一
pdf_processor *
pdf_new_run_processor(fz_context *ctx, fz_device *dev, fz_matrix ctm, const char *usage, pdf_gstate *gstate, fz_default_colorspaces *default_cs, fz_cookie *cookie)
{
pdf_run_processor *proc = pdf_new_processor(ctx, sizeof *proc);//创建对象pdf_run_processor指针
{
/*super:pdf_processor*/
proc->super.usage = usage;
proc->super.close_processor = pdf_close_run_processor;
proc->super.drop_processor = pdf_drop_run_processor;
/* general graphics state */
proc->super.op_w = pdf_run_w;
proc->super.op_j = pdf_run_j;
proc->super.op_J = pdf_run_J;
proc->super.op_M = pdf_run_M;
proc->super.op_d = pdf_run_d;
proc->super.op_ri = pdf_run_ri;
proc->super.op_i = pdf_run_i;
proc->super.op_gs_begin = pdf_run_gs_begin;
proc->super.op_gs_end = pdf_run_gs_end;
/* transparency graphics state */
proc->super.op_gs_BM = pdf_run_gs_BM;
proc->super.op_gs_CA = pdf_run_gs_CA;
proc->super.op_gs_ca = pdf_run_gs_ca;
proc->super.op_gs_SMask = pdf_run_gs_SMask;
/* special graphics state */
proc->super.op_q = pdf_run_q;
proc->super.op_Q = pdf_run_Q;
proc->super.op_cm = pdf_run_cm;
/* path construction */
proc->super.op_m = pdf_run_m;
proc->super.op_l = pdf_run_l;
proc->super.op_c = pdf_run_c;
proc->super.op_v = pdf_run_v;
proc->super.op_y = pdf_run_y;
proc->super.op_h = pdf_run_h;
proc->super.op_re = pdf_run_re;
/* path painting */
proc->super.op_S = pdf_run_S;
proc->super.op_s = pdf_run_s;
proc->super.op_F = pdf_run_F;
proc->super.op_f = pdf_run_f;
proc->super.op_fstar = pdf_run_fstar;
proc->super.op_B = pdf_run_B;
proc->super.op_Bstar = pdf_run_Bstar;
proc->super.op_b = pdf_run_b;
proc->super.op_bstar = pdf_run_bstar;
proc->super.op_n = pdf_run_n;
/* clipping paths */
proc->super.op_W = pdf_run_W;
proc->super.op_Wstar = pdf_run_Wstar;
/* text objects */
proc->super.op_BT = pdf_run_BT;
proc->super.op_ET = pdf_run_ET;
/* text state */
proc->super.op_Tc = pdf_run_Tc;
proc->super.op_Tw = pdf_run_Tw;
proc->super.op_Tz = pdf_run_Tz;
proc->super.op_TL = pdf_run_TL;
proc->super.op_Tf = pdf_run_Tf;
proc->super.op_Tr = pdf_run_Tr;
proc->super.op_Ts = pdf_run_Ts;
/* text positioning */
proc->super.op_Td = pdf_run_Td;
proc->super.op_TD = pdf_run_TD;
proc->super.op_Tm = pdf_run_Tm;
proc->super.op_Tstar = pdf_run_Tstar;
/* text showing */
proc->super.op_TJ = pdf_run_TJ;
proc->super.op_Tj = pdf_run_Tj;
proc->super.op_squote = pdf_run_squote;
proc->super.op_dquote = pdf_run_dquote;
/* type 3 fonts */
proc->super.op_d0 = pdf_run_d0;
proc->super.op_d1 = pdf_run_d1;
/* color */
proc->super.op_CS = pdf_run_CS;
proc->super.op_cs = pdf_run_cs;
proc->super.op_SC_color = pdf_run_SC_color;
proc->super.op_sc_color = pdf_run_sc_color;
proc->super.op_SC_pattern = pdf_run_SC_pattern;
proc->super.op_sc_pattern = pdf_run_sc_pattern;
proc->super.op_SC_shade = pdf_run_SC_shade;
proc->super.op_sc_shade = pdf_run_sc_shade;
proc->super.op_G = pdf_run_G;
proc->super.op_g = pdf_run_g;
proc->super.op_RG = pdf_run_RG;
proc->super.op_rg = pdf_run_rg;
proc->super.op_K = pdf_run_K;
proc->super.op_k = pdf_run_k;
/* shadings, images, xobjects */
proc->super.op_sh = pdf_run_sh;
if (dev->fill_image || dev->fill_image_mask || dev->clip_image_mask)
{
proc->super.op_BI = pdf_run_BI;
proc->super.op_Do_image = pdf_run_Do_image;
}
proc->super.op_Do_form = pdf_run_Do_form;
/* marked content */
proc->super.op_MP = pdf_run_MP;
proc->super.op_DP = pdf_run_DP;
proc->super.op_BMC = pdf_run_BMC;
proc->super.op_BDC = pdf_run_BDC;
proc->super.op_EMC = pdf_run_EMC;
/* compatibility */
proc->super.op_BX = pdf_run_BX;
proc->super.op_EX = pdf_run_EX;
/* extgstate */
proc->super.op_gs_OP = pdf_run_gs_OP;
proc->super.op_gs_op = pdf_run_gs_op;
proc->super.op_gs_OPM = pdf_run_gs_OPM;
proc->super.op_gs_UseBlackPtComp = pdf_run_gs_UseBlackPtComp;
proc->super.op_END = pdf_run_END;
}
proc->dev = dev;
proc->cookie = cookie;
proc->default_cs = fz_keep_default_colorspaces(ctx, default_cs);
proc->path = NULL;
proc->clip = 0;
proc->clip_even_odd = 0;
proc->tos.text = NULL;
proc->tos.tlm = fz_identity;
proc->tos.tm = fz_identity;
proc->tos.text_mode = 0;
proc->gtop = -1;
fz_try(ctx)
{
proc->path = fz_new_path(ctx);
proc->gcap = 64;
proc->gstate = fz_calloc(ctx, proc->gcap, sizeof(pdf_gstate));
proc->gtop = 0;
pdf_init_gstate(ctx, &proc->gstate[0], ctm);
if (gstate)
{
pdf_copy_gstate(ctx, &proc->gstate[0], gstate);
proc->gstate[0].clip_depth = 0;
proc->gstate[0].ctm = ctm;
}
}
fz_catch(ctx)
{
pdf_drop_run_processor(ctx, (pdf_processor *) proc);
fz_free(ctx, proc);
fz_rethrow(ctx);
}
/* We need to save an extra level to allow for level 0 to be the parent gstate level. */
pdf_gsave(ctx, proc);
return (pdf_processor*)proc;
}
mupdf源码分析(七)显示之页面渲染相关推荐
- TeamTalk客户端源码分析七
TeamTalk客户端源码分析七 一,CBaseSocket类 二,select模型 三,样例分析:登录功能 上篇文章我们分析了network模块中的引用计数,智能锁,异步回调机制以及数据的序列化和反 ...
- SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy())
===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...
- Anbox源码分析(四)——Anbox渲染原理(源码分析)
Anbox源码分析(四) 上篇文章我们从源码分析了一下Anbox是怎样一步步的准备了OpenGL ES的渲染环境的,这篇文章,我们继续分析Android的渲染指令是如何到达宿主机进行渲染的. 宿主机端 ...
- PDF阅读器系列之--MuPDF源码分析过程(二)
博客找回来了,在那更新 http://blog.csdn.net/sky_pjf 前 时间好快,又一周过了,发现自己太忙了,博客都没去管-- 序 *MuPDF开源框架现在一直都在维护,我一般都会隔一周 ...
- Spring Security源码分析七:Spring Security 记住我
有这样一个场景--有个用户初访并登录了你的网站,然而第二天他又来了,却必须再次登录.于是就有了"记住我"这样的功能来方便用户使用,然而有一件不言自明的事情,那就是这种认证状态的&q ...
- 【转】ABP源码分析七:Setting 以及 Mail
本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting. 首先区分一下ABP中的Setting和Configuration. Setting一般用于需要通过外部配置文件(或数据 ...
- spring boot 源码分析(七) 事件机制 之 SpringApplicationEvent
2019独角兽企业重金招聘Python工程师标准>>> 一.前言 前面的文章我们讲解了一下spring boot配置文件加载的相关源码分析,下面我们将从源码角度讲解一下spring ...
- Spring Core Container 源码分析七:注册 Bean Definitions
前言 原本以为,Spring 通过解析 bean 的配置,生成并注册 bean defintions 的过程不太复杂,比较简单,不用单独开辟一篇博文来讲述:但是当在分析前面两个章节有关 @Autowi ...
- Anbox源码分析(三)——Anbox渲染原理(源码分析)
Anbox源码分析(三) 上一篇,我们介绍了Anbox视频渲染的原理,这一篇,我们从源码入手,更深入的理解Anbox与渲染的机制和原理 session manager入口 session manage ...
- springfox源码_springfox 源码分析(七) 文档初始化
时间:2019-5-23 20:12:04 地点:家中 通过前面几篇文章对springfox的介绍,以及我们的学习准备工作,这篇我们将正式来探索springfox是如何初始化的 我们在学算法的时候,其 ...
最新文章
- Python使用datetime中的timedelta模块实现时间增减:python计算100天后是哪年那月那日?
- 一般认为计算机发展历史经历,2018年职称计算机考试考前冲刺练习及答案(1)...
- java栈的回收_JAVA的堆栈和内存、垃圾回收解说
- 记录一次【模仿真实环境】的内网漫游
- jvm性能调优实战 -60 线上系统的JVM参数优化、GC问题定位排查、OOM分析解决
- 光刷题不参加这些算法竞赛?太亏了!
- SAP Analytics Cloud的Sample Story
- python姓名输出语句_Python最基本的输入输出详解
- python的return语句求两数之和_程序题(python解)
- TNonblockingServer 连接管理
- 泰山挑夫1(菜鸟题解)
- [SSH] 传输文件
- 预防SQL注入攻击之我见 转
- mysql用jdbc执行回滚吗_java – mysql jdbc不成功回滚
- 学经济为什么学python_工具&方法丨划重点 ! 经济学专业学Python需要学哪些内容?——数据分析处理必知必会的知识点...
- 三星 9810 android 9,【极光ROM】-【三星NOTE9 N960X-9810】-【V17.0 Android-Q-TB9】
- linux系统下载7.0,redhat7.0_redhat enterprise linux 7.0下载 附安装教程 - 121下载站
- python实用程序育儿法下载_Python高级编程
- 全新Swagger3.0教程,OAS3快速配置指南,实现API接口文档自动化!
- android 系统 dpi设置,安卓系统DPI的划分
热门文章
- 2022 年全国职业院校技能大赛 网络搭建与应用赛项正式赛卷
- 乡村振兴战略下传统村落文化旅游设计 | 年度书香,我们的村落,我们的文化,我们的旅游
- 如何在 Mac 上的照片中创建幻灯片
- 维盟路由器 交换机 无线AP
- 给动态生成的id标签添加html,vue动态渲染svg、添加点击事件
- python画米老鼠图片_简笔画:如何使用Flash绘制米老鼠,看完你学会了么
- SAP ABAP 创建销售退货单BAPI_CUSTOMERRETURN_CREATE
- CSS 自适应布局(flex布局)
- vue 刷新当前页面的方式
- 软件公司中的维护团队建设