Speeds up font compilation by around 200%
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)
This commit is contained in:
parent
31ae014e0c
commit
8234b62ab7
108 changed files with 26933 additions and 110 deletions
150
misc/pylib/robofab/test/test_glifLib.py
Normal file
150
misc/pylib/robofab/test/test_glifLib.py
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
import os
|
||||
import tempfile
|
||||
import shutil
|
||||
import unittest
|
||||
|
||||
from robofab.test.testSupport import getDemoFontGlyphSetPath
|
||||
from robofab.glifLib import GlyphSet, glyphNameToFileName, READ_MODE
|
||||
from robofab.tools.glyphNameSchemes import glyphNameToShortFileName
|
||||
|
||||
|
||||
GLYPHSETDIR = getDemoFontGlyphSetPath()
|
||||
|
||||
|
||||
class GlyphSetTests(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.dstDir = tempfile.mktemp()
|
||||
os.mkdir(self.dstDir)
|
||||
|
||||
def tearDown(self):
|
||||
shutil.rmtree(self.dstDir)
|
||||
|
||||
def testRoundTrip(self):
|
||||
srcDir = GLYPHSETDIR
|
||||
dstDir = self.dstDir
|
||||
src = GlyphSet(srcDir)
|
||||
dst = GlyphSet(dstDir)
|
||||
for glyphName in src.keys():
|
||||
g = src[glyphName]
|
||||
g.drawPoints(None) # load attrs
|
||||
dst.writeGlyph(glyphName, g, g.drawPoints)
|
||||
# compare raw file data:
|
||||
for glyphName in src.keys():
|
||||
fileName = src.contents[glyphName]
|
||||
org = file(os.path.join(srcDir, fileName), READ_MODE).read()
|
||||
new = file(os.path.join(dstDir, fileName), READ_MODE).read()
|
||||
self.assertEqual(org, new, "%r .glif file differs after round tripping" % glyphName)
|
||||
|
||||
def testRebuildContents(self):
|
||||
gset = GlyphSet(GLYPHSETDIR)
|
||||
contents = gset.contents
|
||||
gset.rebuildContents()
|
||||
self.assertEqual(contents, gset.contents)
|
||||
|
||||
def testReverseContents(self):
|
||||
gset = GlyphSet(GLYPHSETDIR)
|
||||
d = {}
|
||||
for k, v in gset.getReverseContents().items():
|
||||
d[v] = k
|
||||
org = {}
|
||||
for k, v in gset.contents.items():
|
||||
org[k] = v.lower()
|
||||
self.assertEqual(d, org)
|
||||
|
||||
def testReverseContents2(self):
|
||||
src = GlyphSet(GLYPHSETDIR)
|
||||
dst = GlyphSet(self.dstDir)
|
||||
dstMap = dst.getReverseContents()
|
||||
self.assertEqual(dstMap, {})
|
||||
for glyphName in src.keys():
|
||||
g = src[glyphName]
|
||||
g.drawPoints(None) # load attrs
|
||||
dst.writeGlyph(glyphName, g, g.drawPoints)
|
||||
self.assertNotEqual(dstMap, {})
|
||||
srcMap = dict(src.getReverseContents()) # copy
|
||||
self.assertEqual(dstMap, srcMap)
|
||||
del srcMap["a.glif"]
|
||||
dst.deleteGlyph("a")
|
||||
self.assertEqual(dstMap, srcMap)
|
||||
|
||||
def testCustomFileNamingScheme(self):
|
||||
def myGlyphNameToFileName(glyphName, glyphSet):
|
||||
return "prefix" + glyphNameToFileName(glyphName, glyphSet)
|
||||
src = GlyphSet(GLYPHSETDIR)
|
||||
dst = GlyphSet(self.dstDir, myGlyphNameToFileName)
|
||||
for glyphName in src.keys():
|
||||
g = src[glyphName]
|
||||
g.drawPoints(None) # load attrs
|
||||
dst.writeGlyph(glyphName, g, g.drawPoints)
|
||||
d = {}
|
||||
for k, v in src.contents.items():
|
||||
print k, v
|
||||
d[k] = "prefix" + v
|
||||
self.assertEqual(d, dst.contents)
|
||||
|
||||
def testGetUnicodes(self):
|
||||
src = GlyphSet(GLYPHSETDIR)
|
||||
unicodes = src.getUnicodes()
|
||||
for glyphName in src.keys():
|
||||
g = src[glyphName]
|
||||
g.drawPoints(None) # load attrs
|
||||
if not hasattr(g, "unicodes"):
|
||||
self.assertEqual(unicodes[glyphName], [])
|
||||
else:
|
||||
self.assertEqual(g.unicodes, unicodes[glyphName])
|
||||
|
||||
|
||||
class FileNameTests(unittest.TestCase):
|
||||
|
||||
def testDefaultFileNameScheme(self):
|
||||
self.assertEqual(glyphNameToFileName("a", None), "a.glif")
|
||||
self.assertEqual(glyphNameToFileName("A", None), "A_.glif")
|
||||
self.assertEqual(glyphNameToFileName("Aring", None), "Aring_.glif")
|
||||
self.assertEqual(glyphNameToFileName("F_A_B", None), "F__A__B_.glif")
|
||||
self.assertEqual(glyphNameToFileName("A.alt", None), "A_.alt.glif")
|
||||
self.assertEqual(glyphNameToFileName("A.Alt", None), "A_.Alt_.glif")
|
||||
self.assertEqual(glyphNameToFileName(".notdef", None), "_notdef.glif")
|
||||
self.assertEqual(glyphNameToFileName("T_H", None), "T__H_.glif")
|
||||
self.assertEqual(glyphNameToFileName("T_h", None), "T__h.glif")
|
||||
self.assertEqual(glyphNameToFileName("t_h", None), "t_h.glif")
|
||||
self.assertEqual(glyphNameToFileName('F_F_I', None), "F__F__I_.glif")
|
||||
self.assertEqual(glyphNameToFileName('f_f_i', None), "f_f_i.glif")
|
||||
|
||||
|
||||
def testShortFileNameScheme(self):
|
||||
print "testShortFileNameScheme"
|
||||
self.assertEqual(glyphNameToShortFileName("a", None), "a.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("A", None), "A_.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("aE", None), "aE_.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("AE", None), "A_E_.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("a.alt", None), "a_alt.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("A.alt", None), "A__alt.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("a.alt#swash", None), "a_alt_swash.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("A.alt", None), "A__alt.glif")
|
||||
self.assertEqual(glyphNameToShortFileName(".notdef", None), "_notdef.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("f_f_i", None), "f_f_i.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("F_F_I", None), "F__F__I_.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("acircumflexdieresis.swash.alt1", None), "acircumflexdieresi0cfc8352.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("acircumflexdieresis.swash.alt2", None), "acircumflexdieresi95f5d2e8.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("Acircumflexdieresis.swash.alt1", None), "A_circumflexdieresed24fb56.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("F#weight0.800_width0.425", None), "F__weight0_800_width0_425.glif")
|
||||
self.assertEqual(glyphNameToShortFileName("F#weight0.83245511_width0.425693567", None), "F__weight0_8324551c9a4143c.glif")
|
||||
self.assertEqual(len(glyphNameToShortFileName("F#weight0.83245511_width0.425693567", None)), 31)
|
||||
|
||||
def testShortFileNameScheme_clashes(self):
|
||||
# test for the condition in code.robofab.com ticket #5
|
||||
name1 = glyphNameToShortFileName('Adieresis', None)
|
||||
name2 = glyphNameToShortFileName('a_dieresis', None)
|
||||
self.assertNotEqual(name1, name2)
|
||||
name1 = glyphNameToShortFileName('AE', None)
|
||||
name2 = glyphNameToShortFileName('aE', None)
|
||||
self.assertNotEqual(name1, name2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from robofab.test.testSupport import runTests
|
||||
import sys
|
||||
if len(sys.argv) > 1 and os.path.isdir(sys.argv[-1]):
|
||||
GLYPHSETDIR = sys.argv.pop()
|
||||
runTests()
|
||||
Reference in a new issue