Кастинг текстур GTK Clutter и нормальных текстур 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, это компилируется, но есть ошибки времени выполнения и отсутствие 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

Что происходит, и почему это терпит неудачу? и как это можно отладить?

2 ответа

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().

Вы передаете неинициализированный GtkClutterTexture * указатель на функцию, которая содержит только мусор. Вам нужно создать GtkClutterTexture использование объекта gtk_clutter_texture_new() прежде чем вы можете заполнить его pixbuf.

РЕДАКТИРОВАТЬ: в вашем обновленном примере у вас есть clutter_texture_new(), Это не то же самое, что gtk_clutter_texture_new()и таким образом GTK_CLUTTER_TEXTURE() пытается привести его к типу, которого нет, выдавая предупреждение во время выполнения.

Другие вопросы по тегам