Casting GTK Clutter纹理和普通的ClutterTextures

时间:2012-03-13 03:38:44

标签: c gtk textures clutter

我在解决某些旧杂乱代码中的转换时遇到问题,试图让它更新。它有这样的代码:

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修复它,这确实可以编译,但是存在运行时错误和缺少pixbuf:

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

发生了什么,为什么会失败?以及如何调试?

1 个答案:

答案 0 :(得分:1)

GtkClutterTexture是ClutterTexture的子类;这意味着您可以将GtkClutterTexture用于接受ClutterTexture的每个函数,但是不能将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()所做的。