img2gba

annotate src/imgconv.c @ 2:5f314b692d9e

fixed missing semi-colons in generated source
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 27 Jun 2014 06:34:58 +0300
parents eb9334da7c80
children
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 }