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