Use character size scaling factors - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 7e3cff33ffbd69a112fa4071a9f0ed2dc93bfc57
 (DIR) parent aaee0e8b28a353c215b6d1c8fc06d20038d7b426
 (HTM) Author: Eric Pruitt <eric.pruitt@gmail.com>
       Date:   Mon,  5 Aug 2013 11:33:37 +0200
       
       Use character size scaling factors
       
       The bounding boxes for characters can be scaled using "cwscale" and "chscale"
       to scale the width and height respectively.
       
       Diffstat:
         M TODO                                |       1 -
         M config.def.h                        |       4 ++++
         M st.c                                |      20 +++++++++++++-------
       
       3 files changed, 17 insertions(+), 8 deletions(-)
       ---
 (DIR) diff --git a/TODO b/TODO
       @@ -13,7 +13,6 @@ code & interface
        drawing
        -------
        * add diacritics support to xdraws()
       -* add kerning configuration
        * make the font cache simpler
        * add hard width handling
                * xft is reporting wrong width and height for characters
 (DIR) diff --git a/config.def.h b/config.def.h
       @@ -9,6 +9,10 @@ static char font[] = "Liberation Mono:pixelsize=12:antialias=false:autohint=fals
        static int borderpx = 2;
        static char shell[] = "/bin/sh";
        
       +/* Kerning / character bounding-box mutlipliers */
       +float cwscale = 1.0;
       +float chscale = 1.0;
       +
        /*
         * word delimiter string
         *
 (DIR) diff --git a/st.c b/st.c
       @@ -76,6 +76,7 @@ char *argv0;
        #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg)
        #define IS_SET(flag) ((term.mode & (flag)) != 0)
        #define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + (t1.tv_usec-t2.tv_usec)/1000)
       +#define CEIL(x) (((x) != (int) (x)) ? (x) + 1 : (x))
        
        #define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b))
        #define IS_TRUECOL(x)    (1 << 24 & (x))
       @@ -2777,8 +2778,8 @@ xloadfonts(char *fontstr, int fontsize) {
                        die("st: can't open font %s\n", fontstr);
        
                /* Setting character width and height. */
       -        xw.cw = dc.font.width;
       -        xw.ch = dc.font.height;
       +        xw.cw = CEIL(dc.font.width * cwscale);
       +        xw.ch = CEIL(dc.font.height * chscale);
        
                FcPatternDel(pattern, FC_SLANT);
                FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC);
       @@ -2960,6 +2961,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                Colour *fg, *bg, *temp, revfg, revbg, truefg, truebg;
                XRenderColor colfg, colbg;
                Rectangle r;
       +        int oneatatime;
        
                frcflags = FRC_NORMAL;
        
       @@ -3087,6 +3089,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                        u8fs = s;
                        u8fblen = 0;
                        u8fl = 0;
       +                oneatatime = font->width != xw.cw;
                        for(;;) {
                                u8c = s;
                                u8cblen = utf8decode(s, &u8char);
       @@ -3094,8 +3097,8 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                                bytelen -= u8cblen;
        
                                doesexist = XftCharExists(xw.dpy, font->match, u8char);
       -                        if(!doesexist || bytelen <= 0) {
       -                                if(bytelen <= 0) {
       +                        if(oneatatime || !doesexist || bytelen <= 0) {
       +                                if(oneatatime || bytelen <= 0) {
                                                if(doesexist) {
                                                        u8fl++;
                                                        u8fblen += u8cblen;
       @@ -3108,7 +3111,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                                                                winy + font->ascent,
                                                                (FcChar8 *)u8fs,
                                                                u8fblen);
       -                                        xp += font->width * u8fl;
       +                                        xp += CEIL(font->width * cwscale * u8fl);
        
                                        }
                                        break;
       @@ -3117,8 +3120,11 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                                u8fl++;
                                u8fblen += u8cblen;
                        }
       -                if(doesexist)
       +                if(doesexist) {
       +                        if (oneatatime);
       +                                continue;
                                break;
       +                }
        
                        /* Search the font cache. */
                        for(i = 0; i < frclen; i++) {
       @@ -3178,7 +3184,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
                                        xp, winy + frc[i].font->ascent,
                                        (FcChar8 *)u8c, u8cblen);
        
       -                xp += font->width;
       +                xp += CEIL(font->width * cwscale);
                }
        
                /*