diff options
author | aiju <devnull@localhost> | 2014-07-30 15:57:14 +0200 |
---|---|---|
committer | aiju <devnull@localhost> | 2014-07-30 15:57:14 +0200 |
commit | 712fd30652d29dc9e936f11d7837d1cb079575fc (patch) | |
tree | 2915c820a5c05761f1d2ac4d525067f701aa474b /sys/src/cmd/spred/cmd.c | |
parent | 555a05018b60b28bdfd6ada0310848c68fe20e48 (diff) |
added sprite editor spred
Diffstat (limited to 'sys/src/cmd/spred/cmd.c')
-rw-r--r-- | sys/src/cmd/spred/cmd.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/sys/src/cmd/spred/cmd.c b/sys/src/cmd/spred/cmd.c new file mode 100644 index 000000000..8509a6394 --- /dev/null +++ b/sys/src/cmd/spred/cmd.c @@ -0,0 +1,188 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include <thread.h> +#include <draw.h> +#include <mouse.h> +#include <frame.h> +#include "dat.h" +#include "fns.h" + +extern Mousectl *mc; + +static void +dopal(int, char **argv) +{ + Pal *p; + + p = findpal("", argv[1], 2); + if(p == nil){ + cmdprint("?%r\n"); + p = newpal(argv[1]); + } + if(newwinsel(PAL, mc, p) == nil){ + if(p->ref == 0) + putfil(p); + return; + } +} + +static void +dosize(int, char **argv) +{ + char *p; + int n, m; + + if(actf == nil) + goto err; + switch(actf->type){ + case PAL: + n = strtol(argv[1], &p, 0); + if(*p != 0 || n < 0) + goto err; + palsize((Pal *) actf->f, n); + return; + case SPR: + n = strtol(argv[1], &p, 0); + if(*p != '*' || n < 0) + goto err; + m = strtol(++p, &p, 0); + if(*p != 0 || m < 0) + goto err; + sprsize((Spr *) actf->f, n, m); + return; + } +err: + cmdprint("?\n"); +} + +static void +doset(int, char **argv) +{ + int n; + char *p; + Pal *q; + + if(actf == nil) + goto err; + switch(actf->type){ + case PAL: + n = strtol(argv[1], &p, 0); + if(*p != 0 || n < 0 || n > 0xffffff) + goto err; + q = (Pal *) actf->f; + palset(q, q->sel, n); + return; + } +err: + cmdprint("?\n"); +} + +static void +dozoom(int, char **argv) +{ + int n; + char *p; + + if(actf == nil) + goto err; + n = strtol(argv[1], &p, 0); + if(*p != 0 || n <= 0) + goto err; + actf->zoom = n; + actf->tab->draw(actf); + return; +err: + cmdprint("?\n"); +} + +static void +dospr(int, char **argv) +{ + Win *w; + Spr *s; + Biobuf *bp; + + s = newspr(argv[1]); + bp = Bopen(argv[1], OREAD); + if(bp == nil) + cmdprint("?%r\n"); + else{ + if(readspr(s, bp) < 0) + cmdprint("?%r\n"); + Bterm(bp); + } + w = newwinsel(SPR, mc, s); + if(w == nil){ + putfil(s); + return; + } + if(s->palfile != nil){ + s->pal = findpal(argv[1], s->palfile, 1); + if(s->pal == nil) + cmdprint("?palette: %r\n"); + else{ + incref(s->pal); + w->tab->draw(w); + } + } +} + +static void +dowrite(int argc, char **argv) +{ + char *f; + + if(argc > 2) + cmdprint("?\n"); + if(argc == 2) + f = argv[1]; + else + f = nil; + if(actf == nil) + cmdprint("?\n"); + winwrite(actf, f); +} + +static void +doquit(int, char **) +{ + if(quit() < 0) + threadexitsall(nil); +} + +static struct cmd { + char *name; + int argc; + void (*f)(int, char **); +} cmds[] = { + {"pal", 2, dopal}, + {"size", 2, dosize}, + {"set", 2, doset}, + {"spr", 2, dospr}, + {"w", 0, dowrite}, + {"q", 1, doquit}, + {"zoom", 2, dozoom}, + {nil, nil} +}; + +void +docmd(char *s) +{ + char *t[32]; + int nt; + struct cmd *c; + + nt = tokenize(s, t, nelem(t)); + if(nt == 0) + return; + for(c = cmds; c->name != 0; c++) + if(strcmp(t[0], c->name) == 0){ + if(c->argc != 0 && c->argc != nt) + cmdprint("?\n"); + else + c->f(nt, t); + return; + } + cmdprint("?\n"); +} |