Blame


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>
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull static Rune empty[] = { 0 };
6 76193d7c 2003-09-30 devnull int
7 76193d7c 2003-09-30 devnull _stringnwidth(Font *f, char *s, Rune *r, int len)
8 76193d7c 2003-09-30 devnull {
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;
17 76193d7c 2003-09-30 devnull
18 76193d7c 2003-09-30 devnull if(s == nil){
19 76193d7c 2003-09-30 devnull s = "";
20 76193d7c 2003-09-30 devnull sptr = nil;
21 76193d7c 2003-09-30 devnull }else
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;
26 76193d7c 2003-09-30 devnull }else
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;
33 76193d7c 2003-09-30 devnull n = 0;
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){
37 76193d7c 2003-09-30 devnull if(*r)
38 76193d7c 2003-09-30 devnull rune = *r;
39 76193d7c 2003-09-30 devnull else
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;
43 76193d7c 2003-09-30 devnull else
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;
48 76193d7c 2003-09-30 devnull }
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)
54 76193d7c 2003-09-30 devnull f = def;
55 76193d7c 2003-09-30 devnull else
56 76193d7c 2003-09-30 devnull break;
57 76193d7c 2003-09-30 devnull }
58 fa325e9b 2020-01-10 cross /*
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.
61 b2f9ee0d 2005-07-13 devnull */
62 76193d7c 2003-09-30 devnull }
63 76193d7c 2003-09-30 devnull }
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;
68 76193d7c 2003-09-30 devnull }
69 76193d7c 2003-09-30 devnull return twid;
70 76193d7c 2003-09-30 devnull }
71 76193d7c 2003-09-30 devnull
72 76193d7c 2003-09-30 devnull int
73 76193d7c 2003-09-30 devnull stringnwidth(Font *f, char *s, int len)
74 76193d7c 2003-09-30 devnull {
75 76193d7c 2003-09-30 devnull return _stringnwidth(f, s, nil, len);
76 76193d7c 2003-09-30 devnull }
77 76193d7c 2003-09-30 devnull
78 76193d7c 2003-09-30 devnull int
79 76193d7c 2003-09-30 devnull stringwidth(Font *f, char *s)
80 76193d7c 2003-09-30 devnull {
81 76193d7c 2003-09-30 devnull return _stringnwidth(f, s, nil, 1<<24);
82 76193d7c 2003-09-30 devnull }
83 76193d7c 2003-09-30 devnull
84 76193d7c 2003-09-30 devnull Point
85 76193d7c 2003-09-30 devnull stringsize(Font *f, char *s)
86 76193d7c 2003-09-30 devnull {
87 76193d7c 2003-09-30 devnull return Pt(_stringnwidth(f, s, nil, 1<<24), f->height);
88 76193d7c 2003-09-30 devnull }
89 76193d7c 2003-09-30 devnull
90 76193d7c 2003-09-30 devnull int
91 76193d7c 2003-09-30 devnull runestringnwidth(Font *f, Rune *r, int len)
92 76193d7c 2003-09-30 devnull {
93 76193d7c 2003-09-30 devnull return _stringnwidth(f, nil, r, len);
94 76193d7c 2003-09-30 devnull }
95 76193d7c 2003-09-30 devnull
96 76193d7c 2003-09-30 devnull int
97 76193d7c 2003-09-30 devnull runestringwidth(Font *f, Rune *r)
98 76193d7c 2003-09-30 devnull {
99 76193d7c 2003-09-30 devnull return _stringnwidth(f, nil, r, 1<<24);
100 76193d7c 2003-09-30 devnull }
101 76193d7c 2003-09-30 devnull
102 76193d7c 2003-09-30 devnull Point
103 76193d7c 2003-09-30 devnull runestringsize(Font *f, Rune *r)
104 76193d7c 2003-09-30 devnull {
105 76193d7c 2003-09-30 devnull return Pt(_stringnwidth(f, nil, r, 1<<24), f->height);
106 76193d7c 2003-09-30 devnull }