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 | 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