introduce drw_fontset_getwidth_clamp()
getting the width of a string is an O(n) operation, and in many cases users only care about getting the width upto a certain number. instead of calling drw_fontset_getwidth() and *then* clamping the result, this patch introduces drw_fontset_getwidth_clamp() function, similar to strnlen(), which will stop once we reach n. the `invert` parameter was overloaded internally to preserve the API, however library users should be calling drw_fontset_getwidth_clamp() and not depend upon internal behavior of drw_text().
This commit is contained in:
		
							
								
								
									
										19
									
								
								drw.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								drw.c
									
									
									
									
									
								
							@ -268,7 +268,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	if (!render) {
 | 
			
		||||
		w = ~w;
 | 
			
		||||
		w = invert ? invert : ~invert;
 | 
			
		||||
	} else {
 | 
			
		||||
		XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
 | 
			
		||||
		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
 | 
			
		||||
@ -300,7 +300,13 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
 | 
			
		||||
 | 
			
		||||
					if (ew + tmpw > w) {
 | 
			
		||||
						overflow = 1;
 | 
			
		||||
						utf8strlen = ellipsis_len;
 | 
			
		||||
						/* called from drw_fontset_getwidth_clamp():
 | 
			
		||||
						 * it wants the width AFTER the overflow
 | 
			
		||||
						 */
 | 
			
		||||
						if (!render)
 | 
			
		||||
							x += tmpw;
 | 
			
		||||
						else
 | 
			
		||||
							utf8strlen = ellipsis_len;
 | 
			
		||||
					} else if (curfont == usedfont) {
 | 
			
		||||
						utf8strlen += utf8charlen;
 | 
			
		||||
						text += utf8charlen;
 | 
			
		||||
@ -397,6 +403,15 @@ drw_fontset_getwidth(Drw *drw, const char *text)
 | 
			
		||||
	return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned int
 | 
			
		||||
drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int tmp = 0;
 | 
			
		||||
	if (drw && drw->fonts && text && n)
 | 
			
		||||
		tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n);
 | 
			
		||||
	return MIN(n, tmp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								drw.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								drw.h
									
									
									
									
									
								
							@ -35,6 +35,7 @@ void drw_free(Drw *drw);
 | 
			
		||||
Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
 | 
			
		||||
void drw_fontset_free(Fnt* set);
 | 
			
		||||
unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
 | 
			
		||||
unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n);
 | 
			
		||||
void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
 | 
			
		||||
 | 
			
		||||
/* Colorscheme abstraction */
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user