96 lines
2.4 KiB
Python
Executable File
96 lines
2.4 KiB
Python
Executable File
"""Tool for exporting GLIFs from FontLab"""
|
|
|
|
import FL
|
|
import os
|
|
from robofab.interface.all.dialogs import ProgressBar
|
|
from robofab.glifLib import GlyphSet
|
|
from robofab.tools.glifImport import GlyphPlaceholder
|
|
from robofab.pens.flPen import drawFLGlyphOntoPointPen
|
|
|
|
|
|
def exportGlyph(glyphName, flGlyph, glyphSet):
|
|
"""Export a FontLab glyph."""
|
|
|
|
glyph = GlyphPlaceholder()
|
|
glyph.width = flGlyph.width
|
|
glyph.unicodes = flGlyph.unicodes
|
|
if flGlyph.note:
|
|
glyph.note = flGlyph.note
|
|
customdata = flGlyph.customdata
|
|
if customdata:
|
|
from cStringIO import StringIO
|
|
from robofab.plistlib import readPlist, Data
|
|
f = StringIO(customdata)
|
|
try:
|
|
glyph.lib = readPlist(f)
|
|
except: # XXX ugh, plistlib can raise lots of things
|
|
# Anyway, customdata does not contain valid plist data,
|
|
# but we don't need to toss it!
|
|
glyph.lib = {"org.robofab.fontlab.customdata": Data(customdata)}
|
|
|
|
def drawPoints(pen):
|
|
# whoohoo, nested scopes are cool.
|
|
drawFLGlyphOntoPointPen(flGlyph, pen)
|
|
|
|
glyphSet.writeGlyph(glyphName, glyph, drawPoints)
|
|
|
|
|
|
def exportGlyphs(font, glyphs=None, dest=None, doProgress=True, bar=None):
|
|
"""Export all glyphs in a FontLab font"""
|
|
if dest is None:
|
|
dir, base = os.path.split(font.file_name)
|
|
base = base.split(".")[0] + ".glyphs"
|
|
dest = os.path.join(dir, base)
|
|
|
|
if not os.path.exists(dest):
|
|
os.makedirs(dest)
|
|
|
|
glyphSet = GlyphSet(dest)
|
|
|
|
if glyphs is None:
|
|
indices = range(len(font))
|
|
else:
|
|
indices = []
|
|
for glyphName in glyphs:
|
|
indices.append(font.FindGlyph(glyphName))
|
|
barStart = 0
|
|
closeBar = False
|
|
if doProgress:
|
|
if not bar:
|
|
bar = ProgressBar("Exporting Glyphs", len(indices))
|
|
closeBar = True
|
|
else:
|
|
barStart = bar.getCurrentTick()
|
|
else:
|
|
bar = None
|
|
try:
|
|
done = {}
|
|
for i in range(len(indices)):
|
|
#if not (i % 10) and not bar.tick(i + barStart):
|
|
# raise KeyboardInterrupt
|
|
index = indices[i]
|
|
flGlyph = font[index]
|
|
if flGlyph is None:
|
|
continue
|
|
glyphName = flGlyph.name
|
|
if not glyphName:
|
|
print "can't dump glyph #%s, it has no glyph name" % i
|
|
else:
|
|
if glyphName in done:
|
|
n = 1
|
|
while ("%s#%s" % (glyphName, n)) in done:
|
|
n += 1
|
|
glyphName = "%s#%s" % (glyphName, n)
|
|
done[glyphName] = None
|
|
exportGlyph(glyphName, flGlyph, glyphSet)
|
|
if bar and not i % 10:
|
|
bar.tick(barStart + i)
|
|
# Write out contents.plist
|
|
glyphSet.writeContents()
|
|
except KeyboardInterrupt:
|
|
if bar:
|
|
bar.close()
|
|
bar = None
|
|
if bar and closeBar:
|
|
bar.close()
|