summaryrefslogtreecommitdiff
path: root/utils/cvbit/cvbit.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/cvbit/cvbit.c')
-rw-r--r--utils/cvbit/cvbit.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/utils/cvbit/cvbit.c b/utils/cvbit/cvbit.c
new file mode 100644
index 00000000..dcd140f0
--- /dev/null
+++ b/utils/cvbit/cvbit.c
@@ -0,0 +1,86 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <memdraw.h>
+#include <pool.h>
+
+static int invert = 0;
+
+void
+main(int argc, char **argv)
+{
+ Memimage *im, *om;
+ char *s;
+ ulong ofmt;
+
+ ofmt = 0;
+ ARGBEGIN{
+ case 'i':
+ invert = 1;
+ break;
+ case 'c':
+ s = ARGF();
+ if(s==nil)
+ break;
+ ofmt = strtochan(s);
+ if(ofmt == 0){
+ fprint(2, "cvbit: bad chan: %s\n", s);
+ exits("chan");
+ }
+ break;
+ }ARGEND
+
+ memimageinit();
+ im = readmemimage(0);
+ if(im == nil){
+ fprint(2, "cvbit: can't read image: %r\n");
+ exits("read");
+ }
+ if(ofmt){
+ om = allocmemimage(im->r, ofmt);
+ if(om == nil){
+ fprint(2, "cvbit: can't allocate new image: %r\n");
+ exits("alloc");
+ }
+ memimagedraw(om, om->r, im, im->r.min, nil, ZP, S);
+ }else
+ om = im;
+ if(invert){
+ uchar *buf;
+ int bpl, y, x;
+
+ bpl = bytesperline(om->r, om->depth);
+ buf = malloc(bpl);
+ for(y=om->r.min.y; y<om->r.max.y; y++){
+ if(unloadmemimage(om, Rpt(Pt(om->r.min.x,y), Pt(om->r.max.x,y+1)), buf, bpl) != bpl){
+ fprint(2, "cvbit: can't unload image line\n");
+ exits("unload");
+ }
+ for(x=0; x<bpl; x++)
+ buf[x] ^= 0xFF;
+ if(loadmemimage(om, Rpt(Pt(om->r.min.x,y), Pt(om->r.max.x,y+1)), buf, bpl) != bpl){
+ fprint(2, "cvbit: can't load image line\n");
+ exits("load");
+ }
+ }
+ }
+ if(writememimage(1, om) < 0){
+ fprint(2, "cvbit: can't write image: %r\n");
+ exits("write");
+ }
+ exits(nil);
+}
+
+char*
+poolname(Pool *p)
+{
+ USED(p);
+ return "none";
+}
+
+void
+poolsetcompact(Pool *p, void (*f)(void*, void*))
+{
+ USED(p);
+ USED(f);
+}