summaryrefslogtreecommitdiff
path: root/sys/src/cmd/spred/cmd.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2014-07-30 15:57:14 +0200
committeraiju <devnull@localhost>2014-07-30 15:57:14 +0200
commit712fd30652d29dc9e936f11d7837d1cb079575fc (patch)
tree2915c820a5c05761f1d2ac4d525067f701aa474b /sys/src/cmd/spred/cmd.c
parent555a05018b60b28bdfd6ada0310848c68fe20e48 (diff)
added sprite editor spred
Diffstat (limited to 'sys/src/cmd/spred/cmd.c')
-rw-r--r--sys/src/cmd/spred/cmd.c188
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");
+}