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