xref: /plan9/sys/src/libdraw/stringsubfont.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <draw.h>
4*7dd7cddfSDavid du Colombier 
5*7dd7cddfSDavid du Colombier Point
stringsubfont(Image * b,Point p,Image * color,Subfont * f,char * cs)6*7dd7cddfSDavid du Colombier stringsubfont(Image *b, Point p, Image *color, Subfont *f, char *cs)
7*7dd7cddfSDavid du Colombier {
8*7dd7cddfSDavid du Colombier 	int w, width;
9*7dd7cddfSDavid du Colombier 	uchar *s;
10*7dd7cddfSDavid du Colombier 	Rune c;
11*7dd7cddfSDavid du Colombier 	Fontchar *i;
12*7dd7cddfSDavid du Colombier 
13*7dd7cddfSDavid du Colombier 	s = (uchar*)cs;
14*7dd7cddfSDavid du Colombier 	for(; c=*s; p.x+=width){
15*7dd7cddfSDavid du Colombier 		width = 0;
16*7dd7cddfSDavid du Colombier 		if(c < Runeself)
17*7dd7cddfSDavid du Colombier 			s++;
18*7dd7cddfSDavid du Colombier 		else{
19*7dd7cddfSDavid du Colombier 			w = chartorune(&c, (char*)s);
20*7dd7cddfSDavid du Colombier 			if(w == 0){
21*7dd7cddfSDavid du Colombier 				s++;
22*7dd7cddfSDavid du Colombier 				continue;
23*7dd7cddfSDavid du Colombier 			}
24*7dd7cddfSDavid du Colombier 			s += w;
25*7dd7cddfSDavid du Colombier 		}
26*7dd7cddfSDavid du Colombier 		if(c >= f->n)
27*7dd7cddfSDavid du Colombier 			continue;
28*7dd7cddfSDavid du Colombier 		i = f->info+c;
29*7dd7cddfSDavid du Colombier 		width = i->width;
30*7dd7cddfSDavid du Colombier 		draw(b, Rect(p.x+i->left, p.y+i->top, p.x+i->left+(i[1].x-i[0].x), p.y+i->bottom),
31*7dd7cddfSDavid du Colombier 			color, f->bits, Pt(i->x, i->top));
32*7dd7cddfSDavid du Colombier 	}
33*7dd7cddfSDavid du Colombier 	return p;
34*7dd7cddfSDavid du Colombier }
35*7dd7cddfSDavid du Colombier 
36*7dd7cddfSDavid du Colombier Point
strsubfontwidth(Subfont * f,char * cs)37*7dd7cddfSDavid du Colombier strsubfontwidth(Subfont *f, char *cs)
38*7dd7cddfSDavid du Colombier {
39*7dd7cddfSDavid du Colombier 	Rune c;
40*7dd7cddfSDavid du Colombier 	Point p;
41*7dd7cddfSDavid du Colombier 	uchar *s;
42*7dd7cddfSDavid du Colombier 	Fontchar *i;
43*7dd7cddfSDavid du Colombier 	int w, width;
44*7dd7cddfSDavid du Colombier 
45*7dd7cddfSDavid du Colombier 	p = Pt(0, f->height);
46*7dd7cddfSDavid du Colombier 	s = (uchar*)cs;
47*7dd7cddfSDavid du Colombier 	for(; c=*s; p.x+=width){
48*7dd7cddfSDavid du Colombier 		width = 0;
49*7dd7cddfSDavid du Colombier 		if(c < Runeself)
50*7dd7cddfSDavid du Colombier 			s++;
51*7dd7cddfSDavid du Colombier 		else{
52*7dd7cddfSDavid du Colombier 			w = chartorune(&c, (char*)s);
53*7dd7cddfSDavid du Colombier 			if(w == 0){
54*7dd7cddfSDavid du Colombier 				s++;
55*7dd7cddfSDavid du Colombier 				continue;
56*7dd7cddfSDavid du Colombier 			}
57*7dd7cddfSDavid du Colombier 			s += w;
58*7dd7cddfSDavid du Colombier 		}
59*7dd7cddfSDavid du Colombier 		if(c >= f->n)
60*7dd7cddfSDavid du Colombier 			continue;
61*7dd7cddfSDavid du Colombier 		i = f->info+c;
62*7dd7cddfSDavid du Colombier 		width = i->width;
63*7dd7cddfSDavid du Colombier 	}
64*7dd7cddfSDavid du Colombier 	return p;
65*7dd7cddfSDavid du Colombier }
66