#include #include #include #include #include #include #include #include "imagefile.h" enum{ Digits = 2*sizeof(ulong), }; static int Bputint(Biobufhdr *b, int i) { char buf[Digits]; int n; n = Digits; buf[--n] = i&127; i /= 127; for(; i; i /= 128) buf[--n] = i&127 | 0x80; return Bwrite(b, buf+n, Digits-n); } static Memimage* mk1bit(Memimage *m) { Memimage *n; n = allocmemimage(m->r, GREY1); memimagedraw(n, n->r, m, ZP, nil, ZP, SoverD); return n; } // we need to do this line-by-line because image scan lines are word aligned. // wbmp scan lines are byte aligned. static int writeimgbits(Biobuf *b, Memimage *m) { int r, w; w = (Dx(m->r)+7)/8; for(r = m->r.min.y; r < m->r.max.y; r++) if(Bwrite(b, byteaddr(m, Pt(0, r)), w) == -1) return -1; return 0; } char* memwritewbmp(Biobuf *b, Memimage *m, ImageInfo *) { Memimage *n; int i; Bputint(b, 0); Bputint(b, 0); Bputint(b, Dx(m->r)); Bputint(b, Dy(m->r)); n = mk1bit(m); i = writeimgbits(b, n); freememimage(n); if(i < 0) return "write error"; return 0; }