[otlLib] Move building of otTables.Lookup from feaLib to otlLib
This commit is contained in:
parent
56f863564e
commit
3c65e82307
@ -714,14 +714,7 @@ class LookupBuilder(object):
|
||||
return {}
|
||||
|
||||
def buildLookup_(self, subtables):
|
||||
lookup = otTables.Lookup()
|
||||
lookup.LookupFlag = self.lookupflag
|
||||
lookup.LookupType = self.lookup_type
|
||||
lookup.SubTable = subtables
|
||||
lookup.SubTableCount = len(subtables)
|
||||
if self.markFilterSet is not None:
|
||||
lookup.MarkFilteringSet = self.markFilterSet
|
||||
return lookup
|
||||
return otl.buildLookup(subtables, self.lookupflag, self.markFilterSet)
|
||||
|
||||
def buildMarkClasses_(self, marks):
|
||||
"""{"cedilla": ("BOTTOM", ast.Anchor), ...} --> {"BOTTOM":0, "TOP":1}
|
||||
|
@ -10,6 +10,37 @@ def buildCoverage(glyphs, glyphMap):
|
||||
return self
|
||||
|
||||
|
||||
LOOKUP_FLAG_RIGHT_TO_LEFT = 0x0001
|
||||
LOOKUP_FLAG_IGNORE_BASE_GLYPHS = 0x0002
|
||||
LOOKUP_FLAG_IGNORE_LIGATURES = 0x0004
|
||||
LOOKUP_FLAG_IGNORE_MARKS = 0x0008
|
||||
LOOKUP_FLAG_USE_MARK_FILTERING_SET = 0x0010
|
||||
|
||||
|
||||
def buildLookup(subtables, flags=0, markFilterSet=None):
|
||||
if not subtables:
|
||||
return None
|
||||
assert all(t.LookupType == subtables[0].LookupType for t in subtables), \
|
||||
("all subtables must have the same LookupType; got %s" %
|
||||
repr([t.LookupType for t in subtables]))
|
||||
self = ot.Lookup()
|
||||
self.LookupType = subtables[0].LookupType
|
||||
self.LookupFlag = flags
|
||||
self.SubTable = subtables
|
||||
self.SubTableCount = len(subtables)
|
||||
if markFilterSet is not None:
|
||||
assert self.LookupFlag & LOOKUP_FLAG_USE_MARK_FILTERING_SET, \
|
||||
("if markFilterSet is not None, flags must set "
|
||||
"LOOKUP_FLAG_USE_MARK_FILTERING_SET; flags=0x%04x" % flags)
|
||||
assert isinstance(markFilterSet, int), markFilterSet
|
||||
self.MarkFilteringSet = markFilterSet
|
||||
else:
|
||||
assert (self.LookupFlag & LOOKUP_FLAG_USE_MARK_FILTERING_SET) == 0, \
|
||||
("if markFilterSet is None, flags must not set "
|
||||
"LOOKUP_FLAG_USE_MARK_FILTERING_SET; flags=0x%04x" % flags)
|
||||
return self
|
||||
|
||||
|
||||
# GSUB
|
||||
|
||||
|
||||
|
@ -14,6 +14,13 @@ class BuilderTest(unittest.TestCase):
|
||||
ANCHOR2 = builder.buildAnchor(22, -22)
|
||||
ANCHOR3 = builder.buildAnchor(33, -33)
|
||||
|
||||
def __init__(self, methodName):
|
||||
unittest.TestCase.__init__(self, methodName)
|
||||
# Python 3 renamed assertRaisesRegexp to assertRaisesRegex,
|
||||
# and fires deprecation warnings if a program uses the old name.
|
||||
if not hasattr(self, "assertRaisesRegex"):
|
||||
self.assertRaisesRegex = self.assertRaisesRegexp
|
||||
|
||||
def test_buildAnchor_format1(self):
|
||||
anchor = builder.buildAnchor(23, 42)
|
||||
self.assertEqual(getXML(anchor.toXML),
|
||||
@ -256,6 +263,65 @@ class BuilderTest(unittest.TestCase):
|
||||
' </CaretValue>'
|
||||
'</LigGlyph>')
|
||||
|
||||
def test_buildLookup(self):
|
||||
s1 = builder.buildSingleSubst({"one": "two"})
|
||||
s2 = builder.buildSingleSubst({"three": "four"})
|
||||
lookup = builder.buildLookup([s1, s2], flags=7)
|
||||
self.assertEqual(getXML(lookup.toXML),
|
||||
'<Lookup>'
|
||||
' <!-- LookupType=1 -->'
|
||||
' <LookupFlag value="7"/>'
|
||||
' <!-- SubTableCount=2 -->'
|
||||
' <SingleSubst index="0">'
|
||||
' <Substitution in="one" out="two"/>'
|
||||
' </SingleSubst>'
|
||||
' <SingleSubst index="1">'
|
||||
' <Substitution in="three" out="four"/>'
|
||||
' </SingleSubst>'
|
||||
'</Lookup>')
|
||||
|
||||
def test_buildLookup_badFlags(self):
|
||||
s = builder.buildSingleSubst({"one": "two"})
|
||||
self.assertRaisesRegex(
|
||||
AssertionError, "if markFilterSet is None, "
|
||||
"flags must not set LOOKUP_FLAG_USE_MARK_FILTERING_SET; "
|
||||
"flags=0x0010",
|
||||
builder.buildLookup, [s],
|
||||
builder.LOOKUP_FLAG_USE_MARK_FILTERING_SET, None)
|
||||
self.assertRaisesRegex(
|
||||
AssertionError, "if markFilterSet is not None, "
|
||||
"flags must set LOOKUP_FLAG_USE_MARK_FILTERING_SET; "
|
||||
"flags=0x0004",
|
||||
builder.buildLookup, [s],
|
||||
builder.LOOKUP_FLAG_IGNORE_LIGATURES, 777)
|
||||
|
||||
def test_buildLookup_conflictingSubtableTypes(self):
|
||||
s1 = builder.buildSingleSubst({"one": "two"})
|
||||
s2 = builder.buildAlternateSubst({"one": ["two", "three"]})
|
||||
self.assertRaisesRegex(
|
||||
AssertionError, "all subtables must have the same LookupType",
|
||||
builder.buildLookup, [s1, s2])
|
||||
|
||||
def test_buildLookup_noSubtables(self):
|
||||
self.assertIsNone(builder.buildLookup([]))
|
||||
self.assertIsNone(builder.buildLookup(None))
|
||||
|
||||
def test_buildLookup_markFilterSet(self):
|
||||
s = builder.buildSingleSubst({"one": "two"})
|
||||
flags = (builder.LOOKUP_FLAG_RIGHT_TO_LEFT |
|
||||
builder.LOOKUP_FLAG_USE_MARK_FILTERING_SET)
|
||||
lookup = builder.buildLookup([s], flags, markFilterSet=999)
|
||||
self.assertEqual(getXML(lookup.toXML),
|
||||
'<Lookup>'
|
||||
' <!-- LookupType=1 -->'
|
||||
' <LookupFlag value="17"/>'
|
||||
' <!-- SubTableCount=1 -->'
|
||||
' <SingleSubst index="0">'
|
||||
' <Substitution in="one" out="two"/>'
|
||||
' </SingleSubst>'
|
||||
' <MarkFilteringSet value="999"/>'
|
||||
'</Lookup>')
|
||||
|
||||
def test_buildMarkGlyphSetsDef(self):
|
||||
marksets = builder.buildMarkGlyphSetsDef(
|
||||
[{"acute", "grave"}, {"cedilla", "grave"}], self.GLYPHMAP)
|
||||
|
Loading…
x
Reference in New Issue
Block a user