在 Clutter 场景中显示 PDF 页面
之所以开始学习 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
2011年7月20日 14:25
加菲哥,我支持你用这个东西写一个PDF浏览器出来~最好把Evince打翻在地
2011年7月20日 15:51
@Mike Ma: 我觉得 evince 就很好用了。clutter 顶多是能做一个演示工具。
2011年7月21日 23:17
木哈哈,刚又把pinpoint在MinGW下编译了一遍,效果相当不错,
不过没选视频,主要是哪个clutter-gst在win下总是有问题,即使我把依赖库都装了....