本章主要分析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源码分析(七)显示之页面渲染相关推荐

  1. TeamTalk客户端源码分析七

    TeamTalk客户端源码分析七 一,CBaseSocket类 二,select模型 三,样例分析:登录功能 上篇文章我们分析了network模块中的引用计数,智能锁,异步回调机制以及数据的序列化和反 ...

  2. SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy())

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  3. Anbox源码分析(四)——Anbox渲染原理(源码分析)

    Anbox源码分析(四) 上篇文章我们从源码分析了一下Anbox是怎样一步步的准备了OpenGL ES的渲染环境的,这篇文章,我们继续分析Android的渲染指令是如何到达宿主机进行渲染的. 宿主机端 ...

  4. PDF阅读器系列之--MuPDF源码分析过程(二)

    博客找回来了,在那更新 http://blog.csdn.net/sky_pjf 前 时间好快,又一周过了,发现自己太忙了,博客都没去管-- 序 *MuPDF开源框架现在一直都在维护,我一般都会隔一周 ...

  5. Spring Security源码分析七:Spring Security 记住我

    有这样一个场景--有个用户初访并登录了你的网站,然而第二天他又来了,却必须再次登录.于是就有了"记住我"这样的功能来方便用户使用,然而有一件不言自明的事情,那就是这种认证状态的&q ...

  6. 【转】ABP源码分析七:Setting 以及 Mail

    本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting. 首先区分一下ABP中的Setting和Configuration. Setting一般用于需要通过外部配置文件(或数据 ...

  7. spring boot 源码分析(七) 事件机制 之 SpringApplicationEvent

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 前面的文章我们讲解了一下spring boot配置文件加载的相关源码分析,下面我们将从源码角度讲解一下spring  ...

  8. Spring Core Container 源码分析七:注册 Bean Definitions

    前言 原本以为,Spring 通过解析 bean 的配置,生成并注册 bean defintions 的过程不太复杂,比较简单,不用单独开辟一篇博文来讲述:但是当在分析前面两个章节有关 @Autowi ...

  9. Anbox源码分析(三)——Anbox渲染原理(源码分析)

    Anbox源码分析(三) 上一篇,我们介绍了Anbox视频渲染的原理,这一篇,我们从源码入手,更深入的理解Anbox与渲染的机制和原理 session manager入口 session manage ...

  10. springfox源码_springfox 源码分析(七) 文档初始化

    时间:2019-5-23 20:12:04 地点:家中 通过前面几篇文章对springfox的介绍,以及我们的学习准备工作,这篇我们将正式来探索springfox是如何初始化的 我们在学算法的时候,其 ...

最新文章

  1. Python使用datetime中的timedelta模块实现时间增减:python计算100天后是哪年那月那日?
  2. 一般认为计算机发展历史经历,2018年职称计算机考试考前冲刺练习及答案(1)...
  3. java栈的回收_JAVA的堆栈和内存、垃圾回收解说
  4. 记录一次【模仿真实环境】的内网漫游
  5. jvm性能调优实战 -60 线上系统的JVM参数优化、GC问题定位排查、OOM分析解决
  6. 光刷题不参加这些算法竞赛?太亏了!
  7. SAP Analytics Cloud的Sample Story
  8. python姓名输出语句_Python最基本的输入输出详解
  9. python的return语句求两数之和_程序题(python解)
  10. TNonblockingServer 连接管理
  11. 泰山挑夫1(菜鸟题解)
  12. [SSH] 传输文件
  13. 预防SQL注入攻击之我见 转
  14. mysql用jdbc执行回滚吗_java – mysql jdbc不成功回滚
  15. 学经济为什么学python_工具&方法丨划重点 ! 经济学专业学Python需要学哪些内容?——数据分析处理必知必会的知识点...
  16. 三星 9810 android 9,【极光ROM】-【三星NOTE9 N960X-9810】-【V17.0 Android-Q-TB9】
  17. linux系统下载7.0,redhat7.0_redhat enterprise linux 7.0下载 附安装教程 - 121下载站
  18. python实用程序育儿法下载_Python高级编程
  19. 全新Swagger3.0教程,OAS3快速配置指南,实现API接口文档自动化!
  20. android 系统 dpi设置,安卓系统DPI的划分

热门文章

  1. 2022 年全国职业院校技能大赛 网络搭建与应用赛项正式赛卷
  2. 乡村振兴战略下传统村落文化旅游设计 | 年度书香,我们的村落,我们的文化,我们的旅游
  3. 如何在 Mac 上的照片中创建幻灯片
  4. 维盟路由器 交换机 无线AP
  5. 给动态生成的id标签添加html,vue动态渲染svg、添加点击事件
  6. python画米老鼠图片_简笔画:如何使用Flash绘制米老鼠,看完你学会了么
  7. SAP ABAP 创建销售退货单BAPI_CUSTOMERRETURN_CREATE
  8. CSS 自适应布局(flex布局)
  9. vue 刷新当前页面的方式
  10. 软件公司中的维护团队建设