17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <memdraw.h>
57dd7cddfSDavid du Colombier
67dd7cddfSDavid du Colombier void
usage(void)77dd7cddfSDavid du Colombier usage(void)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier fprint(2, "usage: iconv [-u] [-c chanstr] [file]\n");
107dd7cddfSDavid du Colombier exits("usage");
117dd7cddfSDavid du Colombier }
127dd7cddfSDavid du Colombier
137dd7cddfSDavid du Colombier void
writeuncompressed(int fd,Memimage * m)147dd7cddfSDavid du Colombier writeuncompressed(int fd, Memimage *m)
157dd7cddfSDavid du Colombier {
167dd7cddfSDavid du Colombier char chanstr[32];
177dd7cddfSDavid du Colombier int bpl, y, j;
187dd7cddfSDavid du Colombier uchar *buf;
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier if(chantostr(chanstr, m->chan) == nil)
217dd7cddfSDavid du Colombier sysfatal("can't convert channel descriptor: %r");
227dd7cddfSDavid du Colombier fprint(fd, "%11s %11d %11d %11d %11d ",
237dd7cddfSDavid du Colombier chanstr, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y);
247dd7cddfSDavid du Colombier
257dd7cddfSDavid du Colombier bpl = bytesperline(m->r, m->depth);
267dd7cddfSDavid du Colombier buf = malloc(bpl);
277dd7cddfSDavid du Colombier if(buf == nil)
287dd7cddfSDavid du Colombier sysfatal("malloc failed: %r");
297dd7cddfSDavid du Colombier for(y=m->r.min.y; y<m->r.max.y; y++){
307dd7cddfSDavid du Colombier j = unloadmemimage(m, Rect(m->r.min.x, y, m->r.max.x, y+1), buf, bpl);
317dd7cddfSDavid du Colombier if(j != bpl)
327dd7cddfSDavid du Colombier sysfatal("image unload failed: %r");
337dd7cddfSDavid du Colombier if(write(fd, buf, bpl) != bpl)
347dd7cddfSDavid du Colombier sysfatal("write failed: %r");
357dd7cddfSDavid du Colombier }
367dd7cddfSDavid du Colombier free(buf);
377dd7cddfSDavid du Colombier }
387dd7cddfSDavid du Colombier
397dd7cddfSDavid du Colombier void
main(int argc,char * argv[])407dd7cddfSDavid du Colombier main(int argc, char *argv[])
417dd7cddfSDavid du Colombier {
427dd7cddfSDavid du Colombier char *tostr, *file;
437dd7cddfSDavid du Colombier int fd, uncompressed;
447dd7cddfSDavid du Colombier ulong tochan;
457dd7cddfSDavid du Colombier Memimage *m, *n;
467dd7cddfSDavid du Colombier
477dd7cddfSDavid du Colombier tostr = nil;
487dd7cddfSDavid du Colombier uncompressed = 0;
497dd7cddfSDavid du Colombier ARGBEGIN{
507dd7cddfSDavid du Colombier case 'c':
5159cc4ca5SDavid du Colombier tostr = EARGF(usage());
527dd7cddfSDavid du Colombier break;
537dd7cddfSDavid du Colombier case 'u':
547dd7cddfSDavid du Colombier uncompressed = 1;
557dd7cddfSDavid du Colombier break;
567dd7cddfSDavid du Colombier default:
577dd7cddfSDavid du Colombier usage();
587dd7cddfSDavid du Colombier }ARGEND
597dd7cddfSDavid du Colombier
607dd7cddfSDavid du Colombier memimageinit();
617dd7cddfSDavid du Colombier
627dd7cddfSDavid du Colombier file = "<stdin>";
637dd7cddfSDavid du Colombier m = nil;
647dd7cddfSDavid du Colombier
657dd7cddfSDavid du Colombier switch(argc){
667dd7cddfSDavid du Colombier case 0:
677dd7cddfSDavid du Colombier m = readmemimage(0);
687dd7cddfSDavid du Colombier break;
697dd7cddfSDavid du Colombier case 1:
707dd7cddfSDavid du Colombier file = argv[0];
717dd7cddfSDavid du Colombier fd = open(file, OREAD);
727dd7cddfSDavid du Colombier if(fd < 0)
737dd7cddfSDavid du Colombier sysfatal("can't open %s: %r", file);
747dd7cddfSDavid du Colombier m = readmemimage(fd);
757dd7cddfSDavid du Colombier close(fd);
767dd7cddfSDavid du Colombier break;
777dd7cddfSDavid du Colombier default:
787dd7cddfSDavid du Colombier usage();
797dd7cddfSDavid du Colombier }
807dd7cddfSDavid du Colombier
817dd7cddfSDavid du Colombier if(m == nil)
827dd7cddfSDavid du Colombier sysfatal("can't read %s: %r", file);
837dd7cddfSDavid du Colombier
847dd7cddfSDavid du Colombier if(tostr == nil)
857dd7cddfSDavid du Colombier tochan = m->chan;
867dd7cddfSDavid du Colombier else{
877dd7cddfSDavid du Colombier tochan = strtochan(tostr);
887dd7cddfSDavid du Colombier if(tochan == 0)
897dd7cddfSDavid du Colombier sysfatal("bad channel descriptor '%s'", tostr);
907dd7cddfSDavid du Colombier }
917dd7cddfSDavid du Colombier
927dd7cddfSDavid du Colombier n = allocmemimage(m->r, tochan);
937dd7cddfSDavid du Colombier if(n == nil)
947dd7cddfSDavid du Colombier sysfatal("can't allocate new image: %r");
957dd7cddfSDavid du Colombier
96*6a9fc400SDavid du Colombier memimagedraw(n, n->r, m, m->r.min, nil, ZP, S);
977dd7cddfSDavid du Colombier if(uncompressed)
987dd7cddfSDavid du Colombier writeuncompressed(1, n);
997dd7cddfSDavid du Colombier else
1007dd7cddfSDavid du Colombier writememimage(1, n);
1017dd7cddfSDavid du Colombier exits(nil);
1027dd7cddfSDavid du Colombier }
103