forsyth20121205-174063a80cc13 years agoHistory
96 lines · 1.6 KB · C
RawDownload
#include "lib9.h"#include "draw.h" int_stringnwidth(Font *f, char *s, Rune *r, int len){	int wid, twid, n, max, l;	char *name;	enum { Max = 64 };	ushort cbuf[Max];	Rune rune, **rptr;	char *subfontname, **sptr;	Font *def;	static Rune rnull; 	if(s == nil){		s = "";		sptr = nil;	}else		sptr = &s;	if(r == nil){		r = &rnull;		rptr = nil;	}else		rptr = &r;	twid = 0;	while(len>0 && (*s || *r)){		max = Max;		if(len < max)			max = len;		n = 0;		while((l = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){			if(++n > 10){				if(*r)					rune = *r;				else					chartorune(&rune, s);				if(f->name != nil)					name = f->name;				else					name = "unnamed font";				_drawprint(2, "stringwidth: bad character set for rune 0x%.4ux in %s\n", rune, name);				return twid;			}			if(subfontname){				if(_getsubfont(f->display, subfontname) == 0){					def = f->display->defaultfont;					if(def && f!=def)						f = def;					else						break;				}			}		}		agefont(f);		twid += wid;		len -= l;	}	return twid;} intstringnwidth(Font *f, char *s, int len){	return _stringnwidth(f, s, nil, len);} intstringwidth(Font *f, char *s){	return _stringnwidth(f, s, nil, 1<<24);} Pointstringsize(Font *f, char *s){	return Pt(_stringnwidth(f, s, nil, 1<<24), f->height);} intrunestringnwidth(Font *f, Rune *r, int len){	return _stringnwidth(f, nil, r, len);} intrunestringwidth(Font *f, Rune *r){	return _stringnwidth(f, nil, r, 1<<24);} Pointrunestringsize(Font *f, Rune *r){	return Pt(_stringnwidth(f, nil, r, 1<<24), f->height);}