tlibframe: auto scale tick for retina - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit cc9547960e7cf12129e84c9489eb5dcd6235144b
 (DIR) parent ffaaaf9dae8de3c58c0d13f94926ddc363fdaf97
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Sun, 25 Nov 2012 23:48:19 -0500
       
       libframe: auto scale tick for retina
       
       R=rsc
       http://codereview.appspot.com/6850102
       
       Diffstat:
         M include/frame.h                     |       4 ++--
         M src/libframe/frdraw.c               |      19 +++++++++++++++----
         M src/libframe/frinit.c               |      11 +++++++----
       
       3 files changed, 24 insertions(+), 10 deletions(-)
       ---
 (DIR) diff --git a/include/frame.h b/include/frame.h
       t@@ -1,7 +1,7 @@
        #ifndef _FRAME_H_
        #define _FRAME_H_ 1
        #if defined(__cplusplus)
       -extern "C" { 
       +extern "C" {
        #endif
        
        AUTOLIB(frame)
       t@@ -19,7 +19,6 @@ enum{
        };
        
        #define        FRTICKW        3
       -
        struct Frbox
        {
                long                wid;                /* in pixels */
       t@@ -51,6 +50,7 @@ struct Frame
                Image                *tickback;        /* saved image under tick */
                int                        ticked;        /* flag: is tick onscreen? */
                int                        noredraw;        /* don't draw on the screen */
       +        int                        tickscale;        /* tick scaling factor */
        };
        
        ulong        frcharofpt(Frame*, Point);
 (DIR) diff --git a/src/libframe/frdraw.c b/src/libframe/frdraw.c
       t@@ -137,15 +137,15 @@ frredraw(Frame *f)
                pt = frdrawsel0(f, pt, f->p1, f->nchars, f->cols[BACK], f->cols[TEXT]);
        }
        
       -void
       -frtick(Frame *f, Point pt, int ticked)
       +static void
       +_frtick(Frame *f, Point pt, int ticked)
        {
                Rectangle r;
        
                if(f->ticked==ticked || f->tick==0 || !ptinrect(pt, f->r))
                        return;
       -        pt.x--;        /* looks best just left of where requested */
       -        r = Rect(pt.x, pt.y, pt.x+FRTICKW, pt.y+f->font->height);
       +        pt.x -= f->tickscale;        /* looks best just left of where requested */
       +        r = Rect(pt.x, pt.y, pt.x+FRTICKW*f->tickscale, pt.y+f->font->height);
                /* can go into left border but not right */
                if(r.max.x > f->r.max.x)
                        r.max.x = f->r.max.x;
       t@@ -157,6 +157,17 @@ frtick(Frame *f, Point pt, int ticked)
                f->ticked = ticked;
        }
        
       +void
       +frtick(Frame *f, Point pt, int ticked)
       +{
       +        if(f->tickscale != scalesize(f->display, 1)) {
       +                if(f->ticked)
       +                        _frtick(f, pt, 0);
       +                frinittick(f);
       +        }
       +        _frtick(f, pt, ticked);
       +}
       +
        Point
        _frdraw(Frame *f, Point pt)
        {
 (DIR) diff --git a/src/libframe/frinit.c b/src/libframe/frinit.c
       t@@ -31,11 +31,14 @@ frinittick(Frame *f)
                Image *b;
                Font *ft;
        
       +        if(f->cols[BACK] == nil || f->display == nil)
       +                return;
       +        f->tickscale = scalesize(f->display, 1);
                b = f->display->screenimage;
                ft = f->font;
                if(f->tick)
                        freeimage(f->tick);
       -        f->tick = allocimage(f->display, Rect(0, 0, FRTICKW, ft->height), b->chan, 0, DWhite);
       +        f->tick = allocimage(f->display, Rect(0, 0, f->tickscale*FRTICKW, ft->height), b->chan, 0, DWhite);
                if(f->tick == nil)
                        return;
                if(f->tickback)
       t@@ -49,10 +52,10 @@ frinittick(Frame *f)
                /* background color */
                draw(f->tick, f->tick->r, f->cols[BACK], nil, ZP);
                /* vertical line */
       -        draw(f->tick, Rect(FRTICKW/2, 0, FRTICKW/2+1, ft->height), f->display->black, nil, ZP);
       +        draw(f->tick, Rect(f->tickscale*(FRTICKW/2), 0, f->tickscale*(FRTICKW/2+1), ft->height), f->display->black, nil, ZP);
                /* box on each end */
       -        draw(f->tick, Rect(0, 0, FRTICKW, FRTICKW), f->cols[TEXT], nil, ZP);
       -        draw(f->tick, Rect(0, ft->height-FRTICKW, FRTICKW, ft->height), f->cols[TEXT], nil, ZP);
       +        draw(f->tick, Rect(0, 0, f->tickscale*FRTICKW, f->tickscale*FRTICKW), f->cols[TEXT], nil, ZP);
       +        draw(f->tick, Rect(0, ft->height-f->tickscale*FRTICKW, f->tickscale*FRTICKW, ft->height), f->cols[TEXT], nil, ZP);
        }
        
        void