[hackers] [st] Use character size scaling factors || Eric Pruitt

From: <git_AT_suckless.org>
Date: Mon, 05 Aug 2013 11:46:40 +0200

commit 7e3cff33ffbd69a112fa4071a9f0ed2dc93bfc57
Author: Eric Pruitt <eric.pruitt_AT_gmail.com>
Date: Mon Aug 5 11:33:37 2013 +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.

diff --git a/TODO b/TODO
index 4fc1346..794b71b 100644
--- a/TODO
+++ b/TODO
_AT_@ -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
diff --git a/config.def.h b/config.def.h
index 9a3d2c8..8cb8804 100644
--- a/config.def.h
+++ b/config.def.h
_AT_@ -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
  *
diff --git a/st.c b/st.c
index 362de23..6756f76 100644
--- a/st.c
+++ b/st.c
_AT_@ -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))
_AT_@ -2777,8 +2778,8 @@ xloadfonts(char *fontstr, int fontsize) {
                 die("st: can't open font %s
", 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);
_AT_@ -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;
 
_AT_@ -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);
_AT_@ -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;
_AT_@ -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;
_AT_@ -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++) {
_AT_@ -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);
         }
 
         /*
Received on Mon Aug 05 2013 - 11:46:40 CEST

This archive was generated by hypermail 2.3.0 : Mon Aug 05 2013 - 11:48:27 CEST