From b5990708483a1fa452b3d4b6ed2bfa998deeeb39 Mon Sep 17 00:00:00 2001 From: rsc Date: Tue, 30 Sep 2003 17:47:43 +0000 Subject: Initial import. --- src/libframe/frutil.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/libframe/frutil.c (limited to 'src/libframe/frutil.c') diff --git a/src/libframe/frutil.c b/src/libframe/frutil.c new file mode 100644 index 00000000..c8e3c043 --- /dev/null +++ b/src/libframe/frutil.c @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include + +int +_frcanfit(Frame *f, Point pt, Frbox *b) +{ + int left, w, nr; + uchar *p; + Rune r; + + left = f->r.max.x-pt.x; + if(b->nrune < 0) + return b->minwid <= left; + if(left >= b->wid) + return b->nrune; + for(nr=0,p=b->ptr; *p; p+=w,nr++){ + r = *p; + if(r < Runeself) + w = 1; + else + w = chartorune(&r, (char*)p); + left -= stringnwidth(f->font, (char*)p, 1); + if(left < 0) + return nr; + } + drawerror(f->display, "_frcanfit can't"); + return 0; +} + +void +_frcklinewrap(Frame *f, Point *p, Frbox *b) +{ + if((b->nrune<0? b->minwid : b->wid) > f->r.max.x-p->x){ + p->x = f->r.min.x; + p->y += f->font->height; + } +} + +void +_frcklinewrap0(Frame *f, Point *p, Frbox *b) +{ + if(_frcanfit(f, *p, b) == 0){ + p->x = f->r.min.x; + p->y += f->font->height; + } +} + +void +_fradvance(Frame *f, Point *p, Frbox *b) +{ + if(b->nrune<0 && b->bc=='\n'){ + p->x = f->r.min.x; + p->y += f->font->height; + }else + p->x += b->wid; +} + +int +_frnewwid(Frame *f, Point pt, Frbox *b) +{ + b->wid = _frnewwid0(f, pt, b); + return b->wid; +} + +int +_frnewwid0(Frame *f, Point pt, Frbox *b) +{ + int c, x; + + c = f->r.max.x; + x = pt.x; + if(b->nrune>=0 || b->bc!='\t') + return b->wid; + if(x+b->minwid > c) + x = pt.x = f->r.min.x; + x += f->maxtab; + x -= (x-f->r.min.x)%f->maxtab; + if(x-pt.xminwid || x>c) + x = pt.x+b->minwid; + return x-pt.x; +} + +void +_frclean(Frame *f, Point pt, int n0, int n1) /* look for mergeable boxes */ +{ + Frbox *b; + int nb, c; + + c = f->r.max.x; + for(nb=n0; nbbox[nb]; + _frcklinewrap(f, &pt, b); + while(b[0].nrune>=0 && nb=0 && pt.x+b[0].wid+b[1].widbox[nb]; + } + _fradvance(f, &pt, &f->box[nb]); + } + for(; nbnbox; nb++){ + b = &f->box[nb]; + _frcklinewrap(f, &pt, b); + _fradvance(f, &pt, &f->box[nb]); + } + f->lastlinefull = 0; + if(pt.y >= f->r.max.y) + f->lastlinefull = 1; +} -- cgit v1.2.3