subset_test: add tests for PairPos2 useClass0 #2221
This commit is contained in:
parent
8c59d4be0c
commit
a4f42d3b18
@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ttFont sfntVersion="OTTO" ttLibVersion="4.21">
|
||||
|
||||
<GPOS>
|
||||
<Version value="0x00010000"/>
|
||||
<ScriptList>
|
||||
<!-- ScriptCount=1 -->
|
||||
<ScriptRecord index="0">
|
||||
<ScriptTag value="latn"/>
|
||||
<Script>
|
||||
<DefaultLangSys>
|
||||
<ReqFeatureIndex value="65535"/>
|
||||
<!-- FeatureCount=1 -->
|
||||
<FeatureIndex index="0" value="0"/>
|
||||
</DefaultLangSys>
|
||||
<!-- LangSysCount=0 -->
|
||||
</Script>
|
||||
</ScriptRecord>
|
||||
</ScriptList>
|
||||
<FeatureList>
|
||||
<!-- FeatureCount=1 -->
|
||||
<FeatureRecord index="0">
|
||||
<FeatureTag value="test"/>
|
||||
<Feature>
|
||||
<!-- LookupCount=1 -->
|
||||
<LookupListIndex index="0" value="0"/>
|
||||
</Feature>
|
||||
</FeatureRecord>
|
||||
</FeatureList>
|
||||
<LookupList>
|
||||
<!-- LookupCount=1 -->
|
||||
<Lookup index="0">
|
||||
<LookupType value="2"/>
|
||||
<LookupFlag value="0"/>
|
||||
<!-- SubTableCount=1 -->
|
||||
<PairPos index="0" Format="2">
|
||||
<Coverage>
|
||||
<Glyph value="g33"/>
|
||||
</Coverage>
|
||||
<ValueFormat1 value="1"/>
|
||||
<ValueFormat2 value="0"/>
|
||||
<ClassDef1>
|
||||
</ClassDef1>
|
||||
<ClassDef2>
|
||||
<ClassDef glyph="g33" class="1"/>
|
||||
</ClassDef2>
|
||||
<!-- Class1Count=1 -->
|
||||
<!-- Class2Count=2 -->
|
||||
<Class1Record index="0">
|
||||
<Class2Record index="0">
|
||||
<Value1 XPlacement="0"/>
|
||||
</Class2Record>
|
||||
<Class2Record index="1">
|
||||
<Value1 XPlacement="-100"/>
|
||||
</Class2Record>
|
||||
</Class1Record>
|
||||
</PairPos>
|
||||
</Lookup>
|
||||
</LookupList>
|
||||
</GPOS>
|
||||
|
||||
</ttFont>
|
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ttFont sfntVersion="OTTO" ttLibVersion="4.21">
|
||||
|
||||
<GPOS>
|
||||
<Version value="0x00010000"/>
|
||||
<ScriptList>
|
||||
<!-- ScriptCount=0 -->
|
||||
</ScriptList>
|
||||
<FeatureList>
|
||||
<!-- FeatureCount=0 -->
|
||||
</FeatureList>
|
||||
<LookupList>
|
||||
<!-- LookupCount=0 -->
|
||||
</LookupList>
|
||||
</GPOS>
|
||||
|
||||
</ttFont>
|
322
Tests/subset/data/GPOS_PairPos_Format2_PR_2221.ttx
Normal file
322
Tests/subset/data/GPOS_PairPos_Format2_PR_2221.ttx
Normal file
@ -0,0 +1,322 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ttFont sfntVersion="OTTO" ttLibVersion="4.21">
|
||||
|
||||
<GlyphOrder>
|
||||
<!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
|
||||
<GlyphID id="0" name=".notdef"/>
|
||||
<GlyphID id="1" name="g33"/>
|
||||
<GlyphID id="2" name="g35"/>
|
||||
</GlyphOrder>
|
||||
|
||||
<head>
|
||||
<!-- Most of this table will be recalculated by the compiler -->
|
||||
<tableVersion value="1.0"/>
|
||||
<fontRevision value="1.0"/>
|
||||
<checkSumAdjustment value="0x3d6ba467"/>
|
||||
<magicNumber value="0x5f0f3cf5"/>
|
||||
<flags value="00000000 00000001"/>
|
||||
<unitsPerEm value="1500"/>
|
||||
<created value="Thu Jan 1 00:00:00 1970"/>
|
||||
<modified value="Mon Mar 29 14:18:07 2021"/>
|
||||
<xMin value="24"/>
|
||||
<yMin value="-31"/>
|
||||
<xMax value="1000"/>
|
||||
<yMax value="689"/>
|
||||
<macStyle value="00000000 00000000"/>
|
||||
<lowestRecPPEM value="3"/>
|
||||
<fontDirectionHint value="2"/>
|
||||
<indexToLocFormat value="0"/>
|
||||
<glyphDataFormat value="0"/>
|
||||
</head>
|
||||
|
||||
<hhea>
|
||||
<tableVersion value="0x00010000"/>
|
||||
<ascent value="2500"/>
|
||||
<descent value="0"/>
|
||||
<lineGap value="200"/>
|
||||
<advanceWidthMax value="1500"/>
|
||||
<minLeftSideBearing value="300"/>
|
||||
<minRightSideBearing value="224"/>
|
||||
<xMaxExtent value="1276"/>
|
||||
<caretSlopeRise value="1"/>
|
||||
<caretSlopeRun value="0"/>
|
||||
<caretOffset value="0"/>
|
||||
<reserved0 value="0"/>
|
||||
<reserved1 value="0"/>
|
||||
<reserved2 value="0"/>
|
||||
<reserved3 value="0"/>
|
||||
<metricDataFormat value="0"/>
|
||||
<numberOfHMetrics value="1"/>
|
||||
</hhea>
|
||||
|
||||
<maxp>
|
||||
<tableVersion value="0x5000"/>
|
||||
<numGlyphs value="3"/>
|
||||
</maxp>
|
||||
|
||||
<OS_2>
|
||||
<!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
|
||||
will be recalculated by the compiler -->
|
||||
<version value="2"/>
|
||||
<xAvgCharWidth value="2500"/>
|
||||
<usWeightClass value="400"/>
|
||||
<usWidthClass value="5"/>
|
||||
<fsType value="00000000 00001100"/>
|
||||
<ySubscriptXSize value="500"/>
|
||||
<ySubscriptYSize value="500"/>
|
||||
<ySubscriptXOffset value="250"/>
|
||||
<ySubscriptYOffset value="50"/>
|
||||
<ySuperscriptXSize value="500"/>
|
||||
<ySuperscriptYSize value="500"/>
|
||||
<ySuperscriptXOffset value="0"/>
|
||||
<ySuperscriptYOffset value="500"/>
|
||||
<yStrikeoutSize value="50"/>
|
||||
<yStrikeoutPosition value="500"/>
|
||||
<sFamilyClass value="0"/>
|
||||
<panose>
|
||||
<bFamilyType value="2"/>
|
||||
<bSerifStyle value="10"/>
|
||||
<bWeight value="6"/>
|
||||
<bProportion value="3"/>
|
||||
<bContrast value="6"/>
|
||||
<bStrokeVariation value="5"/>
|
||||
<bArmStyle value="11"/>
|
||||
<bLetterForm value="2"/>
|
||||
<bMidline value="2"/>
|
||||
<bXHeight value="4"/>
|
||||
</panose>
|
||||
<ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
|
||||
<ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
|
||||
<ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
|
||||
<ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
|
||||
<achVendID value="ADBE"/>
|
||||
<fsSelection value="00000000 01000000"/>
|
||||
<usFirstCharIndex value="33"/>
|
||||
<usLastCharIndex value="35"/>
|
||||
<sTypoAscender value="2500"/>
|
||||
<sTypoDescender value="0"/>
|
||||
<sTypoLineGap value="200"/>
|
||||
<usWinAscent value="2500"/>
|
||||
<usWinDescent value="0"/>
|
||||
<ulCodePageRange1 value="11100000 00111111 00000001 11111111"/>
|
||||
<ulCodePageRange2 value="11111111 11111111 00000000 00000000"/>
|
||||
<sxHeight value="2500"/>
|
||||
<sCapHeight value="2500"/>
|
||||
<usDefaultChar value="65"/>
|
||||
<usBreakChar value="65"/>
|
||||
<usMaxContext value="0"/>
|
||||
</OS_2>
|
||||
|
||||
<name>
|
||||
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
|
||||
gpos2_2_font5
|
||||
</namerecord>
|
||||
<namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
|
||||
Regular
|
||||
</namerecord>
|
||||
<namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
|
||||
gpos2_2_font5
|
||||
</namerecord>
|
||||
<namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
|
||||
gpos2_2_font5
|
||||
</namerecord>
|
||||
<namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
|
||||
Version1.0
|
||||
</namerecord>
|
||||
<namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
|
||||
gpos2_2_font5
|
||||
</namerecord>
|
||||
</name>
|
||||
|
||||
<cmap>
|
||||
<tableVersion version="0"/>
|
||||
<cmap_format_4 platformID="3" platEncID="1" language="0">
|
||||
<map code="0x21" name="g33"/><!-- EXCLAMATION MARK -->
|
||||
<map code="0x23" name="g35"/><!-- NUMBER SIGN -->
|
||||
</cmap_format_4>
|
||||
</cmap>
|
||||
|
||||
<post>
|
||||
<formatType value="3.0"/>
|
||||
<italicAngle value="0.0"/>
|
||||
<underlinePosition value="-100"/>
|
||||
<underlineThickness value="50"/>
|
||||
<isFixedPitch value="0"/>
|
||||
<minMemType42 value="0"/>
|
||||
<maxMemType42 value="0"/>
|
||||
<minMemType1 value="0"/>
|
||||
<maxMemType1 value="0"/>
|
||||
</post>
|
||||
|
||||
<CFF>
|
||||
<major value="1"/>
|
||||
<minor value="0"/>
|
||||
<CFFFont name="dummy">
|
||||
<version value="001.000"/>
|
||||
<Notice value="Copyright (c) 2002 Adobe Systems Incorporated. All Rights Reserved."/>
|
||||
<FullName value="dummy"/>
|
||||
<FamilyName value="dummy"/>
|
||||
<Weight value="Regular"/>
|
||||
<isFixedPitch value="0"/>
|
||||
<ItalicAngle value="0"/>
|
||||
<UnderlinePosition value="-125"/>
|
||||
<UnderlineThickness value="50"/>
|
||||
<PaintType value="0"/>
|
||||
<CharstringType value="2"/>
|
||||
<FontMatrix value="0.0008 0 0 0.0008 0 0"/>
|
||||
<UniqueID value="44788"/>
|
||||
<FontBBox value="24 -31 1000 689"/>
|
||||
<StrokeWidth value="0"/>
|
||||
<!-- charset is dumped separately as the 'GlyphOrder' element -->
|
||||
<Encoding name="StandardEncoding"/>
|
||||
<Private>
|
||||
<BlueValues value="-25 0 657 682 439 464 640 653 708 733 475 500"/>
|
||||
<OtherBlues value="283 308 -251 -226 -154 -129 -194 -169"/>
|
||||
<FamilyBlues value="-25 0 657 682 439 464 640 653 708 733 475 500"/>
|
||||
<FamilyOtherBlues value="283 308 -251 -226 -154 -129 -194 -169"/>
|
||||
<BlueScale value="0.039625"/>
|
||||
<BlueShift value="7"/>
|
||||
<BlueFuzz value="1"/>
|
||||
<StdHW value="32"/>
|
||||
<StdVW value="85"/>
|
||||
<StemSnapH value="32"/>
|
||||
<StemSnapV value="85 90"/>
|
||||
<ForceBold value="0"/>
|
||||
<LanguageGroup value="0"/>
|
||||
<ExpansionFactor value="0.06"/>
|
||||
<initialRandomSeed value="0"/>
|
||||
<defaultWidthX value="2500"/>
|
||||
<nominalWidthX value="2500"/>
|
||||
<Subrs>
|
||||
<!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
|
||||
<CharString index="0">
|
||||
92 580 rmoveto
|
||||
13 6 13 7 14 4 54 16 184 1 9 -81 1 -13 -3 -13 -3 -14 -9 -45 -124 -14 -42 -8 rrcurveto
|
||||
-2 -2 1 -1 hhcurveto
|
||||
-2 vlineto
|
||||
-30 -15 5 -40 35 -4 60 -5 62 -4 47 -43 83 -75 -108 -134 -82 -20 -75 -17 -101 91 -42 -14 -22 -8 -7 -18 10 -21 2 -2 2 -2 1 -2 10 -10 11 -3 10 2 rrcurveto
|
||||
2 2 -1 1 hhcurveto
|
||||
16 -7 15 -7 15 -7 33 -14 33 -14 35 -7 103 -18 81 94 48 78 51 83 -64 98 -77 36 -4 1 -3 2 -4 2 17 7 16 9 15 12 77 61 -32 107 -79 40 -91 47 -115 -9 -91 -40 rrcurveto
|
||||
-27 -24 18 -37 36 7 rrcurveto
|
||||
408 -580 rmoveto
|
||||
return
|
||||
</CharString>
|
||||
<CharString index="1">
|
||||
41 642 rmoveto
|
||||
1 -2 1 -1 -1 vvcurveto
|
||||
-7 2 -7 5 -5 vhcurveto
|
||||
15 -69 -71 -105 61 -45 71 -50 214 60 48 -116 9 -20 3 -24 -3 -22 -13 -128 -51 -35 -120 -6 -38 -1 -62 -5 -26 34 -29 22 -33 -28 16 -33 39 -51 75 0 59 2 83 5 76 21 49 69 rrcurveto
|
||||
25 36 0 48 11 42 19 72 -43 43 -42 45 -62 68 -159 -25 -76 26 -20 43 44 56 -6 66 101 14 102 -5 103 -1 37 7 0 42 -35 11 -109 1 -110 5 -108 -17 rrcurveto
|
||||
-1 1 0 0 1 vvcurveto
|
||||
-25 33 -45 -26 18 -38 rrcurveto
|
||||
407 -673 rmoveto
|
||||
return
|
||||
</CharString>
|
||||
</Subrs>
|
||||
</Private>
|
||||
<CharStrings>
|
||||
<CharString name=".notdef">
|
||||
endchar
|
||||
</CharString>
|
||||
<CharString name="g33">
|
||||
-107 callsubr
|
||||
-107 callsubr
|
||||
endchar
|
||||
</CharString>
|
||||
<CharString name="g35">
|
||||
-107 callsubr
|
||||
-106 callsubr
|
||||
endchar
|
||||
</CharString>
|
||||
</CharStrings>
|
||||
</CFFFont>
|
||||
|
||||
<GlobalSubrs>
|
||||
<!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
|
||||
</GlobalSubrs>
|
||||
</CFF>
|
||||
|
||||
<GPOS>
|
||||
<Version value="0x00010000"/>
|
||||
<ScriptList>
|
||||
<!-- ScriptCount=1 -->
|
||||
<ScriptRecord index="0">
|
||||
<ScriptTag value="latn"/>
|
||||
<Script>
|
||||
<DefaultLangSys>
|
||||
<ReqFeatureIndex value="65535"/>
|
||||
<!-- FeatureCount=1 -->
|
||||
<FeatureIndex index="0" value="0"/>
|
||||
</DefaultLangSys>
|
||||
<!-- LangSysCount=0 -->
|
||||
</Script>
|
||||
</ScriptRecord>
|
||||
</ScriptList>
|
||||
<FeatureList>
|
||||
<!-- FeatureCount=1 -->
|
||||
<FeatureRecord index="0">
|
||||
<FeatureTag value="test"/>
|
||||
<Feature>
|
||||
<!-- LookupCount=1 -->
|
||||
<LookupListIndex index="0" value="0"/>
|
||||
</Feature>
|
||||
</FeatureRecord>
|
||||
</FeatureList>
|
||||
<LookupList>
|
||||
<!-- LookupCount=1 -->
|
||||
<Lookup index="0">
|
||||
<LookupType value="2"/>
|
||||
<LookupFlag value="0"/>
|
||||
<!-- SubTableCount=1 -->
|
||||
<PairPos index="0" Format="2">
|
||||
<Coverage Format="1">
|
||||
<Glyph value="g33"/>
|
||||
<Glyph value="g35"/>
|
||||
</Coverage>
|
||||
<ValueFormat1 value="1"/>
|
||||
<ValueFormat2 value="0"/>
|
||||
<ClassDef1 Format="1">
|
||||
<ClassDef glyph="g33" class="1"/>
|
||||
<ClassDef glyph="g35" class="2"/>
|
||||
</ClassDef1>
|
||||
<ClassDef2 Format="1">
|
||||
<ClassDef glyph="g33" class="1"/>
|
||||
</ClassDef2>
|
||||
<!-- Class1Count=3 -->
|
||||
<!-- Class2Count=2 -->
|
||||
<Class1Record index="0">
|
||||
<Class2Record index="0">
|
||||
<Value1 XPlacement="0"/>
|
||||
</Class2Record>
|
||||
<Class2Record index="1">
|
||||
<Value1 XPlacement="0"/>
|
||||
</Class2Record>
|
||||
</Class1Record>
|
||||
<Class1Record index="1">
|
||||
<Class2Record index="0">
|
||||
<Value1 XPlacement="0"/>
|
||||
</Class2Record>
|
||||
<Class2Record index="1">
|
||||
<Value1 XPlacement="-100"/>
|
||||
</Class2Record>
|
||||
</Class1Record>
|
||||
<Class1Record index="2">
|
||||
<Class2Record index="0">
|
||||
<Value1 XPlacement="0"/>
|
||||
</Class2Record>
|
||||
<Class2Record index="1">
|
||||
<Value1 XPlacement="-100"/>
|
||||
</Class2Record>
|
||||
</Class1Record>
|
||||
</PairPos>
|
||||
</Lookup>
|
||||
</LookupList>
|
||||
</GPOS>
|
||||
|
||||
<hmtx>
|
||||
<mtx name=".notdef" width="1500" lsb="300"/>
|
||||
<mtx name="g33" width="1500" lsb="300"/>
|
||||
<mtx name="g35" width="1500" lsb="300"/>
|
||||
</hmtx>
|
||||
|
||||
</ttFont>
|
@ -762,6 +762,37 @@ class SubsetTest(unittest.TestCase):
|
||||
subsetfont = TTFont(subsetpath)
|
||||
self.expect_ttx(subsetfont, self.getpath("CmapSubsetTest.subset.ttx"), ["cmap"])
|
||||
|
||||
def test_GPOS_PairPos_Format2_useClass0(self):
|
||||
# Check two things related to class 0 ('every other glyph'):
|
||||
# 1) that it's reused for ClassDef1 when it becomes empty as the subset glyphset
|
||||
# is intersected with the table's Coverage
|
||||
# 2) that it is never reused for ClassDef2 even when it happens to become empty
|
||||
# because of the subset glyphset. In this case, we don't keep a PairPosClass2
|
||||
# subtable if only ClassDef2's class0 survived subsetting.
|
||||
# The test font (from Harfbuzz test suite) is constructed to trigger these two
|
||||
# situations depending on the input subset --text.
|
||||
# https://github.com/fonttools/fonttools/pull/2221
|
||||
_, fontpath = self.compile_font(
|
||||
self.getpath("GPOS_PairPos_Format2_PR_2221.ttx"), ".ttf"
|
||||
)
|
||||
subsetpath = self.temp_path(".ttf")
|
||||
|
||||
for n, text in enumerate("!#", start=1):
|
||||
expected_ttx = self.getpath(
|
||||
f"GPOS_PairPos_Format2_ClassDef{n}_useClass0.subset.ttx"
|
||||
)
|
||||
with self.subTest(text=text, expected_ttx=expected_ttx):
|
||||
subset.main(
|
||||
[
|
||||
fontpath,
|
||||
f"--text='{text}'",
|
||||
"--layout-features+=test",
|
||||
"--output-file=%s" % subsetpath,
|
||||
]
|
||||
)
|
||||
subsetfont = TTFont(subsetpath)
|
||||
self.expect_ttx(subsetfont, expected_ttx, ["GPOS"])
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def featureVarsTestFont():
|
||||
|
Loading…
x
Reference in New Issue
Block a user