From 8c25420a50dc97966553c9b4b7a87955c2e442b5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Sat, 25 Dec 2010 08:58:46 -0500 Subject: [PATCH] Split background and foreground painting into separate loops --- clients/terminal.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/clients/terminal.c b/clients/terminal.c index e5db3db..46efa16 100644 --- a/clients/terminal.c +++ b/clients/terminal.c @@ -452,7 +452,8 @@ terminal_get_row(struct terminal *terminal, int row) } static struct attr* -terminal_get_attr_row(struct terminal *terminal, int row) { +terminal_get_attr_row(struct terminal *terminal, int row) +{ int index; index = (row + terminal->start) % terminal->height; @@ -461,7 +462,8 @@ terminal_get_attr_row(struct terminal *terminal, int row) { } 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]; } @@ -723,7 +725,6 @@ terminal_draw_contents(struct terminal *terminal) terminal->color_scheme->border.b, terminal->color_scheme->border.a); cairo_paint(cr); - cairo_set_operator(cr, CAIRO_OPERATOR_OVER); cairo_set_font_face(cr, terminal->font_normal); cairo_set_font_size(cr, 14); @@ -734,6 +735,7 @@ terminal_draw_contents(struct terminal *terminal) 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++) { @@ -763,10 +765,7 @@ terminal_draw_contents(struct terminal *terminal) if (background <= 16) background &= 0x07; } } - bold = attr.a & (ATTRMASK_BOLD | ATTRMASK_BLINK); - underline = attr.a & ATTRMASK_UNDERLINE; - /* paint the background */ cairo_set_source_rgba(cr, terminal->color_table[background].r, terminal->color_table[background].g, @@ -779,8 +778,44 @@ terminal_draw_contents(struct terminal *terminal) 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++) { + 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; + } + } + bold = attr.a & (ATTRMASK_BOLD | ATTRMASK_BLINK); + underline = attr.a & ATTRMASK_UNDERLINE; - /* paint the foreground */ if (bold) cairo_set_font_face(cr, terminal->font_bold); else -- 2.7.4