Browse Source

Use character size scaling factors

The bounding boxes for characters can be scaled using "cwscale" and "chscale"
to scale the width and height respectively.
master
Eric Pruitt 11 years ago
committed by Roberto E. Vargas Caballero
parent
commit
7e3cff33ff
3 changed files with 17 additions and 8 deletions
  1. +0
    -1
      TODO
  2. +4
    -0
      config.def.h
  3. +13
    -7
      st.c

+ 0
- 1
TODO View File

@ -13,7 +13,6 @@ code & interface
drawing drawing
------- -------
* add diacritics support to xdraws() * add diacritics support to xdraws()
* add kerning configuration
* make the font cache simpler * make the font cache simpler
* add hard width handling * add hard width handling
* xft is reporting wrong width and height for characters * xft is reporting wrong width and height for characters


+ 4
- 0
config.def.h View File

@ -9,6 +9,10 @@ static char font[] = "Liberation Mono:pixelsize=12:antialias=false:autohint=fals
static int borderpx = 2; static int borderpx = 2;
static char shell[] = "/bin/sh"; static char shell[] = "/bin/sh";
/* Kerning / character bounding-box mutlipliers */
float cwscale = 1.0;
float chscale = 1.0;
/* /*
* word delimiter string * word delimiter string
* *


+ 13
- 7
st.c View File

@ -76,6 +76,7 @@ char *argv0;
#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg) #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 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 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 TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b))
#define IS_TRUECOL(x) (1 << 24 & (x)) #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); die("st: can't open font %s\n", fontstr);
/* Setting character width and height. */ /* 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); FcPatternDel(pattern, FC_SLANT);
FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); 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; Colour *fg, *bg, *temp, revfg, revbg, truefg, truebg;
XRenderColor colfg, colbg; XRenderColor colfg, colbg;
Rectangle r; Rectangle r;
int oneatatime;
frcflags = FRC_NORMAL; frcflags = FRC_NORMAL;
@ -3087,6 +3089,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
u8fs = s; u8fs = s;
u8fblen = 0; u8fblen = 0;
u8fl = 0; u8fl = 0;
oneatatime = font->width != xw.cw;
for(;;) { for(;;) {
u8c = s; u8c = s;
u8cblen = utf8decode(s, &u8char); u8cblen = utf8decode(s, &u8char);
@ -3094,8 +3097,8 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
bytelen -= u8cblen; bytelen -= u8cblen;
doesexist = XftCharExists(xw.dpy, font->match, u8char); 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) { if(doesexist) {
u8fl++; u8fl++;
u8fblen += u8cblen; u8fblen += u8cblen;
@ -3108,7 +3111,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
winy + font->ascent, winy + font->ascent,
(FcChar8 *)u8fs, (FcChar8 *)u8fs,
u8fblen); u8fblen);
xp += font->width * u8fl;
xp += CEIL(font->width * cwscale * u8fl);
} }
break; break;
@ -3117,8 +3120,11 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
u8fl++; u8fl++;
u8fblen += u8cblen; u8fblen += u8cblen;
} }
if(doesexist)
if(doesexist) {
if (oneatatime);
continue;
break; break;
}
/* Search the font cache. */ /* Search the font cache. */
for(i = 0; i < frclen; i++) { 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, xp, winy + frc[i].font->ascent,
(FcChar8 *)u8c, u8cblen); (FcChar8 *)u8c, u8cblen);
xp += font->width;
xp += CEIL(font->width * cwscale);
} }
/* /*


Loading…
Cancel
Save