ref: dfb4b522830edab8f3856289d326d6cf5e930644
dir: /sys/src/cmd/jpg/togif.c/
#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 ... | -E]\n"); exits("usage"); } #define UNSET (-12345678) void main(int argc, char *argv[]) { Biobuf bout; Memimage *i, *ni; int fd, j, dt, trans, loop, eof; char buf[256]; char *err, *comment, *s; comment = nil; dt = -1; trans = -1; loop = UNSET; eof = 0; 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; case 'E': eof++; break; default: usage(); }ARGEND if(Binit(&bout, 1, OWRITE) < 0) sysfatal("Binit failed: %r"); memimageinit(); err = nil; if(eof){ if(argc != 0) usage(); for(j = 0;;j++){ i = readmemimage(0); if(i == nil) break; 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 <stdin>"); err = memwritegif(&bout, i, buf, dt, trans); } if(err != nil) break; freememimage(i); comment = nil; } }else 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); }