Кастинг текстур 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()
пытается привести его к типу, которого нет, выдавая предупреждение во время выполнения.