1 28994509 2004-04-21 devnull #include <u.h>
2 28994509 2004-04-21 devnull #include <libc.h>
3 28994509 2004-04-21 devnull #include <draw.h>
4 28994509 2004-04-21 devnull #include <memdraw.h>
5 28994509 2004-04-21 devnull #include <ctype.h>
6 28994509 2004-04-21 devnull #include <bio.h>
7 28994509 2004-04-21 devnull #include "imagefile.h"
10 28994509 2004-04-21 devnull usage(void)
12 28994509 2004-04-21 devnull fprint(2, "usage: togif [-l loopcount] [-c 'comment'] [-d Δt (ms)] [-t transparency-index] [file ... [-d Δt] file ...]\n");
13 28994509 2004-04-21 devnull exits("usage");
16 28994509 2004-04-21 devnull #define UNSET (-12345678)
19 28994509 2004-04-21 devnull main(int argc, char *argv[])
21 28994509 2004-04-21 devnull Biobuf bout;
22 28994509 2004-04-21 devnull Memimage *i, *ni;
23 28994509 2004-04-21 devnull int fd, j, dt, trans, loop;
24 28994509 2004-04-21 devnull char buf[256];
25 28994509 2004-04-21 devnull char *err, *comment, *s;
27 28994509 2004-04-21 devnull comment = nil;
29 28994509 2004-04-21 devnull trans = -1;
30 28994509 2004-04-21 devnull loop = UNSET;
31 28994509 2004-04-21 devnull ARGBEGIN{
32 28994509 2004-04-21 devnull case 'l':
33 28994509 2004-04-21 devnull s = ARGF();
34 604ad4d8 2005-11-01 devnull if(s==nil || (!isdigit((uchar)s[0]) && s[0]!='-'))
36 28994509 2004-04-21 devnull loop = atoi(s);
38 28994509 2004-04-21 devnull case 'c':
39 28994509 2004-04-21 devnull comment = ARGF();
40 28994509 2004-04-21 devnull if(comment == nil)
43 28994509 2004-04-21 devnull case 'd':
44 28994509 2004-04-21 devnull s = ARGF();
45 604ad4d8 2005-11-01 devnull if(s==nil || !isdigit((uchar)s[0]))
47 28994509 2004-04-21 devnull dt = atoi(s);
49 28994509 2004-04-21 devnull case 't':
50 28994509 2004-04-21 devnull s = ARGF();
51 604ad4d8 2005-11-01 devnull if(s==nil || !isdigit((uchar)s[0]))
53 28994509 2004-04-21 devnull trans = atoi(s);
54 28994509 2004-04-21 devnull if(trans > 255)
61 28994509 2004-04-21 devnull if(Binit(&bout, 1, OWRITE) < 0)
62 28994509 2004-04-21 devnull sysfatal("Binit failed: %r");
64 28994509 2004-04-21 devnull memimageinit();
66 28994509 2004-04-21 devnull err = nil;
68 28994509 2004-04-21 devnull if(argc == 0){
69 28994509 2004-04-21 devnull i = readmemimage(0);
70 28994509 2004-04-21 devnull if(i == nil)
71 28994509 2004-04-21 devnull sysfatal("reading input: %r");
72 28994509 2004-04-21 devnull ni = memonechan(i);
73 28994509 2004-04-21 devnull if(ni == nil)
74 28994509 2004-04-21 devnull sysfatal("converting image to RGBV: %r");
75 28994509 2004-04-21 devnull if(i != ni){
76 28994509 2004-04-21 devnull freememimage(i);
79 28994509 2004-04-21 devnull err = memstartgif(&bout, i, -1);
80 28994509 2004-04-21 devnull if(err == nil){
81 28994509 2004-04-21 devnull if(comment)
82 28994509 2004-04-21 devnull err = memwritegif(&bout, i, comment, dt, trans);
84 28994509 2004-04-21 devnull snprint(buf, sizeof buf, "Converted by Plan 9 from <stdin>");
85 28994509 2004-04-21 devnull err = memwritegif(&bout, i, buf, dt, trans);
89 28994509 2004-04-21 devnull if(loop == UNSET){
90 28994509 2004-04-21 devnull if(argc == 1)
91 28994509 2004-04-21 devnull loop = -1; /* no loop for single image */
93 28994509 2004-04-21 devnull loop = 0; /* the default case: 0 means infinite loop */
95 28994509 2004-04-21 devnull for(j=0; j<argc; j++){
96 28994509 2004-04-21 devnull if(argv[j][0] == '-' && argv[j][1]=='d'){
97 28994509 2004-04-21 devnull /* time change */
98 28994509 2004-04-21 devnull if(argv[j][2] == '\0'){
99 28994509 2004-04-21 devnull s = argv[++j];
100 28994509 2004-04-21 devnull if(j == argc)
101 28994509 2004-04-21 devnull usage();
103 28994509 2004-04-21 devnull s = &argv[j][2];
104 604ad4d8 2005-11-01 devnull if(!isdigit((uchar)s[0]))
105 28994509 2004-04-21 devnull usage();
106 28994509 2004-04-21 devnull dt = atoi(s);
107 28994509 2004-04-21 devnull if(j == argc-1) /* last argument must be file */
108 28994509 2004-04-21 devnull usage();
109 28994509 2004-04-21 devnull continue;
111 28994509 2004-04-21 devnull fd = open(argv[j], OREAD);
112 28994509 2004-04-21 devnull if(fd < 0)
113 28994509 2004-04-21 devnull sysfatal("can't open %s: %r", argv[j]);
114 28994509 2004-04-21 devnull i = readmemimage(fd);
115 28994509 2004-04-21 devnull if(i == nil)
116 28994509 2004-04-21 devnull sysfatal("can't readimage %s: %r", argv[j]);
117 28994509 2004-04-21 devnull close(fd);
118 28994509 2004-04-21 devnull ni = memonechan(i);
119 28994509 2004-04-21 devnull if(ni == nil)
120 28994509 2004-04-21 devnull sysfatal("converting image to RGBV: %r");
121 28994509 2004-04-21 devnull if(i != ni){
122 28994509 2004-04-21 devnull freememimage(i);
125 28994509 2004-04-21 devnull if(j == 0){
126 28994509 2004-04-21 devnull err = memstartgif(&bout, i, loop);
127 28994509 2004-04-21 devnull if(err != nil)
130 28994509 2004-04-21 devnull if(comment)
131 28994509 2004-04-21 devnull err = memwritegif(&bout, i, comment, dt, trans);
133 28994509 2004-04-21 devnull snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[j]);
134 28994509 2004-04-21 devnull err = memwritegif(&bout, i, buf, dt, trans);
136 28994509 2004-04-21 devnull if(err != nil)
138 28994509 2004-04-21 devnull freememimage(i);
139 28994509 2004-04-21 devnull comment = nil;
142 28994509 2004-04-21 devnull memendgif(&bout);
144 28994509 2004-04-21 devnull if(err != nil)
145 28994509 2004-04-21 devnull fprint(2, "togif: %s\n", err);
146 28994509 2004-04-21 devnull exits(err);