Changeset 4805


Ignore:
Timestamp:
Apr 6, 2012, 10:30:16 PM (8 years ago)
Author:
Sam Hocevar
Message:

figfont: support setting the canvas width and smushing mode from the
calling application.

Location:
libcaca/trunk/caca
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/caca.h

    r4766 r4805  
    447447 *  @{ */
    448448__extern int caca_canvas_set_figfont(caca_canvas_t *, char const *);
     449__extern int caca_set_figfont_smush(caca_canvas_t *, char const *);
     450__extern int caca_set_figfont_width(caca_canvas_t *, int);
    449451__extern int caca_put_figchar(caca_canvas_t *, uint32_t);
    450452__extern int caca_flush_figlet(caca_canvas_t *);
  • libcaca/trunk/caca/figfont.c

    r4803 r4805  
    5050static caca_charfont_t * open_charfont(char const *);
    5151static int free_charfont(caca_charfont_t *);
     52static void update_figfont_settings(caca_canvas_t *cv);
    5253
    5354/** \brief load a figfont and attach it to a canvas */
     
    5657    caca_charfont_t *ff = NULL;
    5758
    58     if(path)
     59    if (path)
    5960    {
    6061        ff = open_charfont(path);
    61         if(!ff)
     62        if (!ff)
    6263            return -1;
    6364    }
    6465
    65     if(cv->ff)
     66    if (cv->ff)
    6667    {
    6768        caca_free_canvas(cv->ff->charcv);
     
    7374    cv->ff = ff;
    7475
    75     if(!path)
     76    if (!path)
    7677        return 0;
    7778
    78     /* from TOIlet’s main.c */
    79     ff->term_width = cv->width > 0 ? cv->width : 80;
     79    /* from TOIlet’s main.c -- can be overriden by user */
     80    ff->term_width = 80;
    8081    ff->hmode = H_DEFAULT;
    8182
     
    8687    caca_set_canvas_size(cv, 0, 0); /* XXX */
    8788
    88     /* from TOIlet’s figlet.c */
    89     if(ff->full_layout & 0x3f)
    90         ff->hsmushrule = ff->full_layout & 0x3f;
    91     else if(ff->old_layout > 0)
    92         ff->hsmushrule = ff->old_layout;
    93 
    94     switch(ff->hmode)
    95     {
    96     case H_DEFAULT:
    97         if(ff->old_layout == -1)
    98             ff->hmode = H_NONE;
    99         else if(ff->old_layout == 0 && (ff->full_layout & 0xc0) == 0x40)
    100             ff->hmode = H_KERN;
    101         else if((ff->old_layout & 0x3f) && (ff->full_layout & 0x3f)
    102                  && (ff->full_layout & 0x80))
    103         {
    104             ff->hmode = H_SMUSH;
    105             ff->hsmushrule = ff->full_layout & 0x3f;
    106         }
    107         else if(ff->old_layout == 0 && (ff->full_layout & 0xbf) == 0x80)
    108         {
    109             ff->hmode = H_SMUSH;
    110             ff->hsmushrule = 0x3f;
    111         }
    112         else
    113             ff->hmode = H_OVERLAP;
    114         break;
    115     default:
    116         break;
    117     }
    118 
    119     ff->charcv = caca_create_canvas(ff->max_length - 2, ff->height);
    120 
    121     ff->left = malloc(ff->height * sizeof(int));
    122     ff->right = malloc(ff->height * sizeof(int));
    123 
    12489    cv->ff = ff;
     90
     91    update_figfont_settings(cv);
     92
     93    return 0;
     94}
     95
     96/** \brief set the width of the figfont rendering */
     97int caca_set_figfont_width(caca_canvas_t *cv, int width)
     98{
     99    if (!cv->ff)
     100        return 0;
     101
     102    caca_charfont_t *ff = cv->ff;
     103
     104    ff->term_width = width;
     105
     106    update_figfont_settings(cv);
     107
     108    return 0;
     109}
     110
     111/** \brief set the smushing mode of the figfont rendering */
     112int caca_set_figfont_smush(caca_canvas_t *cv, char const *mode)
     113{
     114    if (!cv->ff)
     115        return 0;
     116
     117    caca_charfont_t *ff = cv->ff;
     118
     119    if (!strcasecmp(mode, "default"))
     120        ff->hmode = H_DEFAULT;
     121    else if (!strcasecmp(mode, "kern"))
     122        ff->hmode = H_KERN;
     123    else if (!strcasecmp(mode, "smush"))
     124        ff->hmode = H_SMUSH;
     125    else if (!strcasecmp(mode, "none"))
     126        ff->hmode = H_NONE;
     127    else if (!strcasecmp(mode, "overlap"))
     128        ff->hmode = H_OVERLAP;
     129    else
     130        ff->hmode = H_DEFAULT;
     131
     132    update_figfont_settings(cv);
    125133
    126134    return 0;
     
    494502}
    495503
     504static void update_figfont_settings(caca_canvas_t *cv)
     505{
     506    if (!cv->ff)
     507        return;
     508
     509    caca_charfont_t *ff = cv->ff;
     510
     511    /* from TOIlet’s figlet.c */
     512    if (ff->full_layout & 0x3f)
     513        ff->hsmushrule = ff->full_layout & 0x3f;
     514    else if (ff->old_layout > 0)
     515        ff->hsmushrule = ff->old_layout;
     516
     517    switch (ff->hmode)
     518    {
     519    case H_DEFAULT:
     520        if (ff->old_layout == -1)
     521            ff->hmode = H_NONE;
     522        else if (ff->old_layout == 0 && (ff->full_layout & 0xc0) == 0x40)
     523            ff->hmode = H_KERN;
     524        else if ((ff->old_layout & 0x3f) && (ff->full_layout & 0x3f)
     525                 && (ff->full_layout & 0x80))
     526        {
     527            ff->hmode = H_SMUSH;
     528            ff->hsmushrule = ff->full_layout & 0x3f;
     529        }
     530        else if (ff->old_layout == 0 && (ff->full_layout & 0xbf) == 0x80)
     531        {
     532            ff->hmode = H_SMUSH;
     533            ff->hsmushrule = 0x3f;
     534        }
     535        else
     536            ff->hmode = H_OVERLAP;
     537        break;
     538    default:
     539        break;
     540    }
     541
     542    if (ff->charcv)
     543        caca_free_canvas(ff->charcv);
     544    ff->charcv = caca_create_canvas(ff->max_length - 2, ff->height);
     545
     546    free(ff->left);
     547    free(ff->right);
     548    ff->left = malloc(ff->height * sizeof(int));
     549    ff->right = malloc(ff->height * sizeof(int));
     550}
     551
    496552static uint32_t hsmush(uint32_t ch1, uint32_t ch2, int rule)
    497553{
Note: See TracChangeset for help on using the changeset viewer.