aboutsummaryrefslogtreecommitdiff
path: root/Tests
diff options
context:
space:
mode:
authorHaibo Huang <hhb@google.com>2020-05-15 14:50:34 -0700
committerHaibo Huang <hhb@google.com>2020-05-15 14:50:34 -0700
commitadd91cddc62bc5fc56859a6bdcc353e6bc3b50f8 (patch)
treedc2bad80abd38ff82964795b0cde8ffcf969237f /Tests
parentb8516dcfca3116c02a4d5cd9902ecb195beaee85 (diff)
downloadfonttools-add91cddc62bc5fc56859a6bdcc353e6bc3b50f8.tar.gz
Upgrade fonttools to 4.10.0
Test: None Change-Id: I7a2c428ddeec73630fe798578cdcb6494d594f73
Diffstat (limited to 'Tests')
-rw-r--r--Tests/designspaceLib/designspace_test.py25
-rw-r--r--Tests/feaLib/builder_test.py3
-rw-r--r--Tests/feaLib/data/MultipleLookupsPerGlyph.fea11
-rw-r--r--Tests/feaLib/data/MultipleLookupsPerGlyph.ttx76
-rw-r--r--Tests/feaLib/data/MultipleLookupsPerGlyph2.fea11
-rw-r--r--Tests/feaLib/data/MultipleLookupsPerGlyph2.ttx84
-rw-r--r--Tests/feaLib/parser_test.py6
-rw-r--r--Tests/fontBuilder/data/test_var.ttf.ttx86
-rw-r--r--Tests/fontBuilder/fontBuilder_test.py7
-rw-r--r--Tests/merge_test.py52
-rw-r--r--Tests/otlLib/builder_test.py289
-rw-r--r--Tests/subset/data/TestContextSubstFormat3.ttx610
-rw-r--r--Tests/subset/subset_test.py13
-rw-r--r--Tests/ttLib/tables/_g_v_a_r_test.py18
-rw-r--r--Tests/ttLib/tables/_m_e_t_a_test.py13
-rw-r--r--Tests/ttLib/tables/_n_a_m_e_test.py42
-rw-r--r--Tests/ufoLib/glifLib_test.py119
-rw-r--r--Tests/ufoLib/ufoLib_test.py98
-rw-r--r--Tests/varLib/data/FeatureVarsWholeRange.designspace34
-rw-r--r--Tests/varLib/data/FeatureVarsWholeRangeEmpty.designspace33
-rw-r--r--Tests/varLib/data/test_results/Build.ttx1006
-rw-r--r--Tests/varLib/data/test_results/BuildMain.ttx1006
-rw-r--r--Tests/varLib/data/test_results/FeatureVarsWholeRange.ttx75
-rw-r--r--Tests/varLib/data/test_results/SparseMasters.ttx38
-rw-r--r--Tests/varLib/varLib_test.py24
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