Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 伟大的cairo
【标  题】:伟大的cairo
【关键字】:cairo
【来  源】:http://www.cublog.cn/u/5251/showart.php?id=161029

伟大的cairo

Your Ad Here 首先,澄清一个事实,这里的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 <cairo/cairo.h>
#include <gdk/gdk.h>
#include <gtk/gtk.h>

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都开源了,不过,开不开还是需要看它自己的意愿了。

智能指针(smart pointer)::【上一篇】
给大家介绍一个免费的jsp空间:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • ISA Server概述(3)
  • Unix哲学
  • OGRE分析之设计模式(二)
  • 直接获取access、SQL Server等数据库数据
  • SQL Injection(二)――Hex Attack
  • 本年度准备测试Linux桌面版本,Suse为第一个被测试对象
  • 又招人了,招VS.Net开发人员
  • Linux 各版本高速下载
  • 实例讲解在Linux下安装nvidia显卡驱动
  • 优秀3D作品的七个标准
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.