diff options
Diffstat (limited to 'src/cmd/jpg/togif.c')
-rw-r--r-- | src/cmd/jpg/togif.c | 147 |
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); +} |