Measure the single advance width with a heuristic method
This fix is needed to use dual-width fonts, which have double-width glyphs (e.g. CJK unified ideographs). Signed-off-by: Ryusei Yamaguchi <mandel59@gmail.com> Signed-off-by: Christoph Lohmann <20h@r-36.net>
This commit is contained in:
		
				
					committed by
					
						 Christoph Lohmann
						Christoph Lohmann
					
				
			
			
				
	
			
			
			
						parent
						
							30440295bc
						
					
				
				
					commit
					034a5c8a09
				
			| @@ -417,3 +417,11 @@ static uint selmasks[] = { | |||||||
| 	[SEL_RECTANGULAR] = Mod1Mask, | 	[SEL_RECTANGULAR] = Mod1Mask, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Printable characters in ASCII, used to estimate the advance width | ||||||
|  |  * of single wide characters. | ||||||
|  |  */ | ||||||
|  | static char ascii_printable[] = | ||||||
|  | 	" !\"#$%&'()*+,-./0123456789:;<=>?" | ||||||
|  | 	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" | ||||||
|  | 	"`abcdefghijklmnopqrstuvwxyz{|}~"; | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								st.c
									
									
									
									
									
								
							| @@ -68,6 +68,7 @@ char *argv0; | |||||||
| #define LEN(a)			(sizeof(a) / sizeof(a)[0]) | #define LEN(a)			(sizeof(a) / sizeof(a)[0]) | ||||||
| #define DEFAULT(a, b)		(a) = (a) ? (a) : (b) | #define DEFAULT(a, b)		(a) = (a) ? (a) : (b) | ||||||
| #define BETWEEN(x, a, b)	((a) <= (x) && (x) <= (b)) | #define BETWEEN(x, a, b)	((a) <= (x) && (x) <= (b)) | ||||||
|  | #define DIVCEIL(n, d)		(((n) + ((d) - 1)) / (d)) | ||||||
| #define ISCONTROLC0(c)		(BETWEEN(c, 0, 0x1f) || (c) == '\177') | #define ISCONTROLC0(c)		(BETWEEN(c, 0, 0x1f) || (c) == '\177') | ||||||
| #define ISCONTROLC1(c)		(BETWEEN(c, 0x80, 0x9f)) | #define ISCONTROLC1(c)		(BETWEEN(c, 0x80, 0x9f)) | ||||||
| #define ISCONTROL(c)		(ISCONTROLC0(c) || ISCONTROLC1(c)) | #define ISCONTROL(c)		(ISCONTROLC0(c) || ISCONTROLC1(c)) | ||||||
| @@ -3277,6 +3278,7 @@ xloadfont(Font *f, FcPattern *pattern) | |||||||
| { | { | ||||||
| 	FcPattern *match; | 	FcPattern *match; | ||||||
| 	FcResult result; | 	FcResult result; | ||||||
|  | 	XGlyphInfo extents; | ||||||
|  |  | ||||||
| 	match = FcFontMatch(NULL, pattern, &result); | 	match = FcFontMatch(NULL, pattern, &result); | ||||||
| 	if (!match) | 	if (!match) | ||||||
| @@ -3287,6 +3289,10 @@ xloadfont(Font *f, FcPattern *pattern) | |||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	XftTextExtentsUtf8(xw.dpy, f->match, | ||||||
|  | 		(const FcChar8 *) ascii_printable, | ||||||
|  | 		LEN(ascii_printable), &extents); | ||||||
|  |  | ||||||
| 	f->set = NULL; | 	f->set = NULL; | ||||||
| 	f->pattern = FcPatternDuplicate(pattern); | 	f->pattern = FcPatternDuplicate(pattern); | ||||||
|  |  | ||||||
| @@ -3296,7 +3302,7 @@ xloadfont(Font *f, FcPattern *pattern) | |||||||
| 	f->rbearing = f->match->max_advance_width; | 	f->rbearing = f->match->max_advance_width; | ||||||
|  |  | ||||||
| 	f->height = f->ascent + f->descent; | 	f->height = f->ascent + f->descent; | ||||||
| 	f->width = f->lbearing + f->rbearing; | 	f->width = DIVCEIL(extents.xOff, LEN(ascii_printable)); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user