Point _frdraw(Frame *f, Point pt) { Frbox *b; int nb, n; for(b=f->box,nb=0; nb<f->nbox; nb++, b++) { _frcklinewrap0(f, &pt, b); if(pt.y == f->r.max.y) { f->nchars -= _frstrlen(f, nb); _frdelbox(f, nb, f->nbox-1); break; } if(b->nrune > 0) { n = _frcanfit(f, pt, b); if(n == 0) drawerror(f->display, "_frcanfit==0"); if(n != b->nrune) { _frsplitbox(f, nb, n); b = &f->box[nb]; } pt.x += b->wid; } else { if(b->bc == '\n') { pt.x = f->r.min.x; pt.y+=f->font->height; } else pt.x += _frnewwid(f, pt, b); } } return pt; }
int _frfindbox(Frame *f, int bn, ulong p, ulong q) /* find box containing q and put q on a box boundary */ { Frbox *b; for(b = &f->box[bn]; bn<f->nbox && p+NRUNE(b)<=q; bn++, b++) p += NRUNE(b); if(p != q) _frsplitbox(f, bn++, (int)(q-p)); return bn; }