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;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!render) {
 | 
						if (!render) {
 | 
				
			||||||
		w = ~w;
 | 
							w = invert ? invert : ~invert;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
 | 
							XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
 | 
				
			||||||
		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
 | 
							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) {
 | 
										if (ew + tmpw > w) {
 | 
				
			||||||
						overflow = 1;
 | 
											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) {
 | 
										} else if (curfont == usedfont) {
 | 
				
			||||||
						utf8strlen += utf8charlen;
 | 
											utf8strlen += utf8charlen;
 | 
				
			||||||
						text += 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);
 | 
						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
 | 
					void
 | 
				
			||||||
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
 | 
					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);
 | 
					Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
 | 
				
			||||||
void drw_fontset_free(Fnt* set);
 | 
					void drw_fontset_free(Fnt* set);
 | 
				
			||||||
unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
 | 
					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);
 | 
					void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Colorscheme abstraction */
 | 
					/* Colorscheme abstraction */
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user