Changeset 1404 for toilet


Ignore:
Timestamp:
Nov 16, 2006, 1:04:39 AM (13 years ago)
Author:
Sam Hocevar
Message:
  • Completed support for -s, -S, -k, -W, -o.
Location:
toilet/trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • toilet/trunk/src/figlet.c

    r1402 r1404  
    3838
    3939static int open_font(context_t *cx);
    40 static uint32_t smush(uint32_t, uint32_t, unsigned int);
     40static uint32_t hsmush(uint32_t, uint32_t, unsigned int);
    4141
    4242int init_figlet(context_t *cx)
     
    4545        return -1;
    4646
    47     /* FIXME: read the font's contents */
    48     if(cx->hlayout == H_DEFAULT)
    49         cx->hlayout = H_SMUSH;
     47    if(cx->full_layout & 0x3f)
     48        cx->hsmushrule = cx->full_layout & 0x3f;
     49    else if(cx->old_layout > 0)
     50        cx->hsmushrule = cx->old_layout;
     51
     52    switch(cx->hmode)
     53    {
     54    case H_DEFAULT:
     55        if(cx->old_layout == -1)
     56            cx->hmode = H_NONE;
     57        else if(cx->old_layout == 0 && (cx->full_layout & 0xc0) == 0x40)
     58            cx->hmode = H_KERN;
     59        else if((cx->old_layout & 0x3f) && (cx->full_layout & 0x3f)
     60                 && (cx->full_layout & 0x80))
     61        {
     62            cx->hmode = H_SMUSH;
     63            cx->hsmushrule = cx->full_layout & 0x3f;
     64        }
     65        else if(cx->old_layout == 0 && (cx->full_layout & 0xbf) == 0x80)
     66        {
     67            cx->hmode = H_SMUSH;
     68            cx->hsmushrule = 0x3f;
     69        }
     70        else
     71            cx->hmode = H_OVERLAP;
     72        break;
     73    default:
     74        break;
     75    }
    5076
    5177    cx->charcv = cucul_create_canvas(cx->max_length - 2, cx->height);
     
    98124
    99125    /* Compute how much the next character will overlap */
    100     switch(cx->hlayout)
     126    switch(cx->hmode)
    101127    {
    102128    case H_SMUSH:
    103129    case H_KERN:
    104130    case H_OVERLAP:
    105         extra = (cx->hlayout == H_OVERLAP);
     131        extra = (cx->hmode == H_OVERLAP);
    106132        overlap = w;
    107133        for(y = 0; y < h; y++)
     
    118144
    119145            /* Handle overlapping */
    120             if(cx->hlayout == H_OVERLAP && xleft < cx->x)
     146            if(cx->hmode == H_OVERLAP && xleft < cx->x)
    121147                xleft++;
    122148
    123149            /* Handle smushing */
    124             if(cx->hlayout == H_SMUSH)
     150            if(cx->hmode == H_SMUSH)
    125151            {
    126152                if(xleft < cx->x &&
    127                    smush(cucul_get_char(cx->cv, cx->x - 1 - xleft, cx->y + y),
    128                          cucul_get_char(cx->charcv, xright, y),
    129                          0))
     153                   hsmush(cucul_get_char(cx->cv, cx->x - 1 - xleft, cx->y + y),
     154                          cucul_get_char(cx->charcv, xright, y),
     155                          cx->hsmushrule))
    130156                    xleft++;
    131157            }
     
    167193         * function is fixed in libcucul */
    168194        //cucul_set_attr(cx->cv, tmpat);
    169         if(ch1 == ' ' || cx->hlayout != H_SMUSH)
     195        if(ch1 == ' ' || cx->hmode != H_SMUSH)
    170196            cucul_put_char(cx->cv, cx->x + x - overlap, cx->y + y, ch2);
    171197        else
    172198            cucul_put_char(cx->cv, cx->x + x - overlap, cx->y + y,
    173                            smush(ch1, ch2, 0));
     199                           hsmush(ch1, ch2, cx->hsmushrule));
    174200        //cucul_put_attr(cx->cv, cx->x + x, cx->y + y, tmpat);
    175201    }
     
    256282    }
    257283
     284    if(cx->old_layout < -1 || cx->old_layout > 63 || cx->full_layout > 32767
     285        || ((cx->full_layout & 0x80) && (cx->full_layout & 0x3f) == 0
     286            && cx->old_layout))
     287    {
     288        fprintf(stderr, "font `%s' has invalid layout %i/%u\n",
     289                path, cx->old_layout, cx->full_layout);
     290        toiclose(f);
     291        return -1;
     292    }
     293
    258294    cx->hardblank = cucul_utf8_to_utf32(hardblank, NULL);
    259295
     
    374410}
    375411
    376 static uint32_t smush(uint32_t ch1, uint32_t ch2, unsigned int mode)
     412static uint32_t hsmush(uint32_t ch1, uint32_t ch2, unsigned int rule)
    377413{
    378414    /* Rule 1 */
    379     if(ch1 == ch2 && ch1 != 0xa0)
     415    if((rule & 0x01) && ch1 == ch2 && ch1 != 0xa0)
    380416        return ch2;
    381417
    382418    if(ch1 < 0x80 && ch2 < 0x80)
    383419    {
    384         char const rule2[] = "|/\\[]{}()<>";
    385         char const rule3[] = "||/\\[]{}()<>";
     420        char const charlist[] = "|/\\[]{}()<>";
    386421        char *tmp1, *tmp2;
    387         uint16_t s, p;
    388422
    389423        /* Rule 2 */
    390         if(ch1 == '_' && strchr(rule2, ch2))
    391             return ch2;
    392 
    393         if(ch2 == '_' && strchr(rule2, ch1))
    394             return ch1;
     424        if(rule & 0x02)
     425        {
     426            if(ch1 == '_' && strchr(charlist, ch2))
     427                return ch2;
     428
     429            if(ch2 == '_' && strchr(charlist, ch1))
     430                return ch1;
     431        }
    395432
    396433        /* Rule 3 */
    397         if((tmp1 = strchr(rule3, ch1)) && (tmp2 = strchr(rule3, ch2)))
    398         {
    399             int cl1 = (tmp1 - rule3) / 2;
    400             int cl2 = (tmp2 - rule3) / 2;
     434        if((rule & 0x04) &&
     435           (tmp1 = strchr(charlist, ch1)) && (tmp2 = strchr(charlist, ch2)))
     436        {
     437            int cl1 = (tmp1 + 1 - charlist) / 2;
     438            int cl2 = (tmp2 + 1 - charlist) / 2;
    401439
    402440            if(cl1 < cl2)
     
    407445
    408446        /* Rule 4 */
    409         s = ch1 + ch2;
    410         p = ch1 * ch2;
    411 
    412         if(p == 15375 /* '{' * '}' */
    413             || p == 8463 /* '[' * ']' */
    414             || (p == 1640 && s == 81)) /* '(' *|+ ')' */
    415             return '|';
     447        if(rule & 0x08)
     448        {
     449            uint16_t s = ch1 + ch2;
     450            uint16_t p = ch1 * ch2;
     451
     452            if(p == 15375 /* '{' * '}' */
     453                || p == 8463 /* '[' * ']' */
     454                || (p == 1640 && s == 81)) /* '(' *|+ ')' */
     455                return '|';
     456        }
    416457
    417458        /* Rule 5 */
    418         switch((ch1 << 8) | ch2)
    419         {
    420             case 0x2f5c: return '|'; /* /\ */
    421             case 0x5c2f: return 'Y'; /* \/ */
    422             case 0x3e3c: return 'X'; /* >< */
     459        if(rule & 0x10)
     460        {
     461            switch((ch1 << 8) | ch2)
     462            {
     463                case 0x2f5c: return '|'; /* /\ */
     464                case 0x5c2f: return 'Y'; /* \/ */
     465                case 0x3e3c: return 'X'; /* >< */
     466            }
    423467        }
    424468
    425469        /* Rule 6 */
    426         if(ch1 == ch2 && ch1 == 0xa0)
     470        if((rule & 0x20) && ch1 == ch2 && ch1 == 0xa0)
    427471            return 0xa0;
    428472    }
  • toilet/trunk/src/main.c

    r1403 r1404  
    5555    cx->term_width = 80;
    5656
    57     cx->hlayout = H_DEFAULT;
     57    cx->hmode = H_DEFAULT;
    5858
    5959    cx->filters = NULL;
     
    139139        }
    140140        case 's':
    141             cx->hlayout = H_DEFAULT;
     141            cx->hmode = H_DEFAULT;
    142142            break;
    143143        case 'S':
    144             cx->hlayout = H_SMUSH;
     144            cx->hmode = H_SMUSH;
    145145            break;
    146146        case 'k':
    147             cx->hlayout = H_KERN;
     147            cx->hmode = H_KERN;
    148148            break;
    149149        case 'W':
    150             cx->hlayout = H_NONE;
     150            cx->hmode = H_NONE;
    151151            break;
    152152        case 'o':
    153             cx->hlayout = H_OVERLAP;
     153            cx->hmode = H_OVERLAP;
    154154            break;
    155155        case 'E': /* --export */
     
    250250    printf("  -f, --font <name>        select the font\n");
    251251    printf("  -d, --directory <dir>    specify font directory\n");
    252     printf("  -s, -S, -k, -W, -o       render mode (default smushing, force smushing,\n");
     252    printf("  -s, -S, -k, -W, -o       render mode (default, force smushing,\n");
    253253    printf("                           kerning, full width, overlap)\n");
    254254    printf("  -w, --width <width>      set output width\n");
     
    268268    printf("  -f <name>           select the font\n");
    269269    printf("  -d <dir>            specify font directory\n");
    270     printf("  -s, -S, -k, -W, -o  render mode (default smushing, force smushing,\n");
     270    printf("  -s, -S, -k, -W, -o  render mode (default, force smushing,\n");
    271271    printf("                      kerning, full width, overlap)\n");
    272272    printf("  -w <width>          set output width\n");
  • toilet/trunk/src/toilet.h

    r1401 r1404  
    3434
    3535    /* Used by the FIGlet driver */
    36     enum { H_DEFAULT, H_KERN, H_SMUSH, H_NONE, H_OVERLAP } hlayout;
     36    enum { H_DEFAULT, H_KERN, H_SMUSH, H_NONE, H_OVERLAP } hmode;
     37    unsigned int hsmushrule;
    3738    unsigned long int hardblank;
    3839    unsigned int height, baseline, max_length;
Note: See TracChangeset for help on using the changeset viewer.