summaryrefslogtreecommitdiff
path: root/spranimate.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2020-02-22 09:56:09 +0000
committerrodri <rgl@antares-labs.eu>2020-02-22 09:56:09 +0000
commita39951d8f69209cfea2b7051832b851914e662ef (patch)
treee4cd1c32e5d6f531b523f6fda558cc3a5f603547 /spranimate.c
downloadbrokentoys-a39951d8f69209cfea2b7051832b851914e662ef.tar.gz
brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.tar.bz2
brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.zip
now version controlled.
Diffstat (limited to 'spranimate.c')
-rw-r--r--spranimate.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/spranimate.c b/spranimate.c
new file mode 100644
index 0000000..347be3c
--- /dev/null
+++ b/spranimate.c
@@ -0,0 +1,98 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+
+enum { SEC = 1000 };
+
+enum {
+ Cred,
+ Cgrn,
+
+ Cbg,
+
+ Cgx,
+ Cend
+};
+Image *col[Cend];
+
+int dx, dy;
+
+void *
+emalloc(ulong n)
+{
+ void *p;
+
+ p = malloc(n);
+ if(p == nil)
+ sysfatal("malloc: %r");
+ memset(p, 0, n);
+ setmalloctag(p, getcallerpc(&n));
+ return p;
+}
+
+Image *
+eallocimage(Display *d, Rectangle r, ulong chan, int repl, ulong col)
+{
+ Image *i;
+
+ i = allocimage(d, r, chan, repl, col);
+ if(i == nil)
+ sysfatal("allocimage: %r");
+ return i;
+}
+
+void
+usage(void)
+{
+ fprint(2, "usage: spranimate\n");
+ exits("usage");
+}
+
+void
+main(int argc, char *argv[])
+{
+ Image *spnr, *spnmsk;
+ double θ;
+ uchar *gx;
+ int ds, i, x, y, inc, frame;
+
+ ARGBEGIN{
+ default: usage();
+ }ARGEND;
+
+ if(initdraw(nil, nil, "spranimate") < 0)
+ sysfatal("initdraw: %r");
+ dx = Dx(screen->r), dy = Dy(screen->r);
+ col[Cred] = eallocimage(display, Rect(0, 0, 1, 1), RGB24, 1, DRed);
+ col[Cgrn] = eallocimage(display, Rect(0, 0, 1, 1), RGB24, 1, DGreen);
+ col[Cbg] = eallocimage(display, Rect(0, 0, 1, 1), RGB24, 1, DNofill);
+ ds = dx > dy ? dy : dx;
+ spnr = eallocimage(display, Rect(0, 0, ds*60, ds), RGBA32, 0, DTransparent);
+ spnmsk = eallocimage(display, Rect(0, 0, ds, ds), GREY1, 0, DWhite);
+ col[Cgx] = eallocimage(display, Rect(0, 0, 60, 1), GREY8, 1, DNofill);
+ gx = emalloc(60);
+ for(i = 0; i < 60; i++)
+ gx[i] = 255.0 * i/(60-1);
+ for(i = 0; i < 60; i++){
+ θ = 2*PI * i/60;
+ x = (ds/2 - 5) * cos(θ);
+ y = (ds/2 - 5) * sin(θ);
+ line(spnr, Pt(x + ds/2 + ds*i, y + ds/2), Pt(-x + ds/2 + ds*i, -y + ds/2), Endarrow, Endsquare, 1, display->black, ZP);
+ }
+ loadimage(col[Cgx], col[Cgx]->r, gx, dx);
+ x = inc = frame = 0;
+ for(;;){
+ draw(col[Cbg], col[Cbg]->r, col[Cred], nil, ZP);
+ if(x == 0)
+ inc = 1;
+ else if(x == 60-1)
+ inc = -1;
+ x += inc;
+ gendraw(col[Cbg], col[Cbg]->r, col[Cgrn], ZP, col[Cgx], Pt(x, 0));
+ draw(screen, screen->r, col[Cbg], nil, ZP);
+ frame = (frame+1) % 60;
+ gendraw(screen, screen->r, spnr, Pt(frame*ds, 0), spnmsk, ZP);
+ flushimage(display, 1);
+ sleep(SEC/60);
+ }
+}