我们知道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的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是个基本的功能,不应该出现这样的出错,因此我在不机器上进行了试验,下面是试验的结果:
出现这种现象因为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相关博客