X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=sys%2Fsrc%2Flibdraw%2Fstringwidth.c;h=3548aba0b9dabd08bd7a26e2d0e76f0b178bb5ed;hb=ce17224eaf159e48b4cbb40c437bb2b3e008ca9e;hp=eb2bb42e76f3feacd9d2330c54e868c6386c4c3d;hpb=e5888a1ffdae813d7575f5fb02275c6bb07e5199;p=plan9front.git diff --git a/sys/src/libdraw/stringwidth.c b/sys/src/libdraw/stringwidth.c old mode 100755 new mode 100644 index eb2bb42e7..3548aba0b --- a/sys/src/libdraw/stringwidth.c +++ b/sys/src/libdraw/stringwidth.c @@ -5,13 +5,12 @@ int _stringnwidth(Font *f, char *s, Rune *r, int len) { - int wid, twid, n, max, l; - char *name; + int wid, twid, n, max, try; enum { Max = 64 }; ushort cbuf[Max]; Rune rune, **rptr; char *subfontname, **sptr; - Font *def; + Subfont *sf; if(s == nil){ s = ""; @@ -23,39 +22,42 @@ _stringnwidth(Font *f, char *s, Rune *r, int len) rptr = nil; }else rptr = &r; + subfontname = nil; + sf = nil; twid = 0; - while(len>0 && (*s || *r)){ + try = 0; + while((*s || *r) && len > 0){ 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"; - fprint(2, "stringwidth: bad character set for rune 0x%.4ux in %s\n", rune, name); - return twid; + if(subfontname){ + freesubfont(sf); + if((sf=_getsubfont(f->display, subfontname)) == nil){ + if(f->display == nil || f->display->defaultfont == nil || f->display->defaultfont == f) + break; + f = f->display->defaultfont; } - if(subfontname){ - if(_getsubfont(f->display, subfontname) == 0){ - def = f->display->defaultfont; - if(def && f!=def) - f = def; - else - break; - } + } + if((n = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){ + if(n == 0){ + if(++try > 10) + break; + continue; } + if(*r) + r++; + else + s += chartorune(&rune, s); + len--; + continue; } + try = 0; + agefont(f); twid += wid; - len -= l; + len -= n; } + freesubfont(sf); return twid; }