commit 57851b64122b4a9e6a2289b8b96a447f49f68bae from: Russ Cox date: Fri Mar 07 18:20:00 2008 UTC libframe: translucent font fixes from Plan 9 commit - 41636940514d72e2a941f55f28dc07685e74b3b4 commit + 57851b64122b4a9e6a2289b8b96a447f49f68bae blob - 1098a31e7a8feb3f4e0af53650f7cd229396b2b3 blob + 765641eddcf30b905399586c9f7ebad7e1cfea69 --- include/frame.h +++ include/frame.h @@ -60,7 +60,7 @@ void frinsert(Frame*, Rune*, Rune*, ulong); void frselect(Frame*, Mousectl*); void frselectpaint(Frame*, Point, Point, Image*); void frdrawsel(Frame*, Point, ulong, ulong, int); -void frdrawsel0(Frame*, Point, ulong, ulong, Image*, Image*); +Point frdrawsel0(Frame*, Point, ulong, ulong, Image*, Image*); void frinit(Frame*, Rectangle, Font*, Image*, Image**); void frsetrects(Frame*, Rectangle, Image*); void frclear(Frame*, int); @@ -82,7 +82,7 @@ void _fradvance(Frame*, Point*, Frbox*); int _frnewwid(Frame*, Point, Frbox*); int _frnewwid0(Frame*, Point, Frbox*); void _frclean(Frame*, Point, int, int); -void _frredraw(Frame*, Point); +void _frdrawtext(Frame*, Point, Image*, Image*); void _fraddbox(Frame*, int, int); Point _frptofcharptb(Frame*, ulong, Point, int); Point _frptofcharnb(Frame*, ulong, int); blob - 5f0ae016e44360e2efbe99a70a87f63dba15c4f7 blob + c1cace4246f82be302426578a3774d0130a6fed9 --- src/libframe/frdraw.c +++ src/libframe/frdraw.c @@ -5,16 +5,15 @@ #include void -_frredraw(Frame *f, Point pt) +_frdrawtext(Frame *f, Point pt, Image *text, Image *back) { Frbox *b; int nb; - /* static int x; */ for(nb=0,b=f->box; nbnbox; nb++, b++){ _frcklinewrap(f, &pt, b); if(!f->noredraw && b->nrune >= 0) - string(f->b, pt, f->cols[TEXT], ZP, f->font, (char *)b->ptr); + stringbg(f->b, pt, text, ZP, f->font, (char*)b->ptr, back, ZP); pt.x += b->wid; } } @@ -55,7 +54,7 @@ frdrawsel(Frame *f, Point pt, ulong p0, ulong p1, int frdrawsel0(f, pt, p0, p1, back, text); } -void +Point frdrawsel0(Frame *f, Point pt, ulong p0, ulong p1, Image *back, Image *text) { Frbox *b; @@ -76,6 +75,7 @@ frdrawsel0(Frame *f, Point pt, ulong p0, ulong p1, Ima if(p >= p0){ qt = pt; _frcklinewrap(f, &pt, b); + /* fill in the end of a wrapped line */ if(pt.y > qt.y) draw(f->b, Rect(qt.x, qt.y, f->r.max.x, pt.y), back, nil, qt); } @@ -99,7 +99,7 @@ frdrawsel0(Frame *f, Point pt, ulong p0, ulong p1, Ima x = f->r.max.x; draw(f->b, Rect(pt.x, pt.y, x, pt.y+f->font->height), back, nil, pt); if(b->nrune >= 0) - stringn(f->b, pt, text, ZP, f->font, ptr, nr); + stringnbg(f->b, pt, text, ZP, f->font, ptr, nr, back, ZP); pt.x += w; Continue: b++; @@ -112,9 +112,32 @@ frdrawsel0(Frame *f, Point pt, ulong p0, ulong p1, Ima if(pt.y > qt.y) draw(f->b, Rect(qt.x, qt.y, f->r.max.x, pt.y), back, nil, qt); } + return pt; } void +frredraw(Frame *f) +{ + int ticked; + Point pt; + + if(f->p0 == f->p1){ + ticked = f->ticked; + if(ticked) + frtick(f, frptofchar(f, f->p0), 0); + frdrawsel0(f, frptofchar(f, 0), 0, f->nchars, f->cols[BACK], f->cols[TEXT]); + if(ticked) + frtick(f, frptofchar(f, f->p0), 1); + return; + } + + pt = frptofchar(f, 0); + pt = frdrawsel0(f, pt, 0, f->p0, f->cols[BACK], f->cols[TEXT]); + pt = frdrawsel0(f, pt, f->p0, f->p1, f->cols[HIGH], f->cols[HTEXT]); + pt = frdrawsel0(f, pt, f->p1, f->nchars, f->cols[BACK], f->cols[TEXT]); +} + +void frtick(Frame *f, Point pt, int ticked) { Rectangle r; @@ -150,7 +173,7 @@ _frdraw(Frame *f, Point pt) if(b->nrune > 0){ n = _frcanfit(f, pt, b); if(n == 0) - drawerror(f->display, "_frcanfit==0"); + break; if(n != b->nrune){ _frsplitbox(f, nb, n); b = &f->box[nb]; blob - 8ca39fcf4ac014b8b50d421c0434bc88c5e99ac5 blob + ce9bfa0a80aa5d57270b11b5a4dbe28000264cba --- src/libframe/frinsert.c +++ src/libframe/frinsert.c @@ -261,7 +261,7 @@ frinsert(Frame *f, Rune *sp, Rune *ep, ulong p0) else col = f->cols[BACK]; frselectpaint(f, ppt0, ppt1, col); - _frredraw(&frame, ppt0); + _frdrawtext(&frame, ppt0, f->cols[TEXT], col); _fraddbox(f, nn0, frame.nbox); for(n=0; nbox[nn0+n] = frame.box[n];