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