Index: trunk/src_plugins/hid_gtk3_cairo/gtkhid-cairo.c =================================================================== --- trunk/src_plugins/hid_gtk3_cairo/gtkhid-cairo.c (revision 8847) +++ trunk/src_plugins/hid_gtk3_cairo/gtkhid-cairo.c (revision 8848) @@ -60,6 +60,7 @@ GdkRGBA grid_color; /**< cached grid color */ GdkRGBA crosshair_color; /**< cached crosshair color */ + cairo_surface_t *surface; /**< cairo surface for off-line painting */ cairo_t *cr; /**< cairo context for off-line painting */ cairo_t *cr_drawing_area; /**< cairo context connected to gport->drawing_area */ @@ -1226,6 +1227,7 @@ GHidPort *port = vport; /* Init any GC's required */ port->render_priv = g_new0(render_priv_t, 1); + port->render_priv->surface = NULL; port->render_priv->cr = NULL; } @@ -1234,6 +1236,8 @@ GHidPort *port = vport; render_priv_t *priv = port->render_priv; + cairo_surface_destroy(priv->surface); + priv->surface = NULL; cairo_destroy(priv->cr); priv->cr = NULL; @@ -1275,6 +1279,17 @@ done_once = 1; } + if (priv->surface) + cairo_surface_destroy(priv->surface); + + priv->surface = gdk_window_create_similar_surface(gtk_widget_get_window(port->drawing_area), + CAIRO_CONTENT_COLOR_ALPHA, + gtk_widget_get_allocated_width(port->drawing_area), + gtk_widget_get_allocated_height(port->drawing_area)); + if (priv->cr) + cairo_destroy(priv->cr); + priv->cr = cairo_create(priv->surface); + //if (port->mask) { // gdk_pixmap_unref(port->mask); // port->mask = gdk_pixmap_new(0, port->view.canvas_width, port->view.canvas_height, 1); @@ -1303,11 +1318,11 @@ //gdk_draw_drawable(window, priv->bg_gc, port->pixmap, // ev->area.x, ev->area.y, ev->area.x, ev->area.y, ev->area.width, ev->area.height); - cairo_save(cr); - cairo_set_source_surface(cr, cairo_get_target(priv->cr), 0, 0); + //cairo_save(cr); + cairo_set_source_surface(cr, priv->surface, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint(cr); - cairo_restore(cr); + //cairo_restore(cr); priv->cr_drawing_area = cr; @@ -1318,17 +1333,17 @@ static void ghid_cairo_port_drawing_realize_cb(GtkWidget * widget, gpointer data) { - GHidPort *port = data; - render_priv_t *priv = port->render_priv; - cairo_surface_t *surf; - - surf = gdk_window_create_similar_surface(gtk_widget_get_window(widget), - CAIRO_CONTENT_COLOR_ALPHA, - gport->view.canvas_width, gport->view.canvas_height); - //surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, - // gport->view.canvas_width, gport->view.canvas_height); - priv->cr = cairo_create(surf); - cairo_surface_destroy(surf); + //GHidPort *port = data; + //render_priv_t *priv = port->render_priv; + //cairo_surface_t *surf; + // + //surf = gdk_window_create_similar_surface(gtk_widget_get_window(widget), + // CAIRO_CONTENT_COLOR_ALPHA, + // gport->view.canvas_width, gport->view.canvas_height); + ////surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, + //// gport->view.canvas_width, gport->view.canvas_height); + //priv->cr = cairo_create(surf); + //cairo_surface_destroy(surf); } static gboolean ghid_cairo_preview_expose(GtkWidget * widget, GdkEventExpose * ev,