Я пытаюсь сделать то, что, как мне казалось, будет тривиально, но независимо от того, что я пытаюсь сделать с ClutterImage
, я получаю сообщение об ошибке Unable to load image data
. Я использую язык Vala, поэтому есть вероятность, что файл Vapi для Clutter неверен. Мне кажется, что GdkPixbuf
, который у меня есть, мне подходит, я могу установить с ним GtkImage
и сохранить его на диск без ошибок, но если я прочитаю файл изображения обратно в GdkPixbuf
-> ClutterImage
, я получаю ту же ошибку от Clutter. Я также пробовал каждое значение COGL_PIXEL_FORMAT_*
, и оно всегда одно и то же, хотя я уверен, что данные изображения имеют формат RGB24
.
Мой код:
private Clutter.Content image;
construct {
...
image = new Clutter.Image ();
...
}
public void set_image (Gdk.Pixbuf pixbuf) {
lock (image) {
unowned uint8[] pixels = pixbuf.get_pixels_with_length ();
assert (pixels.length == pixbuf.width * pixbuf.height * 3);
try {
image.set_data (pixels,
Cogl.PixelFormat.RGB_888;
pixbuf.width,
pixbuf.height,
pixbuf.rowstride);
} catch (Error e) {
critical (e.message);
}
}
}
который я адаптировал из примера C в документации, которую можно увидеть по адресу https://valadoc.org/clutter-1.0/Clutter.Image.set_data.html.
Если это вообще уместно, я могу включить код C, который выплевывает Вала, но мне он кажется правильным.
Я начал думать, что ClutterImage
не работает, поэтому попробовал пример из https://github.com/GNOME/clutter/blob/master/examples/image-content.c с моим файлом изображения, который я сохранил с помощью pixbuf.save (...)
, и он работает. Итак, теперь я думаю, что, возможно, я пытаюсь использовать объект изображения как ClutterActor
в виджете GtkClutterEmbed
. Там действительно не на что смотреть, код
var embed = new GtkClutter.Embed ();
viewport.add (embed);
var stage = embed.get_stage ();
image = new Clutter.Image ();
stage.content = image;
что для меня выглядит так же, как в примере, который работает, в том смысле, что сцена - это ClutterActor
, а ClutterImage
установлено как содержимое актера. Итак... Я немного растерялся.
Простой пример
public static int main (string[] args) {
GtkClutter.init (ref args);
var window = new Gtk.Window ();
var scrolled = new Gtk.ScrolledWindow (null, null);
var embed = new GtkClutter.Embed ();
window.add (scrolled);
scrolled.add_with_viewport (embed);
var pixbuf = new Gdk.Pixbuf.from_file ("image.png");
var image = new Clutter.Image ();
image.set_data (pixbuf.get_pixels (),
Cogl.PixelFormat.RGB_888,
pixbuf.width,
pixbuf.height,
pixbuf.rowstride);
var stage = embed.get_stage ();
stage.content = image;
window.destroy.connect (Gtk.main_quit);
window.show_all ();
Gtk.main ();
return 0;
}
Скомпилировано с использованием
valac --pkg cogl-1.0 --pkg clutter-gtk-1.0 --pkg gtk+-3.0 clutter-image-content.vala