Changeset 4228 for libcaca


Ignore:
Timestamp:
Jan 6, 2010, 1:05:09 AM (10 years ago)
Author:
Pascal Terjan
Message:
  • Improve a bit troff export
File:
1 edited

Legend:

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

    r4227 r4228  
    992992    int started = 0;
    993993
    994     /* 93 bytes assumed for max length per pixel ('\m[xxxxxx]y\m[]')
    995      * + 97 + height
     994    /* Each char is at most
     995     *  2x.defcolor (2x29)
     996     *  + 2x\mM (2x10)
     997     *  + \fB + \fI + \fR (9)
     998     *  + 4 bytes = 91
     999     * Each line has a \n (1)
     1000     * Header has .color 1\n.nf\n (12)
    9961001     */
    997     *bytes = 97 + cv->height + (cv->width * cv->height * 87);
     1002    *bytes = 12 + cv->height + (cv->width * cv->height * 91);
    9981003    cur = data = malloc(*bytes);
    9991004
     
    10031008    {
    10041009        uint32_t *lineattr = cv->attrs + y * cv->width;
    1005         uint32_t *linechar = cv->chars + y * cv->width;
    10061010
    10071011        for(x = 0; x < cv->width; x++)
     
    10101014            uint32_t fg = _caca_attr_to_rgb24bg(lineattr[x]);
    10111015            uint32_t bg = _caca_attr_to_rgb24fg(lineattr[x]);
    1012             if(started && (fg != prevfg || bg != prevbg))
    1013                 cur += sprintf(cur, "\n");
    10141016            if(fg != prevfg || !started)
    10151017                cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", fg, fg);
    10161018            if(bg != prevbg || !started)
    10171019                cur += sprintf(cur, ".defcolor %.06x rgb #%.06x\n", bg, bg);
     1020
     1021            prevfg = fg;
     1022            prevbg = bg;
     1023            started = 1;
     1024        }
     1025    }
     1026
     1027    cur += sprintf(cur, ".nf\n");
     1028
     1029    prevfg = 0;
     1030    prevbg = 0;
     1031    started = 0;
     1032
     1033    for(y = 0; y < cv->height; y++)
     1034    {
     1035        uint32_t *lineattr = cv->attrs + y * cv->width;
     1036        uint32_t *linechar = cv->chars + y * cv->width;
     1037
     1038        for(x = 0; x < cv->width; x++)
     1039        {
     1040   
     1041            uint32_t fg = _caca_attr_to_rgb24bg(lineattr[x]);
     1042            uint32_t bg = _caca_attr_to_rgb24fg(lineattr[x]);
     1043            uint32_t ch = linechar[x];
    10181044            if(fg != prevfg || !started)
    10191045                cur += sprintf(cur, "\\m[%.06x]", fg);
     
    10251051                cur += sprintf(cur, "\\fI");
    10261052
    1027             uint32_t ch = linechar[x];
    1028             cur += caca_utf32_to_utf8(cur, ch);
     1053            if(ch == '\\')
     1054                cur += sprintf(cur, "\\\\");
     1055            else
     1056                cur += caca_utf32_to_utf8(cur, ch);
    10291057
    10301058            if(lineattr[x] & (CACA_BOLD|CACA_ITALICS))
     
    10331061            prevfg = fg;
    10341062            prevbg = bg;
    1035            
    10361063            started = 1;
    10371064        }
     
    10391066        cur += sprintf(cur, "\n");
    10401067    }
    1041 
    10421068    /* Crop to really used size */
    10431069    debug("troff export: alloc %lu bytes, realloc %lu",
Note: See TracChangeset for help on using the changeset viewer.