diff options
author | rodri <rgl@antares-labs.eu> | 2020-02-22 09:56:09 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2020-02-22 09:56:09 +0000 |
commit | a39951d8f69209cfea2b7051832b851914e662ef (patch) | |
tree | e4cd1c32e5d6f531b523f6fda558cc3a5f603547 /spranimate.c | |
download | brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.tar.gz brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.tar.bz2 brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.zip |
now version controlled.
Diffstat (limited to 'spranimate.c')
-rw-r--r-- | spranimate.c | 98 |
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); + } +} |