Clutter学习(五):Clutter的兼容性问题——clutter actor的学习

  我们知道Clutter和Intel有很多的关系,我们可以在普通的desktop上使用clutter,也可以在moblin上使用Clutter。Clutter的版本发布就像moblin一样,不断有小版本提供,不过clutter终于有了自己的正式release版本1.0.0,没让我们等得太久。我也在学习做一些小例子,希望能更了解Clutter,下面的例子让我看到了1.0版本和0.9(包括0.9x)不同的地方。我的desktop已经就安装过clutter的0.9版本,在那里闲置了很久。下面的例子,我采用1.0和0.9分别对小例子进行编译,看到了不同的效果。

  It's curious,it's impossible, it's unstable.

  小例子的学习资料来自于:http://www.openismus.com/documents/clutter_tutorial/0.9/docs/tutorial/html/sec-actors.html ,我们在之前的学习中已经涉及了ClutterStage,ClutterTexture两种ClutterActor,对于舞台(stage),我们要看看有哪些演员(actor)。在这个例子中将涉及另外两种演员:ClutterRectangle和ClutterText。例子如下:

#include <stdlib.h>
#include <clutter/clutter.h>

int main(int argc , char * argv[]){
    /* 对于第四个参数:alpha参数的试验:这是透明度。源色彩是指,正要被写到帧缓冲区的那个像素,目标色彩是指已经存在于帧缓冲区的那个像素,在当前设置下,最终的色彩 = 源色彩 * ALPHA + 目标色彩 * 1。这里的ALPAH=alpha/ff。 由于我们的背景设置为0,即实际的RBG是前面给出的数值*alpha/ff。具体参考http://www.cnblogs.com/zhuliangxiong/archive/2009/06/24/1510260.html */
    ClutterColor stage_color ={0x00,0x00,0x00,0xff};
    ClutterColor actor_color ={0xff,0xff,0xff,0xB0};

    clutter_init(&argc, & argv);

    ClutterActor *stage = clutter_stage_get_default();
    clutter_actor_set_size(stage,200,200);
    clutter_stage_set_color(CLUTTER_STAGE(stage),&stage_color);

    /*在stage中添加一个rect(方形)图案,学习ClutterRectangle。*/
    ClutterActor * rect = clutter_rectangle_new_with_color (&actor_color);
    clutter_actor_set_size(rect,100,100);
    clutter_container_add_actor(CLUTTER_CONTAINER(stage),rect);
    clutter_actor_set_position(rect,20,20);
    clutter_actor_show(rect);

    /*在stage中加入一个label,学习Cluttertext,分别试验英文和中文两种显示 */
// ClutterActor * label = clutter_text_new_full ("Sans 10", "Hello,world", &actor_color);
    ClutterActor * label = clutter_text_new_full ("微软雅黑 14", "你好", &actor_color);
    //clutter_actor_set_size(label,500,500); //这步骤实际没有任何影响。
    clutter_actor_set_position(label,20,140);
    clutter_container_add_actor (CLUTTER_CONTAINER(stage),label);
    clutter_actor_show(label);

    clutter_actor_show(stage);

    clutter_actor_show_all(stage);
    clutter_main();

    return EXIT_SUCCESS;
}

  这是个很小的例子,应该很快通过学习。但是出现问题。字体无法正确显示出来。为了进一步确认,我们删除了Rect部分的代码,即只显示text,仍然出现问题。回想到安装clutter时,调用自带example的情况。我决定在0.9和1.0的环境分别跑一下。下面是各自的编译过程:

1.0:
[wei@wei actor]$ make actor
gcc -Wall -g `pkg-config clutter-1.0  --cflags ` -c actor.c -o actor.o
gcc `pkg-config clutter-1.0  --libs` -o actor  actor.o 

0.9:
[wei@wei actor]$ make actor
gcc -Wall -g `pkg-config clutter-0.9  --cflags ` -c actor.c -o actor.o
gcc `pkg-config clutter-0.9  --libs` -o actor  actor.o

  下面是输出的情况、左图是0.9编译的输出结果,右图是1.0

Clutter学习(五):Clutter的兼容性问题——clutter actor的学习_第1张图片 Clutter学习(五):Clutter的兼容性问题——clutter actor的学习_第2张图片

  可以看到Clutter的1.0的情况很有问题。0.9下面无论中文还是英文都能很好的显示,并能根据指定的font的类型和字体大小。看到这样的结果,我对Clutter 1.0 真是一声长叹。我需要进行更多的检查。在1.0的情况下,运行clutter-gtk自动的小例子gtk-clutter-events,这里也有一个ClutterText,显示label的例子。在那里,情况非常古怪,第一次显示,输出同右图,有问题,以后就恢复正常。这是非常奇怪的,几乎不可理喻。

  出现如上右图,一个可能的有效的解决方案是,在show text之前,先show texture,即图片,这样就可以很好地显示文字内容。具体原因不详,只能说是我个人的经验介绍,同样适用于clutter1.0.2,不过这只是在我ATI显卡的机器上的实验结果,在其他的机器上,没有碰到类似情况。

  我觉得label是个基本的功能,不应该出现这样的出错,因此我在不机器上进行了试验,下面是试验的结果:

  • fadora 10,显卡ATI:我的台式机,上面的试验在机器上运行,结果即上两图
  • Ubuntu 9.04 显卡Intel mobile 4系列:无论clutter 0.9或者clutter1.0均能正常显示label,但是无法显示外框,即无那个放大/缩小/关闭的windows border的框,所以无法拖动窗口。Ctrl-C结束进程后,窗口依然存在,需要通过刷新该区域的屏幕才能将窗口去掉。
  • Ubuntu 9.04,显卡没查到,但是显示一切正常
  • 在netbook上的moblin2 beta,显卡intel945,显示一切正常。

出现这种现象因为Clutter和底层硬件进行通信,而绕开了我们很多通用图像显示封装。他和linux的具体OS关系不大,但和底层显示驱动有关。而对显示驱动的适配能力,和Clutter的版本有关,在我们的测试中,0.9版本比1.0版本有更好的适配性,可能是1.0的版本使用了更多的底层硬件能力。这种适配,需要等待Clutter进一步改进。对于linux的很多项目,如果我们不能确定最终应用的硬件,并且希望使用clutter,需要谨慎考虑来进行设计,在上面的例子中,一个好的解决方法,就是将clutter放入GTK容器,由于GTK的兼容,windows border不会出现问题,也可以考虑使用GTK来处理label。对于label,已知ati显卡有问题,但是ati显示安装linux的场景毕竟比较少。总之,均需在系统设计的时候应考虑clutter依赖于显示驱动(又例如vesa不是一个适合的选择)。

 

相关链接:
我的Clutter相关博客

 

你可能感兴趣的:(Clutter学习(五):Clutter的兼容性问题——clutter actor的学习)