From 639cec9329b36c6ecbae5f3f58dd2317fa9b3fb4 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 28 Jun 2013 18:22:24 +0200 Subject: [PATCH] paint: cleanup --- sys/src/cmd/paint.c | 58 +++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/sys/src/cmd/paint.c b/sys/src/cmd/paint.c index 31996c3f1..cfc07b158 100644 --- a/sys/src/cmd/paint.c +++ b/sys/src/cmd/paint.c @@ -15,6 +15,7 @@ Image *back; Image *pal[16]; /* palette */ Rectangle palr; /* palette rect on screen */ Rectangle penr; /* pen size rect on screen */ + enum { NBRUSH = 10+1, }; @@ -41,6 +42,29 @@ int c64[] = { /* c64 color palette */ 0x959595, }; +/* + * get bounding rectnagle for stroke from r.min to r.max with + * specified brush (size). + */ +static Rectangle +strokerect(Rectangle r, int brush) +{ + r = canonrect(r); + return Rect(r.min.x-brush, r.min.y-brush, r.max.x+brush+1, r.max.y+brush+1); +} + +/* + * draw stroke from r.min to r.max to dst with color ink and + * brush (size). + */ +static void +strokedraw(Image *dst, Rectangle r, Image *ink, int brush) +{ + if(!eqpt(r.min, r.max)) + line(dst, r.min, r.max, Enddisc, Enddisc, brush, ink, ZP); + fillellipse(dst, r.max, brush, brush, ink, ZP); +} + /* * A draw operation that touches only the area contained in bot but not in top. * mp and sp get aligned with bot.min. @@ -259,7 +283,7 @@ restore(int n) if((tmp = undo[x]) == nil) return; undo[x] = nil; - if(canvas != nil && canvas->chan != tmp->chan){ + if(canvas == nil || canvas->chan != tmp->chan){ freeimage(canvas); canvas = tmp; update(nil); @@ -456,19 +480,21 @@ drawpal(void) r = penr; draw(screen, r, back, nil, ZP); - for(i=0; i<10; i++){ + for(i=0; i= 10){ + if(brush == NBRUSH-1){ /* flood fill brush */ if(canvas == nil || !ptinrect(p, canvas->r)){ back = img; @@ -638,10 +664,10 @@ main(int argc, char *argv[]) ; break; } - r = Rect(p.x-brush, p.y-brush, p.x+brush+1, p.y+brush+1); + r = strokerect(Rpt(p, p), brush); expand(r); save(r, 1); - fillellipse(canvas, p, brush, brush, img, ZP); + strokedraw(canvas, Rpt(p, p), img, brush); update(&r); for(;;){ m = e.mouse; @@ -652,14 +678,10 @@ main(int argc, char *argv[]) d = s2c(e.mouse.xy); if(eqpt(d, p)) continue; - r = canonrect(Rpt(p, d)); - r.min.x -= brush; - r.min.y -= brush; - r.max.x += brush+1; - r.max.y += brush+1; + r = strokerect(Rpt(p, d), brush); expand(r); save(r, 0); - line(canvas, p, d, Enddisc, Enddisc, brush, img, ZP); + strokedraw(canvas, Rpt(p, d), img, brush); update(&r); p = d; } @@ -702,7 +724,7 @@ main(int argc, char *argv[]) restore(16); break; case 'f': - brush = 10; + brush = NBRUSH-1; drawpal(); break; case '0': case '1': case '2': case '3': case '4':