mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-01 22:58:40 -04: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