Haris Kovacevic
Haris Kovacevic

Reputation: 15

Gtk3 loading PixbufAnimation inside DrawingArea?

For the purpose of mine gstreamer application I tought about simple loader before I give a handle of DrawingArea widget to sink element.The basic idea was to load an animated .gif inside Gtk.DrawingArea but I run on the problem with documentation.I found out about PixbufAnimation and I used it with Gtk.Image widget but the same logic doesn't work for Gtk.DrawingArea and since it doesn't have add method I don't know what to do so as my last resort I came here to get a help.

This is what I did with Gtk.Image:

from gi.repository import Gdk,Gtk,GdkPixbuf



class animatedWin(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self,width_request=640,height_request=480)
        self.canvas=Gtk.Image()
        self.add(self.canvas)
        self.load_file()
        self.connect("delete-event",self.Gtk.main_quit)
    def load_file(self):
        self.loader=GdkPixbuf.PixbufAnimation.new_from_file("loader.gif")
        self.canvas.set_from_animation(self.loader)


app=animatedWin()
app.show_all()

Gtk.main()

is it possible to achieve the same thing with DrawingArea ?

Upvotes: 1

Views: 686

Answers (1)

Loid
Loid

Reputation: 11

DrawingArea like most widgets in gtk3 uses cairo for drawing on them. Cairo draws on surfaces using context. You can convert pixbuf into surface by

public Surface Gdk.cairo_surface_create_from_pixbuf (Pixbuf pixbuf, int scale, Window? for_window)

And back by

public Pixbuf? Gdk.pixbuf_get_from_surface (Surface surface, int src_x, int src_y, int width, int height)

(taken from valadoc.org)

Example code snippet from my drawing app (I'm learning Vala while I writing it, so it may not be best implementation):

private void on_scale (Gtk.Button button) { // on button press
            var my_pixbuf = Gdk.pixbuf_get_from_surface (this.buf_surface, 0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
            var tmp_surface = Gdk.cairo_surface_create_from_pixbuf (my_pixbuf, 2, null);
            var ctx = this.ccc; //this.ccc is context of drawing surface
            ctx.set_source_surface (tmp_surface, 0, 0);
            ctx.paint();
            drawing_area.queue_draw(); // ask drawing_area to redraw, on redraw I have function/method that will paint drawing_area widget surface with drawing surface
        }

PS. see http://valadoc.org/#!api=cairo/Cairo for more info on cairo. As I see it, cairo used for vector graphics and pixbuf for raster.

Upvotes: 1

Related Questions