xref: /inferno-os/utils/cvbit/cvbit.c (revision 0e96539ff7cff23233d3f0a64bb285b385a3a1f4)
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4 #include <memdraw.h>
5 #include <pool.h>
6 
7 static int invert = 0;
8 
9 void
main(int argc,char ** argv)10 main(int argc, char **argv)
11 {
12 	Memimage *im, *om;
13 	char *s;
14 	ulong ofmt;
15 
16 	ofmt = 0;
17 	ARGBEGIN{
18 	case 'i':
19 		invert = 1;
20 		break;
21 	case 'c':
22 		s = ARGF();
23 		if(s==nil)
24 			break;
25 		ofmt = strtochan(s);
26 		if(ofmt == 0){
27 			fprint(2, "cvbit: bad chan: %s\n", s);
28 			exits("chan");
29 		}
30 		break;
31 	}ARGEND
32 
33 	memimageinit();
34 	im = readmemimage(0);
35 	if(im == nil){
36 		fprint(2, "cvbit: can't read image: %r\n");
37 		exits("read");
38 	}
39 	if(ofmt){
40 		om = allocmemimage(im->r, ofmt);
41 		if(om == nil){
42 			fprint(2, "cvbit: can't allocate new image: %r\n");
43 			exits("alloc");
44 		}
45 		memimagedraw(om, om->r, im, im->r.min, nil, ZP, S);
46 	}else
47 		om = im;
48 	if(invert){
49 		uchar *buf;
50 		int bpl, y, x;
51 
52 		bpl = bytesperline(om->r, om->depth);
53 		buf = malloc(bpl);
54 		for(y=om->r.min.y; y<om->r.max.y; y++){
55 			if(unloadmemimage(om, Rpt(Pt(om->r.min.x,y), Pt(om->r.max.x,y+1)), buf, bpl) != bpl){
56 				fprint(2, "cvbit: can't unload image line\n");
57 				exits("unload");
58 			}
59 			for(x=0; x<bpl; x++)
60 				buf[x] ^= 0xFF;
61 			if(loadmemimage(om, Rpt(Pt(om->r.min.x,y), Pt(om->r.max.x,y+1)), buf, bpl) != bpl){
62 				fprint(2, "cvbit: can't load image line\n");
63 				exits("load");
64 			}
65 		}
66 	}
67 	if(writememimage(1, om) < 0){
68 		fprint(2, "cvbit: can't write image: %r\n");
69 		exits("write");
70 	}
71 	exits(nil);
72 }
73 
74 char*
poolname(Pool * p)75 poolname(Pool *p)
76 {
77 	USED(p);
78 	return "none";
79 }
80 
81 void
poolsetcompact(Pool * p,void (* f)(void *,void *))82 poolsetcompact(Pool *p, void (*f)(void*, void*))
83 {
84 	USED(p);
85 	USED(f);
86 }
87