ref: 919472023aab7d2181a1e39d15af5e4457dde42f
parent: c8f028cd961e69e9af52b66175897ca5f26e3839
author: qwx <qwx@sciops.net>
date: Sat Apr 12 08:01:17 EDT 2025
draw: fix not redrawing samples when an rproc returns refactor to ensure only one proc messes with the drawing
--- a/cmd.c
+++ b/cmd.c
@@ -157,7 +157,7 @@
dot.to = dot.from + cd.totalsz;
qunlock(&lsync);
reader = -1;
- refresh(Drawall);
+ refresh(Rall);
threadexits(nil);
}
--- a/dat.h
+++ b/dat.h
@@ -38,9 +38,13 @@
extern QLock lsync;
enum{
- Drawcur = 1<<0,
- Drawrender = 1<<1,
- Drawall = (1<<2) - 1,
+ Rcur = 1<<0,
+ Rrender = 1<<1,
+ Rsamp = 1<<2,
+ Rview = 1<<3,
+ Rreset = 1<<4,
+ Rredraw = Rrender | Rsamp | Rreset,
+ Rall = 0x7fffffff,
};
extern int stereo, chan;
--- a/draw.c
+++ b/draw.c
@@ -213,12 +213,62 @@
statr.max.x = p.x;
}
+static void
+resetdraw(void)
+{
+ Rectangle viewr;
+
+ viewr = rectsubpt(screen->r, screen->r.min);
+ statr = screen->r;
+ if(stereo){
+ statr.min.y += (Dy(screen->r) - font->height) / 2 + 1;
+ statr.max.y = statr.min.y + font->height;
+ }else
+ statr.min.y = screen->r.max.y - font->height;
+ freeimage(view);
+ view = eallocimage(viewr, 0, DNofill);
+ bgscalyl = (viewr.max.y - font->height) / (1 * (stereo ? 4 : 2));
+ bgscalyr = viewr.max.y - bgscalyl;
+ bgscalf = 32767. / bgscalyl;
+}
+
+static void
+resetview(int all)
+{
+ usize span;
+
+ lockdisplay(display);
+ T = (vlong)(ddot.totalsz / zoom / Dx(screen->r)) & ~3;
+ if(T < Sampsz)
+ T = Sampsz;
+ span = Dx(screen->r) * T;
+ viewmax = ddot.totalsz - span;
+ if(views > viewmax)
+ views = viewmax;
+ viewe = views + span;
+ if(all)
+ resetdraw();
+ unlockdisplay(display);
+}
+
void
paint(int what)
{
+ Dot d;
+
ddot = dot;
+ if(what & Rreset)
+ resetview(1);
+ else if(what & Rview)
+ resetview(0);
lockdisplay(display);
- if((what & Drawrender) != 0 || stalerender || working){
+ if(what & Rsamp){
+ d = ddot;
+ d.from = d.cur = views;
+ d.to = viewe;
+ nbsend(sampc, &d);
+ }
+ if(what & Rrender || stalerender || working){
if(!working)
stalerender = 0;
render();
@@ -304,65 +354,11 @@
*r++ = rmax;
}
working--;
- refresh(Drawrender);
+ refresh(Rrender);
goto again;
}
-static void
-resetdraw(void)
-{
- Rectangle viewr;
-
- viewr = rectsubpt(screen->r, screen->r.min);
- statr = screen->r;
- if(stereo){
- statr.min.y += (Dy(screen->r) - font->height) / 2 + 1;
- statr.max.y = statr.min.y + font->height;
- }else
- statr.min.y = screen->r.max.y - font->height;
- freeimage(view);
- view = eallocimage(viewr, 0, DNofill);
- bgscalyl = (viewr.max.y - font->height) / (1 * (stereo ? 4 : 2));
- bgscalyr = viewr.max.y - bgscalyl;
- bgscalf = 32767. / bgscalyl;
-}
-
-static void
-resetview(int all)
-{
- usize span;
-
- lockdisplay(display);
- T = (vlong)(ddot.totalsz / zoom / Dx(screen->r)) & ~3;
- if(T < Sampsz)
- T = Sampsz;
- span = Dx(screen->r) * T;
- viewmax = ddot.totalsz - span;
- if(views > viewmax)
- views = viewmax;
- viewe = views + span;
- if(all)
- resetdraw();
- unlockdisplay(display);
-}
-
void
-redraw(int all)
-{
- Dot d;
-
- ddot = dot;
- resetview(all);
- if(paused)
- refresh(Drawall);
-
- d = ddot;
- d.from = d.cur = views;
- d.to = viewe;
- nbsend(sampc, &d);
-}
-
-void
setzoom(int Δz, int x)
{
double z, span, Δx;
@@ -384,7 +380,7 @@
span *= Dx(screen->r);
Δx = ((double)x / Dx(screen->r)) * span / T;
if(!setpan(Δx))
- redraw(0);
+ refresh(Rview);
}
int
@@ -403,7 +399,7 @@
views = from;
viewe = to;
zoom = (double)ddot.totalsz / (to - from);
- redraw(0);
+ refresh(Rview);
return 0;
}
@@ -424,7 +420,7 @@
if(new == views)
return 0;
views = new;
- redraw(0);
+ refresh(Rview);
return 1;
}
@@ -449,7 +445,7 @@
ddot.off = -1;
dot = ddot;
stalerender = 1;
- refresh(Drawrender);
+ refresh(Rrender);
}
int
@@ -463,7 +459,7 @@
ddot.off = ddot.cur = off;
dot = ddot;
stalerender = 1;
- refresh(Drawrender);
+ refresh(Rrender);
return 0;
}
@@ -509,7 +505,7 @@
if((drawc = chancreate(sizeof(int), 8)) == nil
|| (sampc = chancreate(sizeof(Dot), 2)) == nil)
sysfatal("chancreate: %r");
- redraw(1);
if(proccreate(sampler, nil, mainstacksize) < 0)
sysfatal("proccreate: %r");
+ refresh(Rall);
}
--- a/fns.h
+++ b/fns.h
@@ -24,7 +24,6 @@
vlong ss2view(int);
vlong view2ss(int);
void reset(int);
-void redraw(int);
void paint(int);
void initdrw(int);
void advance(usize);
--- a/pplay.c
+++ b/pplay.c
@@ -86,7 +86,7 @@
}
memcpy(bp, b, n);
advance(n);
- refresh(Drawcur);
+ refresh(Rcur);
}
if(write(afd, buf, sizeof buf) != sizeof buf){
fprint(2, "aproc write: %r\n");
@@ -194,7 +194,7 @@
if(getwindow(display, Refnone) < 0)
sysfatal("resize failed: %r");
unlockdisplay(display);
- redraw(1);
+ refresh(Rreset);
break;
case Amouse:
m = mc->Mouse;
@@ -222,7 +222,7 @@
case '+': setzoom(1.0, mo.xy.x - screen->r.min.x); m.xy.x = mo.xy.x; break;
case '1': bound = Bstart; break;
case '2': bound = Bend; break;
- case 'S': stereo ^= 1; redraw(1); break;
+ case 'S': stereo ^= 1; refresh(Rall); break;
case 'b': setjump(dot.from); break;
case 't': samptime ^= 1; break;
case 'z': zoominto(0, dot.totalsz); break;
@@ -233,14 +233,14 @@
case 'q': threadexitsall(nil);
default:
if((p = prompt(r)) == nil || strlen(p) == 0){
- refresh(Drawrender);
+ refresh(Rrender);
break;
}
switch(cmd(p)){
case -1: fprint(2, "cmd \"%s\" failed: %r\n", p); break;
- case 0: refresh(Drawall); break;
- case 1: redraw(0); break;
- case 2: redraw(1); break;
+ case 0: refresh(Rrender); break;
+ case 1: refresh(Rredraw); break;
+ case 2: refresh(Rall); break;
default: break;
}
}
--
⑨