summaryrefslogtreecommitdiff
path: root/fonts/punknova/tools/build.py
diff options
context:
space:
mode:
Diffstat (limited to 'fonts/punknova/tools/build.py')
-rwxr-xr-xfonts/punknova/tools/build.py221
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)