Литье GTK Clutter Textures и обычные ClutterTextures - PullRequest
0 голосов
/ 13 марта 2012

У меня проблема с сортировкой приведенного кода в каком-то старом беспорядочном коде, пытаясь его обновить.Он имеет такой код:

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 ]

1 голос
/ 14 марта 2012

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

0 голосов
/ 13 марта 2012

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

EDIT: В вашем обновленном примере у вас есть clutter_texture_new().Это не то же самое, что gtk_clutter_texture_new(), и поэтому приведение его к GTK_CLUTTER_TEXTURE() пытается привести его к типу, который не является типом, выдавая предупреждение во время выполнения.

...