五个演员
Clutter 布局管理

在 Clutter 场景中显示 PDF 页面

Garfileo posted @ 2011年7月18日 09:46 in Clutter 笔记 with tags Cairo clutter poppler , 4748 阅读

之所以开始学习 Clutter 主要是因为 Pinpoint [1] 引起了一些兴趣,用 Clutter 来制作 PDF 文档的演示工具,效果应该会很好。对 Clutter 的一些基本的 Actor 有所了解之后,发现要实现这个 PDF 演示工具不是很困难。按照 Clutter cookbook [2] 的提示,可以利用 Poppler 库轻易的载入 PDF 页面并将其渲染到 Cairo 环境中,继而使用 ClutterCairoTexture 将 PDF 页面显示在 Stage 中。

看下面的示例:

#include <clutter/clutter.h>
#include <poppler/glib/poppler.h>

static void
pdf_page_actor_create (ClutterActor *box, PopplerDocument *doc, gint index)
{
        gdouble w, h;
        PopplerPage *page = poppler_document_get_page (doc, index);
        poppler_page_get_size (page, &w, &h);
        
        ClutterActor *pdf_actor = clutter_cairo_texture_new (w, h);
        cairo_t *cr = clutter_cairo_texture_create (CLUTTER_CAIRO_TEXTURE (pdf_actor));
        cairo_rectangle (cr, 0, 0, w, h);
        cairo_set_source_rgb (cr, 1, 1, 1);
        cairo_fill (cr);
        poppler_page_render (page, cr);
        cairo_destroy (cr);        

        clutter_actor_set_size (pdf_actor, 0.4*w, 0.4*h);
        clutter_box_pack (CLUTTER_BOX (box), pdf_actor,
                          "x-align", CLUTTER_BOX_ALIGNMENT_CENTER,
                          "y-align", CLUTTER_BOX_ALIGNMENT_CENTER,
                          "expand", TRUE,
                          NULL);
}

int
main(int argc, char *argv[])
{
        if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
                return 1;

        /* 读入 pdf */
        PopplerDocument *doc = poppler_document_new_from_file ("file:///home/garfileo/test.pdf", NULL, NULL);
        
        ClutterColor stage_color = { 0x21, 0x43, 0x5e, 0xff };
        gfloat w = 800, h = 600;
          
        /* 获取默认的 Stage 并设置其尺寸与颜色 */
        ClutterActor *stage = clutter_stage_get_default ();
        clutter_stage_set_title (CLUTTER_STAGE (stage), "Hello Cairo!");
        clutter_actor_set_size (stage, w, h);
        clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);

        /* 构建盒子,将 Cairo 纹理 Actor 添加到盒子中 */
        ClutterLayoutManager *layout = clutter_box_layout_new ();
        clutter_box_layout_set_homogeneous (CLUTTER_BOX_LAYOUT (layout), TRUE);
        clutter_box_layout_set_spacing (CLUTTER_BOX_LAYOUT (layout), 10);
        
        ClutterActor *box = clutter_box_new (layout);
        clutter_actor_set_size (box, w, h);
        pdf_page_actor_create (box, doc, 0);
        pdf_page_actor_create (box, doc, 11);
        pdf_page_actor_create (box, doc, 12);        
        clutter_container_add_actor (CLUTTER_CONTAINER (stage), box);
        
        /* 显示 Stage 及其子 Actor 对象 */
        clutter_actor_show_all (stage);
        
        /* 开启 Clutter 主循环,响应事件 */
        clutter_main ();
        
        return 0;
}

这个程序所执行的任务是从我的 Home 目录中读取 test.pdf 文件,并在 Clutter Stage 中以 Cairo 纹理 Actor 的形式显示 PDF 文件的第 1、12、13 页。

编译这个示例的命令为:

$ gcc $(pkg-config --cflags --libs clutter-1.0 poppler-glib) test.c -o test

效果如下图所示:

参考文献

[1] Pinpoint 的演示视频

[2] Clutter Cookbook

转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com

Avatar_small
Mike Ma 说:
2011年7月20日 14:25

加菲哥,我支持你用这个东西写一个PDF浏览器出来~最好把Evince打翻在地

Avatar_small
Garfileo 说:
2011年7月20日 15:51

@Mike Ma: 我觉得 evince 就很好用了。clutter 顶多是能做一个演示工具。

pingf 说:
2011年7月21日 23:17

木哈哈,刚又把pinpoint在MinGW下编译了一遍,效果相当不错,
不过没选视频,主要是哪个clutter-gst在win下总是有问题,即使我把依赖库都装了....


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter