diff options
author | Rasmus Andersson <rasmus@notion.se> | 2018-09-03 22:55:49 +0300 |
---|---|---|
committer | Rasmus Andersson <rasmus@notion.se> | 2018-09-03 22:55:49 +0300 |
commit | c833e252c925e8dd68108660710ca835d95daa6f (patch) | |
tree | 6b2e28264ed45efd7f054e453b622098d0d875b8 /misc/pylib/extractor/formats/type1.py | |
parent | 8c1a4c181ef12000179dfec541f1af87e9b03122 (diff) | |
download | inter-c833e252c925e8dd68108660710ca835d95daa6f.tar.xz |
Major overhaul, moving from UFO2 to Glyphs and UFO3, plus a brand new and much simpler fontbuild
Diffstat (limited to 'misc/pylib/extractor/formats/type1.py')
-rwxr-xr-x | misc/pylib/extractor/formats/type1.py | 164 |
1 files changed, 0 insertions, 164 deletions
diff --git a/misc/pylib/extractor/formats/type1.py b/misc/pylib/extractor/formats/type1.py deleted file mode 100755 index ca3f76741..000000000 --- a/misc/pylib/extractor/formats/type1.py +++ /dev/null @@ -1,164 +0,0 @@ -from fontTools.t1Lib import T1Font, T1Error -from fontTools.agl import AGL2UV -from fontTools.misc.psLib import PSInterpreter -from fontTools.misc.transform import Transform -from extractor.tools import RelaxedInfo - -# specification: http://partners.adobe.com/public/developer/en/font/T1_SPEC.PDF - -# ---------------- -# Public Functions -# ---------------- - -def isType1(pathOrFile): - try: - font = T1Font(pathOrFile) - del font - except T1Error: - return False - return True - -def extractFontFromType1(pathOrFile, destination, doGlyphs=True, doInfo=True, doKerning=True, customFunctions=[]): - source = T1Font(pathOrFile) - destination.lib["public.glyphOrder"] = _extractType1GlyphOrder(source) - if doInfo: - extractType1Info(source, destination) - if doGlyphs: - extractType1Glyphs(source, destination) - if doKerning: - # kerning extraction is not supported yet. - # in theory, it could be retried from an AFM. - # we need to find the AFM naming rules so that we can sniff for the file. - pass - for function in customFunctions: - function(source, destination) - -def extractType1Info(source, destination): - info = RelaxedInfo(destination.info) - _extractType1FontInfo(source, info) - _extractType1Private(source, info) - _extractType1FontMatrix(source, info) - -# ---- -# Info -# ---- - -def _extractType1FontInfo(source, info): - sourceInfo = source["FontInfo"] - # FontName - info.postscriptFontName = source["FontName"] - # version - version = sourceInfo.get("version") - if version is not None: - # the spec says that version will be a string and no formatting info is given. - # so, only move forward if the string can actually be parsed. - try: - # 1. convert to a float - version = float(version) - # 2. convert it back to a string - version = "%.3f" % version - # 3. split. - versionMajor, versionMinor = version.split(".") - # 4. convert. - versionMajor = int(versionMajor) - versionMinor = int(versionMinor) - # 5. set. - info.versionMajor = int(versionMajor) - info.versionMinor = int(versionMinor) - except ValueError: - # couldn't parse. leve the object with the default values. - pass - # Notice - notice = sourceInfo.get("Notice") - if notice: - info.copyright = notice - # FullName - fullName = sourceInfo.get("FullName") - if fullName: - info.postscriptFullName = fullName - # FamilyName - familyName = sourceInfo.get("FamilyName") - if familyName: - info.familyName = familyName - # Weight - postscriptWeightName = sourceInfo.get("Weight") - if postscriptWeightName: - info.postscriptWeightName = postscriptWeightName - # ItalicAngle - info.italicAngle = sourceInfo.get("ItalicAngle") - # IsFixedPitch - info.postscriptIsFixedPitch = sourceInfo.get("isFixedPitch") - # UnderlinePosition/Thickness - info.postscriptUnderlinePosition = sourceInfo.get("UnderlinePosition") - info.postscriptUnderlineThickness = sourceInfo.get("UnderlineThickness") - -def _extractType1FontMatrix(source, info): - # units per em - matrix = source["FontMatrix"] - matrix = Transform(*matrix).inverse() - info.unitsPerEm = int(round(matrix[3])) - -def _extractType1Private(source, info): - private = source["Private"] - # UniqueID - info.openTypeNameUniqueID = private.get("UniqueID", None) - # BlueValues and OtherBlues - info.postscriptBlueValues = private.get("BlueValues", []) - info.postscriptOtherBlues = private.get("OtherBlues", []) - # FamilyBlues and FamilyOtherBlues - info.postscriptFamilyBlues = private.get("FamilyBlues", []) - info.postscriptFamilyOtherBlues = private.get("FamilyOtherBlues", []) - # BlueScale/Shift/Fuzz - info.postscriptBlueScale = private.get("BlueScale", None) - info.postscriptBlueShift = private.get("BlueShift", None) - info.postscriptBlueFuzz = private.get("BlueFuzz", None) - # StemSnapH/V - info.postscriptStemSnapH = private.get("StemSnapH", []) - info.postscriptStemSnapV = private.get("StemSnapV", []) - # ForceBold - info.postscriptForceBold = bool(private.get("ForceBold", None)) - -# -------- -# Outlines -# -------- - -def extractType1Glyphs(source, destination): - glyphSet = source.getGlyphSet() - for glyphName in sorted(glyphSet.keys()): - sourceGlyph = glyphSet[glyphName] - # make the new glyph - destination.newGlyph(glyphName) - destinationGlyph = destination[glyphName] - # outlines - pen = destinationGlyph.getPen() - sourceGlyph.draw(pen) - # width - destinationGlyph.width = sourceGlyph.width - # synthesize the unicode value - destinationGlyph.unicode = AGL2UV.get(glyphName) - -# ----------- -# Glyph order -# ----------- - -class GlyphOrderPSInterpreter(PSInterpreter): - - def __init__(self): - PSInterpreter.__init__(self) - self.glyphOrder = [] - self.collectTokenForGlyphOrder = False - - def do_literal(self, token): - result = PSInterpreter.do_literal(self, token) - if token == "/FontName": - self.collectTokenForGlyphOrder = False - if self.collectTokenForGlyphOrder: - self.glyphOrder.append(result.value) - if token == "/CharStrings": - self.collectTokenForGlyphOrder = True - return result - -def _extractType1GlyphOrder(t1Font): - interpreter = GlyphOrderPSInterpreter() - interpreter.interpret(t1Font.data) - return interpreter.glyphOrder |