ok. I understand. Thanks all for your help. On Fri, Aug 10, 2012 at 4:49 PM, Jean Brefort <jean.bref...@normalesup.org>wrote:
> It is not the sme thing. With your latest code, you create surface each > time the widget needs redraw. configure events only occur when the > widget changes size. > Otherwise, you are leaking surface and off_cr. > > Le vendredi 10 août 2012 à 16:41 +0530, Prasanta Sadhukhan a écrit : > > Thanks for the code and the explanation. Now, it's quite clear. > > Last thing I wanted to know is, do I need to always have > > "configure_event" handler to create the offscreen surface. > > Can't we create the offscreen surface in "expose_event" handler > > itself? > > I tried with this (after commenting "configure_event" callback) which > > also seems to do the same thing as your code. > > > > static gboolean > > draw_cb (GtkWidget *widget, > > GdkEventExpose *event, > > gpointer data) > > { > > cairo_t *off_cr, *cr; > > > > g_print("draw event\n"); > > > > surface = gdk_window_create_similar_surface (event->window, > > CAIRO_CONTENT_COLOR, > > event->area.width, > > event->area.height); > > > > off_cr = cairo_create(surface); > > cairo_set_source_rgb(off_cr, 1, 0, 0); > > cairo_paint (off_cr); > > > > cairo_move_to (off_cr, 100, 100); > > cairo_set_source_rgb (off_cr, 0, 0, 0); > > cairo_set_font_size (off_cr, 20); > > cairo_show_text (off_cr, "Offscreen buffer is red"); > > > > > > cr = gdk_cairo_create (event->window); > > cairo_set_source_surface(cr, surface, 0, 0); > > cairo_paint(cr); > > > > cairo_move_to (cr, 200, 200); > > cairo_set_source_rgb (cr, 0, 1, 0); > > cairo_set_font_size (cr, 20); > > cairo_show_text (cr, "This text is not blitted"); > > > > cairo_destroy (cr); > > > > return TRUE; > > } > > > > Regards > > Prasanta > > On Fri, Aug 10, 2012 at 4:14 PM, Tadej Borovšak <tadeb...@gmail.com> > > wrote: > > Hello. > > > > Have a look at this code (targeted at GTK+-2.x): > > > > #include <gtk/gtk.h> > > > > static cairo_surface_t *surface = NULL; > > > > static gboolean > > configure_event_cb (GtkWidget *widget, > > GdkEventConfigure *event, > > gpointer data) > > { > > cairo_t *cr; > > > > g_print("configure event: %d, %d\n", event->width, > > event->height); > > > > if (surface) > > cairo_surface_destroy (surface); > > > > surface = gdk_window_create_similar_surface (event->window, > > > > CAIRO_CONTENT_COLOR, > > event->width, > > event->height); > > > > cr = cairo_create(surface); > > > > cairo_set_source_rgb(cr, 1, 0, 0); > > cairo_paint (cr); > > > > > > cairo_move_to (cr, 100, 100); > > cairo_set_source_rgb (cr, 0, 0, 0); > > cairo_set_font_size (cr, 20); > > cairo_show_text (cr, "Offscreen buffer is red"); > > > > cairo_destroy(cr); > > > > return FALSE; > > } > > > > static gboolean > > draw_cb (GtkWidget *widget, > > > > GdkEventExpose *event, > > gpointer data) > > { > > cairo_t *cr; > > > > g_print("draw event\n"); > > > > cr = gdk_cairo_create (event->window); > > > > cairo_set_source_surface(cr, surface, 0, 0); > > cairo_paint(cr); > > > > > > cairo_move_to (cr, 200, 200); > > cairo_set_source_rgb (cr, 0, 1, 0); > > cairo_set_font_size (cr, 20); > > cairo_show_text (cr, "This text is not blitted"); > > > > cairo_destroy (cr); > > > > return TRUE; > > } > > > > int > > main(int argc, > > char **argv) > > { > > GtkWidget *window, > > *area; > > > > gtk_init(&argc, &argv); > > > > window = gtk_window_new(GTK_WINDOW_TOPLEVEL); > > gtk_window_set_default_size (GTK_WINDOW (window), 1200, > > 800); > > g_signal_connect (window, "destroy", gtk_main_quit, NULL); > > > > area = gtk_drawing_area_new(); > > g_signal_connect (area, "expose-event", > > > > G_CALLBACK (draw_cb), NULL); > > g_signal_connect (area, "configure-event", > > G_CALLBACK(configure_event_cb), NULL); > > gtk_container_add (GTK_CONTAINER (window), area); > > > > gtk_widget_show_all(window); > > gtk_main(); > > > > return 0; > > } > > > > > > > > surface is your offscreen buffer and contains red background > > and black > > text. This is then blitted during expose-event and to finish > > off, some > > green text is added. And that's it. > > > > Cheers, > > Tadej > > > > > > -- > > Tadej Borovšak > > blog.borovsak.si > > tadeb...@gmail.com > > tadej.borov...@gmail.com > > > > > > >
_______________________________________________ gtk-list mailing list gtk-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-list