libdrawtext
changeset 21:c750059a1258
font2glyphmap tool
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Tue, 15 Apr 2014 03:33:39 +0300 |
parents | c091833c2354 |
children | df6d52b36bd6 |
files | src/drawtext.h tools/font2glyphmap/Makefile tools/font2glyphmap/src/font2glyphmap.c |
diffstat | 3 files changed, 139 insertions(+), 1 deletions(-) [+] |
line diff
1.1 --- a/src/drawtext.h Mon Mar 18 06:06:26 2013 +0200 1.2 +++ b/src/drawtext.h Tue Apr 15 03:33:39 2014 +0300 1.3 @@ -82,7 +82,7 @@ 1.4 int dtx_get_glyphmap_height(struct dtx_glyphmap *gmap); 1.5 1.6 /* The following functions can be used even when the library is compiled without 1.7 - * freetype support. (TODO) 1.8 + * freetype support. 1.9 */ 1.10 struct dtx_glyphmap *dtx_load_glyphmap(const char *fname); 1.11 struct dtx_glyphmap *dtx_load_glyphmap_stream(FILE *fp);
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/tools/font2glyphmap/Makefile Tue Apr 15 03:33:39 2014 +0300 2.3 @@ -0,0 +1,24 @@ 2.4 +src = $(wildcard src/*.c) 2.5 +obj = $(src:.c=.o) 2.6 +bin = font2glyphmap 2.7 + 2.8 +CC = gcc 2.9 +CFLAGS = -pedantic -Wall -g -I../../src -I/usr/local/include 2.10 +LDFLAGS = -L. -L/usr/local/lib -ldrawtext 2.11 + 2.12 +ifeq ($(shell uname -s), Darwin) 2.13 + lib_so = libdrawtext.dylib 2.14 +else 2.15 + lib_so = libdrawtext.so.0.0 2.16 +endif 2.17 + 2.18 +$(bin): $(obj) $(lib_so) $(font) 2.19 + $(CC) -o $@ $(obj) $(LDFLAGS) 2.20 + 2.21 +$(lib_so): ../../$(lib_so) 2.22 + rm -f $@ 2.23 + ln -s $< $@ 2.24 + 2.25 +.PHONY: clean 2.26 +clean: 2.27 + rm -f $(obj) $(bin) $(lib_so)
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/tools/font2glyphmap/src/font2glyphmap.c Tue Apr 15 03:33:39 2014 +0300 3.3 @@ -0,0 +1,114 @@ 3.4 +#include <stdio.h> 3.5 +#include <stdlib.h> 3.6 +#include <string.h> 3.7 +#include "drawtext.h" 3.8 + 3.9 +#define SUFFIX "glyphmap" 3.10 + 3.11 +struct coderange { 3.12 + int start, end; 3.13 + struct coderange *next; 3.14 +}; 3.15 + 3.16 +int font2glyphmap(struct dtx_font *font, const char *infname, const char *outfname, int size, int rstart, int rend); 3.17 + 3.18 +int main(int argc, char **argv) 3.19 +{ 3.20 + int i, font_size = 12, suffix_len = strlen(SUFFIX); 3.21 + struct coderange *clist = 0; 3.22 + 3.23 + for(i=1; i<argc; i++) { 3.24 + if(argv[i][0] == '-') { 3.25 + if(strcmp(argv[i], "-range") == 0) { 3.26 + struct coderange *node; 3.27 + int start, end; 3.28 + 3.29 + if(sscanf(argv[++i], "%d-%d", &start, &end) != 2) { 3.30 + fprintf(stderr, "-range must be followed by a range of the form: START-END\n"); 3.31 + return 1; 3.32 + } 3.33 + 3.34 + if(!(node = malloc(sizeof *node))) { 3.35 + perror("failed to allocate memory"); 3.36 + return 1; 3.37 + } 3.38 + node->start = start; 3.39 + node->end = end; 3.40 + node->next = clist; 3.41 + clist = node; 3.42 + } else if(strcmp(argv[i], "-size") == 0) { 3.43 + char *endp; 3.44 + 3.45 + font_size = strtol(argv[++i], &endp, 10); 3.46 + if(endp == argv[i]) { 3.47 + fprintf(stderr, "-size must be followed by the font size\n"); 3.48 + return 1; 3.49 + } 3.50 + } else { 3.51 + fprintf(stderr, "invalid option: %s\n", argv[i]); 3.52 + return 1; 3.53 + } 3.54 + } else { 3.55 + char *basename, *dotptr, *outfile; 3.56 + struct dtx_font *font; 3.57 + 3.58 + if(!(font = dtx_open_font(argv[i], clist ? 0 : font_size))) { 3.59 + fprintf(stderr, "failed to open font file: %s\n", argv[i]); 3.60 + return -1; 3.61 + } 3.62 + 3.63 + basename = alloca(strlen(argv[i]) + suffix_len + 1); 3.64 + strcpy(basename, argv[i]); 3.65 + 3.66 + if((dotptr = strrchr(basename, '.'))) { 3.67 + *dotptr = 0; 3.68 + } 3.69 + 3.70 + outfile = alloca(strlen(basename) + 64); 3.71 + 3.72 + if(clist) { 3.73 + while(clist) { 3.74 + struct coderange *r = clist; 3.75 + clist = clist->next; 3.76 + 3.77 + sprintf(outfile, "%s_s%d_r%d-%d.%s", basename, font_size, r->start, r->end, SUFFIX); 3.78 + font2glyphmap(font, argv[i], outfile, font_size, r->start, r->end); 3.79 + 3.80 + free(r); 3.81 + } 3.82 + clist = 0; 3.83 + } else { 3.84 + sprintf(outfile, "%s_s%d.%s", basename, font_size, SUFFIX); 3.85 + font2glyphmap(font, argv[i], outfile, font_size, -1, -1); 3.86 + } 3.87 + } 3.88 + } 3.89 + 3.90 + return 0; 3.91 +} 3.92 + 3.93 +int font2glyphmap(struct dtx_font *font, const char *infname, const char *outfname, int size, int rstart, int rend) 3.94 +{ 3.95 + struct dtx_glyphmap *gmap; 3.96 + 3.97 + if(rstart != -1) { 3.98 + dtx_prepare_range(font, size, rstart, rend); 3.99 + if(!(gmap = dtx_get_font_glyphmap(font, size, rstart))) { 3.100 + fprintf(stderr, "failed to retrieve unicode glyphmap (code range: %d-%d)\n", rstart, rend); 3.101 + return -1; 3.102 + } 3.103 + } else { 3.104 + dtx_prepare(font, size); 3.105 + if(!(gmap = dtx_get_font_glyphmap(font, size, ' '))) { 3.106 + fprintf(stderr, "failed to retrieve ASCII glyphmap!\n"); 3.107 + return -1; 3.108 + } 3.109 + } 3.110 + 3.111 + if(dtx_save_glyphmap(outfname, gmap) == -1) { 3.112 + fprintf(stderr, "failed to save glyphmap to: %s\n", outfname); 3.113 + return -1; 3.114 + } 3.115 + 3.116 + return 0; 3.117 +}