]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libdraw/stringwidth.c
Import sources from 2011-03-30 iso image - lib
[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, l;
9         char *name;
10         enum { Max = 64 };
11         ushort cbuf[Max];
12         Rune rune, **rptr;
13         char *subfontname, **sptr;
14         Font *def;
15
16         if(s == nil){
17                 s = "";
18                 sptr = nil;
19         }else
20                 sptr = &s;
21         if(r == nil){
22                 r = L"";
23                 rptr = nil;
24         }else
25                 rptr = &r;
26         twid = 0;
27         while(len>0 && (*s || *r)){
28                 max = Max;
29                 if(len < max)
30                         max = len;
31                 n = 0;
32                 while((l = cachechars(f, sptr, rptr, cbuf, max, &wid, &subfontname)) <= 0){
33                         if(++n > 10){
34                                 if(*r)
35                                         rune = *r;
36                                 else
37                                         chartorune(&rune, s);
38                                 if(f->name != nil)
39                                         name = f->name;
40                                 else
41                                         name = "unnamed font";
42                                 fprint(2, "stringwidth: bad character set for rune 0x%.4ux in %s\n", rune, name);
43                                 return twid;
44                         }
45                         if(subfontname){
46                                 if(_getsubfont(f->display, subfontname) == 0){
47                                         def = f->display->defaultfont;
48                                         if(def && f!=def)
49                                                 f = def;
50                                         else
51                                                 break;
52                                 }
53                         }
54                 }
55                 agefont(f);
56                 twid += wid;
57                 len -= l;
58         }
59         return twid;
60 }
61
62 int
63 stringnwidth(Font *f, char *s, int len)
64 {
65         return _stringnwidth(f, s, nil, len);
66 }
67
68 int
69 stringwidth(Font *f, char *s)
70 {
71         return _stringnwidth(f, s, nil, 1<<24);
72 }
73
74 Point
75 stringsize(Font *f, char *s)
76 {
77         return Pt(_stringnwidth(f, s, nil, 1<<24), f->height);
78 }
79
80 int
81 runestringnwidth(Font *f, Rune *r, int len)
82 {
83         return _stringnwidth(f, nil, r, len);
84 }
85
86 int
87 runestringwidth(Font *f, Rune *r)
88 {
89         return _stringnwidth(f, nil, r, 1<<24);
90 }
91
92 Point
93 runestringsize(Font *f, Rune *r)
94 {
95         return Pt(_stringnwidth(f, nil, r, 1<<24), f->height);
96 }