nuclear@21: #include nuclear@21: #include nuclear@21: #include nuclear@21: #include "drawtext.h" nuclear@21: nuclear@21: #define SUFFIX "glyphmap" nuclear@21: nuclear@21: struct coderange { nuclear@21: int start, end; nuclear@21: struct coderange *next; nuclear@21: }; nuclear@21: nuclear@21: int font2glyphmap(struct dtx_font *font, const char *infname, const char *outfname, int size, int rstart, int rend); nuclear@21: nuclear@21: int main(int argc, char **argv) nuclear@21: { nuclear@21: int i, font_size = 12, suffix_len = strlen(SUFFIX); nuclear@21: struct coderange *clist = 0; nuclear@21: nuclear@21: for(i=1; istart = start; nuclear@21: node->end = end; nuclear@21: node->next = clist; nuclear@21: clist = node; nuclear@21: } else if(strcmp(argv[i], "-size") == 0) { nuclear@21: char *endp; nuclear@21: nuclear@21: font_size = strtol(argv[++i], &endp, 10); nuclear@21: if(endp == argv[i]) { nuclear@21: fprintf(stderr, "-size must be followed by the font size\n"); nuclear@21: return 1; nuclear@21: } nuclear@21: } else { nuclear@21: fprintf(stderr, "invalid option: %s\n", argv[i]); nuclear@21: return 1; nuclear@21: } nuclear@21: } else { nuclear@21: char *basename, *dotptr, *outfile; nuclear@21: struct dtx_font *font; nuclear@21: nuclear@21: if(!(font = dtx_open_font(argv[i], clist ? 0 : font_size))) { nuclear@21: fprintf(stderr, "failed to open font file: %s\n", argv[i]); nuclear@21: return -1; nuclear@21: } nuclear@21: nuclear@21: basename = alloca(strlen(argv[i]) + suffix_len + 1); nuclear@21: strcpy(basename, argv[i]); nuclear@21: nuclear@21: if((dotptr = strrchr(basename, '.'))) { nuclear@21: *dotptr = 0; nuclear@21: } nuclear@21: nuclear@21: outfile = alloca(strlen(basename) + 64); nuclear@21: nuclear@21: if(clist) { nuclear@21: while(clist) { nuclear@21: struct coderange *r = clist; nuclear@21: clist = clist->next; nuclear@21: nuclear@34: sprintf(outfile, "%s_s%d_r%04x-%04x.%s", basename, font_size, r->start, r->end, SUFFIX); nuclear@21: font2glyphmap(font, argv[i], outfile, font_size, r->start, r->end); nuclear@21: nuclear@21: free(r); nuclear@21: } nuclear@21: clist = 0; nuclear@21: } else { nuclear@21: sprintf(outfile, "%s_s%d.%s", basename, font_size, SUFFIX); nuclear@21: font2glyphmap(font, argv[i], outfile, font_size, -1, -1); nuclear@21: } nuclear@21: } nuclear@21: } nuclear@21: nuclear@21: return 0; nuclear@21: } nuclear@21: nuclear@21: int font2glyphmap(struct dtx_font *font, const char *infname, const char *outfname, int size, int rstart, int rend) nuclear@21: { nuclear@21: struct dtx_glyphmap *gmap; nuclear@21: nuclear@21: if(rstart != -1) { nuclear@21: dtx_prepare_range(font, size, rstart, rend); nuclear@21: if(!(gmap = dtx_get_font_glyphmap(font, size, rstart))) { nuclear@21: fprintf(stderr, "failed to retrieve unicode glyphmap (code range: %d-%d)\n", rstart, rend); nuclear@21: return -1; nuclear@21: } nuclear@21: } else { nuclear@21: dtx_prepare(font, size); nuclear@21: if(!(gmap = dtx_get_font_glyphmap(font, size, ' '))) { nuclear@21: fprintf(stderr, "failed to retrieve ASCII glyphmap!\n"); nuclear@21: return -1; nuclear@21: } nuclear@21: } nuclear@21: nuclear@21: if(dtx_save_glyphmap(outfname, gmap) == -1) { nuclear@21: fprintf(stderr, "failed to save glyphmap to: %s\n", outfname); nuclear@21: return -1; nuclear@21: } nuclear@21: nuclear@21: return 0; nuclear@21: }