aboutsummaryrefslogtreecommitdiff
path: root/Tests/varLib/instancer
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/varLib/instancer')
-rw-r--r--Tests/varLib/instancer/conftest.py13
-rw-r--r--Tests/varLib/instancer/data/PartialInstancerTest-VF.ttx1143
-rw-r--r--Tests/varLib/instancer/data/PartialInstancerTest2-VF.ttx1892
-rw-r--r--Tests/varLib/instancer/data/PartialInstancerTest3-VF.ttx439
-rw-r--r--Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-100,100.ttx544
-rw-r--r--Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-100,62.5.ttx544
-rw-r--r--Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-400,100.ttx539
-rw-r--r--Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-400,62.5.ttx545
-rw-r--r--Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-900,100.ttx544
-rw-r--r--Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-900,62.5.ttx544
-rw-r--r--Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-400-no-overlap-flags.ttx305
-rw-r--r--Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-400-no-overlaps.ttx343
-rw-r--r--Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-700-no-overlaps.ttx367
-rw-r--r--Tests/varLib/instancer/instancer_test.py1939
-rw-r--r--Tests/varLib/instancer/names_test.py322
15 files changed, 10023 insertions, 0 deletions
diff --git a/Tests/varLib/instancer/conftest.py b/Tests/varLib/instancer/conftest.py
new file mode 100644
index 00000000..0ac8091d
--- /dev/null
+++ b/Tests/varLib/instancer/conftest.py
@@ -0,0 +1,13 @@
+import os
+from fontTools import ttLib
+import pytest
+
+
+TESTDATA = os.path.join(os.path.dirname(__file__), "data")
+
+
+@pytest.fixture
+def varfont():
+ f = ttLib.TTFont()
+ f.importXML(os.path.join(TESTDATA, "PartialInstancerTest-VF.ttx"))
+ return f
diff --git a/Tests/varLib/instancer/data/PartialInstancerTest-VF.ttx b/Tests/varLib/instancer/data/PartialInstancerTest-VF.ttx
new file mode 100644
index 00000000..268b5068
--- /dev/null
+++ b/Tests/varLib/instancer/data/PartialInstancerTest-VF.ttx
@@ -0,0 +1,1143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.42">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="hyphen"/>
+ <GlyphID id="2" name="space"/>
+ <GlyphID id="3" name="minus"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="2.001"/>
+ <checkSumAdjustment value="0xb77caef"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000001"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Mar 5 00:05:14 2019"/>
+ <modified value="Wed Jun 5 15:42:16 2019"/>
+ <xMin value="40"/>
+ <yMin value="-200"/>
+ <xMax value="450"/>
+ <yMax value="800"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="40"/>
+ <minRightSideBearing value="40"/>
+ <xMaxExtent value="450"/>
+ <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="4"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="4"/>
+ <maxPoints value="8"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="4"/>
+ <maxCompositeContours value="1"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="1"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="474"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="0"/>
+ <bProportion value="0"/>
+ <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="GOOG"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="8722"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="50"/>
+ <mtx name="hyphen" width="322" lsb="40"/>
+ <mtx name="minus" width="422" lsb="40"/>
+ <mtx name="space" width="600" lsb="0"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x2d" name="hyphen"/><!-- HYPHEN-MINUS -->
+ <map code="0x2212" name="minus"/><!-- MINUS SIGN -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x2d" name="hyphen"/><!-- HYPHEN-MINUS -->
+ <map code="0x2212" name="minus"/><!-- MINUS SIGN -->
+ </cmap_format_4>
+ </cmap>
+
+ <cvt>
+ <cv index="0" value="500"/>
+ <cv index="1" value="-400"/>
+ <cv index="2" value="180"/>
+ <cv index="3" value="250"/>
+ </cvt>
+
+ <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" xMin="50" yMin="-200" xMax="450" yMax="800">
+ <contour>
+ <pt x="50" y="-200" on="1"/>
+ <pt x="450" y="-200" on="1"/>
+ <pt x="450" y="800" on="1"/>
+ <pt x="50" y="800" on="1"/>
+ </contour>
+ <contour>
+ <pt x="100" y="-150" on="1"/>
+ <pt x="100" y="750" on="1"/>
+ <pt x="400" y="750" on="1"/>
+ <pt x="400" y="-150" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="hyphen" xMin="40" yMin="229" xMax="282" yMax="307">
+ <contour>
+ <pt x="40" y="229" on="1"/>
+ <pt x="40" y="307" on="1"/>
+ <pt x="282" y="307" on="1"/>
+ <pt x="282" y="229" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="minus" xMin="40" yMin="229" xMax="282" yMax="307">
+ <component glyphName="hyphen" x="0" y="0" flags="0x204"/>
+ </TTGlyph>
+
+ <TTGlyph name="space"/><!-- contains no outline data -->
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="257" platformID="0" platEncID="4" langID="0x0">
+ Bräiti
+ </namerecord>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Width
+ </namerecord>
+ <namerecord nameID="258" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Thin
+ </namerecord>
+ <namerecord nameID="259" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraLight
+ </namerecord>
+ <namerecord nameID="260" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Light
+ </namerecord>
+ <namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="262" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Medium
+ </namerecord>
+ <namerecord nameID="263" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiBold
+ </namerecord>
+ <namerecord nameID="264" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Bold
+ </namerecord>
+ <namerecord nameID="265" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraBold
+ </namerecord>
+ <namerecord nameID="266" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Black
+ </namerecord>
+ <namerecord nameID="267" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Thin
+ </namerecord>
+ <namerecord nameID="268" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed ExtraLight
+ </namerecord>
+ <namerecord nameID="269" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Light
+ </namerecord>
+ <namerecord nameID="270" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed
+ </namerecord>
+ <namerecord nameID="271" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Medium
+ </namerecord>
+ <namerecord nameID="272" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed SemiBold
+ </namerecord>
+ <namerecord nameID="273" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Bold
+ </namerecord>
+ <namerecord nameID="274" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed ExtraBold
+ </namerecord>
+ <namerecord nameID="275" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Black
+ </namerecord>
+ <namerecord nameID="276" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Thin
+ </namerecord>
+ <namerecord nameID="277" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed ExtraLight
+ </namerecord>
+ <namerecord nameID="278" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Light
+ </namerecord>
+ <namerecord nameID="279" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed
+ </namerecord>
+ <namerecord nameID="280" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Medium
+ </namerecord>
+ <namerecord nameID="281" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed SemiBold
+ </namerecord>
+ <namerecord nameID="282" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Bold
+ </namerecord>
+ <namerecord nameID="283" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed ExtraBold
+ </namerecord>
+ <namerecord nameID="284" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Black
+ </namerecord>
+ <namerecord nameID="285" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Thin
+ </namerecord>
+ <namerecord nameID="286" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed ExtraLight
+ </namerecord>
+ <namerecord nameID="287" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Light
+ </namerecord>
+ <namerecord nameID="288" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed
+ </namerecord>
+ <namerecord nameID="289" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Medium
+ </namerecord>
+ <namerecord nameID="290" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed SemiBold
+ </namerecord>
+ <namerecord nameID="291" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Bold
+ </namerecord>
+ <namerecord nameID="292" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed ExtraBold
+ </namerecord>
+ <namerecord nameID="293" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Black
+ </namerecord>
+ <namerecord nameID="294" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Italic
+ </namerecord>
+ <namerecord nameID="295" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Upright
+ </namerecord>
+ <namerecord nameID="296" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestVariableFont-XCdBd
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright 2015 Google Inc. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Test Variable Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 2.001;GOOG;TestVariableFont-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Test Variable Font Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 2.001
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ TestVariableFont-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+ Noto is a trademark of Google Inc.
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Monotype Imaging Inc.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Monotype Design Team
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.google.com/get/noto/
+ </namerecord>
+ <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409">
+ http://www.monotype.com/studio
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Width
+ </namerecord>
+ <namerecord nameID="258" platformID="3" platEncID="1" langID="0x409">
+ Thin
+ </namerecord>
+ <namerecord nameID="259" platformID="3" platEncID="1" langID="0x409">
+ ExtraLight
+ </namerecord>
+ <namerecord nameID="260" platformID="3" platEncID="1" langID="0x409">
+ Light
+ </namerecord>
+ <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="262" platformID="3" platEncID="1" langID="0x409">
+ Medium
+ </namerecord>
+ <namerecord nameID="263" platformID="3" platEncID="1" langID="0x409">
+ SemiBold
+ </namerecord>
+ <namerecord nameID="264" platformID="3" platEncID="1" langID="0x409">
+ Bold
+ </namerecord>
+ <namerecord nameID="265" platformID="3" platEncID="1" langID="0x409">
+ ExtraBold
+ </namerecord>
+ <namerecord nameID="266" platformID="3" platEncID="1" langID="0x409">
+ Black
+ </namerecord>
+ <namerecord nameID="267" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Thin
+ </namerecord>
+ <namerecord nameID="268" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed ExtraLight
+ </namerecord>
+ <namerecord nameID="269" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Light
+ </namerecord>
+ <namerecord nameID="270" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed
+ </namerecord>
+ <namerecord nameID="271" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Medium
+ </namerecord>
+ <namerecord nameID="272" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed SemiBold
+ </namerecord>
+ <namerecord nameID="273" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Bold
+ </namerecord>
+ <namerecord nameID="274" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed ExtraBold
+ </namerecord>
+ <namerecord nameID="275" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Black
+ </namerecord>
+ <namerecord nameID="276" platformID="3" platEncID="1" langID="0x409">
+ Condensed Thin
+ </namerecord>
+ <namerecord nameID="277" platformID="3" platEncID="1" langID="0x409">
+ Condensed ExtraLight
+ </namerecord>
+ <namerecord nameID="278" platformID="3" platEncID="1" langID="0x409">
+ Condensed Light
+ </namerecord>
+ <namerecord nameID="279" platformID="3" platEncID="1" langID="0x409">
+ Condensed
+ </namerecord>
+ <namerecord nameID="280" platformID="3" platEncID="1" langID="0x409">
+ Condensed Medium
+ </namerecord>
+ <namerecord nameID="281" platformID="3" platEncID="1" langID="0x409">
+ Condensed SemiBold
+ </namerecord>
+ <namerecord nameID="282" platformID="3" platEncID="1" langID="0x409">
+ Condensed Bold
+ </namerecord>
+ <namerecord nameID="283" platformID="3" platEncID="1" langID="0x409">
+ Condensed ExtraBold
+ </namerecord>
+ <namerecord nameID="284" platformID="3" platEncID="1" langID="0x409">
+ Condensed Black
+ </namerecord>
+ <namerecord nameID="285" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Thin
+ </namerecord>
+ <namerecord nameID="286" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed ExtraLight
+ </namerecord>
+ <namerecord nameID="287" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Light
+ </namerecord>
+ <namerecord nameID="288" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed
+ </namerecord>
+ <namerecord nameID="289" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Medium
+ </namerecord>
+ <namerecord nameID="290" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed SemiBold
+ </namerecord>
+ <namerecord nameID="291" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Bold
+ </namerecord>
+ <namerecord nameID="292" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed ExtraBold
+ </namerecord>
+ <namerecord nameID="293" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Black
+ </namerecord>
+ <namerecord nameID="294" platformID="3" platEncID="1" langID="0x409">
+ Italic
+ </namerecord>
+ <namerecord nameID="295" platformID="3" platEncID="1" langID="0x409">
+ Upright
+ </namerecord>
+ <namerecord nameID="296" platformID="3" platEncID="1" langID="0x409">
+ TestVariableFont-XCdBd
+ </namerecord>
+ <namerecord nameID="297" platformID="3" platEncID="1" langID="0x409">
+ Normal
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <HVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=2 -->
+ <!-- RegionCount=7 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.61"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.61"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="3">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="4">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="5">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.61"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="6">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.61"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=1 -->
+ <VarData index="0">
+ <!-- ItemCount=2 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=5 -->
+ <VarRegionIndex index="0" value="2"/>
+ <VarRegionIndex index="1" value="3"/>
+ <VarRegionIndex index="2" value="4"/>
+ <VarRegionIndex index="3" value="5"/>
+ <VarRegionIndex index="4" value="6"/>
+ <Item index="0" value="[-4, -48, -11, 31, 55]"/>
+ <Item index="1" value="[0, 0, 0, 0, 0]"/>
+ </VarData>
+ </VarStore>
+ <AdvWidthMap>
+ <Map glyph=".notdef" outer="0" inner="1"/>
+ <Map glyph="hyphen" outer="0" inner="0"/>
+ <Map glyph="minus" outer="0" inner="0"/>
+ <Map glyph="space" outer="0" inner="1"/>
+ </AdvWidthMap>
+ </HVAR>
+
+ <MVAR>
+ <Version value="0x00010000"/>
+ <Reserved value="0"/>
+ <ValueRecordSize value="8"/>
+ <!-- ValueRecordCount=4 -->
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=2 -->
+ <!-- RegionCount=3 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=2 -->
+ <VarData index="0">
+ <!-- ItemCount=3 -->
+ <NumShorts value="1"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="0"/>
+ <VarRegionIndex index="1" value="1"/>
+ <VarRegionIndex index="2" value="2"/>
+ <Item index="0" value="[-100, 0, 20]"/>
+ <Item index="1" value="[100, 0, -20]"/>
+ <Item index="2" value="[50, -30, -20]"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=1 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="0"/>
+ <Item index="0" value="[30]"/>
+ </VarData>
+ </VarStore>
+ <ValueRecord index="0">
+ <ValueTag value="strs"/>
+ <VarIdx value="2"/>
+ </ValueRecord>
+ <ValueRecord index="1">
+ <ValueTag value="undo"/>
+ <VarIdx value="0"/>
+ </ValueRecord>
+ <ValueRecord index="2">
+ <ValueTag value="unds"/>
+ <VarIdx value="1"/>
+ </ValueRecord>
+ <ValueRecord index="3">
+ <ValueTag value="xhgt"/>
+ <VarIdx value="65536"/>
+ </ValueRecord>
+ </MVAR>
+
+ <STAT>
+ <Version value="0x00010002"/>
+ <DesignAxisRecordSize value="8"/>
+ <!-- DesignAxisCount=3 -->
+ <DesignAxisRecord>
+ <Axis index="0">
+ <AxisTag value="wght"/>
+ <AxisNameID value="256"/> <!-- Weight -->
+ <AxisOrdering value="0"/>
+ </Axis>
+ <Axis index="1">
+ <AxisTag value="wdth"/>
+ <AxisNameID value="257"/> <!-- Width -->
+ <AxisOrdering value="1"/>
+ </Axis>
+ <Axis index="2">
+ <AxisTag value="ital"/>
+ <AxisNameID value="294"/> <!-- Italic -->
+ <AxisOrdering value="2"/>
+ </Axis>
+ </DesignAxisRecord>
+ <!-- AxisValueCount=5 -->
+ <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="3">
+ <AxisIndex value="0"/>
+ <Flags value="2"/>
+ <ValueNameID value="261"/> <!-- Regular -->
+ <Value value="400.0"/>
+ <LinkedValue value="700.0"/>
+ </AxisValue>
+ <AxisValue index="2" Format="2">
+ <AxisIndex value="0"/>
+ <Flags value="0"/>
+ <ValueNameID value="266"/> <!-- Black -->
+ <NominalValue value="900.0"/>
+ <RangeMinValue value="801.0"/>
+ <RangeMaxValue value="900.0"/>
+ </AxisValue>
+ <AxisValue index="3" Format="4">
+ <!-- AxisCount=1 -->
+ <Flags value="0"/>
+ <ValueNameID value="279"/> <!-- Condensed -->
+ <AxisValueRecord index="0">
+ <AxisIndex value="1"/>
+ <Value value="79.0"/>
+ </AxisValueRecord>
+ </AxisValue>
+ <AxisValue index="4" Format="3">
+ <AxisIndex value="2"/>
+ <Flags value="2"/>
+ <ValueNameID value="295"/> <!-- Upright -->
+ <Value value="0.0"/>
+ <LinkedValue value="1.0"/>
+ </AxisValue>
+ <AxisValue index="3" Format="4">
+ <!-- AxisCount=1 -->
+ <Flags value="2"/>
+ <ValueNameID value="297"/> <!-- Normal -->
+ <AxisValueRecord index="0">
+ <AxisIndex value="1"/>
+ <Value value="100.0"/>
+ </AxisValueRecord>
+ </AxisValue>
+ </AxisValueArray>
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+ <avar>
+ <segment axis="wght">
+ <mapping from="-1.0" to="-1.0"/>
+ <mapping from="-0.6667" to="-0.7969"/>
+ <mapping from="-0.3333" to="-0.5"/>
+ <mapping from="0.0" to="0.0"/>
+ <mapping from="0.2" to="0.18"/>
+ <mapping from="0.4" to="0.38"/>
+ <mapping from="0.6" to="0.61"/>
+ <mapping from="0.8" to="0.79"/>
+ <mapping from="1.0" to="1.0"/>
+ </segment>
+ <segment axis="wdth">
+ <mapping from="-1.0" to="-1.0"/>
+ <mapping from="0.0" to="0.0"/>
+ <mapping from="1.0" to="1.0"/>
+ </segment>
+ </avar>
+
+ <cvar>
+ <version major="1" minor="0"/>
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <delta cvt="2" value="-30"/>
+ </tuple>
+ <tuple>
+ <coord axis="wdth" value="-1.0"/>
+ <delta cvt="3" value="-50"/>
+ </tuple>
+ </cvar>
+
+ <fvar>
+
+ <!-- Weight -->
+ <Axis>
+ <AxisTag>wght</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>100.0</MinValue>
+ <DefaultValue>400.0</DefaultValue>
+ <MaxValue>900.0</MaxValue>
+ <AxisNameID>256</AxisNameID>
+ </Axis>
+
+ <!-- Width -->
+ <Axis>
+ <AxisTag>wdth</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>70.0</MinValue>
+ <DefaultValue>100.0</DefaultValue>
+ <MaxValue>100.0</MaxValue>
+ <AxisNameID>257</AxisNameID>
+ </Axis>
+
+ <!-- Thin -->
+ <NamedInstance flags="0x0" subfamilyNameID="258">
+ <coord axis="wght" value="100.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- ExtraLight -->
+ <NamedInstance flags="0x0" subfamilyNameID="259">
+ <coord axis="wght" value="200.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Light -->
+ <NamedInstance flags="0x0" subfamilyNameID="260">
+ <coord axis="wght" value="300.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Regular -->
+ <NamedInstance flags="0x0" subfamilyNameID="261">
+ <coord axis="wght" value="400.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Medium -->
+ <NamedInstance flags="0x0" subfamilyNameID="262">
+ <coord axis="wght" value="500.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- SemiBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="263">
+ <coord axis="wght" value="600.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Bold -->
+ <NamedInstance flags="0x0" subfamilyNameID="264">
+ <coord axis="wght" value="700.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- ExtraBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="265">
+ <coord axis="wght" value="800.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Black -->
+ <NamedInstance flags="0x0" subfamilyNameID="266">
+ <coord axis="wght" value="900.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Thin -->
+ <NamedInstance flags="0x0" subfamilyNameID="267">
+ <coord axis="wght" value="100.0"/>
+ <coord axis="wdth" value="89.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed ExtraLight -->
+ <NamedInstance flags="0x0" subfamilyNameID="268">
+ <coord axis="wght" value="200.0"/>
+ <coord axis="wdth" value="89.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Light -->
+ <NamedInstance flags="0x0" subfamilyNameID="269">
+ <coord axis="wght" value="300.0"/>
+ <coord axis="wdth" value="89.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed -->
+ <NamedInstance flags="0x0" subfamilyNameID="270">
+ <coord axis="wght" value="400.0"/>
+ <coord axis="wdth" value="89.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Medium -->
+ <NamedInstance flags="0x0" subfamilyNameID="271">
+ <coord axis="wght" value="500.0"/>
+ <coord axis="wdth" value="89.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed SemiBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="272">
+ <coord axis="wght" value="600.0"/>
+ <coord axis="wdth" value="89.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Bold -->
+ <NamedInstance flags="0x0" subfamilyNameID="273">
+ <coord axis="wght" value="700.0"/>
+ <coord axis="wdth" value="89.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed ExtraBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="274">
+ <coord axis="wght" value="800.0"/>
+ <coord axis="wdth" value="89.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Black -->
+ <NamedInstance flags="0x0" subfamilyNameID="275">
+ <coord axis="wght" value="900.0"/>
+ <coord axis="wdth" value="89.0"/>
+ </NamedInstance>
+
+ <!-- Condensed Thin -->
+ <NamedInstance flags="0x0" subfamilyNameID="276">
+ <coord axis="wght" value="100.0"/>
+ <coord axis="wdth" value="79.0"/>
+ </NamedInstance>
+
+ <!-- Condensed ExtraLight -->
+ <NamedInstance flags="0x0" subfamilyNameID="277">
+ <coord axis="wght" value="200.0"/>
+ <coord axis="wdth" value="79.0"/>
+ </NamedInstance>
+
+ <!-- Condensed Light -->
+ <NamedInstance flags="0x0" subfamilyNameID="278">
+ <coord axis="wght" value="300.0"/>
+ <coord axis="wdth" value="79.0"/>
+ </NamedInstance>
+
+ <!-- Condensed -->
+ <NamedInstance flags="0x0" subfamilyNameID="279">
+ <coord axis="wght" value="400.0"/>
+ <coord axis="wdth" value="79.0"/>
+ </NamedInstance>
+
+ <!-- Condensed Medium -->
+ <NamedInstance flags="0x0" subfamilyNameID="280">
+ <coord axis="wght" value="500.0"/>
+ <coord axis="wdth" value="79.0"/>
+ </NamedInstance>
+
+ <!-- Condensed SemiBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="281">
+ <coord axis="wght" value="600.0"/>
+ <coord axis="wdth" value="79.0"/>
+ </NamedInstance>
+
+ <!-- Condensed Bold -->
+ <NamedInstance flags="0x0" subfamilyNameID="282">
+ <coord axis="wght" value="700.0"/>
+ <coord axis="wdth" value="79.0"/>
+ </NamedInstance>
+
+ <!-- Condensed ExtraBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="283">
+ <coord axis="wght" value="800.0"/>
+ <coord axis="wdth" value="79.0"/>
+ </NamedInstance>
+
+ <!-- Condensed Black -->
+ <NamedInstance flags="0x0" subfamilyNameID="284">
+ <coord axis="wght" value="900.0"/>
+ <coord axis="wdth" value="79.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Thin -->
+ <NamedInstance flags="0x0" subfamilyNameID="285">
+ <coord axis="wght" value="100.0"/>
+ <coord axis="wdth" value="70.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed ExtraLight -->
+ <NamedInstance flags="0x0" subfamilyNameID="286">
+ <coord axis="wght" value="200.0"/>
+ <coord axis="wdth" value="70.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Light -->
+ <NamedInstance flags="0x0" subfamilyNameID="287">
+ <coord axis="wght" value="300.0"/>
+ <coord axis="wdth" value="70.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed -->
+ <NamedInstance flags="0x0" subfamilyNameID="288">
+ <coord axis="wght" value="400.0"/>
+ <coord axis="wdth" value="70.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Medium -->
+ <NamedInstance flags="0x0" subfamilyNameID="289">
+ <coord axis="wght" value="500.0"/>
+ <coord axis="wdth" value="70.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed SemiBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="290">
+ <coord axis="wght" value="600.0"/>
+ <coord axis="wdth" value="70.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Bold -->
+ <NamedInstance flags="0x0" subfamilyNameID="291">
+ <coord axis="wght" value="700.0"/>
+ <coord axis="wdth" value="70.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed ExtraBold -->
+ <!-- PostScript: TestVariableFont-XCdBd -->
+ <NamedInstance flags="0x0" postscriptNameID="296" subfamilyNameID="292">
+ <coord axis="wght" value="800.0"/>
+ <coord axis="wdth" value="70.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Black -->
+ <NamedInstance flags="0x0" subfamilyNameID="293">
+ <coord axis="wght" value="900.0"/>
+ <coord axis="wdth" value="70.0"/>
+ </NamedInstance>
+ </fvar>
+
+ <gvar>
+ <version value="1"/>
+ <reserved value="0"/>
+ <glyphVariations glyph="hyphen">
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <delta pt="0" x="0" y="30"/>
+ <delta pt="1" x="0" y="-23"/>
+ <delta pt="2" x="0" y="-23"/>
+ <delta pt="3" x="0" y="30"/>
+ <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>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <delta pt="1" x="-10" y="22"/>
+ <delta pt="3" x="10" y="-22"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <delta pt="1" x="-19" y="37"/>
+ <delta pt="3" x="15" y="-37"/>
+ <delta pt="5" x="-4" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="-13" y="3"/>
+ <delta pt="3" x="-35" y="0"/>
+ <delta pt="5" x="-48" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="-1" y="-1"/>
+ <delta pt="3" x="-10" y="0"/>
+ <delta pt="5" x="-11" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="11" y="-1"/>
+ <delta pt="3" x="20" y="-1"/>
+ <delta pt="5" x="31" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="21" y="-3"/>
+ <delta pt="3" x="34" y="0"/>
+ <delta pt="5" x="55" y="0"/>
+ </tuple>
+ </glyphVariations>
+ </gvar>
+
+ <ltag>
+ <version value="1"/>
+ <flags value="0"/>
+ <LanguageTag tag="gsw-LI"/>
+ </ltag>
+
+ <vhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="0"/>
+ <descent value="0"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="100"/>
+ <minBottomSideBearing value="-100"/>
+ <yMaxExtent value="1100"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="4"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="100"/>
+ <mtx name="hyphen" height="536" tsb="229"/>
+ <mtx name="minus" height="536" tsb="229"/>
+ <mtx name="space" height="600" tsb="0"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/PartialInstancerTest2-VF.ttx b/Tests/varLib/instancer/data/PartialInstancerTest2-VF.ttx
new file mode 100644
index 00000000..cd7ffa05
--- /dev/null
+++ b/Tests/varLib/instancer/data/PartialInstancerTest2-VF.ttx
@@ -0,0 +1,1892 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.0">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="T"/>
+ <GlyphID id="3" name="grave"/>
+ <GlyphID id="4" name="Agrave"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="2.001"/>
+ <checkSumAdjustment value="0x605c3e60"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Mar 15 19:50:39 2016"/>
+ <modified value="Thu Oct 17 14:43:10 2019"/>
+ <xMin value="0"/>
+ <yMin value="0"/>
+ <xMax value="638"/>
+ <yMax value="944"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1069"/>
+ <descent value="-293"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="639"/>
+ <minLeftSideBearing value="0"/>
+ <minRightSideBearing value="1"/>
+ <xMaxExtent value="638"/>
+ <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="5"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="5"/>
+ <maxPoints value="19"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="32"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="2"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="577"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="322"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="2"/>
+ <bContrast value="4"/>
+ <bStrokeVariation value="5"/>
+ <bArmStyle value="4"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="11100000 00000000 00000010 11111111"/>
+ <ulUnicodeRange2 value="01000000 00000000 00100000 00011111"/>
+ <ulUnicodeRange3 value="00001000 00000000 00000000 00101001"/>
+ <ulUnicodeRange4 value="00000000 00010000 00000000 00000000"/>
+ <achVendID value="GOOG"/>
+ <fsSelection value="00000001 01000000"/>
+ <usFirstCharIndex value="65"/>
+ <usLastCharIndex value="192"/>
+ <sTypoAscender value="1069"/>
+ <sTypoDescender value="-293"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="1069"/>
+ <usWinDescent value="293"/>
+ <ulCodePageRange1 value="00000000 00000000 00000001 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="536"/>
+ <sCapHeight value="714"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="4"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="600" lsb="94"/>
+ <mtx name="A" width="639" lsb="0"/>
+ <mtx name="Agrave" width="639" lsb="0"/>
+ <mtx name="T" width="556" lsb="10"/>
+ <mtx name="grave" width="281" lsb="40"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ </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" xMin="94" yMin="0" xMax="505" yMax="714">
+ <contour>
+ <pt x="94" y="0" on="1"/>
+ <pt x="94" y="714" on="1"/>
+ <pt x="505" y="714" on="1"/>
+ <pt x="505" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="145" y="51" on="1"/>
+ <pt x="454" y="51" on="1"/>
+ <pt x="454" y="663" on="1"/>
+ <pt x="145" y="663" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="0" yMin="0" xMax="638" yMax="717">
+ <contour>
+ <pt x="545" y="0" on="1"/>
+ <pt x="459" y="221" on="1"/>
+ <pt x="176" y="221" on="1"/>
+ <pt x="91" y="0" on="1"/>
+ <pt x="0" y="0" on="1"/>
+ <pt x="279" y="717" on="1"/>
+ <pt x="360" y="717" on="1"/>
+ <pt x="638" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="432" y="301" on="1"/>
+ <pt x="352" y="517" on="1"/>
+ <pt x="349" y="525" on="0"/>
+ <pt x="335" y="567" on="0"/>
+ <pt x="322" y="612" on="0"/>
+ <pt x="318" y="624" on="1"/>
+ <pt x="313" y="604" on="0"/>
+ <pt x="302" y="563" on="0"/>
+ <pt x="291" y="529" on="0"/>
+ <pt x="287" y="517" on="1"/>
+ <pt x="206" y="301" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="Agrave" xMin="0" yMin="0" xMax="638" yMax="944">
+ <component glyphName="A" x="0" y="0" flags="0x204"/>
+ <component glyphName="grave" x="147" y="178" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="T" xMin="10" yMin="0" xMax="545" yMax="714">
+ <contour>
+ <pt x="323" y="0" on="1"/>
+ <pt x="233" y="0" on="1"/>
+ <pt x="233" y="635" on="1"/>
+ <pt x="10" y="635" on="1"/>
+ <pt x="10" y="714" on="1"/>
+ <pt x="545" y="714" on="1"/>
+ <pt x="545" y="635" on="1"/>
+ <pt x="323" y="635" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="grave" xMin="40" yMin="606" xMax="241" yMax="766">
+ <contour>
+ <pt x="145" y="766" on="1"/>
+ <pt x="156" y="744" on="0"/>
+ <pt x="189" y="689" on="0"/>
+ <pt x="226" y="637" on="0"/>
+ <pt x="241" y="618" on="1"/>
+ <pt x="241" y="606" on="1"/>
+ <pt x="182" y="606" on="1"/>
+ <pt x="165" y="620" on="0"/>
+ <pt x="123" y="659" on="0"/>
+ <pt x="82" y="702" on="0"/>
+ <pt x="49" y="742" on="0"/>
+ <pt x="40" y="756" on="1"/>
+ <pt x="40" y="766" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Width
+ </namerecord>
+ <namerecord nameID="258" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Thin
+ </namerecord>
+ <namerecord nameID="259" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraLight
+ </namerecord>
+ <namerecord nameID="260" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Light
+ </namerecord>
+ <namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="262" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Medium
+ </namerecord>
+ <namerecord nameID="263" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiBold
+ </namerecord>
+ <namerecord nameID="264" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Bold
+ </namerecord>
+ <namerecord nameID="265" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraBold
+ </namerecord>
+ <namerecord nameID="266" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Black
+ </namerecord>
+ <namerecord nameID="267" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Thin
+ </namerecord>
+ <namerecord nameID="268" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed ExtraLight
+ </namerecord>
+ <namerecord nameID="269" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Light
+ </namerecord>
+ <namerecord nameID="270" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed
+ </namerecord>
+ <namerecord nameID="271" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Medium
+ </namerecord>
+ <namerecord nameID="272" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed SemiBold
+ </namerecord>
+ <namerecord nameID="273" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Bold
+ </namerecord>
+ <namerecord nameID="274" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed ExtraBold
+ </namerecord>
+ <namerecord nameID="275" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SemiCondensed Black
+ </namerecord>
+ <namerecord nameID="276" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Thin
+ </namerecord>
+ <namerecord nameID="277" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed ExtraLight
+ </namerecord>
+ <namerecord nameID="278" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Light
+ </namerecord>
+ <namerecord nameID="279" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed
+ </namerecord>
+ <namerecord nameID="280" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Medium
+ </namerecord>
+ <namerecord nameID="281" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed SemiBold
+ </namerecord>
+ <namerecord nameID="282" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Bold
+ </namerecord>
+ <namerecord nameID="283" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed ExtraBold
+ </namerecord>
+ <namerecord nameID="284" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Condensed Black
+ </namerecord>
+ <namerecord nameID="285" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Thin
+ </namerecord>
+ <namerecord nameID="286" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed ExtraLight
+ </namerecord>
+ <namerecord nameID="287" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Light
+ </namerecord>
+ <namerecord nameID="288" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed
+ </namerecord>
+ <namerecord nameID="289" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Medium
+ </namerecord>
+ <namerecord nameID="290" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed SemiBold
+ </namerecord>
+ <namerecord nameID="291" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Bold
+ </namerecord>
+ <namerecord nameID="292" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed ExtraBold
+ </namerecord>
+ <namerecord nameID="293" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed Black
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright 2015 Google Inc. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 2.001;GOOG;NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 2.001
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+ Noto is a trademark of Google Inc.
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Monotype Imaging Inc.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Monotype Design Team
+ </namerecord>
+ <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409">
+ Designed by Monotype design team.
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.google.com/get/noto/
+ </namerecord>
+ <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409">
+ http://www.monotype.com/studio
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://scripts.sil.org/OFL
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Width
+ </namerecord>
+ <namerecord nameID="258" platformID="3" platEncID="1" langID="0x409">
+ Thin
+ </namerecord>
+ <namerecord nameID="259" platformID="3" platEncID="1" langID="0x409">
+ ExtraLight
+ </namerecord>
+ <namerecord nameID="260" platformID="3" platEncID="1" langID="0x409">
+ Light
+ </namerecord>
+ <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="262" platformID="3" platEncID="1" langID="0x409">
+ Medium
+ </namerecord>
+ <namerecord nameID="263" platformID="3" platEncID="1" langID="0x409">
+ SemiBold
+ </namerecord>
+ <namerecord nameID="264" platformID="3" platEncID="1" langID="0x409">
+ Bold
+ </namerecord>
+ <namerecord nameID="265" platformID="3" platEncID="1" langID="0x409">
+ ExtraBold
+ </namerecord>
+ <namerecord nameID="266" platformID="3" platEncID="1" langID="0x409">
+ Black
+ </namerecord>
+ <namerecord nameID="267" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Thin
+ </namerecord>
+ <namerecord nameID="268" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed ExtraLight
+ </namerecord>
+ <namerecord nameID="269" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Light
+ </namerecord>
+ <namerecord nameID="270" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed
+ </namerecord>
+ <namerecord nameID="271" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Medium
+ </namerecord>
+ <namerecord nameID="272" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed SemiBold
+ </namerecord>
+ <namerecord nameID="273" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Bold
+ </namerecord>
+ <namerecord nameID="274" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed ExtraBold
+ </namerecord>
+ <namerecord nameID="275" platformID="3" platEncID="1" langID="0x409">
+ SemiCondensed Black
+ </namerecord>
+ <namerecord nameID="276" platformID="3" platEncID="1" langID="0x409">
+ Condensed Thin
+ </namerecord>
+ <namerecord nameID="277" platformID="3" platEncID="1" langID="0x409">
+ Condensed ExtraLight
+ </namerecord>
+ <namerecord nameID="278" platformID="3" platEncID="1" langID="0x409">
+ Condensed Light
+ </namerecord>
+ <namerecord nameID="279" platformID="3" platEncID="1" langID="0x409">
+ Condensed
+ </namerecord>
+ <namerecord nameID="280" platformID="3" platEncID="1" langID="0x409">
+ Condensed Medium
+ </namerecord>
+ <namerecord nameID="281" platformID="3" platEncID="1" langID="0x409">
+ Condensed SemiBold
+ </namerecord>
+ <namerecord nameID="282" platformID="3" platEncID="1" langID="0x409">
+ Condensed Bold
+ </namerecord>
+ <namerecord nameID="283" platformID="3" platEncID="1" langID="0x409">
+ Condensed ExtraBold
+ </namerecord>
+ <namerecord nameID="284" platformID="3" platEncID="1" langID="0x409">
+ Condensed Black
+ </namerecord>
+ <namerecord nameID="285" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Thin
+ </namerecord>
+ <namerecord nameID="286" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed ExtraLight
+ </namerecord>
+ <namerecord nameID="287" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Light
+ </namerecord>
+ <namerecord nameID="288" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed
+ </namerecord>
+ <namerecord nameID="289" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Medium
+ </namerecord>
+ <namerecord nameID="290" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed SemiBold
+ </namerecord>
+ <namerecord nameID="291" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Bold
+ </namerecord>
+ <namerecord nameID="292" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed ExtraBold
+ </namerecord>
+ <namerecord nameID="293" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed Black
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <GDEF>
+ <Version value="0x00010003"/>
+ <GlyphClassDef>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="1"/>
+ </GlyphClassDef>
+ <MarkGlyphSetsDef>
+ <MarkSetTableFormat value="1"/>
+ <!-- MarkSetCount=4 -->
+ <Coverage index="0">
+ </Coverage>
+ <Coverage index="1">
+ </Coverage>
+ <Coverage index="2">
+ </Coverage>
+ <Coverage index="3">
+ </Coverage>
+ </MarkGlyphSetsDef>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=2 -->
+ <!-- RegionCount=1 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=1 -->
+ <VarData index="0">
+ <!-- ItemCount=2 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="0"/>
+ <Item index="0" value="[-8]"/>
+ <Item index="1" value="[53]"/>
+ </VarData>
+ </VarStore>
+ </GDEF>
+
+ <GPOS>
+ <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="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="2"/>
+ <LookupFlag value="8"/><!-- ignoreMarks -->
+ <!-- SubTableCount=1 -->
+ <PairPos index="0" Format="2">
+ <Coverage>
+ <Glyph value="A"/>
+ <Glyph value="T"/>
+ <Glyph value="Agrave"/>
+ </Coverage>
+ <ValueFormat1 value="68"/>
+ <ValueFormat2 value="0"/>
+ <ClassDef1>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="2"/>
+ </ClassDef1>
+ <ClassDef2>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="2"/>
+ </ClassDef2>
+ <!-- Class1Count=3 -->
+ <!-- Class2Count=3 -->
+ <Class1Record index="0">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ </Class1Record>
+ <Class1Record index="1">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="-70">
+ <XAdvDevice>
+ <StartSize value="0"/>
+ <EndSize value="1"/>
+ <DeltaFormat value="32768"/>
+ </XAdvDevice>
+ </Value1>
+ </Class2Record>
+ </Class1Record>
+ <Class1Record index="2">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="-70">
+ <XAdvDevice>
+ <StartSize value="0"/>
+ <EndSize value="1"/>
+ <DeltaFormat value="32768"/>
+ </XAdvDevice>
+ </Value1>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="20">
+ <XAdvDevice>
+ <StartSize value="0"/>
+ <EndSize value="0"/>
+ <DeltaFormat value="32768"/>
+ </XAdvDevice>
+ </Value1>
+ </Class2Record>
+ </Class1Record>
+ </PairPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=4 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="cyrl"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="2">
+ <ScriptTag value="grek"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="3">
+ <ScriptTag value="latn"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <HVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=2 -->
+ <!-- RegionCount=7 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.61"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.61"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="3">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="4">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="5">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.61"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="6">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.61"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=3 -->
+ <VarData index="0">
+ <!-- ItemCount=1 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=5 -->
+ <VarRegionIndex index="0" value="2"/>
+ <VarRegionIndex index="1" value="3"/>
+ <VarRegionIndex index="2" value="4"/>
+ <VarRegionIndex index="3" value="5"/>
+ <VarRegionIndex index="4" value="6"/>
+ <Item index="0" value="[-18, -5, 5, -8, 5]"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=1 -->
+ <NumShorts value="1"/>
+ <!-- VarRegionCount=7 -->
+ <VarRegionIndex index="0" value="2"/>
+ <VarRegionIndex index="1" value="0"/>
+ <VarRegionIndex index="2" value="1"/>
+ <VarRegionIndex index="3" value="3"/>
+ <VarRegionIndex index="4" value="4"/>
+ <VarRegionIndex index="5" value="5"/>
+ <VarRegionIndex index="6" value="6"/>
+ <Item index="0" value="[137, -32, 81, -15, -9, -36, -63]"/>
+ </VarData>
+ <VarData index="2">
+ <!-- ItemCount=2 -->
+ <NumShorts value="1"/>
+ <!-- VarRegionCount=7 -->
+ <VarRegionIndex index="0" value="3"/>
+ <VarRegionIndex index="1" value="0"/>
+ <VarRegionIndex index="2" value="1"/>
+ <VarRegionIndex index="3" value="2"/>
+ <VarRegionIndex index="4" value="4"/>
+ <VarRegionIndex index="5" value="5"/>
+ <VarRegionIndex index="6" value="6"/>
+ <Item index="0" value="[-189, -62, 51, 87, -11, 25, 37]"/>
+ <Item index="1" value="[-175, -51, 23, 35, 6, 25, 44]"/>
+ </VarData>
+ </VarStore>
+ <AdvWidthMap>
+ <Map glyph=".notdef" outer="0" inner="0"/>
+ <Map glyph="A" outer="2" inner="0"/>
+ <Map glyph="Agrave" outer="2" inner="0"/>
+ <Map glyph="T" outer="2" inner="1"/>
+ <Map glyph="grave" outer="1" inner="0"/>
+ </AdvWidthMap>
+ </HVAR>
+
+ <MVAR>
+ <Version value="0x00010000"/>
+ <Reserved value="0"/>
+ <ValueRecordSize value="8"/>
+ <!-- ValueRecordCount=2 -->
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=2 -->
+ <!-- RegionCount=7 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.61"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.61"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="3">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="4">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="5">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.61"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="6">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.61"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ <VarRegionAxis index="1">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=1 -->
+ <VarData index="0">
+ <!-- ItemCount=2 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=6 -->
+ <VarRegionIndex index="0" value="0"/>
+ <VarRegionIndex index="1" value="1"/>
+ <VarRegionIndex index="2" value="2"/>
+ <VarRegionIndex index="3" value="3"/>
+ <VarRegionIndex index="4" value="4"/>
+ <VarRegionIndex index="5" value="6"/>
+ <Item index="0" value="[-8, 10, 17, 1, -2, -1]"/>
+ <Item index="1" value="[-5, 6, 10, 0, -1, 0]"/>
+ </VarData>
+ </VarStore>
+ <ValueRecord index="0">
+ <ValueTag value="stro"/>
+ <VarIdx value="1"/>
+ </ValueRecord>
+ <ValueRecord index="1">
+ <ValueTag value="xhgt"/>
+ <VarIdx value="0"/>
+ </ValueRecord>
+ </MVAR>
+
+ <STAT>
+ <Version value="0x00010001"/>
+ <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="wdth"/>
+ <AxisNameID value="257"/> <!-- Width -->
+ <AxisOrdering value="0"/>
+ </Axis>
+ </DesignAxisRecord>
+ <!-- AxisValueCount=13 -->
+ <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="0"/>
+ <ValueNameID value="259"/> <!-- ExtraLight -->
+ <Value value="200.0"/>
+ </AxisValue>
+ <AxisValue index="2" Format="1">
+ <AxisIndex value="0"/>
+ <Flags value="0"/>
+ <ValueNameID value="260"/> <!-- Light -->
+ <Value value="300.0"/>
+ </AxisValue>
+ <AxisValue index="3" Format="3">
+ <AxisIndex value="0"/>
+ <Flags value="2"/>
+ <ValueNameID value="261"/> <!-- Regular -->
+ <Value value="400.0"/>
+ <LinkedValue value="700.0"/>
+ </AxisValue>
+ <AxisValue index="4" Format="1">
+ <AxisIndex value="0"/>
+ <Flags value="0"/>
+ <ValueNameID value="262"/> <!-- Medium -->
+ <Value value="500.0"/>
+ </AxisValue>
+ <AxisValue index="5" Format="1">
+ <AxisIndex value="0"/>
+ <Flags value="0"/>
+ <ValueNameID value="263"/> <!-- SemiBold -->
+ <Value value="600.0"/>
+ </AxisValue>
+ <AxisValue index="6" Format="1">
+ <AxisIndex value="0"/>
+ <Flags value="0"/>
+ <ValueNameID value="264"/> <!-- Bold -->
+ <Value value="700.0"/>
+ </AxisValue>
+ <AxisValue index="7" Format="1">
+ <AxisIndex value="0"/>
+ <Flags value="0"/>
+ <ValueNameID value="265"/> <!-- ExtraBold -->
+ <Value value="800.0"/>
+ </AxisValue>
+ <AxisValue index="8" Format="1">
+ <AxisIndex value="0"/>
+ <Flags value="0"/>
+ <ValueNameID value="266"/> <!-- Black -->
+ <Value value="900.0"/>
+ </AxisValue>
+ <AxisValue index="9" Format="2">
+ <AxisIndex value="1"/>
+ <Flags value="2"/>
+ <ValueNameID value="261"/> <!-- Regular -->
+ <NominalValue value="100.0"/>
+ <RangeMinValue value="93.75"/>
+ <RangeMaxValue value="100.0"/>
+ </AxisValue>
+ <AxisValue index="10" Format="2">
+ <AxisIndex value="1"/>
+ <Flags value="0"/>
+ <ValueNameID value="270"/> <!-- SemiCondensed -->
+ <NominalValue value="87.5"/>
+ <RangeMinValue value="81.25"/>
+ <RangeMaxValue value="93.75"/>
+ </AxisValue>
+ <AxisValue index="11" Format="2">
+ <AxisIndex value="1"/>
+ <Flags value="0"/>
+ <ValueNameID value="279"/> <!-- Condensed -->
+ <NominalValue value="75.0"/>
+ <RangeMinValue value="68.75"/>
+ <RangeMaxValue value="81.25"/>
+ </AxisValue>
+ <AxisValue index="12" Format="2">
+ <AxisIndex value="1"/>
+ <Flags value="0"/>
+ <ValueNameID value="288"/> <!-- ExtraCondensed -->
+ <NominalValue value="62.5"/>
+ <RangeMinValue value="62.5"/>
+ <RangeMaxValue value="68.75"/>
+ </AxisValue>
+ </AxisValueArray>
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+ <avar>
+ <segment axis="wght">
+ <mapping from="-1.0" to="-1.0"/>
+ <mapping from="-0.6667" to="-0.7969"/>
+ <mapping from="-0.3333" to="-0.5"/>
+ <mapping from="0.0" to="0.0"/>
+ <mapping from="0.2" to="0.18"/>
+ <mapping from="0.4" to="0.38"/>
+ <mapping from="0.6" to="0.61"/>
+ <mapping from="0.8" to="0.79"/>
+ <mapping from="1.0" to="1.0"/>
+ </segment>
+ <segment axis="wdth">
+ <mapping from="-1.0" to="-1.0"/>
+ <mapping from="-0.6667" to="-0.7"/>
+ <mapping from="-0.3333" to="-0.36664"/>
+ <mapping from="0.0" to="0.0"/>
+ <mapping from="1.0" to="1.0"/>
+ </segment>
+ </avar>
+
+ <fvar>
+
+ <!-- Weight -->
+ <Axis>
+ <AxisTag>wght</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>100.0</MinValue>
+ <DefaultValue>400.0</DefaultValue>
+ <MaxValue>900.0</MaxValue>
+ <AxisNameID>256</AxisNameID>
+ </Axis>
+
+ <!-- Width -->
+ <Axis>
+ <AxisTag>wdth</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>62.5</MinValue>
+ <DefaultValue>100.0</DefaultValue>
+ <MaxValue>100.0</MaxValue>
+ <AxisNameID>257</AxisNameID>
+ </Axis>
+
+ <!-- Thin -->
+ <NamedInstance flags="0x0" subfamilyNameID="258">
+ <coord axis="wght" value="100.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- ExtraLight -->
+ <NamedInstance flags="0x0" subfamilyNameID="259">
+ <coord axis="wght" value="200.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Light -->
+ <NamedInstance flags="0x0" subfamilyNameID="260">
+ <coord axis="wght" value="300.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Regular -->
+ <NamedInstance flags="0x0" subfamilyNameID="261">
+ <coord axis="wght" value="400.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Medium -->
+ <NamedInstance flags="0x0" subfamilyNameID="262">
+ <coord axis="wght" value="500.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- SemiBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="263">
+ <coord axis="wght" value="600.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Bold -->
+ <NamedInstance flags="0x0" subfamilyNameID="264">
+ <coord axis="wght" value="700.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- ExtraBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="265">
+ <coord axis="wght" value="800.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- Black -->
+ <NamedInstance flags="0x0" subfamilyNameID="266">
+ <coord axis="wght" value="900.0"/>
+ <coord axis="wdth" value="100.0"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Thin -->
+ <NamedInstance flags="0x0" subfamilyNameID="267">
+ <coord axis="wght" value="100.0"/>
+ <coord axis="wdth" value="87.5"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed ExtraLight -->
+ <NamedInstance flags="0x0" subfamilyNameID="268">
+ <coord axis="wght" value="200.0"/>
+ <coord axis="wdth" value="87.5"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Light -->
+ <NamedInstance flags="0x0" subfamilyNameID="269">
+ <coord axis="wght" value="300.0"/>
+ <coord axis="wdth" value="87.5"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed -->
+ <NamedInstance flags="0x0" subfamilyNameID="270">
+ <coord axis="wght" value="400.0"/>
+ <coord axis="wdth" value="87.5"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Medium -->
+ <NamedInstance flags="0x0" subfamilyNameID="271">
+ <coord axis="wght" value="500.0"/>
+ <coord axis="wdth" value="87.5"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed SemiBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="272">
+ <coord axis="wght" value="600.0"/>
+ <coord axis="wdth" value="87.5"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Bold -->
+ <NamedInstance flags="0x0" subfamilyNameID="273">
+ <coord axis="wght" value="700.0"/>
+ <coord axis="wdth" value="87.5"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed ExtraBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="274">
+ <coord axis="wght" value="800.0"/>
+ <coord axis="wdth" value="87.5"/>
+ </NamedInstance>
+
+ <!-- SemiCondensed Black -->
+ <NamedInstance flags="0x0" subfamilyNameID="275">
+ <coord axis="wght" value="900.0"/>
+ <coord axis="wdth" value="87.5"/>
+ </NamedInstance>
+
+ <!-- Condensed Thin -->
+ <NamedInstance flags="0x0" subfamilyNameID="276">
+ <coord axis="wght" value="100.0"/>
+ <coord axis="wdth" value="75.0"/>
+ </NamedInstance>
+
+ <!-- Condensed ExtraLight -->
+ <NamedInstance flags="0x0" subfamilyNameID="277">
+ <coord axis="wght" value="200.0"/>
+ <coord axis="wdth" value="75.0"/>
+ </NamedInstance>
+
+ <!-- Condensed Light -->
+ <NamedInstance flags="0x0" subfamilyNameID="278">
+ <coord axis="wght" value="300.0"/>
+ <coord axis="wdth" value="75.0"/>
+ </NamedInstance>
+
+ <!-- Condensed -->
+ <NamedInstance flags="0x0" subfamilyNameID="279">
+ <coord axis="wght" value="400.0"/>
+ <coord axis="wdth" value="75.0"/>
+ </NamedInstance>
+
+ <!-- Condensed Medium -->
+ <NamedInstance flags="0x0" subfamilyNameID="280">
+ <coord axis="wght" value="500.0"/>
+ <coord axis="wdth" value="75.0"/>
+ </NamedInstance>
+
+ <!-- Condensed SemiBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="281">
+ <coord axis="wght" value="600.0"/>
+ <coord axis="wdth" value="75.0"/>
+ </NamedInstance>
+
+ <!-- Condensed Bold -->
+ <NamedInstance flags="0x0" subfamilyNameID="282">
+ <coord axis="wght" value="700.0"/>
+ <coord axis="wdth" value="75.0"/>
+ </NamedInstance>
+
+ <!-- Condensed ExtraBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="283">
+ <coord axis="wght" value="800.0"/>
+ <coord axis="wdth" value="75.0"/>
+ </NamedInstance>
+
+ <!-- Condensed Black -->
+ <NamedInstance flags="0x0" subfamilyNameID="284">
+ <coord axis="wght" value="900.0"/>
+ <coord axis="wdth" value="75.0"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Thin -->
+ <NamedInstance flags="0x0" subfamilyNameID="285">
+ <coord axis="wght" value="100.0"/>
+ <coord axis="wdth" value="62.5"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed ExtraLight -->
+ <NamedInstance flags="0x0" subfamilyNameID="286">
+ <coord axis="wght" value="200.0"/>
+ <coord axis="wdth" value="62.5"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Light -->
+ <NamedInstance flags="0x0" subfamilyNameID="287">
+ <coord axis="wght" value="300.0"/>
+ <coord axis="wdth" value="62.5"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed -->
+ <NamedInstance flags="0x0" subfamilyNameID="288">
+ <coord axis="wght" value="400.0"/>
+ <coord axis="wdth" value="62.5"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Medium -->
+ <NamedInstance flags="0x0" subfamilyNameID="289">
+ <coord axis="wght" value="500.0"/>
+ <coord axis="wdth" value="62.5"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed SemiBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="290">
+ <coord axis="wght" value="600.0"/>
+ <coord axis="wdth" value="62.5"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Bold -->
+ <NamedInstance flags="0x0" subfamilyNameID="291">
+ <coord axis="wght" value="700.0"/>
+ <coord axis="wdth" value="62.5"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed ExtraBold -->
+ <NamedInstance flags="0x0" subfamilyNameID="292">
+ <coord axis="wght" value="800.0"/>
+ <coord axis="wdth" value="62.5"/>
+ </NamedInstance>
+
+ <!-- ExtraCondensed Black -->
+ <NamedInstance flags="0x0" subfamilyNameID="293">
+ <coord axis="wght" value="900.0"/>
+ <coord axis="wdth" value="62.5"/>
+ </NamedInstance>
+ </fvar>
+
+ <gvar>
+ <version value="1"/>
+ <reserved value="0"/>
+ <glyphVariations glyph=".notdef">
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <delta pt="0" x="-9" y="0"/>
+ <delta pt="4" x="-9" y="0"/>
+ <delta pt="9" x="-18" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="-9" y="0"/>
+ <delta pt="4" x="-9" y="0"/>
+ <delta pt="9" x="-5" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="0" y="0"/>
+ <delta pt="1" x="0" y="0"/>
+ <delta pt="2" x="0" y="0"/>
+ <delta pt="3" x="0" y="0"/>
+ <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"/>
+ <delta pt="8" x="0" y="0"/>
+ <delta pt="9" x="5" y="0"/>
+ <delta pt="10" x="0" y="0"/>
+ <delta pt="11" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="0" y="0"/>
+ <delta pt="1" x="0" y="0"/>
+ <delta pt="2" x="0" y="0"/>
+ <delta pt="3" x="0" y="0"/>
+ <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"/>
+ <delta pt="8" x="0" y="0"/>
+ <delta pt="9" x="-8" y="0"/>
+ <delta pt="10" x="0" y="0"/>
+ <delta pt="11" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="9" y="0"/>
+ <delta pt="4" x="9" y="0"/>
+ <delta pt="9" x="5" y="0"/>
+ </tuple>
+ </glyphVariations>
+ <glyphVariations glyph="A">
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <delta pt="0" x="4" y="0"/>
+ <delta pt="1" x="-14" y="50"/>
+ <delta pt="2" x="-41" y="50"/>
+ <delta pt="3" x="-63" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="3" y="-1"/>
+ <delta pt="6" x="-53" y="-1"/>
+ <delta pt="7" x="-61" y="0"/>
+ <delta pt="8" x="3" y="-5"/>
+ <delta pt="9" x="-27" y="77"/>
+ <delta pt="10" x="-28" y="81"/>
+ <delta pt="11" x="-24" y="65"/>
+ <delta pt="12" x="-22" y="52"/>
+ <delta pt="13" x="-25" y="58"/>
+ <delta pt="14" x="-25" y="63"/>
+ <delta pt="15" x="-25" y="73"/>
+ <delta pt="16" x="-26" y="78"/>
+ <delta pt="17" x="-27" y="76"/>
+ <delta pt="18" x="-62" y="-5"/>
+ <delta pt="19" x="0" y="0"/>
+ <delta pt="20" x="-62" y="0"/>
+ <delta pt="21" x="0" y="0"/>
+ <delta pt="22" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <delta pt="0" x="-18" y="0"/>
+ <delta pt="1" x="16" y="-51"/>
+ <delta pt="2" x="39" y="-51"/>
+ <delta pt="3" x="72" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="-27" y="0"/>
+ <delta pt="6" x="77" y="0"/>
+ <delta pt="7" x="52" y="0"/>
+ <delta pt="8" x="7" y="-4"/>
+ <delta pt="9" x="35" y="-54"/>
+ <delta pt="10" x="33" y="-45"/>
+ <delta pt="11" x="31" y="-35"/>
+ <delta pt="12" x="28" y="-26"/>
+ <delta pt="13" x="27" y="-18"/>
+ <delta pt="14" x="27" y="-18"/>
+ <delta pt="15" x="21" y="-36"/>
+ <delta pt="16" x="17" y="-55"/>
+ <delta pt="17" x="17" y="-54"/>
+ <delta pt="18" x="47" y="-4"/>
+ <delta pt="19" x="0" y="0"/>
+ <delta pt="20" x="51" y="0"/>
+ <delta pt="21" x="0" y="0"/>
+ <delta pt="22" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <delta pt="0" x="-30" y="0"/>
+ <delta pt="1" x="21" y="-87"/>
+ <delta pt="2" x="72" y="-87"/>
+ <delta pt="3" x="121" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="-46" y="0"/>
+ <delta pt="6" x="130" y="0"/>
+ <delta pt="7" x="88" y="0"/>
+ <delta pt="8" x="8" y="-9"/>
+ <delta pt="9" x="57" y="-108"/>
+ <delta pt="10" x="55" y="-97"/>
+ <delta pt="11" x="51" y="-68"/>
+ <delta pt="12" x="46" y="-37"/>
+ <delta pt="13" x="45" y="-25"/>
+ <delta pt="14" x="46" y="-29"/>
+ <delta pt="15" x="40" y="-60"/>
+ <delta pt="16" x="34" y="-96"/>
+ <delta pt="17" x="32" y="-108"/>
+ <delta pt="18" x="82" y="-9"/>
+ <delta pt="19" x="0" y="0"/>
+ <delta pt="20" x="87" y="0"/>
+ <delta pt="21" x="0" y="0"/>
+ <delta pt="22" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="-184" y="0"/>
+ <delta pt="1" x="-150" y="2"/>
+ <delta pt="2" x="-34" y="2"/>
+ <delta pt="3" x="-1" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="-106" y="-3"/>
+ <delta pt="6" x="-86" y="-3"/>
+ <delta pt="7" x="-188" y="0"/>
+ <delta pt="8" x="-139" y="0"/>
+ <delta pt="9" x="-112" y="18"/>
+ <delta pt="10" x="-112" y="29"/>
+ <delta pt="11" x="-105" y="22"/>
+ <delta pt="12" x="-97" y="11"/>
+ <delta pt="13" x="-95" y="14"/>
+ <delta pt="14" x="-91" y="19"/>
+ <delta pt="15" x="-85" y="26"/>
+ <delta pt="16" x="-81" y="25"/>
+ <delta pt="17" x="-81" y="19"/>
+ <delta pt="18" x="-51" y="0"/>
+ <delta pt="19" x="0" y="0"/>
+ <delta pt="20" x="-189" y="0"/>
+ <delta pt="21" x="0" y="0"/>
+ <delta pt="22" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="-14" y="0"/>
+ <delta pt="1" x="-11" y="8"/>
+ <delta pt="2" x="-7" y="8"/>
+ <delta pt="3" x="-1" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="-6" y="1"/>
+ <delta pt="6" x="-13" y="1"/>
+ <delta pt="7" x="-12" y="0"/>
+ <delta pt="8" x="-18" y="10"/>
+ <delta pt="9" x="-5" y="0"/>
+ <delta pt="10" x="-5" y="-6"/>
+ <delta pt="11" x="-8" y="1"/>
+ <delta pt="12" x="-11" y="6"/>
+ <delta pt="13" x="-9" y="-1"/>
+ <delta pt="14" x="-11" y="-5"/>
+ <delta pt="15" x="-12" y="-6"/>
+ <delta pt="16" x="-10" y="-3"/>
+ <delta pt="17" x="-9" y="0"/>
+ <delta pt="18" x="7" y="10"/>
+ <delta pt="19" x="0" y="0"/>
+ <delta pt="20" x="-11" y="0"/>
+ <delta pt="21" x="0" y="0"/>
+ <delta pt="22" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="37" y="0"/>
+ <delta pt="1" x="18" y="0"/>
+ <delta pt="2" x="3" y="0"/>
+ <delta pt="3" x="-15" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="27" y="0"/>
+ <delta pt="6" x="-1" y="0"/>
+ <delta pt="7" x="24" y="0"/>
+ <delta pt="8" x="22" y="-6"/>
+ <delta pt="9" x="8" y="-1"/>
+ <delta pt="10" x="9" y="-5"/>
+ <delta pt="11" x="11" y="-5"/>
+ <delta pt="12" x="13" y="-7"/>
+ <delta pt="13" x="13" y="-12"/>
+ <delta pt="14" x="13" y="-14"/>
+ <delta pt="15" x="18" y="-3"/>
+ <delta pt="16" x="21" y="6"/>
+ <delta pt="17" x="20" y="0"/>
+ <delta pt="18" x="3" y="-6"/>
+ <delta pt="19" x="0" y="0"/>
+ <delta pt="20" x="25" y="0"/>
+ <delta pt="21" x="0" y="0"/>
+ <delta pt="22" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="61" y="0"/>
+ <delta pt="1" x="35" y="3"/>
+ <delta pt="2" x="-3" y="3"/>
+ <delta pt="3" x="-27" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="47" y="0"/>
+ <delta pt="6" x="-6" y="0"/>
+ <delta pt="7" x="36" y="0"/>
+ <delta pt="8" x="38" y="-7"/>
+ <delta pt="9" x="13" y="18"/>
+ <delta pt="10" x="13" y="15"/>
+ <delta pt="11" x="16" y="1"/>
+ <delta pt="12" x="20" y="-17"/>
+ <delta pt="13" x="20" y="-24"/>
+ <delta pt="14" x="18" y="-24"/>
+ <delta pt="15" x="23" y="-5"/>
+ <delta pt="16" x="27" y="16"/>
+ <delta pt="17" x="28" y="19"/>
+ <delta pt="18" x="-1" y="-7"/>
+ <delta pt="19" x="0" y="0"/>
+ <delta pt="20" x="37" y="0"/>
+ <delta pt="21" x="0" y="0"/>
+ <delta pt="22" x="0" y="0"/>
+ </tuple>
+ </glyphVariations>
+ <glyphVariations glyph="T">
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <delta pt="1" x="6" y="0"/>
+ <delta pt="3" x="-8" y="54"/>
+ <delta pt="5" x="-42" y="0"/>
+ <delta pt="7" x="-58" y="54"/>
+ <delta pt="9" x="-51" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <delta pt="1" x="-19" y="0"/>
+ <delta pt="3" x="10" y="-47"/>
+ <delta pt="5" x="14" y="0"/>
+ <delta pt="7" x="42" y="-47"/>
+ <delta pt="9" x="23" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <delta pt="1" x="-34" y="0"/>
+ <delta pt="3" x="15" y="-79"/>
+ <delta pt="5" x="21" y="0"/>
+ <delta pt="7" x="69" y="-79"/>
+ <delta pt="9" x="35" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="-85" y="0"/>
+ <delta pt="3" x="0" y="3"/>
+ <delta pt="5" x="-175" y="0"/>
+ <delta pt="7" x="-91" y="3"/>
+ <delta pt="9" x="-175" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="0" y="0"/>
+ <delta pt="3" x="5" y="-3"/>
+ <delta pt="5" x="0" y="0"/>
+ <delta pt="7" x="6" y="-3"/>
+ <delta pt="9" x="6" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="18" y="0"/>
+ <delta pt="3" x="-6" y="4"/>
+ <delta pt="5" x="30" y="0"/>
+ <delta pt="7" x="8" y="4"/>
+ <delta pt="9" x="25" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="32" y="0"/>
+ <delta pt="3" x="-8" y="8"/>
+ <delta pt="5" x="52" y="0"/>
+ <delta pt="7" x="14" y="8"/>
+ <delta pt="9" x="44" y="0"/>
+ </tuple>
+ </glyphVariations>
+ <glyphVariations glyph="grave">
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <delta pt="0" x="-75" y="0"/>
+ <delta pt="1" x="-71" y="1"/>
+ <delta pt="2" x="-56" y="-1"/>
+ <delta pt="3" x="-39" y="-5"/>
+ <delta pt="4" x="-32" y="-6"/>
+ <delta pt="5" x="-32" y="0"/>
+ <delta pt="6" x="6" y="0"/>
+ <delta pt="7" x="3" y="3"/>
+ <delta pt="8" x="4" y="3"/>
+ <delta pt="9" x="6" y="1"/>
+ <delta pt="10" x="4" y="0"/>
+ <delta pt="11" x="0" y="3"/>
+ <delta pt="12" x="0" y="0"/>
+ <delta pt="13" x="0" y="0"/>
+ <delta pt="14" x="-32" y="0"/>
+ <delta pt="15" x="0" y="0"/>
+ <delta pt="16" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <delta pt="0" x="62" y="0"/>
+ <delta pt="1" x="66" y="0"/>
+ <delta pt="2" x="74" y="0"/>
+ <delta pt="3" x="80" y="1"/>
+ <delta pt="4" x="81" y="1"/>
+ <delta pt="5" x="81" y="0"/>
+ <delta pt="6" x="41" y="0"/>
+ <delta pt="7" x="39" y="-1"/>
+ <delta pt="8" x="30" y="-1"/>
+ <delta pt="9" x="18" y="0"/>
+ <delta pt="10" x="5" y="0"/>
+ <delta pt="11" x="0" y="0"/>
+ <delta pt="12" x="0" y="0"/>
+ <delta pt="13" x="0" y="0"/>
+ <delta pt="14" x="81" y="0"/>
+ <delta pt="15" x="0" y="0"/>
+ <delta pt="16" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <delta pt="0" x="105" y="0"/>
+ <delta pt="1" x="111" y="0"/>
+ <delta pt="2" x="125" y="1"/>
+ <delta pt="3" x="136" y="2"/>
+ <delta pt="4" x="137" y="2"/>
+ <delta pt="5" x="137" y="0"/>
+ <delta pt="6" x="69" y="0"/>
+ <delta pt="7" x="66" y="-1"/>
+ <delta pt="8" x="51" y="-1"/>
+ <delta pt="9" x="31" y="-1"/>
+ <delta pt="10" x="9" y="0"/>
+ <delta pt="11" x="0" y="0"/>
+ <delta pt="12" x="0" y="0"/>
+ <delta pt="13" x="0" y="0"/>
+ <delta pt="14" x="137" y="0"/>
+ <delta pt="15" x="0" y="0"/>
+ <delta pt="16" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="-8" y="0"/>
+ <delta pt="1" x="-8" y="-1"/>
+ <delta pt="2" x="-10" y="-1"/>
+ <delta pt="3" x="-14" y="-1"/>
+ <delta pt="4" x="-15" y="-1"/>
+ <delta pt="5" x="-15" y="0"/>
+ <delta pt="6" x="-8" y="0"/>
+ <delta pt="7" x="-6" y="-1"/>
+ <delta pt="8" x="-2" y="-2"/>
+ <delta pt="9" x="0" y="-2"/>
+ <delta pt="10" x="1" y="-1"/>
+ <delta pt="11" x="0" y="1"/>
+ <delta pt="12" x="0" y="0"/>
+ <delta pt="13" x="0" y="0"/>
+ <delta pt="14" x="-15" y="0"/>
+ <delta pt="15" x="0" y="0"/>
+ <delta pt="16" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="9" y="-3"/>
+ <delta pt="1" x="12" y="-8"/>
+ <delta pt="2" x="3" y="-1"/>
+ <delta pt="3" x="-7" y="9"/>
+ <delta pt="4" x="-9" y="6"/>
+ <delta pt="5" x="-9" y="0"/>
+ <delta pt="6" x="-11" y="0"/>
+ <delta pt="7" x="-7" y="-2"/>
+ <delta pt="8" x="-5" y="-4"/>
+ <delta pt="9" x="-3" y="-5"/>
+ <delta pt="10" x="-2" y="-4"/>
+ <delta pt="11" x="0" y="-4"/>
+ <delta pt="12" x="0" y="-3"/>
+ <delta pt="13" x="0" y="0"/>
+ <delta pt="14" x="-9" y="0"/>
+ <delta pt="15" x="0" y="0"/>
+ <delta pt="16" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="-10" y="0"/>
+ <delta pt="1" x="-16" y="2"/>
+ <delta pt="2" x="-25" y="0"/>
+ <delta pt="3" x="-32" y="-2"/>
+ <delta pt="4" x="-36" y="1"/>
+ <delta pt="5" x="-36" y="0"/>
+ <delta pt="6" x="-37" y="0"/>
+ <delta pt="7" x="-33" y="0"/>
+ <delta pt="8" x="-25" y="1"/>
+ <delta pt="9" x="-15" y="2"/>
+ <delta pt="10" x="-5" y="2"/>
+ <delta pt="11" x="0" y="0"/>
+ <delta pt="12" x="0" y="0"/>
+ <delta pt="13" x="0" y="0"/>
+ <delta pt="14" x="-36" y="0"/>
+ <delta pt="15" x="0" y="0"/>
+ <delta pt="16" x="0" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="0" x="-20" y="0"/>
+ <delta pt="1" x="-28" y="4"/>
+ <delta pt="2" x="-43" y="-1"/>
+ <delta pt="3" x="-57" y="-4"/>
+ <delta pt="4" x="-63" y="1"/>
+ <delta pt="5" x="-63" y="0"/>
+ <delta pt="6" x="-62" y="0"/>
+ <delta pt="7" x="-56" y="-1"/>
+ <delta pt="8" x="-42" y="1"/>
+ <delta pt="9" x="-26" y="4"/>
+ <delta pt="10" x="-9" y="3"/>
+ <delta pt="11" x="0" y="-1"/>
+ <delta pt="12" x="0" y="0"/>
+ <delta pt="13" x="0" y="0"/>
+ <delta pt="14" x="-63" y="0"/>
+ <delta pt="15" x="0" y="0"/>
+ <delta pt="16" x="0" y="0"/>
+ </tuple>
+ </glyphVariations>
+ <glyphVariations glyph="Agrave">
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <delta pt="1" x="-16" y="8"/>
+ <delta pt="3" x="-62" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <delta pt="1" x="-33" y="-10"/>
+ <delta pt="3" x="51" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <delta pt="1" x="-35" y="-17"/>
+ <delta pt="3" x="87" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="-115" y="-14"/>
+ <delta pt="3" x="-189" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" value="-1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="-5" y="-4"/>
+ <delta pt="3" x="-11" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.0" value="0.61" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="64" y="8"/>
+ <delta pt="3" x="25" y="0"/>
+ </tuple>
+ <tuple>
+ <coord axis="wght" min="0.61" value="1.0" max="1.0"/>
+ <coord axis="wdth" value="-1.0"/>
+ <delta pt="1" x="86" y="14"/>
+ <delta pt="3" x="37" y="0"/>
+ </tuple>
+ </glyphVariations>
+ </gvar>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/PartialInstancerTest3-VF.ttx b/Tests/varLib/instancer/data/PartialInstancerTest3-VF.ttx
new file mode 100644
index 00000000..01c7d050
--- /dev/null
+++ b/Tests/varLib/instancer/data/PartialInstancerTest3-VF.ttx
@@ -0,0 +1,439 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.15">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="B"/>
+ <GlyphID id="3" name="C"/>
+ <GlyphID id="4" name="D"/>
+ <GlyphID id="5" name="E"/>
+ <GlyphID id="6" name="F"/>
+ <GlyphID id="7" name="space"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0xc3d4abe6"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Wed Sep 23 12:54:22 2020"/>
+ <modified value="Tue Sep 29 18:06:03 2020"/>
+ <xMin value="-152"/>
+ <yMin value="-200"/>
+ <xMax value="1059"/>
+ <yMax value="800"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="-152"/>
+ <minRightSideBearing value="-559"/>
+ <xMaxExtent value="1059"/>
+ <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="8"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="8"/>
+ <maxPoints value="8"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="12"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="3"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="513"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="0"/>
+ <bProportion value="0"/>
+ <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="NONE"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="70"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="50"/>
+ <mtx name="A" width="500" lsb="153"/>
+ <mtx name="B" width="500" lsb="-152"/>
+ <mtx name="C" width="500" lsb="-133"/>
+ <mtx name="D" width="500" lsb="-97"/>
+ <mtx name="E" width="500" lsb="-87"/>
+ <mtx name="F" width="500" lsb="-107"/>
+ <mtx name="space" width="600" lsb="0"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+ <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+ <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+ <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+ <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+ <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+ <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+ <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+ <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+ </cmap_format_4>
+ </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" xMin="50" yMin="-200" xMax="450" yMax="800">
+ <contour>
+ <pt x="50" y="-200" on="1"/>
+ <pt x="50" y="800" on="1"/>
+ <pt x="450" y="800" on="1"/>
+ <pt x="450" y="-200" on="1"/>
+ </contour>
+ <contour>
+ <pt x="100" y="-150" on="1"/>
+ <pt x="400" y="-150" on="1"/>
+ <pt x="400" y="750" on="1"/>
+ <pt x="100" y="750" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="153" yMin="-66" xMax="350" yMax="646">
+ <contour>
+ <pt x="153" y="646" on="1"/>
+ <pt x="350" y="646" on="1"/>
+ <pt x="350" y="-66" on="1"/>
+ <pt x="153" y="-66" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="B" xMin="-152" yMin="39" xMax="752" yMax="592">
+ <contour>
+ <pt x="-152" y="448" on="1"/>
+ <pt x="752" y="448" on="1"/>
+ <pt x="752" y="215" on="1"/>
+ <pt x="-152" y="215" on="1"/>
+ </contour>
+ <contour>
+ <pt x="129" y="592" on="1"/>
+ <pt x="401" y="592" on="1"/>
+ <pt x="401" y="39" on="1"/>
+ <pt x="129" y="39" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="C" xMin="-133" yMin="-66" xMax="771" yMax="646">
+ <component glyphName="A" x="-250" y="0" flags="0x4"/>
+ <component glyphName="B" x="19" y="-28" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="D" xMin="-97" yMin="-66" xMax="1059" yMax="646">
+ <component glyphName="A" x="-250" y="0" flags="0x4"/>
+ <component glyphName="B" x="307" y="-28" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="E" xMin="-87" yMin="-87" xMax="801" yMax="650">
+ <component glyphName="A" x="450" y="-77" scalex="0.9397" scale01="0.34204" scale10="-0.34204" scaley="0.9397" flags="0x4"/>
+ <component glyphName="A" x="8" y="4" flags="0x4"/>
+ <component glyphName="A" x="-240" y="0" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="F" xMin="-107" yMin="-95" xMax="837" yMax="650">
+ <component glyphName="A" x="501" y="-114" scalex="0.866" scale01="0.5" scale10="-0.5" scaley="0.866" flags="0x4"/>
+ <component glyphName="A" x="-12" y="4" flags="0x4"/>
+ <component glyphName="A" x="-260" y="0" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="space"/><!-- contains no outline data -->
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Remove Overlaps Test
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.000;NONE;RemoveOverlapsTest-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Remove Overlaps Test Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.000
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ RemoveOverlapsTest-Regular
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <HVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=1 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=1 -->
+ <VarData index="0">
+ <!-- ItemCount=8 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=0 -->
+ <Item index="0" value="[]"/>
+ <Item index="1" value="[]"/>
+ <Item index="2" value="[]"/>
+ <Item index="3" value="[]"/>
+ <Item index="4" value="[]"/>
+ <Item index="5" value="[]"/>
+ <Item index="6" value="[]"/>
+ <Item index="7" value="[]"/>
+ </VarData>
+ </VarStore>
+ </HVAR>
+
+ <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=0 -->
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+ <fvar>
+
+ <!-- Weight -->
+ <Axis>
+ <AxisTag>wght</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>400.0</MinValue>
+ <DefaultValue>400.0</DefaultValue>
+ <MaxValue>700.0</MaxValue>
+ <AxisNameID>256</AxisNameID>
+ </Axis>
+
+ <!-- Regular -->
+ <NamedInstance flags="0x0" subfamilyNameID="257">
+ <coord axis="wght" value="400.0"/>
+ </NamedInstance>
+
+ <!-- Regular -->
+ <NamedInstance flags="0x0" subfamilyNameID="257">
+ <coord axis="wght" value="700.0"/>
+ </NamedInstance>
+ </fvar>
+
+ <gvar>
+ <version value="1"/>
+ <reserved value="0"/>
+ <glyphVariations glyph="A">
+ <tuple>
+ <coord axis="wght" value="1.0"/>
+ <delta pt="0" x="-40" y="0"/>
+ <delta pt="1" x="40" y="0"/>
+ <delta pt="2" x="40" y="0"/>
+ <delta pt="3" x="-40" y="0"/>
+ <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="B">
+ <tuple>
+ <coord axis="wght" value="1.0"/>
+ <delta pt="0" x="-40" y="0"/>
+ <delta pt="2" x="40" y="0"/>
+ <delta pt="5" x="40" y="20"/>
+ <delta pt="7" x="-40" y="-20"/>
+ </tuple>
+ </glyphVariations>
+ <glyphVariations glyph="C">
+ <tuple>
+ <coord axis="wght" value="1.0"/>
+ <delta pt="0" x="0" y="0"/>
+ <delta pt="1" x="0" y="0"/>
+ <delta pt="2" x="0" y="0"/>
+ <delta pt="3" x="0" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="0" y="0"/>
+ </tuple>
+ </glyphVariations>
+ <glyphVariations glyph="D">
+ <tuple>
+ <coord axis="wght" value="1.0"/>
+ <delta pt="0" x="0" y="0"/>
+ <delta pt="1" x="0" y="0"/>
+ <delta pt="2" x="0" y="0"/>
+ <delta pt="3" x="0" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="0" y="0"/>
+ </tuple>
+ </glyphVariations>
+ <glyphVariations glyph="E">
+ <tuple>
+ <coord axis="wght" value="1.0"/>
+ <delta pt="0" x="0" y="0"/>
+ <delta pt="1" x="0" y="0"/>
+ <delta pt="2" x="0" y="0"/>
+ <delta pt="3" x="0" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="0" y="0"/>
+ <delta pt="6" x="0" y="0"/>
+ </tuple>
+ </glyphVariations>
+ <glyphVariations glyph="F">
+ <tuple>
+ <coord axis="wght" value="1.0"/>
+ <delta pt="0" x="0" y="0"/>
+ <delta pt="1" x="0" y="0"/>
+ <delta pt="2" x="0" y="0"/>
+ <delta pt="3" x="0" y="0"/>
+ <delta pt="4" x="0" y="0"/>
+ <delta pt="5" x="0" y="0"/>
+ <delta pt="6" x="0" y="0"/>
+ </tuple>
+ </glyphVariations>
+ </gvar>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-100,100.ttx b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-100,100.ttx
new file mode 100644
index 00000000..776a92f1
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-100,100.ttx
@@ -0,0 +1,544 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.41">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="T"/>
+ <GlyphID id="3" name="grave"/>
+ <GlyphID id="4" name="Agrave"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="2.001"/>
+ <checkSumAdjustment value="0x90f1c28"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Mar 15 19:50:39 2016"/>
+ <modified value="Thu Oct 17 14:43:10 2019"/>
+ <xMin value="0"/>
+ <yMin value="0"/>
+ <xMax value="577"/>
+ <yMax value="952"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1069"/>
+ <descent value="-293"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="0"/>
+ <minRightSideBearing value="0"/>
+ <xMaxExtent value="577"/>
+ <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="5"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="5"/>
+ <maxPoints value="19"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="32"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="2"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="577"/>
+ <usWeightClass value="100"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="317"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="2"/>
+ <bContrast value="4"/>
+ <bStrokeVariation value="5"/>
+ <bArmStyle value="4"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="11100000 00000000 00000010 11111111"/>
+ <ulUnicodeRange2 value="01000000 00000000 00100000 00011111"/>
+ <ulUnicodeRange3 value="00001000 00000000 00000000 00101001"/>
+ <ulUnicodeRange4 value="00000000 00010000 00000000 00000000"/>
+ <achVendID value="GOOG"/>
+ <fsSelection value="00000001 01000000"/>
+ <usFirstCharIndex value="65"/>
+ <usLastCharIndex value="192"/>
+ <sTypoAscender value="1069"/>
+ <sTypoDescender value="-293"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="1069"/>
+ <usWinDescent value="293"/>
+ <ulCodePageRange1 value="00000000 00000000 00000001 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="528"/>
+ <sCapHeight value="714"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="4"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="600" lsb="94"/>
+ <mtx name="A" width="577" lsb="0"/>
+ <mtx name="Agrave" width="577" lsb="0"/>
+ <mtx name="T" width="505" lsb="2"/>
+ <mtx name="grave" width="249" lsb="40"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ </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" xMin="94" yMin="0" xMax="505" yMax="714">
+ <contour>
+ <pt x="94" y="0" on="1" overlap="1"/>
+ <pt x="94" y="714" on="1"/>
+ <pt x="505" y="714" on="1"/>
+ <pt x="505" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="145" y="51" on="1"/>
+ <pt x="454" y="51" on="1"/>
+ <pt x="454" y="663" on="1"/>
+ <pt x="145" y="663" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="0" yMin="0" xMax="577" yMax="716">
+ <contour>
+ <pt x="549" y="0" on="1" overlap="1"/>
+ <pt x="445" y="271" on="1"/>
+ <pt x="135" y="271" on="1"/>
+ <pt x="28" y="0" on="1"/>
+ <pt x="0" y="0" on="1"/>
+ <pt x="282" y="716" on="1"/>
+ <pt x="307" y="716" on="1"/>
+ <pt x="577" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="435" y="296" on="1"/>
+ <pt x="325" y="594" on="1"/>
+ <pt x="321" y="606" on="0"/>
+ <pt x="311" y="632" on="0"/>
+ <pt x="300" y="664" on="0"/>
+ <pt x="293" y="682" on="1"/>
+ <pt x="288" y="667" on="0"/>
+ <pt x="277" y="636" on="0"/>
+ <pt x="265" y="607" on="0"/>
+ <pt x="260" y="593" on="1"/>
+ <pt x="144" y="296" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="Agrave" xMin="0" yMin="0" xMax="577" yMax="952">
+ <component glyphName="A" x="0" y="0" flags="0x604"/>
+ <component glyphName="grave" x="131" y="186" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="T" xMin="2" yMin="0" xMax="503" yMax="714">
+ <contour>
+ <pt x="265" y="0" on="1" overlap="1"/>
+ <pt x="239" y="0" on="1"/>
+ <pt x="239" y="689" on="1"/>
+ <pt x="2" y="689" on="1"/>
+ <pt x="2" y="714" on="1"/>
+ <pt x="503" y="714" on="1"/>
+ <pt x="503" y="689" on="1"/>
+ <pt x="265" y="689" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="grave" xMin="40" yMin="606" xMax="209" yMax="766">
+ <contour>
+ <pt x="70" y="766" on="1" overlap="1"/>
+ <pt x="85" y="745" on="0"/>
+ <pt x="133" y="688" on="0"/>
+ <pt x="187" y="632" on="0"/>
+ <pt x="209" y="612" on="1"/>
+ <pt x="209" y="606" on="1"/>
+ <pt x="188" y="606" on="1"/>
+ <pt x="168" y="623" on="0"/>
+ <pt x="127" y="662" on="0"/>
+ <pt x="88" y="703" on="0"/>
+ <pt x="53" y="742" on="0"/>
+ <pt x="40" y="759" on="1"/>
+ <pt x="40" y="766" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Width
+ </namerecord>
+ <namerecord nameID="258" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Thin
+ </namerecord>
+ <namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright 2015 Google Inc. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 2.001;GOOG;NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 2.001
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+ Noto is a trademark of Google Inc.
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Monotype Imaging Inc.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Monotype Design Team
+ </namerecord>
+ <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409">
+ Designed by Monotype design team.
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.google.com/get/noto/
+ </namerecord>
+ <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409">
+ http://www.monotype.com/studio
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://scripts.sil.org/OFL
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Width
+ </namerecord>
+ <namerecord nameID="258" platformID="3" platEncID="1" langID="0x409">
+ Thin
+ </namerecord>
+ <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <GDEF>
+ <Version value="0x00010002"/>
+ <GlyphClassDef>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="1"/>
+ </GlyphClassDef>
+ <MarkGlyphSetsDef>
+ <MarkSetTableFormat value="1"/>
+ <!-- MarkSetCount=4 -->
+ <Coverage index="0">
+ </Coverage>
+ <Coverage index="1">
+ </Coverage>
+ <Coverage index="2">
+ </Coverage>
+ <Coverage index="3">
+ </Coverage>
+ </MarkGlyphSetsDef>
+ </GDEF>
+
+ <GPOS>
+ <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="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="2"/>
+ <LookupFlag value="8"/><!-- ignoreMarks -->
+ <!-- SubTableCount=1 -->
+ <PairPos index="0" Format="2">
+ <Coverage>
+ <Glyph value="A"/>
+ <Glyph value="T"/>
+ <Glyph value="Agrave"/>
+ </Coverage>
+ <ValueFormat1 value="4"/>
+ <ValueFormat2 value="0"/>
+ <ClassDef1>
+ <ClassDef glyph="T" class="1"/>
+ </ClassDef1>
+ <ClassDef2>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="2"/>
+ </ClassDef2>
+ <!-- Class1Count=2 -->
+ <!-- Class2Count=3 -->
+ <Class1Record index="0">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="-70"/>
+ </Class2Record>
+ </Class1Record>
+ <Class1Record index="1">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="-70"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="20"/>
+ </Class2Record>
+ </Class1Record>
+ </PairPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=4 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="cyrl"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="2">
+ <ScriptTag value="grek"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="3">
+ <ScriptTag value="latn"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <STAT>
+ <Version value="0x00010001"/>
+ <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="wdth"/>
+ <AxisNameID value="257"/> <!-- Width -->
+ <AxisOrdering value="0"/>
+ </Axis>
+ </DesignAxisRecord>
+ <!-- AxisValueCount=2 -->
+ <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="2">
+ <AxisIndex value="1"/>
+ <Flags value="2"/> <!-- ElidableAxisValueName -->
+ <ValueNameID value="261"/> <!-- Regular -->
+ <NominalValue value="100.0"/>
+ <RangeMinValue value="93.75"/>
+ <RangeMaxValue value="100.0"/>
+ </AxisValue>
+ </AxisValueArray>
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-100,62.5.ttx b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-100,62.5.ttx
new file mode 100644
index 00000000..61bc41cc
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-100,62.5.ttx
@@ -0,0 +1,544 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.41">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="T"/>
+ <GlyphID id="3" name="grave"/>
+ <GlyphID id="4" name="Agrave"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="2.001"/>
+ <checkSumAdjustment value="0x31525751"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Mar 15 19:50:39 2016"/>
+ <modified value="Thu Oct 17 14:43:10 2019"/>
+ <xMin value="0"/>
+ <yMin value="0"/>
+ <xMax value="496"/>
+ <yMax value="931"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1069"/>
+ <descent value="-293"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="0"/>
+ <minRightSideBearing value="0"/>
+ <xMaxExtent value="496"/>
+ <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="5"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="5"/>
+ <maxPoints value="19"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="32"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="2"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="577"/>
+ <usWeightClass value="100"/>
+ <usWidthClass value="2"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="316"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="2"/>
+ <bContrast value="4"/>
+ <bStrokeVariation value="5"/>
+ <bArmStyle value="4"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="11100000 00000000 00000010 11111111"/>
+ <ulUnicodeRange2 value="01000000 00000000 00100000 00011111"/>
+ <ulUnicodeRange3 value="00001000 00000000 00000000 00101001"/>
+ <ulUnicodeRange4 value="00000000 00010000 00000000 00000000"/>
+ <achVendID value="GOOG"/>
+ <fsSelection value="00000001 01000000"/>
+ <usFirstCharIndex value="65"/>
+ <usLastCharIndex value="192"/>
+ <sTypoAscender value="1069"/>
+ <sTypoDescender value="-293"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="1069"/>
+ <usWinDescent value="293"/>
+ <ulCodePageRange1 value="00000000 00000000 00000001 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="527"/>
+ <sCapHeight value="714"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="4"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="600" lsb="85"/>
+ <mtx name="A" width="377" lsb="0"/>
+ <mtx name="Agrave" width="377" lsb="0"/>
+ <mtx name="T" width="336" lsb="7"/>
+ <mtx name="grave" width="225" lsb="40"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ </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" xMin="85" yMin="0" xMax="496" yMax="714">
+ <contour>
+ <pt x="85" y="0" on="1" overlap="1"/>
+ <pt x="85" y="714" on="1"/>
+ <pt x="496" y="714" on="1"/>
+ <pt x="496" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="136" y="51" on="1"/>
+ <pt x="445" y="51" on="1"/>
+ <pt x="445" y="663" on="1"/>
+ <pt x="136" y="663" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="0" yMin="0" xMax="377" yMax="714">
+ <contour>
+ <pt x="351" y="0" on="1" overlap="1"/>
+ <pt x="284" y="281" on="1"/>
+ <pt x="94" y="281" on="1"/>
+ <pt x="26" y="0" on="1"/>
+ <pt x="0" y="0" on="1"/>
+ <pt x="170" y="714" on="1"/>
+ <pt x="208" y="714" on="1"/>
+ <pt x="377" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="278" y="306" on="1"/>
+ <pt x="208" y="612" on="1"/>
+ <pt x="204" y="629" on="0"/>
+ <pt x="198" y="655" on="0"/>
+ <pt x="192" y="681" on="0"/>
+ <pt x="189" y="695" on="1"/>
+ <pt x="186" y="681" on="0"/>
+ <pt x="180" y="656" on="0"/>
+ <pt x="174" y="629" on="0"/>
+ <pt x="170" y="612" on="1"/>
+ <pt x="100" y="306" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="Agrave" xMin="0" yMin="0" xMax="377" yMax="931">
+ <component glyphName="A" x="0" y="0" flags="0x604"/>
+ <component glyphName="grave" x="11" y="168" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="T" xMin="7" yMin="0" xMax="328" yMax="714">
+ <contour>
+ <pt x="180" y="0" on="1" overlap="1"/>
+ <pt x="154" y="0" on="1"/>
+ <pt x="154" y="689" on="1"/>
+ <pt x="7" y="689" on="1"/>
+ <pt x="7" y="714" on="1"/>
+ <pt x="328" y="714" on="1"/>
+ <pt x="328" y="689" on="1"/>
+ <pt x="180" y="689" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="grave" xMin="40" yMin="606" xMax="185" yMax="763">
+ <contour>
+ <pt x="71" y="763" on="1" overlap="1"/>
+ <pt x="89" y="736" on="0"/>
+ <pt x="126" y="686" on="0"/>
+ <pt x="166" y="640" on="0"/>
+ <pt x="185" y="617" on="1"/>
+ <pt x="185" y="606" on="1"/>
+ <pt x="169" y="606" on="1"/>
+ <pt x="155" y="620" on="0"/>
+ <pt x="120" y="656" on="0"/>
+ <pt x="85" y="696" on="0"/>
+ <pt x="52" y="737" on="0"/>
+ <pt x="40" y="756" on="1"/>
+ <pt x="40" y="763" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Width
+ </namerecord>
+ <namerecord nameID="258" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Thin
+ </namerecord>
+ <namerecord nameID="288" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright 2015 Google Inc. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 2.001;GOOG;NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 2.001
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+ Noto is a trademark of Google Inc.
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Monotype Imaging Inc.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Monotype Design Team
+ </namerecord>
+ <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409">
+ Designed by Monotype design team.
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.google.com/get/noto/
+ </namerecord>
+ <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409">
+ http://www.monotype.com/studio
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://scripts.sil.org/OFL
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Width
+ </namerecord>
+ <namerecord nameID="258" platformID="3" platEncID="1" langID="0x409">
+ Thin
+ </namerecord>
+ <namerecord nameID="288" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <GDEF>
+ <Version value="0x00010002"/>
+ <GlyphClassDef>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="1"/>
+ </GlyphClassDef>
+ <MarkGlyphSetsDef>
+ <MarkSetTableFormat value="1"/>
+ <!-- MarkSetCount=4 -->
+ <Coverage index="0">
+ </Coverage>
+ <Coverage index="1">
+ </Coverage>
+ <Coverage index="2">
+ </Coverage>
+ <Coverage index="3">
+ </Coverage>
+ </MarkGlyphSetsDef>
+ </GDEF>
+
+ <GPOS>
+ <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="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="2"/>
+ <LookupFlag value="8"/><!-- ignoreMarks -->
+ <!-- SubTableCount=1 -->
+ <PairPos index="0" Format="2">
+ <Coverage>
+ <Glyph value="A"/>
+ <Glyph value="T"/>
+ <Glyph value="Agrave"/>
+ </Coverage>
+ <ValueFormat1 value="4"/>
+ <ValueFormat2 value="0"/>
+ <ClassDef1>
+ <ClassDef glyph="T" class="1"/>
+ </ClassDef1>
+ <ClassDef2>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="2"/>
+ </ClassDef2>
+ <!-- Class1Count=2 -->
+ <!-- Class2Count=3 -->
+ <Class1Record index="0">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="-17"/>
+ </Class2Record>
+ </Class1Record>
+ <Class1Record index="1">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="-17"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="12"/>
+ </Class2Record>
+ </Class1Record>
+ </PairPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=4 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="cyrl"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="2">
+ <ScriptTag value="grek"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="3">
+ <ScriptTag value="latn"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <STAT>
+ <Version value="0x00010001"/>
+ <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="wdth"/>
+ <AxisNameID value="257"/> <!-- Width -->
+ <AxisOrdering value="0"/>
+ </Axis>
+ </DesignAxisRecord>
+ <!-- AxisValueCount=2 -->
+ <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="2">
+ <AxisIndex value="1"/>
+ <Flags value="0"/>
+ <ValueNameID value="288"/> <!-- ExtraCondensed -->
+ <NominalValue value="62.5"/>
+ <RangeMinValue value="62.5"/>
+ <RangeMaxValue value="68.75"/>
+ </AxisValue>
+ </AxisValueArray>
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-400,100.ttx b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-400,100.ttx
new file mode 100644
index 00000000..c2d20571
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-400,100.ttx
@@ -0,0 +1,539 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.41">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="T"/>
+ <GlyphID id="3" name="grave"/>
+ <GlyphID id="4" name="Agrave"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="2.001"/>
+ <checkSumAdjustment value="0x4b2d3480"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Mar 15 19:50:39 2016"/>
+ <modified value="Thu Oct 17 14:43:10 2019"/>
+ <xMin value="0"/>
+ <yMin value="0"/>
+ <xMax value="638"/>
+ <yMax value="944"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1069"/>
+ <descent value="-293"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="639"/>
+ <minLeftSideBearing value="0"/>
+ <minRightSideBearing value="1"/>
+ <xMaxExtent value="638"/>
+ <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="5"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="5"/>
+ <maxPoints value="19"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="32"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="2"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="577"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="322"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="2"/>
+ <bContrast value="4"/>
+ <bStrokeVariation value="5"/>
+ <bArmStyle value="4"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="11100000 00000000 00000010 11111111"/>
+ <ulUnicodeRange2 value="01000000 00000000 00100000 00011111"/>
+ <ulUnicodeRange3 value="00001000 00000000 00000000 00101001"/>
+ <ulUnicodeRange4 value="00000000 00010000 00000000 00000000"/>
+ <achVendID value="GOOG"/>
+ <fsSelection value="00000001 01000000"/>
+ <usFirstCharIndex value="65"/>
+ <usLastCharIndex value="192"/>
+ <sTypoAscender value="1069"/>
+ <sTypoDescender value="-293"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="1069"/>
+ <usWinDescent value="293"/>
+ <ulCodePageRange1 value="00000000 00000000 00000001 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="536"/>
+ <sCapHeight value="714"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="4"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="600" lsb="94"/>
+ <mtx name="A" width="639" lsb="0"/>
+ <mtx name="Agrave" width="639" lsb="0"/>
+ <mtx name="T" width="556" lsb="10"/>
+ <mtx name="grave" width="281" lsb="40"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ </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" xMin="94" yMin="0" xMax="505" yMax="714">
+ <contour>
+ <pt x="94" y="0" on="1" overlap="1"/>
+ <pt x="94" y="714" on="1"/>
+ <pt x="505" y="714" on="1"/>
+ <pt x="505" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="145" y="51" on="1"/>
+ <pt x="454" y="51" on="1"/>
+ <pt x="454" y="663" on="1"/>
+ <pt x="145" y="663" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="0" yMin="0" xMax="638" yMax="717">
+ <contour>
+ <pt x="545" y="0" on="1" overlap="1"/>
+ <pt x="459" y="221" on="1"/>
+ <pt x="176" y="221" on="1"/>
+ <pt x="91" y="0" on="1"/>
+ <pt x="0" y="0" on="1"/>
+ <pt x="279" y="717" on="1"/>
+ <pt x="360" y="717" on="1"/>
+ <pt x="638" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="432" y="301" on="1"/>
+ <pt x="352" y="517" on="1"/>
+ <pt x="349" y="525" on="0"/>
+ <pt x="335" y="567" on="0"/>
+ <pt x="322" y="612" on="0"/>
+ <pt x="318" y="624" on="1"/>
+ <pt x="313" y="604" on="0"/>
+ <pt x="302" y="563" on="0"/>
+ <pt x="291" y="529" on="0"/>
+ <pt x="287" y="517" on="1"/>
+ <pt x="206" y="301" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="Agrave" xMin="0" yMin="0" xMax="638" yMax="944">
+ <component glyphName="A" x="0" y="0" flags="0x604"/>
+ <component glyphName="grave" x="147" y="178" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="T" xMin="10" yMin="0" xMax="545" yMax="714">
+ <contour>
+ <pt x="323" y="0" on="1" overlap="1"/>
+ <pt x="233" y="0" on="1"/>
+ <pt x="233" y="635" on="1"/>
+ <pt x="10" y="635" on="1"/>
+ <pt x="10" y="714" on="1"/>
+ <pt x="545" y="714" on="1"/>
+ <pt x="545" y="635" on="1"/>
+ <pt x="323" y="635" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="grave" xMin="40" yMin="606" xMax="241" yMax="766">
+ <contour>
+ <pt x="145" y="766" on="1" overlap="1"/>
+ <pt x="156" y="744" on="0"/>
+ <pt x="189" y="689" on="0"/>
+ <pt x="226" y="637" on="0"/>
+ <pt x="241" y="618" on="1"/>
+ <pt x="241" y="606" on="1"/>
+ <pt x="182" y="606" on="1"/>
+ <pt x="165" y="620" on="0"/>
+ <pt x="123" y="659" on="0"/>
+ <pt x="82" y="702" on="0"/>
+ <pt x="49" y="742" on="0"/>
+ <pt x="40" y="756" on="1"/>
+ <pt x="40" y="766" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Width
+ </namerecord>
+ <namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright 2015 Google Inc. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 2.001;GOOG;NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 2.001
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+ Noto is a trademark of Google Inc.
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Monotype Imaging Inc.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Monotype Design Team
+ </namerecord>
+ <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409">
+ Designed by Monotype design team.
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.google.com/get/noto/
+ </namerecord>
+ <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409">
+ http://www.monotype.com/studio
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://scripts.sil.org/OFL
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Width
+ </namerecord>
+ <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <GDEF>
+ <Version value="0x00010002"/>
+ <GlyphClassDef>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="1"/>
+ </GlyphClassDef>
+ <MarkGlyphSetsDef>
+ <MarkSetTableFormat value="1"/>
+ <!-- MarkSetCount=4 -->
+ <Coverage index="0">
+ </Coverage>
+ <Coverage index="1">
+ </Coverage>
+ <Coverage index="2">
+ </Coverage>
+ <Coverage index="3">
+ </Coverage>
+ </MarkGlyphSetsDef>
+ </GDEF>
+
+ <GPOS>
+ <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="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="2"/>
+ <LookupFlag value="8"/><!-- ignoreMarks -->
+ <!-- SubTableCount=1 -->
+ <PairPos index="0" Format="2">
+ <Coverage>
+ <Glyph value="A"/>
+ <Glyph value="T"/>
+ <Glyph value="Agrave"/>
+ </Coverage>
+ <ValueFormat1 value="4"/>
+ <ValueFormat2 value="0"/>
+ <ClassDef1>
+ <ClassDef glyph="T" class="1"/>
+ </ClassDef1>
+ <ClassDef2>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="2"/>
+ </ClassDef2>
+ <!-- Class1Count=2 -->
+ <!-- Class2Count=3 -->
+ <Class1Record index="0">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="-70"/>
+ </Class2Record>
+ </Class1Record>
+ <Class1Record index="1">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="-70"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="20"/>
+ </Class2Record>
+ </Class1Record>
+ </PairPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=4 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="cyrl"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="2">
+ <ScriptTag value="grek"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="3">
+ <ScriptTag value="latn"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <STAT>
+ <Version value="0x00010001"/>
+ <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="wdth"/>
+ <AxisNameID value="257"/> <!-- Width -->
+ <AxisOrdering value="0"/>
+ </Axis>
+ </DesignAxisRecord>
+ <!-- AxisValueCount=2 -->
+ <AxisValueArray>
+ <AxisValue index="0" Format="3">
+ <AxisIndex value="0"/>
+ <Flags value="2"/> <!-- ElidableAxisValueName -->
+ <ValueNameID value="261"/> <!-- Regular -->
+ <Value value="400.0"/>
+ <LinkedValue value="700.0"/>
+ </AxisValue>
+ <AxisValue index="1" Format="2">
+ <AxisIndex value="1"/>
+ <Flags value="2"/> <!-- ElidableAxisValueName -->
+ <ValueNameID value="261"/> <!-- Regular -->
+ <NominalValue value="100.0"/>
+ <RangeMinValue value="93.75"/>
+ <RangeMaxValue value="100.0"/>
+ </AxisValue>
+ </AxisValueArray>
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-400,62.5.ttx b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-400,62.5.ttx
new file mode 100644
index 00000000..63eeb0e7
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-400,62.5.ttx
@@ -0,0 +1,545 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.41">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="T"/>
+ <GlyphID id="3" name="grave"/>
+ <GlyphID id="4" name="Agrave"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="2.001"/>
+ <checkSumAdjustment value="0x39ab2622"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Mar 15 19:50:39 2016"/>
+ <modified value="Thu Oct 17 14:43:10 2019"/>
+ <xMin value="0"/>
+ <yMin value="0"/>
+ <xMax value="496"/>
+ <yMax value="930"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1069"/>
+ <descent value="-293"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="595"/>
+ <minLeftSideBearing value="0"/>
+ <minRightSideBearing value="0"/>
+ <xMaxExtent value="496"/>
+ <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="5"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="5"/>
+ <maxPoints value="19"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="32"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="2"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="577"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="2"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="322"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="2"/>
+ <bContrast value="4"/>
+ <bStrokeVariation value="5"/>
+ <bArmStyle value="4"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="11100000 00000000 00000010 11111111"/>
+ <ulUnicodeRange2 value="01000000 00000000 00100000 00011111"/>
+ <ulUnicodeRange3 value="00001000 00000000 00000000 00101001"/>
+ <ulUnicodeRange4 value="00000000 00010000 00000000 00000000"/>
+ <achVendID value="GOOG"/>
+ <fsSelection value="00000001 01000000"/>
+ <usFirstCharIndex value="65"/>
+ <usLastCharIndex value="192"/>
+ <sTypoAscender value="1069"/>
+ <sTypoDescender value="-293"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="1069"/>
+ <usWinDescent value="293"/>
+ <ulCodePageRange1 value="00000000 00000000 00000001 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="537"/>
+ <sCapHeight value="714"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="4"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="595" lsb="85"/>
+ <mtx name="A" width="450" lsb="0"/>
+ <mtx name="Agrave" width="450" lsb="0"/>
+ <mtx name="T" width="381" lsb="10"/>
+ <mtx name="grave" width="266" lsb="40"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ </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" xMin="85" yMin="0" xMax="496" yMax="714">
+ <contour>
+ <pt x="85" y="0" on="1" overlap="1"/>
+ <pt x="85" y="714" on="1"/>
+ <pt x="496" y="714" on="1"/>
+ <pt x="496" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="136" y="51" on="1"/>
+ <pt x="445" y="51" on="1"/>
+ <pt x="445" y="663" on="1"/>
+ <pt x="136" y="663" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="0" yMin="0" xMax="450" yMax="714">
+ <contour>
+ <pt x="361" y="0" on="1" overlap="1"/>
+ <pt x="309" y="223" on="1"/>
+ <pt x="142" y="223" on="1"/>
+ <pt x="90" y="0" on="1"/>
+ <pt x="0" y="0" on="1"/>
+ <pt x="173" y="714" on="1"/>
+ <pt x="274" y="714" on="1"/>
+ <pt x="450" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="293" y="301" on="1"/>
+ <pt x="240" y="535" on="1"/>
+ <pt x="237" y="554" on="0"/>
+ <pt x="230" y="589" on="0"/>
+ <pt x="225" y="623" on="0"/>
+ <pt x="223" y="638" on="1"/>
+ <pt x="222" y="623" on="0"/>
+ <pt x="217" y="589" on="0"/>
+ <pt x="210" y="554" on="0"/>
+ <pt x="206" y="536" on="1"/>
+ <pt x="155" y="301" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="Agrave" xMin="0" yMin="0" xMax="450" yMax="930">
+ <component glyphName="A" x="0" y="0" flags="0x604"/>
+ <component glyphName="grave" x="32" y="164" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="T" xMin="10" yMin="0" xMax="370" yMax="714">
+ <contour>
+ <pt x="232" y="0" on="1" overlap="1"/>
+ <pt x="148" y="0" on="1"/>
+ <pt x="148" y="638" on="1"/>
+ <pt x="10" y="638" on="1"/>
+ <pt x="10" y="714" on="1"/>
+ <pt x="370" y="714" on="1"/>
+ <pt x="370" y="638" on="1"/>
+ <pt x="232" y="638" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="grave" xMin="40" yMin="606" xMax="226" yMax="766">
+ <contour>
+ <pt x="137" y="766" on="1" overlap="1"/>
+ <pt x="148" y="743" on="0"/>
+ <pt x="179" y="688" on="0"/>
+ <pt x="212" y="636" on="0"/>
+ <pt x="226" y="617" on="1"/>
+ <pt x="226" y="606" on="1"/>
+ <pt x="174" y="606" on="1"/>
+ <pt x="159" y="619" on="0"/>
+ <pt x="121" y="657" on="0"/>
+ <pt x="82" y="700" on="0"/>
+ <pt x="50" y="741" on="0"/>
+ <pt x="40" y="757" on="1"/>
+ <pt x="40" y="766" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Width
+ </namerecord>
+ <namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="288" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright 2015 Google Inc. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 2.001;GOOG;NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 2.001
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+ Noto is a trademark of Google Inc.
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Monotype Imaging Inc.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Monotype Design Team
+ </namerecord>
+ <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409">
+ Designed by Monotype design team.
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.google.com/get/noto/
+ </namerecord>
+ <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409">
+ http://www.monotype.com/studio
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://scripts.sil.org/OFL
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Width
+ </namerecord>
+ <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="288" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <GDEF>
+ <Version value="0x00010002"/>
+ <GlyphClassDef>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="1"/>
+ </GlyphClassDef>
+ <MarkGlyphSetsDef>
+ <MarkSetTableFormat value="1"/>
+ <!-- MarkSetCount=4 -->
+ <Coverage index="0">
+ </Coverage>
+ <Coverage index="1">
+ </Coverage>
+ <Coverage index="2">
+ </Coverage>
+ <Coverage index="3">
+ </Coverage>
+ </MarkGlyphSetsDef>
+ </GDEF>
+
+ <GPOS>
+ <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="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="2"/>
+ <LookupFlag value="8"/><!-- ignoreMarks -->
+ <!-- SubTableCount=1 -->
+ <PairPos index="0" Format="2">
+ <Coverage>
+ <Glyph value="A"/>
+ <Glyph value="T"/>
+ <Glyph value="Agrave"/>
+ </Coverage>
+ <ValueFormat1 value="4"/>
+ <ValueFormat2 value="0"/>
+ <ClassDef1>
+ <ClassDef glyph="T" class="1"/>
+ </ClassDef1>
+ <ClassDef2>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="2"/>
+ </ClassDef2>
+ <!-- Class1Count=2 -->
+ <!-- Class2Count=3 -->
+ <Class1Record index="0">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="-17"/>
+ </Class2Record>
+ </Class1Record>
+ <Class1Record index="1">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="-17"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="12"/>
+ </Class2Record>
+ </Class1Record>
+ </PairPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=4 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="cyrl"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="2">
+ <ScriptTag value="grek"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="3">
+ <ScriptTag value="latn"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <STAT>
+ <Version value="0x00010001"/>
+ <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="wdth"/>
+ <AxisNameID value="257"/> <!-- Width -->
+ <AxisOrdering value="0"/>
+ </Axis>
+ </DesignAxisRecord>
+ <!-- AxisValueCount=2 -->
+ <AxisValueArray>
+ <AxisValue index="0" Format="3">
+ <AxisIndex value="0"/>
+ <Flags value="2"/> <!-- ElidableAxisValueName -->
+ <ValueNameID value="261"/> <!-- Regular -->
+ <Value value="400.0"/>
+ <LinkedValue value="700.0"/>
+ </AxisValue>
+ <AxisValue index="1" Format="2">
+ <AxisIndex value="1"/>
+ <Flags value="0"/>
+ <ValueNameID value="288"/> <!-- ExtraCondensed -->
+ <NominalValue value="62.5"/>
+ <RangeMinValue value="62.5"/>
+ <RangeMaxValue value="68.75"/>
+ </AxisValue>
+ </AxisValueArray>
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-900,100.ttx b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-900,100.ttx
new file mode 100644
index 00000000..013ba1e7
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-900,100.ttx
@@ -0,0 +1,544 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.41">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="T"/>
+ <GlyphID id="3" name="grave"/>
+ <GlyphID id="4" name="Agrave"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="2.001"/>
+ <checkSumAdjustment value="0x7b5e7903"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Mar 15 19:50:39 2016"/>
+ <modified value="Thu Oct 17 14:43:10 2019"/>
+ <xMin value="0"/>
+ <yMin value="0"/>
+ <xMax value="726"/>
+ <yMax value="927"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1069"/>
+ <descent value="-293"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="726"/>
+ <minLeftSideBearing value="0"/>
+ <minRightSideBearing value="0"/>
+ <xMaxExtent value="726"/>
+ <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="5"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="5"/>
+ <maxPoints value="19"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="32"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="2"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="577"/>
+ <usWeightClass value="900"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="332"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="2"/>
+ <bContrast value="4"/>
+ <bStrokeVariation value="5"/>
+ <bArmStyle value="4"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="11100000 00000000 00000010 11111111"/>
+ <ulUnicodeRange2 value="01000000 00000000 00100000 00011111"/>
+ <ulUnicodeRange3 value="00001000 00000000 00000000 00101001"/>
+ <ulUnicodeRange4 value="00000000 00010000 00000000 00000000"/>
+ <achVendID value="GOOG"/>
+ <fsSelection value="00000001 01000000"/>
+ <usFirstCharIndex value="65"/>
+ <usLastCharIndex value="192"/>
+ <sTypoAscender value="1069"/>
+ <sTypoDescender value="-293"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="1069"/>
+ <usWinDescent value="293"/>
+ <ulCodePageRange1 value="00000000 00000000 00000001 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="553"/>
+ <sCapHeight value="714"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="4"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="582" lsb="85"/>
+ <mtx name="A" width="726" lsb="0"/>
+ <mtx name="Agrave" width="726" lsb="0"/>
+ <mtx name="T" width="591" lsb="25"/>
+ <mtx name="grave" width="418" lsb="40"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ </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" xMin="85" yMin="0" xMax="496" yMax="714">
+ <contour>
+ <pt x="85" y="0" on="1" overlap="1"/>
+ <pt x="85" y="714" on="1"/>
+ <pt x="496" y="714" on="1"/>
+ <pt x="496" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="136" y="51" on="1"/>
+ <pt x="445" y="51" on="1"/>
+ <pt x="445" y="663" on="1"/>
+ <pt x="136" y="663" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="0" yMin="0" xMax="726" yMax="717">
+ <contour>
+ <pt x="515" y="0" on="1" overlap="1"/>
+ <pt x="480" y="134" on="1"/>
+ <pt x="248" y="134" on="1"/>
+ <pt x="212" y="0" on="1"/>
+ <pt x="0" y="0" on="1"/>
+ <pt x="233" y="717" on="1"/>
+ <pt x="490" y="717" on="1"/>
+ <pt x="726" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="440" y="292" on="1"/>
+ <pt x="409" y="409" on="1"/>
+ <pt x="404" y="428" on="0"/>
+ <pt x="386" y="499" on="0"/>
+ <pt x="368" y="575" on="0"/>
+ <pt x="363" y="599" on="1"/>
+ <pt x="359" y="575" on="0"/>
+ <pt x="342" y="503" on="0"/>
+ <pt x="325" y="433" on="0"/>
+ <pt x="319" y="409" on="1"/>
+ <pt x="288" y="292" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="Agrave" xMin="0" yMin="0" xMax="726" yMax="927">
+ <component glyphName="A" x="0" y="0" flags="0x604"/>
+ <component glyphName="grave" x="112" y="161" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="T" xMin="25" yMin="0" xMax="566" yMax="714">
+ <contour>
+ <pt x="392" y="0" on="1" overlap="1"/>
+ <pt x="199" y="0" on="1"/>
+ <pt x="199" y="556" on="1"/>
+ <pt x="25" y="556" on="1"/>
+ <pt x="25" y="714" on="1"/>
+ <pt x="566" y="714" on="1"/>
+ <pt x="566" y="556" on="1"/>
+ <pt x="392" y="556" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="grave" xMin="40" yMin="606" xMax="378" yMax="766">
+ <contour>
+ <pt x="250" y="766" on="1" overlap="1"/>
+ <pt x="267" y="744" on="0"/>
+ <pt x="314" y="690" on="0"/>
+ <pt x="362" y="639" on="0"/>
+ <pt x="378" y="620" on="1"/>
+ <pt x="378" y="606" on="1"/>
+ <pt x="251" y="606" on="1"/>
+ <pt x="231" y="619" on="0"/>
+ <pt x="174" y="658" on="0"/>
+ <pt x="113" y="701" on="0"/>
+ <pt x="58" y="742" on="0"/>
+ <pt x="40" y="756" on="1"/>
+ <pt x="40" y="766" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Width
+ </namerecord>
+ <namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="266" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Black
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright 2015 Google Inc. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 2.001;GOOG;NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 2.001
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+ Noto is a trademark of Google Inc.
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Monotype Imaging Inc.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Monotype Design Team
+ </namerecord>
+ <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409">
+ Designed by Monotype design team.
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.google.com/get/noto/
+ </namerecord>
+ <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409">
+ http://www.monotype.com/studio
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://scripts.sil.org/OFL
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Width
+ </namerecord>
+ <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="266" platformID="3" platEncID="1" langID="0x409">
+ Black
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <GDEF>
+ <Version value="0x00010002"/>
+ <GlyphClassDef>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="1"/>
+ </GlyphClassDef>
+ <MarkGlyphSetsDef>
+ <MarkSetTableFormat value="1"/>
+ <!-- MarkSetCount=4 -->
+ <Coverage index="0">
+ </Coverage>
+ <Coverage index="1">
+ </Coverage>
+ <Coverage index="2">
+ </Coverage>
+ <Coverage index="3">
+ </Coverage>
+ </MarkGlyphSetsDef>
+ </GDEF>
+
+ <GPOS>
+ <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="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="2"/>
+ <LookupFlag value="8"/><!-- ignoreMarks -->
+ <!-- SubTableCount=1 -->
+ <PairPos index="0" Format="2">
+ <Coverage>
+ <Glyph value="A"/>
+ <Glyph value="T"/>
+ <Glyph value="Agrave"/>
+ </Coverage>
+ <ValueFormat1 value="4"/>
+ <ValueFormat2 value="0"/>
+ <ClassDef1>
+ <ClassDef glyph="T" class="1"/>
+ </ClassDef1>
+ <ClassDef2>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="2"/>
+ </ClassDef2>
+ <!-- Class1Count=2 -->
+ <!-- Class2Count=3 -->
+ <Class1Record index="0">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="-70"/>
+ </Class2Record>
+ </Class1Record>
+ <Class1Record index="1">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="-70"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="20"/>
+ </Class2Record>
+ </Class1Record>
+ </PairPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=4 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="cyrl"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="2">
+ <ScriptTag value="grek"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="3">
+ <ScriptTag value="latn"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <STAT>
+ <Version value="0x00010001"/>
+ <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="wdth"/>
+ <AxisNameID value="257"/> <!-- Width -->
+ <AxisOrdering value="0"/>
+ </Axis>
+ </DesignAxisRecord>
+ <!-- AxisValueCount=2 -->
+ <AxisValueArray>
+ <AxisValue index="0" Format="1">
+ <AxisIndex value="0"/>
+ <Flags value="0"/>
+ <ValueNameID value="266"/> <!-- Black -->
+ <Value value="900.0"/>
+ </AxisValue>
+ <AxisValue index="1" Format="2">
+ <AxisIndex value="1"/>
+ <Flags value="2"/> <!-- ElidableAxisValueName -->
+ <ValueNameID value="261"/> <!-- Regular -->
+ <NominalValue value="100.0"/>
+ <RangeMinValue value="93.75"/>
+ <RangeMaxValue value="100.0"/>
+ </AxisValue>
+ </AxisValueArray>
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-900,62.5.ttx b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-900,62.5.ttx
new file mode 100644
index 00000000..45e34cbf
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/PartialInstancerTest2-VF-instance-900,62.5.ttx
@@ -0,0 +1,544 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.41">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="T"/>
+ <GlyphID id="3" name="grave"/>
+ <GlyphID id="4" name="Agrave"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="2.001"/>
+ <checkSumAdjustment value="0x7f9149e4"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Mar 15 19:50:39 2016"/>
+ <modified value="Thu Oct 17 14:43:10 2019"/>
+ <xMin value="0"/>
+ <yMin value="0"/>
+ <xMax value="574"/>
+ <yMax value="927"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1069"/>
+ <descent value="-293"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="582"/>
+ <minLeftSideBearing value="0"/>
+ <minRightSideBearing value="0"/>
+ <xMaxExtent value="574"/>
+ <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="5"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="5"/>
+ <maxPoints value="19"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="32"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="2"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="577"/>
+ <usWeightClass value="900"/>
+ <usWidthClass value="2"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="332"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="2"/>
+ <bContrast value="4"/>
+ <bStrokeVariation value="5"/>
+ <bArmStyle value="4"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="11100000 00000000 00000010 11111111"/>
+ <ulUnicodeRange2 value="01000000 00000000 00100000 00011111"/>
+ <ulUnicodeRange3 value="00001000 00000000 00000000 00101001"/>
+ <ulUnicodeRange4 value="00000000 00010000 00000000 00000000"/>
+ <achVendID value="GOOG"/>
+ <fsSelection value="00000001 01000000"/>
+ <usFirstCharIndex value="65"/>
+ <usLastCharIndex value="192"/>
+ <sTypoAscender value="1069"/>
+ <sTypoDescender value="-293"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="1069"/>
+ <usWinDescent value="293"/>
+ <ulCodePageRange1 value="00000000 00000000 00000001 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="553"/>
+ <sCapHeight value="714"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="4"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="582" lsb="85"/>
+ <mtx name="A" width="574" lsb="0"/>
+ <mtx name="Agrave" width="574" lsb="0"/>
+ <mtx name="T" width="460" lsb="17"/>
+ <mtx name="grave" width="340" lsb="40"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ <map code="0xc0" name="Agrave"/><!-- LATIN CAPITAL LETTER A WITH GRAVE -->
+ </cmap_format_4>
+ </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" xMin="85" yMin="0" xMax="496" yMax="714">
+ <contour>
+ <pt x="85" y="0" on="1" overlap="1"/>
+ <pt x="85" y="714" on="1"/>
+ <pt x="496" y="714" on="1"/>
+ <pt x="496" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="136" y="51" on="1"/>
+ <pt x="445" y="51" on="1"/>
+ <pt x="445" y="663" on="1"/>
+ <pt x="136" y="663" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="0" yMin="0" xMax="574" yMax="714">
+ <contour>
+ <pt x="392" y="0" on="1" overlap="1"/>
+ <pt x="365" y="139" on="1"/>
+ <pt x="211" y="139" on="1"/>
+ <pt x="184" y="0" on="1"/>
+ <pt x="0" y="0" on="1"/>
+ <pt x="174" y="714" on="1"/>
+ <pt x="398" y="714" on="1"/>
+ <pt x="574" y="0" on="1"/>
+ </contour>
+ <contour>
+ <pt x="339" y="285" on="1"/>
+ <pt x="310" y="445" on="1"/>
+ <pt x="305" y="472" on="0"/>
+ <pt x="297" y="522" on="0"/>
+ <pt x="291" y="569" on="0"/>
+ <pt x="288" y="589" on="1"/>
+ <pt x="286" y="570" on="0"/>
+ <pt x="280" y="524" on="0"/>
+ <pt x="271" y="474" on="0"/>
+ <pt x="266" y="447" on="1"/>
+ <pt x="236" y="285" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="Agrave" xMin="0" yMin="0" xMax="574" yMax="927">
+ <component glyphName="A" x="0" y="0" flags="0x604"/>
+ <component glyphName="grave" x="83" y="161" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="T" xMin="17" yMin="0" xMax="443" yMax="714">
+ <contour>
+ <pt x="315" y="0" on="1" overlap="1"/>
+ <pt x="146" y="0" on="1"/>
+ <pt x="146" y="567" on="1"/>
+ <pt x="17" y="567" on="1"/>
+ <pt x="17" y="714" on="1"/>
+ <pt x="443" y="714" on="1"/>
+ <pt x="443" y="567" on="1"/>
+ <pt x="315" y="567" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="grave" xMin="40" yMin="606" xMax="300" yMax="766">
+ <contour>
+ <pt x="222" y="766" on="1" overlap="1"/>
+ <pt x="231" y="747" on="0"/>
+ <pt x="261" y="688" on="0"/>
+ <pt x="291" y="634" on="0"/>
+ <pt x="300" y="620" on="1"/>
+ <pt x="300" y="606" on="1"/>
+ <pt x="181" y="606" on="1"/>
+ <pt x="169" y="617" on="0"/>
+ <pt x="130" y="657" on="0"/>
+ <pt x="87" y="703" on="0"/>
+ <pt x="50" y="744" on="0"/>
+ <pt x="40" y="756" on="1"/>
+ <pt x="40" y="766" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Width
+ </namerecord>
+ <namerecord nameID="266" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Black
+ </namerecord>
+ <namerecord nameID="288" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ ExtraCondensed
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright 2015 Google Inc. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 2.001;GOOG;NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 2.001
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ NotoSans-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+ Noto is a trademark of Google Inc.
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Monotype Imaging Inc.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Monotype Design Team
+ </namerecord>
+ <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409">
+ Designed by Monotype design team.
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.google.com/get/noto/
+ </namerecord>
+ <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409">
+ http://www.monotype.com/studio
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://scripts.sil.org/OFL
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Width
+ </namerecord>
+ <namerecord nameID="266" platformID="3" platEncID="1" langID="0x409">
+ Black
+ </namerecord>
+ <namerecord nameID="288" platformID="3" platEncID="1" langID="0x409">
+ ExtraCondensed
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <GDEF>
+ <Version value="0x00010002"/>
+ <GlyphClassDef>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="1"/>
+ </GlyphClassDef>
+ <MarkGlyphSetsDef>
+ <MarkSetTableFormat value="1"/>
+ <!-- MarkSetCount=4 -->
+ <Coverage index="0">
+ </Coverage>
+ <Coverage index="1">
+ </Coverage>
+ <Coverage index="2">
+ </Coverage>
+ <Coverage index="3">
+ </Coverage>
+ </MarkGlyphSetsDef>
+ </GDEF>
+
+ <GPOS>
+ <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="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="2"/>
+ <LookupFlag value="8"/><!-- ignoreMarks -->
+ <!-- SubTableCount=1 -->
+ <PairPos index="0" Format="2">
+ <Coverage>
+ <Glyph value="A"/>
+ <Glyph value="T"/>
+ <Glyph value="Agrave"/>
+ </Coverage>
+ <ValueFormat1 value="4"/>
+ <ValueFormat2 value="0"/>
+ <ClassDef1>
+ <ClassDef glyph="T" class="1"/>
+ </ClassDef1>
+ <ClassDef2>
+ <ClassDef glyph="A" class="1"/>
+ <ClassDef glyph="Agrave" class="1"/>
+ <ClassDef glyph="T" class="2"/>
+ </ClassDef2>
+ <!-- Class1Count=2 -->
+ <!-- Class2Count=3 -->
+ <Class1Record index="0">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="-17"/>
+ </Class2Record>
+ </Class1Record>
+ <Class1Record index="1">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ <Class2Record index="1">
+ <Value1 XAdvance="-17"/>
+ </Class2Record>
+ <Class2Record index="2">
+ <Value1 XAdvance="12"/>
+ </Class2Record>
+ </Class1Record>
+ </PairPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=4 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="cyrl"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="2">
+ <ScriptTag value="grek"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="3">
+ <ScriptTag value="latn"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <STAT>
+ <Version value="0x00010001"/>
+ <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="wdth"/>
+ <AxisNameID value="257"/> <!-- Width -->
+ <AxisOrdering value="0"/>
+ </Axis>
+ </DesignAxisRecord>
+ <!-- AxisValueCount=2 -->
+ <AxisValueArray>
+ <AxisValue index="0" Format="1">
+ <AxisIndex value="0"/>
+ <Flags value="0"/>
+ <ValueNameID value="266"/> <!-- Black -->
+ <Value value="900.0"/>
+ </AxisValue>
+ <AxisValue index="1" Format="2">
+ <AxisIndex value="1"/>
+ <Flags value="0"/>
+ <ValueNameID value="288"/> <!-- ExtraCondensed -->
+ <NominalValue value="62.5"/>
+ <RangeMinValue value="62.5"/>
+ <RangeMaxValue value="68.75"/>
+ </AxisValue>
+ </AxisValueArray>
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-400-no-overlap-flags.ttx b/Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-400-no-overlap-flags.ttx
new file mode 100644
index 00000000..fc6310d5
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-400-no-overlap-flags.ttx
@@ -0,0 +1,305 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.15">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="B"/>
+ <GlyphID id="3" name="C"/>
+ <GlyphID id="4" name="D"/>
+ <GlyphID id="5" name="E"/>
+ <GlyphID id="6" name="F"/>
+ <GlyphID id="7" name="space"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x98c89e17"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Wed Sep 23 12:54:22 2020"/>
+ <modified value="Tue Sep 29 18:06:03 2020"/>
+ <xMin value="-152"/>
+ <yMin value="-200"/>
+ <xMax value="1059"/>
+ <yMax value="800"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="-152"/>
+ <minRightSideBearing value="-559"/>
+ <xMaxExtent value="1059"/>
+ <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="8"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="8"/>
+ <maxPoints value="8"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="12"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="3"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="513"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="0"/>
+ <bProportion value="0"/>
+ <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="NONE"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="70"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="50"/>
+ <mtx name="A" width="500" lsb="153"/>
+ <mtx name="B" width="500" lsb="-152"/>
+ <mtx name="C" width="500" lsb="-133"/>
+ <mtx name="D" width="500" lsb="-97"/>
+ <mtx name="E" width="500" lsb="-87"/>
+ <mtx name="F" width="500" lsb="-107"/>
+ <mtx name="space" width="600" lsb="0"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+ <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+ <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+ <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+ <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+ <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+ <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+ <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+ <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+ </cmap_format_4>
+ </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" xMin="50" yMin="-200" xMax="450" yMax="800">
+ <contour>
+ <pt x="50" y="-200" on="1"/>
+ <pt x="50" y="800" on="1"/>
+ <pt x="450" y="800" on="1"/>
+ <pt x="450" y="-200" on="1"/>
+ </contour>
+ <contour>
+ <pt x="100" y="-150" on="1"/>
+ <pt x="400" y="-150" on="1"/>
+ <pt x="400" y="750" on="1"/>
+ <pt x="100" y="750" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="153" yMin="-66" xMax="350" yMax="646">
+ <contour>
+ <pt x="153" y="646" on="1"/>
+ <pt x="350" y="646" on="1"/>
+ <pt x="350" y="-66" on="1"/>
+ <pt x="153" y="-66" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="B" xMin="-152" yMin="39" xMax="752" yMax="592">
+ <contour>
+ <pt x="-152" y="448" on="1"/>
+ <pt x="752" y="448" on="1"/>
+ <pt x="752" y="215" on="1"/>
+ <pt x="-152" y="215" on="1"/>
+ </contour>
+ <contour>
+ <pt x="129" y="592" on="1"/>
+ <pt x="401" y="592" on="1"/>
+ <pt x="401" y="39" on="1"/>
+ <pt x="129" y="39" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="C" xMin="-133" yMin="-66" xMax="771" yMax="646">
+ <component glyphName="A" x="-250" y="0" flags="0x4"/>
+ <component glyphName="B" x="19" y="-28" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="D" xMin="-97" yMin="-66" xMax="1059" yMax="646">
+ <component glyphName="A" x="-250" y="0" flags="0x4"/>
+ <component glyphName="B" x="307" y="-28" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="E" xMin="-87" yMin="-87" xMax="801" yMax="650">
+ <component glyphName="A" x="450" y="-77" scalex="0.9397" scale01="0.34204" scale10="-0.34204" scaley="0.9397" flags="0x4"/>
+ <component glyphName="A" x="8" y="4" flags="0x4"/>
+ <component glyphName="A" x="-240" y="0" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="F" xMin="-107" yMin="-95" xMax="837" yMax="650">
+ <component glyphName="A" x="501" y="-114" scalex="0.866" scale01="0.5" scale10="-0.5" scaley="0.866" flags="0x4"/>
+ <component glyphName="A" x="-12" y="4" flags="0x4"/>
+ <component glyphName="A" x="-260" y="0" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="space"/><!-- contains no outline data -->
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Remove Overlaps Test
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.000;NONE;RemoveOverlapsTest-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Remove Overlaps Test Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.000
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ RemoveOverlapsTest-Regular
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <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=0 -->
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-400-no-overlaps.ttx b/Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-400-no-overlaps.ttx
new file mode 100644
index 00000000..3e18c9b7
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-400-no-overlaps.ttx
@@ -0,0 +1,343 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.15">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="B"/>
+ <GlyphID id="3" name="C"/>
+ <GlyphID id="4" name="D"/>
+ <GlyphID id="5" name="E"/>
+ <GlyphID id="6" name="F"/>
+ <GlyphID id="7" name="space"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x1cd9cd87"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Wed Sep 23 12:54:22 2020"/>
+ <modified value="Tue Sep 29 18:06:03 2020"/>
+ <xMin value="-152"/>
+ <yMin value="-200"/>
+ <xMax value="1059"/>
+ <yMax value="800"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="-152"/>
+ <minRightSideBearing value="-559"/>
+ <xMaxExtent value="1059"/>
+ <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="8"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="8"/>
+ <maxPoints value="20"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="16"/>
+ <maxCompositeContours value="3"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="3"/>
+ <maxComponentDepth value="1"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="513"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="0"/>
+ <bProportion value="0"/>
+ <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="NONE"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="70"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="50"/>
+ <mtx name="A" width="500" lsb="153"/>
+ <mtx name="B" width="500" lsb="-152"/>
+ <mtx name="C" width="500" lsb="-133"/>
+ <mtx name="D" width="500" lsb="-97"/>
+ <mtx name="E" width="500" lsb="-87"/>
+ <mtx name="F" width="500" lsb="-107"/>
+ <mtx name="space" width="600" lsb="0"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+ <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+ <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+ <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+ <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+ <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+ <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+ <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+ <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+ </cmap_format_4>
+ </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" xMin="50" yMin="-200" xMax="450" yMax="800">
+ <contour>
+ <pt x="50" y="-200" on="1"/>
+ <pt x="50" y="800" on="1"/>
+ <pt x="450" y="800" on="1"/>
+ <pt x="450" y="-200" on="1"/>
+ </contour>
+ <contour>
+ <pt x="100" y="-150" on="1"/>
+ <pt x="400" y="-150" on="1"/>
+ <pt x="400" y="750" on="1"/>
+ <pt x="100" y="750" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="153" yMin="-66" xMax="350" yMax="646">
+ <contour>
+ <pt x="153" y="646" on="1"/>
+ <pt x="350" y="646" on="1"/>
+ <pt x="350" y="-66" on="1"/>
+ <pt x="153" y="-66" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="B" xMin="-152" yMin="39" xMax="752" yMax="592">
+ <contour>
+ <pt x="-152" y="448" on="1"/>
+ <pt x="129" y="448" on="1"/>
+ <pt x="129" y="592" on="1"/>
+ <pt x="401" y="592" on="1"/>
+ <pt x="401" y="448" on="1"/>
+ <pt x="752" y="448" on="1"/>
+ <pt x="752" y="215" on="1"/>
+ <pt x="401" y="215" on="1"/>
+ <pt x="401" y="39" on="1"/>
+ <pt x="129" y="39" on="1"/>
+ <pt x="129" y="215" on="1"/>
+ <pt x="-152" y="215" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="C" xMin="-133" yMin="-66" xMax="771" yMax="646">
+ <contour>
+ <pt x="-97" y="646" on="1"/>
+ <pt x="100" y="646" on="1"/>
+ <pt x="100" y="420" on="1"/>
+ <pt x="148" y="420" on="1"/>
+ <pt x="148" y="564" on="1"/>
+ <pt x="420" y="564" on="1"/>
+ <pt x="420" y="420" on="1"/>
+ <pt x="771" y="420" on="1"/>
+ <pt x="771" y="187" on="1"/>
+ <pt x="420" y="187" on="1"/>
+ <pt x="420" y="11" on="1"/>
+ <pt x="148" y="11" on="1"/>
+ <pt x="148" y="187" on="1"/>
+ <pt x="100" y="187" on="1"/>
+ <pt x="100" y="-66" on="1"/>
+ <pt x="-97" y="-66" on="1"/>
+ <pt x="-97" y="187" on="1"/>
+ <pt x="-133" y="187" on="1"/>
+ <pt x="-133" y="420" on="1"/>
+ <pt x="-97" y="420" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="D" xMin="-97" yMin="-66" xMax="1059" yMax="646">
+ <component glyphName="A" x="-250" y="0" flags="0x4"/>
+ <component glyphName="B" x="307" y="-28" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="E" xMin="-87" yMin="-87" xMax="801" yMax="650">
+ <component glyphName="A" x="450" y="-77" scalex="0.9397" scale01="0.34204" scale10="-0.34204" scaley="0.9397" flags="0x4"/>
+ <component glyphName="A" x="8" y="4" flags="0x4"/>
+ <component glyphName="A" x="-240" y="0" flags="0x4"/>
+ </TTGlyph>
+
+ <TTGlyph name="F" xMin="-107" yMin="-95" xMax="837" yMax="650">
+ <contour>
+ <pt x="141" y="650" on="1"/>
+ <pt x="338" y="650" on="1"/>
+ <pt x="338" y="538" on="1"/>
+ <pt x="481" y="620" on="1"/>
+ <pt x="837" y="4" on="1"/>
+ <pt x="667" y="-95" on="1"/>
+ <pt x="338" y="474" on="1"/>
+ <pt x="338" y="-62" on="1"/>
+ <pt x="141" y="-62" on="1"/>
+ </contour>
+ <contour>
+ <pt x="-107" y="646" on="1"/>
+ <pt x="90" y="646" on="1"/>
+ <pt x="90" y="-66" on="1"/>
+ <pt x="-107" y="-66" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="space"/><!-- contains no outline data -->
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Remove Overlaps Test
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.000;NONE;RemoveOverlapsTest-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Remove Overlaps Test Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.000
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ RemoveOverlapsTest-Regular
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <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=0 -->
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-700-no-overlaps.ttx b/Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-700-no-overlaps.ttx
new file mode 100644
index 00000000..be0353da
--- /dev/null
+++ b/Tests/varLib/instancer/data/test_results/PartialInstancerTest3-VF-instance-700-no-overlaps.ttx
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.15">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ <GlyphID id="2" name="B"/>
+ <GlyphID id="3" name="C"/>
+ <GlyphID id="4" name="D"/>
+ <GlyphID id="5" name="E"/>
+ <GlyphID id="6" name="F"/>
+ <GlyphID id="7" name="space"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0xc12af6d1"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Wed Sep 23 12:54:22 2020"/>
+ <modified value="Tue Sep 29 18:06:03 2020"/>
+ <xMin value="-192"/>
+ <yMin value="-200"/>
+ <xMax value="1099"/>
+ <yMax value="800"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="6"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="-192"/>
+ <minRightSideBearing value="-599"/>
+ <xMaxExtent value="1099"/>
+ <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="8"/>
+ </hhea>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="8"/>
+ <maxPoints value="16"/>
+ <maxContours value="2"/>
+ <maxCompositePoints value="0"/>
+ <maxCompositeContours value="0"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ <maxComponentDepth value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="513"/>
+ <usWeightClass value="700"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="0"/>
+ <bProportion value="0"/>
+ <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="NONE"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="70"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="50"/>
+ <mtx name="A" width="500" lsb="113"/>
+ <mtx name="B" width="500" lsb="-192"/>
+ <mtx name="C" width="500" lsb="-173"/>
+ <mtx name="D" width="500" lsb="-137"/>
+ <mtx name="E" width="500" lsb="-127"/>
+ <mtx name="F" width="500" lsb="-147"/>
+ <mtx name="space" width="600" lsb="0"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+ <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+ <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+ <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+ <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+ </cmap_format_4>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x42" name="B"/><!-- LATIN CAPITAL LETTER B -->
+ <map code="0x43" name="C"/><!-- LATIN CAPITAL LETTER C -->
+ <map code="0x44" name="D"/><!-- LATIN CAPITAL LETTER D -->
+ <map code="0x45" name="E"/><!-- LATIN CAPITAL LETTER E -->
+ <map code="0x46" name="F"/><!-- LATIN CAPITAL LETTER F -->
+ </cmap_format_4>
+ </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" xMin="50" yMin="-200" xMax="450" yMax="800">
+ <contour>
+ <pt x="50" y="-200" on="1"/>
+ <pt x="50" y="800" on="1"/>
+ <pt x="450" y="800" on="1"/>
+ <pt x="450" y="-200" on="1"/>
+ </contour>
+ <contour>
+ <pt x="100" y="-150" on="1"/>
+ <pt x="400" y="-150" on="1"/>
+ <pt x="400" y="750" on="1"/>
+ <pt x="100" y="750" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A" xMin="113" yMin="-66" xMax="390" yMax="646">
+ <contour>
+ <pt x="113" y="646" on="1"/>
+ <pt x="390" y="646" on="1"/>
+ <pt x="390" y="-66" on="1"/>
+ <pt x="113" y="-66" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="B" xMin="-192" yMin="19" xMax="792" yMax="612">
+ <contour>
+ <pt x="-192" y="448" on="1"/>
+ <pt x="89" y="448" on="1"/>
+ <pt x="89" y="612" on="1"/>
+ <pt x="441" y="612" on="1"/>
+ <pt x="441" y="448" on="1"/>
+ <pt x="792" y="448" on="1"/>
+ <pt x="792" y="215" on="1"/>
+ <pt x="441" y="215" on="1"/>
+ <pt x="441" y="19" on="1"/>
+ <pt x="89" y="19" on="1"/>
+ <pt x="89" y="215" on="1"/>
+ <pt x="-192" y="215" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="C" xMin="-173" yMin="-66" xMax="811" yMax="646">
+ <contour>
+ <pt x="-137" y="646" on="1"/>
+ <pt x="140" y="646" on="1"/>
+ <pt x="140" y="584" on="1"/>
+ <pt x="460" y="584" on="1"/>
+ <pt x="460" y="420" on="1"/>
+ <pt x="811" y="420" on="1"/>
+ <pt x="811" y="187" on="1"/>
+ <pt x="460" y="187" on="1"/>
+ <pt x="460" y="-9" on="1"/>
+ <pt x="140" y="-9" on="1"/>
+ <pt x="140" y="-66" on="1"/>
+ <pt x="-137" y="-66" on="1"/>
+ <pt x="-137" y="187" on="1"/>
+ <pt x="-173" y="187" on="1"/>
+ <pt x="-173" y="420" on="1"/>
+ <pt x="-137" y="420" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="D" xMin="-137" yMin="-66" xMax="1099" yMax="646">
+ <contour>
+ <pt x="-137" y="646" on="1"/>
+ <pt x="140" y="646" on="1"/>
+ <pt x="140" y="420" on="1"/>
+ <pt x="396" y="420" on="1"/>
+ <pt x="396" y="584" on="1"/>
+ <pt x="748" y="584" on="1"/>
+ <pt x="748" y="420" on="1"/>
+ <pt x="1099" y="420" on="1"/>
+ <pt x="1099" y="187" on="1"/>
+ <pt x="748" y="187" on="1"/>
+ <pt x="748" y="-9" on="1"/>
+ <pt x="396" y="-9" on="1"/>
+ <pt x="396" y="187" on="1"/>
+ <pt x="140" y="187" on="1"/>
+ <pt x="140" y="-66" on="1"/>
+ <pt x="-137" y="-66" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="E" xMin="-127" yMin="-100" xMax="839" yMax="663">
+ <contour>
+ <pt x="121" y="650" on="1"/>
+ <pt x="398" y="650" on="1"/>
+ <pt x="398" y="592" on="1"/>
+ <pt x="596" y="663" on="1"/>
+ <pt x="839" y="-6" on="1"/>
+ <pt x="579" y="-100" on="1"/>
+ <pt x="398" y="396" on="1"/>
+ <pt x="398" y="-62" on="1"/>
+ <pt x="150" y="-62" on="1"/>
+ <pt x="150" y="-66" on="1"/>
+ <pt x="-127" y="-66" on="1"/>
+ <pt x="-127" y="646" on="1"/>
+ <pt x="121" y="646" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="F" xMin="-147" yMin="-115" xMax="872" yMax="650">
+ <contour>
+ <pt x="101" y="650" on="1"/>
+ <pt x="378" y="650" on="1"/>
+ <pt x="378" y="561" on="1"/>
+ <pt x="516" y="640" on="1"/>
+ <pt x="872" y="24" on="1"/>
+ <pt x="632" y="-115" on="1"/>
+ <pt x="378" y="325" on="1"/>
+ <pt x="378" y="-62" on="1"/>
+ <pt x="130" y="-62" on="1"/>
+ <pt x="130" y="-66" on="1"/>
+ <pt x="-147" y="-66" on="1"/>
+ <pt x="-147" y="646" on="1"/>
+ <pt x="101" y="646" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="space"/><!-- contains no outline data -->
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Weight
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Remove Overlaps Test
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.000;NONE;RemoveOverlapsTest-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Remove Overlaps Test Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.000
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ RemoveOverlapsTest-Regular
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-100"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ <psNames>
+ <!-- This file uses unique glyph names based on the information
+ found in the 'post' table. Since these names might not be unique,
+ we have to invent artificial names in case of clashes. In order to
+ be able to retain the original information, we need a name to
+ ps name mapping for those cases where they differ. That's what
+ you see below.
+ -->
+ </psNames>
+ <extraNames>
+ <!-- following are the name that are not taken from the standard Mac glyph order -->
+ </extraNames>
+ </post>
+
+ <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=0 -->
+ <ElidedFallbackNameID value="2"/> <!-- Regular -->
+ </STAT>
+
+</ttFont>
diff --git a/Tests/varLib/instancer/instancer_test.py b/Tests/varLib/instancer/instancer_test.py
new file mode 100644
index 00000000..cb7e8547
--- /dev/null
+++ b/Tests/varLib/instancer/instancer_test.py
@@ -0,0 +1,1939 @@
+from fontTools.misc.py23 import Tag
+from fontTools.misc.fixedTools import floatToFixedToFloat
+from fontTools import ttLib
+from fontTools import designspaceLib
+from fontTools.feaLib.builder import addOpenTypeFeaturesFromString
+from fontTools.ttLib.tables import _f_v_a_r, _g_l_y_f
+from fontTools.ttLib.tables import otTables
+from fontTools.ttLib.tables.TupleVariation import TupleVariation
+from fontTools import varLib
+from fontTools.varLib import instancer
+from fontTools.varLib.mvar import MVAR_ENTRIES
+from fontTools.varLib import builder
+from fontTools.varLib import featureVars
+from fontTools.varLib import models
+import collections
+from copy import deepcopy
+from io import BytesIO, StringIO
+import logging
+import os
+import re
+from types import SimpleNamespace
+import pytest
+
+
+# see Tests/varLib/instancer/conftest.py for "varfont" fixture definition
+
+TESTDATA = os.path.join(os.path.dirname(__file__), "data")
+
+
+@pytest.fixture(params=[True, False], ids=["optimize", "no-optimize"])
+def optimize(request):
+ return request.param
+
+
+@pytest.fixture
+def fvarAxes():
+ wght = _f_v_a_r.Axis()
+ wght.axisTag = Tag("wght")
+ wght.minValue = 100
+ wght.defaultValue = 400
+ wght.maxValue = 900
+ wdth = _f_v_a_r.Axis()
+ wdth.axisTag = Tag("wdth")
+ wdth.minValue = 70
+ wdth.defaultValue = 100
+ wdth.maxValue = 100
+ return [wght, wdth]
+
+
+def _get_coordinates(varfont, glyphname):
+ # converts GlyphCoordinates to a list of (x, y) tuples, so that pytest's
+ # assert will give us a nicer diff
+ return list(varfont["glyf"].getCoordinatesAndControls(glyphname, varfont)[0])
+
+
+class InstantiateGvarTest(object):
+ @pytest.mark.parametrize("glyph_name", ["hyphen"])
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ pytest.param(
+ {"wdth": -1.0},
+ {
+ "hyphen": [
+ (27, 229),
+ (27, 310),
+ (247, 310),
+ (247, 229),
+ (0, 0),
+ (274, 0),
+ (0, 536),
+ (0, 0),
+ ]
+ },
+ id="wdth=-1.0",
+ ),
+ pytest.param(
+ {"wdth": -0.5},
+ {
+ "hyphen": [
+ (33.5, 229),
+ (33.5, 308.5),
+ (264.5, 308.5),
+ (264.5, 229),
+ (0, 0),
+ (298, 0),
+ (0, 536),
+ (0, 0),
+ ]
+ },
+ id="wdth=-0.5",
+ ),
+ # an axis pinned at the default normalized location (0.0) means
+ # the default glyf outline stays the same
+ pytest.param(
+ {"wdth": 0.0},
+ {
+ "hyphen": [
+ (40, 229),
+ (40, 307),
+ (282, 307),
+ (282, 229),
+ (0, 0),
+ (322, 0),
+ (0, 536),
+ (0, 0),
+ ]
+ },
+ id="wdth=0.0",
+ ),
+ ],
+ )
+ def test_pin_and_drop_axis(self, varfont, glyph_name, location, expected, optimize):
+ instancer.instantiateGvar(varfont, location, optimize=optimize)
+
+ assert _get_coordinates(varfont, glyph_name) == expected[glyph_name]
+
+ # check that the pinned axis has been dropped from gvar
+ assert not any(
+ "wdth" in t.axes
+ for tuples in varfont["gvar"].variations.values()
+ for t in tuples
+ )
+
+ def test_full_instance(self, varfont, optimize):
+ instancer.instantiateGvar(
+ varfont, {"wght": 0.0, "wdth": -0.5}, optimize=optimize
+ )
+
+ assert _get_coordinates(varfont, "hyphen") == [
+ (33.5, 229),
+ (33.5, 308.5),
+ (264.5, 308.5),
+ (264.5, 229),
+ (0, 0),
+ (298, 0),
+ (0, 536),
+ (0, 0),
+ ]
+
+ assert "gvar" not in varfont
+
+ def test_composite_glyph_not_in_gvar(self, varfont):
+ """The 'minus' glyph is a composite glyph, which references 'hyphen' as a
+ component, but has no tuple variations in gvar table, so the component offset
+ and the phantom points do not change; however the sidebearings and bounding box
+ do change as a result of the parent glyph 'hyphen' changing.
+ """
+ hmtx = varfont["hmtx"]
+ vmtx = varfont["vmtx"]
+
+ hyphenCoords = _get_coordinates(varfont, "hyphen")
+ assert hyphenCoords == [
+ (40, 229),
+ (40, 307),
+ (282, 307),
+ (282, 229),
+ (0, 0),
+ (322, 0),
+ (0, 536),
+ (0, 0),
+ ]
+ assert hmtx["hyphen"] == (322, 40)
+ assert vmtx["hyphen"] == (536, 229)
+
+ minusCoords = _get_coordinates(varfont, "minus")
+ assert minusCoords == [(0, 0), (0, 0), (422, 0), (0, 536), (0, 0)]
+ assert hmtx["minus"] == (422, 40)
+ assert vmtx["minus"] == (536, 229)
+
+ location = {"wght": -1.0, "wdth": -1.0}
+
+ instancer.instantiateGvar(varfont, location)
+
+ # check 'hyphen' coordinates changed
+ assert _get_coordinates(varfont, "hyphen") == [
+ (26, 259),
+ (26, 286),
+ (237, 286),
+ (237, 259),
+ (0, 0),
+ (263, 0),
+ (0, 536),
+ (0, 0),
+ ]
+ # check 'minus' coordinates (i.e. component offset and phantom points)
+ # did _not_ change
+ assert _get_coordinates(varfont, "minus") == minusCoords
+
+ assert hmtx["hyphen"] == (263, 26)
+ assert vmtx["hyphen"] == (536, 250)
+
+ assert hmtx["minus"] == (422, 26) # 'minus' left sidebearing changed
+ assert vmtx["minus"] == (536, 250) # 'minus' top sidebearing too
+
+
+class InstantiateCvarTest(object):
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ pytest.param({"wght": -1.0}, [500, -400, 150, 250], id="wght=-1.0"),
+ pytest.param({"wdth": -1.0}, [500, -400, 180, 200], id="wdth=-1.0"),
+ pytest.param({"wght": -0.5}, [500, -400, 165, 250], id="wght=-0.5"),
+ pytest.param({"wdth": -0.3}, [500, -400, 180, 235], id="wdth=-0.3"),
+ ],
+ )
+ def test_pin_and_drop_axis(self, varfont, location, expected):
+ instancer.instantiateCvar(varfont, location)
+
+ assert list(varfont["cvt "].values) == expected
+
+ # check that the pinned axis has been dropped from cvar
+ pinned_axes = location.keys()
+ assert not any(
+ axis in t.axes for t in varfont["cvar"].variations for axis in pinned_axes
+ )
+
+ def test_full_instance(self, varfont):
+ instancer.instantiateCvar(varfont, {"wght": -0.5, "wdth": -0.5})
+
+ assert list(varfont["cvt "].values) == [500, -400, 165, 225]
+
+ assert "cvar" not in varfont
+
+
+class InstantiateMVARTest(object):
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ pytest.param(
+ {"wght": 1.0},
+ {"strs": 100, "undo": -200, "unds": 150, "xhgt": 530},
+ id="wght=1.0",
+ ),
+ pytest.param(
+ {"wght": 0.5},
+ {"strs": 75, "undo": -150, "unds": 100, "xhgt": 515},
+ id="wght=0.5",
+ ),
+ pytest.param(
+ {"wght": 0.0},
+ {"strs": 50, "undo": -100, "unds": 50, "xhgt": 500},
+ id="wght=0.0",
+ ),
+ pytest.param(
+ {"wdth": -1.0},
+ {"strs": 20, "undo": -100, "unds": 50, "xhgt": 500},
+ id="wdth=-1.0",
+ ),
+ pytest.param(
+ {"wdth": -0.5},
+ {"strs": 35, "undo": -100, "unds": 50, "xhgt": 500},
+ id="wdth=-0.5",
+ ),
+ pytest.param(
+ {"wdth": 0.0},
+ {"strs": 50, "undo": -100, "unds": 50, "xhgt": 500},
+ id="wdth=0.0",
+ ),
+ ],
+ )
+ def test_pin_and_drop_axis(self, varfont, location, expected):
+ mvar = varfont["MVAR"].table
+ # initially we have two VarData: the first contains deltas associated with 3
+ # regions: 1 with only wght, 1 with only wdth, and 1 with both wght and wdth
+ assert len(mvar.VarStore.VarData) == 2
+ assert mvar.VarStore.VarRegionList.RegionCount == 3
+ assert mvar.VarStore.VarData[0].VarRegionCount == 3
+ assert all(len(item) == 3 for item in mvar.VarStore.VarData[0].Item)
+ # The second VarData has deltas associated only with 1 region (wght only).
+ assert mvar.VarStore.VarData[1].VarRegionCount == 1
+ assert all(len(item) == 1 for item in mvar.VarStore.VarData[1].Item)
+
+ instancer.instantiateMVAR(varfont, location)
+
+ for mvar_tag, expected_value in expected.items():
+ table_tag, item_name = MVAR_ENTRIES[mvar_tag]
+ assert getattr(varfont[table_tag], item_name) == expected_value
+
+ # check that regions and accompanying deltas have been dropped
+ num_regions_left = len(mvar.VarStore.VarRegionList.Region)
+ assert num_regions_left < 3
+ assert mvar.VarStore.VarRegionList.RegionCount == num_regions_left
+ assert mvar.VarStore.VarData[0].VarRegionCount == num_regions_left
+ # VarData subtables have been merged
+ assert len(mvar.VarStore.VarData) == 1
+
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ pytest.param(
+ {"wght": 1.0, "wdth": 0.0},
+ {"strs": 100, "undo": -200, "unds": 150},
+ id="wght=1.0,wdth=0.0",
+ ),
+ pytest.param(
+ {"wght": 0.0, "wdth": -1.0},
+ {"strs": 20, "undo": -100, "unds": 50},
+ id="wght=0.0,wdth=-1.0",
+ ),
+ pytest.param(
+ {"wght": 0.5, "wdth": -0.5},
+ {"strs": 55, "undo": -145, "unds": 95},
+ id="wght=0.5,wdth=-0.5",
+ ),
+ pytest.param(
+ {"wght": 1.0, "wdth": -1.0},
+ {"strs": 50, "undo": -180, "unds": 130},
+ id="wght=0.5,wdth=-0.5",
+ ),
+ ],
+ )
+ def test_full_instance(self, varfont, location, expected):
+ instancer.instantiateMVAR(varfont, location)
+
+ for mvar_tag, expected_value in expected.items():
+ table_tag, item_name = MVAR_ENTRIES[mvar_tag]
+ assert getattr(varfont[table_tag], item_name) == expected_value
+
+ assert "MVAR" not in varfont
+
+
+class InstantiateHVARTest(object):
+ # the 'expectedDeltas' below refer to the VarData item deltas for the "hyphen"
+ # glyph in the PartialInstancerTest-VF.ttx test font, that are left after
+ # partial instancing
+ @pytest.mark.parametrize(
+ "location, expectedRegions, expectedDeltas",
+ [
+ ({"wght": -1.0}, [{"wdth": (-1.0, -1.0, 0)}], [-59]),
+ ({"wght": 0}, [{"wdth": (-1.0, -1.0, 0)}], [-48]),
+ ({"wght": 1.0}, [{"wdth": (-1.0, -1.0, 0)}], [7]),
+ (
+ {"wdth": -1.0},
+ [
+ {"wght": (-1.0, -1.0, 0.0)},
+ {"wght": (0.0, 0.6099854, 1.0)},
+ {"wght": (0.6099854, 1.0, 1.0)},
+ ],
+ [-11, 31, 51],
+ ),
+ ({"wdth": 0}, [{"wght": (0.6099854, 1.0, 1.0)}], [-4]),
+ ],
+ )
+ def test_partial_instance(self, varfont, location, expectedRegions, expectedDeltas):
+ instancer.instantiateHVAR(varfont, location)
+
+ assert "HVAR" in varfont
+ hvar = varfont["HVAR"].table
+ varStore = hvar.VarStore
+
+ regions = varStore.VarRegionList.Region
+ fvarAxes = [a for a in varfont["fvar"].axes if a.axisTag not in location]
+ regionDicts = [reg.get_support(fvarAxes) for reg in regions]
+ assert len(regionDicts) == len(expectedRegions)
+ for region, expectedRegion in zip(regionDicts, expectedRegions):
+ assert region.keys() == expectedRegion.keys()
+ for axisTag, support in region.items():
+ assert support == pytest.approx(expectedRegion[axisTag])
+
+ assert len(varStore.VarData) == 1
+ assert varStore.VarData[0].ItemCount == 2
+
+ assert hvar.AdvWidthMap is not None
+ advWithMap = hvar.AdvWidthMap.mapping
+
+ assert advWithMap[".notdef"] == advWithMap["space"]
+ varIdx = advWithMap[".notdef"]
+ # these glyphs have no metrics variations in the test font
+ assert varStore.VarData[varIdx >> 16].Item[varIdx & 0xFFFF] == (
+ [0] * varStore.VarData[0].VarRegionCount
+ )
+
+ varIdx = advWithMap["hyphen"]
+ assert varStore.VarData[varIdx >> 16].Item[varIdx & 0xFFFF] == expectedDeltas
+
+ def test_full_instance(self, varfont):
+ instancer.instantiateHVAR(varfont, {"wght": 0, "wdth": 0})
+
+ assert "HVAR" not in varfont
+
+ def test_partial_instance_keep_empty_table(self, varfont):
+ # Append an additional dummy axis to fvar, for which the current HVAR table
+ # in our test 'varfont' contains no variation data.
+ # Instancing the other two wght and wdth axes should leave HVAR table empty,
+ # to signal there are variations to the glyph's advance widths.
+ fvar = varfont["fvar"]
+ axis = _f_v_a_r.Axis()
+ axis.axisTag = "TEST"
+ fvar.axes.append(axis)
+
+ instancer.instantiateHVAR(varfont, {"wght": 0, "wdth": 0})
+
+ assert "HVAR" in varfont
+
+ varStore = varfont["HVAR"].table.VarStore
+
+ assert varStore.VarRegionList.RegionCount == 0
+ assert not varStore.VarRegionList.Region
+ assert varStore.VarRegionList.RegionAxisCount == 1
+
+
+class InstantiateItemVariationStoreTest(object):
+ def test_VarRegion_get_support(self):
+ axisOrder = ["wght", "wdth", "opsz"]
+ regionAxes = {"wdth": (-1.0, -1.0, 0.0), "wght": (0.0, 1.0, 1.0)}
+ region = builder.buildVarRegion(regionAxes, axisOrder)
+
+ assert len(region.VarRegionAxis) == 3
+ assert region.VarRegionAxis[2].PeakCoord == 0
+
+ fvarAxes = [SimpleNamespace(axisTag=axisTag) for axisTag in axisOrder]
+
+ assert region.get_support(fvarAxes) == regionAxes
+
+ @pytest.fixture
+ def varStore(self):
+ return builder.buildVarStore(
+ builder.buildVarRegionList(
+ [
+ {"wght": (-1.0, -1.0, 0)},
+ {"wght": (0, 0.5, 1.0)},
+ {"wght": (0.5, 1.0, 1.0)},
+ {"wdth": (-1.0, -1.0, 0)},
+ {"wght": (-1.0, -1.0, 0), "wdth": (-1.0, -1.0, 0)},
+ {"wght": (0, 0.5, 1.0), "wdth": (-1.0, -1.0, 0)},
+ {"wght": (0.5, 1.0, 1.0), "wdth": (-1.0, -1.0, 0)},
+ ],
+ ["wght", "wdth"],
+ ),
+ [
+ builder.buildVarData([0, 1, 2], [[100, 100, 100], [100, 100, 100]]),
+ builder.buildVarData(
+ [3, 4, 5, 6], [[100, 100, 100, 100], [100, 100, 100, 100]]
+ ),
+ ],
+ )
+
+ @pytest.mark.parametrize(
+ "location, expected_deltas, num_regions",
+ [
+ ({"wght": 0}, [[0, 0], [0, 0]], 1),
+ ({"wght": 0.25}, [[50, 50], [0, 0]], 1),
+ ({"wdth": 0}, [[0, 0], [0, 0]], 3),
+ ({"wdth": -0.75}, [[0, 0], [75, 75]], 3),
+ ({"wght": 0, "wdth": 0}, [[0, 0], [0, 0]], 0),
+ ({"wght": 0.25, "wdth": 0}, [[50, 50], [0, 0]], 0),
+ ({"wght": 0, "wdth": -0.75}, [[0, 0], [75, 75]], 0),
+ ],
+ )
+ def test_instantiate_default_deltas(
+ self, varStore, fvarAxes, location, expected_deltas, num_regions
+ ):
+ defaultDeltas = instancer.instantiateItemVariationStore(
+ varStore, fvarAxes, location
+ )
+
+ defaultDeltaArray = []
+ for varidx, delta in sorted(defaultDeltas.items()):
+ major, minor = varidx >> 16, varidx & 0xFFFF
+ if major == len(defaultDeltaArray):
+ defaultDeltaArray.append([])
+ assert len(defaultDeltaArray[major]) == minor
+ defaultDeltaArray[major].append(delta)
+
+ assert defaultDeltaArray == expected_deltas
+ assert varStore.VarRegionList.RegionCount == num_regions
+
+
+class TupleVarStoreAdapterTest(object):
+ def test_instantiate(self):
+ regions = [
+ {"wght": (-1.0, -1.0, 0)},
+ {"wght": (0.0, 1.0, 1.0)},
+ {"wdth": (-1.0, -1.0, 0)},
+ {"wght": (-1.0, -1.0, 0), "wdth": (-1.0, -1.0, 0)},
+ {"wght": (0, 1.0, 1.0), "wdth": (-1.0, -1.0, 0)},
+ ]
+ axisOrder = ["wght", "wdth"]
+ tupleVarData = [
+ [
+ TupleVariation({"wght": (-1.0, -1.0, 0)}, [10, 70]),
+ TupleVariation({"wght": (0.0, 1.0, 1.0)}, [30, 90]),
+ TupleVariation(
+ {"wght": (-1.0, -1.0, 0), "wdth": (-1.0, -1.0, 0)}, [-40, -100]
+ ),
+ TupleVariation(
+ {"wght": (0, 1.0, 1.0), "wdth": (-1.0, -1.0, 0)}, [-60, -120]
+ ),
+ ],
+ [
+ TupleVariation({"wdth": (-1.0, -1.0, 0)}, [5, 45]),
+ TupleVariation(
+ {"wght": (-1.0, -1.0, 0), "wdth": (-1.0, -1.0, 0)}, [-15, -55]
+ ),
+ TupleVariation(
+ {"wght": (0, 1.0, 1.0), "wdth": (-1.0, -1.0, 0)}, [-35, -75]
+ ),
+ ],
+ ]
+ adapter = instancer._TupleVarStoreAdapter(
+ regions, axisOrder, tupleVarData, itemCounts=[2, 2]
+ )
+
+ defaultDeltaArray = adapter.instantiate({"wght": 0.5})
+
+ assert defaultDeltaArray == [[15, 45], [0, 0]]
+ assert adapter.regions == [{"wdth": (-1.0, -1.0, 0)}]
+ assert adapter.tupleVarData == [
+ [TupleVariation({"wdth": (-1.0, -1.0, 0)}, [-30, -60])],
+ [TupleVariation({"wdth": (-1.0, -1.0, 0)}, [-12, 8])],
+ ]
+
+ def test_rebuildRegions(self):
+ regions = [
+ {"wght": (-1.0, -1.0, 0)},
+ {"wght": (0.0, 1.0, 1.0)},
+ {"wdth": (-1.0, -1.0, 0)},
+ {"wght": (-1.0, -1.0, 0), "wdth": (-1.0, -1.0, 0)},
+ {"wght": (0, 1.0, 1.0), "wdth": (-1.0, -1.0, 0)},
+ ]
+ axisOrder = ["wght", "wdth"]
+ variations = []
+ for region in regions:
+ variations.append(TupleVariation(region, [100]))
+ tupleVarData = [variations[:3], variations[3:]]
+ adapter = instancer._TupleVarStoreAdapter(
+ regions, axisOrder, tupleVarData, itemCounts=[1, 1]
+ )
+
+ adapter.rebuildRegions()
+
+ assert adapter.regions == regions
+
+ del tupleVarData[0][2]
+ tupleVarData[1][0].axes = {"wght": (-1.0, -0.5, 0)}
+ tupleVarData[1][1].axes = {"wght": (0, 0.5, 1.0)}
+
+ adapter.rebuildRegions()
+
+ assert adapter.regions == [
+ {"wght": (-1.0, -1.0, 0)},
+ {"wght": (0.0, 1.0, 1.0)},
+ {"wght": (-1.0, -0.5, 0)},
+ {"wght": (0, 0.5, 1.0)},
+ ]
+
+ def test_roundtrip(self, fvarAxes):
+ regions = [
+ {"wght": (-1.0, -1.0, 0)},
+ {"wght": (0, 0.5, 1.0)},
+ {"wght": (0.5, 1.0, 1.0)},
+ {"wdth": (-1.0, -1.0, 0)},
+ {"wght": (-1.0, -1.0, 0), "wdth": (-1.0, -1.0, 0)},
+ {"wght": (0, 0.5, 1.0), "wdth": (-1.0, -1.0, 0)},
+ {"wght": (0.5, 1.0, 1.0), "wdth": (-1.0, -1.0, 0)},
+ ]
+ axisOrder = [axis.axisTag for axis in fvarAxes]
+
+ itemVarStore = builder.buildVarStore(
+ builder.buildVarRegionList(regions, axisOrder),
+ [
+ builder.buildVarData(
+ [0, 1, 2, 4, 5, 6],
+ [[10, -20, 30, -40, 50, -60], [70, -80, 90, -100, 110, -120]],
+ ),
+ builder.buildVarData(
+ [3, 4, 5, 6], [[5, -15, 25, -35], [45, -55, 65, -75]]
+ ),
+ ],
+ )
+
+ adapter = instancer._TupleVarStoreAdapter.fromItemVarStore(
+ itemVarStore, fvarAxes
+ )
+
+ assert adapter.tupleVarData == [
+ [
+ TupleVariation({"wght": (-1.0, -1.0, 0)}, [10, 70]),
+ TupleVariation({"wght": (0, 0.5, 1.0)}, [-20, -80]),
+ TupleVariation({"wght": (0.5, 1.0, 1.0)}, [30, 90]),
+ TupleVariation(
+ {"wght": (-1.0, -1.0, 0), "wdth": (-1.0, -1.0, 0)}, [-40, -100]
+ ),
+ TupleVariation(
+ {"wght": (0, 0.5, 1.0), "wdth": (-1.0, -1.0, 0)}, [50, 110]
+ ),
+ TupleVariation(
+ {"wght": (0.5, 1.0, 1.0), "wdth": (-1.0, -1.0, 0)}, [-60, -120]
+ ),
+ ],
+ [
+ TupleVariation({"wdth": (-1.0, -1.0, 0)}, [5, 45]),
+ TupleVariation(
+ {"wght": (-1.0, -1.0, 0), "wdth": (-1.0, -1.0, 0)}, [-15, -55]
+ ),
+ TupleVariation(
+ {"wght": (0, 0.5, 1.0), "wdth": (-1.0, -1.0, 0)}, [25, 65]
+ ),
+ TupleVariation(
+ {"wght": (0.5, 1.0, 1.0), "wdth": (-1.0, -1.0, 0)}, [-35, -75]
+ ),
+ ],
+ ]
+ assert adapter.itemCounts == [data.ItemCount for data in itemVarStore.VarData]
+ assert adapter.regions == regions
+ assert adapter.axisOrder == axisOrder
+
+ itemVarStore2 = adapter.asItemVarStore()
+
+ assert [
+ reg.get_support(fvarAxes) for reg in itemVarStore2.VarRegionList.Region
+ ] == regions
+
+ assert itemVarStore2.VarDataCount == 2
+ assert itemVarStore2.VarData[0].VarRegionIndex == [0, 1, 2, 4, 5, 6]
+ assert itemVarStore2.VarData[0].Item == [
+ [10, -20, 30, -40, 50, -60],
+ [70, -80, 90, -100, 110, -120],
+ ]
+ assert itemVarStore2.VarData[1].VarRegionIndex == [3, 4, 5, 6]
+ assert itemVarStore2.VarData[1].Item == [[5, -15, 25, -35], [45, -55, 65, -75]]
+
+
+def makeTTFont(glyphOrder, features):
+ font = ttLib.TTFont()
+ font.setGlyphOrder(glyphOrder)
+ addOpenTypeFeaturesFromString(font, features)
+ font["name"] = ttLib.newTable("name")
+ return font
+
+
+def _makeDSAxesDict(axes):
+ dsAxes = collections.OrderedDict()
+ for axisTag, axisValues in axes:
+ axis = designspaceLib.AxisDescriptor()
+ axis.name = axis.tag = axis.labelNames["en"] = axisTag
+ axis.minimum, axis.default, axis.maximum = axisValues
+ dsAxes[axis.tag] = axis
+ return dsAxes
+
+
+def makeVariableFont(masters, baseIndex, axes, masterLocations):
+ vf = deepcopy(masters[baseIndex])
+ dsAxes = _makeDSAxesDict(axes)
+ fvar = varLib._add_fvar(vf, dsAxes, instances=())
+ axisTags = [axis.axisTag for axis in fvar.axes]
+ normalizedLocs = [models.normalizeLocation(m, dict(axes)) for m in masterLocations]
+ model = models.VariationModel(normalizedLocs, axisOrder=axisTags)
+ varLib._merge_OTL(vf, model, masters, axisTags)
+ return vf
+
+
+def makeParametrizedVF(glyphOrder, features, values, increments):
+ # Create a test VF with given glyphs and parametrized OTL features.
+ # The VF is built from 9 masters (3 x 3 along wght and wdth), with
+ # locations hard-coded and base master at wght=400 and wdth=100.
+ # 'values' is a list of initial values that are interpolated in the
+ # 'features' string, and incremented for each subsequent master by the
+ # given 'increments' (list of 2-tuple) along the two axes.
+ assert values and len(values) == len(increments)
+ assert all(len(i) == 2 for i in increments)
+ masterLocations = [
+ {"wght": 100, "wdth": 50},
+ {"wght": 100, "wdth": 100},
+ {"wght": 100, "wdth": 150},
+ {"wght": 400, "wdth": 50},
+ {"wght": 400, "wdth": 100}, # base master
+ {"wght": 400, "wdth": 150},
+ {"wght": 700, "wdth": 50},
+ {"wght": 700, "wdth": 100},
+ {"wght": 700, "wdth": 150},
+ ]
+ n = len(values)
+ values = list(values)
+ masters = []
+ for _ in range(3):
+ for _ in range(3):
+ master = makeTTFont(glyphOrder, features=features % tuple(values))
+ masters.append(master)
+ for i in range(n):
+ values[i] += increments[i][1]
+ for i in range(n):
+ values[i] += increments[i][0]
+ baseIndex = 4
+ axes = [("wght", (100, 400, 700)), ("wdth", (50, 100, 150))]
+ vf = makeVariableFont(masters, baseIndex, axes, masterLocations)
+ return vf
+
+
+@pytest.fixture
+def varfontGDEF():
+ glyphOrder = [".notdef", "f", "i", "f_i"]
+ features = (
+ "feature liga { sub f i by f_i;} liga;"
+ "table GDEF { LigatureCaretByPos f_i %d; } GDEF;"
+ )
+ values = [100]
+ increments = [(+30, +10)]
+ return makeParametrizedVF(glyphOrder, features, values, increments)
+
+
+@pytest.fixture
+def varfontGPOS():
+ glyphOrder = [".notdef", "V", "A"]
+ features = "feature kern { pos V A %d; } kern;"
+ values = [-80]
+ increments = [(-10, -5)]
+ return makeParametrizedVF(glyphOrder, features, values, increments)
+
+
+@pytest.fixture
+def varfontGPOS2():
+ glyphOrder = [".notdef", "V", "A", "acutecomb"]
+ features = (
+ "markClass [acutecomb] <anchor 150 -10> @TOP_MARKS;"
+ "feature mark {"
+ " pos base A <anchor %d 450> mark @TOP_MARKS;"
+ "} mark;"
+ "feature kern {"
+ " pos V A %d;"
+ "} kern;"
+ )
+ values = [200, -80]
+ increments = [(+30, +10), (-10, -5)]
+ return makeParametrizedVF(glyphOrder, features, values, increments)
+
+
+class InstantiateOTLTest(object):
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ ({"wght": -1.0}, 110), # -60
+ ({"wght": 0}, 170),
+ ({"wght": 0.5}, 200), # +30
+ ({"wght": 1.0}, 230), # +60
+ ({"wdth": -1.0}, 160), # -10
+ ({"wdth": -0.3}, 167), # -3
+ ({"wdth": 0}, 170),
+ ({"wdth": 1.0}, 180), # +10
+ ],
+ )
+ def test_pin_and_drop_axis_GDEF(self, varfontGDEF, location, expected):
+ vf = varfontGDEF
+ assert "GDEF" in vf
+
+ instancer.instantiateOTL(vf, location)
+
+ assert "GDEF" in vf
+ gdef = vf["GDEF"].table
+ assert gdef.Version == 0x00010003
+ assert gdef.VarStore
+ assert gdef.LigCaretList
+ caretValue = gdef.LigCaretList.LigGlyph[0].CaretValue[0]
+ assert caretValue.Format == 3
+ assert hasattr(caretValue, "DeviceTable")
+ assert caretValue.DeviceTable.DeltaFormat == 0x8000
+ assert caretValue.Coordinate == expected
+
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ ({"wght": -1.0, "wdth": -1.0}, 100), # -60 - 10
+ ({"wght": -1.0, "wdth": 0.0}, 110), # -60
+ ({"wght": -1.0, "wdth": 1.0}, 120), # -60 + 10
+ ({"wght": 0.0, "wdth": -1.0}, 160), # -10
+ ({"wght": 0.0, "wdth": 0.0}, 170),
+ ({"wght": 0.0, "wdth": 1.0}, 180), # +10
+ ({"wght": 1.0, "wdth": -1.0}, 220), # +60 - 10
+ ({"wght": 1.0, "wdth": 0.0}, 230), # +60
+ ({"wght": 1.0, "wdth": 1.0}, 240), # +60 + 10
+ ],
+ )
+ def test_full_instance_GDEF(self, varfontGDEF, location, expected):
+ vf = varfontGDEF
+ assert "GDEF" in vf
+
+ instancer.instantiateOTL(vf, location)
+
+ assert "GDEF" in vf
+ gdef = vf["GDEF"].table
+ assert gdef.Version == 0x00010000
+ assert not hasattr(gdef, "VarStore")
+ assert gdef.LigCaretList
+ caretValue = gdef.LigCaretList.LigGlyph[0].CaretValue[0]
+ assert caretValue.Format == 1
+ assert not hasattr(caretValue, "DeviceTable")
+ assert caretValue.Coordinate == expected
+
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ ({"wght": -1.0}, -85), # +25
+ ({"wght": 0}, -110),
+ ({"wght": 1.0}, -135), # -25
+ ({"wdth": -1.0}, -105), # +5
+ ({"wdth": 0}, -110),
+ ({"wdth": 1.0}, -115), # -5
+ ],
+ )
+ def test_pin_and_drop_axis_GPOS_kern(self, varfontGPOS, location, expected):
+ vf = varfontGPOS
+ assert "GDEF" in vf
+ assert "GPOS" in vf
+
+ instancer.instantiateOTL(vf, location)
+
+ gdef = vf["GDEF"].table
+ gpos = vf["GPOS"].table
+ assert gdef.Version == 0x00010003
+ assert gdef.VarStore
+
+ assert gpos.LookupList.Lookup[0].LookupType == 2 # PairPos
+ pairPos = gpos.LookupList.Lookup[0].SubTable[0]
+ valueRec1 = pairPos.PairSet[0].PairValueRecord[0].Value1
+ assert valueRec1.XAdvDevice
+ assert valueRec1.XAdvDevice.DeltaFormat == 0x8000
+ assert valueRec1.XAdvance == expected
+
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ ({"wght": -1.0, "wdth": -1.0}, -80), # +25 + 5
+ ({"wght": -1.0, "wdth": 0.0}, -85), # +25
+ ({"wght": -1.0, "wdth": 1.0}, -90), # +25 - 5
+ ({"wght": 0.0, "wdth": -1.0}, -105), # +5
+ ({"wght": 0.0, "wdth": 0.0}, -110),
+ ({"wght": 0.0, "wdth": 1.0}, -115), # -5
+ ({"wght": 1.0, "wdth": -1.0}, -130), # -25 + 5
+ ({"wght": 1.0, "wdth": 0.0}, -135), # -25
+ ({"wght": 1.0, "wdth": 1.0}, -140), # -25 - 5
+ ],
+ )
+ def test_full_instance_GPOS_kern(self, varfontGPOS, location, expected):
+ vf = varfontGPOS
+ assert "GDEF" in vf
+ assert "GPOS" in vf
+
+ instancer.instantiateOTL(vf, location)
+
+ assert "GDEF" not in vf
+ gpos = vf["GPOS"].table
+
+ assert gpos.LookupList.Lookup[0].LookupType == 2 # PairPos
+ pairPos = gpos.LookupList.Lookup[0].SubTable[0]
+ valueRec1 = pairPos.PairSet[0].PairValueRecord[0].Value1
+ assert not hasattr(valueRec1, "XAdvDevice")
+ assert valueRec1.XAdvance == expected
+
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ ({"wght": -1.0}, (210, -85)), # -60, +25
+ ({"wght": 0}, (270, -110)),
+ ({"wght": 0.5}, (300, -122)), # +30, -12
+ ({"wght": 1.0}, (330, -135)), # +60, -25
+ ({"wdth": -1.0}, (260, -105)), # -10, +5
+ ({"wdth": -0.3}, (267, -108)), # -3, +2
+ ({"wdth": 0}, (270, -110)),
+ ({"wdth": 1.0}, (280, -115)), # +10, -5
+ ],
+ )
+ def test_pin_and_drop_axis_GPOS_mark_and_kern(
+ self, varfontGPOS2, location, expected
+ ):
+ vf = varfontGPOS2
+ assert "GDEF" in vf
+ assert "GPOS" in vf
+
+ instancer.instantiateOTL(vf, location)
+
+ v1, v2 = expected
+ gdef = vf["GDEF"].table
+ gpos = vf["GPOS"].table
+ assert gdef.Version == 0x00010003
+ assert gdef.VarStore
+ assert gdef.GlyphClassDef
+
+ assert gpos.LookupList.Lookup[0].LookupType == 4 # MarkBasePos
+ markBasePos = gpos.LookupList.Lookup[0].SubTable[0]
+ baseAnchor = markBasePos.BaseArray.BaseRecord[0].BaseAnchor[0]
+ assert baseAnchor.Format == 3
+ assert baseAnchor.XDeviceTable
+ assert baseAnchor.XDeviceTable.DeltaFormat == 0x8000
+ assert not baseAnchor.YDeviceTable
+ assert baseAnchor.XCoordinate == v1
+ assert baseAnchor.YCoordinate == 450
+
+ assert gpos.LookupList.Lookup[1].LookupType == 2 # PairPos
+ pairPos = gpos.LookupList.Lookup[1].SubTable[0]
+ valueRec1 = pairPos.PairSet[0].PairValueRecord[0].Value1
+ assert valueRec1.XAdvDevice
+ assert valueRec1.XAdvDevice.DeltaFormat == 0x8000
+ assert valueRec1.XAdvance == v2
+
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ ({"wght": -1.0, "wdth": -1.0}, (200, -80)), # -60 - 10, +25 + 5
+ ({"wght": -1.0, "wdth": 0.0}, (210, -85)), # -60, +25
+ ({"wght": -1.0, "wdth": 1.0}, (220, -90)), # -60 + 10, +25 - 5
+ ({"wght": 0.0, "wdth": -1.0}, (260, -105)), # -10, +5
+ ({"wght": 0.0, "wdth": 0.0}, (270, -110)),
+ ({"wght": 0.0, "wdth": 1.0}, (280, -115)), # +10, -5
+ ({"wght": 1.0, "wdth": -1.0}, (320, -130)), # +60 - 10, -25 + 5
+ ({"wght": 1.0, "wdth": 0.0}, (330, -135)), # +60, -25
+ ({"wght": 1.0, "wdth": 1.0}, (340, -140)), # +60 + 10, -25 - 5
+ ],
+ )
+ def test_full_instance_GPOS_mark_and_kern(self, varfontGPOS2, location, expected):
+ vf = varfontGPOS2
+ assert "GDEF" in vf
+ assert "GPOS" in vf
+
+ instancer.instantiateOTL(vf, location)
+
+ v1, v2 = expected
+ gdef = vf["GDEF"].table
+ gpos = vf["GPOS"].table
+ assert gdef.Version == 0x00010000
+ assert not hasattr(gdef, "VarStore")
+ assert gdef.GlyphClassDef
+
+ assert gpos.LookupList.Lookup[0].LookupType == 4 # MarkBasePos
+ markBasePos = gpos.LookupList.Lookup[0].SubTable[0]
+ baseAnchor = markBasePos.BaseArray.BaseRecord[0].BaseAnchor[0]
+ assert baseAnchor.Format == 1
+ assert not hasattr(baseAnchor, "XDeviceTable")
+ assert not hasattr(baseAnchor, "YDeviceTable")
+ assert baseAnchor.XCoordinate == v1
+ assert baseAnchor.YCoordinate == 450
+
+ assert gpos.LookupList.Lookup[1].LookupType == 2 # PairPos
+ pairPos = gpos.LookupList.Lookup[1].SubTable[0]
+ valueRec1 = pairPos.PairSet[0].PairValueRecord[0].Value1
+ assert not hasattr(valueRec1, "XAdvDevice")
+ assert valueRec1.XAdvance == v2
+
+
+class InstantiateAvarTest(object):
+ @pytest.mark.parametrize("location", [{"wght": 0.0}, {"wdth": 0.0}])
+ def test_pin_and_drop_axis(self, varfont, location):
+ instancer.instantiateAvar(varfont, location)
+
+ assert set(varfont["avar"].segments).isdisjoint(location)
+
+ def test_full_instance(self, varfont):
+ instancer.instantiateAvar(varfont, {"wght": 0.0, "wdth": 0.0})
+
+ assert "avar" not in varfont
+
+ @staticmethod
+ def quantizeF2Dot14Floats(mapping):
+ return {
+ floatToFixedToFloat(k, 14): floatToFixedToFloat(v, 14)
+ for k, v in mapping.items()
+ }
+
+ # the following values come from NotoSans-VF.ttf
+ DFLT_WGHT_MAPPING = {
+ -1.0: -1.0,
+ -0.6667: -0.7969,
+ -0.3333: -0.5,
+ 0: 0,
+ 0.2: 0.18,
+ 0.4: 0.38,
+ 0.6: 0.61,
+ 0.8: 0.79,
+ 1.0: 1.0,
+ }
+
+ DFLT_WDTH_MAPPING = {-1.0: -1.0, -0.6667: -0.7, -0.3333: -0.36664, 0: 0, 1.0: 1.0}
+
+ @pytest.fixture
+ def varfont(self):
+ fvarAxes = ("wght", (100, 400, 900)), ("wdth", (62.5, 100, 100))
+ avarSegments = {
+ "wght": self.quantizeF2Dot14Floats(self.DFLT_WGHT_MAPPING),
+ "wdth": self.quantizeF2Dot14Floats(self.DFLT_WDTH_MAPPING),
+ }
+ varfont = ttLib.TTFont()
+ varfont["name"] = ttLib.newTable("name")
+ varLib._add_fvar(varfont, _makeDSAxesDict(fvarAxes), instances=())
+ avar = varfont["avar"] = ttLib.newTable("avar")
+ avar.segments = avarSegments
+ return varfont
+
+ @pytest.mark.parametrize(
+ "axisLimits, expectedSegments",
+ [
+ pytest.param(
+ {"wght": (100, 900)},
+ {"wght": DFLT_WGHT_MAPPING, "wdth": DFLT_WDTH_MAPPING},
+ id="wght=100:900",
+ ),
+ pytest.param(
+ {"wght": (400, 900)},
+ {
+ "wght": {
+ -1.0: -1.0,
+ 0: 0,
+ 0.2: 0.18,
+ 0.4: 0.38,
+ 0.6: 0.61,
+ 0.8: 0.79,
+ 1.0: 1.0,
+ },
+ "wdth": DFLT_WDTH_MAPPING,
+ },
+ id="wght=400:900",
+ ),
+ pytest.param(
+ {"wght": (100, 400)},
+ {
+ "wght": {
+ -1.0: -1.0,
+ -0.6667: -0.7969,
+ -0.3333: -0.5,
+ 0: 0,
+ 1.0: 1.0,
+ },
+ "wdth": DFLT_WDTH_MAPPING,
+ },
+ id="wght=100:400",
+ ),
+ pytest.param(
+ {"wght": (400, 800)},
+ {
+ "wght": {
+ -1.0: -1.0,
+ 0: 0,
+ 0.25: 0.22784,
+ 0.50006: 0.48103,
+ 0.75: 0.77214,
+ 1.0: 1.0,
+ },
+ "wdth": DFLT_WDTH_MAPPING,
+ },
+ id="wght=400:800",
+ ),
+ pytest.param(
+ {"wght": (400, 700)},
+ {
+ "wght": {
+ -1.0: -1.0,
+ 0: 0,
+ 0.3334: 0.2951,
+ 0.66675: 0.623,
+ 1.0: 1.0,
+ },
+ "wdth": DFLT_WDTH_MAPPING,
+ },
+ id="wght=400:700",
+ ),
+ pytest.param(
+ {"wght": (400, 600)},
+ {
+ "wght": {-1.0: -1.0, 0: 0, 0.5: 0.47363, 1.0: 1.0},
+ "wdth": DFLT_WDTH_MAPPING,
+ },
+ id="wght=400:600",
+ ),
+ pytest.param(
+ {"wdth": (62.5, 100)},
+ {
+ "wght": DFLT_WGHT_MAPPING,
+ "wdth": {
+ -1.0: -1.0,
+ -0.6667: -0.7,
+ -0.3333: -0.36664,
+ 0: 0,
+ 1.0: 1.0,
+ },
+ },
+ id="wdth=62.5:100",
+ ),
+ pytest.param(
+ {"wdth": (70, 100)},
+ {
+ "wght": DFLT_WGHT_MAPPING,
+ "wdth": {
+ -1.0: -1.0,
+ -0.8334: -0.85364,
+ -0.4166: -0.44714,
+ 0: 0,
+ 1.0: 1.0,
+ },
+ },
+ id="wdth=70:100",
+ ),
+ pytest.param(
+ {"wdth": (75, 100)},
+ {
+ "wght": DFLT_WGHT_MAPPING,
+ "wdth": {-1.0: -1.0, -0.49994: -0.52374, 0: 0, 1.0: 1.0},
+ },
+ id="wdth=75:100",
+ ),
+ pytest.param(
+ {"wdth": (77, 100)},
+ {
+ "wght": DFLT_WGHT_MAPPING,
+ "wdth": {-1.0: -1.0, -0.54346: -0.56696, 0: 0, 1.0: 1.0},
+ },
+ id="wdth=77:100",
+ ),
+ pytest.param(
+ {"wdth": (87.5, 100)},
+ {"wght": DFLT_WGHT_MAPPING, "wdth": {-1.0: -1.0, 0: 0, 1.0: 1.0}},
+ id="wdth=87.5:100",
+ ),
+ ],
+ )
+ def test_limit_axes(self, varfont, axisLimits, expectedSegments):
+ instancer.instantiateAvar(varfont, axisLimits)
+
+ newSegments = varfont["avar"].segments
+ expectedSegments = {
+ axisTag: self.quantizeF2Dot14Floats(mapping)
+ for axisTag, mapping in expectedSegments.items()
+ }
+ assert newSegments == expectedSegments
+
+ @pytest.mark.parametrize(
+ "invalidSegmentMap",
+ [
+ pytest.param({0.5: 0.5}, id="missing-required-maps-1"),
+ pytest.param({-1.0: -1.0, 1.0: 1.0}, id="missing-required-maps-2"),
+ pytest.param(
+ {-1.0: -1.0, 0: 0, 0.5: 0.5, 0.6: 0.4, 1.0: 1.0},
+ id="retrograde-value-maps",
+ ),
+ ],
+ )
+ def test_drop_invalid_segment_map(self, varfont, invalidSegmentMap, caplog):
+ varfont["avar"].segments["wght"] = invalidSegmentMap
+
+ with caplog.at_level(logging.WARNING, logger="fontTools.varLib.instancer"):
+ instancer.instantiateAvar(varfont, {"wght": (100, 400)})
+
+ assert "Invalid avar" in caplog.text
+ assert "wght" not in varfont["avar"].segments
+
+ def test_isValidAvarSegmentMap(self):
+ assert instancer._isValidAvarSegmentMap("FOOO", {})
+ assert instancer._isValidAvarSegmentMap("FOOO", {-1.0: -1.0, 0: 0, 1.0: 1.0})
+ assert instancer._isValidAvarSegmentMap(
+ "FOOO", {-1.0: -1.0, 0: 0, 0.5: 0.5, 1.0: 1.0}
+ )
+ assert instancer._isValidAvarSegmentMap(
+ "FOOO", {-1.0: -1.0, 0: 0, 0.5: 0.5, 0.7: 0.5, 1.0: 1.0}
+ )
+
+
+class InstantiateFvarTest(object):
+ @pytest.mark.parametrize(
+ "location, instancesLeft",
+ [
+ (
+ {"wght": 400.0},
+ ["Regular", "SemiCondensed", "Condensed", "ExtraCondensed"],
+ ),
+ (
+ {"wght": 100.0},
+ ["Thin", "SemiCondensed Thin", "Condensed Thin", "ExtraCondensed Thin"],
+ ),
+ (
+ {"wdth": 100.0},
+ [
+ "Thin",
+ "ExtraLight",
+ "Light",
+ "Regular",
+ "Medium",
+ "SemiBold",
+ "Bold",
+ "ExtraBold",
+ "Black",
+ ],
+ ),
+ # no named instance at pinned location
+ ({"wdth": 90.0}, []),
+ ],
+ )
+ def test_pin_and_drop_axis(self, varfont, location, instancesLeft):
+ instancer.instantiateFvar(varfont, location)
+
+ fvar = varfont["fvar"]
+ assert {a.axisTag for a in fvar.axes}.isdisjoint(location)
+
+ for instance in fvar.instances:
+ assert set(instance.coordinates).isdisjoint(location)
+
+ name = varfont["name"]
+ assert [
+ name.getDebugName(instance.subfamilyNameID) for instance in fvar.instances
+ ] == instancesLeft
+
+ def test_full_instance(self, varfont):
+ instancer.instantiateFvar(varfont, {"wght": 0.0, "wdth": 0.0})
+
+ assert "fvar" not in varfont
+
+
+class InstantiateSTATTest(object):
+ @pytest.mark.parametrize(
+ "location, expected",
+ [
+ ({"wght": 400}, ["Regular", "Condensed", "Upright", "Normal"]),
+ ({"wdth": 100}, ["Thin", "Regular", "Black", "Upright", "Normal"]),
+ ],
+ )
+ def test_pin_and_drop_axis(self, varfont, location, expected):
+ instancer.instantiateSTAT(varfont, location)
+
+ stat = varfont["STAT"].table
+ designAxes = {a.AxisTag for a in stat.DesignAxisRecord.Axis}
+
+ assert designAxes == {"wght", "wdth", "ital"}
+
+ name = varfont["name"]
+ valueNames = []
+ for axisValueTable in stat.AxisValueArray.AxisValue:
+ valueName = name.getDebugName(axisValueTable.ValueNameID)
+ valueNames.append(valueName)
+
+ assert valueNames == expected
+
+ def test_skip_table_no_axis_value_array(self, varfont):
+ varfont["STAT"].table.AxisValueArray = None
+
+ instancer.instantiateSTAT(varfont, {"wght": 100})
+
+ assert len(varfont["STAT"].table.DesignAxisRecord.Axis) == 3
+ assert varfont["STAT"].table.AxisValueArray is None
+
+ def test_skip_table_axis_value_array_empty(self, varfont):
+ varfont["STAT"].table.AxisValueArray.AxisValue = []
+
+ instancer.instantiateSTAT(varfont, {"wght": 100})
+
+ assert len(varfont["STAT"].table.DesignAxisRecord.Axis) == 3
+ assert not varfont["STAT"].table.AxisValueArray.AxisValue
+
+ def test_skip_table_no_design_axes(self, varfont):
+ stat = otTables.STAT()
+ stat.Version = 0x00010001
+ stat.populateDefaults()
+ assert not stat.DesignAxisRecord
+ assert not stat.AxisValueArray
+ varfont["STAT"].table = stat
+
+ instancer.instantiateSTAT(varfont, {"wght": 100})
+
+ assert not varfont["STAT"].table.DesignAxisRecord
+
+ @staticmethod
+ def get_STAT_axis_values(stat):
+ axes = stat.DesignAxisRecord.Axis
+ result = []
+ for axisValue in stat.AxisValueArray.AxisValue:
+ if axisValue.Format == 1:
+ result.append((axes[axisValue.AxisIndex].AxisTag, axisValue.Value))
+ elif axisValue.Format == 3:
+ result.append(
+ (
+ axes[axisValue.AxisIndex].AxisTag,
+ (axisValue.Value, axisValue.LinkedValue),
+ )
+ )
+ elif axisValue.Format == 2:
+ result.append(
+ (
+ axes[axisValue.AxisIndex].AxisTag,
+ (
+ axisValue.RangeMinValue,
+ axisValue.NominalValue,
+ axisValue.RangeMaxValue,
+ ),
+ )
+ )
+ elif axisValue.Format == 4:
+ result.append(
+ tuple(
+ (axes[rec.AxisIndex].AxisTag, rec.Value)
+ for rec in axisValue.AxisValueRecord
+ )
+ )
+ else:
+ raise AssertionError(axisValue.Format)
+ return result
+
+ def test_limit_axes(self, varfont2):
+ instancer.instantiateSTAT(varfont2, {"wght": (400, 500), "wdth": (75, 100)})
+
+ assert len(varfont2["STAT"].table.AxisValueArray.AxisValue) == 5
+ assert self.get_STAT_axis_values(varfont2["STAT"].table) == [
+ ("wght", (400.0, 700.0)),
+ ("wght", 500.0),
+ ("wdth", (93.75, 100.0, 100.0)),
+ ("wdth", (81.25, 87.5, 93.75)),
+ ("wdth", (68.75, 75.0, 81.25)),
+ ]
+
+ def test_limit_axis_value_format_4(self, varfont2):
+ stat = varfont2["STAT"].table
+
+ axisValue = otTables.AxisValue()
+ axisValue.Format = 4
+ axisValue.AxisValueRecord = []
+ for tag, value in (("wght", 575), ("wdth", 90)):
+ rec = otTables.AxisValueRecord()
+ rec.AxisIndex = next(
+ i for i, a in enumerate(stat.DesignAxisRecord.Axis) if a.AxisTag == tag
+ )
+ rec.Value = value
+ axisValue.AxisValueRecord.append(rec)
+ stat.AxisValueArray.AxisValue.append(axisValue)
+
+ instancer.instantiateSTAT(varfont2, {"wght": (100, 600)})
+
+ assert axisValue in varfont2["STAT"].table.AxisValueArray.AxisValue
+
+ instancer.instantiateSTAT(varfont2, {"wdth": (62.5, 87.5)})
+
+ assert axisValue not in varfont2["STAT"].table.AxisValueArray.AxisValue
+
+ def test_unknown_axis_value_format(self, varfont2, caplog):
+ stat = varfont2["STAT"].table
+ axisValue = otTables.AxisValue()
+ axisValue.Format = 5
+ stat.AxisValueArray.AxisValue.append(axisValue)
+
+ with caplog.at_level(logging.WARNING, logger="fontTools.varLib.instancer"):
+ instancer.instantiateSTAT(varfont2, {"wght": 400})
+
+ assert "Unknown AxisValue table format (5)" in caplog.text
+ assert axisValue in varfont2["STAT"].table.AxisValueArray.AxisValue
+
+
+def test_setMacOverlapFlags():
+ flagOverlapCompound = _g_l_y_f.OVERLAP_COMPOUND
+ flagOverlapSimple = _g_l_y_f.flagOverlapSimple
+
+ glyf = ttLib.newTable("glyf")
+ glyf.glyphOrder = ["a", "b", "c"]
+ a = _g_l_y_f.Glyph()
+ a.numberOfContours = 1
+ a.flags = [0]
+ b = _g_l_y_f.Glyph()
+ b.numberOfContours = -1
+ comp = _g_l_y_f.GlyphComponent()
+ comp.flags = 0
+ b.components = [comp]
+ c = _g_l_y_f.Glyph()
+ c.numberOfContours = 0
+ glyf.glyphs = {"a": a, "b": b, "c": c}
+
+ instancer.setMacOverlapFlags(glyf)
+
+ assert a.flags[0] & flagOverlapSimple != 0
+ assert b.components[0].flags & flagOverlapCompound != 0
+
+
+def _strip_ttLibVersion(string):
+ return re.sub(' ttLibVersion=".*"', "", string)
+
+
+@pytest.fixture
+def varfont2():
+ f = ttLib.TTFont(recalcTimestamp=False)
+ f.importXML(os.path.join(TESTDATA, "PartialInstancerTest2-VF.ttx"))
+ return f
+
+
+@pytest.fixture
+def varfont3():
+ f = ttLib.TTFont(recalcTimestamp=False)
+ f.importXML(os.path.join(TESTDATA, "PartialInstancerTest3-VF.ttx"))
+ return f
+
+
+def _dump_ttx(ttFont):
+ # compile to temporary bytes stream, reload and dump to XML
+ tmp = BytesIO()
+ ttFont.save(tmp)
+ tmp.seek(0)
+ ttFont2 = ttLib.TTFont(tmp, recalcBBoxes=False, recalcTimestamp=False)
+ s = StringIO()
+ ttFont2.saveXML(s, newlinestr="\n")
+ return _strip_ttLibVersion(s.getvalue())
+
+
+def _get_expected_instance_ttx(
+ name, *locations, overlap=instancer.OverlapMode.KEEP_AND_SET_FLAGS
+):
+ filename = f"{name}-VF-instance-{','.join(str(loc) for loc in locations)}"
+ if overlap == instancer.OverlapMode.KEEP_AND_DONT_SET_FLAGS:
+ filename += "-no-overlap-flags"
+ elif overlap == instancer.OverlapMode.REMOVE:
+ filename += "-no-overlaps"
+ with open(
+ os.path.join(TESTDATA, "test_results", f"{filename}.ttx"),
+ "r",
+ encoding="utf-8",
+ ) as fp:
+ return _strip_ttLibVersion(fp.read())
+
+
+class InstantiateVariableFontTest(object):
+ @pytest.mark.parametrize(
+ "wght, wdth",
+ [(100, 100), (400, 100), (900, 100), (100, 62.5), (400, 62.5), (900, 62.5)],
+ )
+ def test_multiple_instancing(self, varfont2, wght, wdth):
+ partial = instancer.instantiateVariableFont(varfont2, {"wght": wght})
+ instance = instancer.instantiateVariableFont(partial, {"wdth": wdth})
+
+ expected = _get_expected_instance_ttx("PartialInstancerTest2", wght, wdth)
+
+ assert _dump_ttx(instance) == expected
+
+ def test_default_instance(self, varfont2):
+ instance = instancer.instantiateVariableFont(
+ varfont2, {"wght": None, "wdth": None}
+ )
+
+ expected = _get_expected_instance_ttx("PartialInstancerTest2", 400, 100)
+
+ assert _dump_ttx(instance) == expected
+
+ @pytest.mark.parametrize(
+ "overlap, wght",
+ [
+ (instancer.OverlapMode.KEEP_AND_DONT_SET_FLAGS, 400),
+ (instancer.OverlapMode.REMOVE, 400),
+ (instancer.OverlapMode.REMOVE, 700),
+ ],
+ )
+ def test_overlap(self, varfont3, wght, overlap):
+ pytest.importorskip("pathops")
+
+ location = {"wght": wght}
+
+ instance = instancer.instantiateVariableFont(
+ varfont3, location, overlap=overlap
+ )
+
+ expected = _get_expected_instance_ttx(
+ "PartialInstancerTest3", wght, overlap=overlap
+ )
+
+ assert _dump_ttx(instance) == expected
+
+
+def _conditionSetAsDict(conditionSet, axisOrder):
+ result = {}
+ for cond in conditionSet.ConditionTable:
+ assert cond.Format == 1
+ axisTag = axisOrder[cond.AxisIndex]
+ result[axisTag] = (cond.FilterRangeMinValue, cond.FilterRangeMaxValue)
+ return result
+
+
+def _getSubstitutions(gsub, lookupIndices):
+ subs = {}
+ for index, lookup in enumerate(gsub.LookupList.Lookup):
+ if index in lookupIndices:
+ for subtable in lookup.SubTable:
+ subs.update(subtable.mapping)
+ return subs
+
+
+def makeFeatureVarsFont(conditionalSubstitutions):
+ axes = set()
+ glyphs = set()
+ for region, substitutions in conditionalSubstitutions:
+ for box in region:
+ axes.update(box.keys())
+ glyphs.update(*substitutions.items())
+
+ varfont = ttLib.TTFont()
+ varfont.setGlyphOrder(sorted(glyphs))
+
+ fvar = varfont["fvar"] = ttLib.newTable("fvar")
+ fvar.axes = []
+ for axisTag in sorted(axes):
+ axis = _f_v_a_r.Axis()
+ axis.axisTag = Tag(axisTag)
+ fvar.axes.append(axis)
+
+ featureVars.addFeatureVariations(varfont, conditionalSubstitutions)
+
+ return varfont
+
+
+class InstantiateFeatureVariationsTest(object):
+ @pytest.mark.parametrize(
+ "location, appliedSubs, expectedRecords",
+ [
+ ({"wght": 0}, {}, [({"cntr": (0.75, 1.0)}, {"uni0041": "uni0061"})]),
+ (
+ {"wght": -1.0},
+ {},
+ [
+ ({"cntr": (0, 0.25)}, {"uni0061": "uni0041"}),
+ ({"cntr": (0.75, 1.0)}, {"uni0041": "uni0061"}),
+ ],
+ ),
+ (
+ {"wght": 1.0},
+ {"uni0024": "uni0024.nostroke"},
+ [
+ (
+ {"cntr": (0.75, 1.0)},
+ {"uni0024": "uni0024.nostroke", "uni0041": "uni0061"},
+ )
+ ],
+ ),
+ (
+ {"cntr": 0},
+ {},
+ [
+ ({"wght": (-1.0, -0.45654)}, {"uni0061": "uni0041"}),
+ ({"wght": (0.20886, 1.0)}, {"uni0024": "uni0024.nostroke"}),
+ ],
+ ),
+ (
+ {"cntr": 1.0},
+ {"uni0041": "uni0061"},
+ [
+ (
+ {"wght": (0.20886, 1.0)},
+ {"uni0024": "uni0024.nostroke", "uni0041": "uni0061"},
+ )
+ ],
+ ),
+ ],
+ )
+ def test_partial_instance(self, location, appliedSubs, expectedRecords):
+ font = makeFeatureVarsFont(
+ [
+ ([{"wght": (0.20886, 1.0)}], {"uni0024": "uni0024.nostroke"}),
+ ([{"cntr": (0.75, 1.0)}], {"uni0041": "uni0061"}),
+ (
+ [{"wght": (-1.0, -0.45654), "cntr": (0, 0.25)}],
+ {"uni0061": "uni0041"},
+ ),
+ ]
+ )
+
+ instancer.instantiateFeatureVariations(font, location)
+
+ gsub = font["GSUB"].table
+ featureVariations = gsub.FeatureVariations
+
+ assert featureVariations.FeatureVariationCount == len(expectedRecords)
+
+ axisOrder = [a.axisTag for a in font["fvar"].axes if a.axisTag not in location]
+ for i, (expectedConditionSet, expectedSubs) in enumerate(expectedRecords):
+ rec = featureVariations.FeatureVariationRecord[i]
+ conditionSet = _conditionSetAsDict(rec.ConditionSet, axisOrder)
+
+ assert conditionSet == expectedConditionSet
+
+ subsRecord = rec.FeatureTableSubstitution.SubstitutionRecord[0]
+ lookupIndices = subsRecord.Feature.LookupListIndex
+ substitutions = _getSubstitutions(gsub, lookupIndices)
+
+ assert substitutions == expectedSubs
+
+ appliedLookupIndices = gsub.FeatureList.FeatureRecord[0].Feature.LookupListIndex
+
+ assert _getSubstitutions(gsub, appliedLookupIndices) == appliedSubs
+
+ @pytest.mark.parametrize(
+ "location, appliedSubs",
+ [
+ ({"wght": 0, "cntr": 0}, None),
+ ({"wght": -1.0, "cntr": 0}, {"uni0061": "uni0041"}),
+ ({"wght": 1.0, "cntr": 0}, {"uni0024": "uni0024.nostroke"}),
+ ({"wght": 0.0, "cntr": 1.0}, {"uni0041": "uni0061"}),
+ (
+ {"wght": 1.0, "cntr": 1.0},
+ {"uni0041": "uni0061", "uni0024": "uni0024.nostroke"},
+ ),
+ ({"wght": -1.0, "cntr": 0.3}, None),
+ ],
+ )
+ def test_full_instance(self, location, appliedSubs):
+ font = makeFeatureVarsFont(
+ [
+ ([{"wght": (0.20886, 1.0)}], {"uni0024": "uni0024.nostroke"}),
+ ([{"cntr": (0.75, 1.0)}], {"uni0041": "uni0061"}),
+ (
+ [{"wght": (-1.0, -0.45654), "cntr": (0, 0.25)}],
+ {"uni0061": "uni0041"},
+ ),
+ ]
+ )
+
+ instancer.instantiateFeatureVariations(font, location)
+
+ gsub = font["GSUB"].table
+ assert not hasattr(gsub, "FeatureVariations")
+
+ if appliedSubs:
+ lookupIndices = gsub.FeatureList.FeatureRecord[0].Feature.LookupListIndex
+ assert _getSubstitutions(gsub, lookupIndices) == appliedSubs
+ else:
+ assert not gsub.FeatureList.FeatureRecord
+
+ def test_unsupported_condition_format(self, caplog):
+ font = makeFeatureVarsFont(
+ [
+ (
+ [{"wdth": (-1.0, -0.5), "wght": (0.5, 1.0)}],
+ {"dollar": "dollar.nostroke"},
+ )
+ ]
+ )
+ featureVariations = font["GSUB"].table.FeatureVariations
+ rec1 = featureVariations.FeatureVariationRecord[0]
+ assert len(rec1.ConditionSet.ConditionTable) == 2
+ rec1.ConditionSet.ConditionTable[0].Format = 2
+
+ with caplog.at_level(logging.WARNING, logger="fontTools.varLib.instancer"):
+ instancer.instantiateFeatureVariations(font, {"wdth": 0})
+
+ assert (
+ "Condition table 0 of FeatureVariationRecord 0 "
+ "has unsupported format (2); ignored"
+ ) in caplog.text
+
+ # check that record with unsupported condition format (but whose other
+ # conditions do not reference pinned axes) is kept as is
+ featureVariations = font["GSUB"].table.FeatureVariations
+ assert featureVariations.FeatureVariationRecord[0] is rec1
+ assert len(rec1.ConditionSet.ConditionTable) == 2
+ assert rec1.ConditionSet.ConditionTable[0].Format == 2
+
+ def test_GSUB_FeatureVariations_is_None(self, varfont2):
+ varfont2["GSUB"].table.Version = 0x00010001
+ varfont2["GSUB"].table.FeatureVariations = None
+ tmp = BytesIO()
+ varfont2.save(tmp)
+ varfont = ttLib.TTFont(tmp)
+
+ # DO NOT raise an exception when the optional 'FeatureVariations' attribute is
+ # present but is set to None (e.g. with GSUB 1.1); skip and do nothing.
+ assert varfont["GSUB"].table.FeatureVariations is None
+ instancer.instantiateFeatureVariations(varfont, {"wght": 400, "wdth": 100})
+ assert varfont["GSUB"].table.FeatureVariations is None
+
+
+class LimitTupleVariationAxisRangesTest:
+ def check_limit_single_var_axis_range(self, var, axisTag, axisRange, expected):
+ result = instancer.limitTupleVariationAxisRange(var, axisTag, axisRange)
+ print(result)
+
+ assert len(result) == len(expected)
+ for v1, v2 in zip(result, expected):
+ assert v1.coordinates == pytest.approx(v2.coordinates)
+ assert v1.axes.keys() == v2.axes.keys()
+ for k in v1.axes:
+ p, q = v1.axes[k], v2.axes[k]
+ assert p == pytest.approx(q)
+
+ @pytest.mark.parametrize(
+ "var, axisTag, newMax, expected",
+ [
+ (
+ TupleVariation({"wght": (0.0, 1.0, 1.0)}, [100, 100]),
+ "wdth",
+ 0.5,
+ [TupleVariation({"wght": (0.0, 1.0, 1.0)}, [100, 100])],
+ ),
+ (
+ TupleVariation({"wght": (0.0, 1.0, 1.0)}, [100, 100]),
+ "wght",
+ 0.5,
+ [TupleVariation({"wght": (0.0, 1.0, 1.0)}, [50, 50])],
+ ),
+ (
+ TupleVariation({"wght": (0.0, 1.0, 1.0)}, [100, 100]),
+ "wght",
+ 0.8,
+ [TupleVariation({"wght": (0.0, 1.0, 1.0)}, [80, 80])],
+ ),
+ (
+ TupleVariation({"wght": (0.0, 1.0, 1.0)}, [100, 100]),
+ "wght",
+ 1.0,
+ [TupleVariation({"wght": (0.0, 1.0, 1.0)}, [100, 100])],
+ ),
+ (TupleVariation({"wght": (0.0, 1.0, 1.0)}, [100, 100]), "wght", 0.0, []),
+ (TupleVariation({"wght": (0.5, 1.0, 1.0)}, [100, 100]), "wght", 0.4, []),
+ (
+ TupleVariation({"wght": (0.0, 0.5, 1.0)}, [100, 100]),
+ "wght",
+ 0.5,
+ [TupleVariation({"wght": (0.0, 1.0, 1.0)}, [100, 100])],
+ ),
+ (
+ TupleVariation({"wght": (0.0, 0.5, 1.0)}, [100, 100]),
+ "wght",
+ 0.4,
+ [TupleVariation({"wght": (0.0, 1.0, 1.0)}, [80, 80])],
+ ),
+ (
+ TupleVariation({"wght": (0.0, 0.5, 1.0)}, [100, 100]),
+ "wght",
+ 0.6,
+ [TupleVariation({"wght": (0.0, 0.833334, 1.666667)}, [100, 100])],
+ ),
+ (
+ TupleVariation({"wght": (0.0, 0.2, 1.0)}, [100, 100]),
+ "wght",
+ 0.4,
+ [
+ TupleVariation({"wght": (0.0, 0.5, 1.99994)}, [100, 100]),
+ TupleVariation({"wght": (0.5, 1.0, 1.0)}, [8.33333, 8.33333]),
+ ],
+ ),
+ (
+ TupleVariation({"wght": (0.0, 0.2, 1.0)}, [100, 100]),
+ "wght",
+ 0.5,
+ [TupleVariation({"wght": (0.0, 0.4, 1.99994)}, [100, 100])],
+ ),
+ (
+ TupleVariation({"wght": (0.5, 0.5, 1.0)}, [100, 100]),
+ "wght",
+ 0.5,
+ [TupleVariation({"wght": (1.0, 1.0, 1.0)}, [100, 100])],
+ ),
+ ],
+ )
+ def test_positive_var(self, var, axisTag, newMax, expected):
+ axisRange = instancer.NormalizedAxisRange(0, newMax)
+ self.check_limit_single_var_axis_range(var, axisTag, axisRange, expected)
+
+ @pytest.mark.parametrize(
+ "var, axisTag, newMin, expected",
+ [
+ (
+ TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [100, 100]),
+ "wdth",
+ -0.5,
+ [TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [100, 100])],
+ ),
+ (
+ TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [100, 100]),
+ "wght",
+ -0.5,
+ [TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [50, 50])],
+ ),
+ (
+ TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [100, 100]),
+ "wght",
+ -0.8,
+ [TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [80, 80])],
+ ),
+ (
+ TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [100, 100]),
+ "wght",
+ -1.0,
+ [TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [100, 100])],
+ ),
+ (TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [100, 100]), "wght", 0.0, []),
+ (
+ TupleVariation({"wght": (-1.0, -1.0, -0.5)}, [100, 100]),
+ "wght",
+ -0.4,
+ [],
+ ),
+ (
+ TupleVariation({"wght": (-1.0, -0.5, 0.0)}, [100, 100]),
+ "wght",
+ -0.5,
+ [TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [100, 100])],
+ ),
+ (
+ TupleVariation({"wght": (-1.0, -0.5, 0.0)}, [100, 100]),
+ "wght",
+ -0.4,
+ [TupleVariation({"wght": (-1.0, -1.0, 0.0)}, [80, 80])],
+ ),
+ (
+ TupleVariation({"wght": (-1.0, -0.5, 0.0)}, [100, 100]),
+ "wght",
+ -0.6,
+ [TupleVariation({"wght": (-1.666667, -0.833334, 0.0)}, [100, 100])],
+ ),
+ (
+ TupleVariation({"wght": (-1.0, -0.2, 0.0)}, [100, 100]),
+ "wght",
+ -0.4,
+ [
+ TupleVariation({"wght": (-2.0, -0.5, -0.0)}, [100, 100]),
+ TupleVariation({"wght": (-1.0, -1.0, -0.5)}, [8.33333, 8.33333]),
+ ],
+ ),
+ (
+ TupleVariation({"wght": (-1.0, -0.2, 0.0)}, [100, 100]),
+ "wght",
+ -0.5,
+ [TupleVariation({"wght": (-2.0, -0.4, 0.0)}, [100, 100])],
+ ),
+ (
+ TupleVariation({"wght": (-1.0, -0.5, -0.5)}, [100, 100]),
+ "wght",
+ -0.5,
+ [TupleVariation({"wght": (-1.0, -1.0, -1.0)}, [100, 100])],
+ ),
+ ],
+ )
+ def test_negative_var(self, var, axisTag, newMin, expected):
+ axisRange = instancer.NormalizedAxisRange(newMin, 0)
+ self.check_limit_single_var_axis_range(var, axisTag, axisRange, expected)
+
+
+@pytest.mark.parametrize(
+ "oldRange, newRange, expected",
+ [
+ ((1.0, -1.0), (-1.0, 1.0), None), # invalid oldRange min > max
+ ((0.6, 1.0), (0, 0.5), None),
+ ((-1.0, -0.6), (-0.5, 0), None),
+ ((0.4, 1.0), (0, 0.5), (0.8, 1.0)),
+ ((-1.0, -0.4), (-0.5, 0), (-1.0, -0.8)),
+ ((0.4, 1.0), (0, 0.4), (1.0, 1.0)),
+ ((-1.0, -0.4), (-0.4, 0), (-1.0, -1.0)),
+ ((-0.5, 0.5), (-0.4, 0.4), (-1.0, 1.0)),
+ ((0, 1.0), (-1.0, 0), (0, 0)), # or None?
+ ((-1.0, 0), (0, 1.0), (0, 0)), # or None?
+ ],
+)
+def test_limitFeatureVariationConditionRange(oldRange, newRange, expected):
+ condition = featureVars.buildConditionTable(0, *oldRange)
+
+ result = instancer._limitFeatureVariationConditionRange(
+ condition, instancer.NormalizedAxisRange(*newRange)
+ )
+
+ assert result == expected
+
+
+@pytest.mark.parametrize(
+ "limits, expected",
+ [
+ (["wght=400", "wdth=100"], {"wght": 400, "wdth": 100}),
+ (["wght=400:900"], {"wght": (400, 900)}),
+ (["slnt=11.4"], {"slnt": pytest.approx(11.399994)}),
+ (["ABCD=drop"], {"ABCD": None}),
+ ],
+)
+def test_parseLimits(limits, expected):
+ assert instancer.parseLimits(limits) == expected
+
+
+@pytest.mark.parametrize(
+ "limits", [["abcde=123", "=0", "wght=:", "wght=1:", "wght=abcd", "wght=x:y"]]
+)
+def test_parseLimits_invalid(limits):
+ with pytest.raises(ValueError, match="invalid location format"):
+ instancer.parseLimits(limits)
+
+
+def test_normalizeAxisLimits_tuple(varfont):
+ normalized = instancer.normalizeAxisLimits(varfont, {"wght": (100, 400)})
+ assert normalized == {"wght": (-1.0, 0)}
+
+
+def test_normalizeAxisLimits_unsupported_range(varfont):
+ with pytest.raises(NotImplementedError, match="Unsupported range"):
+ instancer.normalizeAxisLimits(varfont, {"wght": (401, 700)})
+
+
+def test_normalizeAxisLimits_no_avar(varfont):
+ del varfont["avar"]
+
+ normalized = instancer.normalizeAxisLimits(varfont, {"wght": (400, 500)})
+
+ assert normalized["wght"] == pytest.approx((0, 0.2), 1e-4)
+
+
+def test_normalizeAxisLimits_missing_from_fvar(varfont):
+ with pytest.raises(ValueError, match="not present in fvar"):
+ instancer.normalizeAxisLimits(varfont, {"ZZZZ": 1000})
+
+
+def test_sanityCheckVariableTables(varfont):
+ font = ttLib.TTFont()
+ with pytest.raises(ValueError, match="Missing required table fvar"):
+ instancer.sanityCheckVariableTables(font)
+
+ del varfont["glyf"]
+
+ with pytest.raises(ValueError, match="Can't have gvar without glyf"):
+ instancer.sanityCheckVariableTables(varfont)
+
+
+def test_main(varfont, tmpdir):
+ fontfile = str(tmpdir / "PartialInstancerTest-VF.ttf")
+ varfont.save(fontfile)
+ args = [fontfile, "wght=400"]
+
+ # exits without errors
+ assert instancer.main(args) is None
+
+
+def test_main_exit_nonexistent_file(capsys):
+ with pytest.raises(SystemExit):
+ instancer.main([""])
+ captured = capsys.readouterr()
+
+ assert "No such file ''" in captured.err
+
+
+def test_main_exit_invalid_location(varfont, tmpdir, capsys):
+ fontfile = str(tmpdir / "PartialInstancerTest-VF.ttf")
+ varfont.save(fontfile)
+
+ with pytest.raises(SystemExit):
+ instancer.main([fontfile, "wght:100"])
+ captured = capsys.readouterr()
+
+ assert "invalid location format" in captured.err
+
+
+def test_main_exit_multiple_limits(varfont, tmpdir, capsys):
+ fontfile = str(tmpdir / "PartialInstancerTest-VF.ttf")
+ varfont.save(fontfile)
+
+ with pytest.raises(SystemExit):
+ instancer.main([fontfile, "wght=400", "wght=90"])
+ captured = capsys.readouterr()
+
+ assert "Specified multiple limits for the same axis" in captured.err
diff --git a/Tests/varLib/instancer/names_test.py b/Tests/varLib/instancer/names_test.py
new file mode 100644
index 00000000..9774458a
--- /dev/null
+++ b/Tests/varLib/instancer/names_test.py
@@ -0,0 +1,322 @@
+from fontTools.ttLib.tables import otTables
+from fontTools.otlLib.builder import buildStatTable
+from fontTools.varLib import instancer
+
+import pytest
+
+
+def test_pruningUnusedNames(varfont):
+ varNameIDs = instancer.names.getVariationNameIDs(varfont)
+
+ assert varNameIDs == set(range(256, 297 + 1))
+
+ fvar = varfont["fvar"]
+ stat = varfont["STAT"].table
+
+ with instancer.names.pruningUnusedNames(varfont):
+ del fvar.axes[0] # Weight (nameID=256)
+ del fvar.instances[0] # Thin (nameID=258)
+ del stat.DesignAxisRecord.Axis[0] # Weight (nameID=256)
+ del stat.AxisValueArray.AxisValue[0] # Thin (nameID=258)
+
+ assert not any(n for n in varfont["name"].names if n.nameID in {256, 258})
+
+ with instancer.names.pruningUnusedNames(varfont):
+ del varfont["fvar"]
+ del varfont["STAT"]
+
+ assert not any(n for n in varfont["name"].names if n.nameID in varNameIDs)
+ assert "ltag" not in varfont
+
+
+def _test_name_records(varfont, expected, isNonRIBBI, platforms=[0x409]):
+ nametable = varfont["name"]
+ font_names = {
+ (r.nameID, r.platformID, r.platEncID, r.langID): r.toUnicode()
+ for r in nametable.names
+ }
+ for k in expected:
+ if k[-1] not in platforms:
+ continue
+ assert font_names[k] == expected[k]
+
+ font_nameids = set(i[0] for i in font_names)
+ if isNonRIBBI:
+ assert 16 in font_nameids
+ assert 17 in font_nameids
+
+ if "fvar" not in varfont:
+ assert 25 not in font_nameids
+
+
+@pytest.mark.parametrize(
+ "limits, expected, isNonRIBBI",
+ [
+ # Regular
+ (
+ {"wght": 400},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font",
+ (2, 3, 1, 0x409): "Regular",
+ (3, 3, 1, 0x409): "2.001;GOOG;TestVariableFont-Regular",
+ (6, 3, 1, 0x409): "TestVariableFont-Regular",
+ },
+ False,
+ ),
+ # Regular Normal (width axis Normal isn't included since it is elided)
+ (
+ {"wght": 400, "wdth": 100},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font",
+ (2, 3, 1, 0x409): "Regular",
+ (3, 3, 1, 0x409): "2.001;GOOG;TestVariableFont-Regular",
+ (6, 3, 1, 0x409): "TestVariableFont-Regular",
+ },
+ False,
+ ),
+ # Black
+ (
+ {"wght": 900},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font Black",
+ (2, 3, 1, 0x409): "Regular",
+ (3, 3, 1, 0x409): "2.001;GOOG;TestVariableFont-Black",
+ (6, 3, 1, 0x409): "TestVariableFont-Black",
+ (16, 3, 1, 0x409): "Test Variable Font",
+ (17, 3, 1, 0x409): "Black",
+ },
+ True,
+ ),
+ # Thin
+ (
+ {"wght": 100},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font Thin",
+ (2, 3, 1, 0x409): "Regular",
+ (3, 3, 1, 0x409): "2.001;GOOG;TestVariableFont-Thin",
+ (6, 3, 1, 0x409): "TestVariableFont-Thin",
+ (16, 3, 1, 0x409): "Test Variable Font",
+ (17, 3, 1, 0x409): "Thin",
+ },
+ True,
+ ),
+ # Thin Condensed
+ (
+ {"wght": 100, "wdth": 79},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font Thin Condensed",
+ (2, 3, 1, 0x409): "Regular",
+ (3, 3, 1, 0x409): "2.001;GOOG;TestVariableFont-ThinCondensed",
+ (6, 3, 1, 0x409): "TestVariableFont-ThinCondensed",
+ (16, 3, 1, 0x409): "Test Variable Font",
+ (17, 3, 1, 0x409): "Thin Condensed",
+ },
+ True,
+ ),
+ # Condensed with unpinned weights
+ (
+ {"wdth": 79, "wght": instancer.AxisRange(400, 900)},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font Condensed",
+ (2, 3, 1, 0x409): "Regular",
+ (3, 3, 1, 0x409): "2.001;GOOG;TestVariableFont-Condensed",
+ (6, 3, 1, 0x409): "TestVariableFont-Condensed",
+ (16, 3, 1, 0x409): "Test Variable Font",
+ (17, 3, 1, 0x409): "Condensed",
+ },
+ True,
+ ),
+ ],
+)
+def test_updateNameTable_with_registered_axes_ribbi(
+ varfont, limits, expected, isNonRIBBI
+):
+ instancer.names.updateNameTable(varfont, limits)
+ _test_name_records(varfont, expected, isNonRIBBI)
+
+
+def test_updatetNameTable_axis_order(varfont):
+ axes = [
+ dict(
+ tag="wght",
+ name="Weight",
+ values=[
+ dict(value=400, name="Regular"),
+ ],
+ ),
+ dict(
+ tag="wdth",
+ name="Width",
+ values=[
+ dict(value=75, name="Condensed"),
+ ],
+ ),
+ ]
+ nametable = varfont["name"]
+ buildStatTable(varfont, axes)
+ instancer.names.updateNameTable(varfont, {"wdth": 75, "wght": 400})
+ assert nametable.getName(17, 3, 1, 0x409).toUnicode() == "Regular Condensed"
+
+ # Swap the axes so the names get swapped
+ axes[0], axes[1] = axes[1], axes[0]
+
+ buildStatTable(varfont, axes)
+ instancer.names.updateNameTable(varfont, {"wdth": 75, "wght": 400})
+ assert nametable.getName(17, 3, 1, 0x409).toUnicode() == "Condensed Regular"
+
+
+@pytest.mark.parametrize(
+ "limits, expected, isNonRIBBI",
+ [
+ # Regular | Normal
+ (
+ {"wght": 400},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font",
+ (2, 3, 1, 0x409): "Normal",
+ },
+ False,
+ ),
+ # Black | Negreta
+ (
+ {"wght": 900},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font Negreta",
+ (2, 3, 1, 0x409): "Normal",
+ (16, 3, 1, 0x409): "Test Variable Font",
+ (17, 3, 1, 0x409): "Negreta",
+ },
+ True,
+ ),
+ # Black Condensed | Negreta Zhuštěné
+ (
+ {"wght": 900, "wdth": 79},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font Negreta Zhuštěné",
+ (2, 3, 1, 0x409): "Normal",
+ (16, 3, 1, 0x409): "Test Variable Font",
+ (17, 3, 1, 0x409): "Negreta Zhuštěné",
+ },
+ True,
+ ),
+ ],
+)
+def test_updateNameTable_with_multilingual_names(varfont, limits, expected, isNonRIBBI):
+ name = varfont["name"]
+ # langID 0x405 is the Czech Windows langID
+ name.setName("Test Variable Font", 1, 3, 1, 0x405)
+ name.setName("Normal", 2, 3, 1, 0x405)
+ name.setName("Normal", 261, 3, 1, 0x405) # nameID 261=Regular STAT entry
+ name.setName("Negreta", 266, 3, 1, 0x405) # nameID 266=Black STAT entry
+ name.setName("Zhuštěné", 279, 3, 1, 0x405) # nameID 279=Condensed STAT entry
+
+ instancer.names.updateNameTable(varfont, limits)
+ _test_name_records(varfont, expected, isNonRIBBI, platforms=[0x405])
+
+
+def test_updateNameTable_missing_axisValues(varfont):
+ with pytest.raises(ValueError, match="Cannot find Axis Values \['wght=200'\]"):
+ instancer.names.updateNameTable(varfont, {"wght": 200})
+
+
+def test_updateNameTable_missing_stat(varfont):
+ del varfont["STAT"]
+ with pytest.raises(
+ ValueError, match="Cannot update name table since there is no STAT table."
+ ):
+ instancer.names.updateNameTable(varfont, {"wght": 400})
+
+
+@pytest.mark.parametrize(
+ "limits, expected, isNonRIBBI",
+ [
+ # Regular | Normal
+ (
+ {"wght": 400},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font",
+ (2, 3, 1, 0x409): "Italic",
+ (6, 3, 1, 0x409): "TestVariableFont-Italic",
+ },
+ False,
+ ),
+ # Black Condensed Italic
+ (
+ {"wght": 900, "wdth": 79},
+ {
+ (1, 3, 1, 0x409): "Test Variable Font Black Condensed",
+ (2, 3, 1, 0x409): "Italic",
+ (6, 3, 1, 0x409): "TestVariableFont-BlackCondensedItalic",
+ (16, 3, 1, 0x409): "Test Variable Font",
+ (17, 3, 1, 0x409): "Black Condensed Italic",
+ },
+ True,
+ ),
+ ],
+)
+def test_updateNameTable_vf_with_italic_attribute(
+ varfont, limits, expected, isNonRIBBI
+):
+ font_link_axisValue = varfont["STAT"].table.AxisValueArray.AxisValue[4]
+ # Unset ELIDABLE_AXIS_VALUE_NAME flag
+ font_link_axisValue.Flags &= ~instancer.names.ELIDABLE_AXIS_VALUE_NAME
+ font_link_axisValue.ValueNameID = 294 # Roman --> Italic
+
+ instancer.names.updateNameTable(varfont, limits)
+ _test_name_records(varfont, expected, isNonRIBBI)
+
+
+def test_updateNameTable_format4_axisValues(varfont):
+ # format 4 axisValues should dominate the other axisValues
+ stat = varfont["STAT"].table
+
+ axisValue = otTables.AxisValue()
+ axisValue.Format = 4
+ axisValue.Flags = 0
+ varfont["name"].setName("Dominant Value", 297, 3, 1, 0x409)
+ axisValue.ValueNameID = 297
+ axisValue.AxisValueRecord = []
+ for tag, value in (("wght", 900), ("wdth", 79)):
+ rec = otTables.AxisValueRecord()
+ rec.AxisIndex = next(
+ i for i, a in enumerate(stat.DesignAxisRecord.Axis) if a.AxisTag == tag
+ )
+ rec.Value = value
+ axisValue.AxisValueRecord.append(rec)
+ stat.AxisValueArray.AxisValue.append(axisValue)
+
+ instancer.names.updateNameTable(varfont, {"wdth": 79, "wght": 900})
+ expected = {
+ (1, 3, 1, 0x409): "Test Variable Font Dominant Value",
+ (2, 3, 1, 0x409): "Regular",
+ (16, 3, 1, 0x409): "Test Variable Font",
+ (17, 3, 1, 0x409): "Dominant Value",
+ }
+ _test_name_records(varfont, expected, isNonRIBBI=True)
+
+
+def test_updateNameTable_elided_axisValues(varfont):
+ stat = varfont["STAT"].table
+ # set ELIDABLE_AXIS_VALUE_NAME flag for all axisValues
+ for axisValue in stat.AxisValueArray.AxisValue:
+ axisValue.Flags |= instancer.names.ELIDABLE_AXIS_VALUE_NAME
+
+ stat.ElidedFallbackNameID = 266 # Regular --> Black
+ instancer.names.updateNameTable(varfont, {"wght": 400})
+ # Since all axis values are elided, the elided fallback name
+ # must be used to construct the style names. Since we
+ # changed it to Black, we need both a typoSubFamilyName and
+ # the subFamilyName set so it conforms to the RIBBI model.
+ expected = {(2, 3, 1, 0x409): "Regular", (17, 3, 1, 0x409): "Black"}
+ _test_name_records(varfont, expected, isNonRIBBI=True)
+
+
+def test_updateNameTable_existing_subfamily_name_is_not_regular(varfont):
+ # Check the subFamily name will be set to Regular when we update a name
+ # table to a non-RIBBI style and the current subFamily name is a RIBBI
+ # style which isn't Regular.
+ varfont["name"].setName("Bold", 2, 3, 1, 0x409) # subFamily Regular --> Bold
+
+ instancer.names.updateNameTable(varfont, {"wght": 100})
+ expected = {(2, 3, 1, 0x409): "Regular", (17, 3, 1, 0x409): "Thin"}
+ _test_name_records(varfont, expected, isNonRIBBI=True)