nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@1: #include nuclear@0: #include nuclear@0: nuclear@1: struct imgfile { nuclear@1: char *fname; nuclear@1: struct imgfile *next; nuclear@1: }; nuclear@1: nuclear@1: struct varnames { nuclear@1: char *arrayname; nuclear@1: char *widthname, *heightname; nuclear@1: char *bppname; nuclear@1: }; nuclear@1: nuclear@1: int save_image15(unsigned int *img, int x, int y, const char *fname, struct varnames *vars); nuclear@1: int parse_args(int argc, char **argv); nuclear@1: nuclear@1: struct imgfile *flist, *ftail; nuclear@1: const char *outname_fmt = "%s.img.c"; nuclear@1: const char *arrayname_fmt = "%s_pixels"; nuclear@1: const char *widthname_fmt = "%s_width"; nuclear@1: const char *heightname_fmt = "%s_height"; nuclear@1: const char *bppname_fmt = "%s_bpp"; nuclear@1: const char *hdrname = "data.h"; nuclear@1: nuclear@1: FILE *hdrfile; nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@1: struct varnames vars; nuclear@1: char *outname; nuclear@0: nuclear@1: if(parse_args(argc, argv) == -1) { nuclear@1: return 1; nuclear@0: } nuclear@0: nuclear@1: if(!flist) { nuclear@1: fprintf(stderr, "you didn't specify any files to convert\n"); nuclear@1: return 1; nuclear@1: } nuclear@0: nuclear@1: if(!(hdrfile = fopen(hdrname, "w"))) { nuclear@1: fprintf(stderr, "failed to write header file: %s: %s\n", hdrname, strerror(errno)); nuclear@1: return 1; nuclear@1: } nuclear@1: fprintf(hdrfile, "#ifndef IMG2GBA_DATAFILE_DECLARATIONS_H_\n"); nuclear@1: fprintf(hdrfile, "#define IMG2GBA_DATAFILE_DECLARATIONS_H_\n\n"); nuclear@1: nuclear@1: while(flist) { nuclear@1: char *suffix; nuclear@1: int x, y, namelen; nuclear@1: unsigned int *img; nuclear@1: nuclear@1: struct imgfile *imgfile = flist; nuclear@1: flist = flist->next; nuclear@1: nuclear@1: printf("converting: %s ...\n", imgfile->fname); nuclear@1: nuclear@1: if(!(img = img_load_pixels(imgfile->fname, &x, &y, IMG_FMT_RGBA32))) { nuclear@1: continue; nuclear@0: } nuclear@0: nuclear@1: if((suffix = strrchr(imgfile->fname, '.'))) { nuclear@1: *suffix = 0; nuclear@0: } nuclear@1: namelen = strlen(imgfile->fname); nuclear@1: nuclear@1: outname = malloc(namelen + strlen(outname_fmt) + 1); nuclear@1: vars.arrayname = malloc(namelen + strlen(arrayname_fmt) + 1); nuclear@1: vars.widthname = malloc(namelen + strlen(widthname_fmt) + 1); nuclear@1: vars.heightname = malloc(namelen + strlen(heightname_fmt) + 1); nuclear@1: vars.bppname = malloc(namelen + strlen(bppname_fmt) + 1); nuclear@1: nuclear@1: sprintf(outname, outname_fmt, imgfile->fname); nuclear@1: sprintf(vars.arrayname, arrayname_fmt, imgfile->fname); nuclear@1: sprintf(vars.widthname, widthname_fmt, imgfile->fname); nuclear@1: sprintf(vars.heightname, heightname_fmt, imgfile->fname); nuclear@1: sprintf(vars.bppname, bppname_fmt, imgfile->fname); nuclear@1: nuclear@1: if(save_image15(img, x, y, outname, &vars) == -1) { nuclear@1: fprintf(stderr, "could not save as %s\n", outname); nuclear@1: } nuclear@1: nuclear@1: free(outname); nuclear@1: free(vars.arrayname); nuclear@1: free(vars.widthname); nuclear@1: free(vars.heightname); nuclear@1: free(vars.bppname); nuclear@1: nuclear@1: free(imgfile); nuclear@0: nuclear@0: img_free_pixels(img); nuclear@0: } nuclear@1: nuclear@1: fprintf(hdrfile, "\n#endif\n"); nuclear@1: fclose(hdrfile); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: #define GET_R(pixel) (((pixel) >> 16) & 0xff) nuclear@0: #define GET_G(pixel) (((pixel) >> 8) & 0xff) nuclear@0: #define GET_B(pixel) (((pixel) >> 0) & 0xff) nuclear@0: nuclear@0: #define PACK_COLOR15(r, g, b) ((((r) & 0x1f) << 10) | (((g) & 0x1f) << 5) | ((b) & 0x1f)) nuclear@0: nuclear@1: int save_image15(unsigned int *img, int x, int y, const char *fname, struct varnames *vars) nuclear@0: { nuclear@0: int i, j; nuclear@0: FILE *fp; nuclear@0: nuclear@1: fprintf(hdrfile, "extern const short %s;\n", vars->widthname); nuclear@1: fprintf(hdrfile, "extern const short %s;\n", vars->heightname); nuclear@1: fprintf(hdrfile, "extern const short %s;\n", vars->bppname); nuclear@1: fprintf(hdrfile, "extern const unsigned short %s[%d * %d];\n", vars->arrayname, x, y); nuclear@1: nuclear@0: if(!(fp = fopen(fname, "w"))) { nuclear@1: fprintf(stderr, "failed to write file: %s: %s\n", fname, strerror(errno)); nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@2: fprintf(fp, "\nconst short %s = %d;\n", vars->widthname, x); nuclear@2: fprintf(fp, "\nconst short %s = %d;\n", vars->heightname, y); nuclear@2: fprintf(fp, "\nconst short %s = 16;\n", vars->bppname); nuclear@1: nuclear@1: fprintf(fp, "\nconst unsigned short %s[] = {\n", vars->arrayname); nuclear@0: nuclear@0: for(j=0; j> 3; nuclear@0: unsigned short g = GET_G(*img) >> 3; nuclear@0: unsigned short b = GET_B(*img) >> 3; nuclear@0: unsigned short pixel15 = PACK_COLOR15(r, g, b); nuclear@0: fprintf(fp, "%u", pixel15); nuclear@0: if(i < x-1 || j < y-1) { nuclear@0: fprintf(fp, ", "); nuclear@0: } nuclear@0: img++; nuclear@0: } nuclear@0: fprintf(fp, "\n"); nuclear@0: } nuclear@0: nuclear@0: fprintf(fp, "};\n"); nuclear@0: fclose(fp); nuclear@0: return 0; nuclear@0: } nuclear@1: nuclear@1: int parse_args(int argc, char **argv) nuclear@1: { nuclear@1: int i; nuclear@1: nuclear@1: for(i=1; ifname = malloc(strlen(argv[i]) + 1))) { nuclear@1: perror("failed to allocate filename"); nuclear@1: free(node); nuclear@1: return -1; nuclear@1: } nuclear@1: strcpy(node->fname, argv[i]); nuclear@1: node->next = 0; nuclear@1: nuclear@1: if(flist) { nuclear@1: ftail->next = node; nuclear@1: ftail = node; nuclear@1: } else { nuclear@1: flist = ftail = node; nuclear@1: } nuclear@1: } nuclear@1: } nuclear@1: return 0; nuclear@1: nuclear@1: usage: nuclear@1: printf("usage: %s [options] \n", argv[0]); nuclear@1: printf("options:\n"); nuclear@1: printf(" -o\toutput filename (def: %%s.img.c)\n"); nuclear@1: printf(" -n\tpixel array name (def: %%s_pixels)\n"); nuclear@1: printf(" -x\twidth var name (def: %%s_width)\n"); nuclear@1: printf(" -y\theight var name (def: %%s_height)\n"); nuclear@1: printf(" -b\tbpp var name (def: %%s_bpp)\n"); nuclear@1: printf(" -h\theader file to append declarations (def: data.h)\n"); nuclear@1: return -1; nuclear@1: }