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 <tadeboro@xxxxxxxxx> 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_move_to (cr, 100, 100);
cairo_paint (cr);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_set_font_size (cr, 20);
cairo_show_text (cr, "Offscreen buffer is red");
GdkEventExpose *event,
cairo_destroy(cr);
return FALSE;
}
static gboolean
draw_cb (GtkWidget *widget,
gpointer data)
{
cairo_t *cr;
g_print("draw event\n");
cr = gdk_cairo_create (event->window);
cairo_move_to (cr, 200, 200);
cairo_set_source_surface(cr, surface, 0, 0);
cairo_paint(cr);
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);
G_CALLBACK (draw_cb), NULL);
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_signal_connect (area, "configure-event",surface is your offscreen buffer and contains red background and black
G_CALLBACK(configure_event_cb), NULL);
gtk_container_add (GTK_CONTAINER (window), area);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
text. This is then blitted during expose-event and to finish off, some
green text is added. And that's it.
Cheers,
Tadej
_______________________________________________ gtk-list mailing list gtk-list@xxxxxxxxx https://mail.gnome.org/mailman/listinfo/gtk-list