/* note: this is for Plan 9 only */ #include #include #include #include static int hor = 44, ver = 26, bpp = 1; static int SZ; #define xy2n(x, y) ((y & 7) + (x/8 + y/8 * hor)*bpp*8) static u8int * readall(int f, int *isz) { int bufsz, sz, n; u8int *s; bufsz = 1023; s = nil; for(sz = 0;; sz += n){ if(bufsz-sz < 1024){ bufsz *= 2; s = realloc(s, bufsz); } if((n = readn(f, s+sz, bufsz-sz)) < 1) break; } if(n < 0 || sz < 1){ free(s); return nil; } *isz = sz; return s; } static int getcoli(int x, int y, u8int *p) { int ch1, ch2, r; r = xy2n(x, y); ch1 = (p[r+0] >> (7 - x & 7)) & 1; ch2 = bpp < 2 ? 0 : (p[r+8] >> (7 - x & 7)) & 1; return ch2<<1 | ch1; } static void usage(void) { fprint(2, "usage: %s [-1] [-2] [-w WIDTH]\n", argv0); exits("usage"); } void main(int argc, char **argv) { int sz, esz, h, w, x, y; Memimage *m; Memdata d; u8int *p; ulong col[2][4] = { {DWhite, DBlack, 0, 0}, {DTransparent, DWhite, 0x72dec2ff, 0x666666ff}, }; ARGBEGIN{ case '1': bpp = 1; break; case '2': bpp = 2; break; case 'w': hor = atoi(EARGF(usage())); break; }ARGEND memimageinit(); if((p = readall(0, &sz)) == nil) sysfatal("%r"); ver = sz / (bpp*8) / hor; esz = (hor * ver * (bpp*8)); w = hor*8; h = ver*8; if(sz != esz) fprint(2, "warning: size differs (%d vs %d), dimensions must be wrong\n", sz, esz); memset(&d, 0, sizeof(d)); if((d.base = malloc(4*w*h)) == nil) sysfatal("memory"); d.bdata = (uchar*)d.base; for(y = 0; y < h; y++){ for(x = 0; x < w; x++) d.base[y*w + x] = col[bpp-1][getcoli(x, y, p)]; } if((m = allocmemimaged(Rect(0, 0, w, h), RGBA32, &d)) == nil) sysfatal("%r"); if(writememimage(1, m) != 0) sysfatal("%r"); exits(nil); }