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