mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	Split background and foreground painting into separate loops
This commit is contained in:
		
							parent
							
								
									da846ca91d
								
							
						
					
					
						commit
						8c25420a50
					
				
					 1 changed files with 53 additions and 18 deletions
				
			
		| 
						 | 
					@ -452,7 +452,8 @@ terminal_get_row(struct terminal *terminal, int row)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct attr*
 | 
					static struct attr*
 | 
				
			||||||
terminal_get_attr_row(struct terminal *terminal, int row) {
 | 
					terminal_get_attr_row(struct terminal *terminal, int row)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
	int index;
 | 
						int index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	index = (row + terminal->start) % terminal->height;
 | 
						index = (row + terminal->start) % terminal->height;
 | 
				
			||||||
| 
						 | 
					@ -461,7 +462,8 @@ terminal_get_attr_row(struct terminal *terminal, int row) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct attr
 | 
					static struct attr
 | 
				
			||||||
terminal_get_attr(struct terminal *terminal, int row, int col) {
 | 
					terminal_get_attr(struct terminal *terminal, int row, int col)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
	return terminal_get_attr_row(terminal, row)[col];
 | 
						return terminal_get_attr_row(terminal, row)[col];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -723,7 +725,6 @@ terminal_draw_contents(struct terminal *terminal)
 | 
				
			||||||
			      terminal->color_scheme->border.b,
 | 
								      terminal->color_scheme->border.b,
 | 
				
			||||||
			      terminal->color_scheme->border.a);
 | 
								      terminal->color_scheme->border.a);
 | 
				
			||||||
	cairo_paint(cr);
 | 
						cairo_paint(cr);
 | 
				
			||||||
	cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cairo_set_font_face(cr, terminal->font_normal);
 | 
						cairo_set_font_face(cr, terminal->font_normal);
 | 
				
			||||||
	cairo_set_font_size(cr, 14);
 | 
						cairo_set_font_size(cr, 14);
 | 
				
			||||||
| 
						 | 
					@ -734,6 +735,55 @@ terminal_draw_contents(struct terminal *terminal)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cairo_set_line_width(cr, 1.0);
 | 
						cairo_set_line_width(cr, 1.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* paint the background */
 | 
				
			||||||
 | 
						for (row = 0; row < terminal->height; row++) {
 | 
				
			||||||
 | 
							p_row = terminal_get_row(terminal, row);
 | 
				
			||||||
 | 
							for (col = 0; col < terminal->width; col++) {
 | 
				
			||||||
 | 
								/* get the attributes for this character cell */
 | 
				
			||||||
 | 
								attr = terminal_get_attr(terminal, row, col);
 | 
				
			||||||
 | 
								if ((attr.a & ATTRMASK_INVERSE) ||
 | 
				
			||||||
 | 
									((terminal->mode & MODE_SHOW_CURSOR) &&
 | 
				
			||||||
 | 
									terminal->focused && terminal->row == row &&
 | 
				
			||||||
 | 
									terminal->column == col))
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									foreground = attr.bg;
 | 
				
			||||||
 | 
									background = attr.fg;
 | 
				
			||||||
 | 
									if (attr.a & ATTRMASK_BOLD) {
 | 
				
			||||||
 | 
										if (foreground <= 16) foreground |= 0x08;
 | 
				
			||||||
 | 
										if (background <= 16) background &= 0x07;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									foreground = attr.fg;
 | 
				
			||||||
 | 
									background = attr.bg;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (terminal->mode & MODE_INVERSE) {
 | 
				
			||||||
 | 
									tmp = foreground;
 | 
				
			||||||
 | 
									foreground = background;
 | 
				
			||||||
 | 
									background = tmp;
 | 
				
			||||||
 | 
									if (attr.a & ATTRMASK_BOLD) {
 | 
				
			||||||
 | 
										if (foreground <= 16) foreground |= 0x08;
 | 
				
			||||||
 | 
										if (background <= 16) background &= 0x07;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								cairo_set_source_rgba(cr,
 | 
				
			||||||
 | 
										      terminal->color_table[background].r,
 | 
				
			||||||
 | 
										      terminal->color_table[background].g,
 | 
				
			||||||
 | 
										      terminal->color_table[background].b,
 | 
				
			||||||
 | 
										      terminal->color_table[background].a);
 | 
				
			||||||
 | 
								cairo_move_to(cr, side_margin + (col * extents.max_x_advance),
 | 
				
			||||||
 | 
								      top_margin + (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);
 | 
				
			||||||
 | 
								cairo_close_path(cr);
 | 
				
			||||||
 | 
								cairo_fill(cr);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* paint the foreground */
 | 
				
			||||||
	for (row = 0; row < terminal->height; row++) {
 | 
						for (row = 0; row < terminal->height; row++) {
 | 
				
			||||||
		p_row = terminal_get_row(terminal, row);
 | 
							p_row = terminal_get_row(terminal, row);
 | 
				
			||||||
		for (col = 0; col < terminal->width; col++) {
 | 
							for (col = 0; col < terminal->width; col++) {
 | 
				
			||||||
| 
						 | 
					@ -766,21 +816,6 @@ terminal_draw_contents(struct terminal *terminal)
 | 
				
			||||||
			bold = attr.a & (ATTRMASK_BOLD | ATTRMASK_BLINK);
 | 
								bold = attr.a & (ATTRMASK_BOLD | ATTRMASK_BLINK);
 | 
				
			||||||
			underline = attr.a & ATTRMASK_UNDERLINE;
 | 
								underline = attr.a & ATTRMASK_UNDERLINE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* paint the background */
 | 
					 | 
				
			||||||
			cairo_set_source_rgba(cr,
 | 
					 | 
				
			||||||
					      terminal->color_table[background].r,
 | 
					 | 
				
			||||||
					      terminal->color_table[background].g,
 | 
					 | 
				
			||||||
					      terminal->color_table[background].b,
 | 
					 | 
				
			||||||
					      terminal->color_table[background].a);
 | 
					 | 
				
			||||||
			cairo_move_to(cr, side_margin + (col * extents.max_x_advance),
 | 
					 | 
				
			||||||
			      top_margin + (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);
 | 
					 | 
				
			||||||
			cairo_close_path(cr);
 | 
					 | 
				
			||||||
			cairo_fill(cr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			/* paint the foreground */
 | 
					 | 
				
			||||||
			if (bold)
 | 
								if (bold)
 | 
				
			||||||
				cairo_set_font_face(cr, terminal->font_bold);
 | 
									cairo_set_font_face(cr, terminal->font_bold);
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue