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