Bladeren bron

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

tags/v0.99.beta14
Sam Hocevar sam 18 jaren geleden
bovenliggende
commit
6372da2ffc
1 gewijzigde bestanden met toevoegingen van 23 en 9 verwijderingen
  1. +23
    -9
      cucul/import.c

+ 23
- 9
cucul/import.c Bestand weergeven

@@ -350,22 +350,25 @@ static long int import_ansi(cucul_canvas_t *cv,
unsigned char const *buffer = (unsigned char const*)data;
unsigned int i, j, skip, dummy = 0;
unsigned int width = 0, height = 0, wch = 1;
uint32_t savedattr, resizeattr;
unsigned long int ch;
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)
{
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
{
grcm.dfg = CUCUL_LIGHTGRAY;
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);

for(i = 0; i < size; i += skip)
@@ -491,8 +494,12 @@ static long int import_ansi(cucul_canvas_t *cv,
break;
case 'K': /* EL - Erase In Line */
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_attr(cv, savedattr);
}
for(j = x; j < 80; j++)
cucul_put_char(cv, j, y, ' ');
x = 80;
@@ -541,26 +548,31 @@ static long int import_ansi(cucul_canvas_t *cv,
/* Make sure the canvas is big enough. */
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_attr(cv, savedattr);
}

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_attr(cv, savedattr);
}

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

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_attr(cv, savedattr);
}

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

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


Laden…
Annuleren
Opslaan