Cython is used to compile some hot paths into native Python extensions. These hot paths were identified through running ufocompile with the hotshot profiler and then converting file by file to Cython, starting with the "hottest" paths and continuing until returns were deminishing. This means that only a few Python files were converted to Cython. Closes #23 Closes #20 (really this time)
74 lines
2.1 KiB
Python
Executable file
74 lines
2.1 KiB
Python
Executable file
"""Tools for importing GLIFs into FontLab"""
|
|
|
|
import os
|
|
from FL import fl
|
|
from robofab.tools.toolsFL import NewGlyph, FontIndex
|
|
from robofab.pens.flPen import FLPointPen
|
|
from robofab.glifLib import GlyphSet
|
|
from robofab.interface.all.dialogs import ProgressBar, GetFolder
|
|
|
|
|
|
class GlyphPlaceholder:
|
|
pass
|
|
|
|
|
|
def importAllGlifFiles(font, dirName=None, doProgress=True, bar=None):
|
|
"""import all GLIFs into a FontLab font"""
|
|
if dirName is None:
|
|
if font.file_name:
|
|
dir, base = os.path.split(font.file_name)
|
|
base = base.split(".")[0] + ".glyphs"
|
|
dirName = os.path.join(dir, base)
|
|
else:
|
|
dirName = GetFolder("Please select a folder with .glif files")
|
|
glyphSet = GlyphSet(dirName)
|
|
glyphNames = glyphSet.keys()
|
|
glyphNames.sort()
|
|
barStart = 0
|
|
closeBar = False
|
|
if doProgress:
|
|
if not bar:
|
|
bar = ProgressBar("Importing Glyphs", len(glyphNames))
|
|
closeBar = True
|
|
else:
|
|
barStart = bar.getCurrentTick()
|
|
else:
|
|
bar = None
|
|
try:
|
|
for i in range(len(glyphNames)):
|
|
#if not (i % 10) and not bar.tick(barStart + i):
|
|
# raise KeyboardInterrupt
|
|
glyphName = glyphNames[i]
|
|
flGlyph = NewGlyph(font, glyphName, clear=True)
|
|
pen = FLPointPen(flGlyph)
|
|
glyph = GlyphPlaceholder()
|
|
glyphSet.readGlyph(glyphName, glyph, pen)
|
|
if hasattr(glyph, "width"):
|
|
flGlyph.width = int(round(glyph.width))
|
|
if hasattr(glyph, "unicodes"):
|
|
flGlyph.unicodes = glyph.unicodes
|
|
if hasattr(glyph, "note"):
|
|
flGlyph.note = glyph.note # XXX must encode
|
|
if hasattr(glyph, "lib"):
|
|
from cStringIO import StringIO
|
|
from robofab.plistlib import writePlist
|
|
lib = glyph.lib
|
|
if lib:
|
|
if len(lib) == 1 and "org.robofab.fontlab.customdata" in lib:
|
|
data = lib["org.robofab.fontlab.customdata"].data
|
|
else:
|
|
f = StringIO()
|
|
writePlist(glyph.lib, f)
|
|
data = f.getvalue()
|
|
flGlyph.customdata = data
|
|
# XXX the next bit is only correct when font is the current font :-(
|
|
fl.UpdateGlyph(font.FindGlyph(glyphName))
|
|
if bar and not i % 10:
|
|
bar.tick(barStart + i)
|
|
except KeyboardInterrupt:
|
|
if bar:
|
|
bar.close()
|
|
bar = None
|
|
fl.UpdateFont(FontIndex(font))
|
|
if bar and closeBar:
|
|
bar.close()
|