Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}