Blame


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"
8 28994509 2004-04-21 devnull
9 28994509 2004-04-21 devnull void
10 28994509 2004-04-21 devnull usage(void)
11 28994509 2004-04-21 devnull {
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");
14 28994509 2004-04-21 devnull }
15 28994509 2004-04-21 devnull
16 28994509 2004-04-21 devnull #define UNSET (-12345678)
17 28994509 2004-04-21 devnull
18 28994509 2004-04-21 devnull void
19 28994509 2004-04-21 devnull main(int argc, char *argv[])
20 28994509 2004-04-21 devnull {
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;
26 28994509 2004-04-21 devnull
27 28994509 2004-04-21 devnull comment = nil;
28 28994509 2004-04-21 devnull dt = -1;
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]!='-'))
35 28994509 2004-04-21 devnull usage();
36 28994509 2004-04-21 devnull loop = atoi(s);
37 28994509 2004-04-21 devnull break;
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)
41 28994509 2004-04-21 devnull usage();
42 28994509 2004-04-21 devnull break;
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]))
46 28994509 2004-04-21 devnull usage();
47 28994509 2004-04-21 devnull dt = atoi(s);
48 28994509 2004-04-21 devnull break;
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]))
52 28994509 2004-04-21 devnull usage();
53 28994509 2004-04-21 devnull trans = atoi(s);
54 28994509 2004-04-21 devnull if(trans > 255)
55 28994509 2004-04-21 devnull usage();
56 28994509 2004-04-21 devnull break;
57 28994509 2004-04-21 devnull default:
58 28994509 2004-04-21 devnull usage();
59 28994509 2004-04-21 devnull }ARGEND
60 28994509 2004-04-21 devnull
61 28994509 2004-04-21 devnull if(Binit(&bout, 1, OWRITE) < 0)
62 28994509 2004-04-21 devnull sysfatal("Binit failed: %r");
63 28994509 2004-04-21 devnull
64 28994509 2004-04-21 devnull memimageinit();
65 28994509 2004-04-21 devnull
66 28994509 2004-04-21 devnull err = nil;
67 28994509 2004-04-21 devnull
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);
77 28994509 2004-04-21 devnull i = ni;
78 28994509 2004-04-21 devnull }
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);
83 28994509 2004-04-21 devnull else{
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);
86 28994509 2004-04-21 devnull }
87 28994509 2004-04-21 devnull }
88 28994509 2004-04-21 devnull }else{
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 */
92 28994509 2004-04-21 devnull else
93 28994509 2004-04-21 devnull loop = 0; /* the default case: 0 means infinite loop */
94 28994509 2004-04-21 devnull }
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();
102 28994509 2004-04-21 devnull }else
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;
110 28994509 2004-04-21 devnull }
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);
123 28994509 2004-04-21 devnull i = ni;
124 28994509 2004-04-21 devnull }
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)
128 28994509 2004-04-21 devnull break;
129 28994509 2004-04-21 devnull }
130 28994509 2004-04-21 devnull if(comment)
131 28994509 2004-04-21 devnull err = memwritegif(&bout, i, comment, dt, trans);
132 28994509 2004-04-21 devnull else{
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);
135 28994509 2004-04-21 devnull }
136 28994509 2004-04-21 devnull if(err != nil)
137 28994509 2004-04-21 devnull break;
138 28994509 2004-04-21 devnull freememimage(i);
139 28994509 2004-04-21 devnull comment = nil;
140 28994509 2004-04-21 devnull }
141 28994509 2004-04-21 devnull }
142 28994509 2004-04-21 devnull memendgif(&bout);
143 28994509 2004-04-21 devnull
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);
147 28994509 2004-04-21 devnull }