xref: /plan9-contrib/sys/src/libframe/frdraw.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include <u.h>
2 #include <libc.h>
3 #include <libg.h>
4 #include <frame.h>
5 
6 void
7 _frredraw(Frame *f, Point pt)
8 {
9 	Frbox *b;
10 	int nb;
11 	for(nb=0,b=f->box; nb<f->nbox; nb++, b++){
12 		_frcklinewrap(f, &pt, b);
13 		if(b->nrune >= 0)
14 			string(f->b, pt, f->font, (char *)b->ptr, S);
15 		pt.x += b->wid;
16 	}
17 }
18 
19 Point
20 _frdraw(Frame *f, Point pt)
21 {
22 	Frbox *b;
23 	int nb, n;
24 
25 	for(b=f->box,nb=0; nb<f->nbox; nb++, b++){
26 		_frcklinewrap0(f, &pt, b);
27 		if(pt.y == f->r.max.y){
28 			f->nchars -= _frstrlen(f, nb);
29 			_frdelbox(f, nb, f->nbox-1);
30 			break;
31 		}
32 		if(b->nrune > 0){
33 			n = _frcanfit(f, pt, b);
34 			if(n == 0)
35 				berror("draw: _frcanfit==0");
36 			if(n != b->nrune){
37 				_frsplitbox(f, nb, n);
38 				b = &f->box[nb];
39 			}
40 			pt.x += b->wid;
41 		}else{
42 			if(b->bc == '\n')
43 				pt.x = f->left, pt.y+=f->font->height;
44 			else
45 				pt.x += _frnewwid(f, pt, b);
46 		}
47 	}
48 	return pt;
49 }
50 int
51 _frstrlen(Frame *f, int nb)
52 {
53 	int n;
54 
55 	for(n=0; nb<f->nbox; nb++)
56 		n += NRUNE(&f->box[nb]);
57 	return n;
58 }
59