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
						Roberto E. Vargas Caballero
					
				
			
			
				
	
			
			
			
						parent
						
							aaee0e8b28
						
					
				
				
					commit
					7e3cff33ff
				
			
							
								
								
									
										1
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								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 | ||||
|  | ||||
| @ -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 | ||||
|  * | ||||
|  | ||||
							
								
								
									
										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 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); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
|  | ||||
		Reference in New Issue
	
	Block a user