rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <string.h>
|
nuclear@1
|
4 #include <errno.h>
|
nuclear@0
|
5 #include <imago2.h>
|
nuclear@0
|
6
|
nuclear@1
|
7 struct imgfile {
|
nuclear@1
|
8 char *fname;
|
nuclear@1
|
9 struct imgfile *next;
|
nuclear@1
|
10 };
|
nuclear@1
|
11
|
nuclear@1
|
12 struct varnames {
|
nuclear@1
|
13 char *arrayname;
|
nuclear@1
|
14 char *widthname, *heightname;
|
nuclear@1
|
15 char *bppname;
|
nuclear@1
|
16 };
|
nuclear@1
|
17
|
nuclear@1
|
18 int save_image15(unsigned int *img, int x, int y, const char *fname, struct varnames *vars);
|
nuclear@1
|
19 int parse_args(int argc, char **argv);
|
nuclear@1
|
20
|
nuclear@1
|
21 struct imgfile *flist, *ftail;
|
nuclear@1
|
22 const char *outname_fmt = "%s.img.c";
|
nuclear@1
|
23 const char *arrayname_fmt = "%s_pixels";
|
nuclear@1
|
24 const char *widthname_fmt = "%s_width";
|
nuclear@1
|
25 const char *heightname_fmt = "%s_height";
|
nuclear@1
|
26 const char *bppname_fmt = "%s_bpp";
|
nuclear@1
|
27 const char *hdrname = "data.h";
|
nuclear@1
|
28
|
nuclear@1
|
29 FILE *hdrfile;
|
nuclear@0
|
30
|
nuclear@0
|
31 int main(int argc, char **argv)
|
nuclear@0
|
32 {
|
nuclear@1
|
33 struct varnames vars;
|
nuclear@1
|
34 char *outname;
|
nuclear@0
|
35
|
nuclear@1
|
36 if(parse_args(argc, argv) == -1) {
|
nuclear@1
|
37 return 1;
|
nuclear@0
|
38 }
|
nuclear@0
|
39
|
nuclear@1
|
40 if(!flist) {
|
nuclear@1
|
41 fprintf(stderr, "you didn't specify any files to convert\n");
|
nuclear@1
|
42 return 1;
|
nuclear@1
|
43 }
|
nuclear@0
|
44
|
nuclear@1
|
45 if(!(hdrfile = fopen(hdrname, "w"))) {
|
nuclear@1
|
46 fprintf(stderr, "failed to write header file: %s: %s\n", hdrname, strerror(errno));
|
nuclear@1
|
47 return 1;
|
nuclear@1
|
48 }
|
nuclear@1
|
49 fprintf(hdrfile, "#ifndef IMG2GBA_DATAFILE_DECLARATIONS_H_\n");
|
nuclear@1
|
50 fprintf(hdrfile, "#define IMG2GBA_DATAFILE_DECLARATIONS_H_\n\n");
|
nuclear@1
|
51
|
nuclear@1
|
52 while(flist) {
|
nuclear@1
|
53 char *suffix;
|
nuclear@1
|
54 int x, y, namelen;
|
nuclear@1
|
55 unsigned int *img;
|
nuclear@1
|
56
|
nuclear@1
|
57 struct imgfile *imgfile = flist;
|
nuclear@1
|
58 flist = flist->next;
|
nuclear@1
|
59
|
nuclear@1
|
60 printf("converting: %s ...\n", imgfile->fname);
|
nuclear@1
|
61
|
nuclear@1
|
62 if(!(img = img_load_pixels(imgfile->fname, &x, &y, IMG_FMT_RGBA32))) {
|
nuclear@1
|
63 continue;
|
nuclear@0
|
64 }
|
nuclear@0
|
65
|
nuclear@1
|
66 if((suffix = strrchr(imgfile->fname, '.'))) {
|
nuclear@1
|
67 *suffix = 0;
|
nuclear@0
|
68 }
|
nuclear@1
|
69 namelen = strlen(imgfile->fname);
|
nuclear@1
|
70
|
nuclear@1
|
71 outname = malloc(namelen + strlen(outname_fmt) + 1);
|
nuclear@1
|
72 vars.arrayname = malloc(namelen + strlen(arrayname_fmt) + 1);
|
nuclear@1
|
73 vars.widthname = malloc(namelen + strlen(widthname_fmt) + 1);
|
nuclear@1
|
74 vars.heightname = malloc(namelen + strlen(heightname_fmt) + 1);
|
nuclear@1
|
75 vars.bppname = malloc(namelen + strlen(bppname_fmt) + 1);
|
nuclear@1
|
76
|
nuclear@1
|
77 sprintf(outname, outname_fmt, imgfile->fname);
|
nuclear@1
|
78 sprintf(vars.arrayname, arrayname_fmt, imgfile->fname);
|
nuclear@1
|
79 sprintf(vars.widthname, widthname_fmt, imgfile->fname);
|
nuclear@1
|
80 sprintf(vars.heightname, heightname_fmt, imgfile->fname);
|
nuclear@1
|
81 sprintf(vars.bppname, bppname_fmt, imgfile->fname);
|
nuclear@1
|
82
|
nuclear@1
|
83 if(save_image15(img, x, y, outname, &vars) == -1) {
|
nuclear@1
|
84 fprintf(stderr, "could not save as %s\n", outname);
|
nuclear@1
|
85 }
|
nuclear@1
|
86
|
nuclear@1
|
87 free(outname);
|
nuclear@1
|
88 free(vars.arrayname);
|
nuclear@1
|
89 free(vars.widthname);
|
nuclear@1
|
90 free(vars.heightname);
|
nuclear@1
|
91 free(vars.bppname);
|
nuclear@1
|
92
|
nuclear@1
|
93 free(imgfile);
|
nuclear@0
|
94
|
nuclear@0
|
95 img_free_pixels(img);
|
nuclear@0
|
96 }
|
nuclear@1
|
97
|
nuclear@1
|
98 fprintf(hdrfile, "\n#endif\n");
|
nuclear@1
|
99 fclose(hdrfile);
|
nuclear@0
|
100 return 0;
|
nuclear@0
|
101 }
|
nuclear@0
|
102
|
nuclear@0
|
103 #define GET_R(pixel) (((pixel) >> 16) & 0xff)
|
nuclear@0
|
104 #define GET_G(pixel) (((pixel) >> 8) & 0xff)
|
nuclear@0
|
105 #define GET_B(pixel) (((pixel) >> 0) & 0xff)
|
nuclear@0
|
106
|
nuclear@0
|
107 #define PACK_COLOR15(r, g, b) ((((r) & 0x1f) << 10) | (((g) & 0x1f) << 5) | ((b) & 0x1f))
|
nuclear@0
|
108
|
nuclear@1
|
109 int save_image15(unsigned int *img, int x, int y, const char *fname, struct varnames *vars)
|
nuclear@0
|
110 {
|
nuclear@0
|
111 int i, j;
|
nuclear@0
|
112 FILE *fp;
|
nuclear@0
|
113
|
nuclear@1
|
114 fprintf(hdrfile, "extern const short %s;\n", vars->widthname);
|
nuclear@1
|
115 fprintf(hdrfile, "extern const short %s;\n", vars->heightname);
|
nuclear@1
|
116 fprintf(hdrfile, "extern const short %s;\n", vars->bppname);
|
nuclear@1
|
117 fprintf(hdrfile, "extern const unsigned short %s[%d * %d];\n", vars->arrayname, x, y);
|
nuclear@1
|
118
|
nuclear@0
|
119 if(!(fp = fopen(fname, "w"))) {
|
nuclear@1
|
120 fprintf(stderr, "failed to write file: %s: %s\n", fname, strerror(errno));
|
nuclear@0
|
121 return -1;
|
nuclear@0
|
122 }
|
nuclear@0
|
123
|
nuclear@2
|
124 fprintf(fp, "\nconst short %s = %d;\n", vars->widthname, x);
|
nuclear@2
|
125 fprintf(fp, "\nconst short %s = %d;\n", vars->heightname, y);
|
nuclear@2
|
126 fprintf(fp, "\nconst short %s = 16;\n", vars->bppname);
|
nuclear@1
|
127
|
nuclear@1
|
128 fprintf(fp, "\nconst unsigned short %s[] = {\n", vars->arrayname);
|
nuclear@0
|
129
|
nuclear@0
|
130 for(j=0; j<y; j++) {
|
nuclear@0
|
131 fprintf(fp, "\t");
|
nuclear@0
|
132 for(i=0; i<x; i++) {
|
nuclear@0
|
133 unsigned short r = GET_R(*img) >> 3;
|
nuclear@0
|
134 unsigned short g = GET_G(*img) >> 3;
|
nuclear@0
|
135 unsigned short b = GET_B(*img) >> 3;
|
nuclear@0
|
136 unsigned short pixel15 = PACK_COLOR15(r, g, b);
|
nuclear@0
|
137 fprintf(fp, "%u", pixel15);
|
nuclear@0
|
138 if(i < x-1 || j < y-1) {
|
nuclear@0
|
139 fprintf(fp, ", ");
|
nuclear@0
|
140 }
|
nuclear@0
|
141 img++;
|
nuclear@0
|
142 }
|
nuclear@0
|
143 fprintf(fp, "\n");
|
nuclear@0
|
144 }
|
nuclear@0
|
145
|
nuclear@0
|
146 fprintf(fp, "};\n");
|
nuclear@0
|
147 fclose(fp);
|
nuclear@0
|
148 return 0;
|
nuclear@0
|
149 }
|
nuclear@1
|
150
|
nuclear@1
|
151 int parse_args(int argc, char **argv)
|
nuclear@1
|
152 {
|
nuclear@1
|
153 int i;
|
nuclear@1
|
154
|
nuclear@1
|
155 for(i=1; i<argc; i++) {
|
nuclear@1
|
156 if(argv[i][0] == '-') {
|
nuclear@1
|
157 if(argv[i][2] != 0) {
|
nuclear@1
|
158 fprintf(stderr, "invalid option: %s\n", argv[i]);
|
nuclear@1
|
159 goto usage;
|
nuclear@1
|
160 }
|
nuclear@1
|
161 switch(argv[i][1]) {
|
nuclear@1
|
162 case 'o':
|
nuclear@1
|
163 outname_fmt = argv[++i];
|
nuclear@1
|
164 break;
|
nuclear@1
|
165
|
nuclear@1
|
166 case 'n':
|
nuclear@1
|
167 arrayname_fmt = argv[++i];
|
nuclear@1
|
168 break;
|
nuclear@1
|
169
|
nuclear@1
|
170 case 'x':
|
nuclear@1
|
171 widthname_fmt = argv[++i];
|
nuclear@1
|
172 break;
|
nuclear@1
|
173
|
nuclear@1
|
174 case 'y':
|
nuclear@1
|
175 heightname_fmt = argv[++i];
|
nuclear@1
|
176 break;
|
nuclear@1
|
177
|
nuclear@1
|
178 case 'b':
|
nuclear@1
|
179 bppname_fmt = argv[++i];
|
nuclear@1
|
180 break;
|
nuclear@1
|
181
|
nuclear@1
|
182 case 'h':
|
nuclear@1
|
183 hdrname = argv[++i];
|
nuclear@1
|
184 break;
|
nuclear@1
|
185
|
nuclear@1
|
186 default:
|
nuclear@1
|
187 goto usage;
|
nuclear@1
|
188 }
|
nuclear@1
|
189 } else {
|
nuclear@1
|
190 struct imgfile *node;
|
nuclear@1
|
191
|
nuclear@1
|
192 if(!(node = malloc(sizeof *node))) {
|
nuclear@1
|
193 perror("failed to allocate memory");
|
nuclear@1
|
194 return -1;
|
nuclear@1
|
195 }
|
nuclear@1
|
196 if(!(node->fname = malloc(strlen(argv[i]) + 1))) {
|
nuclear@1
|
197 perror("failed to allocate filename");
|
nuclear@1
|
198 free(node);
|
nuclear@1
|
199 return -1;
|
nuclear@1
|
200 }
|
nuclear@1
|
201 strcpy(node->fname, argv[i]);
|
nuclear@1
|
202 node->next = 0;
|
nuclear@1
|
203
|
nuclear@1
|
204 if(flist) {
|
nuclear@1
|
205 ftail->next = node;
|
nuclear@1
|
206 ftail = node;
|
nuclear@1
|
207 } else {
|
nuclear@1
|
208 flist = ftail = node;
|
nuclear@1
|
209 }
|
nuclear@1
|
210 }
|
nuclear@1
|
211 }
|
nuclear@1
|
212 return 0;
|
nuclear@1
|
213
|
nuclear@1
|
214 usage:
|
nuclear@1
|
215 printf("usage: %s [options] <filenames>\n", argv[0]);
|
nuclear@1
|
216 printf("options:\n");
|
nuclear@1
|
217 printf(" -o\toutput filename (def: %%s.img.c)\n");
|
nuclear@1
|
218 printf(" -n\tpixel array name (def: %%s_pixels)\n");
|
nuclear@1
|
219 printf(" -x\twidth var name (def: %%s_width)\n");
|
nuclear@1
|
220 printf(" -y\theight var name (def: %%s_height)\n");
|
nuclear@1
|
221 printf(" -b\tbpp var name (def: %%s_bpp)\n");
|
nuclear@1
|
222 printf(" -h\theader file to append declarations (def: data.h)\n");
|
nuclear@1
|
223 return -1;
|
nuclear@1
|
224 }
|