Changeset 4228


Ignore:
Timestamp:
01/06/10 01:05:09 (3 years ago)
Author:
pterjan
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.