diff --git a/Lib/fontTools/varLib/instancer/__init__.py b/Lib/fontTools/varLib/instancer/__init__.py
index 0bdb494b9..6a79fc9c2 100644
--- a/Lib/fontTools/varLib/instancer/__init__.py
+++ b/Lib/fontTools/varLib/instancer/__init__.py
@@ -749,6 +749,12 @@ def instantiateCFF2(
setattr(private, name, newValues)
+ # Empty out the VarStore
+ for i, varData in enumerate(varStore.VarData):
+ assert varDataCursor[i] == varData.ItemCount, (varDataCursor[i], varData.ItemCount)
+ varData.Item = []
+ varData.ItemCount = 0
+
# Remove vsindex commands that are no longer needed, collect those that are.
usedVsindex = set()
for commands in allCommands:
@@ -777,12 +783,6 @@ def instantiateCFF2(
for cs, commands in zip(charStrings, allCommands):
cs.program = commandsToProgram(commands)
- # Empty out the VarStore
- for i, varData in enumerate(varStore.VarData):
- assert varDataCursor[i] == varData.ItemCount
- varData.Item = []
- varData.ItemCount = 0
-
# Remove empty VarStore
if not varStore.VarData:
del topDict.VarStore
diff --git a/Tests/varLib/instancer/data/CFF2Instancer-VF-2.ttx b/Tests/varLib/instancer/data/CFF2Instancer-VF-2.ttx
new file mode 100644
index 000000000..e26eba29d
--- /dev/null
+++ b/Tests/varLib/instancer/data/CFF2Instancer-VF-2.ttx
@@ -0,0 +1,615 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ License same as MutatorMath. BSD 3-clause. [test-token: C]
+
+
+ Regular
+
+
+ 1.002;LTTR;MutatorMathTest-LightCondensed
+
+
+ MutatorMathTest LightCondensed
+
+
+ Version 1.002
+
+
+ MutatorMathTest-LightCondensed
+
+
+ Width
+
+
+ Weight
+
+
+ width
+
+
+ weight
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 blend
+ hlineto
+
+
+ 2 blend
+ rmoveto
+
+
+ 3 blend
+ hlineto
+
+
+ 1 blend
+ hmoveto
+
+
+ 0 100 0 2 blend
+ rlineto
+
+
+ 1 vsindex
+ 20 30 -30 0 -104 callsubr
+ 40 7 220 63 -107 callsubr
+ 140 700 375 -56 -169 -103 callsubr
+ -35 -7 -195 -43 -107 callsubr
+ -90 -536 -235 96 79 60 -144 -60 -106 callsubr
+ 250 36 -250 450 220 -190 -6 174 16 -450 -220 190 -105 callsubr
+ 257 -200 585 23 -275 -54 -130 44 -106 callsubr
+ 44 9 296 121 -107 callsubr
+ -145 700 -375 29 151 -103 callsubr
+ -39 -9 -281 -121 -107 callsubr
+ -17 -39 15 -73 5 3 -221 -3 -106 callsubr
+ 47 39 -47 3 223 147 -3 221 3 -3 -223 -147 -105 callsubr
+
+
+
+
+
+
+
+
+
+ -102 callsubr
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ wdth
+ 0x0
+ 0.0
+ 0.0
+ 1000.0
+ 256
+
+
+
+
+ wght
+ 0x0
+ 100.0
+ 100.0
+ 900.0
+ 257
+
+
+
+
diff --git a/Tests/varLib/instancer/data/test_results/CFF2Instancer-VF-2-instance-400.ttx b/Tests/varLib/instancer/data/test_results/CFF2Instancer-VF-2-instance-400.ttx
new file mode 100644
index 000000000..bcee028c0
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/CFF2Instancer-VF-2-instance-400.ttx
@@ -0,0 +1,351 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ License same as MutatorMath. BSD 3-clause. [test-token: C]
+
+
+ Regular
+
+
+ 1.002;LTTR;MutatorMathTest-LightCondensed
+
+
+ MutatorMathTest LightCondensed
+
+
+ Version 1.002
+
+
+ MutatorMathTest-LightCondensed
+
+
+ Width
+
+
+ width
+
+
+ weight
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0 vsindex
+ 9 30 1 blend
+ hmoveto
+ 122 31 1 blend
+ hlineto
+ 119 738 312 0 2 blend
+ rlineto
+ -108 -23 1 blend
+ hlineto
+ -54 -590 -205 38 2 blend
+ rmoveto
+ 332 101 -332 379 0 -379 3 blend
+ hlineto
+ 266 -249 482 -37 2 blend
+ rmoveto
+ 155 54 1 blend
+ hlineto
+ -134 738 -318 0 2 blend
+ rlineto
+ -144 -54 1 blend
+ hlineto
+ -44 -122 17 2 2 blend
+ rmoveto
+ 131 122 -131 58 -2 -58 3 blend
+ hlineto
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ wdth
+ 0x0
+ 0.0
+ 0.0
+ 1000.0
+ 256
+
+
+
+
diff --git a/Tests/varLib/instancer/instancer_test.py b/Tests/varLib/instancer/instancer_test.py
index 190f42ce1..d2b65d768 100644
--- a/Tests/varLib/instancer/instancer_test.py
+++ b/Tests/varLib/instancer/instancer_test.py
@@ -106,6 +106,40 @@ class InstantiateCFF2Test(object):
program = varfont["CFF2"].cff.topDictIndex[0].CharStrings.values()[1].program
assert program == expected
+ def test_full_instance(self, varfont):
+ varfont = ttLib.TTFont()
+ varfont.importXML(os.path.join(TESTDATA, "CFF2Instancer-VF-2.ttx"))
+ s = BytesIO()
+ varfont.save(s)
+ s.seek(0)
+ varfont = ttLib.TTFont(s)
+
+ instance = instancer.instantiateVariableFont(varfont, {"wght": 400})
+ s = BytesIO()
+ instance.save(s)
+ s.seek(0)
+ instance = ttLib.TTFont(s)
+
+ s = StringIO()
+ instance.saveXML(s)
+ actual = stripVariableItemsFromTTX(s.getvalue())
+
+ expected = ttLib.TTFont()
+ expected.importXML(
+ os.path.join(
+ TESTDATA, "test_results", "CFF2Instancer-VF-2-instance-400.ttx"
+ )
+ )
+ s = BytesIO()
+ expected.save(s)
+ s.seek(0)
+ expected = ttLib.TTFont(s)
+ s = StringIO()
+ expected.saveXML(s)
+ expected = stripVariableItemsFromTTX(s.getvalue())
+
+ assert actual == expected
+
class InstantiateGvarTest(object):
@pytest.mark.parametrize("glyph_name", ["hyphen"])