]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libdraw/stringwidth.c
vmx: nanosec(): fix non-interruptable temporary, assign fasthz only once after xstart
[plan9front.git] / sys / src / libdraw / stringwidth.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4
5 int
6 _stringnwidth(Font *f, char *s, Rune *r, int len)
7 {
8         int wid, twid, n, max, try;
9         enum { Max = 64 };
10         ushort cbuf[Max];
11         Rune rune, **rptr;
12         char *subfontname, **sptr;
13         Subfont *sf;
14
15         if(s == nil){
16                 s = "";
17                 sptr = nil;
18         }else
19                 sptr = &s;
20         if(r == nil){
21                 r = L"";
22                 rptr = nil;
23         }else
24                 rptr = &r;
25         subfontname = nil;
26         sf = nil;
27         twid = 0;
28         try = 0;
29         while((*s || *r) && len > 0){
30                 max = Max;
31                 if(len < max)
32                         max = len;
33                 if(subfontname){
34                         freesubfont(sf);
35                         if((sf=_getsubfont(f->display, subfontname)) == nil){
36                                 if(f->display == nil || f->display->defaultfont == nil || f->display->defaultfont == f)
37                                         break;
38                                 f = f->display->defaultfont;
39                         }
40                 }
41                 if((n = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){
42                         if(n == 0){
43                                 if(++try > 10)
44                                         break;
45                                 continue;
46                         }
47                         if(*r)
48                                 r++;
49                         else
50                                 s += chartorune(&rune, s);
51                         len--;
52                         continue;
53                 }
54                 try = 0;
55
56                 agefont(f);
57                 twid += wid;
58                 len -= n;
59         }
60         freesubfont(sf);
61         return twid;
62 }
63
64 int
65 stringnwidth(Font *f, char *s, int len)
66 {
67         return _stringnwidth(f, s, nil, len);
68 }
69
70 int
71 stringwidth(Font *f, char *s)
72 {
73         return _stringnwidth(f, s, nil, 1<<24);
74 }
75
76 Point
77 stringsize(Font *f, char *s)
78 {
79         return Pt(_stringnwidth(f, s, nil, 1<<24), f->height);
80 }
81
82 int
83 runestringnwidth(Font *f, Rune *r, int len)
84 {
85         return _stringnwidth(f, nil, r, len);
86 }
87
88 int
89 runestringwidth(Font *f, Rune *r)
90 {
91         return _stringnwidth(f, nil, r, 1<<24);
92 }
93
94 Point
95 runestringsize(Font *f, Rune *r)
96 {
97         return Pt(_stringnwidth(f, nil, r, 1<<24), f->height);
98 }