aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/jpg/togif.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/jpg/togif.c')
-rw-r--r--src/cmd/jpg/togif.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/cmd/jpg/togif.c b/src/cmd/jpg/togif.c
new file mode 100644
index 00000000..35336883
--- /dev/null
+++ b/src/cmd/jpg/togif.c
@@ -0,0 +1,147 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <memdraw.h>
+#include <ctype.h>
+#include <bio.h>
+#include "imagefile.h"
+
+void
+usage(void)
+{
+ fprint(2, "usage: togif [-l loopcount] [-c 'comment'] [-d Δt (ms)] [-t transparency-index] [file ... [-d Δt] file ...]\n");
+ exits("usage");
+}
+
+#define UNSET (-12345678)
+
+void
+main(int argc, char *argv[])
+{
+ Biobuf bout;
+ Memimage *i, *ni;
+ int fd, j, dt, trans, loop;
+ char buf[256];
+ char *err, *comment, *s;
+
+ comment = nil;
+ dt = -1;
+ trans = -1;
+ loop = UNSET;
+ ARGBEGIN{
+ case 'l':
+ s = ARGF();
+ if(s==nil || (!isdigit(s[0]) && s[0]!='-'))
+ usage();
+ loop = atoi(s);
+ break;
+ case 'c':
+ comment = ARGF();
+ if(comment == nil)
+ usage();
+ break;
+ case 'd':
+ s = ARGF();
+ if(s==nil || !isdigit(s[0]))
+ usage();
+ dt = atoi(s);
+ break;
+ case 't':
+ s = ARGF();
+ if(s==nil || !isdigit(s[0]))
+ usage();
+ trans = atoi(s);
+ if(trans > 255)
+ usage();
+ break;
+ default:
+ usage();
+ }ARGEND
+
+ if(Binit(&bout, 1, OWRITE) < 0)
+ sysfatal("Binit failed: %r");
+
+ memimageinit();
+
+ err = nil;
+
+ if(argc == 0){
+ i = readmemimage(0);
+ if(i == nil)
+ sysfatal("reading input: %r");
+ ni = memonechan(i);
+ if(ni == nil)
+ sysfatal("converting image to RGBV: %r");
+ if(i != ni){
+ freememimage(i);
+ i = ni;
+ }
+ err = memstartgif(&bout, i, -1);
+ if(err == nil){
+ if(comment)
+ err = memwritegif(&bout, i, comment, dt, trans);
+ else{
+ snprint(buf, sizeof buf, "Converted by Plan 9 from <stdin>");
+ err = memwritegif(&bout, i, buf, dt, trans);
+ }
+ }
+ }else{
+ if(loop == UNSET){
+ if(argc == 1)
+ loop = -1; /* no loop for single image */
+ else
+ loop = 0; /* the default case: 0 means infinite loop */
+ }
+ for(j=0; j<argc; j++){
+ if(argv[j][0] == '-' && argv[j][1]=='d'){
+ /* time change */
+ if(argv[j][2] == '\0'){
+ s = argv[++j];
+ if(j == argc)
+ usage();
+ }else
+ s = &argv[j][2];
+ if(!isdigit(s[0]))
+ usage();
+ dt = atoi(s);
+ if(j == argc-1) /* last argument must be file */
+ usage();
+ continue;
+ }
+ fd = open(argv[j], OREAD);
+ if(fd < 0)
+ sysfatal("can't open %s: %r", argv[j]);
+ i = readmemimage(fd);
+ if(i == nil)
+ sysfatal("can't readimage %s: %r", argv[j]);
+ close(fd);
+ ni = memonechan(i);
+ if(ni == nil)
+ sysfatal("converting image to RGBV: %r");
+ if(i != ni){
+ freememimage(i);
+ i = ni;
+ }
+ if(j == 0){
+ err = memstartgif(&bout, i, loop);
+ if(err != nil)
+ break;
+ }
+ if(comment)
+ err = memwritegif(&bout, i, comment, dt, trans);
+ else{
+ snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[j]);
+ err = memwritegif(&bout, i, buf, dt, trans);
+ }
+ if(err != nil)
+ break;
+ freememimage(i);
+ comment = nil;
+ }
+ }
+ memendgif(&bout);
+
+ if(err != nil)
+ fprint(2, "togif: %s\n", err);
+ exits(err);
+}