[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.MarkArray = otl.buildMarkArray(marks, self.glyphMap)
st.ClassCount = len(markClasses) st.ClassCount = len(markClasses)
st.BaseCoverage = otl.buildCoverage(bases, self.glyphMap) st.BaseCoverage = otl.buildCoverage(bases, self.glyphMap)
st.BaseArray = ba = otTables.BaseArray() st.BaseArray = otl.buildBaseArray(bases, st.ClassCount, self.glyphMap)
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))
return self.buildLookup_([st]) return self.buildLookup_([st])

View File

@ -111,6 +111,17 @@ def buildAnchor(x, y, point=None, deviceX=None, deviceY=None):
return self 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): def buildBaseRecord(anchors):
"""[otTables.Anchor, otTables.Anchor, ...] --> otTables.BaseRecord""" """[otTables.Anchor, otTables.Anchor, ...] --> otTables.BaseRecord"""
self = ot.BaseRecord() self = ot.BaseRecord()

View File

@ -7,7 +7,7 @@ import unittest
class BuilderTest(unittest.TestCase): class BuilderTest(unittest.TestCase):
GLYPHS = (".notdef space zero one two three four five six f_f_i c_t " 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)} GLYPHMAP = {name: num for num, name in enumerate(GLYPHS)}
ANCHOR1 = builder.buildAnchor(11, -11) ANCHOR1 = builder.buildAnchor(11, -11)
@ -95,6 +95,39 @@ class BuilderTest(unittest.TestCase):
' <PointIndex index="1" value="7"/>' ' <PointIndex index="1" value="7"/>'
'</AttachPoint>') '</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): def test_buildBaseRecord(self):
a = builder.buildAnchor a = builder.buildAnchor
rec = builder.buildBaseRecord([a(500, -20), None, a(300, -15)]) rec = builder.buildBaseRecord([a(500, -20), None, a(300, -15)])