2012-03-13 33 views
0

我在整理一些旧杂波代码中的铸件时遇到问题,试图使其更新。它有这样的代码:铸造GTK杂波纹理和正常杂波纹理

static void image_init(CtkImage *image) 
{ 
    priv->texture = clutter_texture_new(); 
    ... 
} 

static void refresh_icon (CtkImage *image) 
{ 
    CtkImagePrivate *priv = image->priv; 
    gtk_clutter_texture_set_from_pixbuf (CLUTTER_TEXTURE (priv->texture), priv->pixbuf, NULL); 
} 

这将产生此编译时错误:

error: passing argument 1 of ‘gtk_clutter_texture_set_from_pixbuf’ from incompatible pointer type [-Werror] 
/usr/include/clutter-gtk-1.0/clutter-gtk/gtk-clutter-texture.h:99:17: note: expected ‘struct GtkClutterTexture *’ but argument is of type ‘struct ClutterTexture *’ 

我以为我可以用GTK_CLUTTER_TEXTURE修复它,这并不编译,但运行时错误和不足pixbufs的:

gtk_clutter_texture_set_from_pixbuf (GTK_CLUTTER_TEXTURE (texture), tiled, NULL); 

结果造成:

GLib-GObject-WARNING **: invalid cast from `ClutterTexture' to `GtkClutterTexture' 

Clutter-Gtk-CRITICAL **: gtk_clutter_texture_set_from_pixbuf: assertion `GTK_CLUTTER_IS_TEXTURE (texture)' failed 

这是怎么回事,为什么这会失败?以及它如何被调试?

回答

0

您正在将未初始化的GtkClutterTexture *指针传递给仅包含垃圾的函数。您需要先使用gtk_clutter_texture_new()创建一个GtkClutterTexture对象,然后才能用pixbuf填充它。

编辑: 在你更新的例子中,你有一个clutter_texture_new()。这与gtk_clutter_texture_new()并不相同,因此使用GTK_CLUTTER_TEXTURE()将它转换为不是的类型,会产生运行时警告。

+0

我没有在示例代码中显示它(道歉),但我们有一个gtk_clutter_texture_new,它附加到一个私人对象,所以我不想让这个例子复杂化。我已经更新了它。 – 2012-03-13 14:05:28

1

GtkClutterTexture是ClutterTexture的子类;这意味着您可以在接受ClutterTexture的每个函数中使用GtkClutterTexture,但不能将ClutterTexture与使用GtkClutterTexture的方法一起使用。

在示例中,您使用clutter_texture_new()创建纹理,然后将该指针传递给gtk_clutter_texture_set_from_pixbuf()。你可以创建一个GtkClutterTexture,或者你使用clutter_texture_set_from_rgb_data()函数从GdkPixbuf设置图像数据,使用类似:

clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE (texture), 
            gdk_pixbuf_get_pixels (pixbuf), 
            gdk_pixbuf_get_has_alpha (pixbuf), 
            gdk_pixbuf_get_width (pixbuf), 
            gdk_pixbuf_get_height (pixbuf), 
            gdk_pixbuf_get_rowstride (pixbuf), 
            gdk_pixbuf_get_has_alpha (pixbuf) ? 4 : 3, 
            CLUTTER_TEXTURE_NONE, 
            &gerror); 

这正是GtkClutterTexture.set_from_pixbuf()一样。