// dump an uncompressed plan9 bitmap in a format // suitable for including in icons.c. // Use, e.g., gif -9 file.gif > file.bit // to get a suitable input file #include #include static void usage(void); static void dumparray(char*, int, uchar*, int, int); void main(int argc, char* argv[]) { char *name; int f; ulong n; Dir statbuf; uchar* buf; int tflag = 0; int tindex = 0; int x0, y0, x1, y1, w, h, nb; ARGBEGIN{ case 't': tflag = 1; tindex = strtol(ARGF(), nil, 0); break; default: usage(); }ARGEND if(argc == 0) usage(); if((f = open(name = *argv, OREAD)) == -1){ perror(name); exits("open"); } if(dirfstat(f, &statbuf) == -1){ perror(name); exits("stat"); } n = (ulong)statbuf.length; if(n < 5*12){ print("file too short"); exits("file length"); } buf = (uchar*)malloc(n); if(buf == nil){ print("can't malloc %u bytes\n", n); exits("malloc"); } if(readn(f, buf, n) != n) { perror(name); exits("read"); } if(!(buf[9] == 'm' && buf[10] == '8')) { print("wrong file format"); exits("format"); } x0 = strtol((char*)buf+1*12, nil, 10); y0 = strtol((char*)buf+2*12, nil, 10); x1 = strtol((char*)buf+3*12, nil, 10); y1 = strtol((char*)buf+4*12, nil, 10); w = x1-x0; h = y1-y0; nb = w*h; if(n != 5*12 + nb){ print("wrong file length: %d, expected %d", n, 5*12 + nb); exits("length"); } print("#define iconwidth %d\n", w); print("#define iconheight %d\n", h); dumparray("icondata", nb, buf+5*12, 0, 0); if(tflag) dumparray("iconmask", nb, buf+5*12, 1, tindex); } static void dumparray(char* name, int n, uchar* buf, int tflag, int tindex) { int i, v; print("static uchar %s[%d] = {", name, n); for(i = 0; i < n; i++) { if((i%8)==0) print("\n\t"); v = buf[i]; if(tflag) v = (v == tindex)? 0 : 255; print("%d, ", v); } print("\n};\n"); } static void usage() { print("usage: dumpicon [-t transparentindex] plan9bitmapfile\n"); exits("usage"); }