Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
6 void
7 usage(void)
8 {
9 fprint(2, "usage: iconv [-u] [-c chanstr] [file]\n");
10 exits("usage");
11 }
13 void
14 writeuncompressed(int fd, Memimage *m)
15 {
16 char chanstr[32];
17 int bpl, y, j;
18 uchar *buf;
20 if(chantostr(chanstr, m->chan) == nil)
21 sysfatal("can't convert channel descriptor: %r");
22 fprint(fd, "%11s %11d %11d %11d %11d ",
23 chanstr, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y);
25 bpl = bytesperline(m->r, m->depth);
26 buf = malloc(bpl);
27 if(buf == nil)
28 sysfatal("malloc failed: %r");
29 for(y=m->r.min.y; y<m->r.max.y; y++){
30 j = unloadmemimage(m, Rect(m->r.min.x, y, m->r.max.x, y+1), buf, bpl);
31 if(j != bpl)
32 sysfatal("image unload failed: %r");
33 if(write(fd, buf, bpl) != bpl)
34 sysfatal("write failed: %r");
35 }
36 free(buf);
37 }
39 void
40 main(int argc, char *argv[])
41 {
42 char *tostr, *file;
43 int fd, uncompressed;
44 ulong tochan;
45 Memimage *m, *n;
47 tostr = nil;
48 uncompressed = 0;
49 ARGBEGIN{
50 case 'c':
51 tostr = EARGF(usage());
52 break;
53 case 'u':
54 uncompressed = 1;
55 break;
56 default:
57 usage();
58 }ARGEND
60 memimageinit();
62 file = "<stdin>";
63 m = nil;
65 switch(argc){
66 case 0:
67 m = readmemimage(0);
68 break;
69 case 1:
70 file = argv[0];
71 fd = open(file, OREAD);
72 if(fd < 0)
73 sysfatal("can't open %s: %r", file);
74 m = readmemimage(fd);
75 close(fd);
76 break;
77 default:
78 usage();
79 }
81 if(m == nil)
82 sysfatal("can't read %s: %r", file);
84 if(tostr == nil)
85 tochan = m->chan;
86 else{
87 tochan = strtochan(tostr);
88 if(tochan == 0)
89 sysfatal("bad channel descriptor '%s'", tostr);
90 }
92 n = allocmemimage(m->r, tochan);
93 if(n == nil)
94 sysfatal("can't allocate new image: %r");
96 memimagedraw(n, n->r, m, m->r.min, nil, ZP, S);
97 if(uncompressed)
98 writeuncompressed(1, n);
99 else
100 writememimage(1, n);
101 exits(nil);