void draw_buffer (GnomeScanPreviewArea *area) { GnomeScanPreviewAreaPrivate *priv = GET_PRIVATE (area); GdkRectangle *r, *i, *a; GtkWidget *da = priv->da; GdkPixbuf *pb; gint hpos; cairo_t *cr; cairo_surface_t *cs; if (!GDK_IS_PIXBUF (priv->pixbuf)) return; pb = priv->pixbuf; /* area rectangle */ r = priv->roi; a = g_new0 (GdkRectangle, 1); a->x = r->x - 1; a->y = r->y - 1; a->width = r->width + 2; a->height = r->height + 2; i = g_new0 (GdkRectangle, 1); i->x = 0; i->y = 0; i->width = gdk_pixbuf_get_width (pb); i->height = gdk_pixbuf_get_height (pb); /* DRAW */ cr = gdk_cairo_create (da->window); cs = cairo_get_target (cr); priv->cs = cairo_surface_create_similar (cs, CAIRO_CONTENT_COLOR, gdk_pixbuf_get_width (pb), gdk_pixbuf_get_height (pb)); cairo_set_source_surface (cr, priv->cs, 0, 0); cairo_paint (cr); /* draw pixbuf */ gdk_cairo_set_source_pixbuf (cr, pb, 0, 0); cairo_paint (cr); /* draw shaded white */ cairo_set_source_rgba (cr, 0xff, 0xff, 0xff, 0.5); cairo_new_path (cr); gdk_cairo_rectangle (cr, i); cairo_close_path (cr); cairo_paint (cr); /* draw border */ cairo_set_source_rgba (cr, 0, 0, 0, 1); cairo_new_path (cr); gdk_cairo_rectangle (cr, a); cairo_close_path (cr); cairo_clip (cr); cairo_paint (cr); /* draw area pixbuf */ gdk_cairo_set_source_pixbuf (cr, pb, 0, 0); cairo_new_path (cr); gdk_cairo_rectangle (cr, r); cairo_close_path (cr); cairo_clip (cr); cairo_paint (cr); for (hpos = 0; hpos < N_ANCHOR; hpos++) { draw_handle (da, cr, r, hpos); } g_debug ("writing %p to png", priv->cs); cairo_surface_write_to_png (priv->cs, "/home/bersace/test.png"); cairo_destroy (cr); } gboolean expose_drawing_area (GtkWidget *da, GdkEventExpose *event, GnomeScanPreviewArea *area) { GnomeScanPreviewAreaPrivate *priv = GET_PRIVATE (area); g_debug ("%s %p", __FUNCTION__, priv->cs); cairo_t *cr; cairo_surface_t *cs; if (!priv->cs) { return TRUE; } cr = gdk_cairo_create (da->window); cairo_set_source_surface (cr, priv->cs, 0, 0); gdk_cairo_rectangle (cr, priv->area); cairo_clip (cr); cairo_paint (cr); cairo_destroy (cr); return TRUE; }