Browse Source

* Improved ANSI import, especially wrt. drawing context persistence.

tags/v0.99.beta14
Sam Hocevar sam 19 years ago
parent
commit
6372da2ffc
1 changed files with 23 additions and 9 deletions
  1. +23
    -9
      cucul/import.c

+ 23
- 9
cucul/import.c View File

@@ -350,22 +350,25 @@ static long int import_ansi(cucul_canvas_t *cv,
unsigned char const *buffer = (unsigned char const*)data; unsigned char const *buffer = (unsigned char const*)data;
unsigned int i, j, skip, dummy = 0; unsigned int i, j, skip, dummy = 0;
unsigned int width = 0, height = 0, wch = 1; unsigned int width = 0, height = 0, wch = 1;
uint32_t savedattr, resizeattr;
unsigned long int ch; unsigned long int ch;
int x = 0, y = 0, save_x = 0, save_y = 0; int x = 0, y = 0, save_x = 0, save_y = 0;


cucul_set_canvas_size(cv, width, height);
cucul_set_canvas_size(cv, 0, 0);
if(utf8) if(utf8)
{ {
grcm.dfg = cucul_attr_to_ansi_fg(cv->curattr);
grcm.dbg = cucul_attr_to_ansi_bg(cv->curattr);
grcm.dfg = CUCUL_DEFAULT;
grcm.dbg = CUCUL_TRANSPARENT;
} }
else else
{ {
grcm.dfg = CUCUL_LIGHTGRAY; grcm.dfg = CUCUL_LIGHTGRAY;
grcm.dbg = CUCUL_BLACK; grcm.dbg = CUCUL_BLACK;
cucul_set_color_ansi(cv, grcm.dfg, grcm.dbg);
cucul_set_color_ansi(cv, CUCUL_LIGHTGRAY, CUCUL_BLACK);
} }


resizeattr = cucul_get_attr(cv, -1, -1);

ansi_parse_grcm(cv, &grcm, 1, &dummy); ansi_parse_grcm(cv, &grcm, 1, &dummy);


for(i = 0; i < size; i += skip) for(i = 0; i < size; i += skip)
@@ -491,8 +494,12 @@ static long int import_ansi(cucul_canvas_t *cv,
break; break;
case 'K': /* EL - Erase In Line */ case 'K': /* EL - Erase In Line */
if(width < 80) if(width < 80)
cucul_set_color_ansi(cv, grcm.dfg, grcm.dbg);
{
savedattr = cucul_get_attr(cv, -1, -1);
cucul_set_attr(cv, resizeattr);
cucul_set_canvas_size(cv, width = 80, height); cucul_set_canvas_size(cv, width = 80, height);
cucul_set_attr(cv, savedattr);
}
for(j = x; j < 80; j++) for(j = x; j < 80; j++)
cucul_put_char(cv, j, y, ' '); cucul_put_char(cv, j, y, ' ');
x = 80; x = 80;
@@ -541,26 +548,31 @@ static long int import_ansi(cucul_canvas_t *cv,
/* Make sure the canvas is big enough. */ /* Make sure the canvas is big enough. */
if((unsigned int)x + wch > width) if((unsigned int)x + wch > width)
{ {
cucul_set_color_ansi(cv, grcm.dfg, grcm.dbg);
savedattr = cucul_get_attr(cv, -1, -1);
cucul_set_attr(cv, resizeattr);
cucul_set_canvas_size(cv, width = x + wch, height); cucul_set_canvas_size(cv, width = x + wch, height);
cucul_set_attr(cv, savedattr);
} }


if((unsigned int)y >= height) if((unsigned int)y >= height)
{ {
cucul_set_color_ansi(cv, grcm.dfg, grcm.dbg);
savedattr = cucul_get_attr(cv, -1, -1);
cucul_set_attr(cv, resizeattr);
cucul_set_canvas_size(cv, width, height = y + 1); cucul_set_canvas_size(cv, width, height = y + 1);
cucul_set_attr(cv, savedattr);
} }


/* Now paste our character */ /* Now paste our character */
cucul_set_color_ansi(cv, grcm.efg, grcm.ebg);
cucul_put_char(cv, x, y, ch); cucul_put_char(cv, x, y, ch);
x += wch; x += wch;
} }


if((unsigned int)y > height) if((unsigned int)y > height)
{ {
cucul_set_color_ansi(cv, grcm.dfg, grcm.dbg);
savedattr = cucul_get_attr(cv, -1, -1);
cucul_set_attr(cv, resizeattr);
cucul_set_canvas_size(cv, width, height = y); cucul_set_canvas_size(cv, width, height = y);
cucul_set_attr(cv, savedattr);
} }


return size; return size;
@@ -645,5 +657,7 @@ static void ansi_parse_grcm(cucul_canvas_t *cv, struct ansi_grcm *g,
g->efg = CUCUL_WHITE; g->efg = CUCUL_WHITE;
} }
} }

cucul_set_color_ansi(cv, g->efg, g->ebg);
} }



Loading…
Cancel
Save