Merge commit 'v4.3.16'
[xboard.git] / bitmaps / convert.c
diff --git a/bitmaps/convert.c b/bitmaps/convert.c
new file mode 100644 (file)
index 0000000..e1d080a
--- /dev/null
@@ -0,0 +1,73 @@
+#include <stdio.h>\r
+\r
+// [HGM] This program converts a WinBoard monochrome .bmp piece-symbol bitmap file\r
+//       to a .bm C-source file suitable for inclusion in xboard as buit-in bitmap.\r
+//       You will have to convert the bitmaps one by one, and re-direct the output to the desired file!\r
+\r
+main(int argc, char **argv)\r
+{\r
+       int i, j, k, d, cnt; char c, h, w, *p, data[10000], *name;\r
+       FILE *f;\r
+\r
+       if(argc<2) { printf("usage is: convert <bmp filename>\n"); exit(0); }\r
+       f = fopen(argv[1], "rb");\r
+       if(f == NULL) { printf("file %s not found\n", argv[1]); exit(0); }\r
+\r
+       if(fscanf(f, "BM%c", &i) != 1) { printf("%s does not have bitmap format\n"); exit(0); }\r
+       for(i=0; i<15; i++) fgetc(f); fscanf(f, "%c%c%c%c%c", &h, &i, &i, &i, &w);\r
+       for(i=0; i<39; i++) fgetc(f);\r
+\r
+// printf("h=%d, w=%d\n", h, w);\r
+\r
+       p = data;\r
+       for(i=0; i<h; i++) {\r
+               for(j=0; j<w; j+=32) {\r
+                       c = fgetc(f);\r
+                       for(k=0; k<8; k++) {\r
+                               d = (d>>1) | (c&0x80);\r
+                               c <<= 1;\r
+                       }\r
+                       *p++ = d;\r
+                       c = fgetc(f);\r
+                       for(k=0; k<8; k++) {\r
+                               d = (d>>1) | (c&0x80);\r
+                               c <<= 1;\r
+                       }\r
+                       *p++ = d;\r
+                       c = fgetc(f);\r
+                       for(k=0; k<8; k++) {\r
+                               d = (d>>1) | (c&0x80);\r
+                               c <<= 1;\r
+                       }\r
+                       *p++ = d;\r
+                       c = fgetc(f);\r
+                       for(k=0; k<8; k++) {\r
+                               d = (d>>1) | (c&0x80);\r
+                               c <<= 1;\r
+                       }\r
+                       *p++ = d;\r
+               }\r
+       }\r
+\r
+       name = argv[1];\r
+       for(i=0; argv[1][i]; i++) if(argv[1][i] == '\\') name = argv[1]+i+1;\r
+       for(i=0; name[i]; i++) if(name[i] == '.') name[i] = 0;\r
+       printf("#define %s_width %d\n", name, w);\r
+       printf("#define %s_height %d\n", name, h);\r
+       printf("static unsigned char %s_bits[] = {\n", name);\r
+       cnt = 0;\r
+       for(i=h-1; i>=0; i--) {\r
+               for(j=0; j<w; j+=8) {\r
+                       c = ~data[i*((w+31)/8&~3)+j/8];\r
+                       if(w-j<8) c &= 255>>(8+j-w);\r
+//                     for(k=0; k<8; k++) {\r
+//                             printf("%c", c&1 ? 'X' : '.');\r
+//                             c >>= 1;\r
+//                     }\r
+                       if(cnt!=0) printf(",");\r
+                       printf("0x%02x", c&255);\r
+                       if(++cnt % 15 == 0) { printf("\n"); }\r
+               }\r
+       }\r
+       printf("\n};\n");\r
+}\r