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;
16 b2f9ee0d 2005-07-13 devnull Subfont *sf;
18 76193d7c 2003-09-30 devnull if(s == nil){
20 76193d7c 2003-09-30 devnull sptr = nil;
22 76193d7c 2003-09-30 devnull sptr = &s;
23 76193d7c 2003-09-30 devnull if(r == nil){
24 76193d7c 2003-09-30 devnull r = empty;
25 76193d7c 2003-09-30 devnull rptr = nil;
27 76193d7c 2003-09-30 devnull rptr = &r;
28 76193d7c 2003-09-30 devnull twid = 0;
29 4e206880 2004-04-25 devnull while(len>0 && (*s || *r)){
30 76193d7c 2003-09-30 devnull max = Max;
31 76193d7c 2003-09-30 devnull if(len < max)
32 76193d7c 2003-09-30 devnull max = len;
34 b2f9ee0d 2005-07-13 devnull sf = nil;
35 76193d7c 2003-09-30 devnull while((l = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){
36 76193d7c 2003-09-30 devnull if(++n > 10){
38 76193d7c 2003-09-30 devnull rune = *r;
40 76193d7c 2003-09-30 devnull chartorune(&rune, s);
41 76193d7c 2003-09-30 devnull if(f->name != nil)
42 76193d7c 2003-09-30 devnull name = f->name;
44 76193d7c 2003-09-30 devnull name = "unnamed font";
45 b2f9ee0d 2005-07-13 devnull freesubfont(sf);
46 76193d7c 2003-09-30 devnull fprint(2, "stringwidth: bad character set for rune 0x%.4ux in %s\n", rune, name);
47 76193d7c 2003-09-30 devnull return twid;
49 76193d7c 2003-09-30 devnull if(subfontname){
50 b2f9ee0d 2005-07-13 devnull freesubfont(sf);
51 213fc4f6 2015-02-17 rsc if((sf=_getsubfont(f->display, subfontname)) == 0){
52 b2f9ee0d 2005-07-13 devnull def = f->display ? f->display->defaultfont : nil;
53 76193d7c 2003-09-30 devnull if(def && f!=def)
59 b2f9ee0d 2005-07-13 devnull * must not free sf until cachechars has found it in the cache
60 b2f9ee0d 2005-07-13 devnull * and picked up its own reference.
64 b2f9ee0d 2005-07-13 devnull freesubfont(sf);
65 76193d7c 2003-09-30 devnull agefont(f);
66 76193d7c 2003-09-30 devnull twid += wid;
67 76193d7c 2003-09-30 devnull len -= l;
69 76193d7c 2003-09-30 devnull return twid;
73 76193d7c 2003-09-30 devnull stringnwidth(Font *f, char *s, int len)
75 76193d7c 2003-09-30 devnull return _stringnwidth(f, s, nil, len);
79 76193d7c 2003-09-30 devnull stringwidth(Font *f, char *s)
81 76193d7c 2003-09-30 devnull return _stringnwidth(f, s, nil, 1<<24);
85 76193d7c 2003-09-30 devnull stringsize(Font *f, char *s)
87 76193d7c 2003-09-30 devnull return Pt(_stringnwidth(f, s, nil, 1<<24), f->height);
91 76193d7c 2003-09-30 devnull runestringnwidth(Font *f, Rune *r, int len)
93 76193d7c 2003-09-30 devnull return _stringnwidth(f, nil, r, len);
97 76193d7c 2003-09-30 devnull runestringwidth(Font *f, Rune *r)
99 76193d7c 2003-09-30 devnull return _stringnwidth(f, nil, r, 1<<24);
103 76193d7c 2003-09-30 devnull runestringsize(Font *f, Rune *r)
105 76193d7c 2003-09-30 devnull return Pt(_stringnwidth(f, nil, r, 1<<24), f->height);