URI: 
       tlibframe: translucent font fixes from Plan 9 - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 57851b64122b4a9e6a2289b8b96a447f49f68bae
   DIR parent 41636940514d72e2a941f55f28dc07685e74b3b4
  HTML Author: Russ Cox <rsc@swtch.com>
       Date:   Fri,  7 Mar 2008 13:20:00 -0500
       
       libframe: translucent font fixes from Plan 9
       
       Diffstat:
         M include/frame.h                     |       4 ++--
         M src/libframe/frdraw.c               |      35 +++++++++++++++++++++++++------
         M src/libframe/frinsert.c             |       2 +-
       
       3 files changed, 32 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/include/frame.h b/include/frame.h
       t@@ -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);
       t@@ -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);
   DIR diff --git a/src/libframe/frdraw.c b/src/libframe/frdraw.c
       t@@ -5,16 +5,15 @@
        #include <frame.h>
        
        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; nb<f->nbox; 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;
                }
        }
       t@@ -55,7 +54,7 @@ frdrawsel(Frame *f, Point pt, ulong p0, ulong p1, int issel)
                frdrawsel0(f, pt, p0, p1, back, text);
        }
        
       -void
       +Point
        frdrawsel0(Frame *f, Point pt, ulong p0, ulong p1, Image *back, Image *text)
        {
                Frbox *b;
       t@@ -76,6 +75,7 @@ frdrawsel0(Frame *f, Point pt, ulong p0, ulong p1, Image *back, Image *text)
                        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);
                        }
       t@@ -99,7 +99,7 @@ frdrawsel0(Frame *f, Point pt, ulong p0, ulong p1, Image *back, Image *text)
                                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++;
       t@@ -112,6 +112,29 @@ frdrawsel0(Frame *f, Point pt, ulong p0, ulong p1, Image *back, Image *text)
                        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
       t@@ -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];
   DIR diff --git a/src/libframe/frinsert.c b/src/libframe/frinsert.c
       t@@ -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; n<frame.nbox; n++)
                        f->box[nn0+n] = frame.box[n];