[morx] Write AATLookup format 2
This commit is contained in:
parent
bdf29b4169
commit
91827e663f
@ -571,10 +571,10 @@ class AATLookup(BaseConverter):
|
|||||||
|
|
||||||
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
def write(self, writer, font, tableDict, value, repeatIndex=None):
|
||||||
glyphMap = font.getReverseGlyphMap()
|
glyphMap = font.getReverseGlyphMap()
|
||||||
binSrchHeaderSize = 10
|
# TODO: Also implement format 4 and 8.
|
||||||
# TODO: Also implement format 2, 4, and 8.
|
|
||||||
formats = list(sorted(filter(None, [
|
formats = list(sorted(filter(None, [
|
||||||
self.buildFormat0(font, value),
|
self.buildFormat0(font, value),
|
||||||
|
self.buildFormat2(font, value),
|
||||||
self.buildFormat6(font, value),
|
self.buildFormat6(font, value),
|
||||||
])))
|
])))
|
||||||
# We use the format ID as secondary sort key to make the output
|
# We use the format ID as secondary sort key to make the output
|
||||||
@ -603,6 +603,36 @@ class AATLookup(BaseConverter):
|
|||||||
for glyph in font.getGlyphOrder():
|
for glyph in font.getGlyphOrder():
|
||||||
writer.writeUShort(font.getGlyphID(value[glyph]))
|
writer.writeUShort(font.getGlyphID(value[glyph]))
|
||||||
|
|
||||||
|
def buildFormat2(self, font, value):
|
||||||
|
glyphs = [(font.getGlyphID(g), g) for g in value.keys()]
|
||||||
|
glyphs.sort()
|
||||||
|
segStart, glyphName = glyphs[0]
|
||||||
|
segEnd = segStart
|
||||||
|
segValue = value[glyphName]
|
||||||
|
segments = []
|
||||||
|
for glyphID, glyphName in glyphs[1:]:
|
||||||
|
curValue = value[glyphName]
|
||||||
|
if glyphID != segEnd + 1 or curValue != segValue:
|
||||||
|
segments.append((segStart, segEnd, segValue))
|
||||||
|
segStart = segEnd = glyphID
|
||||||
|
segValue = curValue
|
||||||
|
else:
|
||||||
|
segEnd = glyphID
|
||||||
|
segments.append((segStart, segEnd, segValue))
|
||||||
|
segments.append((0xFFFF, 0xFFFF, segValue))
|
||||||
|
return (self.BIN_SEARCH_HEADER_SIZE + len(segments) * 6, 2,
|
||||||
|
lambda writer:
|
||||||
|
self.writeFormat2(writer, font, segments))
|
||||||
|
|
||||||
|
def writeFormat2(self, writer, font, segments):
|
||||||
|
writer.writeUShort(2)
|
||||||
|
self.writeBinSearchHeader(writer,
|
||||||
|
numUnits=len(segments), unitSize=6)
|
||||||
|
for firstGlyph, lastGlyph, value in segments:
|
||||||
|
writer.writeUShort(lastGlyph)
|
||||||
|
writer.writeUShort(firstGlyph)
|
||||||
|
writer.writeUShort(font.getGlyphID(value))
|
||||||
|
|
||||||
def buildFormat6(self, font, value):
|
def buildFormat6(self, font, value):
|
||||||
entries = [(font.getGlyphID(key), font.getGlyphID(value))
|
entries = [(font.getGlyphID(key), font.getGlyphID(value))
|
||||||
for key, value in value.items()]
|
for key, value in value.items()]
|
||||||
|
@ -261,23 +261,50 @@ class AATLookupTest(unittest.TestCase):
|
|||||||
})
|
})
|
||||||
self.assertEqual(writer.getData(), deHexStr("0000 0000 0003 0003 0001"))
|
self.assertEqual(writer.getData(), deHexStr("0000 0000 0003 0003 0001"))
|
||||||
|
|
||||||
|
def test_writeFormat2(self):
|
||||||
|
writer = OTTableWriter()
|
||||||
|
font = FakeFont(".notdef A B C D E F G H".split())
|
||||||
|
self.converter.write(writer, font, {}, {
|
||||||
|
"B": "C",
|
||||||
|
"C": "C",
|
||||||
|
"D": "C",
|
||||||
|
"E": "C",
|
||||||
|
"G": "A",
|
||||||
|
"H": "A",
|
||||||
|
})
|
||||||
|
self.assertEqual(writer.getData(), deHexStr(
|
||||||
|
"0002 " # format=2
|
||||||
|
"0006 " # binSrchHeader.unitSize=6
|
||||||
|
"0003 " # binSrchHeader.nUnits=3
|
||||||
|
"000C " # binSrchHeader.searchRange=12
|
||||||
|
"0001 " # binSrchHeader.entrySelector=1
|
||||||
|
"0006 " # binSrchHeader.rangeShift=6
|
||||||
|
"0005 0002 0003 " # segments[0].lastGlyph=E, firstGlyph=B, value=C
|
||||||
|
"0008 0007 0001 " # segments[1].lastGlyph=H, firstGlyph=G, value=A
|
||||||
|
"FFFF FFFF 0001 " # segments[2]=<END>
|
||||||
|
))
|
||||||
|
|
||||||
def test_writeFormat6(self):
|
def test_writeFormat6(self):
|
||||||
writer = OTTableWriter()
|
writer = OTTableWriter()
|
||||||
font = FakeFont(".notdef A B C".split())
|
font = FakeFont(".notdef A B C D E".split())
|
||||||
self.converter.write(writer, font, {}, {
|
self.converter.write(writer, font, {}, {
|
||||||
"A": "C",
|
"A": "C",
|
||||||
"C": "B"
|
"C": "B",
|
||||||
|
"D": "D",
|
||||||
|
"E": "E",
|
||||||
})
|
})
|
||||||
self.assertEqual(writer.getData(), deHexStr(
|
self.assertEqual(writer.getData(), deHexStr(
|
||||||
"0006 " # format=6
|
"0006 " # format=6
|
||||||
"0004 " # binSrchHeader.unitSize=4
|
"0004 " # binSrchHeader.unitSize=4
|
||||||
"0003 " # binSrchHeader.nUnits=3
|
"0005 " # binSrchHeader.nUnits=5
|
||||||
"0008 " # binSrchHeader.searchRange=8
|
"0010 " # binSrchHeader.searchRange=16
|
||||||
"0001 " # binSrchHeader.entrySelector=1
|
"0002 " # binSrchHeader.entrySelector=2
|
||||||
"0004 " # binSrchHeader.rangeShift=4
|
"0004 " # binSrchHeader.rangeShift=4
|
||||||
"0001 0003 " # entries[0].glyph=A, .value=C
|
"0001 0003 " # entries[0].glyph=A, .value=C
|
||||||
"0003 0002 " # entries[1].glyph=C, .value=B
|
"0003 0002 " # entries[1].glyph=C, .value=B
|
||||||
"FFFF FFFF " # entries[2]=<END>
|
"0004 0004 " # entries[2].glyph=D, .value=D
|
||||||
|
"0005 0005 " # entries[3].glyph=E, .value=E
|
||||||
|
"FFFF FFFF " # entries[4]=<END>
|
||||||
))
|
))
|
||||||
|
|
||||||
def test_xmlRead(self):
|
def test_xmlRead(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user