diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2007-10-01 14:18:42 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2007-10-01 14:18:42 +0000 |
commit | 872696f7819f20eb5fdaa53c16221cf614952eb7 (patch) | |
tree | 2afd0be07b4cbd0340a50185e7c690984685399b /screen.c | |
parent | 9d563c340b16dfe0d4b3cd789ffbeda0d4d1e589 (diff) |
Pass attributes around as flags rather than as a list of escape codes.
Diffstat (limited to 'screen.c')
-rw-r--r-- | screen.c | 99 |
1 files changed, 7 insertions, 92 deletions
@@ -1,4 +1,4 @@ -/* $Id: screen.c,v 1.18 2007-10-01 14:15:48 nicm Exp $ */ +/* $Id: screen.c,v 1.19 2007-10-01 14:18:42 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -172,9 +172,7 @@ void screen_draw(struct screen *s, struct buffer *b, u_int uy, u_int ly) { u_char attr, colr; - size_t size; u_int i, j; - uint16_t n; if (uy > screen_last_y(s) || ly > screen_last_y(s) || ly < uy) fatalx("bad range"); @@ -186,112 +184,29 @@ screen_draw(struct screen *s, struct buffer *b, u_int uy, u_int ly) input_store_two(b, CODE_SCROLLREGION, s->ry_upper + 1, s->ry_lower + 1); input_store_zero(b, CODE_CURSOROFF); - - input_store_one(b, CODE_ATTRIBUTES, 0); + input_store_two(b, CODE_ATTRIBUTES, attr, colr); for (j = uy; j <= ly; j++) { input_store_two(b, CODE_CURSORMOVE, j + 1, 1); for (i = 0; i <= screen_last_x(s); i++) { - size = BUFFER_USED(b); - input_store_one(b, CODE_ATTRIBUTES, 0); - - n = 0; - if (s->grid_attr[j][i] != attr) { + if (s->grid_attr[j][i] != attr || + s->grid_colr[j][i] != colr) { + input_store_two(b, CODE_ATTRIBUTES, + s->grid_attr[j][i], s->grid_colr[j][i]); attr = s->grid_attr[j][i]; - n += screen_store_attributes(b, attr); - if (attr == 0) - colr = SCREEN_DEFCOLR; - } - if (s->grid_colr[j][i] != colr) { colr = s->grid_colr[j][i]; - n += screen_store_colours(b, colr); - } - if (n == 0) - buffer_reverse_add(b, 4); - else { - size = BUFFER_USED(b) - size; - memcpy(BUFFER_IN(b) - size + 2, &n, 2); } - input_store8(b, s->grid_data[j][i]); } } - - size = BUFFER_USED(b); - input_store_one(b, CODE_ATTRIBUTES, 0); - n = screen_store_attributes(b, s->attr); - n += screen_store_colours(b, s->colr); - size = BUFFER_USED(b) - size; - memcpy(BUFFER_IN(b) - size + 2, &n, 2); - input_store_two(b, CODE_CURSORMOVE, s->cy + 1, s->cx + 1); + input_store_two(b, CODE_ATTRIBUTES, s->attr, s->colr); if (s->mode & MODE_CURSOR) input_store_zero(b, CODE_CURSORON); } -/* Store screen atttributes in buffer. */ -size_t -screen_store_attributes(struct buffer *b, u_char attr) -{ - size_t n; - - if (attr == 0) { - input_store16(b, 0); - return (1); - } - - n = 0; - if (attr & ATTR_BRIGHT) { - input_store16(b, 1); - n++; - } - if (attr & ATTR_DIM) { - input_store16(b, 2); - n++; - } - if (attr & ATTR_ITALICS) { - input_store16(b, 3); - n++; - } - if (attr & ATTR_UNDERSCORE) { - input_store16(b, 4); - n++; - } - if (attr & ATTR_BLINK) { - input_store16(b, 5); - n++; - } - if (attr & ATTR_REVERSE) { - input_store16(b, 7); - n++; - } - if (attr & ATTR_HIDDEN) { - input_store16(b, 8); - n++; - } - return (n); -} - -/* Store screen colours in buffer. */ -size_t -screen_store_colours(struct buffer *b, u_char colr) -{ - uint16_t v; - - v = colr >> 4; - if (v == 8) - v = 9; - input_store16(b, 30 + v); - v = colr & 0xf; - if (v == 8) - v = 9; - input_store16(b, 40 + v); - - return (2); -} - /* Make a range of lines. */ void screen_make_lines(struct screen *s, u_int py, u_int ny) |