diff options
Diffstat (limited to 'fonts/punknova/tools/build.py')
-rwxr-xr-x | fonts/punknova/tools/build.py | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/fonts/punknova/tools/build.py b/fonts/punknova/tools/build.py new file mode 100755 index 0000000000..b98af0638e --- /dev/null +++ b/fonts/punknova/tools/build.py @@ -0,0 +1,221 @@ +#!/usr/bin/python + +import os +import sys +import fontforge +import glob +import subprocess +import tempfile +import shutil as sh + +def run_mpost(file, tempdir): + subprocess.call( + ['mpost', + '&mfplain', + '\mode=localfont;', + 'scale_factor:=100.375;', + 'outputtemplate:="%c.eps";', + 'input %s;' % file, + 'bye'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE, + cwd=tempdir, + ) + +def import_glyphs(font, instance, tempdir): + print "Importing glyph variants set '%s'" % instance + + glyph_files = glob.glob(os.path.join(tempdir, "*.eps")) + + for file in glyph_files: + code = int(os.path.splitext(os.path.basename(file))[0]) + char = unichr(code) + + if char.isupper() and int(instance) > 15: + continue + + if not char.isupper() and not char.islower() and int(instance) > 7: + continue + + if instance == "0": + glyph = font.createChar(code) + else: + glyph = font.createChar(-1, font[code].glyphname+"."+instance) + + glyph.importOutlines(file, ("toobigwarn", "correctdir", "handle_eraser")) + +def do_instances(font, instances, mpfile, tempdir): + for instance in range(instances): + instance = str(instance) + instance_dir = os.path.join(tempdir, instance) + os.mkdir (instance_dir) + run_mpost (mpfile, instance_dir) + import_glyphs(font, instance, instance_dir) + +def get_alt(code, name): + instances = 8 + alt = () + char = unichr(code) + + if char.islower(): + instances = 32 + elif char.isupper(): + instances = 16 + + for i in range(1,instances): + alt = alt + ("%s.%d" %(name, i),) + + return alt + +def add_gsub(font, instances): + print "Adding glyph substitution rules..." + + font.addLookup( + "Randomize lookup", + "gsub_alternate", + (), + ( + ('rand', + ( + ('DFLT', ('dflt',)), + ('grek', ('dflt',)), + ('latn', ('dflt',)) + ) + ), + )) + font.addLookupSubtable("Randomize lookup", "Randomize subtable") + + for glyph in font.glyphs(): + if glyph.unicode != -1: + glyph.addPosSub("Randomize subtable", + get_alt(glyph.unicode, glyph.glyphname)) + +def greek_caps(font, instances): + print "Adding missing Greek capitals..." + + caps = { + "Alpha" : "A", + "Beta" : "B", + "Epsilon": "E", + "Zeta" : "Z", + "Eta" : "H", + "Iota" : "I", + "Kappa" : "K", + "Mu" : "M", + "Nu" : "N", + "Omicron": "O", + "Rho" : "P", + "Tau" : "T", + "Chi" : "X" + } + for c in caps: + name = caps[c] + glyph = font.createChar(-1, c) + glyph.addReference(name) + glyph.useRefsMetrics(name) + glyph.unlinkRef() + glyph.addPosSub("Randomize subtable", + get_alt(font.createMappedChar(name).unicode, name)) + +def autowidth(font): + print "Auto spacing..." + + font.selection.all() + if font.fullname.find("Slanted"): + font.autoWidth(40, 0, 20) + else: + font.autoWidth(70, 10, 40) + font.round() # this one is needed to make simplify more reliable + font.simplify() + font.removeOverlap() + font.round() + font.autoHint() + +def autokern(font, instances): + print "Auto kerning..." + + font.addLookup( + "Kern lookup", + "gpos_pair", + (), + ( + ('kern', + ( + ('DFLT', ('dflt',)), + ('grek', ('dflt',)), + ('latn', ('dflt',)) + ) + ), + )) + font.addLookupSubtable("Kern lookup", "Kern subtable") + + list1 = ["A", "V", "a", "v", "W", "w", "o", "O", "T", "L", "Y", "l", "y"] + list2 = [ ] + + for a in list1: + list2.append(a) + alt = get_alt(font.createMappedChar(a).unicode, a) + for b in alt: + list2.append(b) + + list1 = list2 + + font.autoKern("Kern subtable", 150, list1, list2, onlyCloser=True) + +def finalise(font): + space = font.createChar(32) + space.width = 400 + +def usage(): + print "Usage: %s INFILE.mp OUTFILE.otf VERSION" % sys.argv[0] + +if __name__ == "__main__": + if len(sys.argv) < 3: + usage() + sys.exit() + + infile = sys.argv[1] + outfile = sys.argv[2] + version = sys.argv[3] + + basefile = os.path.basename(infile) + + style = basefile.split("-")[1] + style = os.path.splitext(style)[0].title() + if style == "Boldslanted": + style = "Bold Slanted" + + tempdir = tempfile.mkdtemp() + mpfile = os.path.abspath(infile) + instances = 32 + + font = fontforge.font() + + if style != "Regular": + font.fontname = "PunkNova-%s" % style.replace(" ", "") + font.fullname = "Punk Nova %s" % style + else: + font.fontname = "PunkNova" + font.fullname = "Punk Nova" + + font.familyname = "Punk Nova" + font.weight = style + font.version = '00%.03f' %(float(version)/1000) + font.encoding = "Unicode" + + font.copyright = "Unlimited copying and redistribution of this file are\ + permitted as long as this file is not modified. Modifications are permitted,\ + but only if the resulting file is not named '%s' and the (internal) fontname\ + differs from '%s'." % (outfile, font.familyname) + + do_instances(font, instances, mpfile, tempdir) + add_gsub (font, instances) + greek_caps (font, instances) + autowidth (font) + autokern (font, instances) + finalise (font) + + sh.rmtree (tempdir) + + print "Saving file '%s'..." % outfile +# font.save() + font.generate(outfile) |