Speeding up the drawing, then all characters are known.
This commit is contained in:
		
							parent
							
								
									9c44229c62
								
							
						
					
					
						commit
						addc848345
					
				
							
								
								
									
										96
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										96
									
								
								st.c
									
									
									
									
									
								
							| @ -437,7 +437,7 @@ typedef struct { | ||||
|  */ | ||||
| 
 | ||||
| static Fontcache frc[256]; | ||||
| static int frccur = 0, frclen = 0; | ||||
| static int frccur = -1, frclen = 0; | ||||
| 
 | ||||
| ssize_t | ||||
| xwrite(int fd, char *s, size_t len) { | ||||
| @ -2410,7 +2410,7 @@ xunloadfonts(void) | ||||
| 			ip = LEN(frc) - 1; | ||||
| 		XftFontClose(xw.dpy, frc[ip].font); | ||||
| 	} | ||||
| 	frccur = 0; | ||||
| 	frccur = -1; | ||||
| 	frclen = 0; | ||||
| 
 | ||||
| 	XftFontClose(xw.dpy, dc.font.match); | ||||
| @ -2532,11 +2532,12 @@ xinit(void) { | ||||
| void | ||||
| xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | ||||
| 	int winx = borderpx + x * xw.cw, winy = borderpx + y * xw.ch, | ||||
| 	    width = charlen * xw.cw, u8clen, xp, i, frp, frcflags; | ||||
| 	    width = charlen * xw.cw, xp, i; | ||||
| 	int frp, frcflags; | ||||
| 	int u8fl, u8fblen, u8cblen, doesexist; | ||||
| 	char *u8c, *u8fs; | ||||
| 	long u8char; | ||||
| 	char *u8c; | ||||
| 	Font *font = &dc.font; | ||||
| 	XftFont *sfont; | ||||
| 	FcResult fcres; | ||||
| 	FcPattern *fcpattern, *fontpattern; | ||||
| 	FcFontSet *fcsets[] = { NULL }; | ||||
| @ -2608,11 +2609,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | ||||
| 		bg = temp; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Width of the whole string that should be printed. */ | ||||
| 	XftTextExtentsUtf8(xw.dpy, font->match, (FcChar8 *)s, bytelen, | ||||
| 			&extents); | ||||
| 	width = extents.xOff; | ||||
| 
 | ||||
| 	/* Intelligent cleaning up of the borders. */ | ||||
| 	if(x == 0) { | ||||
| 		xclear(0, (y == 0)? 0 : winy, borderpx, | ||||
| @ -2630,24 +2626,49 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | ||||
| 	/* Clean up the region we want to draw to. */ | ||||
| 	XftDrawRect(xw.draw, bg, winx, winy, width, xw.ch); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Step through all UTF-8 characters one by one and search in the font | ||||
| 	 * cache ring buffer, whether there was some font found to display the | ||||
| 	 * unicode value of that UTF-8 character. | ||||
| 	 */ | ||||
| 	fcsets[0] = font->set; | ||||
| 	for (xp = winx; bytelen > 0;) { | ||||
| 		u8c = s; | ||||
| 		u8clen = utf8decode(s, &u8char); | ||||
| 		s += u8clen; | ||||
| 		bytelen -= u8clen; | ||||
| 
 | ||||
| 		sfont = font->match; | ||||
| 		/*
 | ||||
| 		 * Only check the font cache or load new fonts, if the | ||||
| 		 * characters is not represented in main font. | ||||
| 		 * Search for the range in the to be printed string of glyphs | ||||
| 		 * that are in the main font. Then print that range. If | ||||
| 		 * some glyph is found that is not in the font, do the | ||||
| 		 * fallback dance. | ||||
| 		 */ | ||||
| 		if (!XftCharExists(xw.dpy, font->match, u8char)) { | ||||
| 		u8fs = s; | ||||
| 		u8fblen = 0; | ||||
| 		u8fl = 0; | ||||
| 		for (;;) { | ||||
| 			u8c = s; | ||||
| 			u8cblen = utf8decode(s, &u8char); | ||||
| 			s += u8cblen; | ||||
| 			bytelen -= u8cblen; | ||||
| 
 | ||||
| 			doesexist = XftCharIndex(xw.dpy, font->match, u8char); | ||||
| 			if (!doesexist || bytelen <= 0) { | ||||
| 				if (bytelen <= 0) { | ||||
| 					if (doesexist) { | ||||
| 						u8fl++; | ||||
| 						u8fblen += u8cblen; | ||||
| 					} | ||||
| 				} | ||||
| 
 | ||||
| 				if (u8fl > 0) { | ||||
| 					XftDrawStringUtf8(xw.draw, fg, | ||||
| 							font->match, xp, | ||||
| 							winy + font->ascent, | ||||
| 							(FcChar8 *)u8fs, | ||||
| 							u8fblen); | ||||
| 					xp += font->width * u8fl; | ||||
| 				} | ||||
| 				break; | ||||
| 			} | ||||
| 
 | ||||
| 			u8fl++; | ||||
| 			u8fblen += u8cblen; | ||||
| 		} | ||||
| 		if (doesexist) | ||||
| 			break; | ||||
| 
 | ||||
| 		frp = frccur; | ||||
| 		/* Search the font cache. */ | ||||
| 		for (i = 0; i < frclen; i++, frp--) { | ||||
| @ -2659,6 +2680,8 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		/* Nothing was found. */ | ||||
| 		if (i >= frclen) { | ||||
| 			/*
 | ||||
| 			 * Nothing was found in the cache. Now use | ||||
| @ -2681,19 +2704,19 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | ||||
| 			fontpattern = FcFontSetMatch(0, fcsets, | ||||
| 					FcTrue, fcpattern, &fcres); | ||||
| 
 | ||||
| 				frccur++; | ||||
| 				frclen++; | ||||
| 				if (frccur >= LEN(frc)) | ||||
| 					frccur = 0; | ||||
| 				if (frclen >= LEN(frc)) { | ||||
| 					frclen = LEN(frc); | ||||
| 					XftFontClose(xw.dpy, frc[frccur].font); | ||||
| 				} | ||||
| 
 | ||||
| 			/*
 | ||||
| 			 * Overwrite or create the new cache entry | ||||
| 			 * entry. | ||||
| 			 */ | ||||
| 			frccur++; | ||||
| 			frclen++; | ||||
| 			if (frccur >= LEN(frc)) | ||||
| 				frccur = 0; | ||||
| 			if (frclen > LEN(frc)) { | ||||
| 				frclen = LEN(frc); | ||||
| 				XftFontClose(xw.dpy, frc[frccur].font); | ||||
| 			} | ||||
| 
 | ||||
| 			frc[frccur].font = XftFontOpenPattern(xw.dpy, | ||||
| 					fontpattern); | ||||
| 			frc[frccur].c = u8char; | ||||
| @ -2704,11 +2727,10 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { | ||||
| 
 | ||||
| 			frp = frccur; | ||||
| 		} | ||||
| 			sfont = frc[frp].font; | ||||
| 		} | ||||
| 
 | ||||
| 		XftDrawStringUtf8(xw.draw, fg, sfont, xp, winy + sfont->ascent, | ||||
| 				(FcChar8 *)u8c, u8clen); | ||||
| 		XftDrawStringUtf8(xw.draw, fg, frc[frp].font, | ||||
| 				xp, winy + frc[frp].font->ascent, | ||||
| 				(FcChar8 *)u8c, u8cblen); | ||||
| 
 | ||||
| 		xp += font->width; | ||||
| 	} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user