Index: gtkhid-cairo.c =================================================================== --- gtkhid-cairo.c (revision 10387) +++ gtkhid-cairo.c (revision 10388) @@ -162,12 +162,32 @@ *pcr = cr; } +/** Creates or reuses a context to render a single layer group with "union" type of shape rendering. */ static void start_subcomposite(void) { + render_priv_t *priv = gport->render_priv; + cairo_t *cr; + + if (priv->surf_layer == NULL) + cr_create_similar_surface_and_context(&priv->surf_layer, &priv->cr_layer, gport); + cr = priv->cr_layer; + cairo_save(cr); + cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); + cairo_paint(cr); + cairo_restore(cr); + cairo_set_operator(priv->cr, CAIRO_OPERATOR_SOURCE); + priv->cr = priv->cr_layer; } +/** Applies the layer composited so far, to the target, using translucency. */ static void end_subcomposite(void) { + render_priv_t *priv = gport->render_priv; + + cairo_set_operator(priv->cr_target, CAIRO_OPERATOR_OVER); + cairo_set_source_surface(priv->cr_target, priv->surf_layer, 0, 0); + cairo_paint_with_alpha(priv->cr_target, conf_core.appearance.layer_alpha); + priv->cr = priv->cr_target; } /** Called once per layer group. */ @@ -983,7 +1003,7 @@ pcb_hid_expose_ctx_t ctx; render_priv_t *priv = gport->render_priv; - if (priv->cr == NULL) + if (priv->cr_drawing_area == NULL) return; if (rect != NULL) { @@ -1031,6 +1051,10 @@ ebottom = tmp; } + /* Paints only on the drawing_area */ + priv->cr = priv->cr_drawing_area; + priv->cr_target = priv->cr_drawing_area; + erase_with_background_color(priv->cr, &priv->bg_color); gdk_cairo_set_source_rgba(priv->cr, &priv->offlimits_color); @@ -1483,6 +1507,7 @@ gport->view.y0 = (vh - gport->view.height) / 2 + ctx->view.Y1; /* Change current pointer to draw in this widget, draws, then come back to pointer to drawing_area. */ + priv->cr_target = p; priv->cr = p; cairo_save(p); /* calls the off-line drawing routine */