]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/jpg/togif.c
cwfs: back to previous version
[plan9front.git] / sys / src / cmd / jpg / togif.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <ctype.h>
6 #include <bio.h>
7 #include "imagefile.h"
8
9 void
10 usage(void)
11 {
12         fprint(2, "usage: togif [-l loopcount] [-c 'comment'] [-d Δt (ms)] [-t transparency-index] [file ... [-d Δt] file ...]\n");
13         exits("usage");
14 }
15
16 #define UNSET (-12345678)
17
18 void
19 main(int argc, char *argv[])
20 {
21         Biobuf bout;
22         Memimage *i, *ni;
23         int fd, j, dt, trans, loop;
24         char buf[256];
25         char *err, *comment, *s;
26
27         comment = nil;
28         dt = -1;
29         trans = -1;
30         loop = UNSET;
31         ARGBEGIN{
32         case 'l':
33                 s = ARGF();
34                 if(s==nil || (!isdigit(s[0]) && s[0]!='-'))
35                         usage();
36                 loop = atoi(s);
37                 break;
38         case 'c':
39                 comment = ARGF();
40                 if(comment == nil)
41                         usage();
42                 break;
43         case 'd':
44                 s = ARGF();
45                 if(s==nil || !isdigit(s[0]))
46                         usage();
47                 dt = atoi(s);
48                 break;
49         case 't':
50                 s = ARGF();
51                 if(s==nil || !isdigit(s[0]))
52                         usage();
53                 trans = atoi(s);
54                 if(trans > 255)
55                         usage();
56                 break;
57         default:
58                 usage();
59         }ARGEND
60
61         if(Binit(&bout, 1, OWRITE) < 0)
62                 sysfatal("Binit failed: %r");
63
64         memimageinit();
65
66         err = nil;
67
68         if(argc == 0){
69                 i = readmemimage(0);
70                 if(i == nil)
71                         sysfatal("reading input: %r");
72                 ni = memonechan(i);
73                 if(ni == nil)
74                         sysfatal("converting image to RGBV: %r");
75                 if(i != ni){
76                         freememimage(i);
77                         i = ni;
78                 }
79                 err = memstartgif(&bout, i, -1);
80                 if(err == nil){
81                         if(comment)
82                                 err = memwritegif(&bout, i, comment, dt, trans);
83                         else{
84                                 snprint(buf, sizeof buf, "Converted by Plan 9 from <stdin>");
85                                 err = memwritegif(&bout, i, buf, dt, trans);
86                         }
87                 }
88         }else{
89                 if(loop == UNSET){
90                         if(argc == 1)
91                                 loop = -1;      /* no loop for single image */
92                         else
93                                 loop = 0;       /* the default case: 0 means infinite loop */
94                 }
95                 for(j=0; j<argc; j++){
96                         if(argv[j][0] == '-' && argv[j][1]=='d'){
97                                 /* time change */
98                                 if(argv[j][2] == '\0'){
99                                         s = argv[++j];
100                                         if(j == argc)
101                                                 usage();
102                                 }else
103                                         s = &argv[j][2];
104                                 if(!isdigit(s[0]))
105                                         usage();
106                                 dt = atoi(s);
107                                 if(j == argc-1) /* last argument must be file */
108                                         usage();
109                                 continue;
110                         }
111                         fd = open(argv[j], OREAD);
112                         if(fd < 0)
113                                 sysfatal("can't open %s: %r", argv[j]);
114                         i = readmemimage(fd);
115                         if(i == nil)
116                                 sysfatal("can't readimage %s: %r", argv[j]);
117                         close(fd);
118                         ni = memonechan(i);
119                         if(ni == nil)
120                                 sysfatal("converting image to RGBV: %r");
121                         if(i != ni){
122                                 freememimage(i);
123                                 i = ni;
124                         }
125                         if(j == 0){
126                                 err = memstartgif(&bout, i, loop);
127                                 if(err != nil)
128                                         break;
129                         }
130                         if(comment)
131                                 err = memwritegif(&bout, i, comment, dt, trans);
132                         else{
133                                 snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[j]);
134                                 err = memwritegif(&bout, i, buf, dt, trans);
135                         }
136                         if(err != nil)
137                                 break;
138                         freememimage(i);
139                         comment = nil;
140                 }
141         }
142         memendgif(&bout);
143
144         if(err != nil)
145                 fprint(2, "togif: %s\n", err);
146         exits(err);
147 }