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 76193d7c 2003-09-30 devnull
17 76193d7c 2003-09-30 devnull if(s == nil){
18 76193d7c 2003-09-30 devnull s = "";
19 76193d7c 2003-09-30 devnull sptr = nil;
20 76193d7c 2003-09-30 devnull }else
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;
25 76193d7c 2003-09-30 devnull }else
26 76193d7c 2003-09-30 devnull rptr = &r;
27 76193d7c 2003-09-30 devnull twid = 0;
28 4e206880 2004-04-25 devnull while(len>0 && (*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;
32 76193d7c 2003-09-30 devnull n = 0;
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){
35 76193d7c 2003-09-30 devnull if(*r)
36 76193d7c 2003-09-30 devnull rune = *r;
37 76193d7c 2003-09-30 devnull else
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;
41 76193d7c 2003-09-30 devnull else
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;
45 76193d7c 2003-09-30 devnull }
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)
50 76193d7c 2003-09-30 devnull f = def;
51 76193d7c 2003-09-30 devnull else
52 76193d7c 2003-09-30 devnull break;
53 76193d7c 2003-09-30 devnull }
54 76193d7c 2003-09-30 devnull }
55 76193d7c 2003-09-30 devnull }
56 76193d7c 2003-09-30 devnull agefont(f);
57 76193d7c 2003-09-30 devnull twid += wid;
58 76193d7c 2003-09-30 devnull len -= l;
59 76193d7c 2003-09-30 devnull }
60 76193d7c 2003-09-30 devnull return twid;
61 76193d7c 2003-09-30 devnull }
62 76193d7c 2003-09-30 devnull
63 76193d7c 2003-09-30 devnull int
64 76193d7c 2003-09-30 devnull stringnwidth(Font *f, char *s, int len)
65 76193d7c 2003-09-30 devnull {
66 76193d7c 2003-09-30 devnull return _stringnwidth(f, s, nil, len);
67 76193d7c 2003-09-30 devnull }
68 76193d7c 2003-09-30 devnull
69 76193d7c 2003-09-30 devnull int
70 76193d7c 2003-09-30 devnull stringwidth(Font *f, char *s)
71 76193d7c 2003-09-30 devnull {
72 76193d7c 2003-09-30 devnull return _stringnwidth(f, s, nil, 1<<24);
73 76193d7c 2003-09-30 devnull }
74 76193d7c 2003-09-30 devnull
75 76193d7c 2003-09-30 devnull Point
76 76193d7c 2003-09-30 devnull stringsize(Font *f, char *s)
77 76193d7c 2003-09-30 devnull {
78 76193d7c 2003-09-30 devnull return Pt(_stringnwidth(f, s, nil, 1<<24), f->height);
79 76193d7c 2003-09-30 devnull }
80 76193d7c 2003-09-30 devnull
81 76193d7c 2003-09-30 devnull int
82 76193d7c 2003-09-30 devnull runestringnwidth(Font *f, Rune *r, int len)
83 76193d7c 2003-09-30 devnull {
84 76193d7c 2003-09-30 devnull return _stringnwidth(f, nil, r, len);
85 76193d7c 2003-09-30 devnull }
86 76193d7c 2003-09-30 devnull
87 76193d7c 2003-09-30 devnull int
88 76193d7c 2003-09-30 devnull runestringwidth(Font *f, Rune *r)
89 76193d7c 2003-09-30 devnull {
90 76193d7c 2003-09-30 devnull return _stringnwidth(f, nil, r, 1<<24);
91 76193d7c 2003-09-30 devnull }
92 76193d7c 2003-09-30 devnull
93 76193d7c 2003-09-30 devnull Point
94 76193d7c 2003-09-30 devnull runestringsize(Font *f, Rune *r)
95 76193d7c 2003-09-30 devnull {
96 76193d7c 2003-09-30 devnull return Pt(_stringnwidth(f, nil, r, 1<<24), f->height);
97 76193d7c 2003-09-30 devnull }