~petersanchez/st

7e3cff33ffbd69a112fa4071a9f0ed2dc93bfc57 — Eric Pruitt 10 years ago aaee0e8
Use character size scaling factors

The bounding boxes for characters can be scaled using "cwscale" and "chscale"
to scale the width and height respectively.
3 files changed, 17 insertions(+), 8 deletions(-)

M TODO
M config.def.h
M st.c
M TODO => TODO +0 -1
@@ 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

M config.def.h => config.def.h +4 -0
@@ 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
 *

M st.c => st.c +13 -7
@@ 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);
	}

	/*