diff options
Diffstat (limited to 'misc/pylib/robofab/tools/toolsAll.py')
-rwxr-xr-x | misc/pylib/robofab/tools/toolsAll.py | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/misc/pylib/robofab/tools/toolsAll.py b/misc/pylib/robofab/tools/toolsAll.py new file mode 100755 index 000000000..d729fe770 --- /dev/null +++ b/misc/pylib/robofab/tools/toolsAll.py @@ -0,0 +1,145 @@ +"""A collection of non-environment specific tools""" + + +import sys +import os +from robofab.objects.objectsRF import RInfo + +if sys.platform == "darwin" and sys.version_info[:3] == (2, 2, 0): + # the Mac support of Jaguar's Python 2.2 is broken + have_broken_macsupport = 1 +else: + have_broken_macsupport = 0 + + +def readGlyphConstructions(): + """read GlyphConstruction and turn it into a dict""" + from robofab.tools.glyphConstruction import _glyphConstruction + data = _glyphConstruction.split("\n") + glyphConstructions = {} + for i in data: + if len(i) == 0: continue + if i[0] != '#': + name = i.split(': ')[0] + construction = i.split(': ')[1].split(' ') + build = [construction[0]] + for c in construction[1:]: + accent = c.split('.')[0] + position = c.split('.')[1] + build.append((accent, position)) + glyphConstructions[name] = build + return glyphConstructions + +# +# +# glyph.unicode: ttFont["cmap"].getcmap(3, 1) +# +# + +def guessFileType(fileName): + if not os.path.exists(fileName): + return None + base, ext = os.path.splitext(fileName) + ext = ext.lower() + if not have_broken_macsupport: + try: + import MacOS + except ImportError: + pass + else: + cr, tp = MacOS.GetCreatorAndType(fileName) + if tp in ("sfnt", "FFIL"): + return "TTF" + if tp == "LWFN": + return "Type 1" + if ext == ".dfont": + return "TTF" + if ext in (".otf", ".ttf"): + return "TTF" + if ext in (".pfb", ".pfa"): + return "Type 1" + return None + +def extractTTFFontInfo(font): + # UFO.info attribute name / index. + # name table entries index according to http://www.microsoft.com/typography/otspec/name.htm + attrs = [ + ('copyright', 0), + ('familyName', 1), + ('styleMapStyleName', 2), + ('postscriptFullName', 4), + ('trademark', 7), + ('openTypeNameDesigner', 9), + ('openTypeNameLicenseURL', 14), + ('openTypeNameDesignerURL', 12), + ] + info = RInfo() + names = font['name'] + info.ascender = font['hhea'].ascent + info.descender = font['hhea'].descent + info.unitsPerEm = font['head'].unitsPerEm + for name, index in attrs: + entry = font["name"].getName(index, 3, 1, 0x409) + if entry is not None: + try: + value = unicode(entry.string, "utf_16_be") + if name == "styleMapStyleName": + value = value.lower() + setattr(info, name, value) + except Exception, e: + print "Error importing value %s: %s: %s"%(str(name), value, e.message) + return info + +def extractT1FontInfo(font): + info = RInfo() + src = font.font['FontInfo'] + factor = font.font['FontMatrix'][0] + assert factor > 0 + info.unitsPerEm = int(round(1/factor, 0)) + # assume something for ascender descender + info.ascender = (info.unitsPerEm / 5) * 4 + info.descender = info.ascender - info.unitsPerEm + info.versionMajor = font.font['FontInfo']['version'] + info.fullName = font.font['FontInfo']['FullName'] + info.familyName = font.font['FontInfo']['FullName'].split("-")[0] + info.notice = unicode(font.font['FontInfo']['Notice'], "macroman") + info.italicAngle = font.font['FontInfo']['ItalicAngle'] + info.uniqueID = font['UniqueID'] + return info + +def fontToUFO(src, dst, fileType=None): + from robofab.ufoLib import UFOWriter + from robofab.pens.adapterPens import SegmentToPointPen + if fileType is None: + fileType = guessFileType(src) + if fileType is None: + raise ValueError, "Can't determine input file type" + ufoWriter = UFOWriter(dst) + if fileType == "TTF": + from fontTools.ttLib import TTFont + font = TTFont(src, 0) + elif fileType == "Type 1": + from fontTools.t1Lib import T1Font + font = T1Font(src) + else: + assert 0, "unknown file type: %r" % fileType + inGlyphSet = font.getGlyphSet() + outGlyphSet = ufoWriter.getGlyphSet() + for glyphName in inGlyphSet.keys(): + print "-", glyphName + glyph = inGlyphSet[glyphName] + def drawPoints(pen): + pen = SegmentToPointPen(pen) + glyph.draw(pen) + outGlyphSet.writeGlyph(glyphName, glyph, drawPoints) + outGlyphSet.writeContents() + if fileType == "TTF": + info = extractTTFFontInfo(font) + elif fileType == "Type 1": + info = extractT1FontInfo(font) + ufoWriter.writeInfo(info) + +if __name__ == "__main__": + print readGlyphConstructions() + +
\ No newline at end of file |