security fix: replaced sprintf with snprintf
[xboard.git] / pixmaps / convert.c
1 #include <stdio.h>\r
2 \r
3 // [HGM] This program converts the WinBoard monochrome .bmp piece-symbol bitmap files\r
4 //       to .xpm C-source files suitable for inclusion in xboard as buit-in pixmap.\r
5 //       It tries all bitmaps in bulk. Run it once in an empty subdirectory 'pixmaps'of the\r
6 //       root directory of the source tree, and it will fill it with pixmaps.\r
7 //       It overwrites any pixmaps of the same name that already exist. So if you want to\r
8 //       keep the pixmaps you already have, move them elsewhere, run convert, and move them back.\r
9 \r
10 \r
11 int sizeList[] = { 21, 25, 29, 33, 37, 40, 45, 49, 54, 58, 64, 72, 80, 87, 95, 108, 116, 129 };\r
12 char *(pieceList[]) = {"p", "n", "b", "r", "q", "f", "e", "as", "c", "w", "m",\r
13                        "o", "h", "a", "dk", "g", "d", "v", "l", "s", "u", "k",\r
14                        "wp", "wl", "wn", "ws", "cv", NULL };\r
15 char kindList[] = "sow";\r
16 \r
17 void Load(FILE *f, char data[130][130], char*name)\r
18 {\r
19         int i, j, k; char h, w, c;\r
20 \r
21         if(fscanf(f, "BM%c", &i) != 1) { printf("%s does not have bitmap format\n", name); exit(0); }\r
22         for(i=0; i<15; i++) fgetc(f); fscanf(f, "%c%c%c%c%c", &h, &i, &i, &i, &w);\r
23         for(i=0; i<39; i++) fgetc(f); // no checking is done to see if the format is as we expect!!!\r
24 \r
25 // printf("h=%d, w=%d\n", h, w);\r
26         for(i=0; i<h; i++) {\r
27                 for(j=0; j<w; j+=32) {\r
28                         c = fgetc(f);\r
29                         for(k=0; k<8; k++) {\r
30                             data[i][j+k] = c&0x80; c <<= 1;\r
31                         }\r
32                         c = fgetc(f);\r
33                         for(k=0; k<8; k++) {\r
34                             data[i][j+k+8] = c&0x80; c <<= 1;\r
35                         }\r
36                         c = fgetc(f);\r
37                         for(k=0; k<8; k++) {\r
38                             data[i][j+k+16] = c&0x80; c <<= 1;\r
39                         }\r
40                         c = fgetc(f);\r
41                         for(k=0; k<8; k++) {\r
42                             data[i][j+k+24] = c&0x80; c <<= 1;\r
43                         }\r
44                 }\r
45         }\r
46 \r
47         fclose(f);\r
48 }\r
49 \r
50 void Paint(char dest[130][130], char src[130][130], int size, char c)\r
51 {       // copy monochrome pixmap to destination as if (transparent, c)\r
52         int i, j;\r
53 \r
54         for(i=0; i<size; i++) for(j=0; j<size; j++) if(!src[i][j]) dest[i][j] = c;\r
55 }\r
56 \r
57 FloodFill(char a[130][130], int size, int x, int y)\r
58 {\r
59         char old = 'X', new = '.';\r
60         if(a[x][y] != old) return; else {\r
61                 a[x][y] = new;\r
62                 if(x > 0) FloodFill(a, size, x-1, y);\r
63                 if(y > 0) FloodFill(a, size, x, y-1);\r
64                 if(x < size-1) FloodFill(a, size, x+1, y);\r
65                 if(y < size-1) FloodFill(a, size, x, y+1);\r
66         }\r
67 \r
68 }\r
69 \r
70 void Save(FILE *f, char *name, char data[130][130], int size, char *col, int depth)\r
71 {       // write out data in source format for d x d pixmap with specified square color\r
72         int i, j;\r
73 \r
74         fprintf(f, "/* XPM */\n");\r
75         fprintf(f, "static char *%s[] = {\n", name);\r
76         fprintf(f, "/* columns rows colors chars-per-pixel */\n");\r
77         fprintf(f, "\"%d %d %d 1\",\n", size, size, depth);\r
78         fprintf(f, "\"  c black s dark_piece\",\n");\r
79         fprintf(f, "\". %s\",\n", col);\r
80         if(depth==3) fprintf(f, "\"X c white s light_piece\",\n");\r
81         fprintf(f, "/* pixels */\n");\r
82         for(i=size-1; i>=0; i--) {\r
83                 fprintf(f, "\"%s\"%s\n", data[i], i==0 ? "" : ",");\r
84         }\r
85         fprintf(f, "};\n");\r
86 \r
87         fclose(f);\r
88 }\r
89 \r
90 \r
91 char data[130][130], oData[130][130], sData[130][130], wData[130][130];\r
92 \r
93 main(int argc, char **argv)\r
94 {\r
95 \r
96 #define BUFLEN 80\r
97 \r
98         int i, j, k, d, cnt, p, s, t; char c, h, w, name[BUFLEN], buf[BUFLEN], transparent;\r
99         FILE *f;\r
100 \r
101     transparent = argc > 1 && !strcmp(argv[1], "-t");\r
102 \r
103     for(s=0; s<18; s++) for(p=0; pieceList[p] != NULL; p++) {\r
104 \r
105         // Load the 3 kinds of Windows monochrome bitmaps (outline, solid, white fill)\r
106 \r
107         snprintf(buf, BUFLEN, "../winboard/bitmaps/%s%d%c.bmp", pieceList[p], sizeList[s], 'o');\r
108         printf("try %s\n", buf);\r
109         f = fopen(buf, "rb");\r
110         if(f == NULL) continue;\r
111         Load(f, oData, buf);\r
112 \r
113         snprintf(buf, BUFLEN, "../winboard/bitmaps/%s%d%c.bmp", pieceList[p], sizeList[s], 's');\r
114         f = fopen(buf, "rb");\r
115         if(f == NULL) continue;\r
116         Load(f, sData, buf);\r
117 \r
118         snprintf(buf, BUFLEN, "../winboard/bitmaps/%s%d%c.bmp", pieceList[p], sizeList[s], 'w');\r
119         if(pieceList[p][0]=='w')\r
120         snprintf(buf, BUFLEN, "../winboard/bitmaps/%s%d%c.bmp", "w", sizeList[s], 'w');\r
121         f = fopen(buf, "rb");\r
122         if(f == NULL) continue;\r
123         Load(f, wData, buf);\r
124 \r
125         printf("%s loaded\n", buf);\r
126         // construct pixmaps as character arrays\r
127         d = sizeList[s];\r
128         for(i=0; i<d; i++) { for(j=0; j<d; j++) data[i][j] = transparent? '.' : 'X'; data[i][d] = 0; } // fill square\r
129 \r
130         Paint(data, sData, d, ' '); // overay with solid piece bitmap\r
131 \r
132         if(!transparent) { // background was painted same color as piece details; flood-fill it from corners\r
133             FloodFill(data, d, 0, 0);\r
134             FloodFill(data, d, 0, d-1);\r
135             FloodFill(data, d, d-1, 0);\r
136             FloodFill(data, d, d-1, d-1);\r
137         }\r
138 \r
139         snprintf(buf, BUFLEN, "%s%s%d.xpm", pieceList[p], "dd", d);\r
140         snprintf(name, BUFLEN, "%s%s%d", pieceList[p], "dd", d);\r
141         f = fopen(buf, "w");\r
142         Save(f, name, data, d, "c green s dark_square", 3);\r
143 \r
144         snprintf(buf, BUFLEN, "%s%s%d.xpm", pieceList[p], "dl", d);\r
145         snprintf(name, BUFLEN, "%s%s%d", pieceList[p], "dl", d);\r
146         f = fopen(buf, "w");\r
147         Save(f, name, data, d, "c gray s light_square", 3); // silly duplication; pixmap is te same, but other color\r
148 \r
149         // now the light piece\r
150         for(i=0; i<d; i++) { for(j=0; j<d; j++) data[i][j] = '.'; data[i][d] = 0; } // fill square\r
151 \r
152         Paint(data, wData, d, 'X'); // overay with white-filler piece bitmap\r
153         Paint(data, oData, d, ' '); // overay with outline piece bitmaps\r
154 \r
155         snprintf(buf, BUFLEN, "%s%s%d.xpm", pieceList[p], "ld", d);\r
156         snprintf(name, BUFLEN, "%s%s%d", pieceList[p], "ld", d);\r
157         f = fopen(buf, "w");\r
158         Save(f, name, data, d, "c green s dark_square", 3);\r
159 \r
160         snprintf(buf, BUFLEN, "%s%s%d.xpm", pieceList[p], "ll", d);\r
161         snprintf(name, BUFLEN, "%s%s%d", pieceList[p], "ll", d);\r
162         f = fopen(buf, "w");\r
163         Save(f, name, data, d, "c gray s light_square", 3);\r
164 \r
165         printf("%s saved\n", buf);\r
166     }\r
167 }\r
168 \r