Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2039087
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类: C/C++

2006-08-27 02:24:37

首先,澄清一个事实,这里的cairo并不是埃及的那个名字为cairo的首都,我所要说的是一个二维图形库,也就是当前gtk+所用的绘图引擎。:)
缘起于要重构以前的Xlyrics,因为又有人加入了此软件的开发(事实上是我同意了maskway的热情邀请),所以也就再次燃起了我对这个东西的激情。一些函数早就开始陆陆续续的完善了,比如用dbm重写的链接cache和用perl语言写的歌词搜索程序等,最近主要是研究如何更好的显示歌词,歌词秀软件不就是秀(show)歌词的吗?如果界面比较邋遢,当然也就会影响食欲了,更确切地说似乎应该是影响跟着哼歌的人的发挥。实际上,已经有同学批评我这个软件的界面象一坨x,因为我那个时候总是选择用棕黄色作为背景界面,所以得此美誉,惭愧!不过话说回来,以我当时的水平,跌跌撞撞写到那个样子,已经算是不错了,甚至于当时有些洋洋得意,必经是自己写的第一个实用的软件啊(虽然有很多东西都是从别人那里“借鉴”来的,比如用tree_view来显示和滚动歌词)!
时隔近两年,世界在飞快的变化着,开源工程也同样进行着突飞猛进地蜕变,一些软件被拆分(比如Xorg-X11),一些东西被标准化(比如说Freedesktop组织致力于桌面环境的标准化),一些软件被后浪之水淹没着(比如XMMS => Beep Media Plaer => BMPX => ?),等等。总体来说,大家都在努力将Linux变得更加完善,从根本上来说也是让生活变得更加简单,便捷,并且大家一直没有停止过,这是一股多么强大的力量啊!
Linux的图形界面历来也是为大家所诟病的,因为效率比较低下,界面较为干燥(哈哈!)。曾迷信于根源为将X的支持做到了用户空间,不过事实逐渐明朗,这些都不是本质,源于桌面环境并未用显卡提供的强有力的3D引擎来加速,而Windows和Mac这些系统确都是将显卡物尽其用了,时代变了,所以Linux也就需要再度变了。
cairo是一个跨平台的(支持Windows的哦)2D矢量图形库,不同于其他引擎的是他是通过调用显卡的3D接口来显示图形的,这样就把一部分图形运算交给显卡的GPU来处理,将CPU节省出来,结果也就是不言而寓的了。
cairo是个好东西,他的那些API也很简洁易用。用cairo的感觉就像是画家在作画,cairo的句柄更象是一支实实在在的画笔,可以随意的更改颜色,改变形状,反正比windows下面的画图板要强大多了,我想对于想用代码来生活的人来说可能也是更方便的。
说了那么多,来个例子吧!还是和Xlyrics相关的,以前总是迷惑如何渲染半个字体,有了cairo,好像也不是很难了,主要的原理就是:从已经渲染好的图片上截下来需要渲染的部分,然后用这部分覆盖以前的部分,其效果不就相同了么?
因为CU贴图不方便,就只给出代码,大家编译了去看吧,不要告诉我不会编译哦!

#include
#include
#include

static gboolean handle_expose(GtkWidget *widget,
                GdkEventExpose *event, gpointer *data)
{
        cairo_t *cr;
        PangoLayout *layout;
        PangoFontDescription *desc;
        gint width, height;
        static gint i = 0;

        cr = gdk_cairo_create(widget->window);
        layout = pango_cairo_create_layout (cr);

        pango_layout_set_text(layout, "浣犲ソ,Xlyrics!", -1);
        desc = pango_font_description_from_string("SimSun Bold 81");
        pango_layout_set_font_description(layout, desc);
        pango_font_description_free(desc);

        cairo_save(cr);
        cairo_set_source_rgb(cr, 0, 0, 0);
        pango_cairo_update_layout(cr, layout);
        pango_cairo_show_layout(cr, layout);
        cairo_restore(cr);

        cairo_save(cr);
        cairo_set_source_rgb(cr, 0, 1, 0);
        pango_cairo_update_layout(cr, layout);
        pango_layout_get_size(layout, &width, &height);
        cairo_rectangle(cr, 0, 0, i, height/PANGO_SCALE);
        cairo_clip(cr);
        pango_cairo_show_layout(cr, layout);
        cairo_restore(cr);

        g_object_unref(layout);
        cairo_destroy(cr);

        if(i >= width/PANGO_SCALE)
                i = 0;
        else
                i += 10;

        return FALSE;
}

static gboolean handle_timeout(GtkWidget *widget)
{
        handle_expose(widget, NULL, NULL);
        return TRUE;
}

int main(int argc, char **argv)
{
        GtkWidget *window, *drawing_area;

        gtk_init(&argc, &argv);

        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
        gtk_window_set_title(GTK_WINDOW(window), "Xlyrics with pango and cairo");
        g_signal_connect(window, "delete-event",
                        G_CALLBACK(gtk_main_quit), NULL);

        drawing_area = gtk_drawing_area_new();
        gtk_container_add(GTK_CONTAINER(window), drawing_area);
        g_signal_connect(drawing_area, "expose-event",
                        G_CALLBACK(handle_expose), NULL);

        gtk_widget_show_all(window);

        g_timeout_add(100, handle_timeout, drawing_area);

        gtk_main ();

        return 0;
}
BTW:这个代码在我机器上运行的时侯,字体有些闪烁,可能和我没用nvidia的驱动有关。嗨,如果nvidia的源码是开放的,估计对于xorg-x11-7.1的支持早就搞定了,害得我!Nvidia这方面做得不太好,Intel和ATI都开源了,不过,开不开还是需要看它自己的意愿了。

阅读(3775) | 评论(3) | 转发(0) |
0

上一篇:Waiting Bar

下一篇:分块渲染字体

给主人留下些什么吧!~~