diff options
Diffstat (limited to 'pdf/glyphdump.py')
-rwxr-xr-x | pdf/glyphdump.py | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/pdf/glyphdump.py b/pdf/glyphdump.py new file mode 100755 index 00000000..25b2afcc --- /dev/null +++ b/pdf/glyphdump.py @@ -0,0 +1,126 @@ +#!/usr/bin/python + +import sys + +agl = [] +comments = [] +agltab = [] +aglmap = {} +aglnames = [] + +f = open("glyphlist.txt", "r") +for line in f.readlines(): + if line[0] == '#': + comments.append(line.strip()); + continue + line = line[:-1] + name, list = line.split(';') + list = map(lambda x: int(x, 16), list.split(' ')) + agl.append((name, list)) + +for name, ucslist in agl: + num = len(ucslist) + ucs = ucslist[0] + agltab.append((name, ucs)) + if ucs not in aglmap: + aglmap[ucs] = [] + aglmap[ucs].append(name) + +print "/*" +for line in comments: + print line +print "*/" +print + +agltab.sort() +print "static const struct { char *name; int ucs; }" +print "aglcodes[] = {" +for name, ucs in agltab: + print "{\"%s\", 0x%04X}," % (name, ucs) +print "};" +print + +keys = aglmap.keys() +keys.sort() +print "static const struct { int ucs; int ofs; }" +print "agldupcodes[] = {" +for ucs in keys: + namelist = aglmap[ucs] + ofs = len(aglnames) + if len(namelist) > 1: + print "{0x%04X, %d}," % (ucs, ofs) + for name in namelist: + aglnames.append(name) + aglnames.append(0) +print "};" +print + +print "static char *agldupnames[] = {" +for name in aglnames: + if name: + print ("\"%s\"," % name), + else: + print "0," +print "};" +print + +print """ +#include "fitz.h" +#include "mupdf.h" + +int pdf_lookupagl(char *name) +{ + char buf[64]; + char *p; + int l = 0; + int r = nelem(aglcodes) - 1; + + fz_strlcpy(buf, name, sizeof buf); + + /* kill anything after first period and underscore */ + p = strchr(buf, '.'); + if (p) p[0] = 0; + p = strchr(buf, '_'); + if (p) p[0] = 0; + + while (l <= r) + { + int m = (l + r) >> 1; + int c = strcmp(buf, aglcodes[m].name); + if (c < 0) + r = m - 1; + else if (c > 0) + l = m + 1; + else + return aglcodes[m].ucs; + } + + if (strstr(buf, "uni") == buf) + return strtol(buf + 3, nil, 16); + else if (strstr(buf, "u") == buf) + return strtol(buf + 1, nil, 16); + else if (strstr(buf, "a") == buf && strlen(buf) >= 3) + return strtol(buf + 1, nil, 10); + + return 0; +} + +static char *aglnoname[1] = { 0 }; + +char **pdf_lookupaglnames(int ucs) +{ + int l = 0; + int r = nelem(agldupcodes) - 1; + while (l <= r) + { + int m = (l + r) >> 1; + if (ucs < agldupcodes[m].ucs) + r = m - 1; + else if (ucs > agldupcodes[m].ucs) + l = m + 1; + else + return agldupnames + agldupcodes[m].ofs; + } + return aglnoname; +} +""" |