1 76193d7c 2003-09-30 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <libc.h>
3 76193d7c 2003-09-30 devnull #include <draw.h>
5 76193d7c 2003-09-30 devnull static Rune empty[] = { 0 };
7 76193d7c 2003-09-30 devnull _stringnwidth(Font *f, char *s, Rune *r, int len)
9 76193d7c 2003-09-30 devnull int wid, twid, n, max, l;
10 76193d7c 2003-09-30 devnull char *name;
11 76193d7c 2003-09-30 devnull enum { Max = 64 };
12 76193d7c 2003-09-30 devnull ushort cbuf[Max];
13 76193d7c 2003-09-30 devnull Rune rune, **rptr;
14 76193d7c 2003-09-30 devnull char *subfontname, **sptr;
15 76193d7c 2003-09-30 devnull Font *def;
17 76193d7c 2003-09-30 devnull if(s == nil){
19 76193d7c 2003-09-30 devnull sptr = nil;
21 76193d7c 2003-09-30 devnull sptr = &s;
22 76193d7c 2003-09-30 devnull if(r == nil){
23 76193d7c 2003-09-30 devnull r = empty;
24 76193d7c 2003-09-30 devnull rptr = nil;
26 76193d7c 2003-09-30 devnull rptr = &r;
27 76193d7c 2003-09-30 devnull twid = 0;
28 15680d56 2004-03-05 devnull while(len && (*s || *r)){
29 76193d7c 2003-09-30 devnull max = Max;
30 76193d7c 2003-09-30 devnull if(len < max)
31 76193d7c 2003-09-30 devnull max = len;
33 76193d7c 2003-09-30 devnull while((l = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){
34 76193d7c 2003-09-30 devnull if(++n > 10){
36 76193d7c 2003-09-30 devnull rune = *r;
38 76193d7c 2003-09-30 devnull chartorune(&rune, s);
39 76193d7c 2003-09-30 devnull if(f->name != nil)
40 76193d7c 2003-09-30 devnull name = f->name;
42 76193d7c 2003-09-30 devnull name = "unnamed font";
43 76193d7c 2003-09-30 devnull fprint(2, "stringwidth: bad character set for rune 0x%.4ux in %s\n", rune, name);
44 76193d7c 2003-09-30 devnull return twid;
46 76193d7c 2003-09-30 devnull if(subfontname){
47 76193d7c 2003-09-30 devnull if(_getsubfont(f->display, subfontname) == 0){
48 76193d7c 2003-09-30 devnull def = f->display->defaultfont;
49 76193d7c 2003-09-30 devnull if(def && f!=def)
56 76193d7c 2003-09-30 devnull agefont(f);
57 76193d7c 2003-09-30 devnull twid += wid;
58 76193d7c 2003-09-30 devnull len -= l;
60 76193d7c 2003-09-30 devnull return twid;
64 76193d7c 2003-09-30 devnull stringnwidth(Font *f, char *s, int len)
66 76193d7c 2003-09-30 devnull return _stringnwidth(f, s, nil, len);
70 76193d7c 2003-09-30 devnull stringwidth(Font *f, char *s)
72 76193d7c 2003-09-30 devnull return _stringnwidth(f, s, nil, 1<<24);
76 76193d7c 2003-09-30 devnull stringsize(Font *f, char *s)
78 76193d7c 2003-09-30 devnull return Pt(_stringnwidth(f, s, nil, 1<<24), f->height);
82 76193d7c 2003-09-30 devnull runestringnwidth(Font *f, Rune *r, int len)
84 76193d7c 2003-09-30 devnull return _stringnwidth(f, nil, r, len);
88 76193d7c 2003-09-30 devnull runestringwidth(Font *f, Rune *r)
90 76193d7c 2003-09-30 devnull return _stringnwidth(f, nil, r, 1<<24);
94 76193d7c 2003-09-30 devnull runestringsize(Font *f, Rune *r)
96 76193d7c 2003-09-30 devnull return Pt(_stringnwidth(f, nil, r, 1<<24), f->height);