Use character size scaling factors
The bounding boxes for characters can be scaled using "cwscale" and "chscale" to scale the width and height respectively.
This commit is contained in:
		
				
					committed by
					
						
						Roberto E. Vargas Caballero
					
				
			
			
				
	
			
			
			
						parent
						
							aaee0e8b28
						
					
				
				
					commit
					7e3cff33ff
				
			
							
								
								
									
										1
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								TODO
									
									
									
									
									
								
							@ -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
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										20
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								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 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.cw = CEIL(dc.font.width * cwscale);
 | 
				
			||||||
	xw.ch = dc.font.height;
 | 
						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(oneatatime || !doesexist || bytelen <= 0) {
 | 
				
			||||||
				if(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);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user