Changeset 4227


Ignore:
Timestamp:
Jan 6, 2010, 12:27:26 AM (10 years ago)
Author:
Pascal Terjan
Message:
  • Add experimental troff export
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/codec/export.c

    r3582 r4227  
    5353static void *export_svg(caca_canvas_t const *, size_t *);
    5454static void *export_tga(caca_canvas_t const *, size_t *);
     55static void *export_troff(caca_canvas_t const *, size_t *);
    5556
    5657/** \brief Export a canvas into a foreign format.
     
    7071 *  - \c "svg": export an SVG vector image.
    7172 *  - \c "tga": export a TGA image.
     73 *  - \c "troff": export a troff source.
    7274 *
    7375 *  If an error occurs, NULL is returned and \b errno is set accordingly:
     
    116118    if(!strcasecmp("tga", format))
    117119        return export_tga(cv, bytes);
     120
     121    if(!strcasecmp("troff", format))
     122        return export_troff(cv, bytes);
    118123
    119124    seterrno(EINVAL);
     
    190195        "svg", "SVG vector image",
    191196        "tga", "TGA image",
     197        "troff", "troff source",
    192198        NULL, NULL
    193199    };
     
    976982}
    977983
     984/* Generate troff representation of current canvas. */
     985static void *export_troff(caca_canvas_t const *cv, size_t *bytes)
     986{
     987    char *data, *cur;
     988    int x, y;
     989
     990    uint32_t prevfg = 0;
     991    uint32_t prevbg = 0;
     992    int started = 0;
     993
     994    /* 93 bytes assumed for max length per pixel ('\m[xxxxxx]y\m[]')
     995     * + 97 + height
     996     */
     997    *bytes = 97 + cv->height + (cv->width * cv->height * 87);
     998    cur = data = malloc(*bytes);
     999
     1000    cur += sprintf(cur, ".color 1\n");
     1001
     1002    for(y = 0; y < cv->height; y++)
     1003    {
     1004        uint32_t *lineattr = cv->attrs + y * cv->width;
     1005        uint32_t *linechar = cv->chars + y * cv->width;
     1006
     1007        for(x = 0; x < cv->width; x++)
     1008        {
     1009   
     1010            uint32_t fg = _caca_attr_to_rgb24bg(lineattr[x]);
     1011            uint32_t bg = _caca_attr_to_rgb24fg(lineattr[x]);
     1012            if(started && (fg != prevfg || bg != prevbg))
     1013                cur += sprintf(cur, "\n");
     1014            if(fg != prevfg || !started)
     1015                cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", fg, fg);
     1016            if(bg != prevbg || !started)
     1017                cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", bg, bg);
     1018            if(fg != prevfg || !started)
     1019                cur += sprintf(cur, "\\m[%.06x]", fg);
     1020            if(bg != prevbg || !started)
     1021                cur += sprintf(cur, "\\M[%.06x]", bg);
     1022            if(lineattr[x] & CACA_BOLD)
     1023                cur += sprintf(cur, "\\fB");
     1024            if(lineattr[x] & CACA_ITALICS)
     1025                cur += sprintf(cur, "\\fI");
     1026
     1027            uint32_t ch = linechar[x];
     1028            cur += caca_utf32_to_utf8(cur, ch);
     1029
     1030            if(lineattr[x] & (CACA_BOLD|CACA_ITALICS))
     1031                cur += sprintf(cur, "\\fR");
     1032
     1033            prevfg = fg;
     1034            prevbg = bg;
     1035           
     1036            started = 1;
     1037        }
     1038
     1039        cur += sprintf(cur, "\n");
     1040    }
     1041
     1042    /* Crop to really used size */
     1043    debug("troff export: alloc %lu bytes, realloc %lu",
     1044          (unsigned long int)*bytes, (unsigned long int)(cur - data));
     1045    *bytes = (uintptr_t)(cur - data);
     1046    data = realloc(data, *bytes);
     1047
     1048    return data;
     1049}
     1050
    9781051/*
    9791052 * XXX: The following functions are aliases.
Note: See TracChangeset for help on using the changeset viewer.