Kaynağa Gözat

* Map colors to the ones known by groff, defining mines don't work

tags/v0.99.beta17
Pascal Terjan pterjan 15 yıl önce
ebeveyn
işleme
f8a477f2ab
1 değiştirilmiş dosya ile 31 ekleme ve 32 silme
  1. +31
    -32
      caca/codec/export.c

+ 31
- 32
caca/codec/export.c Dosyayı Görüntüle

@@ -981,49 +981,49 @@ static void *export_tga(caca_canvas_t const *cv, size_t *bytes)
return data;
}

/* Get troff color index from RGB
*
* We want for each component to know if it is >= 80
* Then we use the 3 bits to index colors list:
* 000 -> black
* 001 -> blue
* ...
* 111 -> white
*/
static uint8_t _rgb_to_troff_index(uint32_t color)
{
int i;
uint8_t r = 0;
for(i = 0; i < 3; i++)
{
r += ((color >> (8*i+7))&1) << i;
}
return r;
}

/* Generate troff representation of current canvas. */
static void *export_troff(caca_canvas_t const *cv, size_t *bytes)
{
char *data, *cur;
int x, y;

const char * colors[8] = { "black", "blue", "green", "cyan",
"red", "magenta", "yellow", "white" };

uint32_t prevfg = 0;
uint32_t prevbg = 0;
int started = 0;

/* Each char is at most
* 2x.defcolor (2x29)
* + 2x\mM (2x10)
* 2x\mM (2x10)
* + \fB + \fI + \fR (9)
* + 4 bytes = 91
* + 4 bytes = 33
* Each line has a \n (1)
* Header has .color 1\n.nf\n (12)
* Header has .nf\n (3)
*/
*bytes = 12 + cv->height + (cv->width * cv->height * 91);
*bytes = 3 + cv->height + (cv->width * cv->height * 33);
cur = data = malloc(*bytes);

cur += sprintf(cur, ".color 1\n");

for(y = 0; y < cv->height; y++)
{
uint32_t *lineattr = cv->attrs + 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]);
if(fg != prevfg || !started)
cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", fg, fg);
if(bg != prevbg || !started)
cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", bg, bg);

prevfg = fg;
prevbg = bg;
started = 1;
}
}

cur += sprintf(cur, ".nf\n");

prevfg = 0;
@@ -1037,14 +1037,13 @@ static void *export_troff(caca_canvas_t const *cv, size_t *bytes)

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 fg = _rgb_to_troff_index(_caca_attr_to_rgb24fg(lineattr[x]));
uint32_t bg = _rgb_to_troff_index(_caca_attr_to_rgb24bg(lineattr[x]));
uint32_t ch = linechar[x];
if(fg != prevfg || !started)
cur += sprintf(cur, "\\m[%.06x]", fg);
cur += sprintf(cur, "\\m[%s]", colors[fg]);
if(bg != prevbg || !started)
cur += sprintf(cur, "\\M[%.06x]", bg);
cur += sprintf(cur, "\\M[%s]", colors[bg]);
if(lineattr[x] & CACA_BOLD)
cur += sprintf(cur, "\\fB");
if(lineattr[x] & CACA_ITALICS)


Yükleniyor…
İptal
Kaydet