Merge pull request #2237 from fonttools/fix-pair-pos-1-value-records

[otlLib] Ensure built ValueRecords are padded with 0s like when decompiled
This commit is contained in:
Cosimo Lupo 2021-03-24 16:58:55 +00:00 committed by GitHub
commit c2ba06dccc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 13 deletions

View File

@ -11,6 +11,7 @@ from fontTools.ttLib.tables.otBase import (
from fontTools.ttLib.tables import otBase
from fontTools.feaLib.ast import STATNameStatement
from fontTools.otlLib.error import OpenTypeLibError
from functools import reduce
import logging
import copy
@ -2089,9 +2090,9 @@ def buildPairPosClassesSubtable(pairs, glyphMap, valueFormat1=None, valueFormat2
self.Class1Record.append(rec1)
for c2 in classes2:
rec2 = ot.Class2Record()
rec2.Value1, rec2.Value2 = pairs.get((c1, c2), (None, None))
if valueFormat1 and rec2.Value1 is None: rec2.Value1 = ValueRecord(valueFormat1)
if valueFormat2 and rec2.Value2 is None: rec2.Value2 = ValueRecord(valueFormat2)
val1, val2 = pairs.get((c1, c2), (None, None))
rec2.Value1 = ValueRecord(src=val1, valueFormat=valueFormat1) if valueFormat1 else None
rec2.Value2 = ValueRecord(src=val2, valueFormat=valueFormat2) if valueFormat2 else None
rec1.Class2Record.append(rec2)
self.Class1Count = len(self.Class1Record)
self.Class2Count = len(classes2)
@ -2190,8 +2191,8 @@ def buildPairPosGlyphsSubtable(pairs, glyphMap, valueFormat1=None, valueFormat2=
for glyph2, val1, val2 in sorted(p[glyph], key=lambda x: glyphMap[x[0]]):
pvr = ot.PairValueRecord()
pvr.SecondGlyph = glyph2
pvr.Value1 = val1 if valueFormat1 else None
pvr.Value2 = val2 if valueFormat2 else None
pvr.Value1 = ValueRecord(src=val1, valueFormat=valueFormat1) if valueFormat1 else None
pvr.Value2 = ValueRecord(src=val2, valueFormat=valueFormat2) if valueFormat2 else None
ps.PairValueRecord.append(pvr)
ps.PairValueCount = len(ps.PairValueRecord)
self.PairSetCount = len(self.PairSet)
@ -2312,10 +2313,8 @@ def buildSinglePosSubtable(values, glyphMap):
"""
self = ot.SinglePos()
self.Coverage = buildCoverage(values.keys(), glyphMap)
valueRecords = [values[g] for g in self.Coverage.glyphs]
self.ValueFormat = 0
for v in valueRecords:
self.ValueFormat |= v.getFormat()
valueFormat = self.ValueFormat = reduce(int.__or__, [v.getFormat() for v in values.values()], 0)
valueRecords = [ValueRecord(src=values[g], valueFormat=valueFormat) for g in self.Coverage.glyphs]
if all(v == valueRecords[0] for v in valueRecords):
self.Format = 1
if self.ValueFormat != 0:

View File

@ -861,7 +861,7 @@ class BuilderTest(object):
' <Value2 XPlacement="-20"/>',
" </Class2Record>",
' <Class2Record index="2">',
" <Value1/>",
' <Value1 XPlacement="0" YPlacement="0"/>',
' <Value2 XPlacement="-50"/>',
" </Class2Record>",
" </Class1Record>",
@ -922,6 +922,7 @@ class BuilderTest(object):
},
self.GLYPHMAP,
)
assert getXML(subtable.toXML) == [
'<PairPos Format="1">',
" <Coverage>",
@ -935,11 +936,12 @@ class BuilderTest(object):
" <!-- PairValueCount=2 -->",
' <PairValueRecord index="0">',
' <SecondGlyph value="zero"/>',
' <Value1/>',
' <Value1 XPlacement="0" YPlacement="0"/>',
' <Value2 XPlacement="-50"/>',
" </PairValueRecord>",
' <PairValueRecord index="1">',
' <SecondGlyph value="one"/>',
' <Value1 XPlacement="0" YPlacement="0"/>',
' <Value2 XPlacement="-20"/>',
" </PairValueRecord>",
" </PairSet>",
@ -1040,8 +1042,8 @@ class BuilderTest(object):
" </Coverage>",
' <ValueFormat value="3"/>',
" <!-- ValueCount=2 -->",
' <Value index="0" XPlacement="777"/>',
' <Value index="1" YPlacement="-888"/>',
' <Value index="0" XPlacement="777" YPlacement="0"/>',
' <Value index="1" XPlacement="0" YPlacement="-888"/>',
"</SinglePos>",
]