mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	Use cairo_push_group() for double buffering in the terminal
Slightly different version of the patch from twied.
This commit is contained in:
		
							parent
							
								
									5982658d62
								
							
						
					
					
						commit
						f39a9ccbb3
					
				
					 1 changed files with 16 additions and 12 deletions
				
			
		| 
						 | 
					@ -894,10 +894,14 @@ terminal_draw_contents(struct terminal *terminal)
 | 
				
			||||||
	struct glyph_run run;
 | 
						struct glyph_run run;
 | 
				
			||||||
	cairo_font_extents_t extents;
 | 
						cairo_font_extents_t extents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						surface = window_get_surface(terminal->window);
 | 
				
			||||||
	window_get_child_allocation(terminal->window, &allocation);
 | 
						window_get_child_allocation(terminal->window, &allocation);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	surface = display_create_surface(terminal->display, &allocation);
 | 
					 | 
				
			||||||
	cr = cairo_create(surface);
 | 
						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);
 | 
						cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
 | 
				
			||||||
	terminal_set_color(terminal, cr, terminal->color_scheme->border);
 | 
						terminal_set_color(terminal, cr, terminal->color_scheme->border);
 | 
				
			||||||
	cairo_paint(cr);
 | 
						cairo_paint(cr);
 | 
				
			||||||
| 
						 | 
					@ -909,7 +913,8 @@ terminal_draw_contents(struct terminal *terminal)
 | 
				
			||||||
	top_margin = (allocation.height - terminal->height * extents.height) / 2;
 | 
						top_margin = (allocation.height - terminal->height * extents.height) / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cairo_set_line_width(cr, 1.0);
 | 
						cairo_set_line_width(cr, 1.0);
 | 
				
			||||||
 | 
						cairo_translate(cr, allocation.x + side_margin,
 | 
				
			||||||
 | 
								allocation.y + top_margin);
 | 
				
			||||||
	/* paint the background */
 | 
						/* paint the background */
 | 
				
			||||||
	for (row = 0; row < terminal->height; row++) {
 | 
						for (row = 0; row < terminal->height; row++) {
 | 
				
			||||||
		for (col = 0; col < terminal->width; col++) {
 | 
							for (col = 0; col < terminal->width; col++) {
 | 
				
			||||||
| 
						 | 
					@ -920,8 +925,8 @@ terminal_draw_contents(struct terminal *terminal)
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			terminal_set_color(terminal, cr, attr.attr.bg);
 | 
								terminal_set_color(terminal, cr, attr.attr.bg);
 | 
				
			||||||
			cairo_move_to(cr, side_margin + (col * extents.max_x_advance),
 | 
								cairo_move_to(cr, col * extents.max_x_advance,
 | 
				
			||||||
			      top_margin + (row * extents.height));
 | 
									      row * extents.height);
 | 
				
			||||||
			cairo_rel_line_to(cr, extents.max_x_advance, 0);
 | 
								cairo_rel_line_to(cr, extents.max_x_advance, 0);
 | 
				
			||||||
			cairo_rel_line_to(cr, 0, extents.height);
 | 
								cairo_rel_line_to(cr, 0, extents.height);
 | 
				
			||||||
			cairo_rel_line_to(cr, -extents.max_x_advance, 0);
 | 
								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);
 | 
								glyph_run_flush(&run, attr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			text_x = side_margin + col * extents.max_x_advance;
 | 
								text_x = col * extents.max_x_advance;
 | 
				
			||||||
			text_y = top_margin + extents.ascent + row * extents.height;
 | 
								text_y = extents.ascent + row * extents.height;
 | 
				
			||||||
			if (attr.attr.a & ATTRMASK_UNDERLINE) {
 | 
								if (attr.attr.a & ATTRMASK_UNDERLINE) {
 | 
				
			||||||
				terminal_set_color(terminal, cr, attr.attr.fg);
 | 
									terminal_set_color(terminal, cr, attr.attr.fg);
 | 
				
			||||||
				cairo_move_to(cr, text_x, (double)text_y + 1.5);
 | 
									cairo_move_to(cr, text_x, (double)text_y + 1.5);
 | 
				
			||||||
| 
						 | 
					@ -962,8 +967,8 @@ terminal_draw_contents(struct terminal *terminal)
 | 
				
			||||||
		d = 0.5;
 | 
							d = 0.5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		cairo_set_line_width(cr, 1);
 | 
							cairo_set_line_width(cr, 1);
 | 
				
			||||||
		cairo_move_to(cr, side_margin + terminal->column * extents.max_x_advance + d,
 | 
							cairo_move_to(cr, terminal->column * extents.max_x_advance + d,
 | 
				
			||||||
			      top_margin + terminal->row * extents.height + d);
 | 
								      terminal->row * extents.height + d);
 | 
				
			||||||
		cairo_rel_line_to(cr, extents.max_x_advance - 2 * d, 0);
 | 
							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, 0, extents.height - 2 * d);
 | 
				
			||||||
		cairo_rel_line_to(cr, -extents.max_x_advance + 2 * d, 0);
 | 
							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_stroke(cr);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cairo_pop_group_to_source(cr);
 | 
				
			||||||
 | 
						cairo_paint(cr);
 | 
				
			||||||
	cairo_destroy(cr);
 | 
						cairo_destroy(cr);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	window_copy_surface(terminal->window, &allocation, surface);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cairo_surface_destroy(surface);
 | 
						cairo_surface_destroy(surface);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue