| @@ -991,10 +991,15 @@ static void *export_troff(caca_canvas_t const *cv, size_t *bytes) | |||||
| uint32_t prevbg = 0; | uint32_t prevbg = 0; | ||||
| int started = 0; | int started = 0; | ||||
| /* 93 bytes assumed for max length per pixel ('\m[xxxxxx]y\m[]') | |||||
| * + 97 + height | |||||
| /* Each char is at most | |||||
| * 2x.defcolor (2x29) | |||||
| * + 2x\mM (2x10) | |||||
| * + \fB + \fI + \fR (9) | |||||
| * + 4 bytes = 91 | |||||
| * Each line has a \n (1) | |||||
| * Header has .color 1\n.nf\n (12) | |||||
| */ | */ | ||||
| *bytes = 97 + cv->height + (cv->width * cv->height * 87); | |||||
| *bytes = 12 + cv->height + (cv->width * cv->height * 91); | |||||
| cur = data = malloc(*bytes); | cur = data = malloc(*bytes); | ||||
| cur += sprintf(cur, ".color 1\n"); | cur += sprintf(cur, ".color 1\n"); | ||||
| @@ -1002,19 +1007,40 @@ static void *export_troff(caca_canvas_t const *cv, size_t *bytes) | |||||
| for(y = 0; y < cv->height; y++) | for(y = 0; y < cv->height; y++) | ||||
| { | { | ||||
| uint32_t *lineattr = cv->attrs + y * cv->width; | uint32_t *lineattr = cv->attrs + y * cv->width; | ||||
| uint32_t *linechar = cv->chars + y * cv->width; | |||||
| for(x = 0; x < cv->width; x++) | for(x = 0; x < cv->width; x++) | ||||
| { | { | ||||
| uint32_t fg = _caca_attr_to_rgb24bg(lineattr[x]); | uint32_t fg = _caca_attr_to_rgb24bg(lineattr[x]); | ||||
| uint32_t bg = _caca_attr_to_rgb24fg(lineattr[x]); | uint32_t bg = _caca_attr_to_rgb24fg(lineattr[x]); | ||||
| if(started && (fg != prevfg || bg != prevbg)) | |||||
| cur += sprintf(cur, "\n"); | |||||
| if(fg != prevfg || !started) | if(fg != prevfg || !started) | ||||
| cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", fg, fg); | cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", fg, fg); | ||||
| if(bg != prevbg || !started) | if(bg != prevbg || !started) | ||||
| cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", bg, bg); | cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", bg, bg); | ||||
| prevfg = fg; | |||||
| prevbg = bg; | |||||
| started = 1; | |||||
| } | |||||
| } | |||||
| cur += sprintf(cur, ".nf\n"); | |||||
| prevfg = 0; | |||||
| prevbg = 0; | |||||
| started = 0; | |||||
| for(y = 0; y < cv->height; y++) | |||||
| { | |||||
| uint32_t *lineattr = cv->attrs + y * cv->width; | |||||
| uint32_t *linechar = cv->chars + y * cv->width; | |||||
| for(x = 0; x < cv->width; x++) | |||||
| { | |||||
| uint32_t fg = _caca_attr_to_rgb24bg(lineattr[x]); | |||||
| uint32_t bg = _caca_attr_to_rgb24fg(lineattr[x]); | |||||
| uint32_t ch = linechar[x]; | |||||
| if(fg != prevfg || !started) | if(fg != prevfg || !started) | ||||
| cur += sprintf(cur, "\\m[%.06x]", fg); | cur += sprintf(cur, "\\m[%.06x]", fg); | ||||
| if(bg != prevbg || !started) | if(bg != prevbg || !started) | ||||
| @@ -1024,21 +1050,21 @@ static void *export_troff(caca_canvas_t const *cv, size_t *bytes) | |||||
| if(lineattr[x] & CACA_ITALICS) | if(lineattr[x] & CACA_ITALICS) | ||||
| cur += sprintf(cur, "\\fI"); | cur += sprintf(cur, "\\fI"); | ||||
| uint32_t ch = linechar[x]; | |||||
| cur += caca_utf32_to_utf8(cur, ch); | |||||
| if(ch == '\\') | |||||
| cur += sprintf(cur, "\\\\"); | |||||
| else | |||||
| cur += caca_utf32_to_utf8(cur, ch); | |||||
| if(lineattr[x] & (CACA_BOLD|CACA_ITALICS)) | if(lineattr[x] & (CACA_BOLD|CACA_ITALICS)) | ||||
| cur += sprintf(cur, "\\fR"); | cur += sprintf(cur, "\\fR"); | ||||
| prevfg = fg; | prevfg = fg; | ||||
| prevbg = bg; | prevbg = bg; | ||||
| started = 1; | started = 1; | ||||
| } | } | ||||
| cur += sprintf(cur, "\n"); | cur += sprintf(cur, "\n"); | ||||
| } | } | ||||
| /* Crop to really used size */ | /* Crop to really used size */ | ||||
| debug("troff export: alloc %lu bytes, realloc %lu", | debug("troff export: alloc %lu bytes, realloc %lu", | ||||
| (unsigned long int)*bytes, (unsigned long int)(cur - data)); | (unsigned long int)*bytes, (unsigned long int)(cur - data)); | ||||