ref: 044014910f2ffded4bebadbd729d76aa4dea2111
dir: /cursexp.c/
#include <u.h> #include <libc.h> #include <draw.h> #include <memdraw.h> void usage(void) { fprint(2, "usage: %s [-g] [-c]\n", argv0); exits("usage"); } #define UNPACK(a, n) (((*a)>>n)&0x3) uchar byte = 0; uchar num = 0; uchar numforrow = 0; void condwrite(int one) { uchar new = byte<<1 | one; byte = new; num++; if (num == 8) { if (numforrow == 0) print("\t"); print("0x%02x,", byte); num = 0; byte = 0; numforrow++; if (numforrow != 8) print(" "); } if (numforrow == 8) { numforrow = 0; print("\n"); } } void i2c(Memimage *img) { Point pt; uchar *b; uchar v; int x, y; for (y = 0; y < 16; y++) { for (x = 0; x < 4; x++) { pt.x = x*4; pt.y = y; b = byteaddr(img, pt); v = UNPACK(b, 6); condwrite(v == 3); v = UNPACK(b, 4); condwrite(v == 3); v = UNPACK(b, 2); condwrite(v == 3); v = UNPACK(b, 0); condwrite(v == 3); } } print("\n"); for (y = 0; y < 16; y++) { for (x = 0; x < 4; x++) { pt.x = x*4; pt.y = y; b = byteaddr(img, pt); v = UNPACK(b, 6); condwrite(v == 0); v = UNPACK(b, 4); condwrite(v == 0); v = UNPACK(b, 2); condwrite(v == 0); v = UNPACK(b, 0); condwrite(v == 0); } } } char hex[] = "0123456789abcdef"; char HEX[] = "0123456789ABCDEF"; char ign[] = " \t\n,"; char Eformat[] = "invalid format"; uchar readbyte(void) { char buf; uchar v = 0; int stage = 0; char *p; ulong nbytes = 0; int n; for (;;) { n = read(0, &buf, 1); if (n < 0) sysfatal("read: %r"); if (n == 0) { fprint(2, "read: eof at %uld\n", nbytes); exits("eof"); } nbytes++; switch (stage) { case 0: /* ign */ if (buf == '0') { stage++; break; } if (strchr(ign, buf)) break; fprint(2, "invalid character: '%c' at %uld\n", buf, nbytes); exits(Eformat); case 1: /* '0' */ if (buf == 'x') { stage++; break; } goto Errnohex; case 2: /* 'x' */ p = strchr(hex, buf); if (!p) p = strchr(HEX, buf); if (!p) goto Errnohex; v = ((p-hex)<<4)&0xf0; stage++; break; case 3: /* 'N' */ p = strchr(hex, buf); if (!p) p = strchr(HEX, buf); if (!p) goto Errnohex; v |= (p-hex)&0x0f; stage++; break; case 4: /* 'N' */ return v; } } Errnohex: fprint(2, "invalid format: no valid hex (got '%c' at %uld)\n", buf, nbytes); exits(Eformat); } void c2i(void) { Memimage *white, *black, *img; int x, y; uchar *b; uchar r; Point pt; white = allocmemimage(Rect(0, 0, 16, 16), GREY1); black = allocmemimage(Rect(0, 0, 16, 16), GREY1); img = allocmemimage(Rect(0, 0, 16, 16), GREY2); for (y = 0; y < 16; y++) { for (x = 0; x < 4; x++) { pt.x = x*4; pt.y = y; b = byteaddr(img, pt); /* 10 or 01 would both work, but 10 is visually easier to read */ *b = 0b10101010; } } for (y = 0; y < 16; y++) { for (x = 0; x < 2; x++) { pt.x = x*8; pt.y = y; r = readbyte(); b = byteaddr(white, pt); *b = r; } } for (y = 0; y < 16; y++) { for (x = 0; x < 2; x++) { pt.x = x*8; pt.y = y; r = readbyte(); b = byteaddr(black, pt); *b = r; } } memimagedraw(img, img->r, memwhite, ZP, white, ZP, SatopD); memimagedraw(img, img->r, memblack, ZP, black, ZP, SatopD); writememimage(1, img); freememimage(img); } void gentemplate(void) { Memimage *img; if (memimageinit()) sysfatal("%r"); img = allocmemimage(Rect(0, 0, 16, 16), GREY2); memfillcolor(img, 0xaaaaaaff); writememimage(1, img); freememimage(img); } void main(int argc, char **argv) { int gentempl = 0; int reverse = 0; Memimage *img; ARGBEGIN { case 'h': usage(); break; case 'g': gentempl++; break; case 'c': reverse++; break; } ARGEND; if (memimageinit()) sysfatal("%r"); if (gentempl) { gentemplate(); exits(nil); } if (reverse) { c2i(); exits(nil); } img = readmemimage(0); if (!img) sysfatal("invalid image format: %r"); i2c(img); exits(nil); }