|  | #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((uchar)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((uchar)s[0])) | 
|  | usage(); | 
|  | dt = atoi(s); | 
|  | break; | 
|  | case 't': | 
|  | s = ARGF(); | 
|  | if(s==nil || !isdigit((uchar)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((uchar)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); | 
|  | } |