Factor out decoding of character attributes

dev
Kristian Høgsberg 14 years ago
parent fb266a3207
commit 01994a5964
  1. 114
      clients/terminal.c

@ -461,10 +461,51 @@ terminal_get_attr_row(struct terminal *terminal, int row)
return &terminal->data_attr[index * terminal->width];
}
static struct attr
terminal_get_attr(struct terminal *terminal, int row, int col)
struct decoded_attr {
int foreground;
int background;
int bold;
int underline;
};
static void
terminal_decode_attr(struct terminal *terminal, int row, int col,
struct decoded_attr *decoded)
{
return terminal_get_attr_row(terminal, row)[col];
struct attr attr;
int foreground, background, tmp;
/* get the attributes for this character cell */
attr = terminal_get_attr_row(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;
}
}
decoded->foreground = foreground;
decoded->background = background;
decoded->bold = attr.a & (ATTRMASK_BOLD | ATTRMASK_BLINK);
decoded->underline = attr.a & ATTRMASK_UNDERLINE;
}
static void
@ -711,13 +752,12 @@ terminal_draw_contents(struct terminal *terminal)
cairo_font_extents_t extents;
int top_margin, side_margin;
int row, col;
struct attr attr;
union utf8_char *p_row;
struct utf8_chars {
union utf8_char c;
char null;
} toShow;
int foreground, background, bold, underline, tmp;
struct decoded_attr attr;
int text_x, text_y;
cairo_surface_t *surface;
double d;
@ -746,36 +786,12 @@ terminal_draw_contents(struct terminal *terminal)
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;
}
}
terminal_decode_attr(terminal, row, col, &attr);
if (background == terminal->color_scheme->border)
if (attr.background == terminal->color_scheme->border)
continue;
terminal_set_color(terminal, cr, background);
terminal_set_color(terminal, cr, attr.background);
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);
@ -793,42 +809,16 @@ terminal_draw_contents(struct terminal *terminal)
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;
terminal_decode_attr(terminal, row, col, &attr);
if (bold)
if (attr.bold)
cairo_set_font_face(cr, terminal->font_bold);
else
cairo_set_font_face(cr, terminal->font_normal);
terminal_set_color(terminal, cr, foreground);
terminal_set_color(terminal, cr, attr.foreground);
text_x = side_margin + col * extents.max_x_advance;
text_y = top_margin + extents.ascent + row * extents.height;
if (underline) {
if (attr.underline) {
cairo_move_to(cr, text_x, (double)text_y + 1.5);
cairo_line_to(cr, text_x + extents.max_x_advance, (double) text_y + 1.5);
cairo_stroke(cr);

Loading…
Cancel
Save