[otlLib] Move building of BaseArrays from feaLib to otlLib

This commit is contained in:
Sascha Brawer 2016-01-22 10:57:03 +01:00
parent 109989b0c1
commit 50cbd5ca78
3 changed files with 46 additions and 8 deletions

View File

@ -979,13 +979,7 @@ class MarkBasePosBuilder(LookupBuilder):
st.MarkArray = otl.buildMarkArray(marks, self.glyphMap)
st.ClassCount = len(markClasses)
st.BaseCoverage = otl.buildCoverage(bases, self.glyphMap)
st.BaseArray = ba = otTables.BaseArray()
ba.BaseCount = len(bases)
ba.BaseRecord = []
for base in sorted(bases, key=self.glyphMap.__getitem__):
baseAnchors = bases[base]
anchors = [baseAnchors.get(mc) for mc in range(st.ClassCount)]
ba.BaseRecord.append(otl.buildBaseRecord(anchors))
st.BaseArray = otl.buildBaseArray(bases, st.ClassCount, self.glyphMap)
return self.buildLookup_([st])

View File

@ -111,6 +111,17 @@ def buildAnchor(x, y, point=None, deviceX=None, deviceY=None):
return self
def buildBaseArray(bases, numMarkClasses, glyphMap):
self = ot.BaseArray()
self.BaseCount = len(bases)
self.BaseRecord = []
for base in sorted(bases, key=glyphMap.__getitem__):
b = bases[base]
anchors = [b.get(markClass) for markClass in range(numMarkClasses)]
self.BaseRecord.append(buildBaseRecord(anchors))
return self
def buildBaseRecord(anchors):
"""[otTables.Anchor, otTables.Anchor, ...] --> otTables.BaseRecord"""
self = ot.BaseRecord()

View File

@ -7,7 +7,7 @@ import unittest
class BuilderTest(unittest.TestCase):
GLYPHS = (".notdef space zero one two three four five six f_f_i c_t "
"grave acute cedilla").split()
"A B C a b c grave acute cedilla").split()
GLYPHMAP = {name: num for num, name in enumerate(GLYPHS)}
ANCHOR1 = builder.buildAnchor(11, -11)
@ -95,6 +95,39 @@ class BuilderTest(unittest.TestCase):
' <PointIndex index="1" value="7"/>'
'</AttachPoint>')
def test_buildBaseArray(self):
anchor = builder.buildAnchor
baseArray = builder.buildBaseArray({
"a": {2: anchor(300, 80)},
"c": {1: anchor(300, 80), 2: anchor(300, -20)}
}, numMarkClasses=4, glyphMap=self.GLYPHMAP)
self.maxDiff = None
self.assertEqual(getXML(baseArray.toXML),
'<BaseArray>'
' <!-- BaseCount=2 -->'
' <BaseRecord index="0">'
' <BaseAnchor index="0" empty="1"/>'
' <BaseAnchor index="1" empty="1"/>'
' <BaseAnchor index="2" Format="1">'
' <XCoordinate value="300"/>'
' <YCoordinate value="80"/>'
' </BaseAnchor>'
' <BaseAnchor index="3" empty="1"/>'
' </BaseRecord>'
' <BaseRecord index="1">'
' <BaseAnchor index="0" empty="1"/>'
' <BaseAnchor index="1" Format="1">'
' <XCoordinate value="300"/>'
' <YCoordinate value="80"/>'
' </BaseAnchor>'
' <BaseAnchor index="2" Format="1">'
' <XCoordinate value="300"/>'
' <YCoordinate value="-20"/>'
' </BaseAnchor>'
' <BaseAnchor index="3" empty="1"/>'
' </BaseRecord>'
'</BaseArray>')
def test_buildBaseRecord(self):
a = builder.buildAnchor
rec = builder.buildBaseRecord([a(500, -20), None, a(300, -15)])