From f39a9ccbb32f10d193742b98986d1d2327e9a3fe Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Thu, 20 Jan 2011 12:37:33 -0500 Subject: [PATCH] Use cairo_push_group() for double buffering in the terminal Slightly different version of the patch from twied. --- clients/terminal.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/clients/terminal.c b/clients/terminal.c index 9729268..8ede48a 100644 --- a/clients/terminal.c +++ b/clients/terminal.c @@ -894,10 +894,14 @@ terminal_draw_contents(struct terminal *terminal) struct glyph_run run; cairo_font_extents_t extents; + surface = window_get_surface(terminal->window); window_get_child_allocation(terminal->window, &allocation); - - surface = display_create_surface(terminal->display, &allocation); cr = cairo_create(surface); + cairo_rectangle(cr, allocation.x, allocation.y, + allocation.width, allocation.height); + cairo_clip(cr); + cairo_push_group(cr); + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); terminal_set_color(terminal, cr, terminal->color_scheme->border); cairo_paint(cr); @@ -909,7 +913,8 @@ terminal_draw_contents(struct terminal *terminal) top_margin = (allocation.height - terminal->height * extents.height) / 2; cairo_set_line_width(cr, 1.0); - + cairo_translate(cr, allocation.x + side_margin, + allocation.y + top_margin); /* paint the background */ for (row = 0; row < terminal->height; row++) { for (col = 0; col < terminal->width; col++) { @@ -920,8 +925,8 @@ terminal_draw_contents(struct terminal *terminal) continue; terminal_set_color(terminal, cr, attr.attr.bg); - cairo_move_to(cr, side_margin + (col * extents.max_x_advance), - top_margin + (row * extents.height)); + cairo_move_to(cr, col * extents.max_x_advance, + row * extents.height); cairo_rel_line_to(cr, extents.max_x_advance, 0); cairo_rel_line_to(cr, 0, extents.height); cairo_rel_line_to(cr, -extents.max_x_advance, 0); @@ -942,8 +947,8 @@ terminal_draw_contents(struct terminal *terminal) glyph_run_flush(&run, attr); - text_x = side_margin + col * extents.max_x_advance; - text_y = top_margin + extents.ascent + row * extents.height; + text_x = col * extents.max_x_advance; + text_y = extents.ascent + row * extents.height; if (attr.attr.a & ATTRMASK_UNDERLINE) { terminal_set_color(terminal, cr, attr.attr.fg); cairo_move_to(cr, text_x, (double)text_y + 1.5); @@ -962,8 +967,8 @@ terminal_draw_contents(struct terminal *terminal) d = 0.5; cairo_set_line_width(cr, 1); - cairo_move_to(cr, side_margin + terminal->column * extents.max_x_advance + d, - top_margin + terminal->row * extents.height + d); + cairo_move_to(cr, terminal->column * extents.max_x_advance + d, + terminal->row * extents.height + d); cairo_rel_line_to(cr, extents.max_x_advance - 2 * d, 0); cairo_rel_line_to(cr, 0, extents.height - 2 * d); cairo_rel_line_to(cr, -extents.max_x_advance + 2 * d, 0); @@ -972,10 +977,9 @@ terminal_draw_contents(struct terminal *terminal) cairo_stroke(cr); } + cairo_pop_group_to_source(cr); + cairo_paint(cr); cairo_destroy(cr); - - window_copy_surface(terminal->window, &allocation, surface); - cairo_surface_destroy(surface); } -- 2.7.4