diff options
author | Haibo Huang <hhb@google.com> | 2020-05-15 14:50:34 -0700 |
---|---|---|
committer | Haibo Huang <hhb@google.com> | 2020-05-15 14:50:34 -0700 |
commit | add91cddc62bc5fc56859a6bdcc353e6bc3b50f8 (patch) | |
tree | dc2bad80abd38ff82964795b0cde8ffcf969237f /Tests | |
parent | b8516dcfca3116c02a4d5cd9902ecb195beaee85 (diff) | |
download | fonttools-add91cddc62bc5fc56859a6bdcc353e6bc3b50f8.tar.gz |
Upgrade fonttools to 4.10.0
Test: None
Change-Id: I7a2c428ddeec73630fe798578cdcb6494d594f73
Diffstat (limited to 'Tests')
25 files changed, 2711 insertions, 1068 deletions
diff --git a/Tests/designspaceLib/designspace_test.py b/Tests/designspaceLib/designspace_test.py index 378effe6..f883730f 100644 --- a/Tests/designspaceLib/designspace_test.py +++ b/Tests/designspaceLib/designspace_test.py @@ -996,23 +996,30 @@ def test_addInstanceDescriptor(): assert instance.styleMapStyleName == "regular" -def test_addRuleDescriptor(): +def test_addRuleDescriptor(tmp_path): ds = DesignSpaceDocument() rule = ds.addRuleDescriptor( - name="TestRule", - conditionSets=[ - dict(name='Weight', minimum=100, maximum=200), - dict(name='Weight', minimum=700, maximum=900), - ], - subs=[("a", "a.alt")], + name="TestRule", + conditionSets=[ + [ + dict(name="Weight", minimum=100, maximum=200), + dict(name="Weight", minimum=700, maximum=900), + ] + ], + subs=[("a", "a.alt")], ) assert ds.rules[0] is rule assert isinstance(rule, RuleDescriptor) assert rule.name == "TestRule" assert rule.conditionSets == [ - dict(name='Weight', minimum=100, maximum=200), - dict(name='Weight', minimum=700, maximum=900), + [ + dict(name="Weight", minimum=100, maximum=200), + dict(name="Weight", minimum=700, maximum=900), + ] ] assert rule.subs == [("a", "a.alt")] + + # Test it doesn't crash. + ds.write(tmp_path / "test.designspace") diff --git a/Tests/feaLib/builder_test.py b/Tests/feaLib/builder_test.py index 5ce4cc26..f2f1c05d 100644 --- a/Tests/feaLib/builder_test.py +++ b/Tests/feaLib/builder_test.py @@ -71,7 +71,8 @@ class BuilderTest(unittest.TestCase): ZeroValue_ChainSinglePos_horizontal ZeroValue_ChainSinglePos_vertical PairPosSubtable ChainSubstSubtable ChainPosSubtable LigatureSubtable AlternateSubtable MultipleSubstSubtable SingleSubstSubtable - aalt_chain_contextual_subst AlternateChained + aalt_chain_contextual_subst AlternateChained MultipleLookupsPerGlyph + MultipleLookupsPerGlyph2 """.split() def __init__(self, methodName): diff --git a/Tests/feaLib/data/MultipleLookupsPerGlyph.fea b/Tests/feaLib/data/MultipleLookupsPerGlyph.fea new file mode 100644 index 00000000..e0c22226 --- /dev/null +++ b/Tests/feaLib/data/MultipleLookupsPerGlyph.fea @@ -0,0 +1,11 @@ +lookup a_to_bc { + sub a by b c; +} a_to_bc; + +lookup b_to_d { + sub b by d; +} b_to_d; + +feature test { + sub a' lookup a_to_bc lookup b_to_d b; +} test;
\ No newline at end of file diff --git a/Tests/feaLib/data/MultipleLookupsPerGlyph.ttx b/Tests/feaLib/data/MultipleLookupsPerGlyph.ttx new file mode 100644 index 00000000..927694cb --- /dev/null +++ b/Tests/feaLib/data/MultipleLookupsPerGlyph.ttx @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ttFont> + + <GSUB> + <Version value="0x00010000"/> + <ScriptList> + <!-- ScriptCount=1 --> + <ScriptRecord index="0"> + <ScriptTag value="DFLT"/> + <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="2"/> + </Feature> + </FeatureRecord> + </FeatureList> + <LookupList> + <!-- LookupCount=3 --> + <Lookup index="0"> + <LookupType value="2"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <MultipleSubst index="0"> + <Substitution in="a" out="b,c"/> + </MultipleSubst> + </Lookup> + <Lookup index="1"> + <LookupType value="1"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <SingleSubst index="0"> + <Substitution in="b" out="d"/> + </SingleSubst> + </Lookup> + <Lookup index="2"> + <LookupType value="6"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <ChainContextSubst index="0" Format="3"> + <!-- BacktrackGlyphCount=0 --> + <!-- InputGlyphCount=1 --> + <InputCoverage index="0"> + <Glyph value="a"/> + </InputCoverage> + <!-- LookAheadGlyphCount=1 --> + <LookAheadCoverage index="0"> + <Glyph value="b"/> + </LookAheadCoverage> + <!-- SubstCount=2 --> + <SubstLookupRecord index="0"> + <SequenceIndex value="0"/> + <LookupListIndex value="0"/> + </SubstLookupRecord> + <SubstLookupRecord index="1"> + <SequenceIndex value="0"/> + <LookupListIndex value="1"/> + </SubstLookupRecord> + </ChainContextSubst> + </Lookup> + </LookupList> + </GSUB> + +</ttFont> diff --git a/Tests/feaLib/data/MultipleLookupsPerGlyph2.fea b/Tests/feaLib/data/MultipleLookupsPerGlyph2.fea new file mode 100644 index 00000000..5a9d19b2 --- /dev/null +++ b/Tests/feaLib/data/MultipleLookupsPerGlyph2.fea @@ -0,0 +1,11 @@ +lookup a_reduce_sb { + pos a <-80 0 -160 0>; +} a_reduce_sb; + +lookup a_raise { + pos a <0 100 0 0>; +} a_raise; + +feature test { + pos a' lookup a_reduce_sb lookup a_raise b; +} test;
\ No newline at end of file diff --git a/Tests/feaLib/data/MultipleLookupsPerGlyph2.ttx b/Tests/feaLib/data/MultipleLookupsPerGlyph2.ttx new file mode 100644 index 00000000..008d95b6 --- /dev/null +++ b/Tests/feaLib/data/MultipleLookupsPerGlyph2.ttx @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ttFont> + + <GPOS> + <Version value="0x00010000"/> + <ScriptList> + <!-- ScriptCount=1 --> + <ScriptRecord index="0"> + <ScriptTag value="DFLT"/> + <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="2"/> + </Feature> + </FeatureRecord> + </FeatureList> + <LookupList> + <!-- LookupCount=3 --> + <Lookup index="0"> + <LookupType value="1"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <SinglePos index="0" Format="1"> + <Coverage> + <Glyph value="a"/> + </Coverage> + <ValueFormat value="5"/> + <Value XPlacement="-80" XAdvance="-160"/> + </SinglePos> + </Lookup> + <Lookup index="1"> + <LookupType value="1"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <SinglePos index="0" Format="1"> + <Coverage> + <Glyph value="a"/> + </Coverage> + <ValueFormat value="2"/> + <Value YPlacement="100"/> + </SinglePos> + </Lookup> + <Lookup index="2"> + <LookupType value="8"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <ChainContextPos index="0" Format="3"> + <!-- BacktrackGlyphCount=0 --> + <!-- InputGlyphCount=1 --> + <InputCoverage index="0"> + <Glyph value="a"/> + </InputCoverage> + <!-- LookAheadGlyphCount=1 --> + <LookAheadCoverage index="0"> + <Glyph value="b"/> + </LookAheadCoverage> + <!-- PosCount=2 --> + <PosLookupRecord index="0"> + <SequenceIndex value="0"/> + <LookupListIndex value="0"/> + </PosLookupRecord> + <PosLookupRecord index="1"> + <SequenceIndex value="0"/> + <LookupListIndex value="1"/> + </PosLookupRecord> + </ChainContextPos> + </Lookup> + </LookupList> + </GPOS> + +</ttFont> diff --git a/Tests/feaLib/parser_test.py b/Tests/feaLib/parser_test.py index d05a8244..87b8c96a 100644 --- a/Tests/feaLib/parser_test.py +++ b/Tests/feaLib/parser_test.py @@ -1065,7 +1065,7 @@ class ParserTest(unittest.TestCase): self.assertEqual(glyphstr(pos.prefix), "[A a] [B b]") self.assertEqual(glyphstr(pos.glyphs), "I [N n] P") self.assertEqual(glyphstr(pos.suffix), "[Y y] [Z z]") - self.assertEqual(pos.lookups, [lookup1, lookup2, None]) + self.assertEqual(pos.lookups, [[lookup1], [lookup2], None]) def test_gpos_type_8_lookup_with_values(self): self.assertRaisesRegex( @@ -1508,8 +1508,8 @@ class ParserTest(unittest.TestCase): def test_substitute_lookups(self): # GSUB LookupType 6 doc = Parser(self.getpath("spec5fi1.fea"), GLYPHNAMES).parse() [_, _, _, langsys, ligs, sub, feature] = doc.statements - self.assertEqual(feature.statements[0].lookups, [ligs, None, sub]) - self.assertEqual(feature.statements[1].lookups, [ligs, None, sub]) + self.assertEqual(feature.statements[0].lookups, [[ligs], None, [sub]]) + self.assertEqual(feature.statements[1].lookups, [[ligs], None, [sub]]) def test_substitute_missing_by(self): self.assertRaisesRegex( diff --git a/Tests/fontBuilder/data/test_var.ttf.ttx b/Tests/fontBuilder/data/test_var.ttf.ttx index bc1aae25..ed8fd307 100644 --- a/Tests/fontBuilder/data/test_var.ttf.ttx +++ b/Tests/fontBuilder/data/test_var.ttf.ttx @@ -204,6 +204,9 @@ <namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True"> Right Up </namerecord> + <namerecord nameID="262" platformID="1" platEncID="0" langID="0x0" unicode="True"> + Neutral + </namerecord> <namerecord nameID="1" platformID="1" platEncID="0" langID="0x4" unicode="True"> HalloTestFont </namerecord> @@ -237,6 +240,9 @@ <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409"> Right Up </namerecord> + <namerecord nameID="262" platformID="3" platEncID="1" langID="0x409"> + Neutral + </namerecord> <namerecord nameID="1" platformID="3" platEncID="1" langID="0x413"> HalloTestFont </namerecord> @@ -363,6 +369,86 @@ </FeatureVariations> </GSUB> + <STAT> + <Version value="0x00010001"/> + <DesignAxisRecordSize value="8"/> + <!-- DesignAxisCount=4 --> + <DesignAxisRecord> + <Axis index="0"> + <AxisTag value="LEFT"/> + <AxisNameID value="256"/> <!-- Left --> + <AxisOrdering value="0"/> + </Axis> + <Axis index="1"> + <AxisTag value="RGHT"/> + <AxisNameID value="257"/> <!-- Right --> + <AxisOrdering value="1"/> + </Axis> + <Axis index="2"> + <AxisTag value="UPPP"/> + <AxisNameID value="258"/> <!-- Up --> + <AxisOrdering value="2"/> + </Axis> + <Axis index="3"> + <AxisTag value="DOWN"/> + <AxisNameID value="259"/> <!-- Down --> + <AxisOrdering value="3"/> + </Axis> + </DesignAxisRecord> + <!-- AxisValueCount=8 --> + <AxisValueArray> + <AxisValue index="0" Format="1"> + <AxisIndex value="0"/> + <Flags value="2"/> + <ValueNameID value="262"/> <!-- Neutral --> + <Value value="0.0"/> + </AxisValue> + <AxisValue index="1" Format="1"> + <AxisIndex value="0"/> + <Flags value="0"/> + <ValueNameID value="256"/> <!-- Left --> + <Value value="100.0"/> + </AxisValue> + <AxisValue index="2" Format="1"> + <AxisIndex value="1"/> + <Flags value="2"/> + <ValueNameID value="262"/> <!-- Neutral --> + <Value value="0.0"/> + </AxisValue> + <AxisValue index="3" Format="1"> + <AxisIndex value="1"/> + <Flags value="0"/> + <ValueNameID value="257"/> <!-- Right --> + <Value value="100.0"/> + </AxisValue> + <AxisValue index="4" Format="1"> + <AxisIndex value="2"/> + <Flags value="2"/> + <ValueNameID value="262"/> <!-- Neutral --> + <Value value="0.0"/> + </AxisValue> + <AxisValue index="5" Format="1"> + <AxisIndex value="2"/> + <Flags value="0"/> + <ValueNameID value="258"/> <!-- Up --> + <Value value="100.0"/> + </AxisValue> + <AxisValue index="6" Format="1"> + <AxisIndex value="3"/> + <Flags value="2"/> + <ValueNameID value="262"/> <!-- Neutral --> + <Value value="0.0"/> + </AxisValue> + <AxisValue index="7" Format="1"> + <AxisIndex value="3"/> + <Flags value="0"/> + <ValueNameID value="259"/> <!-- Down --> + <Value value="100.0"/> + </AxisValue> + </AxisValueArray> + <ElidedFallbackNameID value="2"/> <!-- TotallyNormal --> + </STAT> + <fvar> <!-- Left --> diff --git a/Tests/fontBuilder/fontBuilder_test.py b/Tests/fontBuilder/fontBuilder_test.py index bc7837c3..6368cb87 100644 --- a/Tests/fontBuilder/fontBuilder_test.py +++ b/Tests/fontBuilder/fontBuilder_test.py @@ -226,6 +226,13 @@ def test_build_var(tmpdir): featureTag="rclt", ) + statAxes = [] + for tag, minVal, defaultVal, maxVal, name in axes: + values = [dict(name="Neutral", value=defaultVal, flags=0x2), + dict(name=name, value=maxVal)] + statAxes.append(dict(tag=tag, name=name, values=values)) + fb.setupStat(statAxes) + fb.setupOS2() fb.setupPost() fb.setupDummyDSIG() diff --git a/Tests/merge_test.py b/Tests/merge_test.py index 00e719b8..0fb89c10 100644 --- a/Tests/merge_test.py +++ b/Tests/merge_test.py @@ -1,7 +1,12 @@ +import io +import itertools from fontTools.misc.py23 import * from fontTools import ttLib +from fontTools.ttLib.tables._g_l_y_f import Glyph +from fontTools.fontBuilder import FontBuilder from fontTools.merge import * import unittest +import pytest class MergeIntegrationTest(unittest.TestCase): @@ -113,6 +118,53 @@ class CmapMergeUnitTest(unittest.TestCase): self.assertEqual(self.merger.duplicateGlyphsPerFont, [{}, {'space#0': 'space#1'}]) +def _compile(ttFont): + buf = io.BytesIO() + ttFont.save(buf) + buf.seek(0) + return buf + + +def _make_fontfile_with_OS2(*, version, **kwargs): + upem = 1000 + glyphOrder = [".notdef", "a"] + cmap = {0x61: "a"} + glyphs = {gn: Glyph() for gn in glyphOrder} + hmtx = {gn: (500, 0) for gn in glyphOrder} + names = {"familyName": "TestOS2", "styleName": "Regular"} + + fb = FontBuilder(unitsPerEm=upem) + fb.setupGlyphOrder(glyphOrder) + fb.setupCharacterMap(cmap) + fb.setupGlyf(glyphs) + fb.setupHorizontalMetrics(hmtx) + fb.setupHorizontalHeader() + fb.setupNameTable(names) + fb.setupOS2(version=version, **kwargs) + + return _compile(fb.font) + + +def _merge_and_recompile(fontfiles, options=None): + merger = Merger(options) + merged = merger.merge(fontfiles) + buf = _compile(merged) + return ttLib.TTFont(buf) + + +@pytest.mark.parametrize( + "v1, v2", list(itertools.permutations(range(5+1), 2)) +) +def test_merge_OS2_mixed_versions(v1, v2): + # https://github.com/fonttools/fonttools/issues/1865 + fontfiles = [ + _make_fontfile_with_OS2(version=v1), + _make_fontfile_with_OS2(version=v2), + ] + merged = _merge_and_recompile(fontfiles) + assert merged["OS/2"].version == max(v1, v2) + + if __name__ == "__main__": import sys sys.exit(unittest.main()) diff --git a/Tests/otlLib/builder_test.py b/Tests/otlLib/builder_test.py index 3675395f..727d685f 100644 --- a/Tests/otlLib/builder_test.py +++ b/Tests/otlLib/builder_test.py @@ -1,5 +1,9 @@ +import io +import struct +from fontTools.misc.fixedTools import floatToFixed from fontTools.misc.testTools import getXML from fontTools.otlLib import builder +from fontTools import ttLib from fontTools.ttLib.tables import otTables import pytest @@ -1106,6 +1110,291 @@ class ClassDefBuilderTest(object): assert not b.canAdd({"f"}) +buildStatTable_test_data = [ + ([ + dict( + tag="wght", + name="Weight", + values=[ + dict(value=100, name='Thin'), + dict(value=400, name='Regular', flags=0x2), + dict(value=900, name='Black')])], None, "Regular", [ + ' <STAT>', + ' <Version value="0x00010001"/>', + ' <DesignAxisRecordSize value="8"/>', + ' <!-- DesignAxisCount=1 -->', + ' <DesignAxisRecord>', + ' <Axis index="0">', + ' <AxisTag value="wght"/>', + ' <AxisNameID value="257"/> <!-- Weight -->', + ' <AxisOrdering value="0"/>', + ' </Axis>', + ' </DesignAxisRecord>', + ' <!-- AxisValueCount=3 -->', + ' <AxisValueArray>', + ' <AxisValue index="0" Format="1">', + ' <AxisIndex value="0"/>', + ' <Flags value="0"/>', + ' <ValueNameID value="258"/> <!-- Thin -->', + ' <Value value="100.0"/>', + ' </AxisValue>', + ' <AxisValue index="1" Format="1">', + ' <AxisIndex value="0"/>', + ' <Flags value="2"/>', + ' <ValueNameID value="256"/> <!-- Regular -->', + ' <Value value="400.0"/>', + ' </AxisValue>', + ' <AxisValue index="2" Format="1">', + ' <AxisIndex value="0"/>', + ' <Flags value="0"/>', + ' <ValueNameID value="259"/> <!-- Black -->', + ' <Value value="900.0"/>', + ' </AxisValue>', + ' </AxisValueArray>', + ' <ElidedFallbackNameID value="256"/> <!-- Regular -->', + ' </STAT>']), + ([ + dict( + tag="wght", + name=dict(en="Weight", nl="Gewicht"), + values=[ + dict(value=100, name=dict(en='Thin', nl='Dun')), + dict(value=400, name='Regular', flags=0x2), + dict(value=900, name='Black'), + ]), + dict( + tag="wdth", + name="Width", + values=[ + dict(value=50, name='Condensed'), + dict(value=100, name='Regular', flags=0x2), + dict(value=200, name='Extended')])], None, 2, [ + ' <STAT>', + ' <Version value="0x00010001"/>', + ' <DesignAxisRecordSize value="8"/>', + ' <!-- DesignAxisCount=2 -->', + ' <DesignAxisRecord>', + ' <Axis index="0">', + ' <AxisTag value="wght"/>', + ' <AxisNameID value="256"/> <!-- Weight -->', + ' <AxisOrdering value="0"/>', + ' </Axis>', + ' <Axis index="1">', + ' <AxisTag value="wdth"/>', + ' <AxisNameID value="260"/> <!-- Width -->', + ' <AxisOrdering value="1"/>', + ' </Axis>', + ' </DesignAxisRecord>', + ' <!-- AxisValueCount=6 -->', + ' <AxisValueArray>', + ' <AxisValue index="0" Format="1">', + ' <AxisIndex value="0"/>', + ' <Flags value="0"/>', + ' <ValueNameID value="257"/> <!-- Thin -->', + ' <Value value="100.0"/>', + ' </AxisValue>', + ' <AxisValue index="1" Format="1">', + ' <AxisIndex value="0"/>', + ' <Flags value="2"/>', + ' <ValueNameID value="258"/> <!-- Regular -->', + ' <Value value="400.0"/>', + ' </AxisValue>', + ' <AxisValue index="2" Format="1">', + ' <AxisIndex value="0"/>', + ' <Flags value="0"/>', + ' <ValueNameID value="259"/> <!-- Black -->', + ' <Value value="900.0"/>', + ' </AxisValue>', + ' <AxisValue index="3" Format="1">', + ' <AxisIndex value="1"/>', + ' <Flags value="0"/>', + ' <ValueNameID value="261"/> <!-- Condensed -->', + ' <Value value="50.0"/>', + ' </AxisValue>', + ' <AxisValue index="4" Format="1">', + ' <AxisIndex value="1"/>', + ' <Flags value="2"/>', + ' <ValueNameID value="258"/> <!-- Regular -->', + ' <Value value="100.0"/>', + ' </AxisValue>', + ' <AxisValue index="5" Format="1">', + ' <AxisIndex value="1"/>', + ' <Flags value="0"/>', + ' <ValueNameID value="262"/> <!-- Extended -->', + ' <Value value="200.0"/>', + ' </AxisValue>', + ' </AxisValueArray>', + ' <ElidedFallbackNameID value="2"/> <!-- missing from name table -->', + ' </STAT>']), + ([ + dict( + tag="wght", + name="Weight", + values=[ + dict(value=400, name='Regular', flags=0x2), + dict(value=600, linkedValue=650, name='Bold')])], None, 18, [ + ' <STAT>', + ' <Version value="0x00010001"/>', + ' <DesignAxisRecordSize value="8"/>', + ' <!-- DesignAxisCount=1 -->', + ' <DesignAxisRecord>', + ' <Axis index="0">', + ' <AxisTag value="wght"/>', + ' <AxisNameID value="256"/> <!-- Weight -->', + ' <AxisOrdering value="0"/>', + ' </Axis>', + ' </DesignAxisRecord>', + ' <!-- AxisValueCount=2 -->', + ' <AxisValueArray>', + ' <AxisValue index="0" Format="1">', + ' <AxisIndex value="0"/>', + ' <Flags value="2"/>', + ' <ValueNameID value="257"/> <!-- Regular -->', + ' <Value value="400.0"/>', + ' </AxisValue>', + ' <AxisValue index="1" Format="3">', + ' <AxisIndex value="0"/>', + ' <Flags value="0"/>', + ' <ValueNameID value="258"/> <!-- Bold -->', + ' <Value value="600.0"/>', + ' <LinkedValue value="650.0"/>', + ' </AxisValue>', + ' </AxisValueArray>', + ' <ElidedFallbackNameID value="18"/> <!-- missing from name table -->', + ' </STAT>']), + ([ + dict( + tag="opsz", + name="Optical Size", + values=[ + dict(nominalValue=6, rangeMaxValue=10, name='Small'), + dict(rangeMinValue=10, nominalValue=14, rangeMaxValue=24, name='Text', flags=0x2), + dict(rangeMinValue=24, nominalValue=600, name='Display')])], None, 2, [ + ' <STAT>', + ' <Version value="0x00010001"/>', + ' <DesignAxisRecordSize value="8"/>', + ' <!-- DesignAxisCount=1 -->', + ' <DesignAxisRecord>', + ' <Axis index="0">', + ' <AxisTag value="opsz"/>', + ' <AxisNameID value="256"/> <!-- Optical Size -->', + ' <AxisOrdering value="0"/>', + ' </Axis>', + ' </DesignAxisRecord>', + ' <!-- AxisValueCount=3 -->', + ' <AxisValueArray>', + ' <AxisValue index="0" Format="2">', + ' <AxisIndex value="0"/>', + ' <Flags value="0"/>', + ' <ValueNameID value="257"/> <!-- Small -->', + ' <NominalValue value="6.0"/>', + ' <RangeMinValue value="-32768.0"/>', + ' <RangeMaxValue value="10.0"/>', + ' </AxisValue>', + ' <AxisValue index="1" Format="2">', + ' <AxisIndex value="0"/>', + ' <Flags value="2"/>', + ' <ValueNameID value="258"/> <!-- Text -->', + ' <NominalValue value="14.0"/>', + ' <RangeMinValue value="10.0"/>', + ' <RangeMaxValue value="24.0"/>', + ' </AxisValue>', + ' <AxisValue index="2" Format="2">', + ' <AxisIndex value="0"/>', + ' <Flags value="0"/>', + ' <ValueNameID value="259"/> <!-- Display -->', + ' <NominalValue value="600.0"/>', + ' <RangeMinValue value="24.0"/>', + ' <RangeMaxValue value="32767.99998"/>', + ' </AxisValue>', + ' </AxisValueArray>', + ' <ElidedFallbackNameID value="2"/> <!-- missing from name table -->', + ' </STAT>']), + ([ + dict( + tag="wght", + name="Weight", + ordering=1, + values=[]), + dict( + tag="ABCD", + name="ABCDTest", + ordering=0, + values=[ + dict(value=100, name="Regular", flags=0x2)])], + [dict(location=dict(wght=300, ABCD=100), name='Regular ABCD')], 18, [ + ' <STAT>', + ' <Version value="0x00010002"/>', + ' <DesignAxisRecordSize value="8"/>', + ' <!-- DesignAxisCount=2 -->', + ' <DesignAxisRecord>', + ' <Axis index="0">', + ' <AxisTag value="wght"/>', + ' <AxisNameID value="256"/> <!-- Weight -->', + ' <AxisOrdering value="1"/>', + ' </Axis>', + ' <Axis index="1">', + ' <AxisTag value="ABCD"/>', + ' <AxisNameID value="257"/> <!-- ABCDTest -->', + ' <AxisOrdering value="0"/>', + ' </Axis>', + ' </DesignAxisRecord>', + ' <!-- AxisValueCount=2 -->', + ' <AxisValueArray>', + ' <AxisValue index="0" Format="4">', + ' <!-- AxisCount=2 -->', + ' <Flags value="0"/>', + ' <ValueNameID value="259"/> <!-- Regular ABCD -->', + ' <AxisValueRecord index="0">', + ' <AxisIndex value="0"/>', + ' <Value value="300.0"/>', + ' </AxisValueRecord>', + ' <AxisValueRecord index="1">', + ' <AxisIndex value="1"/>', + ' <Value value="100.0"/>', + ' </AxisValueRecord>', + ' </AxisValue>', + ' <AxisValue index="1" Format="1">', + ' <AxisIndex value="1"/>', + ' <Flags value="2"/>', + ' <ValueNameID value="258"/> <!-- Regular -->', + ' <Value value="100.0"/>', + ' </AxisValue>', + ' </AxisValueArray>', + ' <ElidedFallbackNameID value="18"/> <!-- missing from name table -->', + ' </STAT>']), +] + + +@pytest.mark.parametrize("axes, axisValues, elidedFallbackName, expected_ttx", buildStatTable_test_data) +def test_buildStatTable(axes, axisValues, elidedFallbackName, expected_ttx): + font = ttLib.TTFont() + font["name"] = ttLib.newTable("name") + font["name"].names = [] + builder.buildStatTable(font, axes, axisValues, elidedFallbackName) + f = io.StringIO() + font.saveXML(f, tables=["STAT"]) + ttx = f.getvalue().splitlines() + ttx = ttx[3:-2] # strip XML header and <ttFont> element + assert expected_ttx == ttx + # Compile and round-trip + f = io.BytesIO() + font.save(f) + font = ttLib.TTFont(f) + f = io.StringIO() + font.saveXML(f, tables=["STAT"]) + ttx = f.getvalue().splitlines() + ttx = ttx[3:-2] # strip XML header and <ttFont> element + assert expected_ttx == ttx + + +def test_stat_infinities(): + negInf = floatToFixed(builder.AXIS_VALUE_NEGATIVE_INFINITY, 16) + assert struct.pack(">l", negInf) == b"\x80\x00\x00\x00" + posInf = floatToFixed(builder.AXIS_VALUE_POSITIVE_INFINITY, 16) + assert struct.pack(">l", posInf) == b"\x7f\xff\xff\xff" + + if __name__ == "__main__": import sys diff --git a/Tests/subset/data/TestContextSubstFormat3.ttx b/Tests/subset/data/TestContextSubstFormat3.ttx new file mode 100644 index 00000000..899b037e --- /dev/null +++ b/Tests/subset/data/TestContextSubstFormat3.ttx @@ -0,0 +1,610 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.9"> + + <GlyphOrder> + <!-- The 'id' attribute is only for humans; it is ignored when parsed. --> + <GlyphID id="0" name=".notdef"/> + <GlyphID id="1" name="plus"/> + <GlyphID id="2" name="glyph00002"/> + <GlyphID id="3" name="glyph00003"/> + <GlyphID id="4" name="glyph00004"/> + <GlyphID id="5" name="glyph00005"/> + <GlyphID id="6" name="glyph00006"/> + <GlyphID id="7" name="glyph00007"/> + </GlyphOrder> + + <head> + <!-- Most of this table will be recalculated by the compiler --> + <tableVersion value="1.0"/> + <fontRevision value="1.0"/> + <checkSumAdjustment value="0xa69ed898"/> + <magicNumber value="0x5f0f3cf5"/> + <flags value="00000000 00001111"/> + <unitsPerEm value="1000"/> + <created value="Mon Nov 21 06:10:39 2016"/> + <modified value="Fri Apr 24 05:31:23 2020"/> + <xMin value="-1000"/> + <yMin value="-509"/> + <xMax value="1135"/> + <yMax value="1194"/> + <macStyle value="00000000 00000000"/> + <lowestRecPPEM value="8"/> + <fontDirectionHint value="0"/> + <indexToLocFormat value="0"/> + <glyphDataFormat value="0"/> + </head> + + <hhea> + <tableVersion value="0x00010000"/> + <ascent value="977"/> + <descent value="-205"/> + <lineGap value="67"/> + <advanceWidthMax value="1000"/> + <minLeftSideBearing value="-1000"/> + <minRightSideBearing value="-1000"/> + <xMaxExtent value="1135"/> + <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> + <!-- Most of this table will be recalculated by the compiler --> + <tableVersion value="0x10000"/> + <numGlyphs value="8"/> + <maxPoints value="240"/> + <maxContours value="41"/> + <maxCompositePoints value="163"/> + <maxCompositeContours value="12"/> + <maxZones value="1"/> + <maxTwilightPoints value="0"/> + <maxStorage value="0"/> + <maxFunctionDefs value="0"/> + <maxInstructionDefs value="0"/> + <maxStackElements value="0"/> + <maxSizeOfInstructions value="0"/> + <maxComponentElements value="4"/> + <maxComponentDepth value="3"/> + </maxp> + + <OS_2> + <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex' + will be recalculated by the compiler --> + <version value="4"/> + <xAvgCharWidth value="500"/> + <usWeightClass value="500"/> + <usWidthClass value="5"/> + <fsType value="00000000 00000000"/> + <ySubscriptXSize value="665"/> + <ySubscriptYSize value="716"/> + <ySubscriptXOffset value="0"/> + <ySubscriptYOffset value="143"/> + <ySuperscriptXSize value="0"/> + <ySuperscriptYSize value="0"/> + <ySuperscriptXOffset value="0"/> + <ySuperscriptYOffset value="0"/> + <yStrikeoutSize value="51"/> + <yStrikeoutPosition value="265"/> + <sFamilyClass value="2057"/> + <panose> + <bFamilyType value="2"/> + <bSerifStyle value="0"/> + <bWeight value="6"/> + <bProportion value="9"/> + <bContrast value="0"/> + <bStrokeVariation value="0"/> + <bArmStyle value="0"/> + <bLetterForm value="0"/> + <bMidline value="0"/> + <bXHeight value="0"/> + </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="BE5N"/> + <fsSelection value="00000000 11000000"/> + <usFirstCharIndex value="43"/> + <usLastCharIndex value="43"/> + <sTypoAscender value="977"/> + <sTypoDescender value="-272"/> + <sTypoLineGap value="0"/> + <usWinAscent value="977"/> + <usWinDescent value="272"/> + <ulCodePageRange1 value="00100000 00000000 00000001 00011111"/> + <ulCodePageRange2 value="11000100 00000000 00000000 00000000"/> + <sxHeight value="530"/> + <sCapHeight value="735"/> + <usDefaultChar value="0"/> + <usBreakChar value="32"/> + <usMaxContext value="8"/> + </OS_2> + + <hmtx> + <mtx name=".notdef" width="500" lsb="57"/> + <mtx name="glyph00002" width="500" lsb="57"/> + <mtx name="glyph00003" width="500" lsb="57"/> + <mtx name="glyph00004" width="500" lsb="-8"/> + <mtx name="glyph00005" width="500" lsb="-8"/> + <mtx name="glyph00006" width="500" lsb="-8"/> + <mtx name="glyph00007" width="500" lsb="-65"/> + <mtx name="plus" width="500" lsb="57"/> + </hmtx> + + <cmap> + <tableVersion version="0"/> + <cmap_format_4 platformID="0" platEncID="3" language="0"> + <map code="0x2b" name="plus"/><!-- PLUS SIGN --> + </cmap_format_4> + <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="28" language="0" nGroups="1"> + <map code="0x2b" name="plus"/><!-- PLUS SIGN --> + </cmap_format_12> + <cmap_format_4 platformID="3" platEncID="1" language="0"> + <map code="0x2b" name="plus"/><!-- PLUS SIGN --> + </cmap_format_4> + <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="28" language="0" nGroups="1"> + <map code="0x2b" name="plus"/><!-- PLUS SIGN --> + </cmap_format_12> + </cmap> + + <loca> + <!-- The 'loca' table will be calculated by the compiler --> + </loca> + + <glyf> + + <!-- The xMin, yMin, xMax and yMax values + will be recalculated by the compiler. --> + + <TTGlyph name=".notdef"/><!-- contains no outline data --> + + <TTGlyph name="glyph00002" xMin="57" yMin="139" xMax="508" yMax="541"> + <contour> + <pt x="203" y="139" on="1"/> + <pt x="203" y="298" on="1"/> + <pt x="57" y="298" on="1"/> + <pt x="57" y="382" on="1"/> + <pt x="203" y="382" on="1"/> + <pt x="203" y="541" on="1"/> + <pt x="297" y="541" on="1"/> + <pt x="297" y="382" on="1"/> + <pt x="508" y="382" on="1"/> + <pt x="508" y="298" on="1"/> + <pt x="297" y="298" on="1"/> + <pt x="297" y="139" on="1"/> + </contour> + <instructions/> + </TTGlyph> + + <TTGlyph name="glyph00003" xMin="57" yMin="139" xMax="508" yMax="541"> + <contour> + <pt x="260" y="139" on="1"/> + <pt x="260" y="298" on="1"/> + <pt x="57" y="298" on="1"/> + <pt x="57" y="382" on="1"/> + <pt x="260" y="382" on="1"/> + <pt x="260" y="541" on="1"/> + <pt x="354" y="541" on="1"/> + <pt x="354" y="382" on="1"/> + <pt x="508" y="382" on="1"/> + <pt x="508" y="298" on="1"/> + <pt x="354" y="298" on="1"/> + <pt x="354" y="139" on="1"/> + </contour> + <instructions/> + </TTGlyph> + + <TTGlyph name="glyph00004" xMin="-8" yMin="139" xMax="508" yMax="541"> + <contour> + <pt x="203" y="139" on="1"/> + <pt x="203" y="298" on="1"/> + <pt x="-8" y="298" on="1"/> + <pt x="-8" y="382" on="1"/> + <pt x="203" y="382" on="1"/> + <pt x="203" y="541" on="1"/> + <pt x="297" y="541" on="1"/> + <pt x="297" y="382" on="1"/> + <pt x="508" y="382" on="1"/> + <pt x="508" y="298" on="1"/> + <pt x="297" y="298" on="1"/> + <pt x="297" y="139" on="1"/> + </contour> + <instructions/> + </TTGlyph> + + <TTGlyph name="glyph00005" xMin="-8" yMin="139" xMax="443" yMax="541"> + <contour> + <pt x="203" y="139" on="1"/> + <pt x="203" y="298" on="1"/> + <pt x="-8" y="298" on="1"/> + <pt x="-8" y="382" on="1"/> + <pt x="203" y="382" on="1"/> + <pt x="203" y="541" on="1"/> + <pt x="297" y="541" on="1"/> + <pt x="297" y="382" on="1"/> + <pt x="443" y="382" on="1"/> + <pt x="443" y="298" on="1"/> + <pt x="297" y="298" on="1"/> + <pt x="297" y="139" on="1"/> + </contour> + <instructions/> + </TTGlyph> + + <TTGlyph name="glyph00006" xMin="-8" yMin="139" xMax="443" yMax="541"> + <contour> + <pt x="146" y="139" on="1"/> + <pt x="146" y="298" on="1"/> + <pt x="-8" y="298" on="1"/> + <pt x="-8" y="382" on="1"/> + <pt x="146" y="382" on="1"/> + <pt x="146" y="541" on="1"/> + <pt x="240" y="541" on="1"/> + <pt x="240" y="382" on="1"/> + <pt x="443" y="382" on="1"/> + <pt x="443" y="298" on="1"/> + <pt x="240" y="298" on="1"/> + <pt x="240" y="139" on="1"/> + </contour> + <instructions/> + </TTGlyph> + + <TTGlyph name="glyph00007" xMin="-65" yMin="139" xMax="443" yMax="541"> + <contour> + <pt x="203" y="139" on="1"/> + <pt x="203" y="298" on="1"/> + <pt x="-65" y="298" on="1"/> + <pt x="-65" y="382" on="1"/> + <pt x="203" y="382" on="1"/> + <pt x="203" y="541" on="1"/> + <pt x="297" y="541" on="1"/> + <pt x="297" y="382" on="1"/> + <pt x="443" y="382" on="1"/> + <pt x="443" y="298" on="1"/> + <pt x="297" y="298" on="1"/> + <pt x="297" y="139" on="1"/> + </contour> + <instructions/> + </TTGlyph> + + <TTGlyph name="plus" xMin="57" yMin="139" xMax="443" yMax="541"> + <contour> + <pt x="203" y="139" on="1"/> + <pt x="203" y="298" on="1"/> + <pt x="57" y="298" on="1"/> + <pt x="57" y="382" on="1"/> + <pt x="203" y="382" on="1"/> + <pt x="203" y="541" on="1"/> + <pt x="297" y="541" on="1"/> + <pt x="297" y="382" on="1"/> + <pt x="443" y="382" on="1"/> + <pt x="443" y="298" on="1"/> + <pt x="297" y="298" on="1"/> + <pt x="297" y="139" on="1"/> + </contour> + <instructions/> + </TTGlyph> + + </glyf> + + <name> + <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409"> + Copyright (c) 2015-2019 Belleve Invis. + </namerecord> + <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409"> + Iosevka Medium + </namerecord> + <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409"> + Regular + </namerecord> + <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409"> + Iosevka Medium Version 3.0.0-rc.8 + </namerecord> + <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409"> + Iosevka Medium + </namerecord> + <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409"> + Version 3.0.0-rc.8; ttfautohint (v1.8.3) + </namerecord> + <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409"> + Iosevka-Medium + </namerecord> + </name> + + <post> + <formatType value="3.0"/> + <italicAngle value="0.0"/> + <underlinePosition value="-50"/> + <underlineThickness value="50"/> + <isFixedPitch value="1"/> + <minMemType42 value="0"/> + <maxMemType42 value="6380"/> + <minMemType1 value="0"/> + <maxMemType1 value="1"/> + </post> + + <gasp> + <gaspRange rangeMaxPPEM="65535" rangeGaspBehavior="15"/> + </gasp> + + <GDEF> + <Version value="0x00010000"/> + <GlyphClassDef Format="2"> + <ClassDef glyph=".notdef" class="1"/> + <ClassDef glyph="glyph00002" class="1"/> + <ClassDef glyph="glyph00003" class="1"/> + <ClassDef glyph="glyph00004" class="1"/> + <ClassDef glyph="glyph00005" class="1"/> + <ClassDef glyph="glyph00006" class="1"/> + <ClassDef glyph="glyph00007" class="1"/> + <ClassDef glyph="plus" class="1"/> + </GlyphClassDef> + </GDEF> + + <GPOS> + <Version value="0x00010000"/> + <ScriptList> + <!-- ScriptCount=1 --> + <ScriptRecord index="0"> + <ScriptTag value="DFLT"/> + <Script> + <DefaultLangSys> + <ReqFeatureIndex value="65535"/> + <!-- FeatureCount=0 --> + </DefaultLangSys> + <!-- LangSysCount=0 --> + </Script> + </ScriptRecord> + </ScriptList> + <FeatureList> + <!-- FeatureCount=0 --> + </FeatureList> + <LookupList> + <!-- LookupCount=0 --> + </LookupList> + </GPOS> + + <GSUB> + <Version value="0x00010000"/> + <ScriptList> + <!-- ScriptCount=4 --> + <ScriptRecord index="0"> + <ScriptTag value="DFLT"/> + <Script> + <DefaultLangSys> + <ReqFeatureIndex value="65535"/> + <!-- FeatureCount=1 --> + <FeatureIndex index="0" value="0"/> + </DefaultLangSys> + <!-- LangSysCount=0 --> + </Script> + </ScriptRecord> + <ScriptRecord index="1"> + <ScriptTag value="cyrl"/> + <Script> + <DefaultLangSys> + <ReqFeatureIndex value="65535"/> + <!-- FeatureCount=1 --> + <FeatureIndex index="0" value="0"/> + </DefaultLangSys> + <!-- LangSysCount=0 --> + </Script> + </ScriptRecord> + <ScriptRecord index="2"> + <ScriptTag value="grek"/> + <Script> + <DefaultLangSys> + <ReqFeatureIndex value="65535"/> + <!-- FeatureCount=1 --> + <FeatureIndex index="0" value="0"/> + </DefaultLangSys> + <!-- LangSysCount=0 --> + </Script> + </ScriptRecord> + <ScriptRecord index="3"> + <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="calt"/> + <Feature> + <!-- LookupCount=2 --> + <LookupListIndex index="0" value="0"/> + <LookupListIndex index="1" value="1"/> + </Feature> + </FeatureRecord> + </FeatureList> + <LookupList> + <!-- LookupCount=6 --> + <Lookup index="0"> + <LookupType value="6"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <ChainContextSubst index="0" Format="2"> + <Coverage Format="1"> + <Glyph value="plus"/> + </Coverage> + <BacktrackClassDef Format="1"> + <ClassDef glyph="glyph00005" class="1"/> + <ClassDef glyph="glyph00007" class="1"/> + </BacktrackClassDef> + <InputClassDef Format="1"> + <ClassDef glyph="plus" class="1"/> + </InputClassDef> + <LookAheadClassDef Format="2"> + </LookAheadClassDef> + <!-- ChainSubClassSetCount=2 --> + <ChainSubClassSet index="0" empty="1"/> + <ChainSubClassSet index="1"> + <!-- ChainSubClassRuleCount=4 --> + <ChainSubClassRule index="0"> + <!-- BacktrackGlyphCount=1 --> + <Backtrack index="0" value="1"/> + <!-- InputGlyphCount=1 --> + <!-- LookAheadGlyphCount=0 --> + <!-- SubstCount=1 --> + <SubstLookupRecord index="0"> + <SequenceIndex value="0"/> + <LookupListIndex value="5"/> + </SubstLookupRecord> + </ChainSubClassRule> + <ChainSubClassRule index="1"> + <!-- BacktrackGlyphCount=0 --> + <!-- InputGlyphCount=4 --> + <Input index="0" value="1"/> + <Input index="1" value="1"/> + <Input index="2" value="1"/> + <!-- LookAheadGlyphCount=0 --> + <!-- SubstCount=4 --> + <SubstLookupRecord index="0"> + <SequenceIndex value="0"/> + <LookupListIndex value="4"/> + </SubstLookupRecord> + <SubstLookupRecord index="1"> + <SequenceIndex value="1"/> + <LookupListIndex value="3"/> + </SubstLookupRecord> + <SubstLookupRecord index="2"> + <SequenceIndex value="2"/> + <LookupListIndex value="3"/> + </SubstLookupRecord> + <SubstLookupRecord index="3"> + <SequenceIndex value="3"/> + <LookupListIndex value="2"/> + </SubstLookupRecord> + </ChainSubClassRule> + <ChainSubClassRule index="2"> + <!-- BacktrackGlyphCount=0 --> + <!-- InputGlyphCount=3 --> + <Input index="0" value="1"/> + <Input index="1" value="1"/> + <!-- LookAheadGlyphCount=0 --> + <!-- SubstCount=3 --> + <SubstLookupRecord index="0"> + <SequenceIndex value="0"/> + <LookupListIndex value="4"/> + </SubstLookupRecord> + <SubstLookupRecord index="1"> + <SequenceIndex value="1"/> + <LookupListIndex value="3"/> + </SubstLookupRecord> + <SubstLookupRecord index="2"> + <SequenceIndex value="2"/> + <LookupListIndex value="2"/> + </SubstLookupRecord> + </ChainSubClassRule> + <ChainSubClassRule index="3"> + <!-- BacktrackGlyphCount=0 --> + <!-- InputGlyphCount=2 --> + <Input index="0" value="1"/> + <!-- LookAheadGlyphCount=0 --> + <!-- SubstCount=2 --> + <SubstLookupRecord index="0"> + <SequenceIndex value="0"/> + <LookupListIndex value="4"/> + </SubstLookupRecord> + <SubstLookupRecord index="1"> + <SequenceIndex value="1"/> + <LookupListIndex value="2"/> + </SubstLookupRecord> + </ChainSubClassRule> + </ChainSubClassSet> + </ChainContextSubst> + </Lookup> + <Lookup index="1"> + <LookupType value="5"/> + <LookupFlag value="0"/> + <!-- SubTableCount=2 --> + <ContextSubst index="0" Format="3"> + <!-- GlyphCount=3 --> + <!-- SubstCount=2 --> + <Coverage index="0" Format="1"> + <Glyph value="glyph00002"/> + </Coverage> + <Coverage index="1" Format="1"> + <Glyph value="glyph00004"/> + </Coverage> + <Coverage index="2" Format="1"> + <Glyph value="glyph00005"/> + </Coverage> + <SubstLookupRecord index="0"> + <SequenceIndex value="0"/> + <LookupListIndex value="5"/> + </SubstLookupRecord> + <SubstLookupRecord index="1"> + <SequenceIndex value="2"/> + <LookupListIndex value="5"/> + </SubstLookupRecord> + </ContextSubst> + <ContextSubst index="1" Format="3"> + <!-- GlyphCount=2 --> + <!-- SubstCount=2 --> + <Coverage index="0" Format="1"> + <Glyph value="glyph00002"/> + </Coverage> + <Coverage index="1" Format="1"> + <Glyph value="glyph00005"/> + </Coverage> + <SubstLookupRecord index="0"> + <SequenceIndex value="0"/> + <LookupListIndex value="5"/> + </SubstLookupRecord> + <SubstLookupRecord index="1"> + <SequenceIndex value="1"/> + <LookupListIndex value="5"/> + </SubstLookupRecord> + </ContextSubst> + </Lookup> + <Lookup index="2"> + <LookupType value="1"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <SingleSubst index="0" Format="1"> + <Substitution in="plus" out="glyph00005"/> + </SingleSubst> + </Lookup> + <Lookup index="3"> + <LookupType value="1"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <SingleSubst index="0" Format="1"> + <Substitution in="plus" out="glyph00004"/> + </SingleSubst> + </Lookup> + <Lookup index="4"> + <LookupType value="1"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <SingleSubst index="0" Format="1"> + <Substitution in="plus" out="glyph00002"/> + </SingleSubst> + </Lookup> + <Lookup index="5"> + <LookupType value="1"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <SingleSubst index="0" Format="2"> + <Substitution in="glyph00002" out="glyph00003"/> + <Substitution in="glyph00005" out="glyph00006"/> + <Substitution in="plus" out="glyph00007"/> + </SingleSubst> + </Lookup> + </LookupList> + </GSUB> + +</ttFont> diff --git a/Tests/subset/subset_test.py b/Tests/subset/subset_test.py index 2493daff..2cce9baf 100644 --- a/Tests/subset/subset_test.py +++ b/Tests/subset/subset_test.py @@ -56,7 +56,7 @@ class SubsetTest(unittest.TestCase): lines.append(line.rstrip() + os.linesep) return lines - def expect_ttx(self, font, expected_ttx, tables): + def expect_ttx(self, font, expected_ttx, tables=None): path = self.temp_path(suffix=".ttx") font.saveXML(path, tables=tables) actual = self.read_ttx(path) @@ -732,6 +732,17 @@ class SubsetTest(unittest.TestCase): self.assertEqual(ttf.flavor, None) + def test_subset_context_subst_format_3(self): + # https://github.com/fonttools/fonttools/issues/1879 + # Test font contains 'calt' feature with Format 3 ContextSubst lookup subtables + ttx = self.getpath("TestContextSubstFormat3.ttx") + font, fontpath = self.compile_font(ttx, ".ttf") + subsetpath = self.temp_path(".ttf") + subset.main([fontpath, "--unicodes=*", "--output-file=%s" % subsetpath]) + subsetfont = TTFont(subsetpath) + # check all glyphs are kept via GSUB closure, no changes expected + self.expect_ttx(subsetfont, ttx) + @pytest.fixture def featureVarsTestFont(): diff --git a/Tests/ttLib/tables/_g_v_a_r_test.py b/Tests/ttLib/tables/_g_v_a_r_test.py index 6de6e247..9a00fded 100644 --- a/Tests/ttLib/tables/_g_v_a_r_test.py +++ b/Tests/ttLib/tables/_g_v_a_r_test.py @@ -81,15 +81,6 @@ GVAR_VARIATIONS = { GVAR_XML = [ '<version value="1"/>', '<reserved value="0"/>', - '<glyphVariations glyph="space">', - ' <tuple>', - ' <coord axis="wdth" value="0.7"/>', - ' <delta pt="0" x="1" y="11"/>', - ' <delta pt="1" x="2" y="22"/>', - ' <delta pt="2" x="3" y="33"/>', - ' <delta pt="3" x="4" y="44"/>', - ' </tuple>', - '</glyphVariations>', '<glyphVariations glyph="I">', ' <tuple>', ' <coord axis="wght" min="0.0" value="0.5" max="1.0"/>', @@ -113,6 +104,15 @@ GVAR_XML = [ ' <delta pt="7" x="1" y="11"/>', ' </tuple>', '</glyphVariations>', + '<glyphVariations glyph="space">', + ' <tuple>', + ' <coord axis="wdth" value="0.7"/>', + ' <delta pt="0" x="1" y="11"/>', + ' <delta pt="1" x="2" y="22"/>', + ' <delta pt="2" x="3" y="33"/>', + ' <delta pt="3" x="4" y="44"/>', + ' </tuple>', + '</glyphVariations>', ] diff --git a/Tests/ttLib/tables/_m_e_t_a_test.py b/Tests/ttLib/tables/_m_e_t_a_test.py index 4f0a4158..3a4f2f5b 100644 --- a/Tests/ttLib/tables/_m_e_t_a_test.py +++ b/Tests/ttLib/tables/_m_e_t_a_test.py @@ -58,6 +58,19 @@ class MetaTableTest(unittest.TestCase): '</hexdata>' ], [line.strip() for line in xml.splitlines()][1:]) + def test_toXML_ascii_data(self): + table = table__m_e_t_a() + table.data["TEST"] = b"Hello!" + writer = XMLWriter(BytesIO()) + table.toXML(writer, {"meta": table}) + xml = writer.file.getvalue().decode("utf-8") + self.assertEqual([ + '<hexdata tag="TEST">', + '<!-- ascii: Hello! -->', + '48656c6c 6f21', + '</hexdata>' + ], [line.strip() for line in xml.splitlines()][1:]) + def test_fromXML(self): table = table__m_e_t_a() for name, attrs, content in parseXML( diff --git a/Tests/ttLib/tables/_n_a_m_e_test.py b/Tests/ttLib/tables/_n_a_m_e_test.py index d770a523..5f5c965c 100644 --- a/Tests/ttLib/tables/_n_a_m_e_test.py +++ b/Tests/ttLib/tables/_n_a_m_e_test.py @@ -144,6 +144,48 @@ class NameTableTest(unittest.TestCase): rec2 = table.getName(2, 1, 0, 0) self.assertEqual(str(rec2), "Regular") + @staticmethod + def _get_test_names(): + names = { + "en": "Width", + "de-CH": "Breite", + "gsw-LI": "Bräiti", + } + namesSubSet = names.copy() + del namesSubSet["gsw-LI"] + namesSuperSet = names.copy() + namesSuperSet["nl"] = "Breedte" + return names, namesSubSet, namesSuperSet + + def test_findMultilingualName(self): + table = table__n_a_m_e() + names, namesSubSet, namesSuperSet = self._get_test_names() + nameID = table.addMultilingualName(names) + assert nameID is not None + self.assertEqual(nameID, table.findMultilingualName(names)) + self.assertEqual(nameID, table.findMultilingualName(namesSubSet)) + self.assertEqual(None, table.findMultilingualName(namesSuperSet)) + + def test_addMultilingualNameReuse(self): + table = table__n_a_m_e() + names, namesSubSet, namesSuperSet = self._get_test_names() + nameID = table.addMultilingualName(names) + assert nameID is not None + self.assertEqual(nameID, table.addMultilingualName(names)) + self.assertEqual(nameID, table.addMultilingualName(namesSubSet)) + self.assertNotEqual(None, table.addMultilingualName(namesSuperSet)) + + def test_findMultilingualNameNoMac(self): + table = table__n_a_m_e() + names, namesSubSet, namesSuperSet = self._get_test_names() + nameID = table.addMultilingualName(names, mac=False) + assert nameID is not None + self.assertEqual(nameID, table.findMultilingualName(names, mac=False)) + self.assertEqual(None, table.findMultilingualName(names)) + self.assertEqual(nameID, table.findMultilingualName(namesSubSet, mac=False)) + self.assertEqual(None, table.findMultilingualName(namesSubSet)) + self.assertEqual(None, table.findMultilingualName(namesSuperSet)) + def test_addMultilingualName(self): # Microsoft Windows has language codes for “English” (en) # and for “Standard German as used in Switzerland” (de-CH). diff --git a/Tests/ufoLib/glifLib_test.py b/Tests/ufoLib/glifLib_test.py index a29c76bf..0b12a064 100644 --- a/Tests/ufoLib/glifLib_test.py +++ b/Tests/ufoLib/glifLib_test.py @@ -1,3 +1,4 @@ +import logging import os import tempfile import shutil @@ -7,7 +8,9 @@ from .testSupport import getDemoFontGlyphSetPath from fontTools.ufoLib.glifLib import ( GlyphSet, glyphNameToFileName, readGlyphFromString, writeGlyphToString, ) +from fontTools.ufoLib.errors import GlifLibError, UnsupportedGLIFFormat, UnsupportedUFOFormat from fontTools.misc.etree import XML_DECLARATION +import pytest GLYPHSETDIR = getDemoFontGlyphSetPath() @@ -142,9 +145,9 @@ class _Glyph: pass -class ReadWriteFuncTest(unittest.TestCase): +class ReadWriteFuncTest: - def testRoundTrip(self): + def test_roundtrip(self): glyph = _Glyph() glyph.name = "a" glyph.unicodes = [0x0061] @@ -153,29 +156,105 @@ class ReadWriteFuncTest(unittest.TestCase): glyph2 = _Glyph() readGlyphFromString(s1, glyph2) - self.assertEqual(glyph.__dict__, glyph2.__dict__) + assert glyph.__dict__ == glyph2.__dict__ s2 = writeGlyphToString(glyph2.name, glyph2) - self.assertEqual(s1, s2) + assert s1 == s2 - def testXmlDeclaration(self): + def test_xml_declaration(self): s = writeGlyphToString("a", _Glyph()) - self.assertTrue(s.startswith(XML_DECLARATION % "UTF-8")) + assert s.startswith(XML_DECLARATION % "UTF-8") + + def test_parse_xml_remove_comments(self): + s = b"""<?xml version='1.0' encoding='UTF-8'?> + <!-- a comment --> + <glyph name="A" format="2"> + <advance width="1290"/> + <unicode hex="0041"/> + <!-- another comment --> + </glyph> + """ + + g = _Glyph() + readGlyphFromString(s, g) + + assert g.name == "A" + assert g.width == 1290 + assert g.unicodes == [0x0041] + + def test_read_unsupported_format_version(self, caplog): + s = """<?xml version='1.0' encoding='utf-8'?> + <glyph name="A" format="0" formatMinor="0"> + <advance width="500"/> + <unicode hex="0041"/> + </glyph> + """ + + with pytest.raises(UnsupportedGLIFFormat): + readGlyphFromString(s, _Glyph()) # validate=True by default + + with pytest.raises(UnsupportedGLIFFormat): + readGlyphFromString(s, _Glyph(), validate=True) + + caplog.clear() + with caplog.at_level(logging.WARNING, logger="fontTools.ufoLib.glifLib"): + readGlyphFromString(s, _Glyph(), validate=False) + + assert len(caplog.records) == 1 + assert "Unsupported GLIF format" in caplog.text + assert "Assuming the latest supported version" in caplog.text + + def test_read_allow_format_versions(self): + s = """<?xml version='1.0' encoding='utf-8'?> + <glyph name="A" format="2"> + <advance width="500"/> + <unicode hex="0041"/> + </glyph> + """ + + # these two calls are are equivalent + readGlyphFromString(s, _Glyph(), formatVersions=[1, 2]) + readGlyphFromString(s, _Glyph(), formatVersions=[(1, 0), (2, 0)]) + + # if at least one supported formatVersion, unsupported ones are ignored + readGlyphFromString(s, _Glyph(), formatVersions=[(2, 0), (123, 456)]) + + with pytest.raises( + ValueError, + match="None of the requested GLIF formatVersions are supported" + ): + readGlyphFromString(s, _Glyph(), formatVersions=[0, 2001]) + + with pytest.raises(GlifLibError, match="Forbidden GLIF format version"): + readGlyphFromString(s, _Glyph(), formatVersions=[1]) + + +def test_GlyphSet_unsupported_ufoFormatVersion(tmp_path, caplog): + with pytest.raises(UnsupportedUFOFormat): + GlyphSet(tmp_path, ufoFormatVersion=0) + with pytest.raises(UnsupportedUFOFormat): + GlyphSet(tmp_path, ufoFormatVersion=(0, 1)) + +def test_GlyphSet_writeGlyph_formatVersion(tmp_path): + src = GlyphSet(GLYPHSETDIR) + dst = GlyphSet(tmp_path, ufoFormatVersion=(2, 0)) + glyph = src["A"] -def test_parse_xml_remove_comments(): - s = b"""<?xml version='1.0' encoding='UTF-8'?> - <!-- a comment --> - <glyph name="A" format="2"> - <advance width="1290"/> - <unicode hex="0041"/> - <!-- another comment --> - </glyph> - """ + # no explicit formatVersion passed: use the more recent GLIF formatVersion + # that is supported by given ufoFormatVersion (GLIF 1 for UFO 2) + dst.writeGlyph("A", glyph) + glif = dst.getGLIF("A") + assert b'format="1"' in glif + assert b'formatMinor' not in glif # omitted when 0 - g = _Glyph() - readGlyphFromString(s, g) + # explicit, unknown formatVersion + with pytest.raises(UnsupportedGLIFFormat): + dst.writeGlyph("A", glyph, formatVersion=(0, 0)) - assert g.name == "A" - assert g.width == 1290 - assert g.unicodes == [0x0041] + # explicit, known formatVersion but unsupported by given ufoFormatVersion + with pytest.raises( + UnsupportedGLIFFormat, + match="Unsupported GLIF format version .*for UFO format version", + ): + dst.writeGlyph("A", glyph, formatVersion=(2, 0)) diff --git a/Tests/ufoLib/ufoLib_test.py b/Tests/ufoLib/ufoLib_test.py new file mode 100644 index 00000000..430e7a7d --- /dev/null +++ b/Tests/ufoLib/ufoLib_test.py @@ -0,0 +1,98 @@ +import logging +import shutil + +from fontTools.misc import plistlib +from fontTools.ufoLib import UFOReader, UFOWriter, UFOFormatVersion +from fontTools.ufoLib.errors import UFOLibError, UnsupportedUFOFormat +import pytest + + +@pytest.fixture +def ufo_path(tmp_path): + ufodir = tmp_path / "TestFont.ufo" + ufodir.mkdir() + with (ufodir / "metainfo.plist").open("wb") as f: + plistlib.dump({"creator": "pytest", "formatVersion": 3}, f) + (ufodir / "glyphs").mkdir() + with (ufodir / "layercontents.plist").open("wb") as f: + plistlib.dump([("public.default", "glyphs")], f) + return ufodir + + +def test_formatVersion_deprecated(ufo_path): + reader = UFOReader(ufo_path) + + with pytest.warns(DeprecationWarning) as warnings: + assert reader.formatVersion == 3 + + assert len(warnings) == 1 + assert "is deprecated; use the 'formatVersionTuple'" in warnings[0].message.args[0] + + +def test_formatVersionTuple(ufo_path): + reader = UFOReader(ufo_path) + + assert reader.formatVersionTuple == (3, 0) + assert reader.formatVersionTuple.major == 3 + assert reader.formatVersionTuple.minor == 0 + assert str(reader.formatVersionTuple) == "3.0" + + +def test_readMetaInfo_errors(ufo_path): + (ufo_path / "metainfo.plist").unlink() + with pytest.raises(UFOLibError, match="'metainfo.plist' is missing"): + UFOReader(ufo_path) + + (ufo_path / "metainfo.plist").write_bytes(plistlib.dumps({})) + with pytest.raises(UFOLibError, match="Missing required formatVersion"): + UFOReader(ufo_path) + + (ufo_path / "metainfo.plist").write_bytes(plistlib.dumps([])) + with pytest.raises(UFOLibError, match="metainfo.plist is not properly formatted"): + UFOReader(ufo_path) + + +def test_readMetaInfo_unsupported_format_version(ufo_path, caplog): + metainfo = {"formatVersion": 10, "formatVersionMinor": 15} + (ufo_path / "metainfo.plist").write_bytes(plistlib.dumps(metainfo)) + + with pytest.raises(UnsupportedUFOFormat): + UFOReader(ufo_path) # validate=True by default + + with pytest.raises(UnsupportedUFOFormat): + UFOReader(ufo_path, validate=True) + + caplog.clear() + with caplog.at_level(logging.WARNING, logger="fontTools.ufoLib"): + UFOReader(ufo_path, validate=False) + + assert len(caplog.records) == 1 + assert "Unsupported UFO format" in caplog.text + assert "Assuming the latest supported version" in caplog.text + + +def test_UFOWriter_formatVersion(tmp_path): + ufo_path = tmp_path / "TestFont.ufo" + with UFOWriter(ufo_path, formatVersion=3) as writer: + assert writer.formatVersionTuple == (3, 0) + + shutil.rmtree(str(ufo_path)) + with UFOWriter(ufo_path, formatVersion=(2, 0)) as writer: + assert writer.formatVersionTuple == (2, 0) + + +def test_UFOWriter_formatVersion_default_latest(tmp_path): + writer = UFOWriter(tmp_path / "TestFont.ufo") + assert writer.formatVersionTuple == UFOFormatVersion.default() + + +def test_UFOWriter_unsupported_format_version(tmp_path): + with pytest.raises(UnsupportedUFOFormat): + UFOWriter(tmp_path, formatVersion=(123, 456)) + + +def test_UFOWriter_previous_higher_format_version(ufo_path): + with pytest.raises( + UnsupportedUFOFormat, match="UFO located at this path is a higher version" + ): + UFOWriter(ufo_path, formatVersion=(2, 0)) diff --git a/Tests/varLib/data/FeatureVarsWholeRange.designspace b/Tests/varLib/data/FeatureVarsWholeRange.designspace new file mode 100644 index 00000000..2d8802cf --- /dev/null +++ b/Tests/varLib/data/FeatureVarsWholeRange.designspace @@ -0,0 +1,34 @@ +<?xml version='1.0' encoding='utf-8'?> +<designspace format="3"> + <axes> + <axis default="368.0" maximum="1000.0" minimum="0.0" name="weight" tag="wght" /> + </axes> + <rules processing="last"> + <rule name="always"> + <conditionset> + <condition name="weight" minimum="0" maximum="1000" /> + </conditionset> + <sub name="uni0024" with="uni0024.nostroke" /> + </rule> + </rules> + <sources> + <source familyname="Test Family" filename="master_ufo/TestFamily-Master0.ufo" name="master_0" stylename="Master0"> + <location> + <dimension name="weight" xvalue="0" /> + </location> + </source> + <source familyname="Test Family" filename="master_ufo/TestFamily-Master1.ufo" name="master_1" stylename="Master1"> + <lib copy="1" /> + <groups copy="1" /> + <info copy="1" /> + <location> + <dimension name="weight" xvalue="368" /> + </location> + </source> + <source familyname="Test Family" filename="master_ufo/TestFamily-Master3.ufo" name="master_3" stylename="Master3"> + <location> + <dimension name="weight" xvalue="1000" /> + </location> + </source> + </sources> +</designspace> diff --git a/Tests/varLib/data/FeatureVarsWholeRangeEmpty.designspace b/Tests/varLib/data/FeatureVarsWholeRangeEmpty.designspace new file mode 100644 index 00000000..a692daa6 --- /dev/null +++ b/Tests/varLib/data/FeatureVarsWholeRangeEmpty.designspace @@ -0,0 +1,33 @@ +<?xml version='1.0' encoding='utf-8'?> +<designspace format="3"> + <axes> + <axis default="368.0" maximum="1000.0" minimum="0.0" name="weight" tag="wght" /> + </axes> + <rules processing="last"> + <rule name="always"> + <conditionset> + </conditionset> + <sub name="uni0024" with="uni0024.nostroke" /> + </rule> + </rules> + <sources> + <source familyname="Test Family" filename="master_ufo/TestFamily-Master0.ufo" name="master_0" stylename="Master0"> + <location> + <dimension name="weight" xvalue="0" /> + </location> + </source> + <source familyname="Test Family" filename="master_ufo/TestFamily-Master1.ufo" name="master_1" stylename="Master1"> + <lib copy="1" /> + <groups copy="1" /> + <info copy="1" /> + <location> + <dimension name="weight" xvalue="368" /> + </location> + </source> + <source familyname="Test Family" filename="master_ufo/TestFamily-Master3.ufo" name="master_3" stylename="Master3"> + <location> + <dimension name="weight" xvalue="1000" /> + </location> + </source> + </sources> +</designspace> diff --git a/Tests/varLib/data/test_results/Build.ttx b/Tests/varLib/data/test_results/Build.ttx index 6e9c6e37..5a406c84 100644 --- a/Tests/varLib/data/test_results/Build.ttx +++ b/Tests/varLib/data/test_results/Build.ttx @@ -405,509 +405,6 @@ <delta pt="3" x="0" y="0"/> </tuple> </glyphVariations> - <glyphVariations glyph="uni0041"> - <tuple> - <coord axis="wght" value="-1.0"/> - <delta pt="0" x="7" y="0"/> - <delta pt="1" x="7" y="-20"/> - <delta pt="2" x="-6" y="-29"/> - <delta pt="3" x="-12" y="-29"/> - <delta pt="4" x="-25" y="-20"/> - <delta pt="5" x="-25" y="0"/> - <delta pt="6" x="14" y="0"/> - <delta pt="7" x="4" y="9"/> - <delta pt="8" x="-36" y="9"/> - <delta pt="9" x="-37" y="0"/> - <delta pt="10" x="24" y="0"/> - <delta pt="11" x="9" y="58"/> - <delta pt="12" x="3" y="68"/> - <delta pt="13" x="-4" y="0"/> - <delta pt="14" x="3" y="28"/> - <delta pt="15" x="-4" y="2"/> - <delta pt="16" x="4" y="2"/> - <delta pt="17" x="-4" y="28"/> - <delta pt="18" x="20" y="0"/> - <delta pt="19" x="20" y="-20"/> - <delta pt="20" x="14" y="-29"/> - <delta pt="21" x="8" y="-29"/> - <delta pt="22" x="-2" y="-20"/> - <delta pt="23" x="-2" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="-10" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="1.0"/> - <delta pt="0" x="5" y="0"/> - <delta pt="1" x="5" y="19"/> - <delta pt="2" x="9" y="19"/> - <delta pt="3" x="6" y="19"/> - <delta pt="4" x="-15" y="19"/> - <delta pt="5" x="-15" y="0"/> - <delta pt="6" x="-6" y="0"/> - <delta pt="7" x="-14" y="-23"/> - <delta pt="8" x="46" y="-23"/> - <delta pt="9" x="39" y="0"/> - <delta pt="10" x="-69" y="0"/> - <delta pt="11" x="-27" y="-86"/> - <delta pt="12" x="-7" y="-16"/> - <delta pt="13" x="11" y="0"/> - <delta pt="14" x="-2" y="-39"/> - <delta pt="15" x="-1" y="-22"/> - <delta pt="16" x="-1" y="-22"/> - <delta pt="17" x="8" y="-39"/> - <delta pt="18" x="-41" y="0"/> - <delta pt="19" x="-41" y="16"/> - <delta pt="20" x="-59" y="16"/> - <delta pt="21" x="6" y="16"/> - <delta pt="22" x="12" y="16"/> - <delta pt="23" x="12" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="17" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="2" y="0"/> - <delta pt="1" x="2" y="-9"/> - <delta pt="2" x="-4" y="-9"/> - <delta pt="3" x="-4" y="-9"/> - <delta pt="4" x="-2" y="-9"/> - <delta pt="5" x="-2" y="0"/> - <delta pt="6" x="2" y="0"/> - <delta pt="7" x="-4" y="0"/> - <delta pt="8" x="-4" y="0"/> - <delta pt="9" x="-4" y="0"/> - <delta pt="10" x="-4" y="0"/> - <delta pt="11" x="-6" y="8"/> - <delta pt="12" x="-10" y="0"/> - <delta pt="13" x="-2" y="0"/> - <delta pt="14" x="0" y="5"/> - <delta pt="15" x="-3" y="-5"/> - <delta pt="16" x="5" y="-5"/> - <delta pt="17" x="-1" y="5"/> - <delta pt="18" x="0" y="0"/> - <delta pt="19" x="0" y="-8"/> - <delta pt="20" x="4" y="-8"/> - <delta pt="21" x="0" y="-8"/> - <delta pt="22" x="0" y="-8"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="-1.0"/> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="-2" y="0"/> - <delta pt="1" x="-2" y="9"/> - <delta pt="2" x="4" y="9"/> - <delta pt="3" x="4" y="9"/> - <delta pt="4" x="2" y="9"/> - <delta pt="5" x="2" y="0"/> - <delta pt="6" x="-2" y="0"/> - <delta pt="7" x="4" y="0"/> - <delta pt="8" x="4" y="0"/> - <delta pt="9" x="4" y="0"/> - <delta pt="10" x="4" y="0"/> - <delta pt="11" x="6" y="-8"/> - <delta pt="12" x="10" y="0"/> - <delta pt="13" x="2" y="0"/> - <delta pt="14" x="0" y="-5"/> - <delta pt="15" x="3" y="5"/> - <delta pt="16" x="-5" y="5"/> - <delta pt="17" x="1" y="-5"/> - <delta pt="18" x="0" y="0"/> - <delta pt="19" x="0" y="8"/> - <delta pt="20" x="-4" y="8"/> - <delta pt="21" x="0" y="8"/> - <delta pt="22" x="0" y="8"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="1.0"/> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="3" y="0"/> - <delta pt="1" x="3" y="-15"/> - <delta pt="2" x="-6" y="-15"/> - <delta pt="3" x="-6" y="-15"/> - <delta pt="4" x="-3" y="-15"/> - <delta pt="5" x="-3" y="0"/> - <delta pt="6" x="3" y="0"/> - <delta pt="7" x="-6" y="0"/> - <delta pt="8" x="-6" y="0"/> - <delta pt="9" x="-6" y="0"/> - <delta pt="10" x="-6" y="0"/> - <delta pt="11" x="-11" y="13"/> - <delta pt="12" x="-17" y="0"/> - <delta pt="13" x="-3" y="0"/> - <delta pt="14" x="-1" y="8"/> - <delta pt="15" x="-5" y="-9"/> - <delta pt="16" x="8" y="-9"/> - <delta pt="17" x="-1" y="8"/> - <delta pt="18" x="0" y="0"/> - <delta pt="19" x="0" y="-13"/> - <delta pt="20" x="6" y="-13"/> - <delta pt="21" x="0" y="-13"/> - <delta pt="22" x="0" y="-13"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - </glyphVariations> - <glyphVariations glyph="uni0061"> - <tuple> - <coord axis="wght" value="-1.0"/> - <delta pt="0" x="11" y="-8"/> - <delta pt="1" x="11" y="4"/> - <delta pt="2" x="22" y="5"/> - <delta pt="3" x="-4" y="-8"/> - <delta pt="4" x="6" y="-5"/> - <delta pt="5" x="3" y="-11"/> - <delta pt="6" x="4" y="-9"/> - <delta pt="7" x="4" y="9"/> - <delta pt="8" x="0" y="7"/> - <delta pt="9" x="-9" y="8"/> - <delta pt="10" x="-24" y="3"/> - <delta pt="11" x="-18" y="6"/> - <delta pt="12" x="-44" y="1"/> - <delta pt="13" x="-44" y="-16"/> - <delta pt="14" x="-44" y="-22"/> - <delta pt="15" x="-36" y="-39"/> - <delta pt="16" x="-24" y="-39"/> - <delta pt="17" x="-7" y="-39"/> - <delta pt="18" x="26" y="-15"/> - <delta pt="19" x="26" y="3"/> - <delta pt="20" x="17" y="0"/> - <delta pt="21" x="3" y="-4"/> - <delta pt="22" x="23" y="15"/> - <delta pt="23" x="22" y="8"/> - <delta pt="24" x="6" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="2" y="0"/> - <delta pt="27" x="11" y="-2"/> - <delta pt="28" x="30" y="7"/> - <delta pt="29" x="30" y="4"/> - <delta pt="30" x="30" y="13"/> - <delta pt="31" x="14" y="21"/> - <delta pt="32" x="3" y="21"/> - <delta pt="33" x="-15" y="21"/> - <delta pt="34" x="-32" y="5"/> - <delta pt="35" x="-34" y="-9"/> - <delta pt="36" x="-48" y="-14"/> - <delta pt="37" x="-40" y="4"/> - <delta pt="38" x="-36" y="14"/> - <delta pt="39" x="-24" y="27"/> - <delta pt="40" x="-13" y="27"/> - <delta pt="41" x="12" y="27"/> - <delta pt="42" x="10" y="6"/> - <delta pt="43" x="12" y="5"/> - <delta pt="44" x="-4" y="-4"/> - <delta pt="45" x="-16" y="-4"/> - <delta pt="46" x="-20" y="-4"/> - <delta pt="47" x="-22" y="7"/> - <delta pt="48" x="-22" y="25"/> - <delta pt="49" x="-22" y="10"/> - <delta pt="50" x="-22" y="-15"/> - <delta pt="51" x="-16" y="-30"/> - <delta pt="52" x="-9" y="-30"/> - <delta pt="53" x="-12" y="-30"/> - <delta pt="54" x="-11" y="-35"/> - <delta pt="55" x="-5" y="-35"/> - <delta pt="56" x="-15" y="-27"/> - <delta pt="57" x="-10" y="-3"/> - <delta pt="58" x="9" y="-3"/> - <delta pt="59" x="14" y="-3"/> - <delta pt="60" x="33" y="-1"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="-3" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="1.0"/> - <delta pt="0" x="-21" y="1"/> - <delta pt="1" x="-21" y="17"/> - <delta pt="2" x="-2" y="28"/> - <delta pt="3" x="20" y="23"/> - <delta pt="4" x="19" y="20"/> - <delta pt="5" x="28" y="21"/> - <delta pt="6" x="26" y="23"/> - <delta pt="7" x="26" y="15"/> - <delta pt="8" x="24" y="12"/> - <delta pt="9" x="30" y="17"/> - <delta pt="10" x="31" y="15"/> - <delta pt="11" x="77" y="31"/> - <delta pt="12" x="66" y="36"/> - <delta pt="13" x="66" y="18"/> - <delta pt="14" x="66" y="21"/> - <delta pt="15" x="49" y="19"/> - <delta pt="16" x="37" y="19"/> - <delta pt="17" x="21" y="19"/> - <delta pt="18" x="-2" y="5"/> - <delta pt="19" x="-34" y="-18"/> - <delta pt="20" x="-6" y="3"/> - <delta pt="21" x="-11" y="12"/> - <delta pt="22" x="-29" y="-11"/> - <delta pt="23" x="-17" y="-2"/> - <delta pt="24" x="-13" y="-3"/> - <delta pt="25" x="-25" y="-3"/> - <delta pt="26" x="-29" y="-3"/> - <delta pt="27" x="-21" y="2"/> - <delta pt="28" x="-34" y="-14"/> - <delta pt="29" x="-34" y="17"/> - <delta pt="30" x="-34" y="7"/> - <delta pt="31" x="-18" y="7"/> - <delta pt="32" x="-16" y="7"/> - <delta pt="33" x="-18" y="7"/> - <delta pt="34" x="-15" y="9"/> - <delta pt="35" x="-21" y="12"/> - <delta pt="36" x="19" y="23"/> - <delta pt="37" x="45" y="46"/> - <delta pt="38" x="52" y="7"/> - <delta pt="39" x="26" y="-21"/> - <delta pt="40" x="14" y="-21"/> - <delta pt="41" x="-5" y="-21"/> - <delta pt="42" x="-17" y="-7"/> - <delta pt="43" x="-31" y="1"/> - <delta pt="44" x="-12" y="16"/> - <delta pt="45" x="34" y="16"/> - <delta pt="46" x="61" y="16"/> - <delta pt="47" x="70" y="4"/> - <delta pt="48" x="70" y="-5"/> - <delta pt="49" x="70" y="-22"/> - <delta pt="50" x="70" y="4"/> - <delta pt="51" x="59" y="22"/> - <delta pt="52" x="50" y="22"/> - <delta pt="53" x="43" y="22"/> - <delta pt="54" x="37" y="19"/> - <delta pt="55" x="38" y="22"/> - <delta pt="56" x="47" y="28"/> - <delta pt="57" x="46" y="-6"/> - <delta pt="58" x="-2" y="-6"/> - <delta pt="59" x="-16" y="-6"/> - <delta pt="60" x="-25" y="-13"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="32" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="0" y="-3"/> - <delta pt="1" x="0" y="-1"/> - <delta pt="2" x="0" y="-3"/> - <delta pt="3" x="0" y="-3"/> - <delta pt="4" x="0" y="-3"/> - <delta pt="5" x="0" y="-3"/> - <delta pt="6" x="0" y="-3"/> - <delta pt="7" x="0" y="4"/> - <delta pt="8" x="0" y="4"/> - <delta pt="9" x="2" y="5"/> - <delta pt="10" x="6" y="7"/> - <delta pt="11" x="1" y="5"/> - <delta pt="12" x="0" y="-1"/> - <delta pt="13" x="0" y="-6"/> - <delta pt="14" x="0" y="-6"/> - <delta pt="15" x="-1" y="-6"/> - <delta pt="16" x="0" y="-6"/> - <delta pt="17" x="0" y="-6"/> - <delta pt="18" x="0" y="-5"/> - <delta pt="19" x="0" y="-4"/> - <delta pt="20" x="0" y="-1"/> - <delta pt="21" x="0" y="0"/> - <delta pt="22" x="0" y="0"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="-1"/> - <delta pt="28" x="0" y="-2"/> - <delta pt="29" x="0" y="7"/> - <delta pt="30" x="0" y="6"/> - <delta pt="31" x="0" y="7"/> - <delta pt="32" x="0" y="7"/> - <delta pt="33" x="0" y="7"/> - <delta pt="34" x="0" y="7"/> - <delta pt="35" x="0" y="7"/> - <delta pt="36" x="0" y="0"/> - <delta pt="37" x="0" y="0"/> - <delta pt="38" x="0" y="0"/> - <delta pt="39" x="0" y="0"/> - <delta pt="40" x="0" y="0"/> - <delta pt="41" x="0" y="0"/> - <delta pt="42" x="0" y="0"/> - <delta pt="43" x="0" y="0"/> - <delta pt="44" x="0" y="0"/> - <delta pt="45" x="0" y="0"/> - <delta pt="46" x="0" y="0"/> - <delta pt="47" x="0" y="0"/> - <delta pt="48" x="0" y="0"/> - <delta pt="49" x="0" y="-6"/> - <delta pt="50" x="0" y="-7"/> - <delta pt="51" x="0" y="-8"/> - <delta pt="52" x="0" y="-8"/> - <delta pt="53" x="1" y="-8"/> - <delta pt="54" x="2" y="-5"/> - <delta pt="55" x="4" y="-2"/> - <delta pt="56" x="0" y="0"/> - <delta pt="57" x="0" y="0"/> - <delta pt="58" x="0" y="0"/> - <delta pt="59" x="0" y="0"/> - <delta pt="60" x="0" y="-1"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="0" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="-1.0"/> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="0" y="3"/> - <delta pt="1" x="0" y="1"/> - <delta pt="2" x="0" y="3"/> - <delta pt="3" x="0" y="3"/> - <delta pt="4" x="0" y="3"/> - <delta pt="5" x="0" y="3"/> - <delta pt="6" x="0" y="3"/> - <delta pt="7" x="0" y="-4"/> - <delta pt="8" x="0" y="-4"/> - <delta pt="9" x="-2" y="-5"/> - <delta pt="10" x="-6" y="-7"/> - <delta pt="11" x="-1" y="-5"/> - <delta pt="12" x="0" y="1"/> - <delta pt="13" x="0" y="6"/> - <delta pt="14" x="0" y="6"/> - <delta pt="15" x="1" y="6"/> - <delta pt="16" x="0" y="6"/> - <delta pt="17" x="0" y="6"/> - <delta pt="18" x="0" y="5"/> - <delta pt="19" x="0" y="4"/> - <delta pt="20" x="0" y="1"/> - <delta pt="21" x="0" y="0"/> - <delta pt="22" x="0" y="0"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="1"/> - <delta pt="28" x="0" y="2"/> - <delta pt="29" x="0" y="-7"/> - <delta pt="30" x="0" y="-6"/> - <delta pt="31" x="0" y="-7"/> - <delta pt="32" x="0" y="-7"/> - <delta pt="33" x="0" y="-7"/> - <delta pt="34" x="0" y="-7"/> - <delta pt="35" x="0" y="-7"/> - <delta pt="36" x="0" y="0"/> - <delta pt="37" x="0" y="0"/> - <delta pt="38" x="0" y="0"/> - <delta pt="39" x="0" y="0"/> - <delta pt="40" x="0" y="0"/> - <delta pt="41" x="0" y="0"/> - <delta pt="42" x="0" y="0"/> - <delta pt="43" x="0" y="0"/> - <delta pt="44" x="0" y="0"/> - <delta pt="45" x="0" y="0"/> - <delta pt="46" x="0" y="0"/> - <delta pt="47" x="0" y="0"/> - <delta pt="48" x="0" y="0"/> - <delta pt="49" x="0" y="6"/> - <delta pt="50" x="0" y="7"/> - <delta pt="51" x="0" y="8"/> - <delta pt="52" x="0" y="8"/> - <delta pt="53" x="-1" y="8"/> - <delta pt="54" x="-2" y="5"/> - <delta pt="55" x="-4" y="2"/> - <delta pt="56" x="0" y="0"/> - <delta pt="57" x="0" y="0"/> - <delta pt="58" x="0" y="0"/> - <delta pt="59" x="0" y="0"/> - <delta pt="60" x="0" y="1"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="0" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="1.0"/> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="0" y="-5"/> - <delta pt="1" x="0" y="0"/> - <delta pt="2" x="3" y="-4"/> - <delta pt="3" x="0" y="-4"/> - <delta pt="4" x="0" y="-4"/> - <delta pt="5" x="0" y="-4"/> - <delta pt="6" x="0" y="-4"/> - <delta pt="7" x="0" y="8"/> - <delta pt="8" x="0" y="8"/> - <delta pt="9" x="5" y="9"/> - <delta pt="10" x="11" y="13"/> - <delta pt="11" x="2" y="10"/> - <delta pt="12" x="0" y="0"/> - <delta pt="13" x="0" y="-9"/> - <delta pt="14" x="0" y="-9"/> - <delta pt="15" x="-1" y="-9"/> - <delta pt="16" x="0" y="-9"/> - <delta pt="17" x="0" y="-9"/> - <delta pt="18" x="0" y="-10"/> - <delta pt="19" x="0" y="-8"/> - <delta pt="20" x="0" y="-2"/> - <delta pt="21" x="0" y="1"/> - <delta pt="22" x="0" y="0"/> - <delta pt="23" x="1" y="-1"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="-1"/> - <delta pt="28" x="0" y="-4"/> - <delta pt="29" x="0" y="12"/> - <delta pt="30" x="0" y="13"/> - <delta pt="31" x="0" y="13"/> - <delta pt="32" x="0" y="13"/> - <delta pt="33" x="0" y="13"/> - <delta pt="34" x="0" y="13"/> - <delta pt="35" x="0" y="13"/> - <delta pt="36" x="0" y="0"/> - <delta pt="37" x="0" y="0"/> - <delta pt="38" x="0" y="0"/> - <delta pt="39" x="0" y="1"/> - <delta pt="40" x="0" y="1"/> - <delta pt="41" x="0" y="1"/> - <delta pt="42" x="0" y="1"/> - <delta pt="43" x="0" y="0"/> - <delta pt="44" x="0" y="0"/> - <delta pt="45" x="0" y="0"/> - <delta pt="46" x="0" y="0"/> - <delta pt="47" x="0" y="-1"/> - <delta pt="48" x="0" y="-1"/> - <delta pt="49" x="0" y="-9"/> - <delta pt="50" x="0" y="-13"/> - <delta pt="51" x="1" y="-14"/> - <delta pt="52" x="1" y="-14"/> - <delta pt="53" x="2" y="-14"/> - <delta pt="54" x="5" y="-11"/> - <delta pt="55" x="7" y="-4"/> - <delta pt="56" x="0" y="0"/> - <delta pt="57" x="0" y="0"/> - <delta pt="58" x="0" y="0"/> - <delta pt="59" x="0" y="0"/> - <delta pt="60" x="1" y="0"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="0" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - </glyphVariations> <glyphVariations glyph="uni0024"> <tuple> <coord axis="wght" value="-1.0"/> @@ -1606,6 +1103,509 @@ <delta pt="65" x="0" y="0"/> </tuple> </glyphVariations> + <glyphVariations glyph="uni0041"> + <tuple> + <coord axis="wght" value="-1.0"/> + <delta pt="0" x="7" y="0"/> + <delta pt="1" x="7" y="-20"/> + <delta pt="2" x="-6" y="-29"/> + <delta pt="3" x="-12" y="-29"/> + <delta pt="4" x="-25" y="-20"/> + <delta pt="5" x="-25" y="0"/> + <delta pt="6" x="14" y="0"/> + <delta pt="7" x="4" y="9"/> + <delta pt="8" x="-36" y="9"/> + <delta pt="9" x="-37" y="0"/> + <delta pt="10" x="24" y="0"/> + <delta pt="11" x="9" y="58"/> + <delta pt="12" x="3" y="68"/> + <delta pt="13" x="-4" y="0"/> + <delta pt="14" x="3" y="28"/> + <delta pt="15" x="-4" y="2"/> + <delta pt="16" x="4" y="2"/> + <delta pt="17" x="-4" y="28"/> + <delta pt="18" x="20" y="0"/> + <delta pt="19" x="20" y="-20"/> + <delta pt="20" x="14" y="-29"/> + <delta pt="21" x="8" y="-29"/> + <delta pt="22" x="-2" y="-20"/> + <delta pt="23" x="-2" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="-10" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="1.0"/> + <delta pt="0" x="5" y="0"/> + <delta pt="1" x="5" y="19"/> + <delta pt="2" x="9" y="19"/> + <delta pt="3" x="6" y="19"/> + <delta pt="4" x="-15" y="19"/> + <delta pt="5" x="-15" y="0"/> + <delta pt="6" x="-6" y="0"/> + <delta pt="7" x="-14" y="-23"/> + <delta pt="8" x="46" y="-23"/> + <delta pt="9" x="39" y="0"/> + <delta pt="10" x="-69" y="0"/> + <delta pt="11" x="-27" y="-86"/> + <delta pt="12" x="-7" y="-16"/> + <delta pt="13" x="11" y="0"/> + <delta pt="14" x="-2" y="-39"/> + <delta pt="15" x="-1" y="-22"/> + <delta pt="16" x="-1" y="-22"/> + <delta pt="17" x="8" y="-39"/> + <delta pt="18" x="-41" y="0"/> + <delta pt="19" x="-41" y="16"/> + <delta pt="20" x="-59" y="16"/> + <delta pt="21" x="6" y="16"/> + <delta pt="22" x="12" y="16"/> + <delta pt="23" x="12" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="17" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="2" y="0"/> + <delta pt="1" x="2" y="-9"/> + <delta pt="2" x="-4" y="-9"/> + <delta pt="3" x="-4" y="-9"/> + <delta pt="4" x="-2" y="-9"/> + <delta pt="5" x="-2" y="0"/> + <delta pt="6" x="2" y="0"/> + <delta pt="7" x="-4" y="0"/> + <delta pt="8" x="-4" y="0"/> + <delta pt="9" x="-4" y="0"/> + <delta pt="10" x="-4" y="0"/> + <delta pt="11" x="-6" y="8"/> + <delta pt="12" x="-10" y="0"/> + <delta pt="13" x="-2" y="0"/> + <delta pt="14" x="0" y="5"/> + <delta pt="15" x="-3" y="-5"/> + <delta pt="16" x="5" y="-5"/> + <delta pt="17" x="-1" y="5"/> + <delta pt="18" x="0" y="0"/> + <delta pt="19" x="0" y="-8"/> + <delta pt="20" x="4" y="-8"/> + <delta pt="21" x="0" y="-8"/> + <delta pt="22" x="0" y="-8"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="-1.0"/> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="-2" y="0"/> + <delta pt="1" x="-2" y="9"/> + <delta pt="2" x="4" y="9"/> + <delta pt="3" x="4" y="9"/> + <delta pt="4" x="2" y="9"/> + <delta pt="5" x="2" y="0"/> + <delta pt="6" x="-2" y="0"/> + <delta pt="7" x="4" y="0"/> + <delta pt="8" x="4" y="0"/> + <delta pt="9" x="4" y="0"/> + <delta pt="10" x="4" y="0"/> + <delta pt="11" x="6" y="-8"/> + <delta pt="12" x="10" y="0"/> + <delta pt="13" x="2" y="0"/> + <delta pt="14" x="0" y="-5"/> + <delta pt="15" x="3" y="5"/> + <delta pt="16" x="-5" y="5"/> + <delta pt="17" x="1" y="-5"/> + <delta pt="18" x="0" y="0"/> + <delta pt="19" x="0" y="8"/> + <delta pt="20" x="-4" y="8"/> + <delta pt="21" x="0" y="8"/> + <delta pt="22" x="0" y="8"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="1.0"/> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="3" y="0"/> + <delta pt="1" x="3" y="-15"/> + <delta pt="2" x="-6" y="-15"/> + <delta pt="3" x="-6" y="-15"/> + <delta pt="4" x="-3" y="-15"/> + <delta pt="5" x="-3" y="0"/> + <delta pt="6" x="3" y="0"/> + <delta pt="7" x="-6" y="0"/> + <delta pt="8" x="-6" y="0"/> + <delta pt="9" x="-6" y="0"/> + <delta pt="10" x="-6" y="0"/> + <delta pt="11" x="-11" y="13"/> + <delta pt="12" x="-17" y="0"/> + <delta pt="13" x="-3" y="0"/> + <delta pt="14" x="-1" y="8"/> + <delta pt="15" x="-5" y="-9"/> + <delta pt="16" x="8" y="-9"/> + <delta pt="17" x="-1" y="8"/> + <delta pt="18" x="0" y="0"/> + <delta pt="19" x="0" y="-13"/> + <delta pt="20" x="6" y="-13"/> + <delta pt="21" x="0" y="-13"/> + <delta pt="22" x="0" y="-13"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + </glyphVariations> + <glyphVariations glyph="uni0061"> + <tuple> + <coord axis="wght" value="-1.0"/> + <delta pt="0" x="11" y="-8"/> + <delta pt="1" x="11" y="4"/> + <delta pt="2" x="22" y="5"/> + <delta pt="3" x="-4" y="-8"/> + <delta pt="4" x="6" y="-5"/> + <delta pt="5" x="3" y="-11"/> + <delta pt="6" x="4" y="-9"/> + <delta pt="7" x="4" y="9"/> + <delta pt="8" x="0" y="7"/> + <delta pt="9" x="-9" y="8"/> + <delta pt="10" x="-24" y="3"/> + <delta pt="11" x="-18" y="6"/> + <delta pt="12" x="-44" y="1"/> + <delta pt="13" x="-44" y="-16"/> + <delta pt="14" x="-44" y="-22"/> + <delta pt="15" x="-36" y="-39"/> + <delta pt="16" x="-24" y="-39"/> + <delta pt="17" x="-7" y="-39"/> + <delta pt="18" x="26" y="-15"/> + <delta pt="19" x="26" y="3"/> + <delta pt="20" x="17" y="0"/> + <delta pt="21" x="3" y="-4"/> + <delta pt="22" x="23" y="15"/> + <delta pt="23" x="22" y="8"/> + <delta pt="24" x="6" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="2" y="0"/> + <delta pt="27" x="11" y="-2"/> + <delta pt="28" x="30" y="7"/> + <delta pt="29" x="30" y="4"/> + <delta pt="30" x="30" y="13"/> + <delta pt="31" x="14" y="21"/> + <delta pt="32" x="3" y="21"/> + <delta pt="33" x="-15" y="21"/> + <delta pt="34" x="-32" y="5"/> + <delta pt="35" x="-34" y="-9"/> + <delta pt="36" x="-48" y="-14"/> + <delta pt="37" x="-40" y="4"/> + <delta pt="38" x="-36" y="14"/> + <delta pt="39" x="-24" y="27"/> + <delta pt="40" x="-13" y="27"/> + <delta pt="41" x="12" y="27"/> + <delta pt="42" x="10" y="6"/> + <delta pt="43" x="12" y="5"/> + <delta pt="44" x="-4" y="-4"/> + <delta pt="45" x="-16" y="-4"/> + <delta pt="46" x="-20" y="-4"/> + <delta pt="47" x="-22" y="7"/> + <delta pt="48" x="-22" y="25"/> + <delta pt="49" x="-22" y="10"/> + <delta pt="50" x="-22" y="-15"/> + <delta pt="51" x="-16" y="-30"/> + <delta pt="52" x="-9" y="-30"/> + <delta pt="53" x="-12" y="-30"/> + <delta pt="54" x="-11" y="-35"/> + <delta pt="55" x="-5" y="-35"/> + <delta pt="56" x="-15" y="-27"/> + <delta pt="57" x="-10" y="-3"/> + <delta pt="58" x="9" y="-3"/> + <delta pt="59" x="14" y="-3"/> + <delta pt="60" x="33" y="-1"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="-3" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="1.0"/> + <delta pt="0" x="-21" y="1"/> + <delta pt="1" x="-21" y="17"/> + <delta pt="2" x="-2" y="28"/> + <delta pt="3" x="20" y="23"/> + <delta pt="4" x="19" y="20"/> + <delta pt="5" x="28" y="21"/> + <delta pt="6" x="26" y="23"/> + <delta pt="7" x="26" y="15"/> + <delta pt="8" x="24" y="12"/> + <delta pt="9" x="30" y="17"/> + <delta pt="10" x="31" y="15"/> + <delta pt="11" x="77" y="31"/> + <delta pt="12" x="66" y="36"/> + <delta pt="13" x="66" y="18"/> + <delta pt="14" x="66" y="21"/> + <delta pt="15" x="49" y="19"/> + <delta pt="16" x="37" y="19"/> + <delta pt="17" x="21" y="19"/> + <delta pt="18" x="-2" y="5"/> + <delta pt="19" x="-34" y="-18"/> + <delta pt="20" x="-6" y="3"/> + <delta pt="21" x="-11" y="12"/> + <delta pt="22" x="-29" y="-11"/> + <delta pt="23" x="-17" y="-2"/> + <delta pt="24" x="-13" y="-3"/> + <delta pt="25" x="-25" y="-3"/> + <delta pt="26" x="-29" y="-3"/> + <delta pt="27" x="-21" y="2"/> + <delta pt="28" x="-34" y="-14"/> + <delta pt="29" x="-34" y="17"/> + <delta pt="30" x="-34" y="7"/> + <delta pt="31" x="-18" y="7"/> + <delta pt="32" x="-16" y="7"/> + <delta pt="33" x="-18" y="7"/> + <delta pt="34" x="-15" y="9"/> + <delta pt="35" x="-21" y="12"/> + <delta pt="36" x="19" y="23"/> + <delta pt="37" x="45" y="46"/> + <delta pt="38" x="52" y="7"/> + <delta pt="39" x="26" y="-21"/> + <delta pt="40" x="14" y="-21"/> + <delta pt="41" x="-5" y="-21"/> + <delta pt="42" x="-17" y="-7"/> + <delta pt="43" x="-31" y="1"/> + <delta pt="44" x="-12" y="16"/> + <delta pt="45" x="34" y="16"/> + <delta pt="46" x="61" y="16"/> + <delta pt="47" x="70" y="4"/> + <delta pt="48" x="70" y="-5"/> + <delta pt="49" x="70" y="-22"/> + <delta pt="50" x="70" y="4"/> + <delta pt="51" x="59" y="22"/> + <delta pt="52" x="50" y="22"/> + <delta pt="53" x="43" y="22"/> + <delta pt="54" x="37" y="19"/> + <delta pt="55" x="38" y="22"/> + <delta pt="56" x="47" y="28"/> + <delta pt="57" x="46" y="-6"/> + <delta pt="58" x="-2" y="-6"/> + <delta pt="59" x="-16" y="-6"/> + <delta pt="60" x="-25" y="-13"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="32" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="0" y="-3"/> + <delta pt="1" x="0" y="-1"/> + <delta pt="2" x="0" y="-3"/> + <delta pt="3" x="0" y="-3"/> + <delta pt="4" x="0" y="-3"/> + <delta pt="5" x="0" y="-3"/> + <delta pt="6" x="0" y="-3"/> + <delta pt="7" x="0" y="4"/> + <delta pt="8" x="0" y="4"/> + <delta pt="9" x="2" y="5"/> + <delta pt="10" x="6" y="7"/> + <delta pt="11" x="1" y="5"/> + <delta pt="12" x="0" y="-1"/> + <delta pt="13" x="0" y="-6"/> + <delta pt="14" x="0" y="-6"/> + <delta pt="15" x="-1" y="-6"/> + <delta pt="16" x="0" y="-6"/> + <delta pt="17" x="0" y="-6"/> + <delta pt="18" x="0" y="-5"/> + <delta pt="19" x="0" y="-4"/> + <delta pt="20" x="0" y="-1"/> + <delta pt="21" x="0" y="0"/> + <delta pt="22" x="0" y="0"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="-1"/> + <delta pt="28" x="0" y="-2"/> + <delta pt="29" x="0" y="7"/> + <delta pt="30" x="0" y="6"/> + <delta pt="31" x="0" y="7"/> + <delta pt="32" x="0" y="7"/> + <delta pt="33" x="0" y="7"/> + <delta pt="34" x="0" y="7"/> + <delta pt="35" x="0" y="7"/> + <delta pt="36" x="0" y="0"/> + <delta pt="37" x="0" y="0"/> + <delta pt="38" x="0" y="0"/> + <delta pt="39" x="0" y="0"/> + <delta pt="40" x="0" y="0"/> + <delta pt="41" x="0" y="0"/> + <delta pt="42" x="0" y="0"/> + <delta pt="43" x="0" y="0"/> + <delta pt="44" x="0" y="0"/> + <delta pt="45" x="0" y="0"/> + <delta pt="46" x="0" y="0"/> + <delta pt="47" x="0" y="0"/> + <delta pt="48" x="0" y="0"/> + <delta pt="49" x="0" y="-6"/> + <delta pt="50" x="0" y="-7"/> + <delta pt="51" x="0" y="-8"/> + <delta pt="52" x="0" y="-8"/> + <delta pt="53" x="1" y="-8"/> + <delta pt="54" x="2" y="-5"/> + <delta pt="55" x="4" y="-2"/> + <delta pt="56" x="0" y="0"/> + <delta pt="57" x="0" y="0"/> + <delta pt="58" x="0" y="0"/> + <delta pt="59" x="0" y="0"/> + <delta pt="60" x="0" y="-1"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="0" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="-1.0"/> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="0" y="3"/> + <delta pt="1" x="0" y="1"/> + <delta pt="2" x="0" y="3"/> + <delta pt="3" x="0" y="3"/> + <delta pt="4" x="0" y="3"/> + <delta pt="5" x="0" y="3"/> + <delta pt="6" x="0" y="3"/> + <delta pt="7" x="0" y="-4"/> + <delta pt="8" x="0" y="-4"/> + <delta pt="9" x="-2" y="-5"/> + <delta pt="10" x="-6" y="-7"/> + <delta pt="11" x="-1" y="-5"/> + <delta pt="12" x="0" y="1"/> + <delta pt="13" x="0" y="6"/> + <delta pt="14" x="0" y="6"/> + <delta pt="15" x="1" y="6"/> + <delta pt="16" x="0" y="6"/> + <delta pt="17" x="0" y="6"/> + <delta pt="18" x="0" y="5"/> + <delta pt="19" x="0" y="4"/> + <delta pt="20" x="0" y="1"/> + <delta pt="21" x="0" y="0"/> + <delta pt="22" x="0" y="0"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="1"/> + <delta pt="28" x="0" y="2"/> + <delta pt="29" x="0" y="-7"/> + <delta pt="30" x="0" y="-6"/> + <delta pt="31" x="0" y="-7"/> + <delta pt="32" x="0" y="-7"/> + <delta pt="33" x="0" y="-7"/> + <delta pt="34" x="0" y="-7"/> + <delta pt="35" x="0" y="-7"/> + <delta pt="36" x="0" y="0"/> + <delta pt="37" x="0" y="0"/> + <delta pt="38" x="0" y="0"/> + <delta pt="39" x="0" y="0"/> + <delta pt="40" x="0" y="0"/> + <delta pt="41" x="0" y="0"/> + <delta pt="42" x="0" y="0"/> + <delta pt="43" x="0" y="0"/> + <delta pt="44" x="0" y="0"/> + <delta pt="45" x="0" y="0"/> + <delta pt="46" x="0" y="0"/> + <delta pt="47" x="0" y="0"/> + <delta pt="48" x="0" y="0"/> + <delta pt="49" x="0" y="6"/> + <delta pt="50" x="0" y="7"/> + <delta pt="51" x="0" y="8"/> + <delta pt="52" x="0" y="8"/> + <delta pt="53" x="-1" y="8"/> + <delta pt="54" x="-2" y="5"/> + <delta pt="55" x="-4" y="2"/> + <delta pt="56" x="0" y="0"/> + <delta pt="57" x="0" y="0"/> + <delta pt="58" x="0" y="0"/> + <delta pt="59" x="0" y="0"/> + <delta pt="60" x="0" y="1"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="0" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="1.0"/> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="0" y="-5"/> + <delta pt="1" x="0" y="0"/> + <delta pt="2" x="3" y="-4"/> + <delta pt="3" x="0" y="-4"/> + <delta pt="4" x="0" y="-4"/> + <delta pt="5" x="0" y="-4"/> + <delta pt="6" x="0" y="-4"/> + <delta pt="7" x="0" y="8"/> + <delta pt="8" x="0" y="8"/> + <delta pt="9" x="5" y="9"/> + <delta pt="10" x="11" y="13"/> + <delta pt="11" x="2" y="10"/> + <delta pt="12" x="0" y="0"/> + <delta pt="13" x="0" y="-9"/> + <delta pt="14" x="0" y="-9"/> + <delta pt="15" x="-1" y="-9"/> + <delta pt="16" x="0" y="-9"/> + <delta pt="17" x="0" y="-9"/> + <delta pt="18" x="0" y="-10"/> + <delta pt="19" x="0" y="-8"/> + <delta pt="20" x="0" y="-2"/> + <delta pt="21" x="0" y="1"/> + <delta pt="22" x="0" y="0"/> + <delta pt="23" x="1" y="-1"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="-1"/> + <delta pt="28" x="0" y="-4"/> + <delta pt="29" x="0" y="12"/> + <delta pt="30" x="0" y="13"/> + <delta pt="31" x="0" y="13"/> + <delta pt="32" x="0" y="13"/> + <delta pt="33" x="0" y="13"/> + <delta pt="34" x="0" y="13"/> + <delta pt="35" x="0" y="13"/> + <delta pt="36" x="0" y="0"/> + <delta pt="37" x="0" y="0"/> + <delta pt="38" x="0" y="0"/> + <delta pt="39" x="0" y="1"/> + <delta pt="40" x="0" y="1"/> + <delta pt="41" x="0" y="1"/> + <delta pt="42" x="0" y="1"/> + <delta pt="43" x="0" y="0"/> + <delta pt="44" x="0" y="0"/> + <delta pt="45" x="0" y="0"/> + <delta pt="46" x="0" y="0"/> + <delta pt="47" x="0" y="-1"/> + <delta pt="48" x="0" y="-1"/> + <delta pt="49" x="0" y="-9"/> + <delta pt="50" x="0" y="-13"/> + <delta pt="51" x="1" y="-14"/> + <delta pt="52" x="1" y="-14"/> + <delta pt="53" x="2" y="-14"/> + <delta pt="54" x="5" y="-11"/> + <delta pt="55" x="7" y="-4"/> + <delta pt="56" x="0" y="0"/> + <delta pt="57" x="0" y="0"/> + <delta pt="58" x="0" y="0"/> + <delta pt="59" x="0" y="0"/> + <delta pt="60" x="1" y="0"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="0" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + </glyphVariations> </gvar> </ttFont> diff --git a/Tests/varLib/data/test_results/BuildMain.ttx b/Tests/varLib/data/test_results/BuildMain.ttx index 7e5d9561..20add49e 100644 --- a/Tests/varLib/data/test_results/BuildMain.ttx +++ b/Tests/varLib/data/test_results/BuildMain.ttx @@ -1051,509 +1051,6 @@ <delta pt="3" x="0" y="0"/> </tuple> </glyphVariations> - <glyphVariations glyph="uni0041"> - <tuple> - <coord axis="wght" value="-1.0"/> - <delta pt="0" x="7" y="0"/> - <delta pt="1" x="7" y="-20"/> - <delta pt="2" x="-6" y="-29"/> - <delta pt="3" x="-12" y="-29"/> - <delta pt="4" x="-25" y="-20"/> - <delta pt="5" x="-25" y="0"/> - <delta pt="6" x="14" y="0"/> - <delta pt="7" x="4" y="9"/> - <delta pt="8" x="-36" y="9"/> - <delta pt="9" x="-37" y="0"/> - <delta pt="10" x="24" y="0"/> - <delta pt="11" x="9" y="58"/> - <delta pt="12" x="3" y="68"/> - <delta pt="13" x="-4" y="0"/> - <delta pt="14" x="3" y="28"/> - <delta pt="15" x="-4" y="2"/> - <delta pt="16" x="4" y="2"/> - <delta pt="17" x="-4" y="28"/> - <delta pt="18" x="20" y="0"/> - <delta pt="19" x="20" y="-20"/> - <delta pt="20" x="14" y="-29"/> - <delta pt="21" x="8" y="-29"/> - <delta pt="22" x="-2" y="-20"/> - <delta pt="23" x="-2" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="-10" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="1.0"/> - <delta pt="0" x="5" y="0"/> - <delta pt="1" x="5" y="19"/> - <delta pt="2" x="9" y="19"/> - <delta pt="3" x="6" y="19"/> - <delta pt="4" x="-15" y="19"/> - <delta pt="5" x="-15" y="0"/> - <delta pt="6" x="-6" y="0"/> - <delta pt="7" x="-14" y="-23"/> - <delta pt="8" x="46" y="-23"/> - <delta pt="9" x="39" y="0"/> - <delta pt="10" x="-69" y="0"/> - <delta pt="11" x="-27" y="-86"/> - <delta pt="12" x="-7" y="-16"/> - <delta pt="13" x="11" y="0"/> - <delta pt="14" x="-2" y="-39"/> - <delta pt="15" x="-1" y="-22"/> - <delta pt="16" x="-1" y="-22"/> - <delta pt="17" x="8" y="-39"/> - <delta pt="18" x="-41" y="0"/> - <delta pt="19" x="-41" y="16"/> - <delta pt="20" x="-59" y="16"/> - <delta pt="21" x="6" y="16"/> - <delta pt="22" x="12" y="16"/> - <delta pt="23" x="12" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="17" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="2" y="0"/> - <delta pt="1" x="2" y="-9"/> - <delta pt="2" x="-4" y="-9"/> - <delta pt="3" x="-4" y="-9"/> - <delta pt="4" x="-2" y="-9"/> - <delta pt="5" x="-2" y="0"/> - <delta pt="6" x="2" y="0"/> - <delta pt="7" x="-4" y="0"/> - <delta pt="8" x="-4" y="0"/> - <delta pt="9" x="-4" y="0"/> - <delta pt="10" x="-4" y="0"/> - <delta pt="11" x="-6" y="8"/> - <delta pt="12" x="-10" y="0"/> - <delta pt="13" x="-2" y="0"/> - <delta pt="14" x="0" y="5"/> - <delta pt="15" x="-3" y="-5"/> - <delta pt="16" x="5" y="-5"/> - <delta pt="17" x="-1" y="5"/> - <delta pt="18" x="0" y="0"/> - <delta pt="19" x="0" y="-8"/> - <delta pt="20" x="4" y="-8"/> - <delta pt="21" x="0" y="-8"/> - <delta pt="22" x="0" y="-8"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="-1.0"/> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="-2" y="0"/> - <delta pt="1" x="-2" y="9"/> - <delta pt="2" x="4" y="9"/> - <delta pt="3" x="4" y="9"/> - <delta pt="4" x="2" y="9"/> - <delta pt="5" x="2" y="0"/> - <delta pt="6" x="-2" y="0"/> - <delta pt="7" x="4" y="0"/> - <delta pt="8" x="4" y="0"/> - <delta pt="9" x="4" y="0"/> - <delta pt="10" x="4" y="0"/> - <delta pt="11" x="6" y="-8"/> - <delta pt="12" x="10" y="0"/> - <delta pt="13" x="2" y="0"/> - <delta pt="14" x="0" y="-5"/> - <delta pt="15" x="3" y="5"/> - <delta pt="16" x="-5" y="5"/> - <delta pt="17" x="1" y="-5"/> - <delta pt="18" x="0" y="0"/> - <delta pt="19" x="0" y="8"/> - <delta pt="20" x="-4" y="8"/> - <delta pt="21" x="0" y="8"/> - <delta pt="22" x="0" y="8"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="1.0"/> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="3" y="0"/> - <delta pt="1" x="3" y="-15"/> - <delta pt="2" x="-6" y="-15"/> - <delta pt="3" x="-6" y="-15"/> - <delta pt="4" x="-3" y="-15"/> - <delta pt="5" x="-3" y="0"/> - <delta pt="6" x="3" y="0"/> - <delta pt="7" x="-6" y="0"/> - <delta pt="8" x="-6" y="0"/> - <delta pt="9" x="-6" y="0"/> - <delta pt="10" x="-6" y="0"/> - <delta pt="11" x="-11" y="13"/> - <delta pt="12" x="-17" y="0"/> - <delta pt="13" x="-3" y="0"/> - <delta pt="14" x="-1" y="8"/> - <delta pt="15" x="-5" y="-9"/> - <delta pt="16" x="8" y="-9"/> - <delta pt="17" x="-1" y="8"/> - <delta pt="18" x="0" y="0"/> - <delta pt="19" x="0" y="-13"/> - <delta pt="20" x="6" y="-13"/> - <delta pt="21" x="0" y="-13"/> - <delta pt="22" x="0" y="-13"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="0"/> - </tuple> - </glyphVariations> - <glyphVariations glyph="uni0061"> - <tuple> - <coord axis="wght" value="-1.0"/> - <delta pt="0" x="11" y="-8"/> - <delta pt="1" x="11" y="4"/> - <delta pt="2" x="22" y="5"/> - <delta pt="3" x="-4" y="-8"/> - <delta pt="4" x="6" y="-5"/> - <delta pt="5" x="3" y="-11"/> - <delta pt="6" x="4" y="-9"/> - <delta pt="7" x="4" y="9"/> - <delta pt="8" x="0" y="7"/> - <delta pt="9" x="-9" y="8"/> - <delta pt="10" x="-24" y="3"/> - <delta pt="11" x="-18" y="6"/> - <delta pt="12" x="-44" y="1"/> - <delta pt="13" x="-44" y="-16"/> - <delta pt="14" x="-44" y="-22"/> - <delta pt="15" x="-36" y="-39"/> - <delta pt="16" x="-24" y="-39"/> - <delta pt="17" x="-7" y="-39"/> - <delta pt="18" x="26" y="-15"/> - <delta pt="19" x="26" y="3"/> - <delta pt="20" x="17" y="0"/> - <delta pt="21" x="3" y="-4"/> - <delta pt="22" x="23" y="15"/> - <delta pt="23" x="22" y="8"/> - <delta pt="24" x="6" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="2" y="0"/> - <delta pt="27" x="11" y="-2"/> - <delta pt="28" x="30" y="7"/> - <delta pt="29" x="30" y="4"/> - <delta pt="30" x="30" y="13"/> - <delta pt="31" x="14" y="21"/> - <delta pt="32" x="3" y="21"/> - <delta pt="33" x="-15" y="21"/> - <delta pt="34" x="-32" y="5"/> - <delta pt="35" x="-34" y="-9"/> - <delta pt="36" x="-48" y="-14"/> - <delta pt="37" x="-40" y="4"/> - <delta pt="38" x="-36" y="14"/> - <delta pt="39" x="-24" y="27"/> - <delta pt="40" x="-13" y="27"/> - <delta pt="41" x="12" y="27"/> - <delta pt="42" x="10" y="6"/> - <delta pt="43" x="12" y="5"/> - <delta pt="44" x="-4" y="-4"/> - <delta pt="45" x="-16" y="-4"/> - <delta pt="46" x="-20" y="-4"/> - <delta pt="47" x="-22" y="7"/> - <delta pt="48" x="-22" y="25"/> - <delta pt="49" x="-22" y="10"/> - <delta pt="50" x="-22" y="-15"/> - <delta pt="51" x="-16" y="-30"/> - <delta pt="52" x="-9" y="-30"/> - <delta pt="53" x="-12" y="-30"/> - <delta pt="54" x="-11" y="-35"/> - <delta pt="55" x="-5" y="-35"/> - <delta pt="56" x="-15" y="-27"/> - <delta pt="57" x="-10" y="-3"/> - <delta pt="58" x="9" y="-3"/> - <delta pt="59" x="14" y="-3"/> - <delta pt="60" x="33" y="-1"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="-3" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="1.0"/> - <delta pt="0" x="-21" y="1"/> - <delta pt="1" x="-21" y="17"/> - <delta pt="2" x="-2" y="28"/> - <delta pt="3" x="20" y="23"/> - <delta pt="4" x="19" y="20"/> - <delta pt="5" x="28" y="21"/> - <delta pt="6" x="26" y="23"/> - <delta pt="7" x="26" y="15"/> - <delta pt="8" x="24" y="12"/> - <delta pt="9" x="30" y="17"/> - <delta pt="10" x="31" y="15"/> - <delta pt="11" x="77" y="31"/> - <delta pt="12" x="66" y="36"/> - <delta pt="13" x="66" y="18"/> - <delta pt="14" x="66" y="21"/> - <delta pt="15" x="49" y="19"/> - <delta pt="16" x="37" y="19"/> - <delta pt="17" x="21" y="19"/> - <delta pt="18" x="-2" y="5"/> - <delta pt="19" x="-34" y="-18"/> - <delta pt="20" x="-6" y="3"/> - <delta pt="21" x="-11" y="12"/> - <delta pt="22" x="-29" y="-11"/> - <delta pt="23" x="-17" y="-2"/> - <delta pt="24" x="-13" y="-3"/> - <delta pt="25" x="-25" y="-3"/> - <delta pt="26" x="-29" y="-3"/> - <delta pt="27" x="-21" y="2"/> - <delta pt="28" x="-34" y="-14"/> - <delta pt="29" x="-34" y="17"/> - <delta pt="30" x="-34" y="7"/> - <delta pt="31" x="-18" y="7"/> - <delta pt="32" x="-16" y="7"/> - <delta pt="33" x="-18" y="7"/> - <delta pt="34" x="-15" y="9"/> - <delta pt="35" x="-21" y="12"/> - <delta pt="36" x="19" y="23"/> - <delta pt="37" x="45" y="46"/> - <delta pt="38" x="52" y="7"/> - <delta pt="39" x="26" y="-21"/> - <delta pt="40" x="14" y="-21"/> - <delta pt="41" x="-5" y="-21"/> - <delta pt="42" x="-17" y="-7"/> - <delta pt="43" x="-31" y="1"/> - <delta pt="44" x="-12" y="16"/> - <delta pt="45" x="34" y="16"/> - <delta pt="46" x="61" y="16"/> - <delta pt="47" x="70" y="4"/> - <delta pt="48" x="70" y="-5"/> - <delta pt="49" x="70" y="-22"/> - <delta pt="50" x="70" y="4"/> - <delta pt="51" x="59" y="22"/> - <delta pt="52" x="50" y="22"/> - <delta pt="53" x="43" y="22"/> - <delta pt="54" x="37" y="19"/> - <delta pt="55" x="38" y="22"/> - <delta pt="56" x="47" y="28"/> - <delta pt="57" x="46" y="-6"/> - <delta pt="58" x="-2" y="-6"/> - <delta pt="59" x="-16" y="-6"/> - <delta pt="60" x="-25" y="-13"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="32" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="0" y="-3"/> - <delta pt="1" x="0" y="-1"/> - <delta pt="2" x="0" y="-3"/> - <delta pt="3" x="0" y="-3"/> - <delta pt="4" x="0" y="-3"/> - <delta pt="5" x="0" y="-3"/> - <delta pt="6" x="0" y="-3"/> - <delta pt="7" x="0" y="4"/> - <delta pt="8" x="0" y="4"/> - <delta pt="9" x="2" y="5"/> - <delta pt="10" x="6" y="7"/> - <delta pt="11" x="1" y="5"/> - <delta pt="12" x="0" y="-1"/> - <delta pt="13" x="0" y="-6"/> - <delta pt="14" x="0" y="-6"/> - <delta pt="15" x="-1" y="-6"/> - <delta pt="16" x="0" y="-6"/> - <delta pt="17" x="0" y="-6"/> - <delta pt="18" x="0" y="-5"/> - <delta pt="19" x="0" y="-4"/> - <delta pt="20" x="0" y="-1"/> - <delta pt="21" x="0" y="0"/> - <delta pt="22" x="0" y="0"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="-1"/> - <delta pt="28" x="0" y="-2"/> - <delta pt="29" x="0" y="7"/> - <delta pt="30" x="0" y="6"/> - <delta pt="31" x="0" y="7"/> - <delta pt="32" x="0" y="7"/> - <delta pt="33" x="0" y="7"/> - <delta pt="34" x="0" y="7"/> - <delta pt="35" x="0" y="7"/> - <delta pt="36" x="0" y="0"/> - <delta pt="37" x="0" y="0"/> - <delta pt="38" x="0" y="0"/> - <delta pt="39" x="0" y="0"/> - <delta pt="40" x="0" y="0"/> - <delta pt="41" x="0" y="0"/> - <delta pt="42" x="0" y="0"/> - <delta pt="43" x="0" y="0"/> - <delta pt="44" x="0" y="0"/> - <delta pt="45" x="0" y="0"/> - <delta pt="46" x="0" y="0"/> - <delta pt="47" x="0" y="0"/> - <delta pt="48" x="0" y="0"/> - <delta pt="49" x="0" y="-6"/> - <delta pt="50" x="0" y="-7"/> - <delta pt="51" x="0" y="-8"/> - <delta pt="52" x="0" y="-8"/> - <delta pt="53" x="1" y="-8"/> - <delta pt="54" x="2" y="-5"/> - <delta pt="55" x="4" y="-2"/> - <delta pt="56" x="0" y="0"/> - <delta pt="57" x="0" y="0"/> - <delta pt="58" x="0" y="0"/> - <delta pt="59" x="0" y="0"/> - <delta pt="60" x="0" y="-1"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="0" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="-1.0"/> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="0" y="3"/> - <delta pt="1" x="0" y="1"/> - <delta pt="2" x="0" y="3"/> - <delta pt="3" x="0" y="3"/> - <delta pt="4" x="0" y="3"/> - <delta pt="5" x="0" y="3"/> - <delta pt="6" x="0" y="3"/> - <delta pt="7" x="0" y="-4"/> - <delta pt="8" x="0" y="-4"/> - <delta pt="9" x="-2" y="-5"/> - <delta pt="10" x="-6" y="-7"/> - <delta pt="11" x="-1" y="-5"/> - <delta pt="12" x="0" y="1"/> - <delta pt="13" x="0" y="6"/> - <delta pt="14" x="0" y="6"/> - <delta pt="15" x="1" y="6"/> - <delta pt="16" x="0" y="6"/> - <delta pt="17" x="0" y="6"/> - <delta pt="18" x="0" y="5"/> - <delta pt="19" x="0" y="4"/> - <delta pt="20" x="0" y="1"/> - <delta pt="21" x="0" y="0"/> - <delta pt="22" x="0" y="0"/> - <delta pt="23" x="0" y="0"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="1"/> - <delta pt="28" x="0" y="2"/> - <delta pt="29" x="0" y="-7"/> - <delta pt="30" x="0" y="-6"/> - <delta pt="31" x="0" y="-7"/> - <delta pt="32" x="0" y="-7"/> - <delta pt="33" x="0" y="-7"/> - <delta pt="34" x="0" y="-7"/> - <delta pt="35" x="0" y="-7"/> - <delta pt="36" x="0" y="0"/> - <delta pt="37" x="0" y="0"/> - <delta pt="38" x="0" y="0"/> - <delta pt="39" x="0" y="0"/> - <delta pt="40" x="0" y="0"/> - <delta pt="41" x="0" y="0"/> - <delta pt="42" x="0" y="0"/> - <delta pt="43" x="0" y="0"/> - <delta pt="44" x="0" y="0"/> - <delta pt="45" x="0" y="0"/> - <delta pt="46" x="0" y="0"/> - <delta pt="47" x="0" y="0"/> - <delta pt="48" x="0" y="0"/> - <delta pt="49" x="0" y="6"/> - <delta pt="50" x="0" y="7"/> - <delta pt="51" x="0" y="8"/> - <delta pt="52" x="0" y="8"/> - <delta pt="53" x="-1" y="8"/> - <delta pt="54" x="-2" y="5"/> - <delta pt="55" x="-4" y="2"/> - <delta pt="56" x="0" y="0"/> - <delta pt="57" x="0" y="0"/> - <delta pt="58" x="0" y="0"/> - <delta pt="59" x="0" y="0"/> - <delta pt="60" x="0" y="1"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="0" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - <tuple> - <coord axis="wght" value="1.0"/> - <coord axis="cntr" value="1.0"/> - <delta pt="0" x="0" y="-5"/> - <delta pt="1" x="0" y="0"/> - <delta pt="2" x="3" y="-4"/> - <delta pt="3" x="0" y="-4"/> - <delta pt="4" x="0" y="-4"/> - <delta pt="5" x="0" y="-4"/> - <delta pt="6" x="0" y="-4"/> - <delta pt="7" x="0" y="8"/> - <delta pt="8" x="0" y="8"/> - <delta pt="9" x="5" y="9"/> - <delta pt="10" x="11" y="13"/> - <delta pt="11" x="2" y="10"/> - <delta pt="12" x="0" y="0"/> - <delta pt="13" x="0" y="-9"/> - <delta pt="14" x="0" y="-9"/> - <delta pt="15" x="-1" y="-9"/> - <delta pt="16" x="0" y="-9"/> - <delta pt="17" x="0" y="-9"/> - <delta pt="18" x="0" y="-10"/> - <delta pt="19" x="0" y="-8"/> - <delta pt="20" x="0" y="-2"/> - <delta pt="21" x="0" y="1"/> - <delta pt="22" x="0" y="0"/> - <delta pt="23" x="1" y="-1"/> - <delta pt="24" x="0" y="0"/> - <delta pt="25" x="0" y="0"/> - <delta pt="26" x="0" y="0"/> - <delta pt="27" x="0" y="-1"/> - <delta pt="28" x="0" y="-4"/> - <delta pt="29" x="0" y="12"/> - <delta pt="30" x="0" y="13"/> - <delta pt="31" x="0" y="13"/> - <delta pt="32" x="0" y="13"/> - <delta pt="33" x="0" y="13"/> - <delta pt="34" x="0" y="13"/> - <delta pt="35" x="0" y="13"/> - <delta pt="36" x="0" y="0"/> - <delta pt="37" x="0" y="0"/> - <delta pt="38" x="0" y="0"/> - <delta pt="39" x="0" y="1"/> - <delta pt="40" x="0" y="1"/> - <delta pt="41" x="0" y="1"/> - <delta pt="42" x="0" y="1"/> - <delta pt="43" x="0" y="0"/> - <delta pt="44" x="0" y="0"/> - <delta pt="45" x="0" y="0"/> - <delta pt="46" x="0" y="0"/> - <delta pt="47" x="0" y="-1"/> - <delta pt="48" x="0" y="-1"/> - <delta pt="49" x="0" y="-9"/> - <delta pt="50" x="0" y="-13"/> - <delta pt="51" x="1" y="-14"/> - <delta pt="52" x="1" y="-14"/> - <delta pt="53" x="2" y="-14"/> - <delta pt="54" x="5" y="-11"/> - <delta pt="55" x="7" y="-4"/> - <delta pt="56" x="0" y="0"/> - <delta pt="57" x="0" y="0"/> - <delta pt="58" x="0" y="0"/> - <delta pt="59" x="0" y="0"/> - <delta pt="60" x="1" y="0"/> - <delta pt="61" x="0" y="0"/> - <delta pt="62" x="0" y="0"/> - <delta pt="63" x="0" y="0"/> - <delta pt="64" x="0" y="0"/> - </tuple> - </glyphVariations> <glyphVariations glyph="uni0024"> <tuple> <coord axis="wght" value="-1.0"/> @@ -2252,6 +1749,509 @@ <delta pt="65" x="0" y="0"/> </tuple> </glyphVariations> + <glyphVariations glyph="uni0041"> + <tuple> + <coord axis="wght" value="-1.0"/> + <delta pt="0" x="7" y="0"/> + <delta pt="1" x="7" y="-20"/> + <delta pt="2" x="-6" y="-29"/> + <delta pt="3" x="-12" y="-29"/> + <delta pt="4" x="-25" y="-20"/> + <delta pt="5" x="-25" y="0"/> + <delta pt="6" x="14" y="0"/> + <delta pt="7" x="4" y="9"/> + <delta pt="8" x="-36" y="9"/> + <delta pt="9" x="-37" y="0"/> + <delta pt="10" x="24" y="0"/> + <delta pt="11" x="9" y="58"/> + <delta pt="12" x="3" y="68"/> + <delta pt="13" x="-4" y="0"/> + <delta pt="14" x="3" y="28"/> + <delta pt="15" x="-4" y="2"/> + <delta pt="16" x="4" y="2"/> + <delta pt="17" x="-4" y="28"/> + <delta pt="18" x="20" y="0"/> + <delta pt="19" x="20" y="-20"/> + <delta pt="20" x="14" y="-29"/> + <delta pt="21" x="8" y="-29"/> + <delta pt="22" x="-2" y="-20"/> + <delta pt="23" x="-2" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="-10" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="1.0"/> + <delta pt="0" x="5" y="0"/> + <delta pt="1" x="5" y="19"/> + <delta pt="2" x="9" y="19"/> + <delta pt="3" x="6" y="19"/> + <delta pt="4" x="-15" y="19"/> + <delta pt="5" x="-15" y="0"/> + <delta pt="6" x="-6" y="0"/> + <delta pt="7" x="-14" y="-23"/> + <delta pt="8" x="46" y="-23"/> + <delta pt="9" x="39" y="0"/> + <delta pt="10" x="-69" y="0"/> + <delta pt="11" x="-27" y="-86"/> + <delta pt="12" x="-7" y="-16"/> + <delta pt="13" x="11" y="0"/> + <delta pt="14" x="-2" y="-39"/> + <delta pt="15" x="-1" y="-22"/> + <delta pt="16" x="-1" y="-22"/> + <delta pt="17" x="8" y="-39"/> + <delta pt="18" x="-41" y="0"/> + <delta pt="19" x="-41" y="16"/> + <delta pt="20" x="-59" y="16"/> + <delta pt="21" x="6" y="16"/> + <delta pt="22" x="12" y="16"/> + <delta pt="23" x="12" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="17" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="2" y="0"/> + <delta pt="1" x="2" y="-9"/> + <delta pt="2" x="-4" y="-9"/> + <delta pt="3" x="-4" y="-9"/> + <delta pt="4" x="-2" y="-9"/> + <delta pt="5" x="-2" y="0"/> + <delta pt="6" x="2" y="0"/> + <delta pt="7" x="-4" y="0"/> + <delta pt="8" x="-4" y="0"/> + <delta pt="9" x="-4" y="0"/> + <delta pt="10" x="-4" y="0"/> + <delta pt="11" x="-6" y="8"/> + <delta pt="12" x="-10" y="0"/> + <delta pt="13" x="-2" y="0"/> + <delta pt="14" x="0" y="5"/> + <delta pt="15" x="-3" y="-5"/> + <delta pt="16" x="5" y="-5"/> + <delta pt="17" x="-1" y="5"/> + <delta pt="18" x="0" y="0"/> + <delta pt="19" x="0" y="-8"/> + <delta pt="20" x="4" y="-8"/> + <delta pt="21" x="0" y="-8"/> + <delta pt="22" x="0" y="-8"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="-1.0"/> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="-2" y="0"/> + <delta pt="1" x="-2" y="9"/> + <delta pt="2" x="4" y="9"/> + <delta pt="3" x="4" y="9"/> + <delta pt="4" x="2" y="9"/> + <delta pt="5" x="2" y="0"/> + <delta pt="6" x="-2" y="0"/> + <delta pt="7" x="4" y="0"/> + <delta pt="8" x="4" y="0"/> + <delta pt="9" x="4" y="0"/> + <delta pt="10" x="4" y="0"/> + <delta pt="11" x="6" y="-8"/> + <delta pt="12" x="10" y="0"/> + <delta pt="13" x="2" y="0"/> + <delta pt="14" x="0" y="-5"/> + <delta pt="15" x="3" y="5"/> + <delta pt="16" x="-5" y="5"/> + <delta pt="17" x="1" y="-5"/> + <delta pt="18" x="0" y="0"/> + <delta pt="19" x="0" y="8"/> + <delta pt="20" x="-4" y="8"/> + <delta pt="21" x="0" y="8"/> + <delta pt="22" x="0" y="8"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="1.0"/> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="3" y="0"/> + <delta pt="1" x="3" y="-15"/> + <delta pt="2" x="-6" y="-15"/> + <delta pt="3" x="-6" y="-15"/> + <delta pt="4" x="-3" y="-15"/> + <delta pt="5" x="-3" y="0"/> + <delta pt="6" x="3" y="0"/> + <delta pt="7" x="-6" y="0"/> + <delta pt="8" x="-6" y="0"/> + <delta pt="9" x="-6" y="0"/> + <delta pt="10" x="-6" y="0"/> + <delta pt="11" x="-11" y="13"/> + <delta pt="12" x="-17" y="0"/> + <delta pt="13" x="-3" y="0"/> + <delta pt="14" x="-1" y="8"/> + <delta pt="15" x="-5" y="-9"/> + <delta pt="16" x="8" y="-9"/> + <delta pt="17" x="-1" y="8"/> + <delta pt="18" x="0" y="0"/> + <delta pt="19" x="0" y="-13"/> + <delta pt="20" x="6" y="-13"/> + <delta pt="21" x="0" y="-13"/> + <delta pt="22" x="0" y="-13"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="0"/> + </tuple> + </glyphVariations> + <glyphVariations glyph="uni0061"> + <tuple> + <coord axis="wght" value="-1.0"/> + <delta pt="0" x="11" y="-8"/> + <delta pt="1" x="11" y="4"/> + <delta pt="2" x="22" y="5"/> + <delta pt="3" x="-4" y="-8"/> + <delta pt="4" x="6" y="-5"/> + <delta pt="5" x="3" y="-11"/> + <delta pt="6" x="4" y="-9"/> + <delta pt="7" x="4" y="9"/> + <delta pt="8" x="0" y="7"/> + <delta pt="9" x="-9" y="8"/> + <delta pt="10" x="-24" y="3"/> + <delta pt="11" x="-18" y="6"/> + <delta pt="12" x="-44" y="1"/> + <delta pt="13" x="-44" y="-16"/> + <delta pt="14" x="-44" y="-22"/> + <delta pt="15" x="-36" y="-39"/> + <delta pt="16" x="-24" y="-39"/> + <delta pt="17" x="-7" y="-39"/> + <delta pt="18" x="26" y="-15"/> + <delta pt="19" x="26" y="3"/> + <delta pt="20" x="17" y="0"/> + <delta pt="21" x="3" y="-4"/> + <delta pt="22" x="23" y="15"/> + <delta pt="23" x="22" y="8"/> + <delta pt="24" x="6" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="2" y="0"/> + <delta pt="27" x="11" y="-2"/> + <delta pt="28" x="30" y="7"/> + <delta pt="29" x="30" y="4"/> + <delta pt="30" x="30" y="13"/> + <delta pt="31" x="14" y="21"/> + <delta pt="32" x="3" y="21"/> + <delta pt="33" x="-15" y="21"/> + <delta pt="34" x="-32" y="5"/> + <delta pt="35" x="-34" y="-9"/> + <delta pt="36" x="-48" y="-14"/> + <delta pt="37" x="-40" y="4"/> + <delta pt="38" x="-36" y="14"/> + <delta pt="39" x="-24" y="27"/> + <delta pt="40" x="-13" y="27"/> + <delta pt="41" x="12" y="27"/> + <delta pt="42" x="10" y="6"/> + <delta pt="43" x="12" y="5"/> + <delta pt="44" x="-4" y="-4"/> + <delta pt="45" x="-16" y="-4"/> + <delta pt="46" x="-20" y="-4"/> + <delta pt="47" x="-22" y="7"/> + <delta pt="48" x="-22" y="25"/> + <delta pt="49" x="-22" y="10"/> + <delta pt="50" x="-22" y="-15"/> + <delta pt="51" x="-16" y="-30"/> + <delta pt="52" x="-9" y="-30"/> + <delta pt="53" x="-12" y="-30"/> + <delta pt="54" x="-11" y="-35"/> + <delta pt="55" x="-5" y="-35"/> + <delta pt="56" x="-15" y="-27"/> + <delta pt="57" x="-10" y="-3"/> + <delta pt="58" x="9" y="-3"/> + <delta pt="59" x="14" y="-3"/> + <delta pt="60" x="33" y="-1"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="-3" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="1.0"/> + <delta pt="0" x="-21" y="1"/> + <delta pt="1" x="-21" y="17"/> + <delta pt="2" x="-2" y="28"/> + <delta pt="3" x="20" y="23"/> + <delta pt="4" x="19" y="20"/> + <delta pt="5" x="28" y="21"/> + <delta pt="6" x="26" y="23"/> + <delta pt="7" x="26" y="15"/> + <delta pt="8" x="24" y="12"/> + <delta pt="9" x="30" y="17"/> + <delta pt="10" x="31" y="15"/> + <delta pt="11" x="77" y="31"/> + <delta pt="12" x="66" y="36"/> + <delta pt="13" x="66" y="18"/> + <delta pt="14" x="66" y="21"/> + <delta pt="15" x="49" y="19"/> + <delta pt="16" x="37" y="19"/> + <delta pt="17" x="21" y="19"/> + <delta pt="18" x="-2" y="5"/> + <delta pt="19" x="-34" y="-18"/> + <delta pt="20" x="-6" y="3"/> + <delta pt="21" x="-11" y="12"/> + <delta pt="22" x="-29" y="-11"/> + <delta pt="23" x="-17" y="-2"/> + <delta pt="24" x="-13" y="-3"/> + <delta pt="25" x="-25" y="-3"/> + <delta pt="26" x="-29" y="-3"/> + <delta pt="27" x="-21" y="2"/> + <delta pt="28" x="-34" y="-14"/> + <delta pt="29" x="-34" y="17"/> + <delta pt="30" x="-34" y="7"/> + <delta pt="31" x="-18" y="7"/> + <delta pt="32" x="-16" y="7"/> + <delta pt="33" x="-18" y="7"/> + <delta pt="34" x="-15" y="9"/> + <delta pt="35" x="-21" y="12"/> + <delta pt="36" x="19" y="23"/> + <delta pt="37" x="45" y="46"/> + <delta pt="38" x="52" y="7"/> + <delta pt="39" x="26" y="-21"/> + <delta pt="40" x="14" y="-21"/> + <delta pt="41" x="-5" y="-21"/> + <delta pt="42" x="-17" y="-7"/> + <delta pt="43" x="-31" y="1"/> + <delta pt="44" x="-12" y="16"/> + <delta pt="45" x="34" y="16"/> + <delta pt="46" x="61" y="16"/> + <delta pt="47" x="70" y="4"/> + <delta pt="48" x="70" y="-5"/> + <delta pt="49" x="70" y="-22"/> + <delta pt="50" x="70" y="4"/> + <delta pt="51" x="59" y="22"/> + <delta pt="52" x="50" y="22"/> + <delta pt="53" x="43" y="22"/> + <delta pt="54" x="37" y="19"/> + <delta pt="55" x="38" y="22"/> + <delta pt="56" x="47" y="28"/> + <delta pt="57" x="46" y="-6"/> + <delta pt="58" x="-2" y="-6"/> + <delta pt="59" x="-16" y="-6"/> + <delta pt="60" x="-25" y="-13"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="32" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="0" y="-3"/> + <delta pt="1" x="0" y="-1"/> + <delta pt="2" x="0" y="-3"/> + <delta pt="3" x="0" y="-3"/> + <delta pt="4" x="0" y="-3"/> + <delta pt="5" x="0" y="-3"/> + <delta pt="6" x="0" y="-3"/> + <delta pt="7" x="0" y="4"/> + <delta pt="8" x="0" y="4"/> + <delta pt="9" x="2" y="5"/> + <delta pt="10" x="6" y="7"/> + <delta pt="11" x="1" y="5"/> + <delta pt="12" x="0" y="-1"/> + <delta pt="13" x="0" y="-6"/> + <delta pt="14" x="0" y="-6"/> + <delta pt="15" x="-1" y="-6"/> + <delta pt="16" x="0" y="-6"/> + <delta pt="17" x="0" y="-6"/> + <delta pt="18" x="0" y="-5"/> + <delta pt="19" x="0" y="-4"/> + <delta pt="20" x="0" y="-1"/> + <delta pt="21" x="0" y="0"/> + <delta pt="22" x="0" y="0"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="-1"/> + <delta pt="28" x="0" y="-2"/> + <delta pt="29" x="0" y="7"/> + <delta pt="30" x="0" y="6"/> + <delta pt="31" x="0" y="7"/> + <delta pt="32" x="0" y="7"/> + <delta pt="33" x="0" y="7"/> + <delta pt="34" x="0" y="7"/> + <delta pt="35" x="0" y="7"/> + <delta pt="36" x="0" y="0"/> + <delta pt="37" x="0" y="0"/> + <delta pt="38" x="0" y="0"/> + <delta pt="39" x="0" y="0"/> + <delta pt="40" x="0" y="0"/> + <delta pt="41" x="0" y="0"/> + <delta pt="42" x="0" y="0"/> + <delta pt="43" x="0" y="0"/> + <delta pt="44" x="0" y="0"/> + <delta pt="45" x="0" y="0"/> + <delta pt="46" x="0" y="0"/> + <delta pt="47" x="0" y="0"/> + <delta pt="48" x="0" y="0"/> + <delta pt="49" x="0" y="-6"/> + <delta pt="50" x="0" y="-7"/> + <delta pt="51" x="0" y="-8"/> + <delta pt="52" x="0" y="-8"/> + <delta pt="53" x="1" y="-8"/> + <delta pt="54" x="2" y="-5"/> + <delta pt="55" x="4" y="-2"/> + <delta pt="56" x="0" y="0"/> + <delta pt="57" x="0" y="0"/> + <delta pt="58" x="0" y="0"/> + <delta pt="59" x="0" y="0"/> + <delta pt="60" x="0" y="-1"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="0" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="-1.0"/> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="0" y="3"/> + <delta pt="1" x="0" y="1"/> + <delta pt="2" x="0" y="3"/> + <delta pt="3" x="0" y="3"/> + <delta pt="4" x="0" y="3"/> + <delta pt="5" x="0" y="3"/> + <delta pt="6" x="0" y="3"/> + <delta pt="7" x="0" y="-4"/> + <delta pt="8" x="0" y="-4"/> + <delta pt="9" x="-2" y="-5"/> + <delta pt="10" x="-6" y="-7"/> + <delta pt="11" x="-1" y="-5"/> + <delta pt="12" x="0" y="1"/> + <delta pt="13" x="0" y="6"/> + <delta pt="14" x="0" y="6"/> + <delta pt="15" x="1" y="6"/> + <delta pt="16" x="0" y="6"/> + <delta pt="17" x="0" y="6"/> + <delta pt="18" x="0" y="5"/> + <delta pt="19" x="0" y="4"/> + <delta pt="20" x="0" y="1"/> + <delta pt="21" x="0" y="0"/> + <delta pt="22" x="0" y="0"/> + <delta pt="23" x="0" y="0"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="1"/> + <delta pt="28" x="0" y="2"/> + <delta pt="29" x="0" y="-7"/> + <delta pt="30" x="0" y="-6"/> + <delta pt="31" x="0" y="-7"/> + <delta pt="32" x="0" y="-7"/> + <delta pt="33" x="0" y="-7"/> + <delta pt="34" x="0" y="-7"/> + <delta pt="35" x="0" y="-7"/> + <delta pt="36" x="0" y="0"/> + <delta pt="37" x="0" y="0"/> + <delta pt="38" x="0" y="0"/> + <delta pt="39" x="0" y="0"/> + <delta pt="40" x="0" y="0"/> + <delta pt="41" x="0" y="0"/> + <delta pt="42" x="0" y="0"/> + <delta pt="43" x="0" y="0"/> + <delta pt="44" x="0" y="0"/> + <delta pt="45" x="0" y="0"/> + <delta pt="46" x="0" y="0"/> + <delta pt="47" x="0" y="0"/> + <delta pt="48" x="0" y="0"/> + <delta pt="49" x="0" y="6"/> + <delta pt="50" x="0" y="7"/> + <delta pt="51" x="0" y="8"/> + <delta pt="52" x="0" y="8"/> + <delta pt="53" x="-1" y="8"/> + <delta pt="54" x="-2" y="5"/> + <delta pt="55" x="-4" y="2"/> + <delta pt="56" x="0" y="0"/> + <delta pt="57" x="0" y="0"/> + <delta pt="58" x="0" y="0"/> + <delta pt="59" x="0" y="0"/> + <delta pt="60" x="0" y="1"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="0" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + <tuple> + <coord axis="wght" value="1.0"/> + <coord axis="cntr" value="1.0"/> + <delta pt="0" x="0" y="-5"/> + <delta pt="1" x="0" y="0"/> + <delta pt="2" x="3" y="-4"/> + <delta pt="3" x="0" y="-4"/> + <delta pt="4" x="0" y="-4"/> + <delta pt="5" x="0" y="-4"/> + <delta pt="6" x="0" y="-4"/> + <delta pt="7" x="0" y="8"/> + <delta pt="8" x="0" y="8"/> + <delta pt="9" x="5" y="9"/> + <delta pt="10" x="11" y="13"/> + <delta pt="11" x="2" y="10"/> + <delta pt="12" x="0" y="0"/> + <delta pt="13" x="0" y="-9"/> + <delta pt="14" x="0" y="-9"/> + <delta pt="15" x="-1" y="-9"/> + <delta pt="16" x="0" y="-9"/> + <delta pt="17" x="0" y="-9"/> + <delta pt="18" x="0" y="-10"/> + <delta pt="19" x="0" y="-8"/> + <delta pt="20" x="0" y="-2"/> + <delta pt="21" x="0" y="1"/> + <delta pt="22" x="0" y="0"/> + <delta pt="23" x="1" y="-1"/> + <delta pt="24" x="0" y="0"/> + <delta pt="25" x="0" y="0"/> + <delta pt="26" x="0" y="0"/> + <delta pt="27" x="0" y="-1"/> + <delta pt="28" x="0" y="-4"/> + <delta pt="29" x="0" y="12"/> + <delta pt="30" x="0" y="13"/> + <delta pt="31" x="0" y="13"/> + <delta pt="32" x="0" y="13"/> + <delta pt="33" x="0" y="13"/> + <delta pt="34" x="0" y="13"/> + <delta pt="35" x="0" y="13"/> + <delta pt="36" x="0" y="0"/> + <delta pt="37" x="0" y="0"/> + <delta pt="38" x="0" y="0"/> + <delta pt="39" x="0" y="1"/> + <delta pt="40" x="0" y="1"/> + <delta pt="41" x="0" y="1"/> + <delta pt="42" x="0" y="1"/> + <delta pt="43" x="0" y="0"/> + <delta pt="44" x="0" y="0"/> + <delta pt="45" x="0" y="0"/> + <delta pt="46" x="0" y="0"/> + <delta pt="47" x="0" y="-1"/> + <delta pt="48" x="0" y="-1"/> + <delta pt="49" x="0" y="-9"/> + <delta pt="50" x="0" y="-13"/> + <delta pt="51" x="1" y="-14"/> + <delta pt="52" x="1" y="-14"/> + <delta pt="53" x="2" y="-14"/> + <delta pt="54" x="5" y="-11"/> + <delta pt="55" x="7" y="-4"/> + <delta pt="56" x="0" y="0"/> + <delta pt="57" x="0" y="0"/> + <delta pt="58" x="0" y="0"/> + <delta pt="59" x="0" y="0"/> + <delta pt="60" x="1" y="0"/> + <delta pt="61" x="0" y="0"/> + <delta pt="62" x="0" y="0"/> + <delta pt="63" x="0" y="0"/> + <delta pt="64" x="0" y="0"/> + </tuple> + </glyphVariations> </gvar> <ltag> diff --git a/Tests/varLib/data/test_results/FeatureVarsWholeRange.ttx b/Tests/varLib/data/test_results/FeatureVarsWholeRange.ttx new file mode 100644 index 00000000..8e098b9b --- /dev/null +++ b/Tests/varLib/data/test_results/FeatureVarsWholeRange.ttx @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.9"> + + <fvar> + + <!-- Weight --> + <Axis> + <AxisTag>wght</AxisTag> + <Flags>0x0</Flags> + <MinValue>0.0</MinValue> + <DefaultValue>368.0</DefaultValue> + <MaxValue>1000.0</MaxValue> + <AxisNameID>256</AxisNameID> + </Axis> + </fvar> + + <GSUB> + <Version value="0x00010001"/> + <ScriptList> + <!-- ScriptCount=1 --> + <ScriptRecord index="0"> + <ScriptTag value="DFLT"/> + <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="rclt"/> + <Feature> + <!-- LookupCount=0 --> + </Feature> + </FeatureRecord> + </FeatureList> + <LookupList> + <!-- LookupCount=1 --> + <Lookup index="0"> + <LookupType value="1"/> + <LookupFlag value="0"/> + <!-- SubTableCount=1 --> + <SingleSubst index="0" Format="1"> + <Substitution in="uni0024" out="uni0024.nostroke"/> + </SingleSubst> + </Lookup> + </LookupList> + <FeatureVariations> + <Version value="0x00010000"/> + <!-- FeatureVariationCount=1 --> + <FeatureVariationRecord index="0"> + <ConditionSet> + <!-- ConditionCount=0 --> + </ConditionSet> + <FeatureTableSubstitution> + <Version value="0x00010000"/> + <!-- SubstitutionCount=1 --> + <SubstitutionRecord index="0"> + <FeatureIndex value="0"/> + <Feature> + <!-- LookupCount=1 --> + <LookupListIndex index="0" value="0"/> + </Feature> + </SubstitutionRecord> + </FeatureTableSubstitution> + </FeatureVariationRecord> + </FeatureVariations> + </GSUB> + +</ttFont> diff --git a/Tests/varLib/data/test_results/SparseMasters.ttx b/Tests/varLib/data/test_results/SparseMasters.ttx index c2aa335c..fb9cb46d 100644 --- a/Tests/varLib/data/test_results/SparseMasters.ttx +++ b/Tests/varLib/data/test_results/SparseMasters.ttx @@ -572,6 +572,19 @@ <delta pt="21" x="0" y="0"/> </tuple> </glyphVariations> + <glyphVariations glyph="dotabovecomb"> + <tuple> + <coord axis="wght" value="1.0"/> + <delta pt="0" x="-8" y="28"/> + <delta pt="1" x="13" y="16"/> + <delta pt="2" x="17" y="-13"/> + <delta pt="3" x="-27" y="-20"/> + <delta pt="4" x="0" y="0"/> + <delta pt="5" x="0" y="0"/> + <delta pt="6" x="0" y="0"/> + <delta pt="7" x="0" y="0"/> + </tuple> + </glyphVariations> <glyphVariations glyph="e"> <tuple> <coord axis="wght" min="0.0" value="0.36365" max="1.0"/> @@ -614,6 +627,12 @@ <delta pt="16" x="0" y="0"/> </tuple> </glyphVariations> + <glyphVariations glyph="edotabove"> + <tuple> + <coord axis="wght" value="1.0"/> + <delta pt="1" x="-6" y="91"/> + </tuple> + </glyphVariations> <glyphVariations glyph="s"> <tuple> <coord axis="wght" value="1.0"/> @@ -635,25 +654,6 @@ <delta pt="15" x="0" y="0"/> </tuple> </glyphVariations> - <glyphVariations glyph="dotabovecomb"> - <tuple> - <coord axis="wght" value="1.0"/> - <delta pt="0" x="-8" y="28"/> - <delta pt="1" x="13" y="16"/> - <delta pt="2" x="17" y="-13"/> - <delta pt="3" x="-27" y="-20"/> - <delta pt="4" x="0" y="0"/> - <delta pt="5" x="0" y="0"/> - <delta pt="6" x="0" y="0"/> - <delta pt="7" x="0" y="0"/> - </tuple> - </glyphVariations> - <glyphVariations glyph="edotabove"> - <tuple> - <coord axis="wght" value="1.0"/> - <delta pt="1" x="-6" y="91"/> - </tuple> - </glyphVariations> </gvar> </ttFont> diff --git a/Tests/varLib/varLib_test.py b/Tests/varLib/varLib_test.py index 2c95784a..5d36d687 100644 --- a/Tests/varLib/varLib_test.py +++ b/Tests/varLib/varLib_test.py @@ -218,6 +218,30 @@ class BuildTest(unittest.TestCase): save_before_dump=True, ) + def test_varlib_build_feature_variations_whole_range(self): + """Designspace file contains <rules> element specifying the entire design + space, used to build GSUB FeatureVariations table. + """ + self._run_varlib_build_test( + designspace_name="FeatureVarsWholeRange", + font_name="TestFamily", + tables=["fvar", "GSUB"], + expected_ttx_name="FeatureVarsWholeRange", + save_before_dump=True, + ) + + def test_varlib_build_feature_variations_whole_range_empty(self): + """Designspace file contains <rules> element without a condition, specifying + the entire design space, used to build GSUB FeatureVariations table. + """ + self._run_varlib_build_test( + designspace_name="FeatureVarsWholeRangeEmpty", + font_name="TestFamily", + tables=["fvar", "GSUB"], + expected_ttx_name="FeatureVarsWholeRange", + save_before_dump=True, + ) + def test_varlib_build_feature_variations_with_existing_rclt(self): """Designspace file contains <rules> element, used to build GSUB FeatureVariations table. <rules> is specified to do its OT processing |