aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaibo Huang <hhb@google.com>2019-05-20 12:05:57 -0700
committerandroid-build-merger <android-build-merger@google.com>2019-05-20 12:05:57 -0700
commit9f1c6e1658173bec62072db472b77a3eeae9d45c (patch)
treecfeb5f4e886f8902407dc4c5bab3a88513d0fe55
parent3573c3e336f800513596dce38d86abf12ddb25df (diff)
parent3df2f1b457ebb56ee28ddc85f5c9d324e94de662 (diff)
downloadfonttools-9f1c6e1658173bec62072db472b77a3eeae9d45c.tar.gz
Upgrade fonttools to 3.41.2 am: d648c2a486
am: 3df2f1b457 Change-Id: I91ee6712e67d642dd4e2f441215a7533331dd155
-rw-r--r--Lib/fontTools/__init__.py2
-rw-r--r--Lib/fontTools/afmLib.py64
-rw-r--r--Lib/fontTools/cffLib/__init__.py7
-rw-r--r--Lib/fontTools/cffLib/specializer.py201
-rw-r--r--Lib/fontTools/designspaceLib/__init__.py54
-rw-r--r--Lib/fontTools/feaLib/ast.py6
-rw-r--r--Lib/fontTools/feaLib/builder.py4
-rw-r--r--Lib/fontTools/fontBuilder.py9
-rw-r--r--Lib/fontTools/misc/arrayTools.py6
-rw-r--r--Lib/fontTools/misc/cliTools.py2
-rw-r--r--Lib/fontTools/misc/filenames.py2
-rw-r--r--Lib/fontTools/misc/psCharStrings.py10
-rw-r--r--Lib/fontTools/misc/sstruct.py18
-rw-r--r--Lib/fontTools/otlLib/builder.py25
-rw-r--r--Lib/fontTools/otlLib/maxContextCalc.py101
-rw-r--r--Lib/fontTools/subset/__init__.py64
-rw-r--r--Lib/fontTools/subset/cff.py6
-rw-r--r--Lib/fontTools/svgLib/path/__init__.py8
-rw-r--r--Lib/fontTools/svgLib/path/parser.py2
-rw-r--r--Lib/fontTools/svgLib/path/shapes.py56
-rw-r--r--Lib/fontTools/ttLib/tables/S__i_l_f.py12
-rw-r--r--Lib/fontTools/ttLib/tables/S__i_l_l.py2
-rw-r--r--Lib/fontTools/ttLib/tables/_g_l_y_f.py8
-rw-r--r--Lib/fontTools/ttLib/tables/_g_v_a_r.py11
-rw-r--r--Lib/fontTools/ttLib/tables/_h_e_a_d.py3
-rw-r--r--Lib/fontTools/ttLib/tables/otBase.py1
-rw-r--r--Lib/fontTools/ttLib/tables/otTables.py3
-rw-r--r--Lib/fontTools/ufoLib/filenames.py2
-rw-r--r--Lib/fontTools/varLib/__init__.py177
-rw-r--r--Lib/fontTools/varLib/builder.py1
-rwxr-xr-x[-rw-r--r--]Lib/fontTools/varLib/cff.py533
-rw-r--r--Lib/fontTools/varLib/mutator.py31
-rw-r--r--Lib/fontTools/varLib/varStore.py21
-rw-r--r--Lib/fontTools/voltLib/lexer.py7
-rw-r--r--Lib/fontTools/voltLib/parser.py13
-rw-r--r--Lib/fonttools.egg-info/PKG-INFO88
-rw-r--r--Lib/fonttools.egg-info/SOURCES.txt40
-rw-r--r--METADATA8
-rw-r--r--NEWS.rst58
-rw-r--r--PKG-INFO88
-rw-r--r--README.rst18
-rw-r--r--Tests/cffLib/cffLib_test.py13
-rw-r--r--Tests/cffLib/data/TestOTF.otfbin2308 -> 0 bytes
-rw-r--r--Tests/cffLib/data/TestOTF.ttx325
-rw-r--r--Tests/cffLib/data/TestSparseCFF2VF.ttx1980
-rw-r--r--Tests/cffLib/specializer_test.py32
-rw-r--r--Tests/designspaceLib/designspace_test.py44
-rw-r--r--Tests/feaLib/ast_test.py4
-rw-r--r--Tests/feaLib/data/GPOS_1.ttx47
-rw-r--r--Tests/feaLib/parser_test.py2
-rw-r--r--Tests/fontBuilder/data/test.otf.ttx51
-rw-r--r--Tests/fontBuilder/data/test.ttf.ttx41
-rw-r--r--Tests/fontBuilder/data/test_var.otf.ttx42
-rw-r--r--Tests/fontBuilder/data/test_var.ttf.ttx2
-rw-r--r--Tests/fontBuilder/fontBuilder_test.py110
-rw-r--r--Tests/misc/arrayTools_test.py10
-rw-r--r--Tests/misc/loggingTools_test.py6
-rw-r--r--Tests/otlLib/builder_test.py19
-rw-r--r--Tests/otlLib/data/gpos_91.ttx99
-rw-r--r--Tests/otlLib/data/gsub_51.ttx146
-rw-r--r--Tests/otlLib/data/gsub_52.ttx150
-rw-r--r--Tests/otlLib/data/gsub_71.ttx99
-rw-r--r--Tests/otlLib/maxContextCalc_test.py76
-rw-r--r--Tests/subset/data/TestHVVAR.ttx443
-rw-r--r--Tests/subset/data/expect_HVVAR.ttx166
-rw-r--r--Tests/subset/data/expect_HVVAR_retain_gids.ttx182
-rw-r--r--Tests/subset/data/test_cntrmask_CFF.desub.ttx70
-rw-r--r--Tests/subset/data/test_cntrmask_CFF.ttx417
-rw-r--r--Tests/subset/subset_test.py46
-rw-r--r--Tests/svgLib/path/shapes_test.py95
-rw-r--r--Tests/ttLib/tables/_g_l_y_f_test.py36
-rw-r--r--Tests/varLib/data/TestCFF2VF.otfbin3636 -> 0 bytes
-rw-r--r--Tests/varLib/data/TestSparseCFF2VF.designspace229
-rw-r--r--Tests/varLib/data/TestVVAR.designspace36
-rw-r--r--Tests/varLib/data/master_cff2/TestCFF2_Black.otfbin2272 -> 0 bytes
-rw-r--r--Tests/varLib/data/master_cff2/TestCFF2_Black.ttx518
-rw-r--r--Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.otfbin2300 -> 0 bytes
-rw-r--r--Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.ttx518
-rw-r--r--Tests/varLib/data/master_cff2/TestCFF2_Regular.otfbin2280 -> 0 bytes
-rw-r--r--Tests/varLib/data/master_cff2/TestCFF2_Regular.ttx516
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w0.00.ttx1266
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w1000.00.ttx1266
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w439.00.ttx466
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w440.00.ttx466
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w599.00.ttx487
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w600.00.ttx487
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w669.00.ttx492
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w670.00.ttx492
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w799.00.ttx393
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w800.00.ttx393
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w889.00.ttx473
-rw-r--r--Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w890.00.ttx473
-rw-r--r--Tests/varLib/data/master_ttx_varfont_otf/TestCFF2VF.ttx835
-rw-r--r--Tests/varLib/data/master_vvar_cff2/TestVVAR.0.ttx821
-rw-r--r--Tests/varLib/data/master_vvar_cff2/TestVVAR.1.ttx821
-rw-r--r--Tests/varLib/data/test_results/BuildTestCFF2.ttx20
-rw-r--r--Tests/varLib/data/test_results/TestSparseCFF2VF.ttx1301
-rw-r--r--Tests/varLib/data/test_results/TestVVAR.ttx59
-rw-r--r--Tests/varLib/mutator_test.py13
-rw-r--r--Tests/varLib/varLib_test.py72
-rw-r--r--Tests/voltLib/parser_test.py21
-rw-r--r--requirements.txt2
-rw-r--r--setup.cfg2
-rwxr-xr-xsetup.py2
104 files changed, 18867 insertions, 598 deletions
diff --git a/Lib/fontTools/__init__.py b/Lib/fontTools/__init__.py
index b0b99739..ad773e89 100644
--- a/Lib/fontTools/__init__.py
+++ b/Lib/fontTools/__init__.py
@@ -5,6 +5,6 @@ from fontTools.misc.loggingTools import configLogger
log = logging.getLogger(__name__)
-version = __version__ = "3.39.0"
+version = __version__ = "3.41.2"
__all__ = ["version", "log", "configLogger"]
diff --git a/Lib/fontTools/afmLib.py b/Lib/fontTools/afmLib.py
index e0ccafee..db01d346 100644
--- a/Lib/fontTools/afmLib.py
+++ b/Lib/fontTools/afmLib.py
@@ -9,52 +9,52 @@ from fontTools.misc.py23 import *
import re
# every single line starts with a "word"
-identifierRE = re.compile("^([A-Za-z]+).*")
+identifierRE = re.compile(r"^([A-Za-z]+).*")
# regular expression to parse char lines
charRE = re.compile(
- "(-?\d+)" # charnum
- "\s*;\s*WX\s+" # ; WX
- "(-?\d+)" # width
- "\s*;\s*N\s+" # ; N
- "([.A-Za-z0-9_]+)" # charname
- "\s*;\s*B\s+" # ; B
- "(-?\d+)" # left
- "\s+"
- "(-?\d+)" # bottom
- "\s+"
- "(-?\d+)" # right
- "\s+"
- "(-?\d+)" # top
- "\s*;\s*" # ;
+ r"(-?\d+)" # charnum
+ r"\s*;\s*WX\s+" # ; WX
+ r"(-?\d+)" # width
+ r"\s*;\s*N\s+" # ; N
+ r"([.A-Za-z0-9_]+)" # charname
+ r"\s*;\s*B\s+" # ; B
+ r"(-?\d+)" # left
+ r"\s+"
+ r"(-?\d+)" # bottom
+ r"\s+"
+ r"(-?\d+)" # right
+ r"\s+"
+ r"(-?\d+)" # top
+ r"\s*;\s*" # ;
)
# regular expression to parse kerning lines
kernRE = re.compile(
- "([.A-Za-z0-9_]+)" # leftchar
- "\s+"
- "([.A-Za-z0-9_]+)" # rightchar
- "\s+"
- "(-?\d+)" # value
- "\s*"
+ r"([.A-Za-z0-9_]+)" # leftchar
+ r"\s+"
+ r"([.A-Za-z0-9_]+)" # rightchar
+ r"\s+"
+ r"(-?\d+)" # value
+ r"\s*"
)
# regular expressions to parse composite info lines of the form:
# Aacute 2 ; PCC A 0 0 ; PCC acute 182 211 ;
compositeRE = re.compile(
- "([.A-Za-z0-9_]+)" # char name
- "\s+"
- "(\d+)" # number of parts
- "\s*;\s*"
+ r"([.A-Za-z0-9_]+)" # char name
+ r"\s+"
+ r"(\d+)" # number of parts
+ r"\s*;\s*"
)
componentRE = re.compile(
- "PCC\s+" # PPC
- "([.A-Za-z0-9_]+)" # base char name
- "\s+"
- "(-?\d+)" # x offset
- "\s+"
- "(-?\d+)" # y offset
- "\s*;\s*"
+ r"PCC\s+" # PPC
+ r"([.A-Za-z0-9_]+)" # base char name
+ r"\s+"
+ r"(-?\d+)" # x offset
+ r"\s+"
+ r"(-?\d+)" # y offset
+ r"\s*;\s*"
)
preferredAttributeOrder = [
diff --git a/Lib/fontTools/cffLib/__init__.py b/Lib/fontTools/cffLib/__init__.py
index c1750479..3c5f36df 100644
--- a/Lib/fontTools/cffLib/__init__.py
+++ b/Lib/fontTools/cffLib/__init__.py
@@ -207,6 +207,13 @@ class CFFFontSet(object):
continue
name, attrs, content = element
topDict.fromXML(name, attrs, content)
+
+ if hasattr(topDict, "VarStore") and topDict.FDArray[0].vstore is None:
+ fdArray = topDict.FDArray
+ for fontDict in fdArray:
+ if hasattr(fontDict, "Private"):
+ fontDict.Private.vstore = topDict.VarStore
+
elif name == "GlobalSubrs":
subrCharStringClass = psCharStrings.T2CharString
if not hasattr(self, "GlobalSubrs"):
diff --git a/Lib/fontTools/cffLib/specializer.py b/Lib/fontTools/cffLib/specializer.py
index caf8c3b3..db6e5f3d 100644
--- a/Lib/fontTools/cffLib/specializer.py
+++ b/Lib/fontTools/cffLib/specializer.py
@@ -4,6 +4,7 @@
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
+from fontTools.cffLib import maxStackLimit
def stringToProgram(string):
@@ -26,14 +27,21 @@ def programToString(program):
return ' '.join(str(x) for x in program)
-def programToCommands(program):
+def programToCommands(program, getNumRegions=None):
"""Takes a T2CharString program list and returns list of commands.
Each command is a two-tuple of commandname,arg-list. The commandname might
be empty string if no commandname shall be emitted (used for glyph width,
hintmask/cntrmask argument, as well as stray arguments at the end of the
- program (¯\_(ツ)_/¯)."""
+ program (¯\_(ツ)_/¯).
+ 'getNumRegions' may be None, or a callable object. It must return the
+ number of regions. 'getNumRegions' takes a single argument, vsindex. If
+ the vsindex argument is None, getNumRegions returns the default number
+ of regions for the charstring, else it returns the numRegions for
+ the vsindex."""
width = None
+ seenWidthOp = False
+ vsIndex = None
commands = []
stack = []
it = iter(program)
@@ -42,10 +50,37 @@ def programToCommands(program):
stack.append(token)
continue
- if width is None and token in {'hstem', 'hstemhm', 'vstem', 'vstemhm',
- 'cntrmask', 'hintmask',
- 'hmoveto', 'vmoveto', 'rmoveto',
- 'endchar'}:
+ if token == 'blend':
+ assert getNumRegions is not None
+ numSourceFonts = 1 + getNumRegions(vsIndex)
+ # replace the blend op args on the stack with a single list
+ # containing all the blend op args.
+ numBlendOps = stack[-1] * numSourceFonts + 1
+ # replace first blend op by a list of the blend ops.
+ stack[-numBlendOps:] = [stack[-numBlendOps:]]
+
+ # Check for width.
+ if not seenWidthOp:
+ seenWidthOp = True
+ widthLen = len(stack) - numBlendOps
+ if widthLen and (widthLen % 2):
+ stack.pop(0)
+ elif width is not None:
+ commands.pop(0)
+ width = None
+ # We do NOT add the width to the command list if a blend is seen:
+ # if a blend op exists, this is or will be a CFF2 charstring.
+ continue
+
+ elif token == 'vsindex':
+ vsIndex = stack[-1]
+ assert type(vsIndex) is int
+
+ elif (not seenWidthOp) and token in {'hstem', 'hstemhm', 'vstem', 'vstemhm',
+ 'cntrmask', 'hintmask',
+ 'hmoveto', 'vmoveto', 'rmoveto',
+ 'endchar'}:
+ seenWidthOp = True
parity = token in {'hmoveto', 'vmoveto'}
if stack and (len(stack) % 2) ^ parity:
width = stack.pop(0)
@@ -64,11 +99,23 @@ def programToCommands(program):
return commands
+def _flattenBlendArgs(args):
+ token_list = []
+ for arg in args:
+ if isinstance(arg, list):
+ token_list.extend(arg)
+ token_list.append('blend')
+ else:
+ token_list.append(arg)
+ return token_list
+
def commandsToProgram(commands):
"""Takes a commands list as returned by programToCommands() and converts
it back to a T2CharString program list."""
program = []
for op,args in commands:
+ if any(isinstance(arg, list) for arg in args):
+ args = _flattenBlendArgs(args)
program.extend(args)
if op:
program.append(op)
@@ -203,11 +250,58 @@ class _GeneralizerDecombinerCommandsMap(object):
yield ('rlineto', args)
yield ('rrcurveto', last_args)
+def _convertBlendOpToArgs(blendList):
+ # args is list of blend op args. Since we are supporting
+ # recursive blend op calls, some of these args may also
+ # be a list of blend op args, and need to be converted before
+ # we convert the current list.
+ if any([isinstance(arg, list) for arg in blendList]):
+ args = [i for e in blendList for i in
+ (_convertBlendOpToArgs(e) if isinstance(e,list) else [e]) ]
+ else:
+ args = blendList
+
+ # We now know that blendList contains a blend op argument list, even if
+ # some of the args are lists that each contain a blend op argument list.
+ # Convert from:
+ # [default font arg sequence x0,...,xn] + [delta tuple for x0] + ... + [delta tuple for xn]
+ # to:
+ # [ [x0] + [delta tuple for x0],
+ # ...,
+ # [xn] + [delta tuple for xn] ]
+ numBlends = args[-1]
+ # Can't use args.pop() when the args are being used in a nested list
+ # comprehension. See calling context
+ args = args[:-1]
+
+ numRegions = len(args)//numBlends - 1
+ if not (numBlends*(numRegions + 1) == len(args)):
+ raise ValueError(blendList)
+
+ defaultArgs = [[arg] for arg in args[:numBlends]]
+ deltaArgs = args[numBlends:]
+ numDeltaValues = len(deltaArgs)
+ deltaList = [ deltaArgs[i:i + numRegions] for i in range(0, numDeltaValues, numRegions) ]
+ blend_args = [ a + b for a, b in zip(defaultArgs,deltaList)]
+ return blend_args
def generalizeCommands(commands, ignoreErrors=False):
result = []
mapping = _GeneralizerDecombinerCommandsMap
- for op,args in commands:
+ for op, args in commands:
+ # First, generalize any blend args in the arg list.
+ if any([isinstance(arg, list) for arg in args]):
+ try:
+ args = [n for arg in args for n in (_convertBlendOpToArgs(arg) if isinstance(arg, list) else [arg])]
+ except ValueError:
+ if ignoreErrors:
+ # Store op as data, such that consumers of commands do not have to
+ # deal with incorrect number of arguments.
+ result.append(('', args))
+ result.append(('', [op]))
+ else:
+ raise
+
func = getattr(mapping, op, None)
if not func:
result.append((op,args))
@@ -225,8 +319,8 @@ def generalizeCommands(commands, ignoreErrors=False):
raise
return result
-def generalizeProgram(program, **kwargs):
- return commandsToProgram(generalizeCommands(programToCommands(program), **kwargs))
+def generalizeProgram(program, getNumRegions=None, **kwargs):
+ return commandsToProgram(generalizeCommands(programToCommands(program, getNumRegions), **kwargs))
def _categorizeVector(v):
@@ -267,6 +361,70 @@ def _negateCategory(a):
assert a in '0r'
return a
+def _convertToBlendCmds(args):
+ # return a list of blend commands, and
+ # the remaining non-blended args, if any.
+ num_args = len(args)
+ stack_use = 0
+ new_args = []
+ i = 0
+ while i < num_args:
+ arg = args[i]
+ if not isinstance(arg, list):
+ new_args.append(arg)
+ i += 1
+ stack_use += 1
+ else:
+ prev_stack_use = stack_use
+ # The arg is a tuple of blend values.
+ # These are each (master 0,delta 1..delta n)
+ # Combine as many successive tuples as we can,
+ # up to the max stack limit.
+ num_sources = len(arg)
+ blendlist = [arg]
+ i += 1
+ stack_use += 1 + num_sources # 1 for the num_blends arg
+ while (i < num_args) and isinstance(args[i], list):
+ blendlist.append(args[i])
+ i += 1
+ stack_use += num_sources
+ if stack_use + num_sources > maxStackLimit:
+ # if we are here, max stack is the CFF2 max stack.
+ # I use the CFF2 max stack limit here rather than
+ # the 'maxstack' chosen by the client, as the default
+ # maxstack may have been used unintentionally. For all
+ # the other operators, this just produces a little less
+ # optimization, but here it puts a hard (and low) limit
+ # on the number of source fonts that can be used.
+ break
+ # blendList now contains as many single blend tuples as can be
+ # combined without exceeding the CFF2 stack limit.
+ num_blends = len(blendlist)
+ # append the 'num_blends' default font values
+ blend_args = []
+ for arg in blendlist:
+ blend_args.append(arg[0])
+ for arg in blendlist:
+ blend_args.extend(arg[1:])
+ blend_args.append(num_blends)
+ new_args.append(blend_args)
+ stack_use = prev_stack_use + num_blends
+
+ return new_args
+
+def _addArgs(a, b):
+ if isinstance(b, list):
+ if isinstance(a, list):
+ if len(a) != len(b):
+ raise ValueError()
+ return [_addArgs(va, vb) for va,vb in zip(a, b)]
+ else:
+ a, b = b, a
+ if isinstance(a, list):
+ return [_addArgs(a[0], b)] + a[1:]
+ return a + b
+
+
def specializeCommands(commands,
ignoreErrors=False,
generalizeFirst=True,
@@ -302,6 +460,8 @@ def specializeCommands(commands,
# I have convinced myself that this produces optimal bytecode (except for, possibly
# one byte each time maxstack size prohibits combining.) YMMV, but you'd be wrong. :-)
# A dynamic-programming approach can do the same but would be significantly slower.
+ #
+ # 7. For any args which are blend lists, convert them to a blend command.
# 0. Generalize commands.
@@ -417,12 +577,18 @@ def specializeCommands(commands,
continue
# Merge adjacent hlineto's and vlineto's.
+ # In CFF2 charstrings from variable fonts, each
+ # arg item may be a list of blendable values, one from
+ # each source font.
if (i and op in {'hlineto', 'vlineto'} and
- (op == commands[i-1][0]) and
- (not isinstance(args[0], list))):
+ (op == commands[i-1][0])):
_, other_args = commands[i-1]
assert len(args) == 1 and len(other_args) == 1
- commands[i-1] = (op, [other_args[0]+args[0]])
+ try:
+ new_args = [_addArgs(args[0], other_args[0])]
+ except ValueError:
+ continue
+ commands[i-1] = (op, new_args)
del commands[i]
continue
@@ -534,10 +700,16 @@ def specializeCommands(commands,
commands[i] = op0+op1+'curveto', args
continue
+ # 7. For any series of args which are blend lists, convert the series to a single blend arg.
+ for i in range(len(commands)):
+ op, args = commands[i]
+ if any(isinstance(arg, list) for arg in args):
+ commands[i] = op, _convertToBlendCmds(args)
+
return commands
-def specializeProgram(program, **kwargs):
- return commandsToProgram(specializeCommands(programToCommands(program), **kwargs))
+def specializeProgram(program, getNumRegions=None, **kwargs):
+ return commandsToProgram(specializeCommands(programToCommands(program, getNumRegions), **kwargs))
if __name__ == '__main__':
@@ -554,4 +726,3 @@ if __name__ == '__main__':
assert program == program2
print("Generalized program:"); print(programToString(generalizeProgram(program)))
print("Specialized program:"); print(programToString(specializeProgram(program)))
-
diff --git a/Lib/fontTools/designspaceLib/__init__.py b/Lib/fontTools/designspaceLib/__init__.py
index 4c5be8b4..e40f5edf 100644
--- a/Lib/fontTools/designspaceLib/__init__.py
+++ b/Lib/fontTools/designspaceLib/__init__.py
@@ -755,7 +755,6 @@ class BaseDocReader(LogMixin):
axisObject.labelNames[lang] = tounicode(labelNameElement.text)
self.documentObject.axes.append(axisObject)
self.axisDefaults[axisObject.name] = axisObject.default
- self.documentObject.defaultLoc = self.axisDefaults
def readSources(self):
for sourceCount, sourceElement in enumerate(self.root.findall(".sources/source")):
@@ -998,7 +997,6 @@ class DesignSpaceDocument(LogMixin, AsDictMixin):
self.axes = []
self.rules = []
self.default = None # name of the default master
- self.defaultLoc = None
self.lib = {}
"""Custom data associated with the whole document."""
@@ -1188,10 +1186,7 @@ class DesignSpaceDocument(LogMixin, AsDictMixin):
# Convert the default location from user space to design space before comparing
# it against the SourceDescriptor locations (always in design space).
- default_location_design = {
- axis.name: axis.map_forward(self.defaultLoc[axis.name])
- for axis in self.axes
- }
+ default_location_design = self.newDefaultLocation()
for sourceDescriptor in self.sources:
if sourceDescriptor.location == default_location_design:
@@ -1267,3 +1262,50 @@ class DesignSpaceDocument(LogMixin, AsDictMixin):
newConditions.append(dict(name=cond['name'], minimum=minimum, maximum=maximum))
newConditionSets.append(newConditions)
rule.conditionSets = newConditionSets
+
+ def loadSourceFonts(self, opener, **kwargs):
+ """Ensure SourceDescriptor.font attributes are loaded, and return list of fonts.
+
+ Takes a callable which initializes a new font object (e.g. TTFont, or
+ defcon.Font, etc.) from the SourceDescriptor.path, and sets the
+ SourceDescriptor.font attribute.
+ If the font attribute is already not None, it is not loaded again.
+ Fonts with the same path are only loaded once and shared among SourceDescriptors.
+
+ For example, to load UFO sources using defcon:
+
+ designspace = DesignSpaceDocument.fromfile("path/to/my.designspace")
+ designspace.loadSourceFonts(defcon.Font)
+
+ Or to load masters as FontTools binary fonts, including extra options:
+
+ designspace.loadSourceFonts(ttLib.TTFont, recalcBBoxes=False)
+
+ Args:
+ opener (Callable): takes one required positional argument, the source.path,
+ and an optional list of keyword arguments, and returns a new font object
+ loaded from the path.
+ **kwargs: extra options passed on to the opener function.
+
+ Returns:
+ List of font objects in the order they appear in the sources list.
+ """
+ # we load fonts with the same source.path only once
+ loaded = {}
+ fonts = []
+ for source in self.sources:
+ if source.font is not None: # font already loaded
+ fonts.append(source.font)
+ continue
+ if source.path in loaded:
+ source.font = loaded[source.path]
+ else:
+ if source.path is None:
+ raise DesignSpaceDocumentError(
+ "Designspace source '%s' has no 'path' attribute"
+ % (source.name or "<Unknown>")
+ )
+ source.font = opener(source.path, **kwargs)
+ loaded[source.path] = source.font
+ fonts.append(source.font)
+ return fonts
diff --git a/Lib/fontTools/feaLib/ast.py b/Lib/fontTools/feaLib/ast.py
index 39dc4bcf..1994fc08 100644
--- a/Lib/fontTools/feaLib/ast.py
+++ b/Lib/fontTools/feaLib/ast.py
@@ -1143,6 +1143,12 @@ class ValueRecord(Expression):
elif yAdvance is None and not vertical:
return str(xAdvance)
+ # Make any remaining None value 0 to avoid generating invalid records.
+ x = x or 0
+ y = y or 0
+ xAdvance = xAdvance or 0
+ yAdvance = yAdvance or 0
+
# Try format B, if possible.
if (xPlaDevice is None and yPlaDevice is None and
xAdvDevice is None and yAdvDevice is None):
diff --git a/Lib/fontTools/feaLib/builder.py b/Lib/fontTools/feaLib/builder.py
index 456ae3cc..8880acf1 100644
--- a/Lib/fontTools/feaLib/builder.py
+++ b/Lib/fontTools/feaLib/builder.py
@@ -7,6 +7,7 @@ from fontTools.feaLib.error import FeatureLibError
from fontTools.feaLib.parser import Parser
from fontTools.feaLib.ast import FeatureFile
from fontTools.otlLib import builder as otl
+from fontTools.otlLib.maxContextCalc import maxCtxFont
from fontTools.ttLib import newTable, getTableModule
from fontTools.ttLib.tables import otBase, otTables
from collections import defaultdict, OrderedDict
@@ -137,6 +138,9 @@ class Builder(object):
fontTable.table = table
elif tag in self.font:
del self.font[tag]
+ if (any(tag in self.font for tag in ("GPOS", "GSUB")) and
+ "OS/2" in self.font):
+ self.font["OS/2"].usMaxContext = maxCtxFont(self.font)
if "GDEF" in tables:
gdef = self.buildGDEF()
if gdef:
diff --git a/Lib/fontTools/fontBuilder.py b/Lib/fontTools/fontBuilder.py
index 8854c164..ef14b045 100644
--- a/Lib/fontTools/fontBuilder.py
+++ b/Lib/fontTools/fontBuilder.py
@@ -21,6 +21,7 @@ that works:
fb.setupHorizontalHeader()
fb.setupNameTable(...)
fb.setupOS2()
+ fb.addOpenTypeFeatures(...)
fb.setupPost()
fb.save(...)
@@ -100,9 +101,10 @@ charString = pen.getCharString()
charStrings = {".notdef": charString, "A": charString, "a": charString, ".null": charString}
fb.setupCFF(nameStrings['psName'], {"FullName": nameStrings['psName']}, charStrings, {})
+lsb = {gn: cs.calcBounds(None)[0] for gn, cs in charStrings.items()}
metrics = {}
for gn, advanceWidth in advanceWidths.items():
- metrics[gn] = (advanceWidth, 100) # XXX lsb from glyph
+ metrics[gn] = (advanceWidth, lsb[gn])
fb.setupHorizontalMetrics(metrics)
fb.setupHorizontalHeader(ascent=824, descent=200)
@@ -298,7 +300,7 @@ _OS2Defaults = dict(
sCapHeight = 0,
usDefaultChar = 0, # .notdef
usBreakChar = 32, # space
- usMaxContext = 2, # just kerning
+ usMaxContext = 0,
usLowerOpticalPointSize = 0,
usUpperOpticalPointSize = 0,
)
@@ -690,8 +692,9 @@ class FontBuilder(object):
"""Create a new `post` table and initialize it with default values,
which can be overridden by keyword arguments.
"""
+ isCFF2 = 'CFF2' in self.font
postTable = self._initTableWithValues("post", _postDefaults, values)
- if self.isTTF and keepGlyphNames:
+ if (self.isTTF or isCFF2) and keepGlyphNames:
postTable.formatType = 2.0
postTable.extraNames = []
postTable.mapping = {}
diff --git a/Lib/fontTools/misc/arrayTools.py b/Lib/fontTools/misc/arrayTools.py
index f2cfac83..ed20230c 100644
--- a/Lib/fontTools/misc/arrayTools.py
+++ b/Lib/fontTools/misc/arrayTools.py
@@ -6,6 +6,7 @@
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
+from fontTools.misc.fixedTools import otRound
from numbers import Number
import math
import operator
@@ -20,10 +21,11 @@ def calcBounds(array):
ys = [y for x, y in array]
return min(xs), min(ys), max(xs), max(ys)
-def calcIntBounds(array):
+def calcIntBounds(array, round=otRound):
"""Return the integer bounding rectangle of a 2D points array as a
tuple: (xMin, yMin, xMax, yMax)
- Values are rounded to closest integer.
+ Values are rounded to closest integer towards +Infinity using otRound
+ function by default, unless an optional 'round' function is passed.
"""
return tuple(round(v) for v in calcBounds(array))
diff --git a/Lib/fontTools/misc/cliTools.py b/Lib/fontTools/misc/cliTools.py
index 59ac3be1..8420e3e7 100644
--- a/Lib/fontTools/misc/cliTools.py
+++ b/Lib/fontTools/misc/cliTools.py
@@ -5,7 +5,7 @@ import os
import re
-numberAddedRE = re.compile("#\d+$")
+numberAddedRE = re.compile(r"#\d+$")
def makeOutputFileName(input, outputDir=None, extension=None, overWrite=False):
diff --git a/Lib/fontTools/misc/filenames.py b/Lib/fontTools/misc/filenames.py
index 6cf02e36..260ace4c 100644
--- a/Lib/fontTools/misc/filenames.py
+++ b/Lib/fontTools/misc/filenames.py
@@ -15,7 +15,7 @@ from __future__ import unicode_literals
from fontTools.misc.py23 import basestring, unicode
-illegalCharacters = "\" * + / : < > ? [ \ ] | \0".split(" ")
+illegalCharacters = r"\" * + / : < > ? [ \ ] | \0".split(" ")
illegalCharacters += [chr(i) for i in range(1, 32)]
illegalCharacters += [chr(0x7F)]
reservedFileNames = "CON PRN AUX CLOCK$ NUL A:-Z: COM1".lower().split(" ")
diff --git a/Lib/fontTools/misc/psCharStrings.py b/Lib/fontTools/misc/psCharStrings.py
index 7fc7a26f..a97ec96d 100644
--- a/Lib/fontTools/misc/psCharStrings.py
+++ b/Lib/fontTools/misc/psCharStrings.py
@@ -944,6 +944,16 @@ class T2CharString(object):
self.program = program
self.private = private
self.globalSubrs = globalSubrs if globalSubrs is not None else []
+ self._cur_vsindex = None
+
+ def getNumRegions(self, vsindex=None):
+ pd = self.private
+ assert(pd is not None)
+ if vsindex is not None:
+ self._cur_vsindex = vsindex
+ elif self._cur_vsindex is None:
+ self._cur_vsindex = pd.vsindex if hasattr(pd, 'vsindex') else 0
+ return pd.getNumRegions(self._cur_vsindex)
def __repr__(self):
if self.bytecode is None:
diff --git a/Lib/fontTools/misc/sstruct.py b/Lib/fontTools/misc/sstruct.py
index 528b5e02..6b7e783e 100644
--- a/Lib/fontTools/misc/sstruct.py
+++ b/Lib/fontTools/misc/sstruct.py
@@ -110,20 +110,20 @@ def calcsize(fmt):
# matches "name:formatchar" (whitespace is allowed)
_elementRE = re.compile(
- "\s*" # whitespace
- "([A-Za-z_][A-Za-z_0-9]*)" # name (python identifier)
- "\s*:\s*" # whitespace : whitespace
- "([cbBhHiIlLqQfd]|[0-9]+[ps]|" # formatchar...
- "([0-9]+)\.([0-9]+)(F))" # ...formatchar
- "\s*" # whitespace
- "(#.*)?$" # [comment] + end of string
+ r"\s*" # whitespace
+ r"([A-Za-z_][A-Za-z_0-9]*)" # name (python identifier)
+ r"\s*:\s*" # whitespace : whitespace
+ r"([cbBhHiIlLqQfd]|[0-9]+[ps]|" # formatchar...
+ r"([0-9]+)\.([0-9]+)(F))" # ...formatchar
+ r"\s*" # whitespace
+ r"(#.*)?$" # [comment] + end of string
)
# matches the special struct fmt chars and 'x' (pad byte)
-_extraRE = re.compile("\s*([x@=<>!])\s*(#.*)?$")
+_extraRE = re.compile(r"\s*([x@=<>!])\s*(#.*)?$")
# matches an "empty" string, possibly containing whitespace and/or a comment
-_emptyRE = re.compile("\s*(#.*)?$")
+_emptyRE = re.compile(r"\s*(#.*)?$")
_fixedpointmappings = {
8: "b",
diff --git a/Lib/fontTools/otlLib/builder.py b/Lib/fontTools/otlLib/builder.py
index efe66d53..f8b3ce3b 100644
--- a/Lib/fontTools/otlLib/builder.py
+++ b/Lib/fontTools/otlLib/builder.py
@@ -408,7 +408,8 @@ def buildSinglePos(mapping, glyphMap):
# If a ValueRecord is shared between multiple glyphs, we generate
# a SinglePos format 1 subtable; that is the most compact form.
for key, glyphs in coverages.items():
- if len(glyphs) > 1:
+ # 5 ushorts is the length of introducing another sublookup
+ if len(glyphs) * _getSinglePosValueSize(key) > 5:
format1Mapping = {g: values[key] for g in glyphs}
result.append(buildSinglePosSubtable(format1Mapping, glyphMap))
handled.add(key)
@@ -419,17 +420,18 @@ def buildSinglePos(mapping, glyphMap):
for valueFormat, keys in masks.items():
f2 = [k for k in keys if k not in handled]
if len(f2) > 1:
- format2Mapping = {coverages[k][0]: values[k] for k in f2}
+ format2Mapping = {}
+ for k in f2:
+ format2Mapping.update((g, values[k]) for g in coverages[k])
result.append(buildSinglePosSubtable(format2Mapping, glyphMap))
handled.update(f2)
- # The remaining ValueRecords are singletons in the sense that
- # they are only used by a single glyph, and their valueFormat
- # is unique as well. We encode these in format 1 again.
+ # The remaining ValueRecords are only used by a few glyphs, normally
+ # one. We encode these in format 1 again.
for key, glyphs in coverages.items():
if key not in handled:
- assert len(glyphs) == 1, glyphs
- st = buildSinglePosSubtable({glyphs[0]: values[key]}, glyphMap)
+ for g in glyphs:
+ st = buildSinglePosSubtable({g: values[key]}, glyphMap)
result.append(st)
# When the OpenType layout engine traverses the subtables, it will
@@ -491,6 +493,15 @@ def _makeDeviceTuple(device):
return (device.DeltaFormat, device.StartSize, device.EndSize,
tuple(device.DeltaValue))
+def _getSinglePosValueSize(valueKey):
+ """Returns how many ushorts this valueKey (short form of ValueRecord) takes up"""
+ count = 0
+ for k in valueKey[1:]:
+ if hasattr(k[1], '__len__') and len(k[1]):
+ count += len(k[1][3]) + 3
+ else:
+ count += 1
+ return count
def buildValue(value):
self = ValueRecord()
diff --git a/Lib/fontTools/otlLib/maxContextCalc.py b/Lib/fontTools/otlLib/maxContextCalc.py
new file mode 100644
index 00000000..5659310f
--- /dev/null
+++ b/Lib/fontTools/otlLib/maxContextCalc.py
@@ -0,0 +1,101 @@
+from __future__ import print_function, division, absolute_import, unicode_literals
+
+__all__ = ['maxCtxFont']
+
+
+def maxCtxFont(font):
+ """Calculate the usMaxContext value for an entire font."""
+
+ maxCtx = 0
+ for tag in ('GSUB', 'GPOS'):
+ if tag not in font:
+ continue
+ table = font[tag].table
+ if not table.LookupList:
+ continue
+ for lookup in table.LookupList.Lookup:
+ for st in lookup.SubTable:
+ maxCtx = maxCtxSubtable(maxCtx, tag, lookup.LookupType, st)
+ return maxCtx
+
+
+def maxCtxSubtable(maxCtx, tag, lookupType, st):
+ """Calculate usMaxContext based on a single lookup table (and an existing
+ max value).
+ """
+
+ # single positioning, single / multiple substitution
+ if (tag == 'GPOS' and lookupType == 1) or (
+ tag == 'GSUB' and lookupType in (1, 2, 3)):
+ maxCtx = max(maxCtx, 1)
+
+ # pair positioning
+ elif tag == 'GPOS' and lookupType == 2:
+ maxCtx = max(maxCtx, 2)
+
+ # ligatures
+ elif tag == 'GSUB' and lookupType == 4:
+ for ligatures in st.ligatures.values():
+ for ligature in ligatures:
+ maxCtx = max(maxCtx, ligature.CompCount)
+
+ # context
+ elif (tag == 'GPOS' and lookupType == 7) or (
+ tag == 'GSUB' and lookupType == 5):
+ maxCtx = maxCtxContextualSubtable(
+ maxCtx, st, 'Pos' if tag == 'GPOS' else 'Sub')
+
+ # chained context
+ elif (tag == 'GPOS' and lookupType == 8) or (
+ tag == 'GSUB' and lookupType == 6):
+ maxCtx = maxCtxContextualSubtable(
+ maxCtx, st, 'Pos' if tag == 'GPOS' else 'Sub', 'Chain')
+
+ # extensions
+ elif (tag == 'GPOS' and lookupType == 9) or (
+ tag == 'GSUB' and lookupType == 7):
+ maxCtx = maxCtxSubtable(
+ maxCtx, tag, st.ExtensionLookupType, st.ExtSubTable)
+
+ # reverse-chained context
+ elif tag == 'GSUB' and lookupType == 8:
+ maxCtx = maxCtxContextualRule(maxCtx, st, 'Reverse')
+
+ return maxCtx
+
+
+def maxCtxContextualSubtable(maxCtx, st, ruleType, chain=''):
+ """Calculate usMaxContext based on a contextual feature subtable."""
+
+ if st.Format == 1:
+ for ruleset in getattr(st, '%s%sRuleSet' % (chain, ruleType)):
+ if ruleset is None:
+ continue
+ for rule in getattr(ruleset, '%s%sRule' % (chain, ruleType)):
+ if rule is None:
+ continue
+ maxCtx = maxCtxContextualRule(maxCtx, rule, chain)
+
+ elif st.Format == 2:
+ for ruleset in getattr(st, '%s%sClassSet' % (chain, ruleType)):
+ if ruleset is None:
+ continue
+ for rule in getattr(ruleset, '%s%sClassRule' % (chain, ruleType)):
+ if rule is None:
+ continue
+ maxCtx = maxCtxContextualRule(maxCtx, rule, chain)
+
+ elif st.Format == 3:
+ maxCtx = maxCtxContextualRule(maxCtx, st, chain)
+
+ return maxCtx
+
+
+def maxCtxContextualRule(maxCtx, st, chain):
+ """Calculate usMaxContext based on a contextual feature rule."""
+
+ if not chain:
+ return max(maxCtx, st.GlyphCount)
+ elif chain == 'Reverse':
+ return max(maxCtx, st.GlyphCount + st.LookAheadGlyphCount)
+ return max(maxCtx, st.InputGlyphCount + st.LookAheadGlyphCount)
diff --git a/Lib/fontTools/subset/__init__.py b/Lib/fontTools/subset/__init__.py
index 6e17cc33..efa06c4c 100644
--- a/Lib/fontTools/subset/__init__.py
+++ b/Lib/fontTools/subset/__init__.py
@@ -7,6 +7,7 @@ from fontTools.misc.py23 import *
from fontTools.misc.fixedTools import otRound
from fontTools import ttLib
from fontTools.ttLib.tables import otTables
+from fontTools.otlLib.maxContextCalc import maxCtxFont
from fontTools.pens.basePen import NullPen
from fontTools.misc.loggingTools import Timer
from fontTools.subset.cff import *
@@ -322,6 +323,10 @@ Other font-specific options:
Update the 'OS/2 xAvgCharWidth' field after subsetting.
--no-recalc-average-width
Don't change the 'OS/2 xAvgCharWidth' field. [default]
+ --recalc-max-context
+ Update the 'OS/2 usMaxContext' field after subsetting.
+ --no-recalc-max-context
+ Don't change the 'OS/2 usMaxContext' field. [default]
--font-number=<number>
Select font number for TrueType Collection (.ttc/.otc), starting from 0.
@@ -1789,39 +1794,47 @@ def subset_glyphs(self, s):
self.glyphCount = len(self.variations)
return bool(self.variations)
+def _remap_index_map(s, varidx_map, table_map):
+ map_ = {k:varidx_map[v] for k,v in table_map.mapping.items()}
+ # Emptied glyphs are remapped to:
+ # if GID <= last retained GID, 0/0: delta set for 0/0 is expected to exist & zeros compress well
+ # if GID > last retained GID, major/minor of the last retained glyph: will be optimized out by table compiler
+ last_idx = varidx_map[table_map.mapping[s.last_retained_glyph]]
+ for g,i in s.reverseEmptiedGlyphMap.items():
+ map_[g] = last_idx if i > s.last_retained_order else 0
+ return map_
+
@_add_method(ttLib.getTableClass('HVAR'))
def subset_glyphs(self, s):
table = self.table
- # TODO Update for retain_gids
-
used = set()
+ advIdxes_ = set()
+ retainAdvMap = False
if table.AdvWidthMap:
- if not s.options.retain_gids:
- table.AdvWidthMap.mapping = _dict_subset(table.AdvWidthMap.mapping, s.glyphs)
+ table.AdvWidthMap.mapping = _dict_subset(table.AdvWidthMap.mapping, s.glyphs)
used.update(table.AdvWidthMap.mapping.values())
else:
- assert table.LsbMap is None and table.RsbMap is None, "File a bug."
used.update(s.reverseOrigGlyphMap.values())
+ advIdxes_ = used.copy()
+ retainAdvMap = s.options.retain_gids
if table.LsbMap:
- if not s.options.retain_gids:
- table.LsbMap.mapping = _dict_subset(table.LsbMap.mapping, s.glyphs)
+ table.LsbMap.mapping = _dict_subset(table.LsbMap.mapping, s.glyphs)
used.update(table.LsbMap.mapping.values())
if table.RsbMap:
- if not s.options.retain_gids:
- table.RsbMap.mapping = _dict_subset(table.RsbMap.mapping, s.glyphs)
+ table.RsbMap.mapping = _dict_subset(table.RsbMap.mapping, s.glyphs)
used.update(table.RsbMap.mapping.values())
- varidx_map = varStore.VarStore_subset_varidxes(table.VarStore, used)
+ varidx_map = varStore.VarStore_subset_varidxes(table.VarStore, used, retainFirstMap=retainAdvMap, advIdxes=advIdxes_)
if table.AdvWidthMap:
- table.AdvWidthMap.mapping = {k:varidx_map[v] for k,v in table.AdvWidthMap.mapping.items()}
+ table.AdvWidthMap.mapping = _remap_index_map(s, varidx_map, table.AdvWidthMap)
if table.LsbMap:
- table.LsbMap.mapping = {k:varidx_map[v] for k,v in table.LsbMap.mapping.items()}
+ table.LsbMap.mapping = _remap_index_map(s, varidx_map, table.LsbMap)
if table.RsbMap:
- table.RsbMap.mapping = {k:varidx_map[v] for k,v in table.RsbMap.mapping.items()}
+ table.RsbMap.mapping = _remap_index_map(s, varidx_map, table.RsbMap)
# TODO Return emptiness...
return True
@@ -1831,13 +1844,17 @@ def subset_glyphs(self, s):
table = self.table
used = set()
+ advIdxes_ = set()
+ retainAdvMap = False
if table.AdvHeightMap:
table.AdvHeightMap.mapping = _dict_subset(table.AdvHeightMap.mapping, s.glyphs)
used.update(table.AdvHeightMap.mapping.values())
else:
- assert table.TsbMap is None and table.BsbMap is None and table.VOrgMap is None, "File a bug."
used.update(s.reverseOrigGlyphMap.values())
+ advIdxes_ = used.copy()
+ retainAdvMap = s.options.retain_gids
+
if table.TsbMap:
table.TsbMap.mapping = _dict_subset(table.TsbMap.mapping, s.glyphs)
used.update(table.TsbMap.mapping.values())
@@ -1848,16 +1865,16 @@ def subset_glyphs(self, s):
table.VOrgMap.mapping = _dict_subset(table.VOrgMap.mapping, s.glyphs)
used.update(table.VOrgMap.mapping.values())
- varidx_map = varStore.VarStore_subset_varidxes(table.VarStore, used)
+ varidx_map = varStore.VarStore_subset_varidxes(table.VarStore, used, retainFirstMap=retainAdvMap, advIdxes=advIdxes_)
if table.AdvHeightMap:
- table.AdvHeightMap.mapping = {k:varidx_map[v] for k,v in table.AdvHeightMap.mapping.items()}
+ table.AdvHeightMap.mapping = _remap_index_map(s, varidx_map, table.AdvHeightMap)
if table.TsbMap:
- table.TsbMap.mapping = {k:varidx_map[v] for k,v in table.TsbMap.mapping.items()}
+ table.TsbMap.mapping = _remap_index_map(s, varidx_map, table.TsbMap)
if table.BsbMap:
- table.BsbMap.mapping = {k:varidx_map[v] for k,v in table.BsbMap.mapping.items()}
+ table.BsbMap.mapping = _remap_index_map(s, varidx_map, table.BsbMap)
if table.VOrgMap:
- table.VOrgMap.mapping = {k:varidx_map[v] for k,v in table.VOrgMap.mapping.items()}
+ table.VOrgMap.mapping = _remap_index_map(s, varidx_map, table.VOrgMap)
# TODO Return emptiness...
return True
@@ -2301,6 +2318,7 @@ class Options(object):
self.recalc_timestamp = False # Recalculate font modified timestamp
self.prune_unicode_ranges = True # Clear unused 'ulUnicodeRange' bits
self.recalc_average_width = False # update 'xAvgCharWidth'
+ self.recalc_max_context = False # update 'usMaxContext'
self.canonical_order = None # Order tables as recommended
self.flavor = None # May be 'woff' or 'woff2'
self.with_zopfli = False # use zopfli instead of zlib for WOFF 1.0
@@ -2561,6 +2579,9 @@ class Subsetter(object):
order = font.getReverseGlyphMap()
self.reverseOrigGlyphMap = {g:order[g] for g in self.glyphs_retained}
+ self.reverseEmptiedGlyphMap = {g:order[g] for g in self.glyphs_emptied}
+ self.last_retained_order = max(self.reverseOrigGlyphMap.values())
+ self.last_retained_glyph = font.getGlyphOrder()[self.last_retained_order]
log.info("Retaining %d glyphs", len(self.glyphs_retained))
@@ -2610,6 +2631,11 @@ class Subsetter(object):
if avg_width != font[tag].xAvgCharWidth:
font[tag].xAvgCharWidth = avg_width
log.info("%s xAvgCharWidth updated: %d", tag, avg_width)
+ if self.options.recalc_max_context:
+ max_context = maxCtxFont(font)
+ if max_context != font[tag].usMaxContext:
+ font[tag].usMaxContext = max_context
+ log.info("%s usMaxContext updated: %d", tag, max_context)
clazz = ttLib.getTableClass(tag)
if hasattr(clazz, 'prune_post_subset'):
with timer("prune '%s'" % tag):
diff --git a/Lib/fontTools/subset/cff.py b/Lib/fontTools/subset/cff.py
index 274071e5..fc29f182 100644
--- a/Lib/fontTools/subset/cff.py
+++ b/Lib/fontTools/subset/cff.py
@@ -366,7 +366,7 @@ class StopHintCountEvent(Exception):
class _DesubroutinizingT2Decompiler(psCharStrings.SimpleT2Decompiler):
- stop_hintcount_ops = ("op_hstem", "op_vstem", "op_rmoveto", "op_hmoveto",
+ stop_hintcount_ops = ("op_hintmask", "op_cntrmask", "op_rmoveto", "op_hmoveto",
"op_vmoveto")
def __init__(self, localSubrs, globalSubrs, private=None):
@@ -379,6 +379,10 @@ class _DesubroutinizingT2Decompiler(psCharStrings.SimpleT2Decompiler):
setattr(self, op_name, self.stop_hint_count)
if hasattr(charString, '_desubroutinized'):
+ # If a charstring has already been desubroutinized, we will still
+ # need to execute it if we need to count hints in order to
+ # compute the byte length for mask arguments, and haven't finished
+ # counting hints pairs.
if self.need_hintcount and self.callingStack:
try:
psCharStrings.SimpleT2Decompiler.execute(self, charString)
diff --git a/Lib/fontTools/svgLib/path/__init__.py b/Lib/fontTools/svgLib/path/__init__.py
index 017ff57e..5dd3329c 100644
--- a/Lib/fontTools/svgLib/path/__init__.py
+++ b/Lib/fontTools/svgLib/path/__init__.py
@@ -55,6 +55,10 @@ class SVGPath(object):
# xpath | doesn't seem to reliable work so just walk it
for el in self.root.iter():
pb.add_path_from_element(el)
- for path in pb.paths:
+ original_pen = pen
+ for path, transform in zip(pb.paths, pb.transforms):
+ if transform:
+ pen = TransformPen(original_pen, transform)
+ else:
+ pen = original_pen
parse_path(path, pen)
-
diff --git a/Lib/fontTools/svgLib/path/parser.py b/Lib/fontTools/svgLib/path/parser.py
index ae0aba39..bdf3de0c 100644
--- a/Lib/fontTools/svgLib/path/parser.py
+++ b/Lib/fontTools/svgLib/path/parser.py
@@ -18,7 +18,7 @@ COMMANDS = set('MmZzLlHhVvCcSsQqTtAa')
UPPERCASE = set('MZLHVCSQTA')
COMMAND_RE = re.compile("([MmZzLlHhVvCcSsQqTtAa])")
-FLOAT_RE = re.compile("[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?")
+FLOAT_RE = re.compile(r"[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?")
def _tokenize_path(pathdef):
diff --git a/Lib/fontTools/svgLib/path/shapes.py b/Lib/fontTools/svgLib/path/shapes.py
index a83274e4..4cc633ad 100644
--- a/Lib/fontTools/svgLib/path/shapes.py
+++ b/Lib/fontTools/svgLib/path/shapes.py
@@ -1,3 +1,6 @@
+import re
+
+
def _prefer_non_zero(*args):
for arg in args:
if arg != 0:
@@ -16,12 +19,28 @@ def _strip_xml_ns(tag):
return tag.split('}', 1)[1] if '}' in tag else tag
+def _transform(raw_value):
+ # TODO assumes a 'matrix' transform.
+ # No other transform functions are supported at the moment.
+ # https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform
+ # start simple: if you aren't exactly matrix(...) then no love
+ match = re.match(r'matrix\((.*)\)', raw_value)
+ if not match:
+ raise NotImplementedError
+ matrix = tuple(float(p) for p in re.split(r'\s+|,', match.group(1)))
+ if len(matrix) != 6:
+ raise ValueError('wrong # of terms in %s' % raw_value)
+ return matrix
+
+
class PathBuilder(object):
def __init__(self):
self.paths = []
+ self.transforms = []
def _start_path(self, initial_path=''):
self.paths.append(initial_path)
+ self.transforms.append(None)
def _end_path(self):
self._add('z')
@@ -68,6 +87,25 @@ class PathBuilder(object):
def v(self, y):
self._vhline('v', y)
+ def _line(self, c, x, y):
+ self._add('%s%s,%s' % (c, _ntos(x), _ntos(y)))
+
+ def L(self, x, y):
+ self._line('L', x, y)
+
+ def l(self, x, y):
+ self._line('l', x, y)
+
+ def _parse_line(self, line):
+ x1 = float(line.attrib.get('x1', 0))
+ y1 = float(line.attrib.get('y1', 0))
+ x2 = float(line.attrib.get('x2', 0))
+ y2 = float(line.attrib.get('y2', 0))
+
+ self._start_path()
+ self.M(x1, y1)
+ self.L(x2, y2)
+
def _parse_rect(self, rect):
x = float(rect.attrib.get('x', 0))
y = float(rect.attrib.get('y', 0))
@@ -105,6 +143,10 @@ class PathBuilder(object):
self._start_path('M' + poly.attrib['points'])
self._end_path()
+ def _parse_polyline(self, poly):
+ if 'points' in poly.attrib:
+ self._start_path('M' + poly.attrib['points'])
+
def _parse_circle(self, circle):
cx = float(circle.attrib.get('cx', 0))
cy = float(circle.attrib.get('cy', 0))
@@ -116,10 +158,24 @@ class PathBuilder(object):
self.A(r, r, cx + r, cy, large_arc=1)
self.A(r, r, cx - r, cy, large_arc=1)
+ def _parse_ellipse(self, ellipse):
+ cx = float(ellipse.attrib.get('cx', 0))
+ cy = float(ellipse.attrib.get('cy', 0))
+ rx = float(ellipse.attrib.get('rx'))
+ ry = float(ellipse.attrib.get('ry'))
+
+ # arc doesn't seem to like being a complete shape, draw two halves
+ self._start_path()
+ self.M(cx - rx, cy)
+ self.A(rx, ry, cx + rx, cy, large_arc=1)
+ self.A(rx, ry, cx - rx, cy, large_arc=1)
+
def add_path_from_element(self, el):
tag = _strip_xml_ns(el.tag)
parse_fn = getattr(self, '_parse_%s' % tag.lower(), None)
if not callable(parse_fn):
return False
parse_fn(el)
+ if 'transform' in el.attrib:
+ self.transforms[-1] = _transform(el.attrib['transform'])
return True
diff --git a/Lib/fontTools/ttLib/tables/S__i_l_f.py b/Lib/fontTools/ttLib/tables/S__i_l_f.py
index e68b9b2e..00d5f616 100644
--- a/Lib/fontTools/ttLib/tables/S__i_l_f.py
+++ b/Lib/fontTools/ttLib/tables/S__i_l_f.py
@@ -82,6 +82,12 @@ Silf_pseudomap_format = '''
nPseudo: H
'''
+Silf_pseudomap_format_h = '''
+ >
+ unicode: H
+ nPseudo: H
+'''
+
Silf_classmap_format = '''
>
numClass: H
@@ -219,7 +225,7 @@ def disassemble(aCode):
pc += struct.calcsize(fmt)
return res
-instre = re.compile("^\s*([^(]+)\s*(?:\(([^)]+)\))?")
+instre = re.compile(r"^\s*([^(]+)\s*(?:\(([^)]+)\))?")
def assemble(instrs):
res = b""
for inst in instrs:
@@ -231,7 +237,7 @@ def assemble(instrs):
if m.group(2):
if parmfmt == 0:
continue
- parms = [int(x) for x in re.split(",\s*", m.group(2))]
+ parms = [int(x) for x in re.split(r",\s*", m.group(2))]
if parmfmt == -1:
l = len(parms)
res += struct.pack(("%dB" % (l+1)), l, *parms)
@@ -406,7 +412,7 @@ class Silf(object):
if version >= 3.0:
pseudo = sstruct.unpack(Silf_pseudomap_format, data[8+6*i:14+6*i], _Object())
else:
- pseudo = struct.unpack('>HH', data[8+4*i:12+4*i], _Object())
+ pseudo = sstruct.unpack(Silf_pseudomap_format_h, data[8+4*i:12+4*i], _Object())
self.pMap[pseudo.unicode] = ttFont.getGlyphName(pseudo.nPseudo)
data = data[8 + 6 * numPseudo:]
currpos = (sstruct.calcsize(Silf_part1_format)
diff --git a/Lib/fontTools/ttLib/tables/S__i_l_l.py b/Lib/fontTools/ttLib/tables/S__i_l_l.py
index 4671e137..bf9d83f5 100644
--- a/Lib/fontTools/ttLib/tables/S__i_l_l.py
+++ b/Lib/fontTools/ttLib/tables/S__i_l_l.py
@@ -28,7 +28,7 @@ class table_S__i_l_l(DefaultTable.DefaultTable):
data[i * 8:(i+1) * 8])
offset = int(offset / 8) - (numLangs + 1)
langcode = langcode.replace(b'\000', b'')
- langinfo.append((langcode, numsettings, offset))
+ langinfo.append((langcode.decode("utf-8"), numsettings, offset))
maxsetting = max(maxsetting, offset + numsettings)
data = data[numLangs * 8:]
finfo = []
diff --git a/Lib/fontTools/ttLib/tables/_g_l_y_f.py b/Lib/fontTools/ttLib/tables/_g_l_y_f.py
index b8020ca7..83d5315b 100644
--- a/Lib/fontTools/ttLib/tables/_g_l_y_f.py
+++ b/Lib/fontTools/ttLib/tables/_g_l_y_f.py
@@ -917,8 +917,12 @@ class Glyph(object):
expanding it."""
if not hasattr(self, "data"):
if remove_hinting:
- self.program = ttProgram.Program()
- self.program.fromBytecode([])
+ if self.isComposite():
+ if hasattr(self, "program"):
+ del self.program
+ else:
+ self.program = ttProgram.Program()
+ self.program.fromBytecode([])
# No padding to trim.
return
if not self.data:
diff --git a/Lib/fontTools/ttLib/tables/_g_v_a_r.py b/Lib/fontTools/ttLib/tables/_g_v_a_r.py
index 608b6a2d..f9c9e528 100644
--- a/Lib/fontTools/ttLib/tables/_g_v_a_r.py
+++ b/Lib/fontTools/ttLib/tables/_g_v_a_r.py
@@ -107,8 +107,15 @@ class table__g_v_a_r(DefaultTable.DefaultTable):
glyph = ttFont["glyf"][glyphName]
numPointsInGlyph = self.getNumPoints_(glyph)
gvarData = data[offsetToData + offsets[i] : offsetToData + offsets[i + 1]]
- self.variations[glyphName] = decompileGlyph_(
- numPointsInGlyph, sharedCoords, axisTags, gvarData)
+ try:
+ self.variations[glyphName] = decompileGlyph_(
+ numPointsInGlyph, sharedCoords, axisTags, gvarData)
+ except Exception:
+ log.error(
+ "Failed to decompile deltas for glyph '%s' (%d points)",
+ glyphName, numPointsInGlyph,
+ )
+ raise
@staticmethod
def decompileOffsets_(data, tableFormat, glyphCount):
diff --git a/Lib/fontTools/ttLib/tables/_h_e_a_d.py b/Lib/fontTools/ttLib/tables/_h_e_a_d.py
index 4235acf4..42fbb1d4 100644
--- a/Lib/fontTools/ttLib/tables/_h_e_a_d.py
+++ b/Lib/fontTools/ttLib/tables/_h_e_a_d.py
@@ -4,6 +4,7 @@ from fontTools.misc import sstruct
from fontTools.misc.textTools import safeEval, num2binary, binary2num
from fontTools.misc.timeTools import timestampFromString, timestampToString, timestampNow
from fontTools.misc.timeTools import epoch_diff as mac_epoch_diff # For backward compat
+from fontTools.misc.arrayTools import intRect
from . import DefaultTable
import logging
@@ -63,7 +64,7 @@ class table__h_e_a_d(DefaultTable.DefaultTable):
# For TT-flavored fonts, xMin, yMin, xMax and yMax are set in table__m_a_x_p.recalc().
if 'CFF ' in ttFont:
topDict = ttFont['CFF '].cff.topDictIndex[0]
- self.xMin, self.yMin, self.xMax, self.yMax = topDict.FontBBox
+ self.xMin, self.yMin, self.xMax, self.yMax = intRect(topDict.FontBBox)
if ttFont.recalcTimestamp:
self.modified = timestampNow()
data = sstruct.pack(headFormat, self)
diff --git a/Lib/fontTools/ttLib/tables/otBase.py b/Lib/fontTools/ttLib/tables/otBase.py
index 81ab354e..816f1cd0 100644
--- a/Lib/fontTools/ttLib/tables/otBase.py
+++ b/Lib/fontTools/ttLib/tables/otBase.py
@@ -104,6 +104,7 @@ class BaseTTXConverter(DefaultTable):
tableClass = getattr(otTables, self.tableTag)
self.table = tableClass()
self.table.fromXML(name, attrs, content, font)
+ self.table.populateDefaults()
class OTTableReader(object):
diff --git a/Lib/fontTools/ttLib/tables/otTables.py b/Lib/fontTools/ttLib/tables/otTables.py
index af2a7c6c..737e5615 100644
--- a/Lib/fontTools/ttLib/tables/otTables.py
+++ b/Lib/fontTools/ttLib/tables/otTables.py
@@ -1130,6 +1130,7 @@ class LigatureSubst(FormatSwitchingBaseTable):
lig.LigGlyph = attrs["glyph"]
components = attrs["components"]
lig.Component = components.split(",") if components else []
+ lig.CompCount = len(lig.Component)
ligs.append(lig)
@@ -1495,7 +1496,7 @@ def _buildClasses():
import re
from .otData import otData
- formatPat = re.compile("([A-Za-z0-9]+)Format(\d+)$")
+ formatPat = re.compile(r"([A-Za-z0-9]+)Format(\d+)$")
namespace = globals()
# populate module with classes
diff --git a/Lib/fontTools/ufoLib/filenames.py b/Lib/fontTools/ufoLib/filenames.py
index 98f53b1f..1c5630f0 100644
--- a/Lib/fontTools/ufoLib/filenames.py
+++ b/Lib/fontTools/ufoLib/filenames.py
@@ -6,7 +6,7 @@ from __future__ import absolute_import, unicode_literals
from fontTools.misc.py23 import basestring, unicode
-illegalCharacters = "\" * + / : < > ? [ \ ] | \0".split(" ")
+illegalCharacters = r"\" * + / : < > ? [ \ ] | \0".split(" ")
illegalCharacters += [chr(i) for i in range(1, 32)]
illegalCharacters += [chr(0x7F)]
reservedFileNames = "CON PRN AUX CLOCK$ NUL A:-Z: COM1".lower().split(" ")
diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py
index 0543ee37..db567062 100644
--- a/Lib/fontTools/varLib/__init__.py
+++ b/Lib/fontTools/varLib/__init__.py
@@ -463,46 +463,120 @@ def _merge_TTHinting(font, masterModel, master_ttfs, tolerance=0.5):
var = TupleVariation(support, delta)
cvar.variations.append(var)
+MetricsFields = namedtuple('MetricsFields',
+ ['tableTag', 'metricsTag', 'sb1', 'sb2', 'advMapping', 'vOrigMapping'])
+
+hvarFields = MetricsFields(tableTag='HVAR', metricsTag='hmtx', sb1='LsbMap',
+ sb2='RsbMap', advMapping='AdvWidthMap', vOrigMapping=None)
+
+vvarFields = MetricsFields(tableTag='VVAR', metricsTag='vmtx', sb1='TsbMap',
+ sb2='BsbMap', advMapping='AdvHeightMap', vOrigMapping='VOrgMap')
+
def _add_HVAR(font, masterModel, master_ttfs, axisTags):
+ _add_VHVAR(font, masterModel, master_ttfs, axisTags, hvarFields)
+
+def _add_VVAR(font, masterModel, master_ttfs, axisTags):
+ _add_VHVAR(font, masterModel, master_ttfs, axisTags, vvarFields)
- log.info("Generating HVAR")
+def _add_VHVAR(font, masterModel, master_ttfs, axisTags, tableFields):
+
+ tableTag = tableFields.tableTag
+ assert tableTag not in font
+ log.info("Generating " + tableTag)
+ VHVAR = newTable(tableTag)
+ tableClass = getattr(ot, tableTag)
+ vhvar = VHVAR.table = tableClass()
+ vhvar.Version = 0x00010000
glyphOrder = font.getGlyphOrder()
- hAdvanceDeltasAndSupports = {}
- metricses = [m["hmtx"].metrics for m in master_ttfs]
+ # Build list of source font advance widths for each glyph
+ metricsTag = tableFields.metricsTag
+ advMetricses = [m[metricsTag].metrics for m in master_ttfs]
+
+ # Build list of source font vertical origin coords for each glyph
+ if tableTag == 'VVAR' and 'VORG' in master_ttfs[0]:
+ vOrigMetricses = [m['VORG'].VOriginRecords for m in master_ttfs]
+ defaultYOrigs = [m['VORG'].defaultVertOriginY for m in master_ttfs]
+ vOrigMetricses = list(zip(vOrigMetricses, defaultYOrigs))
+ else:
+ vOrigMetricses = None
+
+ metricsStore, advanceMapping, vOrigMapping = _get_advance_metrics(font,
+ masterModel, master_ttfs, axisTags, glyphOrder, advMetricses,
+ vOrigMetricses)
+
+ vhvar.VarStore = metricsStore
+ if advanceMapping is None:
+ setattr(vhvar, tableFields.advMapping, None)
+ else:
+ setattr(vhvar, tableFields.advMapping, advanceMapping)
+ if vOrigMapping is not None:
+ setattr(vhvar, tableFields.vOrigMapping, vOrigMapping)
+ setattr(vhvar, tableFields.sb1, None)
+ setattr(vhvar, tableFields.sb2, None)
+
+ font[tableTag] = VHVAR
+ return
+
+def _get_advance_metrics(font, masterModel, master_ttfs,
+ axisTags, glyphOrder, advMetricses, vOrigMetricses=None):
+
+ vhAdvanceDeltasAndSupports = {}
+ vOrigDeltasAndSupports = {}
for glyph in glyphOrder:
- hAdvances = [metrics[glyph][0] if glyph in metrics else None for metrics in metricses]
- hAdvanceDeltasAndSupports[glyph] = masterModel.getDeltasAndSupports(hAdvances)
+ vhAdvances = [metrics[glyph][0] if glyph in metrics else None for metrics in advMetricses]
+ vhAdvanceDeltasAndSupports[glyph] = masterModel.getDeltasAndSupports(vhAdvances)
- singleModel = models.allEqual(id(v[1]) for v in hAdvanceDeltasAndSupports.values())
+ singleModel = models.allEqual(id(v[1]) for v in vhAdvanceDeltasAndSupports.values())
+
+ if vOrigMetricses:
+ singleModel = False
+ for glyph in glyphOrder:
+ # We need to supply a vOrigs tuple with non-None default values
+ # for each glyph. vOrigMetricses contains values only for those
+ # glyphs which have a non-default vOrig.
+ vOrigs = [metrics[glyph] if glyph in metrics else defaultVOrig
+ for metrics, defaultVOrig in vOrigMetricses]
+ vOrigDeltasAndSupports[glyph] = masterModel.getDeltasAndSupports(vOrigs)
directStore = None
if singleModel:
# Build direct mapping
-
- supports = next(iter(hAdvanceDeltasAndSupports.values()))[1][1:]
+ supports = next(iter(vhAdvanceDeltasAndSupports.values()))[1][1:]
varTupleList = builder.buildVarRegionList(supports, axisTags)
varTupleIndexes = list(range(len(supports)))
varData = builder.buildVarData(varTupleIndexes, [], optimize=False)
for glyphName in glyphOrder:
- varData.addItem(hAdvanceDeltasAndSupports[glyphName][0])
+ varData.addItem(vhAdvanceDeltasAndSupports[glyphName][0])
varData.optimize()
directStore = builder.buildVarStore(varTupleList, [varData])
# Build optimized indirect mapping
storeBuilder = varStore.OnlineVarStoreBuilder(axisTags)
- mapping = {}
+ advMapping = {}
for glyphName in glyphOrder:
- deltas,supports = hAdvanceDeltasAndSupports[glyphName]
+ deltas, supports = vhAdvanceDeltasAndSupports[glyphName]
storeBuilder.setSupports(supports)
- mapping[glyphName] = storeBuilder.storeDeltas(deltas)
+ advMapping[glyphName] = storeBuilder.storeDeltas(deltas)
+
+ if vOrigMetricses:
+ vOrigMap = {}
+ for glyphName in glyphOrder:
+ deltas, supports = vOrigDeltasAndSupports[glyphName]
+ storeBuilder.setSupports(supports)
+ vOrigMap[glyphName] = storeBuilder.storeDeltas(deltas)
+
indirectStore = storeBuilder.finish()
mapping2 = indirectStore.optimize()
- mapping = [mapping2[mapping[g]] for g in glyphOrder]
- advanceMapping = builder.buildVarIdxMap(mapping, glyphOrder)
+ advMapping = [mapping2[advMapping[g]] for g in glyphOrder]
+ advanceMapping = builder.buildVarIdxMap(advMapping, glyphOrder)
+
+ if vOrigMetricses:
+ vOrigMap = [mapping2[vOrigMap[g]] for g in glyphOrder]
- use_direct = False
+ useDirect = False
+ vOrigMapping = None
if directStore:
# Compile both, see which is more compact
@@ -515,20 +589,17 @@ def _add_HVAR(font, masterModel, master_ttfs, axisTags):
advanceMapping.compile(writer, font)
indirectSize = len(writer.getAllData())
- use_direct = directSize < indirectSize
-
- # Done; put it all together.
- assert "HVAR" not in font
- HVAR = font["HVAR"] = newTable('HVAR')
- hvar = HVAR.table = ot.HVAR()
- hvar.Version = 0x00010000
- hvar.LsbMap = hvar.RsbMap = None
- if use_direct:
- hvar.VarStore = directStore
- hvar.AdvWidthMap = None
+ useDirect = directSize < indirectSize
+
+ if useDirect:
+ metricsStore = directStore
+ advanceMapping = None
else:
- hvar.VarStore = indirectStore
- hvar.AdvWidthMap = advanceMapping
+ metricsStore = indirectStore
+ if vOrigMetricses:
+ vOrigMapping = builder.buildVarIdxMap(vOrigMap, glyphOrder)
+
+ return metricsStore, advanceMapping, vOrigMapping
def _add_MVAR(font, masterModel, master_ttfs, axisTags):
@@ -688,12 +759,11 @@ _DesignSpaceData = namedtuple(
def _add_CFF2(varFont, model, master_fonts):
- from .cff import (convertCFFtoCFF2, addCFFVarStore, merge_region_fonts)
+ from .cff import (convertCFFtoCFF2, merge_region_fonts)
glyphOrder = varFont.getGlyphOrder()
convertCFFtoCFF2(varFont)
ordered_fonts_list = model.reorderMasters(master_fonts, model.reverseMapping)
# re-ordering the master list simplifies building the CFF2 data item lists.
- addCFFVarStore(varFont, model) # Add VarStore to the CFF2 font.
merge_region_fonts(varFont, model, ordered_fonts_list, glyphOrder)
@@ -840,6 +910,8 @@ def build(designspace, master_finder=lambda s:s, exclude=[], optimize=True):
_add_MVAR(vf, model, master_fonts, axisTags)
if 'HVAR' not in exclude:
_add_HVAR(vf, model, master_fonts, axisTags)
+ if 'VVAR' not in exclude and 'vmtx' in vf:
+ _add_VVAR(vf, model, master_fonts, axisTags)
if 'GDEF' not in exclude or 'GPOS' not in exclude:
_merge_OTL(vf, model, master_fonts, axisTags)
if 'gvar' not in exclude and 'glyf' in vf:
@@ -850,6 +922,13 @@ def build(designspace, master_finder=lambda s:s, exclude=[], optimize=True):
_add_GSUB_feature_variations(vf, ds.axes, ds.internal_axis_supports, ds.rules)
if 'CFF2' not in exclude and 'CFF ' in vf:
_add_CFF2(vf, model, master_fonts)
+ if "post" in vf:
+ # set 'post' to format 2 to keep the glyph names dropped from CFF2
+ post = vf["post"]
+ if post.formatType != 2.0:
+ post.formatType = 2.0
+ post.extraNames = []
+ post.mapping = {}
for tag in exclude:
if tag in vf:
@@ -859,7 +938,7 @@ def build(designspace, master_finder=lambda s:s, exclude=[], optimize=True):
return vf, model, master_ttfs
-def _open_font(path, master_finder):
+def _open_font(path, master_finder=lambda s: s):
# load TTFont masters from given 'path': this can be either a .TTX or an
# OpenType binary font; or if neither of these, try use the 'master_finder'
# callable to resolve the path to a valid .TTX or OpenType font binary.
@@ -893,35 +972,17 @@ def load_masters(designspace, master_finder=lambda s: s):
Return list of master TTFont objects in the same order they are listed in the
DesignSpaceDocument.
"""
- master_fonts = []
-
for master in designspace.sources:
- # 1. If the caller already supplies a TTFont for a source, just take it.
- if master.font:
- font = master.font
- master_fonts.append(font)
- else:
- # If a SourceDescriptor has a layer name, demand that the compiled TTFont
- # be supplied by the caller. This spares us from modifying MasterFinder.
- if master.layerName:
- raise AttributeError(
- "Designspace source '%s' specified a layer name but lacks the "
- "required TTFont object in the 'font' attribute."
- % (master.name or "<Unknown>")
+ # If a SourceDescriptor has a layer name, demand that the compiled TTFont
+ # be supplied by the caller. This spares us from modifying MasterFinder.
+ if master.layerName and master.font is None:
+ raise AttributeError(
+ "Designspace source '%s' specified a layer name but lacks the "
+ "required TTFont object in the 'font' attribute."
+ % (master.name or "<Unknown>")
)
- else:
- if master.path is None:
- raise AttributeError(
- "Designspace source '%s' has neither 'font' nor 'path' "
- "attributes" % (master.name or "<Unknown>")
- )
- # 2. A SourceDescriptor's path might point an OpenType binary, a
- # TTX file, or another source file (e.g. UFO), in which case we
- # resolve the path using 'master_finder' function
- master.font = font = _open_font(master.path, master_finder)
- master_fonts.append(font)
-
- return master_fonts
+
+ return designspace.loadSourceFonts(_open_font, master_finder=master_finder)
class MasterFinder(object):
diff --git a/Lib/fontTools/varLib/builder.py b/Lib/fontTools/varLib/builder.py
index e923b800..43fb92a1 100644
--- a/Lib/fontTools/varLib/builder.py
+++ b/Lib/fontTools/varLib/builder.py
@@ -15,7 +15,6 @@ def buildVarRegion(support, axisTags):
self.VarRegionAxis = []
for tag in axisTags:
self.VarRegionAxis.append(buildVarRegionAxis(support.get(tag, (0,0,0))))
- self.VarRegionAxisCount = len(self.VarRegionAxis)
return self
def buildVarRegionList(supports, axisTags):
diff --git a/Lib/fontTools/varLib/cff.py b/Lib/fontTools/varLib/cff.py
index a000dd48..a8da2145 100644..100755
--- a/Lib/fontTools/varLib/cff.py
+++ b/Lib/fontTools/varLib/cff.py
@@ -1,7 +1,5 @@
+from collections import namedtuple
import os
-from fontTools.misc.py23 import BytesIO
-from fontTools.misc.psCharStrings import T2CharString, T2OutlineExtractor
-from fontTools.pens.t2CharStringPen import T2CharStringPen, t2c_round
from fontTools.cffLib import (
maxStackLimit,
TopDictIndex,
@@ -14,20 +12,21 @@ from fontTools.cffLib import (
FontDict,
VarStoreData
)
-from fontTools.cffLib.specializer import (commandsToProgram, specializeCommands)
+from fontTools.misc.py23 import BytesIO
+from fontTools.cffLib.specializer import (
+ specializeCommands, commandsToProgram)
from fontTools.ttLib import newTable
from fontTools import varLib
from fontTools.varLib.models import allEqual
+from fontTools.misc.psCharStrings import T2CharString, T2OutlineExtractor
+from fontTools.pens.t2CharStringPen import T2CharStringPen, t2c_round
-def addCFFVarStore(varFont, varModel):
- supports = varModel.supports[1:]
+def addCFFVarStore(varFont, varModel, varDataList, masterSupports):
fvarTable = varFont['fvar']
axisKeys = [axis.axisTag for axis in fvarTable.axes]
- varTupleList = varLib.builder.buildVarRegionList(supports, axisKeys)
- varTupleIndexes = list(range(len(supports)))
- varDeltasCFFV = varLib.builder.buildVarData(varTupleIndexes, None, False)
- varStoreCFFV = varLib.builder.buildVarStore(varTupleList, [varDeltasCFFV])
+ varTupleList = varLib.builder.buildVarRegionList(masterSupports, axisKeys)
+ varStoreCFFV = varLib.builder.buildVarStore(varTupleList, varDataList)
topDict = varFont['CFF2'].cff.topDictIndex[0]
topDict.VarStore = VarStoreData(otVarStore=varStoreCFFV)
@@ -143,16 +142,61 @@ pd_blend_fields = ("BlueValues", "OtherBlues", "FamilyBlues",
"StemSnapV")
-def merge_PrivateDicts(topDict, region_top_dicts, num_masters, var_model):
+def get_private(regionFDArrays, fd_index, ri, fd_map):
+ region_fdArray = regionFDArrays[ri]
+ region_fd_map = fd_map[fd_index]
+ if ri in region_fd_map:
+ region_fdIndex = region_fd_map[ri]
+ private = region_fdArray[region_fdIndex].Private
+ else:
+ private = None
+ return private
+
+
+def merge_PrivateDicts(top_dicts, vsindex_dict, var_model, fd_map):
+ """
+ I step through the FontDicts in the FDArray of the varfont TopDict.
+ For each varfont FontDict:
+ step through each key in FontDict.Private.
+ For each key, step through each relevant source font Private dict, and
+ build a list of values to blend.
+ The 'relevant' source fonts are selected by first getting the right
+ submodel using model_keys[vsindex]. The indices of the
+ subModel.locations are mapped to source font list indices by
+ assuming the latter order is the same as the order of the
+ var_model.locations. I can then get the index of each subModel
+ location in the list of var_model.locations.
+ """
+
+ topDict = top_dicts[0]
+ region_top_dicts = top_dicts[1:]
if hasattr(region_top_dicts[0], 'FDArray'):
regionFDArrays = [fdTopDict.FDArray for fdTopDict in region_top_dicts]
else:
regionFDArrays = [[fdTopDict] for fdTopDict in region_top_dicts]
for fd_index, font_dict in enumerate(topDict.FDArray):
private_dict = font_dict.Private
- pds = [private_dict] + [
- regionFDArray[fd_index].Private for regionFDArray in regionFDArrays
- ]
+ vsindex = getattr(private_dict, 'vsindex', 0)
+ # At the moment, no PrivateDict has a vsindex key, but let's support
+ # how it should work. See comment at end of
+ # merge_charstrings() - still need to optimize use of vsindex.
+ sub_model, model_keys = vsindex_dict[vsindex]
+ master_indices = []
+ for loc in sub_model.locations[1:]:
+ i = var_model.locations.index(loc) - 1
+ master_indices.append(i)
+ pds = [private_dict]
+ last_pd = private_dict
+ for ri in master_indices:
+ pd = get_private(regionFDArrays, fd_index, ri, fd_map)
+ # If the region font doesn't have this FontDict, just reference
+ # the last one used.
+ if pd is None:
+ pd = last_pd
+ else:
+ last_pd = pd
+ pds.append(pd)
+ num_masters = len(pds)
for key, value in private_dict.rawDict.items():
if key not in pd_blend_fields:
continue
@@ -192,7 +236,7 @@ def merge_PrivateDicts(topDict, region_top_dicts, num_masters, var_model):
if (not any_points_differ) and not allEqual(rel_list):
any_points_differ = True
prev_val_list = val_list
- deltas = var_model.getDeltas(rel_list)
+ deltas = sub_model.getDeltas(rel_list)
# Convert numbers with no decimal part to an int.
deltas = [conv_to_int(delta) for delta in deltas]
# For PrivateDict BlueValues, the default font
@@ -206,61 +250,159 @@ def merge_PrivateDicts(topDict, region_top_dicts, num_masters, var_model):
else:
values = [pd.rawDict[key] for pd in pds]
if not allEqual(values):
- dataList = var_model.getDeltas(values)
+ dataList = sub_model.getDeltas(values)
else:
dataList = values[0]
private_dict.rawDict[key] = dataList
+def getfd_map(varFont, fonts_list):
+ """ Since a subset source font may have fewer FontDicts in their
+ FDArray than the default font, we have to match up the FontDicts in
+ the different fonts . We do this with the FDSelect array, and by
+ assuming that the same glyph will reference matching FontDicts in
+ each source font. We return a mapping from fdIndex in the default
+ font to a dictionary which maps each master list index of each
+ region font to the equivalent fdIndex in the region font."""
+ fd_map = {}
+ default_font = fonts_list[0]
+ region_fonts = fonts_list[1:]
+ num_regions = len(region_fonts)
+ topDict = default_font['CFF '].cff.topDictIndex[0]
+ if not hasattr(topDict, 'FDSelect'):
+ fd_map[0] = [0]*num_regions
+ return fd_map
+
+ gname_mapping = {}
+ default_fdSelect = topDict.FDSelect
+ glyphOrder = default_font.getGlyphOrder()
+ for gid, fdIndex in enumerate(default_fdSelect):
+ gname_mapping[glyphOrder[gid]] = fdIndex
+ if fdIndex not in fd_map:
+ fd_map[fdIndex] = {}
+ for ri, region_font in enumerate(region_fonts):
+ region_glyphOrder = region_font.getGlyphOrder()
+ region_topDict = region_font['CFF '].cff.topDictIndex[0]
+ if not hasattr(region_topDict, 'FDSelect'):
+ # All the glyphs share the same FontDict. Pick any glyph.
+ default_fdIndex = gname_mapping[region_glyphOrder[0]]
+ fd_map[default_fdIndex][ri] = 0
+ else:
+ region_fdSelect = region_topDict.FDSelect
+ for gid, fdIndex in enumerate(region_fdSelect):
+ default_fdIndex = gname_mapping[region_glyphOrder[gid]]
+ region_map = fd_map[default_fdIndex]
+ if ri not in region_map:
+ region_map[ri] = fdIndex
+ return fd_map
+
+
+CVarData = namedtuple('CVarData', 'varDataList masterSupports vsindex_dict')
def merge_region_fonts(varFont, model, ordered_fonts_list, glyphOrder):
topDict = varFont['CFF2'].cff.topDictIndex[0]
- default_charstrings = topDict.CharStrings
- region_fonts = ordered_fonts_list[1:]
- region_top_dicts = [
- ttFont['CFF '].cff.topDictIndex[0] for ttFont in region_fonts
- ]
+ top_dicts = [topDict] + [
+ ttFont['CFF '].cff.topDictIndex[0]
+ for ttFont in ordered_fonts_list[1:]
+ ]
num_masters = len(model.mapping)
- merge_PrivateDicts(topDict, region_top_dicts, num_masters, model)
- merge_charstrings(default_charstrings,
- glyphOrder,
- num_masters,
- region_top_dicts, model)
-
-
-def merge_charstrings(default_charstrings,
- glyphOrder,
- num_masters,
- region_top_dicts,
- var_model):
- for gname in glyphOrder:
- default_charstring = default_charstrings[gname]
+ cvData = merge_charstrings(glyphOrder, num_masters, top_dicts, model)
+ fd_map = getfd_map(varFont, ordered_fonts_list)
+ merge_PrivateDicts(top_dicts, cvData.vsindex_dict, model, fd_map)
+ addCFFVarStore(varFont, model, cvData.varDataList,
+ cvData.masterSupports)
+
+
+def _get_cs(charstrings, glyphName):
+ if glyphName not in charstrings:
+ return None
+ return charstrings[glyphName]
+
+
+def merge_charstrings(glyphOrder, num_masters, top_dicts, masterModel):
+
+ vsindex_dict = {}
+ vsindex_by_key = {}
+ varDataList = []
+ masterSupports = []
+ default_charstrings = top_dicts[0].CharStrings
+ for gid, gname in enumerate(glyphOrder):
+ all_cs = [
+ _get_cs(td.CharStrings, gname)
+ for td in top_dicts]
+ if len([gs for gs in all_cs if gs is not None]) == 1:
+ continue
+ model, model_cs = masterModel.getSubModel(all_cs)
+ # create the first pass CFF2 charstring, from
+ # the default charstring.
+ default_charstring = model_cs[0]
var_pen = CFF2CharStringMergePen([], gname, num_masters, 0)
- default_charstring.outlineExtractor = CFFToCFF2OutlineExtractor
+ # We need to override outlineExtractor because these
+ # charstrings do have widths in the 'program'; we need to drop these
+ # values rather than post assertion error for them.
+ default_charstring.outlineExtractor = MergeOutlineExtractor
default_charstring.draw(var_pen)
- for region_idx, region_td in enumerate(region_top_dicts, start=1):
- region_charstrings = region_td.CharStrings
- region_charstring = region_charstrings[gname]
+
+ # Add the coordinates from all the other regions to the
+ # blend lists in the CFF2 charstring.
+ region_cs = model_cs[1:]
+ for region_idx, region_charstring in enumerate(region_cs, start=1):
var_pen.restart(region_idx)
+ region_charstring.outlineExtractor = MergeOutlineExtractor
region_charstring.draw(var_pen)
- new_charstring = var_pen.getCharString(
+
+ # Collapse each coordinate list to a blend operator and its args.
+ new_cs = var_pen.getCharString(
private=default_charstring.private,
globalSubrs=default_charstring.globalSubrs,
- var_model=var_model, optimize=True)
- default_charstrings[gname] = new_charstring
+ var_model=model, optimize=True)
+ default_charstrings[gname] = new_cs
+
+ if (not var_pen.seen_moveto) or ('blend' not in new_cs.program):
+ # If this is not a marking glyph, or if there are no blend
+ # arguments, then we can use vsindex 0. No need to
+ # check if we need a new vsindex.
+ continue
+
+ # If the charstring required a new model, create
+ # a VarData table to go with, and set vsindex.
+ try:
+ key = tuple(v is not None for v in all_cs)
+ vsindex = vsindex_by_key[key]
+ except KeyError:
+ varTupleIndexes = []
+ for support in model.supports[1:]:
+ if support not in masterSupports:
+ masterSupports.append(support)
+ varTupleIndexes.append(masterSupports.index(support))
+ var_data = varLib.builder.buildVarData(varTupleIndexes, None, False)
+ vsindex = len(vsindex_dict)
+ vsindex_by_key[key] = vsindex
+ vsindex_dict[vsindex] = (model, [key])
+ varDataList.append(var_data)
+ # We do not need to check for an existing new_cs.private.vsindex,
+ # as we know it doesn't exist yet.
+ if vsindex != 0:
+ new_cs.program[:0] = [vsindex, 'vsindex']
+ cvData = CVarData(varDataList=varDataList, masterSupports=masterSupports,
+ vsindex_dict=vsindex_dict)
+ # XXX To do: optimize use of vsindex between the PrivateDicts and
+ # charstrings
+ return cvData
class MergeTypeError(TypeError):
def __init__(self, point_type, pt_index, m_index, default_type, glyphName):
- self.error_msg = [
- "In glyph '{gname}' "
- "'{point_type}' at point index {pt_index} in master "
- "index {m_index} differs from the default font point "
- "type '{default_type}'"
- "".format(gname=glyphName,
- point_type=point_type, pt_index=pt_index,
- m_index=m_index, default_type=default_type)
- ][0]
- super(MergeTypeError, self).__init__(self.error_msg)
+ self.error_msg = [
+ "In glyph '{gname}' "
+ "'{point_type}' at point index {pt_index} in master "
+ "index {m_index} differs from the default font point "
+ "type '{default_type}'"
+ "".format(
+ gname=glyphName,
+ point_type=point_type, pt_index=pt_index,
+ m_index=m_index, default_type=default_type)
+ ][0]
+ super(MergeTypeError, self).__init__(self.error_msg)
def makeRoundNumberFunc(tolerance):
@@ -274,10 +416,9 @@ def makeRoundNumberFunc(tolerance):
class CFFToCFF2OutlineExtractor(T2OutlineExtractor):
- """ This class is used to remove the initial width
- from the CFF charstring without adding the width
- to self.nominalWidthX, which is None.
- """
+ """ This class is used to remove the initial width from the CFF
+ charstring without trying to add the width to self.nominalWidthX,
+ which is None. """
def popallWidth(self, evenOdd=0):
args = self.popall()
if not self.gotWidth:
@@ -288,60 +429,127 @@ class CFFToCFF2OutlineExtractor(T2OutlineExtractor):
return args
+class MergeOutlineExtractor(CFFToCFF2OutlineExtractor):
+ """ Used to extract the charstring commands - including hints - from a
+ CFF charstring in order to merge it as another set of region data
+ into a CFF2 variable font charstring."""
+
+ def __init__(self, pen, localSubrs, globalSubrs,
+ nominalWidthX, defaultWidthX, private=None):
+ super(CFFToCFF2OutlineExtractor, self).__init__(pen, localSubrs,
+ globalSubrs, nominalWidthX, defaultWidthX, private)
+
+ def countHints(self):
+ args = self.popallWidth()
+ self.hintCount = self.hintCount + len(args) // 2
+ return args
+
+ def _hint_op(self, type, args):
+ self.pen.add_hint(type, args)
+
+ def op_hstem(self, index):
+ args = self.countHints()
+ self._hint_op('hstem', args)
+
+ def op_vstem(self, index):
+ args = self.countHints()
+ self._hint_op('vstem', args)
+
+ def op_hstemhm(self, index):
+ args = self.countHints()
+ self._hint_op('hstemhm', args)
+
+ def op_vstemhm(self, index):
+ args = self.countHints()
+ self._hint_op('vstemhm', args)
+
+ def _get_hintmask(self, index):
+ if not self.hintMaskBytes:
+ args = self.countHints()
+ if args:
+ self._hint_op('vstemhm', args)
+ self.hintMaskBytes = (self.hintCount + 7) // 8
+ hintMaskBytes, index = self.callingStack[-1].getBytes(index,
+ self.hintMaskBytes)
+ return index, hintMaskBytes
+
+ def op_hintmask(self, index):
+ index, hintMaskBytes = self._get_hintmask(index)
+ self.pen.add_hintmask('hintmask', [hintMaskBytes])
+ return hintMaskBytes, index
+
+ def op_cntrmask(self, index):
+ index, hintMaskBytes = self._get_hintmask(index)
+ self.pen.add_hintmask('cntrmask', [hintMaskBytes])
+ return hintMaskBytes, index
+
+
class CFF2CharStringMergePen(T2CharStringPen):
"""Pen to merge Type 2 CharStrings.
"""
- def __init__(self, default_commands,
- glyphName, num_masters, master_idx, roundTolerance=0.5):
+ def __init__(
+ self, default_commands, glyphName, num_masters, master_idx,
+ roundTolerance=0.5):
super(
CFF2CharStringMergePen,
- self).__init__(width=None,
- glyphSet=None, CFF2=True,
- roundTolerance=roundTolerance)
+ self).__init__(
+ width=None,
+ glyphSet=None, CFF2=True,
+ roundTolerance=roundTolerance)
self.pt_index = 0
self._commands = default_commands
self.m_index = master_idx
self.num_masters = num_masters
self.prev_move_idx = 0
+ self.seen_moveto = False
self.glyphName = glyphName
self.roundNumber = makeRoundNumberFunc(roundTolerance)
- def _p(self, pt):
- """ Unlike T2CharstringPen, this class stores absolute values.
- This is to allow the logic in check_and_fix_closepath() to work,
- where the current or previous absolute point has to be compared to
- the path start-point.
- """
- self._p0 = pt
- return list(self._p0)
-
def add_point(self, point_type, pt_coords):
if self.m_index == 0:
self._commands.append([point_type, [pt_coords]])
else:
cmd = self._commands[self.pt_index]
if cmd[0] != point_type:
- # Fix some issues that show up in some
- # CFF workflows, even when fonts are
- # topologically merge compatible.
- success, pt_coords = self.check_and_fix_flat_curve(
- cmd, point_type, pt_coords)
- if not success:
- success = self.check_and_fix_closepath(
- cmd, point_type, pt_coords)
- if success:
- # We may have incremented self.pt_index
- cmd = self._commands[self.pt_index]
- if cmd[0] != point_type:
- success = False
- if not success:
- raise MergeTypeError(point_type,
- self.pt_index, len(cmd[1]),
- cmd[0], self.glyphName)
+ raise MergeTypeError(
+ point_type,
+ self.pt_index, len(cmd[1]),
+ cmd[0], self.glyphName)
cmd[1].append(pt_coords)
self.pt_index += 1
+ def add_hint(self, hint_type, args):
+ if self.m_index == 0:
+ self._commands.append([hint_type, [args]])
+ else:
+ cmd = self._commands[self.pt_index]
+ if cmd[0] != hint_type:
+ raise MergeTypeError(hint_type, self.pt_index, len(cmd[1]),
+ cmd[0], self.glyphName)
+ cmd[1].append(args)
+ self.pt_index += 1
+
+ def add_hintmask(self, hint_type, abs_args):
+ # For hintmask, fonttools.cffLib.specializer.py expects
+ # each of these to be represented by two sequential commands:
+ # first holding only the operator name, with an empty arg list,
+ # second with an empty string as the op name, and the mask arg list.
+ if self.m_index == 0:
+ self._commands.append([hint_type, []])
+ self._commands.append(["", [abs_args]])
+ else:
+ cmd = self._commands[self.pt_index]
+ if cmd[0] != hint_type:
+ raise MergeTypeError(hint_type, self.pt_index, len(cmd[1]),
+ cmd[0], self.glyphName)
+ self.pt_index += 1
+ cmd = self._commands[self.pt_index]
+ cmd[1].append(abs_args)
+ self.pt_index += 1
+
def _moveTo(self, pt):
+ if not self.seen_moveto:
+ self.seen_moveto = True
pt_coords = self._p(pt)
self.add_point('rmoveto', pt_coords)
# I set prev_move_idx here because add_point()
@@ -371,7 +579,7 @@ class CFF2CharStringMergePen(T2CharStringPen):
def getCommands(self):
return self._commands
- def reorder_blend_args(self, commands):
+ def reorder_blend_args(self, commands, get_delta_func, round_func):
"""
We first re-order the master coordinate values.
For a moveto to lineto, the args are now arranged as:
@@ -380,9 +588,13 @@ class CFF2CharStringMergePen(T2CharStringPen):
[ [master_0 x, master_1 x, master_2 x],
[master_0 y, master_1 y, master_2 y]
]
- We also make the value relative.
If the master values are all the same, we collapse the list to
as single value instead of a list.
+
+ We then convert this to:
+ [ [master_0 x] + [x delta tuple] + [numBlends=1]
+ [master_0 y] + [y delta tuple] + [numBlends=1]
+ ]
"""
for cmd in commands:
# arg[i] is the set of arguments for this operator from master i.
@@ -390,113 +602,46 @@ class CFF2CharStringMergePen(T2CharStringPen):
m_args = zip(*args)
# m_args[n] is now all num_master args for the i'th argument
# for this operation.
- cmd[1] = m_args
-
- # Now convert from absolute to relative
- x0 = [0]*self.num_masters
- y0 = [0]*self.num_masters
- for cmd in self._commands:
- is_x = True
- coords = cmd[1]
- rel_coords = []
- for coord in coords:
- prev_coord = x0 if is_x else y0
- rel_coord = [pt[0] - pt[1] for pt in zip(coord, prev_coord)]
-
- if allEqual(rel_coord):
- rel_coord = rel_coord[0]
- rel_coords.append(rel_coord)
- if is_x:
- x0 = coord
- else:
- y0 = coord
- is_x = not is_x
- cmd[1] = rel_coords
- return commands
-
- @staticmethod
- def mergeCommandsToProgram(commands, var_model, round_func):
- """
- Takes a commands list as returned by programToCommands() and
- converts it back to a T2CharString or CFF2Charstring program list. I
- need to use this rather than specialize.commandsToProgram, as the
- commands produced by CFF2CharStringMergePen initially contains a
- list of coordinate values, one for each master, wherever a single
- coordinate value is expected by the regular logic. The problem with
- doing using the specialize.py functions is that a commands list is
- expected to be a op name with its associated argument list. For the
- commands list here, some of the arguments may need to be converted
- to a new argument list and opcode.
- This version will convert each list of master arguments to a blend
- op and its arguments, and will also combine successive blend ops up
- to the stack limit.
- """
- program = []
- for op, args in commands:
- num_args = len(args)
- # some of the args may be blend lists, and some may be
- # single coordinate values.
- i = 0
- stack_use = 0
- while i < num_args:
- arg = args[i]
- if not isinstance(arg, list):
- program.append(arg)
- i += 1
- stack_use += 1
- else:
- prev_stack_use = stack_use
- """ The arg is a tuple of blend values.
- These are each (master 0,master 1..master n)
- Combine as many successive tuples as we can,
- up to the max stack limit.
- """
- num_masters = len(arg)
- blendlist = [arg]
- i += 1
- stack_use += 1 + num_masters # 1 for the num_blends arg
- while (i < num_args) and isinstance(args[i], list):
- blendlist.append(args[i])
- i += 1
- stack_use += num_masters
- if stack_use + num_masters > maxStackLimit:
- # if we are here, max stack is is the CFF2 max stack.
- break
- num_blends = len(blendlist)
- # append the 'num_blends' default font values
- for arg in blendlist:
- if round_func:
- arg[0] = round_func(arg[0])
- program.append(arg[0])
- for arg in blendlist:
- # for each coordinate tuple, append the region deltas
- if len(arg) != 3:
- print(arg)
- import pdb
- pdb.set_trace()
- deltas = var_model.getDeltas(arg)
+ cmd[1] = list(m_args)
+ lastOp = None
+ for cmd in commands:
+ op = cmd[0]
+ # masks are represented by two cmd's: first has only op names,
+ # second has only args.
+ if lastOp in ['hintmask', 'cntrmask']:
+ coord = list(cmd[1])
+ assert allEqual(coord), (
+ "hintmask values cannot differ between source fonts.")
+ cmd[1] = [coord[0][0]]
+ else:
+ coords = cmd[1]
+ new_coords = []
+ for coord in coords:
+ if allEqual(coord):
+ new_coords.append(coord[0])
+ else:
+ # convert to deltas
+ deltas = get_delta_func(coord)[1:]
if round_func:
deltas = [round_func(delta) for delta in deltas]
- # First item in 'deltas' is the default master value;
- # for CFF2 data, that has already been written.
- program.extend(deltas[1:])
- program.append(num_blends)
- program.append('blend')
- stack_use = prev_stack_use + num_blends
- if op:
- program.append(op)
- return program
-
-
- def getCharString(self, private=None, globalSubrs=None,
- var_model=None, optimize=True):
+ coord = [coord[0]] + deltas
+ new_coords.append(coord)
+ cmd[1] = new_coords
+ lastOp = op
+ return commands
+
+ def getCharString(
+ self, private=None, globalSubrs=None,
+ var_model=None, optimize=True):
commands = self._commands
- commands = self.reorder_blend_args(commands)
+ commands = self.reorder_blend_args(commands, var_model.getDeltas,
+ self.roundNumber)
if optimize:
- commands = specializeCommands(commands, generalizeFirst=False,
- maxstack=maxStackLimit)
- program = self.mergeCommandsToProgram(commands, var_model=var_model,
- round_func=self.roundNumber)
- charString = T2CharString(program=program, private=private,
- globalSubrs=globalSubrs)
+ commands = specializeCommands(
+ commands, generalizeFirst=False,
+ maxstack=maxStackLimit)
+ program = commandsToProgram(commands)
+ charString = T2CharString(
+ program=program, private=private,
+ globalSubrs=globalSubrs)
return charString
diff --git a/Lib/fontTools/varLib/mutator.py b/Lib/fontTools/varLib/mutator.py
index de612365..04ab3577 100644
--- a/Lib/fontTools/varLib/mutator.py
+++ b/Lib/fontTools/varLib/mutator.py
@@ -65,24 +65,29 @@ def interpolate_cff2_charstrings(topDict, interpolateFromDeltas, glyphOrder):
charstrings = topDict.CharStrings
for gname in glyphOrder:
# Interpolate charstring
+ # e.g replace blend op args with regular args,
+ # and use and discard vsindex op.
charstring = charstrings[gname]
- pd = charstring.private
- vsindex = pd.vsindex if (hasattr(pd, 'vsindex')) else 0
- num_regions = pd.getNumRegions(vsindex)
- numMasters = num_regions + 1
new_program = []
+ vsindex = 0
last_i = 0
for i, token in enumerate(charstring.program):
- if token == 'blend':
+ if token == 'vsindex':
+ vsindex = charstring.program[i - 1]
+ if last_i != 0:
+ new_program.extend(charstring.program[last_i:i - 1])
+ last_i = i + 1
+ elif token == 'blend':
+ num_regions = charstring.getNumRegions(vsindex)
+ numMasters = 1 + num_regions
num_args = charstring.program[i - 1]
- """ The stack is now:
- ..args for following operations
- num_args values from the default font
- num_args tuples, each with numMasters-1 delta values
- num_blend_args
- 'blend'
- """
- argi = i - (num_args*numMasters + 1)
+ # The program list starting at program[i] is now:
+ # ..args for following operations
+ # num_args values from the default font
+ # num_args tuples, each with numMasters-1 delta values
+ # num_blend_args
+ # 'blend'
+ argi = i - (num_args * numMasters + 1)
end_args = tuplei = argi + num_args
while argi < end_args:
next_ti = tuplei + num_regions
diff --git a/Lib/fontTools/varLib/varStore.py b/Lib/fontTools/varLib/varStore.py
index 66d0c95a..f8ce8199 100644
--- a/Lib/fontTools/varLib/varStore.py
+++ b/Lib/fontTools/varLib/varStore.py
@@ -187,8 +187,10 @@ class VarStoreInstancer(object):
#
# Optimizations
#
+# retainFirstMap - If true, major 0 mappings are retained. Deltas for unused indices are zeroed
+# advIdxes - Set of major 0 indices for advance deltas to be listed first. Other major 0 indices follow.
-def VarStore_subset_varidxes(self, varIdxes, optimize=True):
+def VarStore_subset_varidxes(self, varIdxes, optimize=True, retainFirstMap=False, advIdxes=set()):
# Sort out used varIdxes by major/minor.
used = {}
@@ -217,10 +219,19 @@ def VarStore_subset_varidxes(self, varIdxes, optimize=True):
items = data.Item
newItems = []
- for minor in sorted(usedMinors):
- newMinor = len(newItems)
- newItems.append(items[minor])
- varDataMap[(major<<16)+minor] = (newMajor<<16)+newMinor
+ if major == 0 and retainFirstMap:
+ for minor in range(len(items)):
+ newItems.append(items[minor] if minor in usedMinors else [0] * len(items[minor]))
+ varDataMap[minor] = minor
+ else:
+ if major == 0:
+ minors = sorted(advIdxes) + sorted(usedMinors - advIdxes)
+ else:
+ minors = sorted(usedMinors)
+ for minor in minors:
+ newMinor = len(newItems)
+ newItems.append(items[minor])
+ varDataMap[(major<<16)+minor] = (newMajor<<16)+newMinor
data.Item = newItems
data.ItemCount = len(data.Item)
diff --git a/Lib/fontTools/voltLib/lexer.py b/Lib/fontTools/voltLib/lexer.py
index 271fe3b0..53102b99 100644
--- a/Lib/fontTools/voltLib/lexer.py
+++ b/Lib/fontTools/voltLib/lexer.py
@@ -39,10 +39,13 @@ class Lexer(object):
if token_type not in {Lexer.NEWLINE}:
return (token_type, token, location)
+ def location_(self):
+ column = self.pos_ - self.line_start_ + 1
+ return (self.filename_ or "<volt>", self.line_, column)
+
def next_(self):
self.scan_over_(Lexer.CHAR_WHITESPACE_)
- column = self.pos_ - self.line_start_ + 1
- location = (self.filename_, self.line_, column)
+ location = self.location_()
start = self.pos_
text = self.text_
limit = len(text)
diff --git a/Lib/fontTools/voltLib/parser.py b/Lib/fontTools/voltLib/parser.py
index 4fe10a0e..df035aa6 100644
--- a/Lib/fontTools/voltLib/parser.py
+++ b/Lib/fontTools/voltLib/parser.py
@@ -32,10 +32,19 @@ class Parser(object):
self.lookups_ = SymbolTable()
self.next_token_type_, self.next_token_ = (None, None)
self.next_token_location_ = None
- with open(path, "r") as f:
- self.lexer_ = Lexer(f.read(), path)
+ self.make_lexer_(path)
self.advance_lexer_()
+ def make_lexer_(self, file_or_path):
+ if hasattr(file_or_path, "read"):
+ filename = getattr(file_or_path, "name", None)
+ data = file_or_path.read()
+ else:
+ filename = file_or_path
+ with open(file_or_path, "r") as f:
+ data = f.read()
+ self.lexer_ = Lexer(data, filename)
+
def parse(self):
statements = self.doc_.statements
while self.next_token_type_ is not None:
diff --git a/Lib/fonttools.egg-info/PKG-INFO b/Lib/fonttools.egg-info/PKG-INFO
index d57498f3..d64332fc 100644
--- a/Lib/fonttools.egg-info/PKG-INFO
+++ b/Lib/fonttools.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: fonttools
-Version: 3.39.0
+Version: 3.41.2
Summary: Tools to manipulate font files
Home-page: http://github.com/fonttools/fonttools
Author: Just van Rossum
@@ -373,15 +373,15 @@ Description: |Travis Build Status| |Appveyor Build status| |Coverage Status| |Py
Olivier Berten, Samyak Bhuta, Erik van Blokland, Petr van Blokland,
Jelle Bosma, Sascha Brawer, Tom Byrer, Frédéric Coiffier, Vincent
- Connare, Dave Crossland, Simon Daniels, Behdad Esfahbod, Behnam
- Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Yannis Haralambous,
- Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson, Denis Moyogo
- Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek, Antoine Leca,
- Werner Lemberg, Tal Leming, Peter Lofting, Cosimo Lupo, Masaya Nakamura,
- Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret Rieger, Read
- Roberts, Guido van Rossum, Just van Rossum, Andreas Seidel, Georg
- Seifert, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov, Paul
- Wise.
+ Connare, Dave Crossland, Simon Daniels, Peter Dekkers, Behdad Esfahbod,
+ Behnam Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Yannis
+ Haralambous, Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson,
+ Denis Moyogo Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek,
+ Antoine Leca, Werner Lemberg, Tal Leming, Peter Lofting, Cosimo Lupo,
+ Masaya Nakamura, Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret
+ Rieger, Read Roberts, Guido van Rossum, Just van Rossum, Andreas Seidel,
+ Georg Seifert, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov,
+ Paul Wise.
Copyrights
~~~~~~~~~~
@@ -415,6 +415,64 @@ Description: |Travis Build Status| |Appveyor Build status| |Coverage Status| |Py
Changelog
~~~~~~~~~
+ 3.41.2 (released 2019-05-13)
+ ----------------------------
+
+ - [cffLib] Fixed issue when importing a ``CFF2`` variable font from XML, whereby
+ the VarStore state was not propagated to PrivateDict (#1598).
+ - [varLib] Don't drop ``post`` glyph names when building CFF2 variable font (#1609).
+
+
+ 3.41.1 (released 2019-05-13)
+ ----------------------------
+
+ - [designspaceLib] Added ``loadSourceFonts`` method to load source fonts using
+ custom opener function (#1606).
+ - [head] Round font bounding box coordinates to integers to fix compile error
+ if CFF font has float coordinates (#1604, #1605).
+ - [feaLib] Don't write ``None`` in ``ast.ValueRecord.asFea()`` (#1599).
+ - [subset] Fixed issue ``AssertionError`` when using ``--desubroutinize`` option
+ (#1590, #1594).
+ - [graphite] Fixed bug in ``Silf`` table's ``decompile`` method unmasked by
+ previous typo fix (#1597). Decode languange code as UTF-8 in ``Sill`` table's
+ ``decompile`` method (#1600).
+
+ 3.41.0 (released 2019-04-29)
+ ----------------------------
+
+ - [varLib/cffLib] Added support for building ``CFF2`` variable font from sparse
+ masters, or masters with more than one model (multiple ``VarStore.VarData``).
+ In ``cffLib.specializer``, added support for ``CFF2`` CharStrings with
+ ``blend`` operators (#1547, #1591).
+ - [subset] Fixed subsetting ``HVAR`` and ``VVAR`` with ``--retain-gids`` option,
+ and when advances mapping is null while sidebearings mappings are non-null
+ (#1587, #1588).
+ - Added ``otlLib.maxContextCalc`` module to compute ``OS/2.usMaxContext`` value.
+ Calculate it automatically when compiling features with feaLib. Added option
+ ``--recalc-max-context`` to ``subset`` module (#1582).
+ - [otBase/otTables] Fixed ``AttributeError`` on missing OT table fields after
+ importing font from TTX (#1584).
+ - [graphite] Fixed typo ``Silf`` table's ``decompile`` method (#1586).
+ - [otlLib] Better compress ``GPOS`` SinglePos (LookupType 1) subtables (#1539).
+
+ 3.40.0 (released 2019-04-08)
+ ----------------------------
+
+ - [subset] Fixed error while subsetting ``VVAR`` with ``--retain-gids``
+ option (#1552).
+ - [designspaceLib] Use up-to-date default location in ``findDefault`` method
+ (#1554).
+ - [voltLib] Allow passing file-like object to Parser.
+ - [arrayTools/glyf] ``calcIntBounds`` (used to compute bounding boxes of glyf
+ table's glyphs) now uses ``otRound`` instead of ``round3`` (#1566).
+ - [svgLib] Added support for converting more SVG shapes to path ``d`` strings
+ (ellipse, line, polyline), as well as support for ``transform`` attributes.
+ Only ``matrix`` transformations are currently supported (#1564, #1564).
+ - [varLib] Added support for building ``VVAR`` table from ``vmtx`` and ``VORG``
+ tables (#1551).
+ - [fontBuilder] Enable making CFF2 fonts with ``post`` table format 2 (#1557).
+ - Fixed ``DeprecationWarning`` on invalid escape sequences (#1562).
+
3.39.0 (released 2019-03-19)
----------------------------
@@ -1684,13 +1742,13 @@ Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Text Processing :: Fonts
Classifier: Topic :: Multimedia :: Graphics
Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
-Provides-Extra: symfont
-Provides-Extra: type1
Provides-Extra: lxml
-Provides-Extra: ufo
-Provides-Extra: interpolatable
Provides-Extra: all
Provides-Extra: woff
-Provides-Extra: plot
Provides-Extra: unicode
+Provides-Extra: interpolatable
+Provides-Extra: plot
+Provides-Extra: type1
+Provides-Extra: ufo
+Provides-Extra: symfont
Provides-Extra: graphite
diff --git a/Lib/fonttools.egg-info/SOURCES.txt b/Lib/fonttools.egg-info/SOURCES.txt
index 3bb752fa..4ff321a1 100644
--- a/Lib/fonttools.egg-info/SOURCES.txt
+++ b/Lib/fonttools.egg-info/SOURCES.txt
@@ -137,6 +137,7 @@ Lib/fontTools/mtiLib/__init__.py
Lib/fontTools/mtiLib/__main__.py
Lib/fontTools/otlLib/__init__.py
Lib/fontTools/otlLib/builder.py
+Lib/fontTools/otlLib/maxContextCalc.py
Lib/fontTools/pens/__init__.py
Lib/fontTools/pens/areaPen.py
Lib/fontTools/pens/basePen.py
@@ -336,7 +337,8 @@ Tests/afmLib/afmLib_test.py
Tests/afmLib/data/TestAFM.afm
Tests/cffLib/cffLib_test.py
Tests/cffLib/specializer_test.py
-Tests/cffLib/data/TestOTF.otf
+Tests/cffLib/data/TestOTF.ttx
+Tests/cffLib/data/TestSparseCFF2VF.ttx
Tests/designspaceLib/designspace_test.py
Tests/designspaceLib/data/test.designspace
Tests/encodings/codecs_test.py
@@ -630,6 +632,11 @@ Tests/mtiLib/data/mti/scripttable.ttx.GPOS
Tests/mtiLib/data/mti/scripttable.ttx.GSUB
Tests/mtiLib/data/mti/scripttable.txt
Tests/otlLib/builder_test.py
+Tests/otlLib/maxContextCalc_test.py
+Tests/otlLib/data/gpos_91.ttx
+Tests/otlLib/data/gsub_51.ttx
+Tests/otlLib/data/gsub_52.ttx
+Tests/otlLib/data/gsub_71.ttx
Tests/pens/areaPen_test.py
Tests/pens/basePen_test.py
Tests/pens/boundsPen_test.py
@@ -651,6 +658,7 @@ Tests/subset/data/TestBSLN-3.ttx
Tests/subset/data/TestCID-Regular.ttx
Tests/subset/data/TestCLR-Regular.ttx
Tests/subset/data/TestGVAR.ttx
+Tests/subset/data/TestHVVAR.ttx
Tests/subset/data/TestLCAR-0.ttx
Tests/subset/data/TestLCAR-1.ttx
Tests/subset/data/TestMATH-Regular.ttx
@@ -660,6 +668,8 @@ Tests/subset/data/TestOTF-Regular.ttx
Tests/subset/data/TestPROP.ttx
Tests/subset/data/TestTTF-Regular.ttx
Tests/subset/data/TestTTF-Regular_non_BMP_char.ttx
+Tests/subset/data/expect_HVVAR.ttx
+Tests/subset/data/expect_HVVAR_retain_gids.ttx
Tests/subset/data/expect_ankr.ttx
Tests/subset/data/expect_bsln_0.ttx
Tests/subset/data/expect_bsln_1.ttx
@@ -684,6 +694,8 @@ Tests/subset/data/expect_opbd_1.ttx
Tests/subset/data/expect_prop_0.ttx
Tests/subset/data/expect_prop_1.ttx
Tests/subset/data/google_color.ttx
+Tests/subset/data/test_cntrmask_CFF.desub.ttx
+Tests/subset/data/test_cntrmask_CFF.ttx
Tests/subset/data/test_hinted_subrs_CFF.desub.ttx
Tests/subset/data/test_hinted_subrs_CFF.ttx
Tests/svgLib/path/__init__.py
@@ -1432,10 +1444,23 @@ Tests/varLib/data/InterpolateLayout2.designspace
Tests/varLib/data/InterpolateLayout3.designspace
Tests/varLib/data/SparseMasters.designspace
Tests/varLib/data/TestCFF2.designspace
-Tests/varLib/data/TestCFF2VF.otf
-Tests/varLib/data/master_cff2/TestCFF2_Black.otf
-Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.otf
-Tests/varLib/data/master_cff2/TestCFF2_Regular.otf
+Tests/varLib/data/TestSparseCFF2VF.designspace
+Tests/varLib/data/TestVVAR.designspace
+Tests/varLib/data/master_cff2/TestCFF2_Black.ttx
+Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.ttx
+Tests/varLib/data/master_cff2/TestCFF2_Regular.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w0.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w1000.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w439.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w440.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w599.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w600.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w669.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w670.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w799.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w800.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w889.00.ttx
+Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w890.00.ttx
Tests/varLib/data/master_ttx_getvar_ttf/Mutator_Getvar.ttx
Tests/varLib/data/master_ttx_interpolatable_otf/TestFamily2-Master0.ttx
Tests/varLib/data/master_ttx_interpolatable_otf/TestFamily2-Master1.ttx
@@ -1459,6 +1484,7 @@ Tests/varLib/data/master_ttx_interpolatable_ttf/TestFamily3-Regular.ttx
Tests/varLib/data/master_ttx_interpolatable_ttf/TestFamily3-SemiBold.ttx
Tests/varLib/data/master_ttx_interpolatable_ttf/TestFamily4-Italic15.ttx
Tests/varLib/data/master_ttx_interpolatable_ttf/TestFamily4-Regular.ttx
+Tests/varLib/data/master_ttx_varfont_otf/TestCFF2VF.ttx
Tests/varLib/data/master_ttx_varfont_ttf/Mutator_IUP.ttx
Tests/varLib/data/master_ufo/TestFamily-Master0.ufo/features.fea
Tests/varLib/data/master_ufo/TestFamily-Master0.ufo/fontinfo.plist
@@ -1721,6 +1747,8 @@ Tests/varLib/data/master_ufo/TestFamily4-Regular.ufo/glyphs.public.background/co
Tests/varLib/data/master_ufo/TestFamily4-Regular.ufo/glyphs.public.background/dieresiscomb.glif
Tests/varLib/data/master_ufo/TestFamily4-Regular.ufo/glyphs.public.background/n.glif
Tests/varLib/data/master_ufo/TestFamily4-Regular.ufo/glyphs.public.background/o.glif
+Tests/varLib/data/master_vvar_cff2/TestVVAR.0.ttx
+Tests/varLib/data/master_vvar_cff2/TestVVAR.1.ttx
Tests/varLib/data/test_results/Build.ttx
Tests/varLib/data/test_results/BuildAvarEmptyAxis.ttx
Tests/varLib/data/test_results/BuildAvarIdentityMaps.ttx
@@ -1757,5 +1785,7 @@ Tests/varLib/data/test_results/Mutator.ttx
Tests/varLib/data/test_results/Mutator_Getvar-instance.ttx
Tests/varLib/data/test_results/Mutator_IUP-instance.ttx
Tests/varLib/data/test_results/SparseMasters.ttx
+Tests/varLib/data/test_results/TestSparseCFF2VF.ttx
+Tests/varLib/data/test_results/TestVVAR.ttx
Tests/voltLib/lexer_test.py
Tests/voltLib/parser_test.py \ No newline at end of file
diff --git a/METADATA b/METADATA
index ea7bfaa2..16683d46 100644
--- a/METADATA
+++ b/METADATA
@@ -7,12 +7,12 @@ third_party {
}
url {
type: ARCHIVE
- value: "https://github.com/fonttools/fonttools/releases/download/3.39.0/fonttools-3.39.0.zip"
+ value: "https://github.com/fonttools/fonttools/releases/download/3.41.2/fonttools-3.41.2.zip"
}
- version: "3.39.0"
+ version: "3.41.2"
last_upgrade_date {
year: 2019
- month: 3
- day: 19
+ month: 5
+ day: 13
}
}
diff --git a/NEWS.rst b/NEWS.rst
index c48ed884..a70ad80f 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -1,3 +1,61 @@
+3.41.2 (released 2019-05-13)
+----------------------------
+
+- [cffLib] Fixed issue when importing a ``CFF2`` variable font from XML, whereby
+ the VarStore state was not propagated to PrivateDict (#1598).
+- [varLib] Don't drop ``post`` glyph names when building CFF2 variable font (#1609).
+
+
+3.41.1 (released 2019-05-13)
+----------------------------
+
+- [designspaceLib] Added ``loadSourceFonts`` method to load source fonts using
+ custom opener function (#1606).
+- [head] Round font bounding box coordinates to integers to fix compile error
+ if CFF font has float coordinates (#1604, #1605).
+- [feaLib] Don't write ``None`` in ``ast.ValueRecord.asFea()`` (#1599).
+- [subset] Fixed issue ``AssertionError`` when using ``--desubroutinize`` option
+ (#1590, #1594).
+- [graphite] Fixed bug in ``Silf`` table's ``decompile`` method unmasked by
+ previous typo fix (#1597). Decode languange code as UTF-8 in ``Sill`` table's
+ ``decompile`` method (#1600).
+
+3.41.0 (released 2019-04-29)
+----------------------------
+
+- [varLib/cffLib] Added support for building ``CFF2`` variable font from sparse
+ masters, or masters with more than one model (multiple ``VarStore.VarData``).
+ In ``cffLib.specializer``, added support for ``CFF2`` CharStrings with
+ ``blend`` operators (#1547, #1591).
+- [subset] Fixed subsetting ``HVAR`` and ``VVAR`` with ``--retain-gids`` option,
+ and when advances mapping is null while sidebearings mappings are non-null
+ (#1587, #1588).
+- Added ``otlLib.maxContextCalc`` module to compute ``OS/2.usMaxContext`` value.
+ Calculate it automatically when compiling features with feaLib. Added option
+ ``--recalc-max-context`` to ``subset`` module (#1582).
+- [otBase/otTables] Fixed ``AttributeError`` on missing OT table fields after
+ importing font from TTX (#1584).
+- [graphite] Fixed typo ``Silf`` table's ``decompile`` method (#1586).
+- [otlLib] Better compress ``GPOS`` SinglePos (LookupType 1) subtables (#1539).
+
+3.40.0 (released 2019-04-08)
+----------------------------
+
+- [subset] Fixed error while subsetting ``VVAR`` with ``--retain-gids``
+ option (#1552).
+- [designspaceLib] Use up-to-date default location in ``findDefault`` method
+ (#1554).
+- [voltLib] Allow passing file-like object to Parser.
+- [arrayTools/glyf] ``calcIntBounds`` (used to compute bounding boxes of glyf
+ table's glyphs) now uses ``otRound`` instead of ``round3`` (#1566).
+- [svgLib] Added support for converting more SVG shapes to path ``d`` strings
+ (ellipse, line, polyline), as well as support for ``transform`` attributes.
+ Only ``matrix`` transformations are currently supported (#1564, #1564).
+- [varLib] Added support for building ``VVAR`` table from ``vmtx`` and ``VORG``
+ tables (#1551).
+- [fontBuilder] Enable making CFF2 fonts with ``post`` table format 2 (#1557).
+- Fixed ``DeprecationWarning`` on invalid escape sequences (#1562).
+
3.39.0 (released 2019-03-19)
----------------------------
diff --git a/PKG-INFO b/PKG-INFO
index d57498f3..d64332fc 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: fonttools
-Version: 3.39.0
+Version: 3.41.2
Summary: Tools to manipulate font files
Home-page: http://github.com/fonttools/fonttools
Author: Just van Rossum
@@ -373,15 +373,15 @@ Description: |Travis Build Status| |Appveyor Build status| |Coverage Status| |Py
Olivier Berten, Samyak Bhuta, Erik van Blokland, Petr van Blokland,
Jelle Bosma, Sascha Brawer, Tom Byrer, Frédéric Coiffier, Vincent
- Connare, Dave Crossland, Simon Daniels, Behdad Esfahbod, Behnam
- Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Yannis Haralambous,
- Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson, Denis Moyogo
- Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek, Antoine Leca,
- Werner Lemberg, Tal Leming, Peter Lofting, Cosimo Lupo, Masaya Nakamura,
- Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret Rieger, Read
- Roberts, Guido van Rossum, Just van Rossum, Andreas Seidel, Georg
- Seifert, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov, Paul
- Wise.
+ Connare, Dave Crossland, Simon Daniels, Peter Dekkers, Behdad Esfahbod,
+ Behnam Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Yannis
+ Haralambous, Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson,
+ Denis Moyogo Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek,
+ Antoine Leca, Werner Lemberg, Tal Leming, Peter Lofting, Cosimo Lupo,
+ Masaya Nakamura, Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret
+ Rieger, Read Roberts, Guido van Rossum, Just van Rossum, Andreas Seidel,
+ Georg Seifert, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov,
+ Paul Wise.
Copyrights
~~~~~~~~~~
@@ -415,6 +415,64 @@ Description: |Travis Build Status| |Appveyor Build status| |Coverage Status| |Py
Changelog
~~~~~~~~~
+ 3.41.2 (released 2019-05-13)
+ ----------------------------
+
+ - [cffLib] Fixed issue when importing a ``CFF2`` variable font from XML, whereby
+ the VarStore state was not propagated to PrivateDict (#1598).
+ - [varLib] Don't drop ``post`` glyph names when building CFF2 variable font (#1609).
+
+
+ 3.41.1 (released 2019-05-13)
+ ----------------------------
+
+ - [designspaceLib] Added ``loadSourceFonts`` method to load source fonts using
+ custom opener function (#1606).
+ - [head] Round font bounding box coordinates to integers to fix compile error
+ if CFF font has float coordinates (#1604, #1605).
+ - [feaLib] Don't write ``None`` in ``ast.ValueRecord.asFea()`` (#1599).
+ - [subset] Fixed issue ``AssertionError`` when using ``--desubroutinize`` option
+ (#1590, #1594).
+ - [graphite] Fixed bug in ``Silf`` table's ``decompile`` method unmasked by
+ previous typo fix (#1597). Decode languange code as UTF-8 in ``Sill`` table's
+ ``decompile`` method (#1600).
+
+ 3.41.0 (released 2019-04-29)
+ ----------------------------
+
+ - [varLib/cffLib] Added support for building ``CFF2`` variable font from sparse
+ masters, or masters with more than one model (multiple ``VarStore.VarData``).
+ In ``cffLib.specializer``, added support for ``CFF2`` CharStrings with
+ ``blend`` operators (#1547, #1591).
+ - [subset] Fixed subsetting ``HVAR`` and ``VVAR`` with ``--retain-gids`` option,
+ and when advances mapping is null while sidebearings mappings are non-null
+ (#1587, #1588).
+ - Added ``otlLib.maxContextCalc`` module to compute ``OS/2.usMaxContext`` value.
+ Calculate it automatically when compiling features with feaLib. Added option
+ ``--recalc-max-context`` to ``subset`` module (#1582).
+ - [otBase/otTables] Fixed ``AttributeError`` on missing OT table fields after
+ importing font from TTX (#1584).
+ - [graphite] Fixed typo ``Silf`` table's ``decompile`` method (#1586).
+ - [otlLib] Better compress ``GPOS`` SinglePos (LookupType 1) subtables (#1539).
+
+ 3.40.0 (released 2019-04-08)
+ ----------------------------
+
+ - [subset] Fixed error while subsetting ``VVAR`` with ``--retain-gids``
+ option (#1552).
+ - [designspaceLib] Use up-to-date default location in ``findDefault`` method
+ (#1554).
+ - [voltLib] Allow passing file-like object to Parser.
+ - [arrayTools/glyf] ``calcIntBounds`` (used to compute bounding boxes of glyf
+ table's glyphs) now uses ``otRound`` instead of ``round3`` (#1566).
+ - [svgLib] Added support for converting more SVG shapes to path ``d`` strings
+ (ellipse, line, polyline), as well as support for ``transform`` attributes.
+ Only ``matrix`` transformations are currently supported (#1564, #1564).
+ - [varLib] Added support for building ``VVAR`` table from ``vmtx`` and ``VORG``
+ tables (#1551).
+ - [fontBuilder] Enable making CFF2 fonts with ``post`` table format 2 (#1557).
+ - Fixed ``DeprecationWarning`` on invalid escape sequences (#1562).
+
3.39.0 (released 2019-03-19)
----------------------------
@@ -1684,13 +1742,13 @@ Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Text Processing :: Fonts
Classifier: Topic :: Multimedia :: Graphics
Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
-Provides-Extra: symfont
-Provides-Extra: type1
Provides-Extra: lxml
-Provides-Extra: ufo
-Provides-Extra: interpolatable
Provides-Extra: all
Provides-Extra: woff
-Provides-Extra: plot
Provides-Extra: unicode
+Provides-Extra: interpolatable
+Provides-Extra: plot
+Provides-Extra: type1
+Provides-Extra: ufo
+Provides-Extra: symfont
Provides-Extra: graphite
diff --git a/README.rst b/README.rst
index 14e7c4c5..0bb2e840 100644
--- a/README.rst
+++ b/README.rst
@@ -363,15 +363,15 @@ In alphabetical order:
Olivier Berten, Samyak Bhuta, Erik van Blokland, Petr van Blokland,
Jelle Bosma, Sascha Brawer, Tom Byrer, Frédéric Coiffier, Vincent
-Connare, Dave Crossland, Simon Daniels, Behdad Esfahbod, Behnam
-Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Yannis Haralambous,
-Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson, Denis Moyogo
-Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek, Antoine Leca,
-Werner Lemberg, Tal Leming, Peter Lofting, Cosimo Lupo, Masaya Nakamura,
-Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret Rieger, Read
-Roberts, Guido van Rossum, Just van Rossum, Andreas Seidel, Georg
-Seifert, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov, Paul
-Wise.
+Connare, Dave Crossland, Simon Daniels, Peter Dekkers, Behdad Esfahbod,
+Behnam Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Yannis
+Haralambous, Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson,
+Denis Moyogo Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek,
+Antoine Leca, Werner Lemberg, Tal Leming, Peter Lofting, Cosimo Lupo,
+Masaya Nakamura, Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret
+Rieger, Read Roberts, Guido van Rossum, Just van Rossum, Andreas Seidel,
+Georg Seifert, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov,
+Paul Wise.
Copyrights
~~~~~~~~~~
diff --git a/Tests/cffLib/cffLib_test.py b/Tests/cffLib/cffLib_test.py
index ce73b344..cc28e4e9 100644
--- a/Tests/cffLib/cffLib_test.py
+++ b/Tests/cffLib/cffLib_test.py
@@ -47,16 +47,19 @@ class CffLibTest(DataFilesHandler):
self.assertEqual(topDict.FontBBox, [0, 0, 0, 0])
def test_topDict_set_Encoding(self):
- file_name = 'TestOTF.otf'
- font_path = self.getpath(file_name)
- temp_path = self.temp_font(font_path, file_name)
- save_path = temp_path[:-4] + '2.otf'
- font = TTFont(temp_path)
+ ttx_path = self.getpath('TestOTF.ttx')
+ font = TTFont(recalcBBoxes=False, recalcTimestamp=False)
+ font.importXML(ttx_path)
+
topDict = font["CFF "].cff.topDictIndex[0]
encoding = [".notdef"] * 256
encoding[0x20] = "space"
topDict.Encoding = encoding
+
+ self.temp_dir()
+ save_path = os.path.join(self.tempdir, 'TestOTF.otf')
font.save(save_path)
+
font2 = TTFont(save_path)
topDict2 = font2["CFF "].cff.topDictIndex[0]
self.assertEqual(topDict2.Encoding[32], "space")
diff --git a/Tests/cffLib/data/TestOTF.otf b/Tests/cffLib/data/TestOTF.otf
deleted file mode 100644
index cd0bdf67..00000000
--- a/Tests/cffLib/data/TestOTF.otf
+++ /dev/null
Binary files differ
diff --git a/Tests/cffLib/data/TestOTF.ttx b/Tests/cffLib/data/TestOTF.ttx
new file mode 100644
index 00000000..0e0c4d70
--- /dev/null
+++ b/Tests/cffLib/data/TestOTF.ttx
@@ -0,0 +1,325 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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=".null"/>
+ <GlyphID id="2" name="CR"/>
+ <GlyphID id="3" name="space"/>
+ <GlyphID id="4" name="period"/>
+ <GlyphID id="5" name="ellipsis"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x4e5f578f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Jun 4 14:29:11 2015"/>
+ <modified value="Sun Mar 26 22:38:12 2017"/>
+ <xMin value="50"/>
+ <yMin value="0"/>
+ <xMax value="668"/>
+ <yMax value="750"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="9"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="900"/>
+ <descent value="-300"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="723"/>
+ <minLeftSideBearing value="50"/>
+ <minRightSideBearing value="50"/>
+ <xMaxExtent value="668"/>
+ <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="6"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="6"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="392"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="700"/>
+ <ySubscriptYSize value="650"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="140"/>
+ <ySuperscriptXSize value="700"/>
+ <ySuperscriptYSize value="650"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="477"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="250"/>
+ <sFamilyClass value="2050"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="6"/>
+ <bProportion value="4"/>
+ <bContrast value="4"/>
+ <bStrokeVariation value="2"/>
+ <bArmStyle value="7"/>
+ <bLetterForm value="8"/>
+ <bMidline value="1"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="10000000 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 11000000"/>
+ <usFirstCharIndex value="0"/>
+ <usLastCharIndex value="8230"/>
+ <sTypoAscender value="750"/>
+ <sTypoDescender value="-250"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="900"/>
+ <usWinDescent value="300"/>
+ <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>
+
+ <name>
+ <namerecord nameID="0" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Copyright (c) 2015 by FontTools. No rights reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Test OTF
+ </namerecord>
+ <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ FontTools: Test OTF: 2015
+ </namerecord>
+ <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Test OTF
+ </namerecord>
+ <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Version 1.000
+ </namerecord>
+ <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestOTF-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Test OTF is not a trademark of FontTools.
+ </namerecord>
+ <namerecord nameID="8" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ FontTools
+ </namerecord>
+ <namerecord nameID="9" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ FontTools
+ </namerecord>
+ <namerecord nameID="11" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ https://github.com/behdad/fonttools
+ </namerecord>
+ <namerecord nameID="12" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ https://github.com/behdad/fonttools
+ </namerecord>
+ <namerecord nameID="14" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ https://github.com/behdad/fonttools/blob/master/LICENSE.txt
+ </namerecord>
+ <namerecord nameID="18" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Test TTF
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (c) 2015 by FontTools. No rights reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Test OTF
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ FontTools: Test OTF: 2015
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Test OTF
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.000
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ TestOTF-Regular
+ </namerecord>
+ <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409">
+ Test OTF is not a trademark of FontTools.
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ FontTools
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ FontTools
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ https://github.com/behdad/fonttools
+ </namerecord>
+ <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409">
+ https://github.com/behdad/fonttools
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ https://github.com/behdad/fonttools/blob/master/LICENSE.txt
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x0" name=".null"/><!-- ???? -->
+ <map code="0xd" name="CR"/><!-- ???? -->
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x2e" name="period"/><!-- FULL STOP -->
+ <map code="0x2026" name="ellipsis"/><!-- HORIZONTAL ELLIPSIS -->
+ </cmap_format_4>
+ <cmap_format_6 platformID="1" platEncID="0" language="0">
+ <map code="0x0" name=".null"/>
+ <map code="0xd" name="CR"/>
+ <map code="0x20" name="space"/>
+ <map code="0x2e" name="period"/>
+ <map code="0xc9" name="ellipsis"/>
+ </cmap_format_6>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x0" name=".null"/><!-- ???? -->
+ <map code="0xd" name="CR"/><!-- ???? -->
+ <map code="0x20" name="space"/><!-- SPACE -->
+ <map code="0x2e" name="period"/><!-- FULL STOP -->
+ <map code="0x2026" name="ellipsis"/><!-- HORIZONTAL ELLIPSIS -->
+ </cmap_format_4>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="TestOTF-Regular">
+ <version value="001.001"/>
+ <Notice value="Copyright \(c\) 2015 by FontTools. No rights reserved."/>
+ <FullName value="Test OTF"/>
+ <FamilyName value="Test OTF"/>
+ <Weight value="Regular"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="50 0 668 750"/>
+ <StrokeWidth value="0"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <Encoding name="StandardEncoding"/>
+ <Private>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="0"/>
+ <nominalWidthX value="0"/>
+ <Subrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ <CharString index="0">
+ 131 122 -131 hlineto
+ return
+ </CharString>
+ </Subrs>
+ </Private>
+ <CharStrings>
+ <CharString name=".notdef">
+ 500 450 hmoveto
+ 750 -400 -750 vlineto
+ 50 50 rmoveto
+ 650 300 -650 vlineto
+ endchar
+ </CharString>
+ <CharString name=".null">
+ 0 endchar
+ </CharString>
+ <CharString name="CR">
+ 250 endchar
+ </CharString>
+ <CharString name="ellipsis">
+ 723 55 hmoveto
+ -107 callsubr
+ 241 -122 rmoveto
+ -107 callsubr
+ 241 -122 rmoveto
+ -107 callsubr
+ endchar
+ </CharString>
+ <CharString name="period">
+ 241 55 hmoveto
+ -107 callsubr
+ endchar
+ </CharString>
+ <CharString name="space">
+ 250 endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="50"/>
+ <mtx name=".null" width="0" lsb="0"/>
+ <mtx name="CR" width="250" lsb="0"/>
+ <mtx name="ellipsis" width="723" lsb="55"/>
+ <mtx name="period" width="241" lsb="55"/>
+ <mtx name="space" width="250" lsb="0"/>
+ </hmtx>
+
+ <DSIG>
+ <!-- note that the Digital Signature will be invalid after recompilation! -->
+ <tableHeader flag="0x0" numSigs="0" version="1"/>
+ </DSIG>
+
+</ttFont>
diff --git a/Tests/cffLib/data/TestSparseCFF2VF.ttx b/Tests/cffLib/data/TestSparseCFF2VF.ttx
new file mode 100644
index 00000000..f1ae063b
--- /dev/null
+++ b/Tests/cffLib/data/TestSparseCFF2VF.ttx
@@ -0,0 +1,1980 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="uni0000"/>
+ <GlyphID id="2" name="exclam"/>
+ <GlyphID id="3" name="uni610F"/>
+ <GlyphID id="4" name="uni85A8"/>
+ <GlyphID id="5" name="uni8E59"/>
+ <GlyphID id="6" name="uni9A40"/>
+ <GlyphID id="7" name="uniF9DC"/>
+ <GlyphID id="8" name="uni50CE"/>
+ <GlyphID id="9" name="uni6A1A"/>
+ <GlyphID id="10" name="uni82E8"/>
+ <GlyphID id="11" name="uni8552"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0x65319c93"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:06:21 2018"/>
+ <modified value="Tue Mar 19 15:57:18 2019"/>
+ <xMin value="14"/>
+ <yMin value="-120"/>
+ <xMax value="976"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="14"/>
+ <minRightSideBearing value="24"/>
+ <xMaxExtent value="976"/>
+ <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>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="12"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="977"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000011"/>
+ <ulUnicodeRange2 value="00101000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="0"/>
+ <usLastCharIndex value="63964"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="exclam" width="222" lsb="74"/>
+ <mtx name="uni0000" width="231" lsb="0"/>
+ <mtx name="uni50CE" width="1000" lsb="14"/>
+ <mtx name="uni610F" width="1000" lsb="48"/>
+ <mtx name="uni6A1A" width="1000" lsb="30"/>
+ <mtx name="uni82E8" width="1000" lsb="35"/>
+ <mtx name="uni8552" width="1000" lsb="53"/>
+ <mtx name="uni85A8" width="1000" lsb="52"/>
+ <mtx name="uni8E59" width="1000" lsb="34"/>
+ <mtx name="uni9A40" width="1000" lsb="36"/>
+ <mtx name="uniF9DC" width="1000" lsb="82"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x0" name="uni0000"/><!-- ???? -->
+ <map code="0x1" name="uni0000"/><!-- ???? -->
+ <map code="0x2" name="uni0000"/><!-- ???? -->
+ <map code="0x3" name="uni0000"/><!-- ???? -->
+ <map code="0x4" name="uni0000"/><!-- ???? -->
+ <map code="0x5" name="uni0000"/><!-- ???? -->
+ <map code="0x6" name="uni0000"/><!-- ???? -->
+ <map code="0x7" name="uni0000"/><!-- ???? -->
+ <map code="0x8" name="uni0000"/><!-- ???? -->
+ <map code="0x9" name="uni0000"/><!-- ???? -->
+ <map code="0xa" name="uni0000"/><!-- ???? -->
+ <map code="0xb" name="uni0000"/><!-- ???? -->
+ <map code="0xc" name="uni0000"/><!-- ???? -->
+ <map code="0xd" name="uni0000"/><!-- ???? -->
+ <map code="0xe" name="uni0000"/><!-- ???? -->
+ <map code="0xf" name="uni0000"/><!-- ???? -->
+ <map code="0x10" name="uni0000"/><!-- ???? -->
+ <map code="0x11" name="uni0000"/><!-- ???? -->
+ <map code="0x12" name="uni0000"/><!-- ???? -->
+ <map code="0x13" name="uni0000"/><!-- ???? -->
+ <map code="0x14" name="uni0000"/><!-- ???? -->
+ <map code="0x15" name="uni0000"/><!-- ???? -->
+ <map code="0x16" name="uni0000"/><!-- ???? -->
+ <map code="0x17" name="uni0000"/><!-- ???? -->
+ <map code="0x18" name="uni0000"/><!-- ???? -->
+ <map code="0x19" name="uni0000"/><!-- ???? -->
+ <map code="0x1a" name="uni0000"/><!-- ???? -->
+ <map code="0x1b" name="uni0000"/><!-- ???? -->
+ <map code="0x1c" name="uni0000"/><!-- ???? -->
+ <map code="0x1d" name="uni0000"/><!-- ???? -->
+ <map code="0x1e" name="uni0000"/><!-- ???? -->
+ <map code="0x1f" name="uni0000"/><!-- ???? -->
+ <map code="0x20" name="uni0000"/><!-- SPACE -->
+ <map code="0x21" name="exclam"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="uni0000"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="uni50CE"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="uni610F"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="uni6A1A"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="uni82E8"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="uni8552"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="uni85A8"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="uni8E59"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="uni9A40"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="uniF9DC"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="532" language="0" nGroups="43">
+ <map code="0x0" name="uni0000"/><!-- ???? -->
+ <map code="0x1" name="uni0000"/><!-- ???? -->
+ <map code="0x2" name="uni0000"/><!-- ???? -->
+ <map code="0x3" name="uni0000"/><!-- ???? -->
+ <map code="0x4" name="uni0000"/><!-- ???? -->
+ <map code="0x5" name="uni0000"/><!-- ???? -->
+ <map code="0x6" name="uni0000"/><!-- ???? -->
+ <map code="0x7" name="uni0000"/><!-- ???? -->
+ <map code="0x8" name="uni0000"/><!-- ???? -->
+ <map code="0x9" name="uni0000"/><!-- ???? -->
+ <map code="0xa" name="uni0000"/><!-- ???? -->
+ <map code="0xb" name="uni0000"/><!-- ???? -->
+ <map code="0xc" name="uni0000"/><!-- ???? -->
+ <map code="0xd" name="uni0000"/><!-- ???? -->
+ <map code="0xe" name="uni0000"/><!-- ???? -->
+ <map code="0xf" name="uni0000"/><!-- ???? -->
+ <map code="0x10" name="uni0000"/><!-- ???? -->
+ <map code="0x11" name="uni0000"/><!-- ???? -->
+ <map code="0x12" name="uni0000"/><!-- ???? -->
+ <map code="0x13" name="uni0000"/><!-- ???? -->
+ <map code="0x14" name="uni0000"/><!-- ???? -->
+ <map code="0x15" name="uni0000"/><!-- ???? -->
+ <map code="0x16" name="uni0000"/><!-- ???? -->
+ <map code="0x17" name="uni0000"/><!-- ???? -->
+ <map code="0x18" name="uni0000"/><!-- ???? -->
+ <map code="0x19" name="uni0000"/><!-- ???? -->
+ <map code="0x1a" name="uni0000"/><!-- ???? -->
+ <map code="0x1b" name="uni0000"/><!-- ???? -->
+ <map code="0x1c" name="uni0000"/><!-- ???? -->
+ <map code="0x1d" name="uni0000"/><!-- ???? -->
+ <map code="0x1e" name="uni0000"/><!-- ???? -->
+ <map code="0x1f" name="uni0000"/><!-- ???? -->
+ <map code="0x20" name="uni0000"/><!-- SPACE -->
+ <map code="0x21" name="exclam"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="uni0000"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="uni50CE"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="uni610F"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="uni6A1A"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="uni82E8"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="uni8552"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="uni85A8"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="uni8E59"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="uni9A40"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="uniF9DC"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ <cmap_format_14 platformID="0" platEncID="5">
+ <map uv="0x9686" uvs="0xfe00" name="uniF9DC"/>
+ <map uv="0x9686" uvs="0xe0101" name="uniF9DC"/>
+ </cmap_format_14>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x0" name="uni0000"/><!-- ???? -->
+ <map code="0x1" name="uni0000"/><!-- ???? -->
+ <map code="0x2" name="uni0000"/><!-- ???? -->
+ <map code="0x3" name="uni0000"/><!-- ???? -->
+ <map code="0x4" name="uni0000"/><!-- ???? -->
+ <map code="0x5" name="uni0000"/><!-- ???? -->
+ <map code="0x6" name="uni0000"/><!-- ???? -->
+ <map code="0x7" name="uni0000"/><!-- ???? -->
+ <map code="0x8" name="uni0000"/><!-- ???? -->
+ <map code="0x9" name="uni0000"/><!-- ???? -->
+ <map code="0xa" name="uni0000"/><!-- ???? -->
+ <map code="0xb" name="uni0000"/><!-- ???? -->
+ <map code="0xc" name="uni0000"/><!-- ???? -->
+ <map code="0xd" name="uni0000"/><!-- ???? -->
+ <map code="0xe" name="uni0000"/><!-- ???? -->
+ <map code="0xf" name="uni0000"/><!-- ???? -->
+ <map code="0x10" name="uni0000"/><!-- ???? -->
+ <map code="0x11" name="uni0000"/><!-- ???? -->
+ <map code="0x12" name="uni0000"/><!-- ???? -->
+ <map code="0x13" name="uni0000"/><!-- ???? -->
+ <map code="0x14" name="uni0000"/><!-- ???? -->
+ <map code="0x15" name="uni0000"/><!-- ???? -->
+ <map code="0x16" name="uni0000"/><!-- ???? -->
+ <map code="0x17" name="uni0000"/><!-- ???? -->
+ <map code="0x18" name="uni0000"/><!-- ???? -->
+ <map code="0x19" name="uni0000"/><!-- ???? -->
+ <map code="0x1a" name="uni0000"/><!-- ???? -->
+ <map code="0x1b" name="uni0000"/><!-- ???? -->
+ <map code="0x1c" name="uni0000"/><!-- ???? -->
+ <map code="0x1d" name="uni0000"/><!-- ???? -->
+ <map code="0x1e" name="uni0000"/><!-- ???? -->
+ <map code="0x1f" name="uni0000"/><!-- ???? -->
+ <map code="0x20" name="uni0000"/><!-- SPACE -->
+ <map code="0x21" name="exclam"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="uni0000"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="uni50CE"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="uni610F"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="uni6A1A"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="uni82E8"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="uni8552"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="uni85A8"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="uni8E59"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="uni9A40"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="uniF9DC"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="532" language="0" nGroups="43">
+ <map code="0x0" name="uni0000"/><!-- ???? -->
+ <map code="0x1" name="uni0000"/><!-- ???? -->
+ <map code="0x2" name="uni0000"/><!-- ???? -->
+ <map code="0x3" name="uni0000"/><!-- ???? -->
+ <map code="0x4" name="uni0000"/><!-- ???? -->
+ <map code="0x5" name="uni0000"/><!-- ???? -->
+ <map code="0x6" name="uni0000"/><!-- ???? -->
+ <map code="0x7" name="uni0000"/><!-- ???? -->
+ <map code="0x8" name="uni0000"/><!-- ???? -->
+ <map code="0x9" name="uni0000"/><!-- ???? -->
+ <map code="0xa" name="uni0000"/><!-- ???? -->
+ <map code="0xb" name="uni0000"/><!-- ???? -->
+ <map code="0xc" name="uni0000"/><!-- ???? -->
+ <map code="0xd" name="uni0000"/><!-- ???? -->
+ <map code="0xe" name="uni0000"/><!-- ???? -->
+ <map code="0xf" name="uni0000"/><!-- ???? -->
+ <map code="0x10" name="uni0000"/><!-- ???? -->
+ <map code="0x11" name="uni0000"/><!-- ???? -->
+ <map code="0x12" name="uni0000"/><!-- ???? -->
+ <map code="0x13" name="uni0000"/><!-- ???? -->
+ <map code="0x14" name="uni0000"/><!-- ???? -->
+ <map code="0x15" name="uni0000"/><!-- ???? -->
+ <map code="0x16" name="uni0000"/><!-- ???? -->
+ <map code="0x17" name="uni0000"/><!-- ???? -->
+ <map code="0x18" name="uni0000"/><!-- ???? -->
+ <map code="0x19" name="uni0000"/><!-- ???? -->
+ <map code="0x1a" name="uni0000"/><!-- ???? -->
+ <map code="0x1b" name="uni0000"/><!-- ???? -->
+ <map code="0x1c" name="uni0000"/><!-- ???? -->
+ <map code="0x1d" name="uni0000"/><!-- ???? -->
+ <map code="0x1e" name="uni0000"/><!-- ???? -->
+ <map code="0x1f" name="uni0000"/><!-- ???? -->
+ <map code="0x20" name="uni0000"/><!-- SPACE -->
+ <map code="0x21" name="exclam"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="uni0000"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="uni50CE"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="uni610F"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="uni6A1A"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="uni82E8"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="uni8552"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="uni85A8"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="uni8E59"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="uni9A40"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="uniF9DC"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ </cmap>
+
+ <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">
+ Kanji-w0.00
+ </namerecord>
+ <namerecord nameID="258" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w0.00
+ </namerecord>
+ <namerecord nameID="259" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w239.00
+ </namerecord>
+ <namerecord nameID="260" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w239.00
+ </namerecord>
+ <namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w240.00
+ </namerecord>
+ <namerecord nameID="262" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w240.00
+ </namerecord>
+ <namerecord nameID="263" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w439.00
+ </namerecord>
+ <namerecord nameID="264" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w439.00
+ </namerecord>
+ <namerecord nameID="265" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w440.00
+ </namerecord>
+ <namerecord nameID="266" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w440.00
+ </namerecord>
+ <namerecord nameID="267" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w499.00
+ </namerecord>
+ <namerecord nameID="268" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w499.00
+ </namerecord>
+ <namerecord nameID="269" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w500.00
+ </namerecord>
+ <namerecord nameID="270" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w500.00
+ </namerecord>
+ <namerecord nameID="271" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w599.00
+ </namerecord>
+ <namerecord nameID="272" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w599.00
+ </namerecord>
+ <namerecord nameID="273" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w600.00
+ </namerecord>
+ <namerecord nameID="274" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w600.00
+ </namerecord>
+ <namerecord nameID="275" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w669.00
+ </namerecord>
+ <namerecord nameID="276" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w669.00
+ </namerecord>
+ <namerecord nameID="277" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w670.00
+ </namerecord>
+ <namerecord nameID="278" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w670.00
+ </namerecord>
+ <namerecord nameID="279" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w699.00
+ </namerecord>
+ <namerecord nameID="280" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w699.00
+ </namerecord>
+ <namerecord nameID="281" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w700.00
+ </namerecord>
+ <namerecord nameID="282" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w700.00
+ </namerecord>
+ <namerecord nameID="283" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-799.00
+ </namerecord>
+ <namerecord nameID="284" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-799.00
+ </namerecord>
+ <namerecord nameID="285" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w800.00
+ </namerecord>
+ <namerecord nameID="286" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w800.00
+ </namerecord>
+ <namerecord nameID="287" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w889.00
+ </namerecord>
+ <namerecord nameID="288" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w889.00
+ </namerecord>
+ <namerecord nameID="289" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w890.00
+ </namerecord>
+ <namerecord nameID="290" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w890.00
+ </namerecord>
+ <namerecord nameID="291" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Kanji-w1000.00
+ </namerecord>
+ <namerecord nameID="292" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansJPVFTest-Kanji-w1000.00
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w0.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w0.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w0.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w0.00
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w0.00
+ </namerecord>
+ <namerecord nameID="258" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w0.00
+ </namerecord>
+ <namerecord nameID="259" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w239.00
+ </namerecord>
+ <namerecord nameID="260" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w239.00
+ </namerecord>
+ <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w240.00
+ </namerecord>
+ <namerecord nameID="262" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w240.00
+ </namerecord>
+ <namerecord nameID="263" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w439.00
+ </namerecord>
+ <namerecord nameID="264" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w439.00
+ </namerecord>
+ <namerecord nameID="265" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w440.00
+ </namerecord>
+ <namerecord nameID="266" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w440.00
+ </namerecord>
+ <namerecord nameID="267" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w499.00
+ </namerecord>
+ <namerecord nameID="268" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w499.00
+ </namerecord>
+ <namerecord nameID="269" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w500.00
+ </namerecord>
+ <namerecord nameID="270" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w500.00
+ </namerecord>
+ <namerecord nameID="271" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w599.00
+ </namerecord>
+ <namerecord nameID="272" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w599.00
+ </namerecord>
+ <namerecord nameID="273" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w600.00
+ </namerecord>
+ <namerecord nameID="274" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w600.00
+ </namerecord>
+ <namerecord nameID="275" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w669.00
+ </namerecord>
+ <namerecord nameID="276" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w669.00
+ </namerecord>
+ <namerecord nameID="277" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w670.00
+ </namerecord>
+ <namerecord nameID="278" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w670.00
+ </namerecord>
+ <namerecord nameID="279" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w699.00
+ </namerecord>
+ <namerecord nameID="280" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w699.00
+ </namerecord>
+ <namerecord nameID="281" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w700.00
+ </namerecord>
+ <namerecord nameID="282" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w700.00
+ </namerecord>
+ <namerecord nameID="283" platformID="3" platEncID="1" langID="0x409">
+ Kanji-799.00
+ </namerecord>
+ <namerecord nameID="284" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-799.00
+ </namerecord>
+ <namerecord nameID="285" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w800.00
+ </namerecord>
+ <namerecord nameID="286" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w800.00
+ </namerecord>
+ <namerecord nameID="287" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w889.00
+ </namerecord>
+ <namerecord nameID="288" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w889.00
+ </namerecord>
+ <namerecord nameID="289" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w890.00
+ </namerecord>
+ <namerecord nameID="290" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w890.00
+ </namerecord>
+ <namerecord nameID="291" platformID="3" platEncID="1" langID="0x409">
+ Kanji-w1000.00
+ </namerecord>
+ <namerecord nameID="292" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVFTest-Kanji-w1000.00
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF2>
+ <major value="2"/>
+ <minor value="0"/>
+ <CFFFont name="CFF2Font">
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ </Private>
+ </FontDict>
+ <FontDict index="2">
+ <Private>
+ <BlueValues value="0 0"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 100 -120 rmoveto
+ 800 1000 -800 hlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 hlineto
+ -286 -450 rmoveto
+ 318 409 rlineto
+ -818 vlineto
+ -668 -41 rmoveto
+ 318 409 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 -318 -409 rlineto
+ </CharString>
+ <CharString name="exclam" fdSelectIndex="2">
+ 134 755 107 18 2 blend
+ rmoveto
+ -48 -137 1 blend
+ hlineto
+ 8 -565 16 50 2 blend
+ rlineto
+ 32 106 1 blend
+ hlineto
+ -17 -202 -52 -67 2 blend
+ rmoveto
+ 24 14 18 22 25 -14 18 -22 -23 -14 -21 -24 -18 13 -20 22 38 25 26 38 37 -28 25 -37 -34 -30 -22 -38 -40 27 -26 39 16 blend
+ hvcurveto
+ </CharString>
+ <CharString name="uni0000" fdSelectIndex="2">
+ </CharString>
+ <CharString name="uni50CE" fdSelectIndex="1">
+ 5 vsindex
+ 326 793 1 0 2 17 0 29 2 blend
+ rmoveto
+ -280 24 0 40 1 blend
+ vlineto
+ -47 16 -8 59 -31 0 -53 6 0 10 -13 0 -21 20 0 33 4 blend
+ vhcurveto
+ 13 120 4 0 6 -46 0 -76 2 blend
+ 0 13 4 0 7 1 blend
+ hhcurveto
+ 49 10 20 82 4 12 0 19 12 0 20 3 0 5 2 0 3 4 0 8 5 blend
+ hvcurveto
+ -10 2 -11 5 -8 6 -12 0 -21 3 0 5 -21 0 -35 6 0 11 -9 0 -14 7 0 11 6 blend
+ rrcurveto
+ -75 19 0 32 1 blend
+ -3 -5 -10 -29 -24 -102 1 0 1 1 0 2 7 0 12 9 0 14 42 0 70 5 blend
+ 0 -18 6 0 10 1 blend
+ hhcurveto
+ -38 -6 4 21 10 0 18 2 0 3 0 0 -1 4 0 7 4 blend
+ hvcurveto
+ 280 -25 0 -41 1 blend
+ vlineto
+ -41 -464 -40 -8 -74 10 20 41 2 blend
+ rmoveto
+ -30 617 30 -50 -4 -90 -5 12 5 50 4 90 3 blend
+ vlineto
+ -661 -178 11 -4 12 4 -13 -7 2 blend
+ rmoveto
+ -30 689 30 -52 -3 -92 -11 0 -18 52 3 92 3 blend
+ vlineto
+ -481 284 -27 -2 -48 -32 36 -21 2 blend
+ rmoveto
+ -306 30 306 0 -13 0 60 2 103 0 13 0 3 blend
+ vlineto
+ 218 0 -61 0 -102 -1 0 -1 2 blend
+ rmoveto
+ -306 30 306 0 -13 0 61 1 104 0 13 0 3 blend
+ vlineto
+ -417 358 -17 -1 -30 19 -43 -12 2 blend
+ rmoveto
+ -30 217 -116 -217 -30 247 176 -36 0 -61 -52 0 -87 50 0 84 52 0 87 -37 0 -62 -6 0 -10 23 0 39 7 blend
+ vlineto
+ 75 -26 0 -44 1 blend
+ hmoveto
+ -280 24 0 40 1 blend
+ vlineto
+ -47 17 -8 60 -31 0 -53 5 0 9 -13 0 -21 20 0 33 4 blend
+ vhcurveto
+ 12 125 5 0 8 -47 0 -78 2 blend
+ 0 14 4 0 7 1 blend
+ hhcurveto
+ 49 11 20 82 3 12 0 20 12 0 19 3 1 6 2 1 6 5 0 9 5 blend
+ hvcurveto
+ -9 2 -12 4 -8 7 -14 1 -22 3 0 5 -19 -1 -34 7 0 12 -9 0 -14 6 0 10 6 blend
+ rrcurveto
+ -75 19 -1 29 1 blend
+ -3 -5 -10 -30 -25 -105 1 -1 1 8 0 13 8 0 14 42 0 70 4 blend
+ 0 -18 6 0 9 1 blend
+ hhcurveto
+ -40 -6 4 21 11 0 19 2 0 3 0 0 -1 4 1 8 4 blend
+ hvcurveto
+ 280 -25 -1 -42 1 blend
+ vlineto
+ -16 -29 0 -48 1 blend
+ hmoveto
+ -30 217 -116 -217 -30 247 176 -36 0 -61 -50 0 -84 50 0 84 50 0 84 -37 0 -62 -3 0 -5 23 0 39 7 blend
+ vlineto
+ -424 -714 -19 0 -32 -12 0 -21 2 blend
+ rmoveto
+ -52 -54 -91 -49 -81 -33 8 -5 11 -13 4 -6 80 36 94 56 56 58 7 0 11 9 0 15 5 0 9 11 0 18 -2 0 -3 9 0 15 13 0 22 -11 0 -18 24 0 39 -22 0 -36 11 0 19 -12 0 -21 4 0 7 -4 0 -6 2 0 2 -2 0 -4 -1 0 -1 3 0 5 18 blend
+ rrcurveto
+ 200 -7 -92 0 -154 -5 0 -8 2 blend
+ rmoveto
+ 76 -41 90 -62 46 -42 -6 0 -10 5 0 8 -5 0 -7 6 0 10 -4 0 -7 4 0 7 6 blend
+ rrcurveto
+ 22 23 -46 42 -91 60 -75 39 60 0 100 29 0 48 0 0 -1 -3 0 -5 3 0 5 -7 0 -11 6 0 11 -7 0 -11 8 blend
+ rlinecurve
+ -499 750 -48 0 -81 6 0 10 2 blend
+ rmoveto
+ -54 -167 -87 -164 -96 -108 7 -6 11 -12 4 -6 98 116 88 165 58 175 7 0 13 15 0 25 10 0 16 14 0 22 11 0 19 10 0 17 9 0 15 -20 0 -33 15 0 24 -44 0 -73 4 0 7 -18 0 -30 4 0 6 4 0 6 3 0 6 19 0 32 0 0 -1 1 0 1 18 blend
+ rrcurveto
+ -113 -214 -60 0 -100 -23 0 -37 2 blend
+ rmoveto
+ -691 30 718 20 0 33 64 0 108 43 0 72 3 blend
+ vlineto
+ -1 -1 0 -3 1 blend
+ 2 rlineto
+ </CharString>
+ <CharString name="uni610F" fdSelectIndex="1">
+ 1 vsindex
+ 306 142 -19 1 -27 7 0 10 2 blend
+ rmoveto
+ -156 45 -2 64 1 blend
+ vlineto
+ -50 22 -8 79 -42 2 -59 8 -1 11 -18 0 -27 43 -1 62 4 blend
+ vhcurveto
+ 17 186 8 -1 11 -68 3 -97 2 blend
+ 0 18 8 0 12 1 blend
+ hhcurveto
+ 70 13 25 114 5 22 -1 31 17 -1 24 2 1 4 0 -1 -1 7 0 10 5 blend
+ hvcurveto
+ -9 3 -12 4 -9 6 -20 1 -28 3 0 4 -31 1 -45 10 0 15 -13 0 -19 9 -1 13 6 blend
+ rrcurveto
+ -109 -4 -7 -13 -49 -38 -156 33 -1 47 -1 0 -1 1 0 1 2 0 3 10 0 15 9 0 13 60 -3 85 7 blend
+ 0 -27 5 0 8 1 blend
+ hhcurveto
+ -59 -10 5 22 11 0 16 2 -1 2 -1 0 -2 4 0 6 4 blend
+ hvcurveto
+ 157 -47 2 -67 1 blend
+ vlineto
+ 63 34 -74 3 -106 -25 1 -36 2 blend
+ rmoveto
+ 65 -30 74 -47 37 -37 -7 1 -10 5 -1 7 -3 0 -4 5 0 7 -3 0 -4 6 0 9 6 blend
+ rrcurveto
+ 20 22 -37 36 -75 47 -65 28 48 -2 68 47 -2 67 -1 0 -1 -6 1 -8 2 0 3 -8 0 -11 8 -1 11 -6 0 -9 8 blend
+ rlinecurve
+ 320 -64 -49 3 -69 -32 1 -46 2 blend
+ rmoveto
+ 76 -49 83 -75 38 -12 0 -18 -6 1 -8 -13 0 -19 -4 0 -6 -9 1 -12 5 blend
+ -54 rrcurveto
+ 23 19 -38 54 -84 73 -76 49 69 -3 98 35 -2 50 5 0 8 2 0 3 11 0 16 2 0 2 13 -1 18 2 0 4 8 blend
+ rlinecurve
+ -557 -5 -85 4 -121 -6 0 -9 2 blend
+ rmoveto
+ -28 -68 -50 -72 -77 -40 5 -1 6 1 0 1 3 1 5 6 0 9 13 -1 18 1 0 1 6 blend
+ rrcurveto
+ 24 -17 79 42 47 74 31 71 62 -3 89 -42 2 -60 -7 1 -10 5 -1 7 -6 0 -8 1 0 1 -2 -1 -4 4 1 7 8 blend
+ rlinecurve
+ -117 625 -26 2 -36 42 -3 59 2 blend
+ rmoveto
+ -30 775 30 -57 3 -81 -3 0 -5 57 -3 81 3 blend
+ vlineto
+ -818 -176 -1 0 -2 12 0 18 2 blend
+ rmoveto
+ -30 869 30 -56 2 -81 3 0 5 56 -2 81 3 blend
+ vlineto
+ -455 258 -40 2 -57 -38 2 -54 2 blend
+ rmoveto
+ -99 30 99 -18 0 -27 81 -3 116 18 0 27 3 blend
+ vlineto
+ -236 -127 -60 2 -86 -18 0 -27 2 blend
+ rmoveto
+ 26 -40 25 -53 9 -36 -12 1 -17 10 0 15 -10 -1 -15 13 0 19 -4 0 -6 11 -1 15 6 blend
+ rrcurveto
+ 29 12 -10 35 -25 53 -27 39 76 -3 109 12 0 18 3 1 5 -10 0 -15 10 -1 14 -15 1 -21 11 0 16 -11 0 -16 8 blend
+ rlinecurve
+ 393 2 -112 4 -161 -1 0 -2 2 blend
+ rmoveto
+ -16 -38 -31 -57 -23 -35 7 0 11 12 -1 17 13 -1 18 19 0 28 10 0 14 8 -1 11 6 blend
+ rrcurveto
+ 27 -12 24 36 26 48 23 46 70 -2 101 -10 1 -14 -8 0 -12 -13 1 -18 -6 -1 -9 -17 0 -25 -1 1 -1 -10 1 -14 8 blend
+ rlinecurve
+ -504 -378 27 -1 39 -8 0 -12 2 blend
+ rmoveto
+ 559 -94 -559 -110 5 -157 44 -2 63 110 -5 157 3 blend
+ hlineto
+ 216 -52 2 -74 1 blend
+ vmoveto
+ 559 -92 -559 -110 5 -157 43 -1 62 110 -5 157 3 blend
+ hlineto
+ -30 122 -75 3 -107 -4 0 -6 2 blend
+ rmoveto
+ -276 619 276 -26 0 -38 45 -2 64 26 0 38 3 blend
+ vlineto
+ </CharString>
+ <CharString name="uni6A1A" fdSelectIndex="1">
+ 5 vsindex
+ 51 612 -8 0 -14 29 0 49 2 blend
+ rmoveto
+ -30 -60 0 -100 1 blend
+ 307 30 60 0 100 1 blend
+ vlineto
+ -149 228 -32 0 -53 -20 0 -34 2 blend
+ rmoveto
+ -918 30 918 -19 0 -32 62 0 103 19 0 32 3 blend
+ vlineto
+ -36 -238 -55 0 -91 -32 0 -53 2 blend
+ rmoveto
+ -31 -160 -74 -193 -68 -95 7 -5 10 -11 6 -8 70 101 74 203 33 160 6 0 10 25 0 42 13 0 21 23 0 37 4 0 7 1 0 2 8 0 14 -18 0 -30 13 0 21 -27 0 -44 4 0 7 -19 0 -32 1 0 2 6 0 10 -12 0 -20 -2 0 -3 -2 0 -4 -1 0 -2 18 blend
+ rrcurveto
+ 4 -143 19 0 32 77 0 128 2 blend
+ rmoveto
+ -21 -16 25 -26 72 -92 21 -33 -23 0 -38 -34 0 -57 1 0 2 -15 0 -24 -12 0 -21 -6 0 -11 2 0 3 -18 0 -29 8 blend
+ rlinecurve
+ 24 24 -18 25 -81 96 -22 22 28 0 48 63 0 105 2 0 2 -1 0 -2 1 0 3 10 0 16 1 0 1 1 0 2 8 blend
+ rlinecurve
+ 157 278 1 0 1 -14 0 -23 2 blend
+ rmoveto
+ -30 559 30 -54 0 -90 -17 3 -23 54 0 90 3 blend
+ vlineto
+ -457 -518 29 -3 43 -9 -3 -20 2 blend
+ rmoveto
+ -30 176 30 -46 0 -77 -17 0 -27 46 0 77 3 blend
+ vlineto
+ -194 120 -3 0 -5 -42 37 -35 2 blend
+ rmoveto
+ -365 30 365 38 -29 45 53 0 88 -38 29 -45 3 blend
+ vlineto
+ 135 508 -87 0 -146 33 -34 24 2 blend
+ rmoveto
+ -122 30 122 -19 0 -31 63 0 106 19 0 31 3 blend
+ vlineto
+ -115 -172 -60 0 -100 -27 34 -19 2 blend
+ rmoveto
+ -288 30 288 11 -24 18 50 0 83 -11 24 -18 3 blend
+ vlineto
+ 148 -62 -2 -106 1 blend
+ hmoveto
+ -288 30 288 11 -24 18 50 0 83 -11 24 -18 3 blend
+ vlineto
+ 156 -394 -30 2 -47 19 -34 6 2 blend
+ rmoveto
+ -52 -36 -89 -48 -61 -29 7 0 12 2 0 4 14 0 23 3 0 4 11 0 18 4 0 8 6 blend
+ rrcurveto
+ 15 -21 62 28 86 41 57 44 25 0 42 -39 0 -66 -10 0 -17 -4 0 -6 -12 0 -19 -3 0 -5 -6 0 -11 -5 0 -9 8 blend
+ rlinecurve
+ -541 323 10 0 17 44 5 84 2 blend
+ rmoveto
+ -30 517 -150 -517 -30 547 210 -46 -2 -81 -74 0 -123 54 -13 80 74 0 123 -46 -2 -81 -19 0 -32 38 17 82 7 blend
+ vlineto
+ -232 -242 -10 0 -16 -28 29 -27 2 blend
+ rmoveto
+ -344 58 -32 71 1 blend
+ vlineto
+ -47 15 -9 54 -33 -2 -58 3 0 4 -15 0 -25 22 0 37 4 blend
+ vhcurveto
+ 12 100 3 0 5 -47 0 -78 2 blend
+ 0 12 4 0 6 1 blend
+ hhcurveto
+ 48 10 25 102 3 12 0 20 11 0 19 4 1 9 11 -1 16 5 0 8 5 blend
+ hvcurveto
+ -9 3 -11 4 -8 6 -14 0 -23 3 -1 5 -23 1 -37 8 1 15 -8 -1 -15 8 0 12 6 blend
+ rrcurveto
+ -97 11 1 20 1 blend
+ -3 -4 -14 -29 -21 -84 0 0 1 1 -1 1 10 0 16 10 1 17 43 -1 71 5 blend
+ 0 -16 7 0 12 1 blend
+ hhcurveto
+ -33 -6 5 22 13 0 22 3 0 5 -1 0 -2 4 0 7 4 blend
+ hvcurveto
+ 344 -59 34 -71 1 blend
+ vlineto
+ -346 -371 -24 0 -41 65 -34 78 2 blend
+ rmoveto
+ 10 -31 77 16 100 22 99 21 3 0 5 -54 0 -90 -2 0 -3 -3 0 -5 -9 0 -15 -6 0 -10 -10 0 -17 -5 0 -8 8 blend
+ rlinecurve
+ -2 29 -108 -22 -104 -22 -72 -13 -3 0 -5 52 0 86 9 0 16 6 0 10 8 0 13 6 0 11 4 0 6 4 0 6 8 blend
+ rlinecurve
+ -16 767 -44 0 -72 -13 0 -21 2 blend
+ rmoveto
+ -316 -6 0 -11 1 blend
+ vlineto
+ -142 -7 -194 -74 -141 2 0 2 -2 0 -2 2 0 4 6 0 9 4 blend
+ vhcurveto
+ 8 -3 13 -7 5 -6 13 0 21 -7 0 -11 25 0 43 -20 0 -34 11 0 17 -10 0 -17 6 blend
+ rrcurveto
+ 75 143 10 205 145 4 0 7 3 0 5 2 0 4 21 0 35 9 0 15 5 blend
+ vvcurveto
+ 316 6 0 11 1 blend
+ vlineto
+ </CharString>
+ <CharString name="uni82E8" fdSelectIndex="1">
+ 3 vsindex
+ 58 743 -1 0 -2 26 0 60 2 blend
+ rmoveto
+ -30 887 30 -43 0 -99 2 0 5 43 0 99 3 blend
+ vlineto
+ -630 96 -29 0 -66 -19 0 -44 2 blend
+ rmoveto
+ -207 30 207 -2 -2 -9 50 0 114 2 2 9 3 blend
+ vlineto
+ 305 -44 0 -100 1 blend
+ hmoveto
+ -207 30 207 -2 -2 -9 51 0 115 2 2 9 3 blend
+ vlineto
+ -521 -240 -36 0 -82 2 0 4 2 blend
+ rmoveto
+ -206 -5 0 -10 1 blend
+ vlineto
+ -137 -15 -184 -109 -136 5 0 11 3 0 6 5 0 10 -1 0 -1 8 0 19 5 blend
+ vhcurveto
+ 7 -3 12 -9 5 -6 12 0 27 -6 0 -13 22 0 51 -15 0 -35 10 0 21 -8 0 -19 6 blend
+ rrcurveto
+ 112 139 18 194 141 3 0 7 -4 0 -8 1 0 3 11 0 24 4 0 10 5 blend
+ vvcurveto
+ 207 5 0 11 1 blend
+ vlineto
+ -19 -18 0 -42 1 blend
+ hmoveto
+ -30 670 -153 -670 -30 700 213 -38 0 -87 -64 0 -144 48 0 111 64 0 144 -38 0 -87 -14 0 -30 28 0 63 7 blend
+ vlineto
+ -531 -249 -15 0 -36 -23 0 -51 2 blend
+ rmoveto
+ -343 50 0 112 1 blend
+ vlineto
+ -66 31 -12 105 -29 0 -66 6 0 14 -13 0 -28 29 0 66 4 blend
+ vhcurveto
+ 23 278 5 0 12 -59 0 -134 2 blend
+ 0 24 6 0 14 1 blend
+ hhcurveto
+ 96 15 31 123 8 20 0 44 11 0 26 4 0 8 14 0 32 5 0 11 5 blend
+ hvcurveto
+ -9 3 -13 4 -9 7 -13 0 -30 2 0 5 -21 0 -48 8 0 17 -10 -1 -23 6 0 15 6 blend
+ rrcurveto
+ -117 -6 -11 -21 -69 -56 -236 8 0 18 -1 1 -1 1 -1 1 3 0 7 3 1 9 7 0 15 49 0 112 7 blend
+ 0 -41 4 0 8 1 blend
+ hhcurveto
+ -84 -16 11 37 4 0 10 2 0 5 -3 0 -7 1 0 2 4 blend
+ hvcurveto
+ 343 -51 0 -115 1 blend
+ vlineto
+ 444 -47 -59 0 -135 26 0 59 2 blend
+ rmoveto
+ -101 -52 -195 -56 -169 -40 4 -7 5 -10 3 -7 172 40 193 54 120 56 4 0 8 3 0 7 18 0 43 9 0 19 12 0 26 8 0 19 5 0 12 -10 0 -22 7 0 15 -18 0 -41 1 0 3 -11 0 -25 -8 0 -19 -9 0 -21 -8 0 -18 -8 0 -19 5 0 11 0 0 1 18 blend
+ rrcurveto
+ </CharString>
+ <CharString name="uni8552" fdSelectIndex="1">
+ 2 vsindex
+ 53 761 -3 0 -3 36 0 40 2 blend
+ rmoveto
+ -30 896 30 -65 -1 -73 5 0 5 65 1 73 3 blend
+ vlineto
+ -631 78 -46 0 -52 -22 0 -24 2 blend
+ rmoveto
+ -162 30 162 -8 -32 -41 98 1 111 8 32 41 3 blend
+ vlineto
+ 296 -105 -1 -118 1 blend
+ hmoveto
+ -162 30 162 -8 -32 -41 100 1 112 8 32 41 3 blend
+ vlineto
+ -47 -217 -23 0 -26 -57 -1 -64 2 blend
+ rmoveto
+ 209 -109 -209 -101 -1 -113 72 1 81 101 1 113 3 blend
+ hlineto
+ -235 109 24 0 27 -72 -1 -81 2 blend
+ rmoveto
+ 205 -109 -205 -99 -1 -111 72 1 81 99 1 111 3 blend
+ hlineto
+ -227 109 18 1 21 -72 -1 -81 2 blend
+ rmoveto
+ 197 -109 -197 -93 -2 -105 72 1 81 93 2 105 3 blend
+ hlineto
+ -30 139 -87 -2 -98 -15 0 -17 2 blend
+ rmoveto
+ -169 731 169 -41 0 -46 38 0 42 41 0 46 3 blend
+ vlineto
+ -650 -375 62 1 70 -32 0 -36 2 blend
+ rmoveto
+ 571 -76 -571 -159 -1 -179 48 0 54 159 1 179 3 blend
+ hlineto
+ -30 -38 0 -43 1 blend
+ vmoveto
+ 571 -77 -571 -159 -1 -179 48 0 54 159 1 179 3 blend
+ hlineto
+ 287 -66 -1 -74 1 blend
+ vmoveto
+ 571 -74 -571 -159 -1 -179 46 0 52 159 1 179 3 blend
+ hlineto
+ -30 104 -99 -1 -111 -4 0 -5 2 blend
+ rmoveto
+ -347 631 347 -18 0 -20 45 0 50 18 0 20 3 blend
+ vlineto
+ -216 -389 -86 -1 -96 -31 0 -35 2 blend
+ rmoveto
+ 127 -34 121 -39 72 -31 -17 0 -19 2 0 2 -13 0 -15 -2 0 -2 -13 0 -15 3 0 3 6 blend
+ rrcurveto
+ 31 22 -78 32 -126 39 -121 136 1 153 39 0 44 1 0 1 -3 0 -3 -8 0 -9 4 0 5 9 0 10 7 blend
+ 31 rlinecurve
+ -258 -1 -67 -1 -75 0 0 -1 2 blend
+ rmoveto
+ -81 -39 -128 -36 -107 -23 8 -6 12 -12 5 -6 103 25 130 41 86 43 9 0 10 6 0 7 3 0 4 7 0 8 -4 0 -5 7 0 8 19 0 22 -14 0 -16 32 0 36 -32 0 -36 17 0 19 -19 0 -21 3 0 3 -1 0 -1 5 0 6 2 0 2 1 0 1 4 0 5 18 blend
+ rrcurveto
+ </CharString>
+ <CharString name="uni85A8" fdSelectIndex="1">
+ 2 vsindex
+ 53 761 -3 0 -3 31 0 35 2 blend
+ rmoveto
+ -30 896 30 -76 -1 -86 5 0 5 76 1 86 3 blend
+ vlineto
+ -802 -461 2 0 2 -23 0 -26 2 blend
+ rmoveto
+ -30 703 30 -53 0 -60 3 0 4 53 0 60 3 blend
+ vlineto
+ -532 539 -58 -1 -65 6 0 7 2 blend
+ rmoveto
+ -171 30 171 -16 -19 -36 102 1 114 16 19 36 3 blend
+ vlineto
+ 299 -100 -1 -112 1 blend
+ hmoveto
+ -171 30 171 -16 -19 -36 102 1 115 16 19 36 3 blend
+ vlineto
+ -46 -219 -34 0 -39 -64 -1 -72 2 blend
+ rmoveto
+ 204 -121 -204 -110 -1 -123 83 1 93 110 1 123 3 blend
+ hlineto
+ -230 121 33 1 38 -83 -1 -93 2 blend
+ rmoveto
+ 200 -121 -200 -108 -2 -122 83 1 93 108 2 122 3 blend
+ hlineto
+ -222 121 27 -1 30 -83 -1 -93 2 blend
+ rmoveto
+ 192 -121 -192 -101 -1 -114 83 1 93 101 1 114 3 blend
+ hlineto
+ -30 151 -87 -1 -98 -29 0 -33 2 blend
+ rmoveto
+ -181 716 181 -24 0 -27 11 0 12 24 0 27 3 blend
+ vlineto
+ -788 -240 -17 0 -19 9 0 11 2 blend
+ rmoveto
+ -130 30 100 786 -100 30 130 -37 0 -42 88 1 99 -20 0 -23 -150 -1 -168 20 0 23 95 1 106 37 0 42 7 blend
+ vlineto
+ -610 -123 -56 -1 -63 -44 0 -50 2 blend
+ rmoveto
+ -50 -62 -93 -73 -118 -54 8 -4 10 -9 6 -7 121 58 92 75 59 70 9 0 11 13 0 15 19 0 21 29 0 32 9 0 10 22 0 25 12 0 14 -11 0 -12 19 0 21 -26 0 -30 7 0 8 -16 0 -18 3 0 3 -13 0 -14 -10 0 -11 -19 0 -21 -2 0 -2 8 0 8 18 blend
+ rrcurveto
+ 124 -78 -89 -1 -100 32 0 36 2 blend
+ rmoveto
+ -7 -6 0 -6 1 blend
+ vlineto
+ -65 -139 -176 -81 -162 -31 6 -6 8 -12 3 -8 168 37 178 84 72 154 16 0 17 30 0 34 36 0 41 26 0 29 -7 0 -8 12 0 13 12 0 14 -16 0 -18 15 0 16 -30 0 -33 5 0 6 -18 0 -21 26 0 29 -5 0 -5 -23 0 -26 -12 0 -14 -5 0 -5 6 0 7 18 blend
+ rrcurveto
+ -19 11 -6 -2 -47 0 -53 13 0 15 -13 0 -15 0 0 -1 4 blend
+ rlineto
+ -333 -72 75 1 85 -55 0 -61 2 blend
+ rmoveto
+ 65 -25 75 -46 38 -35 -35 0 -40 8 0 9 -38 0 -42 15 0 17 -18 0 -21 14 0 15 6 blend
+ rrcurveto
+ 26 19 -39 34 -76 45 -64 25 49 0 56 31 0 35 19 0 21 -14 0 -16 39 0 44 -18 0 -20 32 0 36 -9 0 -10 8 blend
+ rlinecurve
+ 72 55 -55 0 -62 28 0 31 2 blend
+ rmoveto
+ -30 -30 -42 0 -47 -42 0 -47 2 blend
+ rlineto
+ 269 30 -14 0 -16 42 0 47 2 blend
+ hlineto
+ 74 74 13 0 15 -22 0 -24 2 blend
+ rmoveto
+ -276 80 1 90 1 blend
+ vlineto
+ -52 21 -9 77 -48 0 -54 8 0 9 -21 0 -24 44 0 49 4 blend
+ vhcurveto
+ 16 182 8 0 9 -90 -1 -101 2 blend
+ 0 18 8 0 9 1 blend
+ hhcurveto
+ 62 12 21 88 4 25 0 28 20 0 22 6 0 7 10 0 11 9 0 10 5 blend
+ hvcurveto
+ -9 2 -12 5 -8 6 -24 0 -26 4 0 5 -34 0 -39 12 0 13 -16 0 -18 10 0 11 6 blend
+ rrcurveto
+ -81 25 0 28 1 blend
+ -4 -6 -11 -41 -37 -154 -1 0 -1 0 1 1 11 -1 12 15 1 17 79 1 89 5 blend
+ 0 -26 9 0 10 1 blend
+ hhcurveto
+ -56 -9 6 25 17 0 19 2 0 3 -1 -1 -2 4 0 5 4 blend
+ hvcurveto
+ 276 -81 -1 -91 1 blend
+ vlineto
+ 278 -62 -114 -1 -128 32 0 36 2 blend
+ rmoveto
+ -66 -32 -126 -33 -107 -23 5 -7 5 -10 2 -7 110 22 126 32 81 36 10 0 11 7 0 8 30 0 34 11 0 12 21 0 23 9 0 10 7 0 8 -14 0 -16 9 0 10 -27 0 -30 3 0 4 -15 0 -17 -15 0 -17 -10 0 -11 -12 0 -14 -11 0 -12 3 0 4 -3 0 -4 18 blend
+ rrcurveto
+ </CharString>
+ <CharString name="uni8E59" fdSelectIndex="1">
+ 3 vsindex
+ 193 296 41 0 93 -8 0 -19 2 blend
+ rmoveto
+ 625 -94 -625 -84 -1 -192 27 0 63 84 1 192 3 blend
+ hlineto
+ -30 124 -48 0 -110 -6 0 -14 2 blend
+ rmoveto
+ -154 685 154 -15 0 -34 16 0 38 15 0 34 3 blend
+ vlineto
+ -365 -132 -33 0 -76 1 1 3 2 blend
+ rmoveto
+ -232 -7 -1 -16 1 blend
+ vlineto
+ 30 -5 51 0 117 -11 0 -27 2 blend
+ rlineto
+ 237 18 1 43 1 blend
+ vlineto
+ -11 -92 -27 0 -62 1 -1 2 2 blend
+ rmoveto
+ -30 397 30 -22 0 -52 -12 0 -27 22 0 52 3 blend
+ vlineto
+ -760 647 25 0 56 -4 0 -9 2 blend
+ rmoveto
+ -30 811 30 -28 0 -65 -12 0 -27 28 0 65 3 blend
+ vlineto
+ -823 -13 0 -29 1 blend
+ hmoveto
+ -143 12 0 27 1 blend
+ vlineto
+ -83 -13 -107 -75 -82 4 0 9 3 0 6 5 1 12 -1 0 -1 5 -1 11 5 blend
+ vhcurveto
+ 7 -4 11 -9 5 -6 10 0 21 -5 0 -12 20 0 46 -17 0 -38 6 0 15 -8 0 -18 6 blend
+ rrcurveto
+ 79 5 0 11 1 blend
+ 85 16 118 88 1 1 3 9 0 19 6 0 15 3 blend
+ vvcurveto
+ 143 -11 0 -25 1 blend
+ vlineto
+ 199 -25 -46 -1 -106 -23 0 -54 2 blend
+ rmoveto
+ -167 30 37 0 85 1 blend
+ 167 vlineto
+ -14 -59 -18 0 -42 8 0 18 2 blend
+ rmoveto
+ -30 185 30 -12 0 -26 -4 0 -9 12 0 26 3 blend
+ vlineto
+ -365 -96 10 0 22 7 0 17 2 blend
+ rmoveto
+ -30 392 30 -17 0 -39 -4 0 -9 17 0 39 3 blend
+ vlineto
+ -218 -10 -15 0 -33 -6 0 -13 2 blend
+ rmoveto
+ -160 23 0 51 1 blend
+ vlineto
+ -8 -2 0 0 -1 1 blend
+ -3 -11 -1 1 0 3 0 0 1 2 blend
+ vhcurveto
+ -11 -1 -30 2 0 4 1 0 1 4 0 10 3 blend
+ 0 -47 13 0 30 1 blend
+ 1 5 -9 6 -10 2 -9 4 0 8 -6 0 -13 6 0 13 -11 0 -25 2 0 6 -8 0 -19 6 blend
+ rrcurveto
+ 50 30 -5 0 -11 1 0 2 2 blend
+ 0 6 17 3 0 8 5 1 12 2 blend
+ hvcurveto
+ 17 5 4 9 21 6 -1 12 4 0 9 1 0 3 4 0 8 11 0 25 5 blend
+ vvcurveto
+ 159 -21 0 -46 1 blend
+ vlineto
+ -132 -50 -39 0 -88 1 0 1 2 blend
+ rmoveto
+ -25 -42 -40 -39 -44 -30 8 -4 13 -10 5 -4 41 6 0 12 3 0 8 7 0 16 3 0 5 5 0 13 1 0 4 6 0 13 -3 0 -8 10 0 22 -6 0 -14 5 0 12 -5 0 -10 -3 0 -8 13 blend
+ 30 45 -7 0 -14 1 blend
+ 47 26 45 -3 0 -8 1 0 1 2 blend
+ rrcurveto
+ 153 -7 -13 0 -30 -1 0 -2 2 blend
+ rmoveto
+ 35 -27 38 -39 18 -28 -8 3 -11 3 -5 -3 -9 3 -14 6 -7 -3 -5 1 -9 4 -4 0 6 blend
+ rrcurveto
+ 24 18 -18 27 -39 39 -34 25 23 1 55 6 -1 12 4 -1 8 -3 4 1 9 -3 13 -6 7 2 7 -3 9 -4 5 4 8 blend
+ rlinecurve
+ 115 330 -53 -1 -124 9 1 21 2 blend
+ rmoveto
+ 14 -286 131 -209 160 0 50 1 18 34 6 108 -9 3 -11 5 -9 7 -4 -92 -9 -34 -31 -1 -137 -2 -126 185 -12 281 3 0 8 6 0 14 5 0 10 -10 0 -22 -3 0 -6 0 0 -1 14 0 33 -1 0 -1 11 0 23 -3 0 -8 5 0 12 10 0 24 -10 0 -23 3 0 7 -14 0 -32 8 0 18 -8 0 -17 8 0 17 0 0 -1 11 0 26 0 0 1 4 0 9 5 0 11 1 0 1 29 0 67 0 1 2 8 0 17 0 -1 -1 -2 0 -4 -37 0 -85 30 blend
+ rrcurveto
+ 207 -169 -37 0 -85 -4 0 -9 2 blend
+ rmoveto
+ -61 -129 -111 -108 -121 -69 7 -5 12 -11 5 -6 119 74 113 110 66 136 4 15 19 8 14 33 4 28 29 8 5 22 2 28 27 6 2 17 8 1 20 -6 0 -14 14 1 34 -13 -1 -31 6 0 15 -7 0 -17 0 -28 -23 -4 -2 -10 0 -27 -20 -1 -3 -5 -1 -16 -12 -1 -15 -19 18 blend
+ rrcurveto
+ -156 153 -20 -2 -49 -2 0 -3 2 blend
+ rmoveto
+ 52 -15 63 -26 34 -1 0 -3 -1 0 -1 0 0 1 0 0 -2 0 0 -2 5 blend
+ -21 rrcurveto
+ 15 27 -34 20 -64 24 -51 14 21 0 48 20 0 47 -1 0 -1 1 0 1 0 0 -1 0 0 1 1 0 3 -1 0 -2 8 blend
+ rlinecurve
+ -453 -763 1 0 2 12 0 27 2 blend
+ rmoveto
+ -25 -16 -31 0 -71 -7 0 -17 2 blend
+ rlineto
+ -100 89 146 -18 233 -21 0 -46 -5 0 -12 -13 0 -29 -4 0 -9 -8 0 -18 5 blend
+ hhcurveto
+ 249 23 0 53 1 blend
+ hlineto
+ 2 8 6 14 6 8 -35 0 -207 2 -1 3 11 0 25 5 1 12 17 0 38 4 0 10 8 0 18 -16 0 -37 -1 0 -3 -1 0 -2 9 blend
+ 0 -22 -14 0 -32 1 blend
+ 0 -214 0 -150 15 -78 89 24 0 55 0 0 1 18 0 40 -2 0 -5 12 0 28 -1 0 -2 6 blend
+ rrcurveto
+ 5 62 -50 0 -114 -10 0 -22 2 blend
+ rmoveto
+ -30 -97 -92 -60 -107 -36 8 -6 12 -11 4 -6 105 41 99 65 32 106 5 0 12 7 0 15 15 0 34 1 0 3 7 0 16 1 0 2 10 0 22 -6 0 -15 18 0 41 -17 0 -37 8 0 18 -8 0 -19 -2 0 -5 4 0 9 -12 0 -27 7 0 16 -1 0 -2 6 0 14 18 blend
+ rrcurveto
+ </CharString>
+ <CharString name="uni9A40" fdSelectIndex="1">
+ 1 vsindex
+ 55 767 2 0 3 37 -2 55 2 blend
+ rmoveto
+ -30 892 30 -44 2 -62 -6 0 -9 44 -2 62 3 blend
+ vlineto
+ -637 72 -28 1 -40 -26 2 -39 2 blend
+ rmoveto
+ -153 30 153 -27 0 -27 77 -2 111 27 0 27 3 blend
+ vlineto
+ 315 -89 3 -128 1 blend
+ hmoveto
+ -153 30 153 -27 0 -27 79 -3 113 27 0 27 3 blend
+ vlineto
+ -462 -288 8 0 12 -11 0 -16 2 blend
+ rmoveto
+ 571 -62 -571 -102 3 -147 27 -1 39 102 -3 147 3 blend
+ hlineto
+ 152 -29 1 -42 1 blend
+ vmoveto
+ 571 -60 -571 -102 3 -147 26 -1 37 102 -3 147 3 blend
+ hlineto
+ -30 -71 2 -102 1 blend
+ 90 rmoveto
+ -212 631 212 -23 1 -32 45 -2 64 23 -1 32 3 blend
+ vlineto
+ -776 -263 -22 1 -31 -4 0 -5 2 blend
+ rmoveto
+ -30 905 30 -42 2 -60 10 0 14 42 -2 60 3 blend
+ vlineto
+ -716 -160 36 -1 52 -26 2 -37 2 blend
+ rmoveto
+ -30 554 30 -13 0 -19 -59 2 -85 13 0 19 3 blend
+ vlineto
+ -554 -78 59 -2 85 5 -1 7 2 blend
+ rmoveto
+ -30 563 30 -13 1 -19 -56 1 -81 13 -1 19 3 blend
+ vlineto
+ -578 -79 2 1 4 6 0 8 2 blend
+ rmoveto
+ -30 617 30 -27 1 -39 4 -1 5 27 -1 39 3 blend
+ vlineto
+ -477 382 -24 2 -34 8 0 12 2 blend
+ rmoveto
+ -46 -92 -113 -104 -167 -65 7 -5 10 -9 5 -8 172 70 111 106 55 101 6 -1 8 -5 -1 -8 17 0 25 11 0 16 -3 -1 -5 6 0 9 12 0 18 -11 0 -16 18 0 26 -27 1 -39 6 -1 8 -16 1 -23 14 0 20 3 0 5 -6 0 -8 1 0 1 3 0 4 28 -1 41 18 blend
+ rrcurveto
+ 298 -65 -24 0 -35 3 0 4 2 blend
+ rmoveto
+ -25 -12 -55 2 -79 -15 0 -22 2 blend
+ rlineto
+ 62 -80 121 -81 100 -38 5 8 9 11 7 6 -101 33 -119 76 -59 77 2 0 3 -14 1 -20 -10 1 -14 2 0 3 20 0 29 1 0 2 9 -1 13 18 -1 25 20 -1 28 26 -1 38 14 0 21 14 -1 19 -13 0 -19 -7 0 -10 9 0 13 -18 2 -25 4 -1 5 -7 0 -10 18 blend
+ rrcurveto
+ -211 -88 -39 3 -55 -12 1 -17 2 blend
+ rmoveto
+ -239 30 239 -2 -1 -4 69 -4 98 2 1 4 3 blend
+ vlineto
+ 316 -223 -74 3 -106 11 -1 15 2 blend
+ rmoveto
+ -6 -4 0 -6 1 blend
+ vlineto
+ -8 -87 -7 -34 -10 -10 2 0 3 24 -1 35 -1 1 -1 6 0 9 1 -1 1 1 0 1 6 blend
+ rrcurveto
+ -6 -1 0 -1 1 blend
+ -6 -6 -1 -12 2 0 3 1 blend
+ hhcurveto
+ -11 -31 1 0 1 10 0 15 2 blend
+ 1 3 -34 0 -1 -1 9 0 13 2 blend
+ hvcurveto
+ 5 -8 3 -13 6 -1 8 -11 1 -16 5 0 8 -19 1 -26 4 blend
+ 1 -8 28 -2 30 -1 14 1 -14 1 -20 7 -1 9 1 0 1 2 0 3 2 -1 2 3 1 5 0 1 1 7 blend
+ 21 0 10 4 10 9 16 15 7 35 2 -1 2 8 -1 11 2 0 3 5 0 7 5 0 8 3 -1 4 3 0 4 2 1 4 3 0 4 9 blend
+ 9 89 -15 1 -21 1 blend
+ rrcurveto
+ 7 1 1 12 6 -1 8 1 0 1 1 -1 1 9 0 13 4 blend
+ 0 hhcurveto
+ -660 -34 -57 3 -82 -8 0 -11 2 blend
+ rmoveto
+ -17 -46 1 0 2 7 0 10 2 blend
+ -32 -46 -46 5 0 7 5 0 7 2 blend
+ -23 rrcurveto
+ 20 -21 52 28 31 51 17 46 56 -2 81 -24 0 -35 -4 -1 -7 0 1 1 -4 1 -5 -7 0 -10 1 -1 1 0 0 -1 8 blend
+ rlinecurve
+ 110 -3 -67 3 -96 1 0 2 2 blend
+ rmoveto
+ 13 -38 10 -49 0 -32 -3 0 -4 4 -1 5 -2 0 -3 2 1 4 -1 1 -1 3 0 4 6 blend
+ rrcurveto
+ 29 6 55 -3 78 8 -1 11 2 blend
+ -1 31 -10 50 -15 37 -3 0 -4 0 1 1 -4 0 -6 3 -1 4 -4 1 -5 5 blend
+ rlinecurve
+ 113 -6 -56 3 -80 -7 0 -10 2 blend
+ rmoveto
+ 22 -32 20 -44 7 -30 2 0 3 1 -1 1 3 -1 3 1 0 1 2 0 3 5 blend
+ rrcurveto
+ 28 10 -8 29 -21 44 -23 32 48 -2 69 15 0 22 -2 1 -2 -1 0 -2 0 -1 -1 -5 1 -6 -1 1 -1 -4 0 -6 8 blend
+ rlinecurve
+ 117 -5 -45 1 -65 -17 1 -24 2 blend
+ rmoveto
+ 25 -23 -1 0 -1 2 -1 2 2 blend
+ 27 -32 13 -23 -2 1 -2 1 0 2 2 blend
+ rrcurveto
+ 21 14 -12 44 -2 63 20 -1 28 0 0 -1 3 blend
+ 22 -27 32 -26 22 -2 0 -2 -2 0 -3 1 0 1 -2 1 -2 4 blend
+ rlinecurve
+ -381 267 39 -1 56 7 -1 10 2 blend
+ rmoveto
+ -16 -30 -33 1 -47 -23 1 -33 2 blend
+ rlineto
+ 498 30 -42 1 -61 23 -1 33 2 blend
+ hlineto
+ -516 -23 21 0 31 -14 0 -21 2 blend
+ rmoveto
+ -224 30 247 6 0 9 75 -4 106 10 0 14 3 blend
+ vlineto
+ </CharString>
+ <CharString name="uniF9DC" fdSelectIndex="1">
+ 4 vsindex
+ 529 746 23 0 29 30 4 43 2 blend
+ rmoveto
+ -30 320 30 -58 0 -73 -29 0 -36 58 0 73 3 blend
+ vlineto
+ -397 -495 15 0 18 12 -4 10 2 blend
+ rmoveto
+ -30 442 30 -56 0 -71 21 0 27 56 0 71 3 blend
+ vlineto
+ -420 149 -6 0 -8 6 -4 2 2 blend
+ rmoveto
+ -30 374 30 -54 0 -68 -25 0 -31 54 0 68 3 blend
+ vlineto
+ -514 -420 34 0 42 -3 4 1 2 blend
+ rmoveto
+ -30 626 30 -66 0 -82 -29 0 -36 66 0 82 3 blend
+ vlineto
+ -531 144 15 0 19 -9 0 -11 2 blend
+ rmoveto
+ -30 460 30 -55 0 -69 -4 0 -5 55 0 69 3 blend
+ vlineto
+ -53 622 -42 0 -53 -6 4 -2 2 blend
+ rmoveto
+ -7 -9 0 -12 1 blend
+ vlineto
+ -86 -171 -222 -118 -188 -45 7 -7 8 -11 3 -8 192 51 224 119 94 187 14 0 18 37 0 46 27 0 34 19 0 24 -7 0 -9 5 0 7 15 0 18 -16 0 -20 17 0 22 -32 0 -40 9 0 11 -19 0 -24 21 0 26 3 0 3 -17 0 -21 -9 0 -11 2 0 2 -3 0 -4 18 blend
+ rrcurveto
+ -19 12 -6 -2 -55 0 -68 27 0 34 -12 0 -15 -3 0 -3 4 blend
+ rlineto
+ -323 -32 55 0 69 -25 0 -32 2 blend
+ rmoveto
+ -25 -11 -68 0 -86 -23 0 -28 2 blend
+ rlineto
+ 83 -154 177 -116 201 -44 4 8 9 12 7 6 -200 39 -177 113 -79 147 11 0 14 12 0 15 -18 0 -22 21 0 26 -1 0 -1 4 0 5 11 0 13 21 0 26 21 0 27 32 0 40 17 0 21 16 0 20 9 0 11 -10 0 -12 17 0 21 -36 0 -45 1 0 2 -37 0 -47 18 blend
+ rrcurveto
+ 59 127 -46 0 -58 9 -4 6 2 blend
+ rmoveto
+ -40 -82 -80 -104 -112 -75 8 -4 10 -9 6 -7 115 80 2 0 2 8 0 10 7 0 9 23 0 29 2 0 3 16 0 20 16 0 20 -12 0 -15 26 0 32 -30 0 -37 10 0 13 -18 0 -23 8 0 10 -4 0 -5 14 blend
+ 80 106 47 90 -13 0 -16 11 0 13 14 0 17 3 blend
+ rrcurveto
+ -129 -493 -106 -5 -137 21 6 34 2 blend
+ rmoveto
+ -27 -73 -43 -71 -51 -50 8 -5 13 -9 5 -5 49 52 47 77 29 77 6 0 8 11 0 14 7 0 8 8 0 10 5 0 7 8 0 10 16 0 20 -8 0 -10 28 0 35 -17 -1 -22 15 0 18 -11 0 -14 -3 0 -4 -4 0 -5 -2 0 -2 -1 0 -1 -3 0 -4 -3 1 -3 18 blend
+ rrcurveto
+ 124 -1 -66 4 -77 10 15 31 2 blend
+ rmoveto
+ -374 30 374 4 0 5 84 0 105 -4 0 -5 3 blend
+ vlineto
+ -586 460 -72 0 -90 2 -21 -24 2 blend
+ rmoveto
+ -875 30 845 209 30 -27 0 -33 77 0 96 -53 0 -66 -79 0 -99 80 0 99 5 blend
+ vlineto
+ -8 -29 0 -36 1 blend
+ hmoveto
+ -7 -29 0 -36 1 blend
+ vlineto
+ -28 -75 -43 -102 -46 -95 14 0 17 10 0 13 11 0 14 -41 0 -51 17 0 22 4 0 5 6 blend
+ rrcurveto
+ 89 -91 24 -74 -63 -32 0 -40 23 0 28 -11 0 -14 10 0 13 17 0 21 5 blend
+ vvcurveto
+ -33 -6 -35 -19 -13 3 0 4 1 0 1 15 0 18 7 0 9 4 0 5 5 blend
+ vhcurveto
+ -10 -6 -12 3 0 3 0 0 1 1 0 2 3 blend
+ -3 -14 -1 -20 -2 -26 1 -29 4 0 5 1 0 1 7 0 9 2 0 2 13 0 16 -1 0 -1 11 0 14 7 blend
+ 2 7 -9 4 -13 11 0 13 -21 0 -26 5 0 6 -33 0 -41 4 blend
+ 1 -8 22 -2 27 0 22 -21 0 -27 1 0 2 1 0 1 -3 0 -4 0 0 1 -4 0 -5 6 blend
+ 2 19 2 17 5 12 9 3 0 4 2 0 2 3 0 3 2 0 2 4 0 5 3 0 4 6 blend
+ rrcurveto
+ 25 17 10 7 0 9 5 0 7 4 0 5 3 blend
+ 43 44 22 0 27 1 blend
+ vvcurveto
+ 67 -22 76 -86 89 -8 0 -10 9 0 12 -6 0 -8 24 0 30 -11 0 -13 5 blend
+ vhcurveto
+ 39 84 42 98 33 81 -10 0 -13 -4 0 -5 -8 0 -10 14 0 17 -6 0 -8 7 0 9 6 blend
+ rrcurveto
+ -20 14 -6 -2 -60 0 -75 32 0 40 -12 0 -14 -2 0 -3 4 blend
+ rlineto
+ </CharString>
+ </CharStrings>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=16 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.669"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.669"/>
+ <PeakCoord value="0.67"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="3">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.67"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="4">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.889"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="5">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.889"/>
+ <PeakCoord value="0.89"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="6">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.89"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="7">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.439"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="8">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.439"/>
+ <PeakCoord value="0.44"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="9">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.44"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="10">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.799"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="11">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.799"/>
+ <PeakCoord value="0.8"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="12">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.8"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="13">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.599"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="14">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.599"/>
+ <PeakCoord value="0.6"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="15">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.6"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=6 -->
+ <VarData index="0">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="0"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="1"/>
+ <VarRegionIndex index="1" value="2"/>
+ <VarRegionIndex index="2" value="3"/>
+ </VarData>
+ <VarData index="2">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="4"/>
+ <VarRegionIndex index="1" value="5"/>
+ <VarRegionIndex index="2" value="6"/>
+ </VarData>
+ <VarData index="3">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="7"/>
+ <VarRegionIndex index="1" value="8"/>
+ <VarRegionIndex index="2" value="9"/>
+ </VarData>
+ <VarData index="4">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="10"/>
+ <VarRegionIndex index="1" value="11"/>
+ <VarRegionIndex index="2" value="12"/>
+ </VarData>
+ <VarData index="5">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="13"/>
+ <VarRegionIndex index="1" value="14"/>
+ <VarRegionIndex index="2" value="15"/>
+ </VarData>
+ </VarStore>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF2>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <HVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=20 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.439"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.439"/>
+ <PeakCoord value="0.44"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.44"/>
+ <PeakCoord value="0.599"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="3">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.599"/>
+ <PeakCoord value="0.6"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="4">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.6"/>
+ <PeakCoord value="0.669"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="5">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.669"/>
+ <PeakCoord value="0.67"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="6">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.67"/>
+ <PeakCoord value="0.799"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="7">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.799"/>
+ <PeakCoord value="0.8"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="8">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.8"/>
+ <PeakCoord value="0.889"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="9">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.889"/>
+ <PeakCoord value="0.89"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="10">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.89"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="11">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="12">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.669"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="13">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.67"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="14">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.889"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="15">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.44"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="16">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.799"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="17">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.8"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="18">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.599"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="19">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.6"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=1 -->
+ <VarData index="0">
+ <!-- ItemCount=3 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="11"/>
+ <Item index="0" value="[-22]"/>
+ <Item index="1" value="[0]"/>
+ <Item index="2" value="[76]"/>
+ </VarData>
+ </VarStore>
+ <AdvWidthMap>
+ <Map glyph=".notdef" outer="0" inner="1"/>
+ <Map glyph="exclam" outer="0" inner="2"/>
+ <Map glyph="uni0000" outer="0" inner="0"/>
+ <Map glyph="uni50CE" outer="0" inner="1"/>
+ <Map glyph="uni610F" outer="0" inner="1"/>
+ <Map glyph="uni6A1A" outer="0" inner="1"/>
+ <Map glyph="uni82E8" outer="0" inner="1"/>
+ <Map glyph="uni8552" outer="0" inner="1"/>
+ <Map glyph="uni85A8" outer="0" inner="1"/>
+ <Map glyph="uni8E59" outer="0" inner="1"/>
+ <Map glyph="uni9A40" outer="0" inner="1"/>
+ <Map glyph="uniF9DC" outer="0" inner="1"/>
+ </AdvWidthMap>
+ </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>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <avar>
+ <segment axis="wght">
+ <mapping from="-1.0" to="-1.0"/>
+ <mapping from="0.0" to="0.0"/>
+ <mapping from="0.1429" to="0.16"/>
+ <mapping from="0.2143" to="0.32"/>
+ <mapping from="0.2857" to="0.39"/>
+ <mapping from="0.4286" to="0.56"/>
+ <mapping from="0.7143" to="0.78"/>
+ <mapping from="1.0" to="1.0"/>
+ </segment>
+ </avar>
+
+ <fvar>
+
+ <!-- Weight -->
+ <Axis>
+ <AxisTag>wght</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>200.0</MinValue>
+ <DefaultValue>200.0</DefaultValue>
+ <MaxValue>900.0</MaxValue>
+ <AxisNameID>256</AxisNameID>
+ </Axis>
+
+ <!-- Kanji-w0.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w0.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="258" subfamilyNameID="257">
+ <coord axis="wght" value="200.0"/>
+ </NamedInstance>
+
+ <!-- Kanji-w239.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w239.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="260" subfamilyNameID="259">
+ <coord axis="wght" value="324.6875"/>
+ </NamedInstance>
+
+ <!-- Kanji-w240.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w240.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="262" subfamilyNameID="261">
+ <coord axis="wght" value="325.0"/>
+ </NamedInstance>
+
+ <!-- Kanji-w439.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w439.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="264" subfamilyNameID="263">
+ <coord axis="wght" value="428.82353"/>
+ </NamedInstance>
+
+ <!-- Kanji-w440.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w440.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="266" subfamilyNameID="265">
+ <coord axis="wght" value="429.41176"/>
+ </NamedInstance>
+
+ <!-- Kanji-w499.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w499.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="268" subfamilyNameID="267">
+ <coord axis="wght" value="464.11765"/>
+ </NamedInstance>
+
+ <!-- Kanji-w500.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w500.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="270" subfamilyNameID="269">
+ <coord axis="wght" value="464.70589"/>
+ </NamedInstance>
+
+ <!-- Kanji-w599.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w599.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="272" subfamilyNameID="271">
+ <coord axis="wght" value="535.45454"/>
+ </NamedInstance>
+
+ <!-- Kanji-w600.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w600.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="274" subfamilyNameID="273">
+ <coord axis="wght" value="536.36363"/>
+ </NamedInstance>
+
+ <!-- Kanji-w669.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w669.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="276" subfamilyNameID="275">
+ <coord axis="wght" value="599.09091"/>
+ </NamedInstance>
+
+ <!-- Kanji-w670.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w670.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="278" subfamilyNameID="277">
+ <coord axis="wght" value="600.0"/>
+ </NamedInstance>
+
+ <!-- Kanji-w699.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w699.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="280" subfamilyNameID="279">
+ <coord axis="wght" value="626.36363"/>
+ </NamedInstance>
+
+ <!-- Kanji-w700.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w700.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="282" subfamilyNameID="281">
+ <coord axis="wght" value="627.27272"/>
+ </NamedInstance>
+
+ <!-- Kanji-799.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-799.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="284" subfamilyNameID="283">
+ <coord axis="wght" value="717.27272"/>
+ </NamedInstance>
+
+ <!-- Kanji-w800.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w800.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="286" subfamilyNameID="285">
+ <coord axis="wght" value="718.18182"/>
+ </NamedInstance>
+
+ <!-- Kanji-w889.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w889.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="288" subfamilyNameID="287">
+ <coord axis="wght" value="799.09091"/>
+ </NamedInstance>
+
+ <!-- Kanji-w890.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w890.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="290" subfamilyNameID="289">
+ <coord axis="wght" value="800.0"/>
+ </NamedInstance>
+
+ <!-- Kanji-w1000.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w1000.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="292" subfamilyNameID="291">
+ <coord axis="wght" value="900.0"/>
+ </NamedInstance>
+ </fvar>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="exclam" height="1000" tsb="125"/>
+ <mtx name="uni0000" height="1000" tsb="880"/>
+ <mtx name="uni50CE" height="1000" tsb="49"/>
+ <mtx name="uni610F" height="1000" tsb="40"/>
+ <mtx name="uni6A1A" height="1000" tsb="40"/>
+ <mtx name="uni82E8" height="1000" tsb="41"/>
+ <mtx name="uni8552" height="1000" tsb="41"/>
+ <mtx name="uni85A8" height="1000" tsb="41"/>
+ <mtx name="uni8E59" height="1000" tsb="40"/>
+ <mtx name="uni9A40" height="1000" tsb="41"/>
+ <mtx name="uniF9DC" height="1000" tsb="39"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/cffLib/specializer_test.py b/Tests/cffLib/specializer_test.py
index 912e66ee..a52c9269 100644
--- a/Tests/cffLib/specializer_test.py
+++ b/Tests/cffLib/specializer_test.py
@@ -1,7 +1,13 @@
from __future__ import print_function, division, absolute_import
from fontTools.cffLib.specializer import (programToString, stringToProgram,
- generalizeProgram, specializeProgram)
+ generalizeProgram, specializeProgram,
+ programToCommands, commandsToProgram,
+ generalizeCommands,
+ specializeCommands)
+from fontTools.ttLib import TTFont
+import os
import unittest
+from fontTools.misc.testTools import parseXML, DataFilesHandler
# TODO
# https://github.com/fonttools/fonttools/pull/959#commitcomment-22059841
@@ -913,6 +919,30 @@ class CFFSpecializeProgramTest(unittest.TestCase):
self.assertEqual(get_specialized_charstr(test_charstr), xpct_charstr)
+class CFF2VFTestSpecialize(DataFilesHandler):
+
+ def test_blend_round_trip(self):
+ ttx_path = self.getpath('TestSparseCFF2VF.ttx')
+ ttf_font = TTFont(recalcBBoxes=False, recalcTimestamp=False)
+ ttf_font.importXML(ttx_path)
+ fontGlyphList = ttf_font.getGlyphOrder()
+ topDict = ttf_font['CFF2'].cff.topDictIndex[0]
+ charstrings = topDict.CharStrings
+ for glyphName in fontGlyphList:
+ cs = charstrings[glyphName]
+ cs.decompile()
+ cmds = programToCommands(cs.program, getNumRegions=cs.getNumRegions)
+ cmds_g = generalizeCommands(cmds)
+ cmds = specializeCommands(cmds_g, generalizeFirst=False)
+ program = commandsToProgram(cmds)
+ self.assertEqual(program, cs.program)
+ program = specializeProgram(program, getNumRegions=cs.getNumRegions)
+ self.assertEqual(program, cs.program)
+ program_g = generalizeProgram(program, getNumRegions=cs.getNumRegions)
+ program = commandsToProgram(cmds_g)
+ self.assertEqual(program, program_g)
+
+
if __name__ == "__main__":
import sys
sys.exit(unittest.main())
diff --git a/Tests/designspaceLib/designspace_test.py b/Tests/designspaceLib/designspace_test.py
index 2d01c659..608ffb1c 100644
--- a/Tests/designspaceLib/designspace_test.py
+++ b/Tests/designspaceLib/designspace_test.py
@@ -13,6 +13,7 @@ from fontTools.misc import plistlib
from fontTools.designspaceLib import (
DesignSpaceDocument, SourceDescriptor, AxisDescriptor, RuleDescriptor,
InstanceDescriptor, evaluateRule, processRules, posix, DesignSpaceDocumentError)
+from fontTools import ttLib
def _axesAsDict(axes):
"""
@@ -905,3 +906,46 @@ def test_findDefault_axis_mapping():
"""
designspace = DesignSpaceDocument.fromstring(designspace_string)
assert designspace.findDefault().filename == "Font-Italic.ufo"
+
+ designspace.axes[1].default = 0
+
+ assert designspace.findDefault().filename == "Font-Regular.ufo"
+
+
+def test_loadSourceFonts():
+
+ def opener(path):
+ font = ttLib.TTFont()
+ font.importXML(path)
+ return font
+
+ # this designspace file contains .TTX source paths
+ path = os.path.join(
+ os.path.dirname(os.path.dirname(__file__)),
+ "varLib",
+ "data",
+ "SparseMasters.designspace"
+ )
+ designspace = DesignSpaceDocument.fromfile(path)
+
+ # force two source descriptors to have the same path
+ designspace.sources[1].path = designspace.sources[0].path
+
+ fonts = designspace.loadSourceFonts(opener)
+
+ assert len(fonts) == 3
+ assert all(isinstance(font, ttLib.TTFont) for font in fonts)
+ assert fonts[0] is fonts[1] # same path, identical font object
+
+ fonts2 = designspace.loadSourceFonts(opener)
+
+ for font1, font2 in zip(fonts, fonts2):
+ assert font1 is font2
+
+
+def test_loadSourceFonts_no_required_path():
+ designspace = DesignSpaceDocument()
+ designspace.sources.append(SourceDescriptor())
+
+ with pytest.raises(DesignSpaceDocumentError, match="no 'path' attribute"):
+ designspace.loadSourceFonts(lambda p: p)
diff --git a/Tests/feaLib/ast_test.py b/Tests/feaLib/ast_test.py
index 7a43d7bf..54bd5b3e 100644
--- a/Tests/feaLib/ast_test.py
+++ b/Tests/feaLib/ast_test.py
@@ -11,6 +11,10 @@ class AstTest(unittest.TestCase):
statement.append(ast.GlyphName(name))
self.assertEqual(statement.asFea(), r"[\BASE \NULL foo a]")
+ def test_valuerecord_none(self):
+ statement = ast.ValueRecord(xPlacement=10, xAdvance=20)
+ self.assertEqual(statement.asFea(), "<10 0 20 0>")
+
if __name__ == "__main__":
import sys
diff --git a/Tests/feaLib/data/GPOS_1.ttx b/Tests/feaLib/data/GPOS_1.ttx
index bd320136..1a24f0b2 100644
--- a/Tests/feaLib/data/GPOS_1.ttx
+++ b/Tests/feaLib/data/GPOS_1.ttx
@@ -40,39 +40,36 @@
<Lookup index="0">
<LookupType value="1"/>
<LookupFlag value="0"/>
- <!-- SubTableCount=8 -->
- <SinglePos index="0" Format="1">
- <Coverage>
- <Glyph value="one"/>
- <Glyph value="two"/>
- <Glyph value="three"/>
- <Glyph value="five"/>
- </Coverage>
- <ValueFormat value="5"/>
- <Value XPlacement="-80" XAdvance="-160"/>
- </SinglePos>
- <SinglePos index="1" Format="2">
+ <!-- SubTableCount=7 -->
+ <SinglePos index="0" Format="2">
<Coverage>
<Glyph value="four"/>
<Glyph value="six"/>
+ <Glyph value="seven"/>
+ <Glyph value="eight"/>
+ <Glyph value="nine"/>
<Glyph value="four.oldstyle"/>
</Coverage>
<ValueFormat value="4"/>
- <!-- ValueCount=3 -->
+ <!-- ValueCount=6 -->
<Value index="0" XAdvance="400"/>
<Value index="1" XAdvance="-200"/>
- <Value index="2" XAdvance="401"/>
+ <Value index="2" XAdvance="-100"/>
+ <Value index="3" XAdvance="-100"/>
+ <Value index="4" XAdvance="-100"/>
+ <Value index="5" XAdvance="401"/>
</SinglePos>
- <SinglePos index="2" Format="1">
+ <SinglePos index="1" Format="1">
<Coverage>
- <Glyph value="seven"/>
- <Glyph value="eight"/>
- <Glyph value="nine"/>
+ <Glyph value="one"/>
+ <Glyph value="two"/>
+ <Glyph value="three"/>
+ <Glyph value="five"/>
</Coverage>
- <ValueFormat value="4"/>
- <Value XAdvance="-100"/>
+ <ValueFormat value="5"/>
+ <Value XPlacement="-80" XAdvance="-160"/>
</SinglePos>
- <SinglePos index="3" Format="2">
+ <SinglePos index="2" Format="2">
<Coverage>
<Glyph value="P"/>
<Glyph value="Q"/>
@@ -84,7 +81,7 @@
<Value index="1" XPlacement="1" XAdvance="801"/>
<Value index="2" XPlacement="1" XAdvance="802"/>
</SinglePos>
- <SinglePos index="4" Format="2">
+ <SinglePos index="3" Format="2">
<Coverage>
<Glyph value="S"/>
<Glyph value="T"/>
@@ -96,7 +93,7 @@
<Value index="1" XPlacement="1" YPlacement="1" XAdvance="804"/>
<Value index="2" XPlacement="1" YPlacement="1" XAdvance="805"/>
</SinglePos>
- <SinglePos index="5" Format="1">
+ <SinglePos index="4" Format="1">
<Coverage>
<Glyph value="A"/>
<Glyph value="B"/>
@@ -123,13 +120,13 @@
</XAdvDevice>
</Value>
</SinglePos>
- <SinglePos index="6" Format="1">
+ <SinglePos index="5" Format="1">
<Coverage>
<Glyph value="zero"/>
</Coverage>
<ValueFormat value="0"/>
</SinglePos>
- <SinglePos index="7" Format="1">
+ <SinglePos index="6" Format="1">
<Coverage>
<Glyph value="C"/>
</Coverage>
diff --git a/Tests/feaLib/parser_test.py b/Tests/feaLib/parser_test.py
index 98ac1014..9343495a 100644
--- a/Tests/feaLib/parser_test.py
+++ b/Tests/feaLib/parser_test.py
@@ -1185,7 +1185,7 @@ class ParserTest(unittest.TestCase):
self.assertRaisesRegex(
FeatureLibError,
'In reverse chaining single substitutions, the replacement '
- '\(after "by"\) must be a single glyph or glyph class',
+ r'\(after "by"\) must be a single glyph or glyph class',
self.parse, "feature test {rsub f_i by f i;} test;")
def test_script(self):
diff --git a/Tests/fontBuilder/data/test.otf.ttx b/Tests/fontBuilder/data/test.otf.ttx
index 4c9a2a75..76ebb177 100644
--- a/Tests/fontBuilder/data/test.otf.ttx
+++ b/Tests/fontBuilder/data/test.otf.ttx
@@ -233,6 +233,57 @@
</GlobalSubrs>
</CFF>
+ <GPOS>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="2"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <PairPos index="0" Format="1">
+ <Coverage Format="1">
+ <Glyph value="A"/>
+ </Coverage>
+ <ValueFormat1 value="4"/>
+ <ValueFormat2 value="0"/>
+ <!-- PairSetCount=1 -->
+ <PairSet index="0">
+ <!-- PairValueCount=1 -->
+ <PairValueRecord index="0">
+ <SecondGlyph value="a"/>
+ <Value1 XAdvance="-50"/>
+ </PairValueRecord>
+ </PairSet>
+ </PairPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
<hmtx>
<mtx name=".notdef" width="600" lsb="100"/>
<mtx name=".null" width="600" lsb="100"/>
diff --git a/Tests/fontBuilder/data/test.ttf.ttx b/Tests/fontBuilder/data/test.ttf.ttx
index b2804ccd..28e179e0 100644
--- a/Tests/fontBuilder/data/test.ttf.ttx
+++ b/Tests/fontBuilder/data/test.ttf.ttx
@@ -119,7 +119,7 @@
<sCapHeight value="0"/>
<usDefaultChar value="0"/>
<usBreakChar value="32"/>
- <usMaxContext value="2"/>
+ <usMaxContext value="1"/>
</OS_2>
<hmtx>
@@ -257,6 +257,45 @@
</extraNames>
</post>
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="salt"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="A" out="a"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
<DSIG>
<!-- note that the Digital Signature will be invalid after recompilation! -->
<tableHeader flag="0x1" numSigs="1" version="1"/>
diff --git a/Tests/fontBuilder/data/test_var.otf.ttx b/Tests/fontBuilder/data/test_var.otf.ttx
index c9465d23..e00d33c5 100644
--- a/Tests/fontBuilder/data/test_var.otf.ttx
+++ b/Tests/fontBuilder/data/test_var.otf.ttx
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
-<ttFont sfntVersion="OTTO" ttLibVersion="3.33">
+<ttFont sfntVersion="OTTO" ttLibVersion="3.38">
<GlyphOrder>
<!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
<GlyphID id="0" name=".notdef"/>
- <GlyphID id="1" name="glyph00001"/>
+ <GlyphID id="1" name=".null"/>
<GlyphID id="2" name="A"/>
<GlyphID id="3" name="a"/>
</GlyphOrder>
@@ -13,12 +13,12 @@
<!-- Most of this table will be recalculated by the compiler -->
<tableVersion value="1.0"/>
<fontRevision value="1.0"/>
- <checkSumAdjustment value="0xed07360f"/>
+ <checkSumAdjustment value="0x79eab779"/>
<magicNumber value="0x5f0f3cf5"/>
<flags value="00000000 00000011"/>
<unitsPerEm value="1000"/>
- <created value="Wed Dec 5 11:55:26 2018"/>
- <modified value="Wed Dec 5 11:55:26 2018"/>
+ <created value="Wed Mar 27 00:23:21 2019"/>
+ <modified value="Wed Mar 27 00:23:21 2019"/>
<xMin value="0"/>
<yMin value="0"/>
<xMax value="0"/>
@@ -105,14 +105,14 @@
<sCapHeight value="0"/>
<usDefaultChar value="0"/>
<usBreakChar value="32"/>
- <usMaxContext value="2"/>
+ <usMaxContext value="0"/>
</OS_2>
<hmtx>
<mtx name=".notdef" width="600" lsb="0"/>
+ <mtx name=".null" width="600" lsb="0"/>
<mtx name="A" width="600" lsb="0"/>
<mtx name="a" width="600" lsb="0"/>
- <mtx name="glyph00001" width="600" lsb="0"/>
</hmtx>
<cmap>
@@ -179,7 +179,7 @@
</name>
<post>
- <formatType value="3.0"/>
+ <formatType value="2.0"/>
<italicAngle value="0.0"/>
<underlinePosition value="0"/>
<underlineThickness value="0"/>
@@ -188,6 +188,18 @@
<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>
<CFF2>
@@ -212,6 +224,13 @@
67 66 33 67 67 hvcurveto
-900 vlineto
</CharString>
+ <CharString name=".null">
+ 100 100 rmoveto
+ 900 vlineto
+ -67 67 66 -33 67 hhcurveto
+ 67 66 33 67 67 hvcurveto
+ -900 vlineto
+ </CharString>
<CharString name="A">
100 100 rmoveto
900 vlineto
@@ -229,13 +248,6 @@
-400 -400 1 blend
hlineto
</CharString>
- <CharString name="glyph00001">
- 100 100 rmoveto
- 900 vlineto
- -67 67 66 -33 67 hhcurveto
- 67 66 33 67 67 hvcurveto
- -900 vlineto
- </CharString>
</CharStrings>
<VarStore Format="1">
<Format value="1"/>
diff --git a/Tests/fontBuilder/data/test_var.ttf.ttx b/Tests/fontBuilder/data/test_var.ttf.ttx
index 760e65a5..54ddfb06 100644
--- a/Tests/fontBuilder/data/test_var.ttf.ttx
+++ b/Tests/fontBuilder/data/test_var.ttf.ttx
@@ -119,7 +119,7 @@
<sCapHeight value="0"/>
<usDefaultChar value="0"/>
<usBreakChar value="32"/>
- <usMaxContext value="2"/>
+ <usMaxContext value="0"/>
</OS_2>
<hmtx>
diff --git a/Tests/fontBuilder/fontBuilder_test.py b/Tests/fontBuilder/fontBuilder_test.py
index 97d7cb6a..30952846 100644
--- a/Tests/fontBuilder/fontBuilder_test.py
+++ b/Tests/fontBuilder/fontBuilder_test.py
@@ -2,14 +2,13 @@ from __future__ import print_function, division, absolute_import
from __future__ import unicode_literals
import os
-import shutil
+import pytest
import re
from fontTools.ttLib import TTFont
from fontTools.pens.ttGlyphPen import TTGlyphPen
from fontTools.pens.t2CharStringPen import T2CharStringPen
from fontTools.fontBuilder import FontBuilder
from fontTools.ttLib.tables.TupleVariation import TupleVariation
-from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates
from fontTools.misc.psCharStrings import T2CharString
@@ -53,6 +52,43 @@ def _setupFontBuilder(isTTF, unitsPerEm=1024):
return fb, advanceWidths, nameStrings
+def _setupFontBuilderFvar(fb):
+ assert 'name' in fb.font, 'Must run setupNameTable() first.'
+
+ axes = [
+ ('TEST', 0, 0, 100, "Test Axis"),
+ ]
+ instances = [
+ dict(location=dict(TEST=0), stylename="TotallyNormal"),
+ dict(location=dict(TEST=100), stylename="TotallyTested"),
+ ]
+ fb.setupFvar(axes, instances)
+
+ return fb
+
+
+def _setupFontBuilderCFF2(fb):
+ assert 'fvar' in fb.font, 'Must run _setupFontBuilderFvar() first.'
+
+ pen = T2CharStringPen(None, None, CFF2=True)
+ drawTestGlyph(pen)
+ charString = pen.getCharString()
+
+ program = [
+ 200, 200, -200, -200, 2, "blend", "rmoveto",
+ 400, 400, 1, "blend", "hlineto",
+ 400, 400, 1, "blend", "vlineto",
+ -400, -400, 1, "blend", "hlineto"
+ ]
+ charStringVariable = T2CharString(program=program)
+
+ charStrings = {".notdef": charString, "A": charString,
+ "a": charStringVariable, ".null": charString}
+ fb.setupCFF2(charStrings, regions=[{"TEST": (0, 1, 1)}])
+
+ return fb
+
+
def _verifyOutput(outPath, tables=None):
f = TTFont(outPath)
f.saveXML(outPath + ".ttx", tables=tables)
@@ -81,6 +117,7 @@ def test_build_ttf(tmpdir):
fb.setupHorizontalHeader(ascent=824, descent=200)
fb.setupNameTable(nameStrings)
fb.setupOS2()
+ fb.addOpenTypeFeatures("feature salt { sub A by a; } salt;")
fb.setupPost()
fb.setupDummyDSIG()
@@ -99,14 +136,17 @@ def test_build_otf(tmpdir):
charString = pen.getCharString()
charStrings = {".notdef": charString, "A": charString, "a": charString, ".null": charString}
fb.setupCFF(nameStrings['psName'], {"FullName": nameStrings['psName']}, charStrings, {})
+
+ lsb = {gn: cs.calcBounds(None)[0] for gn, cs in charStrings.items()}
metrics = {}
for gn, advanceWidth in advanceWidths.items():
- metrics[gn] = (advanceWidth, 100) # XXX lsb from glyph
+ metrics[gn] = (advanceWidth, lsb[gn])
fb.setupHorizontalMetrics(metrics)
fb.setupHorizontalHeader(ascent=824, descent=200)
fb.setupNameTable(nameStrings)
fb.setupOS2()
+ fb.addOpenTypeFeatures("feature kern { pos A a -50; } kern;")
fb.setupPost()
fb.setupDummyDSIG()
@@ -118,17 +158,7 @@ def test_build_otf(tmpdir):
def test_build_var(tmpdir):
outPath = os.path.join(str(tmpdir), "test_var.ttf")
- fb = FontBuilder(1024, isTTF=True)
- fb.setupGlyphOrder([".notdef", ".null", "A", "a"])
- fb.setupCharacterMap({65: "A", 97: "a"})
-
- advanceWidths = {".notdef": 600, "A": 600, "a": 600, ".null": 600}
-
- familyName = "HelloTestFont"
- styleName = "TotallyNormal"
- nameStrings = dict(familyName=dict(en="HelloTestFont", nl="HalloTestFont"),
- styleName=dict(en="TotallyNormal", nl="TotaalNormaal"))
- nameStrings['psName'] = familyName + "-" + styleName
+ fb, advanceWidths, nameStrings = _setupFontBuilder(True)
pen = TTGlyphPen(None)
pen.moveTo((100, 0))
@@ -191,32 +221,9 @@ def test_build_cff2(tmpdir):
outPath = os.path.join(str(tmpdir), "test_var.otf")
fb, advanceWidths, nameStrings = _setupFontBuilder(False, 1000)
-
fb.setupNameTable(nameStrings)
-
- axes = [
- ('TEST', 0, 0, 100, "Test Axis"),
- ]
- instances = [
- dict(location=dict(TEST=0), stylename="TotallyNormal"),
- dict(location=dict(TEST=100), stylename="TotallyTested"),
- ]
- fb.setupFvar(axes, instances)
-
- pen = T2CharStringPen(None, None, CFF2=True)
- drawTestGlyph(pen)
- charString = pen.getCharString()
-
- program = [
- 200, 200, -200, -200, 2, "blend", "rmoveto",
- 400, 400, 1, "blend", "hlineto",
- 400, 400, 1, "blend", "vlineto",
- -400, -400, 1, "blend", "hlineto"
- ]
- charStringVariable = T2CharString(program=program)
-
- charStrings = {".notdef": charString, "A": charString, "a": charStringVariable, ".null": charString}
- fb.setupCFF2(charStrings, regions=[{"TEST": (0, 1, 1)}])
+ fb = _setupFontBuilderFvar(fb)
+ fb = _setupFontBuilderCFF2(fb)
metrics = {gn: (advanceWidth, 0) for gn, advanceWidth in advanceWidths.items()}
fb.setupHorizontalMetrics(metrics)
@@ -246,6 +253,31 @@ def test_setupNameTable_no_windows():
assert not any(n for n in fb.font["name"].names if n.platformID == 3)
+@pytest.mark.parametrize('is_ttf, keep_glyph_names, make_cff2, post_format', [
+ (True, True, False, 2), # TTF with post table format 2.0
+ (True, False, False, 3), # TTF with post table format 3.0
+ (False, True, False, 3), # CFF with post table format 3.0
+ (False, False, False, 3), # CFF with post table format 3.0
+ (False, True, True, 2), # CFF2 with post table format 2.0
+ (False, False, True, 3), # CFF2 with post table format 3.0
+])
+def test_setupPost(is_ttf, keep_glyph_names, make_cff2, post_format):
+ fb, _, nameStrings = _setupFontBuilder(is_ttf)
+
+ if make_cff2:
+ fb.setupNameTable(nameStrings)
+ fb = _setupFontBuilderCFF2(_setupFontBuilderFvar(fb))
+
+ if keep_glyph_names:
+ fb.setupPost()
+ else:
+ fb.setupPost(keepGlyphNames=keep_glyph_names)
+
+ assert fb.isTTF is is_ttf
+ assert ('CFF2' in fb.font) is make_cff2
+ assert fb.font["post"].formatType == post_format
+
+
def test_unicodeVariationSequences(tmpdir):
familyName = "UVSTestFont"
styleName = "Regular"
diff --git a/Tests/misc/arrayTools_test.py b/Tests/misc/arrayTools_test.py
index 108b50da..2610c0fc 100644
--- a/Tests/misc/arrayTools_test.py
+++ b/Tests/misc/arrayTools_test.py
@@ -1,5 +1,6 @@
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
+from fontTools.misc.py23 import round3
from fontTools.misc.arrayTools import (
calcBounds, calcIntBounds, updateBounds, pointInRect, pointsInRect,
vectorLength, asInt16, normRect, scaleRect, offsetRect, insetRect,
@@ -15,8 +16,13 @@ def test_calcBounds():
def test_calcIntBounds():
assert calcIntBounds(
- [(0.1, 40.1), (0.1, 100.1), (49.9, 49.9), (79.5, 9.5)]
- ) == (0, 10, 80, 100)
+ [(0.1, 40.1), (0.1, 100.1), (49.9, 49.9), (78.5, 9.5)]
+ ) == (0, 10, 79, 100)
+
+ assert calcIntBounds(
+ [(0.1, 40.1), (0.1, 100.1), (49.9, 49.9), (78.5, 9.5)],
+ round=round3
+ ) == (0, 10, 78, 100)
def test_updateBounds():
diff --git a/Tests/misc/loggingTools_test.py b/Tests/misc/loggingTools_test.py
index b402efa5..18b71b19 100644
--- a/Tests/misc/loggingTools_test.py
+++ b/Tests/misc/loggingTools_test.py
@@ -89,7 +89,7 @@ class TimerTest(object):
time.sleep(0.01)
assert re.match(
- "Took [0-9]\.[0-9]{3}s to do something",
+ r"Took [0-9]\.[0-9]{3}s to do something",
logger.handlers[0].stream.getvalue())
def test_using_logger_calling_instance(self, logger):
@@ -98,7 +98,7 @@ class TimerTest(object):
time.sleep(0.01)
assert re.match(
- "elapsed time: [0-9]\.[0-9]{3}s",
+ r"elapsed time: [0-9]\.[0-9]{3}s",
logger.handlers[0].stream.getvalue())
# do it again but with custom level
@@ -106,7 +106,7 @@ class TimerTest(object):
time.sleep(0.02)
assert re.search(
- "WARNING: Took [0-9]\.[0-9]{3}s to redo it",
+ r"WARNING: Took [0-9]\.[0-9]{3}s to redo it",
logger.handlers[0].stream.getvalue())
def test_function_decorator(self, logger):
diff --git a/Tests/otlLib/builder_test.py b/Tests/otlLib/builder_test.py
index 63a35d61..0829176c 100644
--- a/Tests/otlLib/builder_test.py
+++ b/Tests/otlLib/builder_test.py
@@ -913,24 +913,21 @@ class BuilderTest(unittest.TestCase):
"six": builder.buildValue({"YPlacement": -6}),
}, self.GLYPHMAP)
self.assertEqual(sum([getXML(t.toXML) for t in subtables], []),
- ['<SinglePos Format="1">',
+ ['<SinglePos Format="2">',
' <Coverage>',
' <Glyph value="one"/>',
' <Glyph value="two"/>',
- ' <Glyph value="five"/>',
- ' </Coverage>',
- ' <ValueFormat value="1"/>',
- ' <Value XPlacement="500"/>',
- '</SinglePos>',
- '<SinglePos Format="2">',
- ' <Coverage>',
' <Glyph value="three"/>',
' <Glyph value="four"/>',
+ ' <Glyph value="five"/>',
' </Coverage>',
' <ValueFormat value="1"/>',
- ' <!-- ValueCount=2 -->',
- ' <Value index="0" XPlacement="200"/>',
- ' <Value index="1" XPlacement="400"/>',
+ ' <!-- ValueCount=5 -->',
+ ' <Value index="0" XPlacement="500"/>',
+ ' <Value index="1" XPlacement="500"/>',
+ ' <Value index="2" XPlacement="200"/>',
+ ' <Value index="3" XPlacement="400"/>',
+ ' <Value index="4" XPlacement="500"/>',
'</SinglePos>',
'<SinglePos Format="1">',
' <Coverage>',
diff --git a/Tests/otlLib/data/gpos_91.ttx b/Tests/otlLib/data/gpos_91.ttx
new file mode 100644
index 00000000..ee7bf7c2
--- /dev/null
+++ b/Tests/otlLib/data/gpos_91.ttx
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.40">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="A"/>
+ </GlyphOrder>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="2"/>
+ <maxPoints value="0"/>
+ <maxContours value="0"/>
+ <maxCompositePoints value="0"/>
+ <maxCompositeContours value="0"/>
+ <maxZones value="2"/>
+ <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>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="0"/>
+ <underlineThickness value="0"/>
+ <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>
+
+ <GPOS>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="latn"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="9"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ExtensionPos index="0" Format="1">
+ <ExtensionLookupType value="1"/>
+ <SinglePos Format="1">
+ <Coverage Format="1">
+ <Glyph value="A"/>
+ </Coverage>
+ <ValueFormat value="4"/>
+ <Value XAdvance="20"/>
+ </SinglePos>
+ </ExtensionPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
+</ttFont>
diff --git a/Tests/otlLib/data/gsub_51.ttx b/Tests/otlLib/data/gsub_51.ttx
new file mode 100644
index 00000000..280582c9
--- /dev/null
+++ b/Tests/otlLib/data/gsub_51.ttx
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.40">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="g20"/>
+ <GlyphID id="2" name="g21"/>
+ <GlyphID id="3" name="g22"/>
+ <GlyphID id="4" name="g60"/>
+ <GlyphID id="5" name="g61"/>
+ <GlyphID id="6" name="g62"/>
+ <GlyphID id="7" name="g63"/>
+ </GlyphOrder>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="8"/>
+ <maxPoints value="0"/>
+ <maxContours value="0"/>
+ <maxCompositePoints value="0"/>
+ <maxCompositeContours value="0"/>
+ <maxZones value="2"/>
+ <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>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="0"/>
+ <underlineThickness value="0"/>
+ <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>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="latn"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="4"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=5 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="g20" out="g60"/>
+ <Substitution in="g21" out="g61"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="4"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <LigatureSubst index="0" Format="1">
+ <LigatureSet glyph="g21">
+ <Ligature components="g22" glyph="g61"/>
+ </LigatureSet>
+ </LigatureSubst>
+ </Lookup>
+ <Lookup index="2">
+ <LookupType value="4"/>
+ <LookupFlag value="8"/>
+ <!-- SubTableCount=1 -->
+ <LigatureSubst index="0" Format="1">
+ <LigatureSet glyph="g21">
+ <Ligature components="g22" glyph="g61"/>
+ </LigatureSet>
+ </LigatureSubst>
+ </Lookup>
+ <Lookup index="3">
+ <LookupType value="2"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <MultipleSubst index="0" Format="1">
+ <Substitution in="g21" out="g61,g62,g63"/>
+ </MultipleSubst>
+ </Lookup>
+ <Lookup index="4">
+ <LookupType value="5"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ContextSubst index="0" Format="1">
+ <Coverage Format="1">
+ <Glyph value="g20"/>
+ </Coverage>
+ <!-- SubRuleSetCount=1 -->
+ <SubRuleSet index="0">
+ <!-- SubRuleCount=1 -->
+ <SubRule index="0">
+ <!-- GlyphCount=2 -->
+ <!-- SubstCount=0 -->
+ <Input index="0" value="g20"/>
+ </SubRule>
+ </SubRuleSet>
+ </ContextSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+</ttFont>
diff --git a/Tests/otlLib/data/gsub_52.ttx b/Tests/otlLib/data/gsub_52.ttx
new file mode 100644
index 00000000..189178c3
--- /dev/null
+++ b/Tests/otlLib/data/gsub_52.ttx
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.40">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="g20"/>
+ <GlyphID id="2" name="g21"/>
+ <GlyphID id="3" name="g22"/>
+ <GlyphID id="4" name="g60"/>
+ <GlyphID id="5" name="g61"/>
+ <GlyphID id="6" name="g62"/>
+ <GlyphID id="7" name="g63"/>
+ </GlyphOrder>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="8"/>
+ <maxPoints value="0"/>
+ <maxContours value="0"/>
+ <maxCompositePoints value="0"/>
+ <maxCompositeContours value="0"/>
+ <maxZones value="2"/>
+ <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>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="0"/>
+ <underlineThickness value="0"/>
+ <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>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="latn"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="4"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=5 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="g20" out="g60"/>
+ <Substitution in="g21" out="g61"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="4"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <LigatureSubst index="0" Format="1">
+ <LigatureSet glyph="g21">
+ <Ligature components="g22" glyph="g61"/>
+ </LigatureSet>
+ </LigatureSubst>
+ </Lookup>
+ <Lookup index="2">
+ <LookupType value="4"/>
+ <LookupFlag value="8"/>
+ <!-- SubTableCount=1 -->
+ <LigatureSubst index="0" Format="1">
+ <LigatureSet glyph="g21">
+ <Ligature components="g22" glyph="g61"/>
+ </LigatureSet>
+ </LigatureSubst>
+ </Lookup>
+ <Lookup index="3">
+ <LookupType value="2"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <MultipleSubst index="0" Format="1">
+ <Substitution in="g21" out="g61,g62,g63"/>
+ </MultipleSubst>
+ </Lookup>
+ <Lookup index="4">
+ <LookupType value="5"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ContextSubst index="0" Format="2">
+ <Coverage Format="1">
+ <Glyph value="g20"/>
+ </Coverage>
+ <ClassDef Format="2">
+ <ClassDef glyph="g20" class="1"/>
+ </ClassDef>
+ <!-- SubClassSetCount=2 -->
+ <SubClassSet index="0" empty="1"/>
+ <SubClassSet index="1">
+ <!-- SubClassRuleCount=1 -->
+ <SubClassRule index="0">
+ <!-- GlyphCount=2 -->
+ <!-- SubstCount=0 -->
+ <Class index="0" value="1"/>
+ </SubClassRule>
+ </SubClassSet>
+ </ContextSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+</ttFont>
diff --git a/Tests/otlLib/data/gsub_71.ttx b/Tests/otlLib/data/gsub_71.ttx
new file mode 100644
index 00000000..201de4cb
--- /dev/null
+++ b/Tests/otlLib/data/gsub_71.ttx
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.40">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="g18"/>
+ <GlyphID id="2" name="g19"/>
+ <GlyphID id="3" name="g23"/>
+ <GlyphID id="4" name="g24"/>
+ </GlyphOrder>
+
+ <maxp>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="0x10000"/>
+ <numGlyphs value="5"/>
+ <maxPoints value="0"/>
+ <maxContours value="0"/>
+ <maxCompositePoints value="0"/>
+ <maxCompositeContours value="0"/>
+ <maxZones value="2"/>
+ <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>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="0"/>
+ <underlineThickness value="0"/>
+ <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>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="latn"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="7"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <ExtensionSubst index="0" Format="1">
+ <ExtensionLookupType value="1"/>
+ <SingleSubst Format="1">
+ <Substitution in="g18" out="g23"/>
+ <Substitution in="g19" out="g24"/>
+ </SingleSubst>
+ </ExtensionSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+</ttFont>
diff --git a/Tests/otlLib/maxContextCalc_test.py b/Tests/otlLib/maxContextCalc_test.py
new file mode 100644
index 00000000..759b30dd
--- /dev/null
+++ b/Tests/otlLib/maxContextCalc_test.py
@@ -0,0 +1,76 @@
+from __future__ import print_function, division, absolute_import
+from __future__ import unicode_literals
+
+import os
+import pytest
+from fontTools.ttLib import TTFont
+from fontTools.otlLib.maxContextCalc import maxCtxFont
+from fontTools.feaLib.builder import addOpenTypeFeaturesFromString
+
+
+def test_max_ctx_calc_no_features():
+ font = TTFont()
+ assert maxCtxFont(font) == 0
+ font.setGlyphOrder(['.notdef'])
+ addOpenTypeFeaturesFromString(font, '')
+ assert maxCtxFont(font) == 0
+
+
+def test_max_ctx_calc_features():
+ glyphs = '.notdef space A B C a b c'.split()
+ features = """
+ lookup GSUB_EXT useExtension {
+ sub a by b;
+ } GSUB_EXT;
+
+ lookup GPOS_EXT useExtension {
+ pos a b -10;
+ } GPOS_EXT;
+
+ feature sub1 {
+ sub A by a;
+ sub A B by b;
+ sub A B C by c;
+ sub [A B] C by c;
+ sub [A B] C [A B] by c;
+ sub A by A B;
+ sub A' C by A B;
+ sub a' by b;
+ sub a' b by c;
+ sub a from [A B C];
+ rsub a by b;
+ rsub a' by b;
+ rsub a b' by c;
+ rsub a b' c by A;
+ rsub [a b] c' by A;
+ rsub [a b] c' [a b] by B;
+ lookup GSUB_EXT;
+ } sub1;
+
+ feature pos1 {
+ pos A 20;
+ pos A B -50;
+ pos A B' 10 C;
+ lookup GPOS_EXT;
+ } pos1;
+ """
+ font = TTFont()
+ font.setGlyphOrder(glyphs)
+ addOpenTypeFeaturesFromString(font, features)
+
+ assert maxCtxFont(font) == 3
+
+
+@pytest.mark.parametrize('file_name, max_context', [
+ ('gsub_51', 2),
+ ('gsub_52', 2),
+ ('gsub_71', 1),
+ ('gpos_91', 1),
+])
+def test_max_ctx_calc_features_ttx(file_name, max_context):
+ ttx_path = os.path.join(os.path.dirname(__file__),
+ 'data', '{}.ttx'.format(file_name))
+ font = TTFont()
+ font.importXML(ttx_path)
+
+ assert maxCtxFont(font) == max_context
diff --git a/Tests/subset/data/TestHVVAR.ttx b/Tests/subset/data/TestHVVAR.ttx
new file mode 100644
index 00000000..3e746527
--- /dev/null
+++ b/Tests/subset/data/TestHVVAR.ttx
@@ -0,0 +1,443 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.40">
+
+ <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"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0xddab44f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000001"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Apr 23 17:22:52 2019"/>
+ <modified value="Tue Apr 23 17:22:52 2019"/>
+ <xMin value="0"/>
+ <yMin value="0"/>
+ <xMax value="0"/>
+ <yMax value="0"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <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="700"/>
+ <minLeftSideBearing value="40"/>
+ <minRightSideBearing value="580"/>
+ <xMaxExtent value="80"/>
+ <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="6"/>
+ <maxPoints value="1"/>
+ <maxContours value="1"/>
+ <maxCompositePoints value="0"/>
+ <maxCompositeContours value="0"/>
+ <maxZones value="1"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="1"/>
+ <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="3"/>
+ <xAvgCharWidth value="606"/>
+ <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="5"/>
+ <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="UKWN"/>
+ <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="700" lsb="80"/>
+ <mtx name="A" width="700" lsb="0"/>
+ <mtx name="B" width="625" lsb="40"/>
+ <mtx name="C" width="660" lsb="80"/>
+ <mtx name="D" width="660" lsb="80"/>
+ <mtx name="E" width="660" lsb="80"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x41" name="A"/><!-- SPACE -->
+ <map code="0x42" name="B"/><!-- DIGIT ZERO -->
+ <map code="0x43" name="C"/><!-- EQUALS SIGN -->
+ <map code="0x44" name="D"/><!-- MINUS SIGN -->
+ <map code="0x45" name="E"/><!-- PLUS SIGN -->
+ </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="0" yMin="0" xMax="0" yMax="0">
+ <contour>
+ <pt x="0" y="0" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="A"/><!-- contains no outline data -->
+
+ <TTGlyph name="B" xMin="0" yMin="0" xMax="0" yMax="0">
+ <contour>
+ <pt x="0" y="0" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="C" xMin="0" yMin="0" xMax="0" yMax="0">
+ <contour>
+ <pt x="0" y="0" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="D" xMin="0" yMin="0" xMax="0" yMax="0">
+ <contour>
+ <pt x="0" y="0" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ <TTGlyph name="E" xMin="0" yMin="0" xMax="0" yMax="0">
+ <contour>
+ <pt x="0" y="0" on="1"/>
+ </contour>
+ <instructions/>
+ </TTGlyph>
+
+ </glyf>
+
+ <name>
+ <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestHVVAR
+ </namerecord>
+ <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ 1.000;UKWN;TestHVVAR-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestHVVAR
+ </namerecord>
+ <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Version 1.000
+ </namerecord>
+ <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestHVVAR-Regular
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ TestHVVAR
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.000;UKWN;TestHVVAR-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ TestHVVAR-Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.000
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ TestHVVAR-Regular
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="2.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <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=2 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=2 -->
+ <VarData index="0">
+ <!-- ItemCount=6 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="1"/>
+ <Item index="0" value="[1]"/>
+ <Item index="1" value="[2]"/>
+ <Item index="2" value="[3]"/>
+ <Item index="3" value="[4]"/>
+ <Item index="4" value="[5]"/>
+ <Item index="5" value="[6]"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=6 -->
+ <NumShorts value="1"/>
+ <!-- VarRegionCount=2 -->
+ <VarRegionIndex index="0" value="0"/>
+ <VarRegionIndex index="1" value="1"/>
+ <Item index="0" value="[10, 21]"/>
+ <Item index="1" value="[11, 22]"/>
+ <Item index="2" value="[126, 23]"/>
+ <Item index="3" value="[127, 24]"/>
+ <Item index="4" value="[-128, 25]"/>
+ <Item index="5" value="[-129, 26]"/>
+ </VarData>
+ </VarStore>
+ <LsbMap>
+ <Map glyph=".notdef" outer="0" inner="2"/>
+ <Map glyph="A" outer="0" inner="5"/>
+ <Map glyph="B" outer="1" inner="1"/>
+ <Map glyph="C" outer="1" inner="4"/>
+ <Map glyph="D" outer="0" inner="3"/>
+ <Map glyph="E" outer="1" inner="0"/>
+ </LsbMap>
+ <RsbMap>
+ <Map glyph=".notdef" outer="0" inner="1"/>
+ <Map glyph="A" outer="0" inner="4"/>
+ <Map glyph="B" outer="1" inner="5"/>
+ <Map glyph="C" outer="0" inner="0"/>
+ <Map glyph="D" outer="1" inner="2"/>
+ <Map glyph="E" outer="1" inner="3"/>
+ </RsbMap>
+ </HVAR>
+
+ <VVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=4 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-0.5"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="3">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.5"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=2 -->
+ <VarData index="0">
+ <!-- ItemCount=4 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="1"/>
+ <Item index="0" value="[32]"/>
+ <Item index="1" value="[17]"/>
+ <Item index="2" value="[0]"/>
+ <Item index="3" value="[14]"/>
+ <Item index="4" value="[5]"/>
+ <Item index="5" value="[6]"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=6 -->
+ <NumShorts value="3"/>
+ <!-- VarRegionCount=4 -->
+ <VarRegionIndex index="0" value="0"/>
+ <VarRegionIndex index="1" value="1"/>
+ <VarRegionIndex index="2" value="2"/>
+ <VarRegionIndex index="3" value="3"/>
+ <Item index="0" value="[0, 1, 11, 21]"/>
+ <Item index="1" value="[0, 2, 12, 22]"/>
+ <Item index="2" value="[128, 130, 13, 23]"/>
+ <Item index="3" value="[0, 4, 14, 24]"/>
+ <Item index="4" value="[0, 5, -129, 25]"/>
+ <Item index="5" value="[14, 6, 16, 26]"/>
+ </VarData>
+ </VarStore>
+ <AdvHeightMap>
+ <Map glyph=".notdef" outer="1" inner="0"/>
+ <Map glyph="A" outer="1" inner="2"/>
+ <Map glyph="B" outer="0" inner="2"/>
+ <Map glyph="C" outer="0" inner="0"/>
+ <Map glyph="D" outer="1" inner="1"/>
+ <Map glyph="E" outer="0" inner="1"/>
+ </AdvHeightMap>
+ <VOrgMap>
+ <Map glyph=".notdef" outer="1" inner="3"/>
+ <Map glyph="A" outer="1" inner="5"/>
+ <Map glyph="B" outer="0" inner="5"/>
+ <Map glyph="C" outer="0" inner="3"/>
+ <Map glyph="D" outer="1" inner="4"/>
+ <Map glyph="E" outer="0" inner="4"/>
+ </VOrgMap>
+ </VVAR>
+
+ <avar>
+ <segment axis="wght">
+ <mapping from="-1.0" to="-1.0"/>
+ <mapping from="0.0" to="0.0"/>
+ <mapping from="0.3" to="0.5"/>
+ <mapping from="1.0" to="1.0"/>
+ </segment>
+ </avar>
+
+ <fvar>
+ <Axis>
+ <AxisTag>wght</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>100.0</MinValue>
+ <DefaultValue>400.0</DefaultValue>
+ <MaxValue>900.0</MaxValue>
+ <AxisNameID>257</AxisNameID>
+ </Axis>
+ <NamedInstance flags="0x0" subfamilyNameID="258">
+ <coord axis="wght" value="100.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="259">
+ <coord axis="wght" value="300.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="260">
+ <coord axis="wght" value="400.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="261">
+ <coord axis="wght" value="700.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="262">
+ <coord axis="wght" value="900.0"/>
+ </NamedInstance>
+ </fvar>
+
+</ttFont>
diff --git a/Tests/subset/data/expect_HVVAR.ttx b/Tests/subset/data/expect_HVVAR.ttx
new file mode 100644
index 00000000..5fbc1770
--- /dev/null
+++ b/Tests/subset/data/expect_HVVAR.ttx
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.40">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="B"/>
+ <GlyphID id="2" name="D"/>
+ </GlyphOrder>
+
+ <HVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=2 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=2 -->
+ <VarData index="0">
+ <!-- ItemCount=5 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="1"/>
+ <Item index="0" value="[1]"/>
+ <Item index="1" value="[3]"/>
+ <Item index="2" value="[5]"/>
+ <Item index="3" value="[2]"/>
+ <Item index="4" value="[4]"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=3 -->
+ <NumShorts value="1"/>
+ <!-- VarRegionCount=2 -->
+ <VarRegionIndex index="0" value="0"/>
+ <VarRegionIndex index="1" value="1"/>
+ <Item index="0" value="[11, 22]"/>
+ <Item index="1" value="[126, 23]"/>
+ <Item index="2" value="[-129, 26]"/>
+ </VarData>
+ </VarStore>
+ <LsbMap>
+ <Map glyph=".notdef" outer="0" inner="1"/>
+ <Map glyph="B" outer="1" inner="0"/>
+ <Map glyph="D" outer="0" inner="4"/>
+ </LsbMap>
+ <RsbMap>
+ <Map glyph=".notdef" outer="0" inner="3"/>
+ <Map glyph="B" outer="1" inner="2"/>
+ <Map glyph="D" outer="1" inner="1"/>
+ </RsbMap>
+ </HVAR>
+
+ <VVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=3 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-0.5"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.5"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=2 -->
+ <VarData index="0">
+ <!-- ItemCount=2 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="0"/>
+ <Item index="0" value="[0]"/>
+ <Item index="1" value="[6]"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=4 -->
+ <NumShorts value="1"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="1"/>
+ <VarRegionIndex index="1" value="0"/>
+ <VarRegionIndex index="2" value="2"/>
+ <Item index="0" value="[11, 1, 21]"/>
+ <Item index="1" value="[12, 2, 22]"/>
+ <Item index="2" value="[14, 4, 24]"/>
+ <Item index="3" value="[-129, 5, 25]"/>
+ </VarData>
+ </VarStore>
+ <AdvHeightMap>
+ <Map glyph=".notdef" outer="1" inner="0"/>
+ <Map glyph="B" outer="0" inner="0"/>
+ <Map glyph="D" outer="1" inner="1"/>
+ </AdvHeightMap>
+ <VOrgMap>
+ <Map glyph=".notdef" outer="1" inner="2"/>
+ <Map glyph="B" outer="0" inner="1"/>
+ <Map glyph="D" outer="1" inner="3"/>
+ </VOrgMap>
+ </VVAR>
+
+ <avar>
+ <segment axis="wght">
+ <mapping from="-1.0" to="-1.0"/>
+ <mapping from="0.0" to="0.0"/>
+ <mapping from="0.3" to="0.5"/>
+ <mapping from="1.0" to="1.0"/>
+ </segment>
+ </avar>
+
+ <fvar>
+ <Axis>
+ <AxisTag>wght</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>100.0</MinValue>
+ <DefaultValue>400.0</DefaultValue>
+ <MaxValue>900.0</MaxValue>
+ <AxisNameID>257</AxisNameID>
+ </Axis>
+ <NamedInstance flags="0x0" subfamilyNameID="258">
+ <coord axis="wght" value="100.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="259">
+ <coord axis="wght" value="300.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="260">
+ <coord axis="wght" value="400.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="261">
+ <coord axis="wght" value="700.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="262">
+ <coord axis="wght" value="900.0"/>
+ </NamedInstance>
+ </fvar>
+
+</ttFont>
diff --git a/Tests/subset/data/expect_HVVAR_retain_gids.ttx b/Tests/subset/data/expect_HVVAR_retain_gids.ttx
new file mode 100644
index 00000000..da2eaf4f
--- /dev/null
+++ b/Tests/subset/data/expect_HVVAR_retain_gids.ttx
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.40">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="glyph00001"/>
+ <GlyphID id="2" name="B"/>
+ <GlyphID id="3" name="glyph00003"/>
+ <GlyphID id="4" name="D"/>
+ <GlyphID id="5" name="glyph00005"/>
+ </GlyphOrder>
+
+ <HVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=2 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=2 -->
+ <VarData index="0">
+ <!-- ItemCount=6 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="1"/>
+ <Item index="0" value="[1]"/>
+ <Item index="1" value="[2]"/>
+ <Item index="2" value="[3]"/>
+ <Item index="3" value="[4]"/>
+ <Item index="4" value="[5]"/>
+ <Item index="5" value="[0]"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=3 -->
+ <NumShorts value="1"/>
+ <!-- VarRegionCount=2 -->
+ <VarRegionIndex index="0" value="0"/>
+ <VarRegionIndex index="1" value="1"/>
+ <Item index="0" value="[11, 22]"/>
+ <Item index="1" value="[126, 23]"/>
+ <Item index="2" value="[-129, 26]"/>
+ </VarData>
+ </VarStore>
+ <LsbMap>
+ <Map glyph=".notdef" outer="0" inner="2"/>
+ <Map glyph="B" outer="1" inner="0"/>
+ <Map glyph="D" outer="0" inner="3"/>
+ <Map glyph="glyph00001" outer="0" inner="0"/>
+ <Map glyph="glyph00003" outer="0" inner="0"/>
+ <Map glyph="glyph00005" outer="0" inner="3"/>
+ </LsbMap>
+ <RsbMap>
+ <Map glyph=".notdef" outer="0" inner="1"/>
+ <Map glyph="B" outer="1" inner="2"/>
+ <Map glyph="D" outer="1" inner="1"/>
+ <Map glyph="glyph00001" outer="0" inner="0"/>
+ <Map glyph="glyph00003" outer="0" inner="0"/>
+ <Map glyph="glyph00005" outer="1" inner="1"/>
+ </RsbMap>
+ </HVAR>
+
+ <VVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=3 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-0.5"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.5"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=2 -->
+ <VarData index="0">
+ <!-- ItemCount=2 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="0"/>
+ <Item index="0" value="[0]"/>
+ <Item index="1" value="[6]"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=4 -->
+ <NumShorts value="1"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="1"/>
+ <VarRegionIndex index="1" value="0"/>
+ <VarRegionIndex index="2" value="2"/>
+ <Item index="0" value="[11, 1, 21]"/>
+ <Item index="1" value="[12, 2, 22]"/>
+ <Item index="2" value="[14, 4, 24]"/>
+ <Item index="3" value="[-129, 5, 25]"/>
+ </VarData>
+ </VarStore>
+ <AdvHeightMap>
+ <Map glyph=".notdef" outer="1" inner="0"/>
+ <Map glyph="B" outer="0" inner="0"/>
+ <Map glyph="D" outer="1" inner="1"/>
+ <Map glyph="glyph00001" outer="0" inner="0"/>
+ <Map glyph="glyph00003" outer="0" inner="0"/>
+ <Map glyph="glyph00005" outer="1" inner="1"/>
+ </AdvHeightMap>
+ <VOrgMap>
+ <Map glyph=".notdef" outer="1" inner="2"/>
+ <Map glyph="B" outer="0" inner="1"/>
+ <Map glyph="D" outer="1" inner="3"/>
+ <Map glyph="glyph00001" outer="0" inner="0"/>
+ <Map glyph="glyph00003" outer="0" inner="0"/>
+ <Map glyph="glyph00005" outer="1" inner="3"/>
+ </VOrgMap>
+ </VVAR>
+
+ <avar>
+ <segment axis="wght">
+ <mapping from="-1.0" to="-1.0"/>
+ <mapping from="0.0" to="0.0"/>
+ <mapping from="0.3" to="0.5"/>
+ <mapping from="1.0" to="1.0"/>
+ </segment>
+ </avar>
+
+ <fvar>
+ <Axis>
+ <AxisTag>wght</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>100.0</MinValue>
+ <DefaultValue>400.0</DefaultValue>
+ <MaxValue>900.0</MaxValue>
+ <AxisNameID>257</AxisNameID>
+ </Axis>
+ <NamedInstance flags="0x0" subfamilyNameID="258">
+ <coord axis="wght" value="100.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="259">
+ <coord axis="wght" value="300.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="260">
+ <coord axis="wght" value="400.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="261">
+ <coord axis="wght" value="700.0"/>
+ </NamedInstance>
+ <NamedInstance flags="0x0" subfamilyNameID="262">
+ <coord axis="wght" value="900.0"/>
+ </NamedInstance>
+ </fvar>
+
+</ttFont>
diff --git a/Tests/subset/data/test_cntrmask_CFF.desub.ttx b/Tests/subset/data/test_cntrmask_CFF.desub.ttx
new file mode 100644
index 00000000..ff1c8c59
--- /dev/null
+++ b/Tests/subset/data/test_cntrmask_CFF.desub.ttx
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" ttLibVersion="3.41">
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="LibertinusSerif-Regular">
+ <version value="6.8"/>
+ <Notice value="Copyright © 2012-2019 The Libertinus Project Authors."/>
+ <FullName value="Libertinus Serif Regular"/>
+ <FamilyName value="Libertinus Serif"/>
+ <Weight value="Regular"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-98"/>
+ <UnderlineThickness value="40"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="-6275 -256 6171 1125"/>
+ <StrokeWidth value="0"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <Encoding name="StandardEncoding"/>
+ <Private>
+ <BlueValues value="-12 0 429 442 460 472 600 610 645 658 688 698"/>
+ <OtherBlues value="-238 -227"/>
+ <FamilyBlues value="-12 0 429 442 460 472 600 610 645 658 688 698"/>
+ <FamilyOtherBlues value="-238 -227"/>
+ <BlueScale value="0.0396"/>
+ <BlueShift value="6"/>
+ <BlueFuzz value="1"/>
+ <StdHW value="36"/>
+ <StdVW value="79"/>
+ <StemSnapH value="36"/>
+ <StemSnapV value="79 86"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="0"/>
+ <nominalWidthX value="595"/>
+ </Private>
+ <CharStrings>
+ <CharString name=".notdef">
+ -95 endchar
+ </CharString>
+ <CharString name="Idieresis">
+ -298 -2 33 583 33 62 96 hstem
+ 6 96 4 85 4 96 vstem
+ cntrmask 00011100
+ 191 122 rmoveto
+ 401 vlineto
+ 0 83 17 5 70 3 6 6 0 21 -6 6 -44 -1 -47.5 -1 -38.5 0 -33.5 0 -48.5 1 -47 1 -6 -6 0 -21 6 -6 70 -3 17 -5 0 -83 rrcurveto
+ -401 vlineto
+ 0 -83 -17 -5 -70 -3 -6 -6 0 -21 6 -6 45 1 48.7002 1 36.2998 0 35.59961 0 48.40039 -1 45 -1 6 6 0 21 -6 6 -70 3 -17 5 0 83 rrcurveto
+ 4 635 rmoveto
+ -26 22 -22 26 26 22 22 26 26 -22 22 -26 -26 -22 -22 -26 vhcurveto
+ -189 hmoveto
+ -26 22 -22 26 26 22 22 26 26 -22 22 -26 -26 -22 -22 -26 vhcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+</ttFont>
diff --git a/Tests/subset/data/test_cntrmask_CFF.ttx b/Tests/subset/data/test_cntrmask_CFF.ttx
new file mode 100644
index 00000000..5ab6268f
--- /dev/null
+++ b/Tests/subset/data/test_cntrmask_CFF.ttx
@@ -0,0 +1,417 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="Idieresis"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="6.79999"/>
+ <checkSumAdjustment value="0xd2a3b881"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00001011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Aug 24 21:44:22 2006"/>
+ <modified value="Thu Jan 1 00:00:00 1970"/>
+ <xMin value="-6275"/>
+ <yMin value="-256"/>
+ <xMax value="6171"/>
+ <yMax value="1125"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="8"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="894"/>
+ <descent value="-246"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="6272"/>
+ <minLeftSideBearing value="-6275"/>
+ <minRightSideBearing value="-953"/>
+ <xMaxExtent value="6171"/>
+ <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="2"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="2"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="4"/>
+ <xAvgCharWidth value="559"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="700"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="140"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="700"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="480"/>
+ <yStrikeoutSize value="49"/>
+ <yStrikeoutPosition value="258"/>
+ <sFamilyClass value="261"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="3"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000010"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ALIF"/>
+ <fsSelection value="00000000 11000000"/>
+ <usFirstCharIndex value="207"/>
+ <usLastCharIndex value="207"/>
+ <sTypoAscender value="894"/>
+ <sTypoDescender value="-246"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="894"/>
+ <usWinDescent value="246"/>
+ <ulCodePageRange1 value="01100000 00000000 00000001 10111111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="429"/>
+ <sCapHeight value="658"/>
+ <usDefaultChar value="32"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="12"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2012-2019 The Libertinus Project Authors.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Libertinus Serif
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 6.8;ALIF;LibertinusSerif-Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Libertinus Serif Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 6.8
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ LibertinusSerif-Regular
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0xcf" name="Idieresis"/><!-- LATIN CAPITAL LETTER I WITH DIAERESIS -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="28" language="0" nGroups="1">
+ <map code="0xcf" name="Idieresis"/><!-- LATIN CAPITAL LETTER I WITH DIAERESIS -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0xcf" name="Idieresis"/><!-- LATIN CAPITAL LETTER I WITH DIAERESIS -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="28" language="0" nGroups="1">
+ <map code="0xcf" name="Idieresis"/><!-- LATIN CAPITAL LETTER I WITH DIAERESIS -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-78"/>
+ <underlineThickness value="40"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="LibertinusSerif-Regular">
+ <version value="6.8"/>
+ <Notice value="Copyright © 2012-2019 The Libertinus Project Authors."/>
+ <FullName value="Libertinus Serif Regular"/>
+ <FamilyName value="Libertinus Serif"/>
+ <Weight value="Regular"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-98"/>
+ <UnderlineThickness value="40"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="-6275 -256 6171 1125"/>
+ <StrokeWidth value="0"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <Encoding name="StandardEncoding"/>
+ <Private>
+ <BlueValues value="-12 0 429 442 460 472 600 610 645 658 688 698"/>
+ <OtherBlues value="-238 -227"/>
+ <FamilyBlues value="-12 0 429 442 460 472 600 610 645 658 688 698"/>
+ <FamilyOtherBlues value="-238 -227"/>
+ <BlueScale value="0.0396"/>
+ <BlueShift value="6"/>
+ <BlueFuzz value="1"/>
+ <StdHW value="36"/>
+ <StdVW value="79"/>
+ <StemSnapH value="36"/>
+ <StemSnapV value="79 86"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="0"/>
+ <nominalWidthX value="595"/>
+ <Subrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ <CharString index="0">
+ -26 22 -22 26 26 22 22 26 26 -22 22 -26 -26 -22 -22 -26 vhcurveto
+ return
+ </CharString>
+ <CharString index="1">
+ 401 vlineto
+ 0 83 17 5 70 3 6 6 0 21 -6 6 -44 -1 -47.5 -1 -38.5 0 -33.5 0 -48.5 1 -47 1 -6 -6 0 -21 6 -6 70 -3 17 -5 0 -83 rrcurveto
+ -401 vlineto
+ 0 -83 -17 -5 -70 -3 -6 -6 0 -21 6 -6 45 1 48.7002 1 36.2998 0 35.59961 0 48.40039 -1 45 -1 6 6 0 21 -6 6 -70 3 -17 5 0 83 rrcurveto
+ return
+ </CharString>
+ </Subrs>
+ </Private>
+ <CharStrings>
+ <CharString name=".notdef">
+ -95 endchar
+ </CharString>
+ <CharString name="Idieresis">
+ -298 -2 33 583 33 62 96 hstem
+ 6 96 4 85 4 96 vstem
+ cntrmask 00011100
+ 191 122 rmoveto
+ -106 callsubr
+ 4 635 rmoveto
+ -107 callsubr
+ -189 hmoveto
+ -107 callsubr
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GDEF>
+ <Version value="0x00010002"/>
+ <GlyphClassDef Format="1">
+ <ClassDef glyph="Idieresis" class="1"/>
+ </GlyphClassDef>
+ <MarkGlyphSetsDef>
+ <MarkSetTableFormat value="1"/>
+ <!-- MarkSetCount=1 -->
+ <Coverage index="0" Format="1">
+ </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="1"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="2">
+ <ScriptTag value="grek"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="2"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="3">
+ <ScriptTag value="latn"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="3"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=4 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="1">
+ <FeatureTag value="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="2">
+ <FeatureTag value="kern"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="3">
+ <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="0"/>
+ <!-- SubTableCount=1 -->
+ <PairPos index="0" Format="2">
+ <Coverage Format="1">
+ <Glyph value="Idieresis"/>
+ </Coverage>
+ <ValueFormat1 value="4"/>
+ <ValueFormat2 value="0"/>
+ <ClassDef1 Format="1">
+ <ClassDef glyph="Idieresis" class="1"/>
+ </ClassDef1>
+ <ClassDef2 Format="2">
+ </ClassDef2>
+ <!-- Class1Count=2 -->
+ <!-- Class2Count=1 -->
+ <Class1Record index="0">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ </Class1Record>
+ <Class1Record index="1">
+ <Class2Record index="0">
+ <Value1 XAdvance="0"/>
+ </Class2Record>
+ </Class1Record>
+ </PairPos>
+ </Lookup>
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=5 -->
+ <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="hebr"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="4">
+ <ScriptTag value="latn"/>
+ <Script>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="0"/>
+ <mtx name="Idieresis" width="297" lsb="6"/>
+ </hmtx>
+
+</ttFont>
diff --git a/Tests/subset/subset_test.py b/Tests/subset/subset_test.py
index 2fc3b8af..eb632dc0 100644
--- a/Tests/subset/subset_test.py
+++ b/Tests/subset/subset_test.py
@@ -426,6 +426,16 @@ class SubsetTest(unittest.TestCase):
self.expect_ttx(subsetfont, self.getpath(
"test_hinted_subrs_CFF.desub.ttx"), ["CFF "])
+ def test_desubroutinize_cntrmask_CFF(self):
+ ttxpath = self.getpath("test_cntrmask_CFF.ttx")
+ _, fontpath = self.compile_font(ttxpath, ".otf")
+ subsetpath = self.temp_path(".otf")
+ subset.main([fontpath, "--desubroutinize", "--notdef-outline",
+ "--output-file=%s" % subsetpath, "*"])
+ subsetfont = TTFont(subsetpath)
+ self.expect_ttx(subsetfont, self.getpath(
+ "test_cntrmask_CFF.desub.ttx"), ["CFF "])
+
def test_no_hinting_desubroutinize_CFF(self):
ttxpath = self.getpath("test_hinted_subrs_CFF.ttx")
_, fontpath = self.compile_font(ttxpath, ".otf")
@@ -485,6 +495,24 @@ class SubsetTest(unittest.TestCase):
subset.main([fontpath, "--recalc-timestamp", "--output-file=%s" % subsetpath, "*"])
self.assertLess(modified, TTFont(subsetpath)['head'].modified)
+ def test_recalc_max_context(self):
+ ttxpath = self.getpath("Lobster.subset.ttx")
+ font = TTFont()
+ font.importXML(ttxpath)
+ max_context = font['OS/2'].usMaxContext
+ _, fontpath = self.compile_font(ttxpath, ".otf")
+ subsetpath = self.temp_path(".otf")
+
+ # by default, the subsetter does not recalculate the usMaxContext
+ subset.main([fontpath, "--drop-tables+=GSUB,GPOS",
+ "--output-file=%s" % subsetpath])
+ self.assertEqual(max_context, TTFont(subsetpath)['OS/2'].usMaxContext)
+
+ subset.main([fontpath, "--recalc-max-context",
+ "--drop-tables+=GSUB,GPOS",
+ "--output-file=%s" % subsetpath])
+ self.assertEqual(0, TTFont(subsetpath)['OS/2'].usMaxContext)
+
def test_retain_gids_ttf(self):
_, fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
font = TTFont(fontpath)
@@ -553,8 +581,8 @@ class SubsetTest(unittest.TestCase):
self.assertEqual(cs["B"].program, ["endchar"])
def test_retain_gids_cff2(self):
- fontpath = self.getpath("../../varLib/data/TestCFF2VF.otf")
- font = TTFont(fontpath)
+ ttx_path = self.getpath("../../varLib/data/master_ttx_varfont_otf/TestCFF2VF.ttx")
+ font, fontpath = self.compile_font(ttx_path, ".otf")
self.assertEqual(font["hmtx"]["A"], (600, 31))
self.assertEqual(font["hmtx"]["T"], (600, 41))
@@ -586,6 +614,20 @@ class SubsetTest(unittest.TestCase):
self.assertGreater(len(cs["A"].program), 0)
self.assertEqual(cs["glyph00002"].program, [])
+ def test_HVAR_VVAR(self):
+ _, fontpath = self.compile_font(self.getpath("TestHVVAR.ttx"), ".ttf")
+ subsetpath = self.temp_path(".ttf")
+ subset.main([fontpath, "--text=BD", "--output-file=%s" % subsetpath])
+ subsetfont = TTFont(subsetpath)
+ self.expect_ttx(subsetfont, self.getpath("expect_HVVAR.ttx"), ["GlyphOrder", "HVAR", "VVAR", "avar", "fvar"])
+
+ def test_HVAR_VVAR_retain_gids(self):
+ _, fontpath = self.compile_font(self.getpath("TestHVVAR.ttx"), ".ttf")
+ subsetpath = self.temp_path(".ttf")
+ subset.main([fontpath, "--text=BD", "--retain-gids", "--output-file=%s" % subsetpath])
+ subsetfont = TTFont(subsetpath)
+ self.expect_ttx(subsetfont, self.getpath("expect_HVVAR_retain_gids.ttx"), ["GlyphOrder", "HVAR", "VVAR", "avar", "fvar"])
+
if __name__ == "__main__":
sys.exit(unittest.main())
diff --git a/Tests/svgLib/path/shapes_test.py b/Tests/svgLib/path/shapes_test.py
index ee9ddeae..99c70fdb 100644
--- a/Tests/svgLib/path/shapes_test.py
+++ b/Tests/svgLib/path/shapes_test.py
@@ -1,68 +1,133 @@
from __future__ import print_function, absolute_import, division
from fontTools.misc.py23 import *
-from fontTools.pens.recordingPen import RecordingPen
from fontTools.svgLib.path import shapes
from fontTools.misc import etree
import pytest
@pytest.mark.parametrize(
- "svg_xml, expected_path",
+ "svg_xml, expected_path, expected_transform",
[
# path: direct passthrough
(
- "<path d='I love kittens'/>",
- "I love kittens"
+ "<path d='I love kittens'/>",
+ "I love kittens",
+ None
),
# path no @d
(
- "<path duck='Mallard'/>",
- None
+ "<path duck='Mallard'/>",
+ None,
+ None
+ ),
+ # line
+ (
+ '<line x1="10" x2="50" y1="110" y2="150"/>',
+ 'M10,110 L50,150',
+ None
+ ),
+ # line, decimal positioning
+ (
+ '<line x1="10.0" x2="50.5" y1="110.2" y2="150.7"/>',
+ 'M10,110.2 L50.5,150.7',
+ None
),
# rect: minimal valid example
(
"<rect width='1' height='1'/>",
"M0,0 H1 V1 H0 V0 z",
+ None
),
# rect: sharp corners
(
"<rect x='10' y='11' width='17' height='11'/>",
"M10,11 H27 V22 H10 V11 z",
+ None
),
# rect: round corners
(
"<rect x='9' y='9' width='11' height='7' rx='2'/>",
"M11,9 H18 A2,2 0 0 1 20,11 V14 A2,2 0 0 1 18,16 H11"
" A2,2 0 0 1 9,14 V11 A2,2 0 0 1 11,9 z",
+ None
+ ),
+ # rect: simple
+ (
+ "<rect x='11.5' y='16' width='11' height='2'/>",
+ "M11.5,16 H22.5 V18 H11.5 V16 z",
+ None
+ ),
+ # rect: the one above plus a rotation
+ (
+ "<rect x='11.5' y='16' transform='matrix(0.7071 -0.7071 0.7071 0.7071 -7.0416 16.9999)' width='11' height='2'/>",
+ "M11.5,16 H22.5 V18 H11.5 V16 z",
+ (0.7071, -0.7071, 0.7071, 0.7071, -7.0416, 16.9999)
),
# polygon
(
"<polygon points='30,10 50,30 10,30'/>",
- "M30,10 50,30 10,30 z"
+ "M30,10 50,30 10,30 z",
+ None
+ ),
+ # polyline
+ (
+ "<polyline points='30,10 50,30 10,30'/>",
+ "M30,10 50,30 10,30",
+ None
),
# circle, minimal valid example
(
"<circle r='1'/>",
- "M-1,0 A1,1 0 1 1 1,0 A1,1 0 1 1 -1,0"
+ "M-1,0 A1,1 0 1 1 1,0 A1,1 0 1 1 -1,0",
+ None
),
# circle
(
"<circle cx='600' cy='200' r='100'/>",
- "M500,200 A100,100 0 1 1 700,200 A100,100 0 1 1 500,200"
+ "M500,200 A100,100 0 1 1 700,200 A100,100 0 1 1 500,200",
+ None
),
# circle, decimal positioning
(
"<circle cx='12' cy='6.5' r='1.5'></circle>",
- "M10.5,6.5 A1.5,1.5 0 1 1 13.5,6.5 A1.5,1.5 0 1 1 10.5,6.5"
- )
+ "M10.5,6.5 A1.5,1.5 0 1 1 13.5,6.5 A1.5,1.5 0 1 1 10.5,6.5",
+ None
+ ),
+ # circle, with transform
+ (
+ '<circle transform="matrix(0.9871 -0.1602 0.1602 0.9871 -7.525 8.6516)" cx="49.9" cy="51" r="14.3"/>',
+ 'M35.6,51 A14.3,14.3 0 1 1 64.2,51 A14.3,14.3 0 1 1 35.6,51',
+ (0.9871, -0.1602, 0.1602, 0.9871, -7.525, 8.6516)
+ ),
+ # ellipse
+ (
+ '<ellipse cx="100" cy="50" rx="100" ry="50"/>',
+ 'M0,50 A100,50 0 1 1 200,50 A100,50 0 1 1 0,50',
+ None
+ ),
+ # ellipse, decimal positioning
+ (
+ '<ellipse cx="100.5" cy="50" rx="10" ry="50.5"/>',
+ 'M90.5,50 A10,50.5 0 1 1 110.5,50 A10,50.5 0 1 1 90.5,50',
+ None
+ ),
+ # ellipse, with transform
+ (
+ '<ellipse transform="matrix(0.9557 -0.2945 0.2945 0.9557 -14.7694 20.1454)" cx="59.5" cy="59.1" rx="30.9" ry="11.9"/>',
+ 'M28.6,59.1 A30.9,11.9 0 1 1 90.4,59.1 A30.9,11.9 0 1 1 28.6,59.1',
+ (0.9557, -0.2945, 0.2945, 0.9557, -14.7694, 20.1454)
+ ),
]
)
-def test_el_to_path(svg_xml, expected_path):
+def test_el_to_path(svg_xml, expected_path, expected_transform):
pb = shapes.PathBuilder()
pb.add_path_from_element(etree.fromstring(svg_xml))
if expected_path:
- expected = [expected_path]
+ expected_paths = [expected_path]
+ expected_transforms = [expected_transform]
else:
- expected = []
- assert pb.paths == expected
+ expected_paths = []
+ expected_transforms = []
+ assert pb.paths == expected_paths
+ assert pb.transforms == expected_transforms
diff --git a/Tests/ttLib/tables/_g_l_y_f_test.py b/Tests/ttLib/tables/_g_l_y_f_test.py
index 00c74bcf..b30528aa 100644
--- a/Tests/ttLib/tables/_g_l_y_f_test.py
+++ b/Tests/ttLib/tables/_g_l_y_f_test.py
@@ -4,6 +4,7 @@ from fontTools.misc.fixedTools import otRound
from fontTools.pens.ttGlyphPen import TTGlyphPen
from fontTools.ttLib import TTFont, newTable, TTLibError
from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates
+from fontTools.ttLib.tables import ttProgram
import sys
import array
import pytest
@@ -240,6 +241,41 @@ class glyfTableTest(unittest.TestCase):
with self.assertRaisesRegex(TTLibError, "glyph '.' contains a recursive component reference"):
glyph_A.getCoordinates(glyphSet)
+ def test_trim_remove_hinting_composite_glyph(self):
+ glyphSet = {"dummy": TTGlyphPen(None).glyph()}
+
+ pen = TTGlyphPen(glyphSet)
+ pen.addComponent("dummy", (1, 0, 0, 1, 0, 0))
+ composite = pen.glyph()
+ p = ttProgram.Program()
+ p.fromAssembly(['SVTCA[0]'])
+ composite.program = p
+ glyphSet["composite"] = composite
+
+ glyfTable = newTable("glyf")
+ glyfTable.glyphs = glyphSet
+ glyfTable.glyphOrder = sorted(glyphSet)
+
+ composite.compact(glyfTable)
+
+ self.assertTrue(hasattr(composite, "data"))
+
+ # remove hinting from the compacted composite glyph, without expanding it
+ composite.trim(remove_hinting=True)
+
+ # check that, after expanding the glyph, we have no instructions
+ composite.expand(glyfTable)
+ self.assertFalse(hasattr(composite, "program"))
+
+ # now remove hinting from expanded composite glyph
+ composite.program = p
+ composite.trim(remove_hinting=True)
+
+ # check we have no instructions
+ self.assertFalse(hasattr(composite, "program"))
+
+ composite.compact(glyfTable)
+
if __name__ == "__main__":
import sys
diff --git a/Tests/varLib/data/TestCFF2VF.otf b/Tests/varLib/data/TestCFF2VF.otf
deleted file mode 100644
index 590ad271..00000000
--- a/Tests/varLib/data/TestCFF2VF.otf
+++ /dev/null
Binary files differ
diff --git a/Tests/varLib/data/TestSparseCFF2VF.designspace b/Tests/varLib/data/TestSparseCFF2VF.designspace
new file mode 100644
index 00000000..d8165cf8
--- /dev/null
+++ b/Tests/varLib/data/TestSparseCFF2VF.designspace
@@ -0,0 +1,229 @@
+<?xml version='1.0' encoding='utf-8'?>
+<designspace format="3">
+ <axes>
+ <axis default="200" maximum="900" minimum="200" name="weight" tag="wght">
+ <map input="200" output="0" /> <!-- ExtraLight -->
+ <map input="300" output="160" /> <!-- Light -->
+ <map input="350" output="320" /> <!-- Normal -->
+ <map input="400" output="390" /> <!-- Regular -->
+ <map input="500" output="560" /> <!-- Medium -->
+ <map input="700" output="780" /> <!-- Bold -->
+ <map input="900" output="1000" /><!-- Heavy -->
+ </axis>
+ </axes>
+ <sources>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w0.00.ufo" stylename="w0.00">
+ <info copy="1" />
+ <location>
+ <dimension name="weight" xvalue="0.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w439.00.ufo" stylename="w439.00">
+
+ <location>
+ <dimension name="weight" xvalue="439.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w440.00.ufo" stylename="w440.00">
+
+ <location>
+ <dimension name="weight" xvalue="440.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w599.00.ufo" stylename="w599.00">
+
+ <location>
+ <dimension name="weight" xvalue="599.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w600.00.ufo" stylename="w600.00">
+
+ <location>
+ <dimension name="weight" xvalue="600.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w669.00.ufo" stylename="w669.00">
+
+ <location>
+ <dimension name="weight" xvalue="669.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w670.00.ufo" stylename="w670.00">
+
+ <location>
+ <dimension name="weight" xvalue="670.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w799.00.ufo" stylename="w799.00">
+
+ <location>
+ <dimension name="weight" xvalue="799.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w800.00.ufo" stylename="w800.00">
+
+ <location>
+ <dimension name="weight" xvalue="800.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w889.00.ufo" stylename="w889.00">
+
+ <location>
+ <dimension name="weight" xvalue="889.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w890.00.ufo" stylename="w890.00">
+
+ <location>
+ <dimension name="weight" xvalue="890.00" />
+ </location>
+ </source>
+ <source filename="master_sparse_cff2/MasterSet_Kanji-w1000.00.ufo" stylename="w1000.00">
+
+ <location>
+ <dimension name="weight" xvalue="1000.00" />
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w0.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w0.00" stylename="Kanji-w0.00">
+ <location>
+ <dimension name="weight" xvalue="0" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w239.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w239.00" stylename="Kanji-w239.00">
+ <location>
+ <dimension name="weight" xvalue="239" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w240.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w240.00" stylename="Kanji-w240.00">
+ <location>
+ <dimension name="weight" xvalue="240" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w439.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w439.00" stylename="Kanji-w439.00">
+ <location>
+ <dimension name="weight" xvalue="439" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w440.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w440.00" stylename="Kanji-w440.00">
+ <location>
+ <dimension name="weight" xvalue="440" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+
+
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w499.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w499.00" stylename="Kanji-w499.00">
+ <location>
+ <dimension name="weight" xvalue="499" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w500.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w500.00" stylename="Kanji-w500.00">
+ <location>
+ <dimension name="weight" xvalue="500" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+
+
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w599.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w599.00" stylename="Kanji-w599.00">
+ <location>
+ <dimension name="weight" xvalue="599" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w600.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w600.00" stylename="Kanji-w600.00">
+ <location>
+ <dimension name="weight" xvalue="600" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+
+
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w669.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w669.00" stylename="Kanji-w669.00">
+ <location>
+ <dimension name="weight" xvalue="669" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w670.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w670.00" stylename="Kanji-w670.00">
+ <location>
+ <dimension name="weight" xvalue="670" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+
+
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w699.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w699.00" stylename="Kanji-w699.00">
+ <location>
+ <dimension name="weight" xvalue="699" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w700.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w700.00" stylename="Kanji-w700.00">
+ <location>
+ <dimension name="weight" xvalue="700" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+
+
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-799.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-799.00" stylename="Kanji-799.00">
+ <location>
+ <dimension name="weight" xvalue="799" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w800.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w800.00" stylename="Kanji-w800.00">
+ <location>
+ <dimension name="weight" xvalue="800" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+
+
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w889.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w889.00" stylename="Kanji-w889.00">
+ <location>
+ <dimension name="weight" xvalue="889" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w890.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w890.00" stylename="Kanji-w890.00">
+ <location>
+ <dimension name="weight" xvalue="890" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+
+
+ <instance familyname="SHSansJPVFTest" filename="instances/SHSansJPVFTest-Kanji-w1000.00.otf" postscriptfontname="SHSansJPVFTest-Kanji-w1000.00" stylename="Kanji-w1000.00">
+ <location>
+ <dimension name="weight" xvalue="1000" />
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/varLib/data/TestVVAR.designspace b/Tests/varLib/data/TestVVAR.designspace
new file mode 100644
index 00000000..162f7385
--- /dev/null
+++ b/Tests/varLib/data/TestVVAR.designspace
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='utf-8'?>
+<designspace format="3">
+ <axes>
+ <axis default="0" maximum="1000" minimum="0" name="weight" tag="wght" />
+ </axes>
+ <sources>
+ <source filename="master_vvar_cff2/TestVVAR.0.ufo" stylename="w0.00">
+ <info copy="1" />
+ <location>
+ <dimension name="weight" xvalue="0.00" />
+ </location>
+ </source>
+ <source filename="master_vvar_cff2/TestVVAR.1.ufo" stylename="w1000.00">
+
+ <location>
+ <dimension name="weight" xvalue="1000.00" />
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance familyname="TestVVAR" filename="instances/TestVVAR-ExtraLight.otf" postscriptfontname="TestVVAR-ExtraLight" stylename="ExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ <instance familyname="TestVVAR" filename="instances/TestVVAR-Heavy.otf" postscriptfontname="TestVVAR-Heavy" stylename="Heavy">
+ <location>
+ <dimension name="weight" xvalue="1000" />
+ </location>
+ <kerning />
+ <info />
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/varLib/data/master_cff2/TestCFF2_Black.otf b/Tests/varLib/data/master_cff2/TestCFF2_Black.otf
deleted file mode 100644
index b4249e10..00000000
--- a/Tests/varLib/data/master_cff2/TestCFF2_Black.otf
+++ /dev/null
Binary files differ
diff --git a/Tests/varLib/data/master_cff2/TestCFF2_Black.ttx b/Tests/varLib/data/master_cff2/TestCFF2_Black.ttx
new file mode 100644
index 00000000..7270a161
--- /dev/null
+++ b/Tests/varLib/data/master_cff2/TestCFF2_Black.ttx
@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="dollar.a"/>
+ <GlyphID id="4" name="dollar"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.01"/>
+ <checkSumAdjustment value="0x26378952"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Nov 29 14:52:09 2018"/>
+ <modified value="Thu Nov 29 14:52:09 2018"/>
+ <xMin value="0"/>
+ <yMin value="-116"/>
+ <xMax value="600"/>
+ <yMax value="750"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="984"/>
+ <descent value="-273"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="0"/>
+ <minRightSideBearing value="0"/>
+ <xMaxExtent value="600"/>
+ <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>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="5"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="592"/>
+ <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="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="8"/>
+ <bProportion value="9"/>
+ <bContrast value="3"/>
+ <bStrokeVariation value="4"/>
+ <bArmStyle value="3"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBO"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="36"/>
+ <usLastCharIndex value="84"/>
+ <sTypoAscender value="750"/>
+ <sTypoDescender value="-250"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="984"/>
+ <usWinDescent value="273"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="660"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ 1.010;ADBO;SourceCode_Black
+ </namerecord>
+ <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Version 1.010;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SourceCode_Black
+ </namerecord>
+ <namerecord nameID="17" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Roman Master 2
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.010;ADBO;SourceCode_Black
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.010;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SourceCode_Black
+ </namerecord>
+ <namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
+ Roman Master 2
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ </cmap_format_4>
+ <cmap_format_6 platformID="1" platEncID="0" language="0">
+ <map code="0x24" name="dollar"/>
+ <map code="0x41" name="A"/>
+ <map code="0x54" name="T"/>
+ </cmap_format_6>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ </cmap_format_4>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="1"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="SourceCode_Black">
+ <version value="1.0"/>
+ <Notice value="Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries."/>
+ <Copyright value="Copyright 2010 - 2012 Adobe Systems Incorporated. All Rights Reserved."/>
+ <FamilyName value="Source Code"/>
+ <isFixedPitch value="1"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="0 -116 600 750"/>
+ <StrokeWidth value="0"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <Encoding name="StandardEncoding"/>
+ <Private>
+ <BlueValues value="-12 0 500 512 580 592 634 646 650 662 696 708"/>
+ <OtherBlues value="-188 -176"/>
+ <FamilyBlues value="-12 0 486 498 574 586 638 650 656 668 712 724"/>
+ <FamilyOtherBlues value="-217 -205"/>
+ <BlueScale value="0.0625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="134"/>
+ <StdVW value="172"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="600"/>
+ <nominalWidthX value="667"/>
+ </Private>
+ <CharStrings>
+ <CharString name=".notdef">
+ 24 0 rmoveto
+ 552 0 rlineto
+ 0 660 rlineto
+ -552 0 rlineto
+ 0 -660 rlineto
+ 212 104 rmoveto
+ 26 56 rlineto
+ 36 96 rlineto
+ 4 0 rlineto
+ 36 -96 rlineto
+ 26 -56 rlineto
+ -128 0 rlineto
+ -100 68 rmoveto
+ 0 336 rlineto
+ 82 -168 rlineto
+ -82 -168 rlineto
+ 162 252 rmoveto
+ -40 96 rlineto
+ -18 36 rlineto
+ 120 0 rlineto
+ -18 -36 rlineto
+ -40 -96 rlineto
+ -4 0 rlineto
+ 84 -84 rmoveto
+ 82 168 rlineto
+ 0 -336 rlineto
+ -82 168 rlineto
+ endchar
+ </CharString>
+ <CharString name="A">
+ 0 0 rmoveto
+ 176 0 rlineto
+ 73 316 rlineto
+ 14 62 17 78 14 66 rrcurveto
+ 4 0 rlineto
+ 14 -66 19 -78 14 -62 rrcurveto
+ 73 -316 rlineto
+ 182 0 rlineto
+ -196 650 rlineto
+ -208 0 rlineto
+ -196 -650 rlineto
+ 141 138 rmoveto
+ 316 0 rlineto
+ 0 133 rlineto
+ -316 0 rlineto
+ 0 -133 rlineto
+ endchar
+ </CharString>
+ <CharString name="T">
+ 214 0 rmoveto
+ 172 0 rlineto
+ 0 506 rlineto
+ 187 0 rlineto
+ 0 144 rlineto
+ -546 0 rlineto
+ 0 -144 rlineto
+ 187 0 rlineto
+ 0 -506 rlineto
+ endchar
+ </CharString>
+ <CharString name="dollar">
+ -107 260 39 rmoveto
+ -65 0 -28 11 -49 24 rrcurveto
+ 89 -53 rlineto
+ -15 89 rlineto
+ -9 52 -22 18 -43 0 rrcurveto
+ -26 0 -27 -14 -14 -38 rrcurveto
+ 0 -90 71 -54 139 0 rrcurveto
+ 163 0 99 84 0 117 rrcurveto
+ 0 98 -58 68 -142 45 rrcurveto
+ -33 10 rlineto
+ -72 22 -24 24 0 49 rrcurveto
+ 0 61 47 23 67 0 rrcurveto
+ 42 0 27 -4 52 -24 rrcurveto
+ -85 47 rlineto
+ 10 -67 rlineto
+ 11 -75 37 -14 39 0 rrcurveto
+ 26 0 29 15 5 41 rrcurveto
+ -8 88 -76 48 -121 0 rrcurveto
+ -158 0 -85 -80 0 -115 rrcurveto
+ 0 -93 66 -69 121 -39 rrcurveto
+ 32 -11 rlineto
+ 80 -28 23 -19 0 -53 rrcurveto
+ 0 -55 -43 -39 -72 0 rrcurveto
+ 64 275 rmoveto
+ 0 417 rlineto
+ -71 0 rlineto
+ 0 -417 rlineto
+ 71 0 rlineto
+ -79 -429 rmoveto
+ 71 0 rlineto
+ 0 429 rlineto
+ -71 0 rlineto
+ 0 -429 rlineto
+ endchar
+ </CharString>
+ <CharString name="dollar.a">
+ 292 34 rmoveto
+ 163 0 83 80 0 100 rrcurveto
+ 0 182 -302 -4 0 56 rrcurveto
+ 0 21 18 11 36 0 rrcurveto
+ 55 0 39 -16 52 -32 rrcurveto
+ 84 98 rlineto
+ -53 52 -69 36 -97 0 rrcurveto
+ -141 0 -88 -68 0 -104 rrcurveto
+ 0 -188 302 12 0 -68 rrcurveto
+ 0 -20 -19 -10 -37 0 rrcurveto
+ -61 0 -55 20 -72 40 rrcurveto
+ -74 -116 rlineto
+ 65 -54 101 -28 70 0 rrcurveto
+ -19 -150 rmoveto
+ 160 854 rlineto
+ -100 12 rlineto
+ -160 -854 rlineto
+ 100 -12 rlineto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <BASE>
+ <Version value="0x00010000"/>
+ <HorizAxis>
+ <BaseTagList>
+ <!-- BaseTagCount=2 -->
+ <BaselineTag index="0" value="ideo"/>
+ <BaselineTag index="1" value="romn"/>
+ </BaseTagList>
+ <BaseScriptList>
+ <!-- BaseScriptCount=4 -->
+ <BaseScriptRecord index="0">
+ <BaseScriptTag value="DFLT"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="1">
+ <BaseScriptTag value="cyrl"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="2">
+ <BaseScriptTag value="grek"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="3">
+ <BaseScriptTag value="latn"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ </BaseScriptList>
+ </HorizAxis>
+ </BASE>
+
+ <GPOS>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="size"/>
+ <Feature>
+ <FeatureParamsSize>
+ <DesignSize value="10.0"/>
+ <SubfamilyID value="0"/>
+ <SubfamilyNameID value="0"/>
+ <RangeStart value="0.0"/>
+ <RangeEnd value="0.0"/>
+ </FeatureParamsSize>
+ <!-- LookupCount=0 -->
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="dollar" out="dollar.a"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+ <hmtx>
+ <mtx name=".notdef" width="600" lsb="24"/>
+ <mtx name="A" width="600" lsb="0"/>
+ <mtx name="T" width="600" lsb="27"/>
+ <mtx name="dollar" width="560" lsb="51"/>
+ <mtx name="dollar.a" width="600" lsb="56"/>
+ </hmtx>
+
+ <DSIG>
+ <!-- note that the Digital Signature will be invalid after recompilation! -->
+ <tableHeader flag="0x0" numSigs="0" version="1"/>
+ </DSIG>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.otf b/Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.otf
deleted file mode 100644
index 4464791a..00000000
--- a/Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.otf
+++ /dev/null
Binary files differ
diff --git a/Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.ttx b/Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.ttx
new file mode 100644
index 00000000..41dbb750
--- /dev/null
+++ b/Tests/varLib/data/master_cff2/TestCFF2_ExtraLight.ttx
@@ -0,0 +1,518 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="dollar.a"/>
+ <GlyphID id="4" name="dollar"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.01"/>
+ <checkSumAdjustment value="0xeb345d38"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Nov 29 14:52:09 2018"/>
+ <modified value="Thu Nov 29 14:52:09 2018"/>
+ <xMin value="50"/>
+ <yMin value="-115"/>
+ <xMax value="550"/>
+ <yMax value="762"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="984"/>
+ <descent value="-273"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="50"/>
+ <minRightSideBearing value="50"/>
+ <xMaxExtent value="550"/>
+ <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>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="5"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="578"/>
+ <usWeightClass value="200"/>
+ <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="286"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="3"/>
+ <bProportion value="9"/>
+ <bContrast value="3"/>
+ <bStrokeVariation value="4"/>
+ <bArmStyle value="3"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBO"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="36"/>
+ <usLastCharIndex value="84"/>
+ <sTypoAscender value="750"/>
+ <sTypoDescender value="-250"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="984"/>
+ <usWinDescent value="273"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="478"/>
+ <sCapHeight value="660"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ 1.010;ADBO;SourceCode_ExtraLight
+ </namerecord>
+ <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Version 1.010;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SourceCode_ExtraLight
+ </namerecord>
+ <namerecord nameID="17" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Roman Master 0
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.010;ADBO;SourceCode_ExtraLight
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.010;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SourceCode_ExtraLight
+ </namerecord>
+ <namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
+ Roman Master 0
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ </cmap_format_4>
+ <cmap_format_6 platformID="1" platEncID="0" language="0">
+ <map code="0x24" name="dollar"/>
+ <map code="0x41" name="A"/>
+ <map code="0x54" name="T"/>
+ </cmap_format_6>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ </cmap_format_4>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="1"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="SourceCode_ExtraLight">
+ <version value="1.0"/>
+ <Notice value="Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries."/>
+ <Copyright value="Copyright 2010 - 2012 Adobe Systems Incorporated. All Rights Reserved."/>
+ <FamilyName value="Source Code"/>
+ <isFixedPitch value="1"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="50 -115 550 762"/>
+ <StrokeWidth value="0"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <Encoding name="StandardEncoding"/>
+ <Private>
+ <BlueValues value="-12 0 478 490 570 582 640 652 660 672 722 734"/>
+ <OtherBlues value="-234 -222"/>
+ <FamilyBlues value="-12 0 486 498 574 586 638 650 656 668 712 724"/>
+ <FamilyOtherBlues value="-217 -205"/>
+ <BlueScale value="0.0625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="28"/>
+ <StdVW value="34"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="600"/>
+ <nominalWidthX value="597"/>
+ </Private>
+ <CharStrings>
+ <CharString name=".notdef">
+ 84 0 rmoveto
+ 432 0 rlineto
+ 0 660 rlineto
+ -432 0 rlineto
+ 0 -660 rlineto
+ 48 32 rmoveto
+ 102 176 rlineto
+ 64 106 rlineto
+ 4 0 rlineto
+ 62 -106 rlineto
+ 100 -176 rlineto
+ -332 0 rlineto
+ -10 42 rmoveto
+ 0 536 rlineto
+ 154 -270 rlineto
+ -154 -266 rlineto
+ 176 292 rmoveto
+ -56 92 rlineto
+ -94 168 rlineto
+ 302 0 rlineto
+ -94 -168 rlineto
+ -54 -92 rlineto
+ -4 0 rlineto
+ 26 -26 rmoveto
+ 152 270 rlineto
+ 0 -536 rlineto
+ -152 266 rlineto
+ endchar
+ </CharString>
+ <CharString name="A">
+ 50 0 rmoveto
+ 32 0 rlineto
+ 140 396 rlineto
+ 28 80 24 68 24 82 rrcurveto
+ 4 0 rlineto
+ 24 -82 24 -68 28 -80 rrcurveto
+ 138 -396 rlineto
+ 34 0 rlineto
+ -236 660 rlineto
+ -28 0 rlineto
+ -236 -660 rlineto
+ 102 236 rmoveto
+ 293 0 rlineto
+ 0 28 rlineto
+ -293 0 rlineto
+ 0 -28 rlineto
+ endchar
+ </CharString>
+ <CharString name="T">
+ 284 0 rmoveto
+ 32 0 rlineto
+ 0 632 rlineto
+ 234 0 rlineto
+ 0 28 rlineto
+ -500 0 rlineto
+ 0 -28 rlineto
+ 234 0 rlineto
+ 0 -632 rlineto
+ endchar
+ </CharString>
+ <CharString name="dollar">
+ -107 245 7 rmoveto
+ -65 0 -39 15 -46 50 rrcurveto
+ 36 -48 rlineto
+ -28 100 rlineto
+ -4 16 -12 4 -11 0 rrcurveto
+ -14 0 -8 -7 -1 -14 rrcurveto
+ 24 -85 61 -51 107 0 rrcurveto
+ 91 0 90 53 0 111 rrcurveto
+ 0 70 -26 66 -134 57 rrcurveto
+ -19 8 rlineto
+ -93 39 -42 49 0 68 rrcurveto
+ 0 91 60 48 88 0 rrcurveto
+ 56 0 35 -14 44 -50 rrcurveto
+ -38 47 rlineto
+ 28 -100 rlineto
+ 6 -15 10 -5 11 0 rrcurveto
+ 14 0 8 7 1 14 rrcurveto
+ -24 88 -67 48 -84 0 rrcurveto
+ -92 0 -82 -51 0 -108 rrcurveto
+ 0 -80 45 -53 92 -42 rrcurveto
+ 37 -17 rlineto
+ 114 -52 26 -46 0 -65 rrcurveto
+ 0 -92 -65 -54 -90 0 rrcurveto
+ 18 327 rmoveto
+ 0 428 rlineto
+ -22 0 rlineto
+ 0 -428 rlineto
+ 22 0 rlineto
+ -22 -449 rmoveto
+ 22 0 rlineto
+ 0 449 rlineto
+ -22 0 rlineto
+ 0 -449 rlineto
+ endchar
+ </CharString>
+ <CharString name="dollar.a">
+ 311 34 rmoveto
+ 103 0 88 56 0 94 rrcurveto
+ 0 184 -338 -32 0 142 rrcurveto
+ 0 68 57 44 85 0 rrcurveto
+ 76 0 34 -24 44 -38 rrcurveto
+ 20 20 rlineto
+ -41 38 -45 32 -85 0 rrcurveto
+ -99 0 -78 -54 0 -88 rrcurveto
+ 0 -166 338 28 0 -156 rrcurveto
+ 0 -70 -56 -50 -103 0 rrcurveto
+ -85 0 -66 38 -40 34 rrcurveto
+ -18 -22 rlineto
+ 45 -38 73 -40 91 0 rrcurveto
+ -70 -146 rmoveto
+ 158 860 rlineto
+ -30 4 rlineto
+ -158 -860 rlineto
+ 30 -4 rlineto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <BASE>
+ <Version value="0x00010000"/>
+ <HorizAxis>
+ <BaseTagList>
+ <!-- BaseTagCount=2 -->
+ <BaselineTag index="0" value="ideo"/>
+ <BaselineTag index="1" value="romn"/>
+ </BaseTagList>
+ <BaseScriptList>
+ <!-- BaseScriptCount=4 -->
+ <BaseScriptRecord index="0">
+ <BaseScriptTag value="DFLT"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="1">
+ <BaseScriptTag value="cyrl"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="2">
+ <BaseScriptTag value="grek"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="3">
+ <BaseScriptTag value="latn"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ </BaseScriptList>
+ </HorizAxis>
+ </BASE>
+
+ <GPOS>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="size"/>
+ <Feature>
+ <FeatureParamsSize>
+ <DesignSize value="10.0"/>
+ <SubfamilyID value="0"/>
+ <SubfamilyNameID value="0"/>
+ <RangeStart value="0.0"/>
+ <RangeEnd value="0.0"/>
+ </FeatureParamsSize>
+ <!-- LookupCount=0 -->
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="dollar" out="dollar.a"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+ <hmtx>
+ <mtx name=".notdef" width="600" lsb="84"/>
+ <mtx name="A" width="600" lsb="50"/>
+ <mtx name="T" width="600" lsb="50"/>
+ <mtx name="dollar" width="490" lsb="53"/>
+ <mtx name="dollar.a" width="600" lsb="102"/>
+ </hmtx>
+
+ <DSIG>
+ <!-- note that the Digital Signature will be invalid after recompilation! -->
+ <tableHeader flag="0x0" numSigs="0" version="1"/>
+ </DSIG>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_cff2/TestCFF2_Regular.otf b/Tests/varLib/data/master_cff2/TestCFF2_Regular.otf
deleted file mode 100644
index c87342e4..00000000
--- a/Tests/varLib/data/master_cff2/TestCFF2_Regular.otf
+++ /dev/null
Binary files differ
diff --git a/Tests/varLib/data/master_cff2/TestCFF2_Regular.ttx b/Tests/varLib/data/master_cff2/TestCFF2_Regular.ttx
new file mode 100644
index 00000000..49d116ce
--- /dev/null
+++ b/Tests/varLib/data/master_cff2/TestCFF2_Regular.ttx
@@ -0,0 +1,516 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="dollar.a"/>
+ <GlyphID id="4" name="dollar"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.01"/>
+ <checkSumAdjustment value="0x60d07155"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Nov 29 14:52:09 2018"/>
+ <modified value="Thu Nov 29 14:52:09 2018"/>
+ <xMin value="31"/>
+ <yMin value="-115"/>
+ <xMax value="569"/>
+ <yMax value="751"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="984"/>
+ <descent value="-273"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="31"/>
+ <minRightSideBearing value="31"/>
+ <xMaxExtent value="569"/>
+ <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>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="5"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="579"/>
+ <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="291"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="9"/>
+ <bContrast value="3"/>
+ <bStrokeVariation value="4"/>
+ <bArmStyle value="3"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBO"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="36"/>
+ <usLastCharIndex value="84"/>
+ <sTypoAscender value="750"/>
+ <sTypoDescender value="-250"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="984"/>
+ <usWinDescent value="273"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="486"/>
+ <sCapHeight value="660"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ 1.010;ADBO;SourceCodeVariable-Roman
+ </namerecord>
+ <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Version 1.010;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SourceCodeVariable-Roman
+ </namerecord>
+ <namerecord nameID="17" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Roman
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.010;ADBO;SourceCodeVariable-Roman
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.010;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SourceCodeVariable-Roman
+ </namerecord>
+ <namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
+ Roman
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ </cmap_format_4>
+ <cmap_format_6 platformID="1" platEncID="0" language="0">
+ <map code="0x24" name="dollar"/>
+ <map code="0x41" name="A"/>
+ <map code="0x54" name="T"/>
+ </cmap_format_6>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ </cmap_format_4>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="1"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="SourceCodeVariable-Roman">
+ <version value="1.0"/>
+ <Notice value="Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries."/>
+ <Copyright value="Copyright 2010 - 2012 Adobe Systems Incorporated. All Rights Reserved."/>
+ <FamilyName value="Source Code"/>
+ <isFixedPitch value="1"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="31 -115 569 751"/>
+ <StrokeWidth value="0"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <Encoding name="StandardEncoding"/>
+ <Private>
+ <BlueValues value="-12 0 486 498 574 586 638 650 656 668 712 724"/>
+ <OtherBlues value="-217 -205"/>
+ <BlueScale value="0.0625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="67"/>
+ <StdVW value="85"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="600"/>
+ <nominalWidthX value="604"/>
+ </Private>
+ <CharStrings>
+ <CharString name=".notdef">
+ 62 0 rmoveto
+ 476 0 rlineto
+ 0 660 rlineto
+ -476 0 rlineto
+ 0 -660 rlineto
+ 109 59 rmoveto
+ 73 131 rlineto
+ 54 102 rlineto
+ 4 0 rlineto
+ 52 -102 rlineto
+ 73 -131 rlineto
+ -256 0 rlineto
+ -44 52 rmoveto
+ 0 461 rlineto
+ 127 -232 rlineto
+ -127 -229 rlineto
+ 171 277 rmoveto
+ -50 93 rlineto
+ -66 119 rlineto
+ 234 0 rlineto
+ -65 -119 rlineto
+ -49 -93 rlineto
+ -4 0 rlineto
+ 48 -48 rmoveto
+ 126 232 rlineto
+ 0 -461 rlineto
+ -126 229 rlineto
+ endchar
+ </CharString>
+ <CharString name="A">
+ 31 0 rmoveto
+ 86 0 rlineto
+ 115 366 rlineto
+ 23 73 21 72 21 76 rrcurveto
+ 4 0 rlineto
+ 20 -76 22 -72 23 -73 rrcurveto
+ 113 -366 rlineto
+ 90 0 rlineto
+ -221 656 rlineto
+ -96 0 rlineto
+ -221 -656 rlineto
+ 117 199 rmoveto
+ 301 0 rlineto
+ 0 68 rlineto
+ -301 0 rlineto
+ 0 -68 rlineto
+ endchar
+ </CharString>
+ <CharString name="T">
+ 258 0 rmoveto
+ 84 0 rlineto
+ 0 585 rlineto
+ 217 0 rlineto
+ 0 71 rlineto
+ -518 0 rlineto
+ 0 -71 rlineto
+ 217 0 rlineto
+ 0 -585 rlineto
+ endchar
+ </CharString>
+ <CharString name="dollar">
+ -107 248 35 rmoveto
+ -39 0 -45 5 -46 18 rrcurveto
+ 53 -36 rlineto
+ -17 76 rlineto
+ -12 53 -22 13 -24 0 rrcurveto
+ -22 0 -14 -11 -9 -20 rrcurveto
+ 4 -87 81 -59 107 0 rrcurveto
+ 136 0 82 76 0 107 rrcurveto
+ 0 82 -41 65 -135 47 rrcurveto
+ -38 13 rlineto
+ -71 23 -40 35 0 64 rrcurveto
+ 0 75 57 37 74 0 rrcurveto
+ 30 0 36 -5 42 -17 rrcurveto
+ -52 36 rlineto
+ 17 -76 rlineto
+ 12 -52 25 -14 22 0 rrcurveto
+ 19 0 17 10 8 21 rrcurveto
+ -6 86 -80 60 -101 0 rrcurveto
+ -115 0 -83 -80 0 -102 rrcurveto
+ 0 -100 62 -54 105 -37 rrcurveto
+ 37 -13 rlineto
+ 85 -30 36 -30 0 -63 rrcurveto
+ 0 -74 -53 -42 -82 0 rrcurveto
+ 31 287 rmoveto
+ 0 428 rlineto
+ -40 0 rlineto
+ 0 -428 rlineto
+ 40 0 rlineto
+ -41 -437 rmoveto
+ 40 0 rlineto
+ 0 437 rlineto
+ -40 0 rlineto
+ 0 -437 rlineto
+ endchar
+ </CharString>
+ <CharString name="dollar.a">
+ 304 34 rmoveto
+ 125 0 86 65 0 96 rrcurveto
+ 0 183 -324 -21 0 110 rrcurveto
+ 0 50 42 32 67 0 rrcurveto
+ 68 0 36 -21 47 -36 rrcurveto
+ 44 49 rlineto
+ -46 44 -54 33 -89 0 rrcurveto
+ -115 0 -81 -59 0 -94 rrcurveto
+ 0 -174 324 22 0 -124 rrcurveto
+ 0 -51 -42 -35 -78 0 rrcurveto
+ -76 0 -62 31 -52 37 rrcurveto
+ -39 -58 rlineto
+ 52 -43 84 -36 83 0 rrcurveto
+ -51 -147 rmoveto
+ 159 857 rlineto
+ -56 7 rlineto
+ -159 -858 rlineto
+ 56 -6 rlineto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <BASE>
+ <Version value="0x00010000"/>
+ <HorizAxis>
+ <BaseTagList>
+ <!-- BaseTagCount=2 -->
+ <BaselineTag index="0" value="ideo"/>
+ <BaselineTag index="1" value="romn"/>
+ </BaseTagList>
+ <BaseScriptList>
+ <!-- BaseScriptCount=4 -->
+ <BaseScriptRecord index="0">
+ <BaseScriptTag value="DFLT"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="1">
+ <BaseScriptTag value="cyrl"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="2">
+ <BaseScriptTag value="grek"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="3">
+ <BaseScriptTag value="latn"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ </BaseScriptList>
+ </HorizAxis>
+ </BASE>
+
+ <GPOS>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="size"/>
+ <Feature>
+ <FeatureParamsSize>
+ <DesignSize value="10.0"/>
+ <SubfamilyID value="0"/>
+ <SubfamilyNameID value="0"/>
+ <RangeStart value="0.0"/>
+ <RangeEnd value="0.0"/>
+ </FeatureParamsSize>
+ <!-- LookupCount=0 -->
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=1 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="dollar" out="dollar.a"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+ <hmtx>
+ <mtx name=".notdef" width="600" lsb="62"/>
+ <mtx name="A" width="600" lsb="31"/>
+ <mtx name="T" width="600" lsb="41"/>
+ <mtx name="dollar" width="497" lsb="51"/>
+ <mtx name="dollar.a" width="600" lsb="85"/>
+ </hmtx>
+
+ <DSIG>
+ <!-- note that the Digital Signature will be invalid after recompilation! -->
+ <tableHeader flag="0x0" numSigs="0" version="1"/>
+ </DSIG>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w0.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w0.00.ttx
new file mode 100644
index 00000000..57731584
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w0.00.ttx
@@ -0,0 +1,1266 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid00001"/>
+ <GlyphID id="2" name="cid00002"/>
+ <GlyphID id="3" name="cid01177"/>
+ <GlyphID id="4" name="cid06449"/>
+ <GlyphID id="5" name="cid06821"/>
+ <GlyphID id="6" name="cid07253"/>
+ <GlyphID id="7" name="cid13393"/>
+ <GlyphID id="8" name="cid17290"/>
+ <GlyphID id="9" name="cid17852"/>
+ <GlyphID id="10" name="cid18480"/>
+ <GlyphID id="11" name="cid22370"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0xab835f00"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:06:21 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="14"/>
+ <yMin value="-120"/>
+ <xMax value="976"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="14"/>
+ <minRightSideBearing value="24"/>
+ <xMaxExtent value="976"/>
+ <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>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="12"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="977"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000011"/>
+ <ulUnicodeRange2 value="00101000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="0"/>
+ <usLastCharIndex value="63964"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w0.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w0.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w0.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w0.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x0" name="cid00001"/><!-- ???? -->
+ <map code="0x1" name="cid00001"/><!-- ???? -->
+ <map code="0x2" name="cid00001"/><!-- ???? -->
+ <map code="0x3" name="cid00001"/><!-- ???? -->
+ <map code="0x4" name="cid00001"/><!-- ???? -->
+ <map code="0x5" name="cid00001"/><!-- ???? -->
+ <map code="0x6" name="cid00001"/><!-- ???? -->
+ <map code="0x7" name="cid00001"/><!-- ???? -->
+ <map code="0x8" name="cid00001"/><!-- ???? -->
+ <map code="0x9" name="cid00001"/><!-- ???? -->
+ <map code="0xa" name="cid00001"/><!-- ???? -->
+ <map code="0xb" name="cid00001"/><!-- ???? -->
+ <map code="0xc" name="cid00001"/><!-- ???? -->
+ <map code="0xd" name="cid00001"/><!-- ???? -->
+ <map code="0xe" name="cid00001"/><!-- ???? -->
+ <map code="0xf" name="cid00001"/><!-- ???? -->
+ <map code="0x10" name="cid00001"/><!-- ???? -->
+ <map code="0x11" name="cid00001"/><!-- ???? -->
+ <map code="0x12" name="cid00001"/><!-- ???? -->
+ <map code="0x13" name="cid00001"/><!-- ???? -->
+ <map code="0x14" name="cid00001"/><!-- ???? -->
+ <map code="0x15" name="cid00001"/><!-- ???? -->
+ <map code="0x16" name="cid00001"/><!-- ???? -->
+ <map code="0x17" name="cid00001"/><!-- ???? -->
+ <map code="0x18" name="cid00001"/><!-- ???? -->
+ <map code="0x19" name="cid00001"/><!-- ???? -->
+ <map code="0x1a" name="cid00001"/><!-- ???? -->
+ <map code="0x1b" name="cid00001"/><!-- ???? -->
+ <map code="0x1c" name="cid00001"/><!-- ???? -->
+ <map code="0x1d" name="cid00001"/><!-- ???? -->
+ <map code="0x1e" name="cid00001"/><!-- ???? -->
+ <map code="0x1f" name="cid00001"/><!-- ???? -->
+ <map code="0x20" name="cid00001"/><!-- SPACE -->
+ <map code="0x21" name="cid00002"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="cid00001"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="532" language="0" nGroups="43">
+ <map code="0x0" name="cid00001"/><!-- ???? -->
+ <map code="0x1" name="cid00001"/><!-- ???? -->
+ <map code="0x2" name="cid00001"/><!-- ???? -->
+ <map code="0x3" name="cid00001"/><!-- ???? -->
+ <map code="0x4" name="cid00001"/><!-- ???? -->
+ <map code="0x5" name="cid00001"/><!-- ???? -->
+ <map code="0x6" name="cid00001"/><!-- ???? -->
+ <map code="0x7" name="cid00001"/><!-- ???? -->
+ <map code="0x8" name="cid00001"/><!-- ???? -->
+ <map code="0x9" name="cid00001"/><!-- ???? -->
+ <map code="0xa" name="cid00001"/><!-- ???? -->
+ <map code="0xb" name="cid00001"/><!-- ???? -->
+ <map code="0xc" name="cid00001"/><!-- ???? -->
+ <map code="0xd" name="cid00001"/><!-- ???? -->
+ <map code="0xe" name="cid00001"/><!-- ???? -->
+ <map code="0xf" name="cid00001"/><!-- ???? -->
+ <map code="0x10" name="cid00001"/><!-- ???? -->
+ <map code="0x11" name="cid00001"/><!-- ???? -->
+ <map code="0x12" name="cid00001"/><!-- ???? -->
+ <map code="0x13" name="cid00001"/><!-- ???? -->
+ <map code="0x14" name="cid00001"/><!-- ???? -->
+ <map code="0x15" name="cid00001"/><!-- ???? -->
+ <map code="0x16" name="cid00001"/><!-- ???? -->
+ <map code="0x17" name="cid00001"/><!-- ???? -->
+ <map code="0x18" name="cid00001"/><!-- ???? -->
+ <map code="0x19" name="cid00001"/><!-- ???? -->
+ <map code="0x1a" name="cid00001"/><!-- ???? -->
+ <map code="0x1b" name="cid00001"/><!-- ???? -->
+ <map code="0x1c" name="cid00001"/><!-- ???? -->
+ <map code="0x1d" name="cid00001"/><!-- ???? -->
+ <map code="0x1e" name="cid00001"/><!-- ???? -->
+ <map code="0x1f" name="cid00001"/><!-- ???? -->
+ <map code="0x20" name="cid00001"/><!-- SPACE -->
+ <map code="0x21" name="cid00002"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="cid00001"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ <cmap_format_14 platformID="0" platEncID="5">
+ <map uv="0x9686" uvs="0xfe00" name="cid13393"/>
+ <map uv="0x9686" uvs="0xe0101" name="cid13393"/>
+ </cmap_format_14>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x0" name="cid00001"/><!-- ???? -->
+ <map code="0x1" name="cid00001"/><!-- ???? -->
+ <map code="0x2" name="cid00001"/><!-- ???? -->
+ <map code="0x3" name="cid00001"/><!-- ???? -->
+ <map code="0x4" name="cid00001"/><!-- ???? -->
+ <map code="0x5" name="cid00001"/><!-- ???? -->
+ <map code="0x6" name="cid00001"/><!-- ???? -->
+ <map code="0x7" name="cid00001"/><!-- ???? -->
+ <map code="0x8" name="cid00001"/><!-- ???? -->
+ <map code="0x9" name="cid00001"/><!-- ???? -->
+ <map code="0xa" name="cid00001"/><!-- ???? -->
+ <map code="0xb" name="cid00001"/><!-- ???? -->
+ <map code="0xc" name="cid00001"/><!-- ???? -->
+ <map code="0xd" name="cid00001"/><!-- ???? -->
+ <map code="0xe" name="cid00001"/><!-- ???? -->
+ <map code="0xf" name="cid00001"/><!-- ???? -->
+ <map code="0x10" name="cid00001"/><!-- ???? -->
+ <map code="0x11" name="cid00001"/><!-- ???? -->
+ <map code="0x12" name="cid00001"/><!-- ???? -->
+ <map code="0x13" name="cid00001"/><!-- ???? -->
+ <map code="0x14" name="cid00001"/><!-- ???? -->
+ <map code="0x15" name="cid00001"/><!-- ???? -->
+ <map code="0x16" name="cid00001"/><!-- ???? -->
+ <map code="0x17" name="cid00001"/><!-- ???? -->
+ <map code="0x18" name="cid00001"/><!-- ???? -->
+ <map code="0x19" name="cid00001"/><!-- ???? -->
+ <map code="0x1a" name="cid00001"/><!-- ???? -->
+ <map code="0x1b" name="cid00001"/><!-- ???? -->
+ <map code="0x1c" name="cid00001"/><!-- ???? -->
+ <map code="0x1d" name="cid00001"/><!-- ???? -->
+ <map code="0x1e" name="cid00001"/><!-- ???? -->
+ <map code="0x1f" name="cid00001"/><!-- ???? -->
+ <map code="0x20" name="cid00001"/><!-- SPACE -->
+ <map code="0x21" name="cid00002"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="cid00001"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="532" language="0" nGroups="43">
+ <map code="0x0" name="cid00001"/><!-- ???? -->
+ <map code="0x1" name="cid00001"/><!-- ???? -->
+ <map code="0x2" name="cid00001"/><!-- ???? -->
+ <map code="0x3" name="cid00001"/><!-- ???? -->
+ <map code="0x4" name="cid00001"/><!-- ???? -->
+ <map code="0x5" name="cid00001"/><!-- ???? -->
+ <map code="0x6" name="cid00001"/><!-- ???? -->
+ <map code="0x7" name="cid00001"/><!-- ???? -->
+ <map code="0x8" name="cid00001"/><!-- ???? -->
+ <map code="0x9" name="cid00001"/><!-- ???? -->
+ <map code="0xa" name="cid00001"/><!-- ???? -->
+ <map code="0xb" name="cid00001"/><!-- ???? -->
+ <map code="0xc" name="cid00001"/><!-- ???? -->
+ <map code="0xd" name="cid00001"/><!-- ???? -->
+ <map code="0xe" name="cid00001"/><!-- ???? -->
+ <map code="0xf" name="cid00001"/><!-- ???? -->
+ <map code="0x10" name="cid00001"/><!-- ???? -->
+ <map code="0x11" name="cid00001"/><!-- ???? -->
+ <map code="0x12" name="cid00001"/><!-- ???? -->
+ <map code="0x13" name="cid00001"/><!-- ???? -->
+ <map code="0x14" name="cid00001"/><!-- ???? -->
+ <map code="0x15" name="cid00001"/><!-- ???? -->
+ <map code="0x16" name="cid00001"/><!-- ???? -->
+ <map code="0x17" name="cid00001"/><!-- ???? -->
+ <map code="0x18" name="cid00001"/><!-- ???? -->
+ <map code="0x19" name="cid00001"/><!-- ???? -->
+ <map code="0x1a" name="cid00001"/><!-- ???? -->
+ <map code="0x1b" name="cid00001"/><!-- ???? -->
+ <map code="0x1c" name="cid00001"/><!-- ???? -->
+ <map code="0x1d" name="cid00001"/><!-- ???? -->
+ <map code="0x1e" name="cid00001"/><!-- ???? -->
+ <map code="0x1f" name="cid00001"/><!-- ???? -->
+ <map code="0x20" name="cid00001"/><!-- SPACE -->
+ <map code="0x21" name="cid00002"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="cid00001"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w0.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w0.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="14 -120 976 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w0.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w0.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ <FontDict index="2">
+ <FontName value="MasterSet_Kanji-w0.00-Proportional"/>
+ <Private>
+ <BlueValues value="0 0"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="668"/>
+ <nominalWidthX value="504"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid00001" fdSelectIndex="2">
+ -273 endchar
+ </CharString>
+ <CharString name="cid00002" fdSelectIndex="2">
+ -282 -12 83 hstemhm
+ 74 73 -57 40 hintmask 10100000
+ 134 755 rmoveto
+ -48 0 rlineto
+ 8 -565 rlineto
+ 32 0 rlineto
+ hintmask 11000000
+ -17 -202 rmoveto
+ 24 0 14 18 0 22 rrcurveto
+ 0 25 -14 18 -22 0 rrcurveto
+ -23 0 -14 -21 0 -24 rrcurveto
+ 0 -18 13 -20 22 0 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid01177" fdSelectIndex="1">
+ 1000 -72 30 253 30 94 30 92 30 65 30 131 45 -30 112 -99 17 hstemhm
+ 193 30 83 30 147 30 173 30 66 30 hintmask 1111100011111000
+ 306 142 rmoveto
+ 0 -156 rlineto
+ 0 -50 22 -8 79 0 rrcurveto
+ 17 0 186 0 18 0 rrcurveto
+ 70 0 13 25 5 114 rrcurveto
+ -9 3 -12 4 -9 6 rrcurveto
+ -4 -109 -7 -13 -49 0 rrcurveto
+ -38 0 -156 0 -27 0 rrcurveto
+ -59 0 -10 5 0 22 rrcurveto
+ 0 157 rlineto
+ 63 34 rmoveto
+ 65 -30 74 -47 37 -37 rrcurveto
+ 20 22 rlineto
+ -37 36 -75 47 -65 28 rrcurveto
+ 320 -64 rmoveto
+ 76 -49 83 -75 38 -54 rrcurveto
+ 23 19 rlineto
+ -38 54 -84 73 -76 49 rrcurveto
+ -557 -5 rmoveto
+ -28 -68 -50 -72 -77 -40 rrcurveto
+ 24 -17 rlineto
+ 79 42 47 74 31 71 rrcurveto
+ -117 625 rmoveto
+ 0 -30 rlineto
+ 775 0 rlineto
+ 0 30 rlineto
+ -818 -176 rmoveto
+ 0 -30 rlineto
+ 869 0 rlineto
+ 0 30 rlineto
+ hintmask 0000001000100000
+ -455 258 rmoveto
+ hintmask 0000000100100000
+ 0 -99 rlineto
+ 30 0 rlineto
+ hintmask 0000001000100000
+ 0 99 rlineto
+ hintmask 0111010010001000
+ -236 -127 rmoveto
+ 26 -40 25 -53 9 -36 rrcurveto
+ 29 12 rlineto
+ -10 35 -25 53 -27 39 rrcurveto
+ 393 2 rmoveto
+ -16 -38 -31 -57 -23 -35 rrcurveto
+ 27 -12 rlineto
+ 24 36 26 48 23 46 rrcurveto
+ -504 -378 rmoveto
+ 559 0 rlineto
+ 0 -94 rlineto
+ -559 0 rlineto
+ 0 216 rmoveto
+ 559 0 rlineto
+ 0 -92 rlineto
+ -559 0 rlineto
+ -30 122 rmoveto
+ 0 -276 rlineto
+ 619 0 rlineto
+ 0 276 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid06449" fdSelectIndex="1">
+ 1000 -60 30 203 30 -9 9 67 7 -7 14 -14 30 -20 20 80 30 59 30 121 30 18 93 -30 30 -30 108 hstemhm
+ 77 30 42 30 139 30 23 30 71 10 74 30 15 30 16 30 158 30 28 30 -4 29 hintmask 110001011101011101101101
+ 53 761 rmoveto
+ 0 -30 rlineto
+ 896 0 rlineto
+ 0 30 rlineto
+ -802 -461 rmoveto
+ 0 -30 rlineto
+ 703 0 rlineto
+ 0 30 rlineto
+ hintmask 000000000000100100000000
+ -532 539 rmoveto
+ hintmask 000000000010000100000000
+ 0 -171 rlineto
+ 30 0 rlineto
+ hintmask 000000000000100100001000
+ 0 171 rlineto
+ 299 0 rmoveto
+ hintmask 000000000010000000001000
+ 0 -171 rlineto
+ 30 0 rlineto
+ hintmask 000000000000100000001000
+ 0 171 rlineto
+ hintmask 000000111100011010010100
+ -46 -219 rmoveto
+ 204 0 rlineto
+ 0 -121 rlineto
+ -204 0 rlineto
+ -230 121 rmoveto
+ 200 0 rlineto
+ 0 -121 rlineto
+ -200 0 rlineto
+ -222 121 rmoveto
+ 192 0 rlineto
+ 0 -121 rlineto
+ -192 0 rlineto
+ -30 151 rmoveto
+ 0 -181 rlineto
+ 716 0 rlineto
+ 0 181 rlineto
+ -788 -240 rmoveto
+ 0 -130 rlineto
+ 30 0 rlineto
+ 0 100 rlineto
+ hintmask 000000110000000000000010
+ 786 0 rlineto
+ 0 -100 rlineto
+ 30 0 rlineto
+ 0 130 rlineto
+ hintmask 000010000000000100000000
+ -610 -123 rmoveto
+ -50 -62 -93 -73 -118 -54 rrcurveto
+ 8 -4 10 -9 6 -7 rrcurveto
+ hintmask 010000000000000001000000
+ 121 58 92 75 59 70 rrcurveto
+ 124 -78 rmoveto
+ 0 -7 rlineto
+ -65 -139 -176 -81 -162 -31 rrcurveto
+ 6 -6 8 -12 3 -8 rrcurveto
+ hintmask 001000000000000001000000
+ 168 37 178 84 72 154 rrcurveto
+ hintmask 110100000000000001100001
+ -19 11 rlineto
+ -6 -2 rlineto
+ -333 -72 rmoveto
+ 65 -25 75 -46 38 -35 rrcurveto
+ 26 19 rlineto
+ -39 34 -76 45 -64 25 rrcurveto
+ 72 55 rmoveto
+ -30 -30 rlineto
+ 269 0 rlineto
+ 0 30 rlineto
+ 74 74 rmoveto
+ 0 -276 rlineto
+ 0 -52 21 -9 77 0 rrcurveto
+ 16 0 182 0 18 0 rrcurveto
+ 62 0 12 21 4 88 rrcurveto
+ -9 2 -12 5 -8 6 rrcurveto
+ -4 -81 -6 -11 -41 0 rrcurveto
+ -37 0 -154 0 -26 0 rrcurveto
+ -56 0 -9 6 0 25 rrcurveto
+ 0 276 rlineto
+ 278 -62 rmoveto
+ -66 -32 -126 -33 -107 -23 rrcurveto
+ 5 -7 5 -10 2 -7 rrcurveto
+ 110 22 126 32 81 36 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid06821" fdSelectIndex="1">
+ 1000 -58 30 100 30 70 22 -22 30 94 30 19 31 -17 28 152 20 -20 30 -12 12 66 30 -30 89 -5 30 -30 121 hstemhm
+ 127 30 -18 18 199 30 -20 20 -20 30 -24 14 97 30 -11 11 72 31 202 30 87 29 hintmask 00011000000000000000000100000000
+ 193 296 rmoveto
+ 625 0 rlineto
+ 0 -94 rlineto
+ -625 0 rlineto
+ -30 124 rmoveto
+ 0 -154 rlineto
+ 685 0 rlineto
+ 0 154 rlineto
+ hintmask 00100000000000000000100000000000
+ -365 -132 rmoveto
+ 0 -232 rlineto
+ 30 -5 rlineto
+ 0 237 rlineto
+ hintmask 01000000000010010000010000000000
+ -11 -92 rmoveto
+ 0 -30 rlineto
+ 397 0 rlineto
+ 0 30 rlineto
+ -760 647 rmoveto
+ 0 -30 rlineto
+ 811 0 rlineto
+ 0 30 rlineto
+ hintmask 00000000000010100000000000000000
+ -823 0 rmoveto
+ 0 -143 rlineto
+ 0 -83 -13 -107 -75 -82 rrcurveto
+ 7 -4 11 -9 5 -6 rrcurveto
+ 79 85 16 118 0 88 rrcurveto
+ 0 143 rlineto
+ hintmask 00000000010100001000000000000000
+ 199 -25 rmoveto
+ 0 -167 rlineto
+ hintmask 00000000010100000100000000000000
+ 30 0 rlineto
+ 0 167 rlineto
+ hintmask 00000000101000000001000000000000
+ -14 -59 rmoveto
+ 0 -30 rlineto
+ 185 0 rlineto
+ 0 30 rlineto
+ -365 -96 rmoveto
+ 0 -30 rlineto
+ 392 0 rlineto
+ 0 30 rlineto
+ hintmask 00000011000000000100000000000000
+ -218 -10 rmoveto
+ 0 -160 rlineto
+ 0 -8 -2 -3 -11 -1 rrcurveto
+ -11 -1 -30 0 -47 1 rrcurveto
+ 5 -9 6 -10 2 -9 rrcurveto
+ hintmask 00000011000001000010001000000000
+ 50 0 30 0 17 6 rrcurveto
+ 17 5 4 9 0 21 rrcurveto
+ 0 159 rlineto
+ -132 -50 rmoveto
+ -25 -42 -40 -39 -44 -30 rrcurveto
+ 8 -4 13 -10 5 -4 rrcurveto
+ 41 30 45 47 26 45 rrcurveto
+ 153 -7 rmoveto
+ 35 -27 38 -39 18 -28 rrcurveto
+ 24 18 rlineto
+ -18 27 -39 39 -34 25 rrcurveto
+ 115 330 rmoveto
+ hintmask 10000101000001000000001010000000
+ 14 -286 131 -209 160 0 rrcurveto
+ 50 1 18 34 6 108 rrcurveto
+ -9 3 -11 5 -9 7 rrcurveto
+ -4 -92 -9 -34 -31 -1 rrcurveto
+ -137 -2 -126 185 -12 281 rrcurveto
+ 207 -169 rmoveto
+ -61 -129 -111 -108 -121 -69 rrcurveto
+ 7 -5 12 -11 5 -6 rrcurveto
+ 119 74 113 110 66 136 rrcurveto
+ -156 153 rmoveto
+ 52 -15 63 -26 34 -21 rrcurveto
+ 15 27 rlineto
+ -34 20 -64 24 -51 14 rrcurveto
+ -453 -763 rmoveto
+ -25 -16 rlineto
+ 89 -100 146 -18 233 0 rrcurveto
+ 185 0 rlineto
+ 64 0 rlineto
+ 2 8 6 14 6 8 rrcurveto
+ -35 0 -207 0 -22 0 rrcurveto
+ -214 0 -150 15 -78 89 rrcurveto
+ 5 62 rmoveto
+ -30 -97 -92 -60 -107 -36 rrcurveto
+ 8 -6 12 -11 4 -6 rrcurveto
+ 105 41 99 65 32 106 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid07253" fdSelectIndex="1">
+ 1000 -80 27 95 49 -48 48 -45 45 -30 30 -16 16 -13 13 49 30 48 30 47 19 -19 30 53 30 -18 18 51 11 -11 30 -22 22 62 30 60 30 15 81 -30 30 -30 102 hstemhm
+ 193 30 -1 30 -15 15 106 29 96 30 142 30 109 30 5 10 hintmask 10000011101100101101000101110000
+ 55 767 rmoveto
+ 0 -30 rlineto
+ 892 0 rlineto
+ 0 30 rlineto
+ hintmask 00000000000000000000100000000000
+ -637 72 rmoveto
+ hintmask 00000000000000000010000000000000
+ 0 -153 rlineto
+ 30 0 rlineto
+ hintmask 00000000000000000000100000100000
+ 0 153 rlineto
+ 315 0 rmoveto
+ hintmask 00000000000000000010000000100000
+ 0 -153 rlineto
+ 30 0 rlineto
+ hintmask 00000000000100101100110000110000
+ 0 153 rlineto
+ -462 -288 rmoveto
+ 571 0 rlineto
+ 0 -62 rlineto
+ -571 0 rlineto
+ 0 152 rmoveto
+ 571 0 rlineto
+ 0 -60 rlineto
+ -571 0 rlineto
+ -30 90 rmoveto
+ 0 -212 rlineto
+ 631 0 rlineto
+ 0 212 rlineto
+ -776 -263 rmoveto
+ 0 -30 rlineto
+ 905 0 rlineto
+ 0 30 rlineto
+ hintmask 00000001100000000000000100000000
+ -716 -160 rmoveto
+ 0 -30 rlineto
+ 554 0 rlineto
+ 0 30 rlineto
+ -554 -78 rmoveto
+ 0 -30 rlineto
+ 563 0 rlineto
+ 0 30 rlineto
+ hintmask 00000010000000000000001000000000
+ -578 -79 rmoveto
+ hintmask 00001000000000000000001000001000
+ 0 -30 rlineto
+ 617 0 rlineto
+ hintmask 00000010000001000000000000001000
+ 0 30 rlineto
+ -477 382 rmoveto
+ -46 -92 -113 -104 -167 -65 rrcurveto
+ 7 -5 10 -9 5 -8 rrcurveto
+ hintmask 00000100010010010000000001000000
+ 172 70 111 106 55 101 rrcurveto
+ 298 -65 rmoveto
+ -25 -12 rlineto
+ 62 -80 121 -81 100 -38 rrcurveto
+ 5 8 9 11 7 6 rrcurveto
+ -101 33 -119 76 -59 77 rrcurveto
+ -211 -88 rmoveto
+ 0 -239 rlineto
+ 30 0 rlineto
+ 0 239 rlineto
+ hintmask 10000010000000000000000000001000
+ 316 -223 rmoveto
+ 0 -6 rlineto
+ -8 -87 -7 -34 -10 -10 rrcurveto
+ -6 -6 -6 -1 -12 0 rrcurveto
+ -11 0 -31 1 -34 3 rrcurveto
+ 5 -8 3 -13 1 -8 rrcurveto
+ 28 -2 30 -1 14 1 rrcurveto
+ 21 0 10 4 10 9 rrcurveto
+ 16 15 7 35 9 89 rrcurveto
+ 1 7 1 12 0 0 rrcurveto
+ -660 -34 rmoveto
+ -17 -46 -32 -46 -46 -23 rrcurveto
+ 20 -21 rlineto
+ hintmask 10010000000000000000000000000000
+ 52 28 31 51 17 46 rrcurveto
+ hintmask 00100000000000000000000010000000
+ 110 -3 rmoveto
+ 13 -38 10 -49 0 -32 rrcurveto
+ 29 6 rlineto
+ -1 31 -10 50 -15 37 rrcurveto
+ hintmask 01000000000000000000000000100000
+ 113 -6 rmoveto
+ 22 -32 20 -44 7 -30 rrcurveto
+ 28 10 rlineto
+ -8 29 -21 44 -23 32 rrcurveto
+ hintmask 00010000001000000000001000000000
+ 117 -5 rmoveto
+ 25 -23 27 -32 13 -23 rrcurveto
+ 21 14 rlineto
+ -12 22 -27 32 -26 22 rrcurveto
+ -381 267 rmoveto
+ -16 -30 rlineto
+ 498 0 rlineto
+ 0 30 rlineto
+ -516 -23 rmoveto
+ hintmask 00000010000000000000001000000000
+ 0 -224 rlineto
+ hintmask 00000010001000000000000100000000
+ 30 0 rlineto
+ 0 247 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid13393" fdSelectIndex="1">
+ 1000 -50 30 -19 19 114 30 44 30 23 30 -30 114 35 30 316 30 -10 10 37 12 hstemhm
+ 82 30 197 30 -26 8 317 30 168 13 hintmask 1010101101110110
+ 529 746 rmoveto
+ 0 -30 rlineto
+ 320 0 rlineto
+ 0 30 rlineto
+ -397 -495 rmoveto
+ 0 -30 rlineto
+ 442 0 rlineto
+ 0 30 rlineto
+ -420 149 rmoveto
+ 0 -30 rlineto
+ 374 0 rlineto
+ 0 30 rlineto
+ -514 -420 rmoveto
+ 0 -30 rlineto
+ 626 0 rlineto
+ 0 30 rlineto
+ -531 144 rmoveto
+ 0 -30 rlineto
+ 460 0 rlineto
+ 0 30 rlineto
+ -53 622 rmoveto
+ 0 -7 rlineto
+ -86 -171 -222 -118 -188 -45 rrcurveto
+ 7 -7 8 -11 3 -8 rrcurveto
+ hintmask 0000000010000010
+ 192 51 224 119 94 187 rrcurveto
+ hintmask 0100010100000110
+ -19 12 rlineto
+ -6 -2 rlineto
+ -323 -32 rmoveto
+ -25 -11 rlineto
+ 83 -154 177 -116 201 -44 rrcurveto
+ 4 8 9 12 7 6 rrcurveto
+ -200 39 -177 113 -79 147 rrcurveto
+ 59 127 rmoveto
+ -40 -82 -80 -104 -112 -75 rrcurveto
+ 8 -4 10 -9 6 -7 rrcurveto
+ 115 80 80 106 47 90 rrcurveto
+ -129 -493 rmoveto
+ -27 -73 -43 -71 -51 -50 rrcurveto
+ 8 -5 13 -9 5 -5 rrcurveto
+ 49 52 47 77 29 77 rrcurveto
+ 124 -1 rmoveto
+ 0 -374 rlineto
+ 30 0 rlineto
+ 0 374 rlineto
+ hintmask 0000000000101000
+ -586 460 rmoveto
+ 0 -875 rlineto
+ 30 0 rlineto
+ 0 845 rlineto
+ 209 0 rlineto
+ 0 30 rlineto
+ -8 0 rmoveto
+ 0 -7 rlineto
+ -28 -75 -43 -102 -46 -95 rrcurveto
+ hintmask 0001000000010000
+ 89 -91 24 -74 0 -63 rrcurveto
+ 0 -33 -6 -35 -19 -13 rrcurveto
+ -10 -6 -12 -3 -14 -1 rrcurveto
+ -20 -2 -26 1 -29 2 rrcurveto
+ 7 -9 4 -13 1 -8 rrcurveto
+ 22 -2 27 0 22 2 rrcurveto
+ 19 2 17 5 12 9 rrcurveto
+ 25 17 10 43 0 44 rrcurveto
+ 0 67 -22 76 -86 89 rrcurveto
+ hintmask 0000000001001000
+ 39 84 42 98 33 81 rrcurveto
+ hintmask 0000000000001000
+ -20 14 rlineto
+ -6 -2 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid17290" fdSelectIndex="1">
+ 1000 121 30 -22 22 148 30 -30 136 23 30 129 30 116 30 hstemhm
+ 167 30 129 30 -16 16 123 30 48 30 -6 29 -29 111 -30 30 -16 16 201 30 1 29 hintmask 011011111011001010000000
+ 326 793 rmoveto
+ 0 -280 rlineto
+ 0 -47 16 -8 59 0 rrcurveto
+ hintmask 000010000000100000000000
+ 13 0 120 0 13 0 rrcurveto
+ 49 0 10 20 4 82 rrcurveto
+ hintmask 101010101000010000000000
+ -10 2 -11 5 -8 6 rrcurveto
+ -3 -75 -5 -10 -29 0 rrcurveto
+ -24 0 -102 0 -18 0 rrcurveto
+ -38 0 -6 4 0 21 rrcurveto
+ 0 280 rlineto
+ -41 -464 rmoveto
+ 0 -30 rlineto
+ 617 0 rlineto
+ 0 30 rlineto
+ -661 -178 rmoveto
+ 0 -30 rlineto
+ 689 0 rlineto
+ 0 30 rlineto
+ hintmask 010101100111001000000000
+ -481 284 rmoveto
+ 0 -306 rlineto
+ 30 0 rlineto
+ 0 306 rlineto
+ 218 0 rmoveto
+ 0 -306 rlineto
+ 30 0 rlineto
+ 0 306 rlineto
+ -417 358 rmoveto
+ 0 -30 rlineto
+ 217 0 rlineto
+ 0 -116 rlineto
+ -217 0 rlineto
+ 0 -30 rlineto
+ 247 0 rlineto
+ 0 176 rlineto
+ 75 0 rmoveto
+ hintmask 000010100000001001000000
+ 0 -280 rlineto
+ 0 -47 17 -8 60 0 rrcurveto
+ 12 0 125 0 14 0 rrcurveto
+ 49 0 11 20 3 82 rrcurveto
+ -9 2 -12 4 -8 7 rrcurveto
+ -3 -75 -5 -10 -30 0 rrcurveto
+ -25 0 -105 0 -18 0 rrcurveto
+ -40 0 -6 4 0 21 rrcurveto
+ 0 280 rlineto
+ hintmask 000001110000000110000000
+ -16 0 rmoveto
+ 0 -30 rlineto
+ 217 0 rlineto
+ 0 -116 rlineto
+ -217 0 rlineto
+ 0 -30 rlineto
+ 247 0 rlineto
+ 0 176 rlineto
+ -424 -714 rmoveto
+ -52 -54 -91 -49 -81 -33 rrcurveto
+ 8 -5 11 -13 4 -6 rrcurveto
+ 80 36 94 56 56 58 rrcurveto
+ 200 -7 rmoveto
+ 76 -41 90 -62 46 -42 rrcurveto
+ 22 23 rlineto
+ -46 42 -91 60 -75 39 rrcurveto
+ -499 750 rmoveto
+ -54 -167 -87 -164 -96 -108 rrcurveto
+ 7 -6 11 -12 4 -6 rrcurveto
+ 98 116 88 165 58 175 rrcurveto
+ -113 -214 rmoveto
+ 0 -691 rlineto
+ 30 0 rlineto
+ 0 718 rlineto
+ -1 2 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid17852" fdSelectIndex="1">
+ 1000 -67 29 219 30 154 30 -16 16 150 30 -30 122 -85 30 -18 18 87 30 -30 140 -122 12 hstemhm
+ 51 188 -30 30 -30 149 21 30 -18 18 -13 13 66 30 -12 12 135 30 41 30 172 30 -6 28 hintmask 000000100001000000000000
+ 51 612 rmoveto
+ 0 -30 rlineto
+ hintmask 000000100000010000000000
+ 307 0 rlineto
+ 0 30 rlineto
+ hintmask 000000010010100100000000
+ -149 228 rmoveto
+ 0 -918 rlineto
+ 30 0 rlineto
+ 0 918 rlineto
+ -36 -238 rmoveto
+ -31 -160 -74 -193 -68 -95 rrcurveto
+ 7 -5 10 -11 6 -8 rrcurveto
+ 70 101 74 203 33 160 rrcurveto
+ 4 -143 rmoveto
+ -21 -16 rlineto
+ 25 -26 72 -92 21 -33 rrcurveto
+ 24 24 rlineto
+ -18 25 -81 96 -22 22 rrcurveto
+ 157 278 rmoveto
+ hintmask 000000001000000100000000
+ 0 -30 rlineto
+ 559 0 rlineto
+ hintmask 010000000010000000100000
+ 0 30 rlineto
+ -457 -518 rmoveto
+ 0 -30 rlineto
+ 176 0 rlineto
+ 0 30 rlineto
+ hintmask 000000000100000001010000
+ -194 120 rmoveto
+ 0 -365 rlineto
+ 30 0 rlineto
+ 0 365 rlineto
+ 135 508 rmoveto
+ hintmask 000000000010000000010000
+ 0 -122 rlineto
+ 30 0 rlineto
+ hintmask 000101000100000000010000
+ 0 122 rlineto
+ -115 -172 rmoveto
+ 0 -288 rlineto
+ 30 0 rlineto
+ 0 288 rlineto
+ 148 0 rmoveto
+ 0 -288 rlineto
+ 30 0 rlineto
+ 0 288 rlineto
+ 156 -394 rmoveto
+ -52 -36 -89 -48 -61 -29 rrcurveto
+ 15 -21 rlineto
+ 62 28 86 41 57 44 rrcurveto
+ hintmask 101010000000000010001100
+ -541 323 rmoveto
+ 0 -30 rlineto
+ 517 0 rlineto
+ 0 -150 rlineto
+ -517 0 rlineto
+ 0 -30 rlineto
+ 547 0 rlineto
+ 0 210 rlineto
+ -232 -242 rmoveto
+ 0 -344 rlineto
+ 0 -47 15 -9 54 0 rrcurveto
+ hintmask 100000000010001000001010
+ 12 0 100 0 12 0 rrcurveto
+ 48 0 10 25 3 102 rrcurveto
+ -9 3 -11 4 -8 6 rrcurveto
+ -3 -97 -4 -14 -29 0 rrcurveto
+ -21 0 -84 0 -16 0 rrcurveto
+ -33 0 -6 5 0 22 rrcurveto
+ 0 344 rlineto
+ -346 -371 rmoveto
+ 10 -31 rlineto
+ 77 16 100 22 99 21 rrcurveto
+ -2 29 rlineto
+ -108 -22 -104 -22 -72 -13 rrcurveto
+ -16 767 rmoveto
+ 0 -316 rlineto
+ 0 -142 -7 -194 -74 -141 rrcurveto
+ 8 -3 13 -7 5 -6 rrcurveto
+ 75 143 10 205 0 145 rrcurveto
+ 0 316 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid18480" fdSelectIndex="1">
+ 1000 -71 30 427 30 153 30 33 111 -30 30 -30 126 hstemhm
+ 159 30 -19 19 126 30 -6 30 281 30 160 30 18 31 hintmask 1110100101110000
+ 58 743 rmoveto
+ 0 -30 rlineto
+ 887 0 rlineto
+ 0 30 rlineto
+ hintmask 0000010010000000
+ -630 96 rmoveto
+ hintmask 0001000010000000
+ 0 -207 rlineto
+ 30 0 rlineto
+ hintmask 0000010010100000
+ 0 207 rlineto
+ 305 0 rmoveto
+ hintmask 0001000000100000
+ 0 -207 rlineto
+ 30 0 rlineto
+ hintmask 0010011000100000
+ 0 207 rlineto
+ -521 -240 rmoveto
+ 0 -206 rlineto
+ 0 -137 -15 -184 -109 -136 rrcurveto
+ 7 -3 12 -9 5 -6 rrcurveto
+ hintmask 1110000101010000
+ 112 139 18 194 0 141 rrcurveto
+ 0 207 rlineto
+ -19 0 rmoveto
+ 0 -30 rlineto
+ 670 0 rlineto
+ 0 -153 rlineto
+ -670 0 rlineto
+ 0 -30 rlineto
+ 700 0 rlineto
+ 0 213 rlineto
+ -531 -249 rmoveto
+ 0 -343 rlineto
+ 0 -66 31 -12 105 0 rrcurveto
+ 23 0 278 0 24 0 rrcurveto
+ hintmask 1000000001001000
+ 96 0 15 31 8 123 rrcurveto
+ -9 3 -13 4 -9 7 rrcurveto
+ -6 -117 -11 -21 -69 0 rrcurveto
+ -56 0 -236 0 -41 0 rrcurveto
+ -84 0 -16 11 0 37 rrcurveto
+ 0 343 rlineto
+ 444 -47 rmoveto
+ -101 -52 -195 -56 -169 -40 rrcurveto
+ 4 -7 5 -10 3 -7 rrcurveto
+ 172 40 193 54 120 56 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid22370" fdSelectIndex="1">
+ 1000 64 30 77 30 76 30 74 30 72 30 109 30 25 84 -30 30 -30 108 hstemhm
+ 135 30 21 30 102 30 14 30 205 30 17 30 113 30 19 30 hintmask 111111010011001100000000
+ 53 761 rmoveto
+ 0 -30 rlineto
+ 896 0 rlineto
+ 0 30 rlineto
+ hintmask 000000001001000000000000
+ -631 78 rmoveto
+ hintmask 000000100001000000000000
+ 0 -162 rlineto
+ 30 0 rlineto
+ hintmask 000000001001001000000000
+ 0 162 rlineto
+ 296 0 rmoveto
+ hintmask 000000100000001000000000
+ 0 -162 rlineto
+ 30 0 rlineto
+ hintmask 000000001000001000000000
+ 0 162 rlineto
+ hintmask 000011000100110010000000
+ -47 -217 rmoveto
+ 209 0 rlineto
+ 0 -109 rlineto
+ -209 0 rlineto
+ -235 109 rmoveto
+ 205 0 rlineto
+ 0 -109 rlineto
+ -205 0 rlineto
+ -227 109 rmoveto
+ 197 0 rlineto
+ 0 -109 rlineto
+ -197 0 rlineto
+ -30 139 rmoveto
+ 0 -169 rlineto
+ 731 0 rlineto
+ 0 169 rlineto
+ hintmask 111100000010000100000000
+ -650 -375 rmoveto
+ 571 0 rlineto
+ 0 -76 rlineto
+ -571 0 rlineto
+ 0 -30 rmoveto
+ 571 0 rlineto
+ 0 -77 rlineto
+ -571 0 rlineto
+ 0 287 rmoveto
+ 571 0 rlineto
+ 0 -74 rlineto
+ -571 0 rlineto
+ -30 104 rmoveto
+ 0 -347 rlineto
+ 631 0 rlineto
+ 0 347 rlineto
+ -216 -389 rmoveto
+ 127 -34 121 -39 72 -31 rrcurveto
+ 31 22 rlineto
+ -78 32 -126 39 -121 31 rrcurveto
+ -258 -1 rmoveto
+ -81 -39 -128 -36 -107 -23 rrcurveto
+ 8 -6 12 -12 5 -6 rrcurveto
+ 103 25 130 41 86 43 rrcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid00001" width="231" lsb="0"/>
+ <mtx name="cid00002" width="222" lsb="74"/>
+ <mtx name="cid01177" width="1000" lsb="48"/>
+ <mtx name="cid06449" width="1000" lsb="52"/>
+ <mtx name="cid06821" width="1000" lsb="34"/>
+ <mtx name="cid07253" width="1000" lsb="36"/>
+ <mtx name="cid13393" width="1000" lsb="82"/>
+ <mtx name="cid17290" width="1000" lsb="14"/>
+ <mtx name="cid17852" width="1000" lsb="30"/>
+ <mtx name="cid18480" width="1000" lsb="35"/>
+ <mtx name="cid22370" width="1000" lsb="53"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid00001" height="1000" tsb="880"/>
+ <mtx name="cid00002" height="1000" tsb="125"/>
+ <mtx name="cid01177" height="1000" tsb="40"/>
+ <mtx name="cid06449" height="1000" tsb="41"/>
+ <mtx name="cid06821" height="1000" tsb="40"/>
+ <mtx name="cid07253" height="1000" tsb="41"/>
+ <mtx name="cid13393" height="1000" tsb="39"/>
+ <mtx name="cid17290" height="1000" tsb="49"/>
+ <mtx name="cid17852" height="1000" tsb="40"/>
+ <mtx name="cid18480" height="1000" tsb="41"/>
+ <mtx name="cid22370" height="1000" tsb="41"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w1000.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w1000.00.ttx
new file mode 100644
index 00000000..e527d075
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w1000.00.ttx
@@ -0,0 +1,1266 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid00001"/>
+ <GlyphID id="2" name="cid00002"/>
+ <GlyphID id="3" name="cid01177"/>
+ <GlyphID id="4" name="cid06449"/>
+ <GlyphID id="5" name="cid06821"/>
+ <GlyphID id="6" name="cid07253"/>
+ <GlyphID id="7" name="cid13393"/>
+ <GlyphID id="8" name="cid17290"/>
+ <GlyphID id="9" name="cid17852"/>
+ <GlyphID id="10" name="cid18480"/>
+ <GlyphID id="11" name="cid22370"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0xc54fcf7b"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:08:26 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="8"/>
+ <yMin value="-120"/>
+ <xMax value="995"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="8"/>
+ <minRightSideBearing value="5"/>
+ <xMaxExtent value="995"/>
+ <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>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="12"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="979"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000011"/>
+ <ulUnicodeRange2 value="00101000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="0"/>
+ <usLastCharIndex value="63964"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w1000.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w1000.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w1000.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w1000.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x0" name="cid00001"/><!-- ???? -->
+ <map code="0x1" name="cid00001"/><!-- ???? -->
+ <map code="0x2" name="cid00001"/><!-- ???? -->
+ <map code="0x3" name="cid00001"/><!-- ???? -->
+ <map code="0x4" name="cid00001"/><!-- ???? -->
+ <map code="0x5" name="cid00001"/><!-- ???? -->
+ <map code="0x6" name="cid00001"/><!-- ???? -->
+ <map code="0x7" name="cid00001"/><!-- ???? -->
+ <map code="0x8" name="cid00001"/><!-- ???? -->
+ <map code="0x9" name="cid00001"/><!-- ???? -->
+ <map code="0xa" name="cid00001"/><!-- ???? -->
+ <map code="0xb" name="cid00001"/><!-- ???? -->
+ <map code="0xc" name="cid00001"/><!-- ???? -->
+ <map code="0xd" name="cid00001"/><!-- ???? -->
+ <map code="0xe" name="cid00001"/><!-- ???? -->
+ <map code="0xf" name="cid00001"/><!-- ???? -->
+ <map code="0x10" name="cid00001"/><!-- ???? -->
+ <map code="0x11" name="cid00001"/><!-- ???? -->
+ <map code="0x12" name="cid00001"/><!-- ???? -->
+ <map code="0x13" name="cid00001"/><!-- ???? -->
+ <map code="0x14" name="cid00001"/><!-- ???? -->
+ <map code="0x15" name="cid00001"/><!-- ???? -->
+ <map code="0x16" name="cid00001"/><!-- ???? -->
+ <map code="0x17" name="cid00001"/><!-- ???? -->
+ <map code="0x18" name="cid00001"/><!-- ???? -->
+ <map code="0x19" name="cid00001"/><!-- ???? -->
+ <map code="0x1a" name="cid00001"/><!-- ???? -->
+ <map code="0x1b" name="cid00001"/><!-- ???? -->
+ <map code="0x1c" name="cid00001"/><!-- ???? -->
+ <map code="0x1d" name="cid00001"/><!-- ???? -->
+ <map code="0x1e" name="cid00001"/><!-- ???? -->
+ <map code="0x1f" name="cid00001"/><!-- ???? -->
+ <map code="0x20" name="cid00001"/><!-- SPACE -->
+ <map code="0x21" name="cid00002"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="cid00001"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="532" language="0" nGroups="43">
+ <map code="0x0" name="cid00001"/><!-- ???? -->
+ <map code="0x1" name="cid00001"/><!-- ???? -->
+ <map code="0x2" name="cid00001"/><!-- ???? -->
+ <map code="0x3" name="cid00001"/><!-- ???? -->
+ <map code="0x4" name="cid00001"/><!-- ???? -->
+ <map code="0x5" name="cid00001"/><!-- ???? -->
+ <map code="0x6" name="cid00001"/><!-- ???? -->
+ <map code="0x7" name="cid00001"/><!-- ???? -->
+ <map code="0x8" name="cid00001"/><!-- ???? -->
+ <map code="0x9" name="cid00001"/><!-- ???? -->
+ <map code="0xa" name="cid00001"/><!-- ???? -->
+ <map code="0xb" name="cid00001"/><!-- ???? -->
+ <map code="0xc" name="cid00001"/><!-- ???? -->
+ <map code="0xd" name="cid00001"/><!-- ???? -->
+ <map code="0xe" name="cid00001"/><!-- ???? -->
+ <map code="0xf" name="cid00001"/><!-- ???? -->
+ <map code="0x10" name="cid00001"/><!-- ???? -->
+ <map code="0x11" name="cid00001"/><!-- ???? -->
+ <map code="0x12" name="cid00001"/><!-- ???? -->
+ <map code="0x13" name="cid00001"/><!-- ???? -->
+ <map code="0x14" name="cid00001"/><!-- ???? -->
+ <map code="0x15" name="cid00001"/><!-- ???? -->
+ <map code="0x16" name="cid00001"/><!-- ???? -->
+ <map code="0x17" name="cid00001"/><!-- ???? -->
+ <map code="0x18" name="cid00001"/><!-- ???? -->
+ <map code="0x19" name="cid00001"/><!-- ???? -->
+ <map code="0x1a" name="cid00001"/><!-- ???? -->
+ <map code="0x1b" name="cid00001"/><!-- ???? -->
+ <map code="0x1c" name="cid00001"/><!-- ???? -->
+ <map code="0x1d" name="cid00001"/><!-- ???? -->
+ <map code="0x1e" name="cid00001"/><!-- ???? -->
+ <map code="0x1f" name="cid00001"/><!-- ???? -->
+ <map code="0x20" name="cid00001"/><!-- SPACE -->
+ <map code="0x21" name="cid00002"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="cid00001"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ <cmap_format_14 platformID="0" platEncID="5">
+ <map uv="0x9686" uvs="0xfe00" name="cid13393"/>
+ <map uv="0x9686" uvs="0xe0101" name="cid13393"/>
+ </cmap_format_14>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x0" name="cid00001"/><!-- ???? -->
+ <map code="0x1" name="cid00001"/><!-- ???? -->
+ <map code="0x2" name="cid00001"/><!-- ???? -->
+ <map code="0x3" name="cid00001"/><!-- ???? -->
+ <map code="0x4" name="cid00001"/><!-- ???? -->
+ <map code="0x5" name="cid00001"/><!-- ???? -->
+ <map code="0x6" name="cid00001"/><!-- ???? -->
+ <map code="0x7" name="cid00001"/><!-- ???? -->
+ <map code="0x8" name="cid00001"/><!-- ???? -->
+ <map code="0x9" name="cid00001"/><!-- ???? -->
+ <map code="0xa" name="cid00001"/><!-- ???? -->
+ <map code="0xb" name="cid00001"/><!-- ???? -->
+ <map code="0xc" name="cid00001"/><!-- ???? -->
+ <map code="0xd" name="cid00001"/><!-- ???? -->
+ <map code="0xe" name="cid00001"/><!-- ???? -->
+ <map code="0xf" name="cid00001"/><!-- ???? -->
+ <map code="0x10" name="cid00001"/><!-- ???? -->
+ <map code="0x11" name="cid00001"/><!-- ???? -->
+ <map code="0x12" name="cid00001"/><!-- ???? -->
+ <map code="0x13" name="cid00001"/><!-- ???? -->
+ <map code="0x14" name="cid00001"/><!-- ???? -->
+ <map code="0x15" name="cid00001"/><!-- ???? -->
+ <map code="0x16" name="cid00001"/><!-- ???? -->
+ <map code="0x17" name="cid00001"/><!-- ???? -->
+ <map code="0x18" name="cid00001"/><!-- ???? -->
+ <map code="0x19" name="cid00001"/><!-- ???? -->
+ <map code="0x1a" name="cid00001"/><!-- ???? -->
+ <map code="0x1b" name="cid00001"/><!-- ???? -->
+ <map code="0x1c" name="cid00001"/><!-- ???? -->
+ <map code="0x1d" name="cid00001"/><!-- ???? -->
+ <map code="0x1e" name="cid00001"/><!-- ???? -->
+ <map code="0x1f" name="cid00001"/><!-- ???? -->
+ <map code="0x20" name="cid00001"/><!-- SPACE -->
+ <map code="0x21" name="cid00002"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="cid00001"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="532" language="0" nGroups="43">
+ <map code="0x0" name="cid00001"/><!-- ???? -->
+ <map code="0x1" name="cid00001"/><!-- ???? -->
+ <map code="0x2" name="cid00001"/><!-- ???? -->
+ <map code="0x3" name="cid00001"/><!-- ???? -->
+ <map code="0x4" name="cid00001"/><!-- ???? -->
+ <map code="0x5" name="cid00001"/><!-- ???? -->
+ <map code="0x6" name="cid00001"/><!-- ???? -->
+ <map code="0x7" name="cid00001"/><!-- ???? -->
+ <map code="0x8" name="cid00001"/><!-- ???? -->
+ <map code="0x9" name="cid00001"/><!-- ???? -->
+ <map code="0xa" name="cid00001"/><!-- ???? -->
+ <map code="0xb" name="cid00001"/><!-- ???? -->
+ <map code="0xc" name="cid00001"/><!-- ???? -->
+ <map code="0xd" name="cid00001"/><!-- ???? -->
+ <map code="0xe" name="cid00001"/><!-- ???? -->
+ <map code="0xf" name="cid00001"/><!-- ???? -->
+ <map code="0x10" name="cid00001"/><!-- ???? -->
+ <map code="0x11" name="cid00001"/><!-- ???? -->
+ <map code="0x12" name="cid00001"/><!-- ???? -->
+ <map code="0x13" name="cid00001"/><!-- ???? -->
+ <map code="0x14" name="cid00001"/><!-- ???? -->
+ <map code="0x15" name="cid00001"/><!-- ???? -->
+ <map code="0x16" name="cid00001"/><!-- ???? -->
+ <map code="0x17" name="cid00001"/><!-- ???? -->
+ <map code="0x18" name="cid00001"/><!-- ???? -->
+ <map code="0x19" name="cid00001"/><!-- ???? -->
+ <map code="0x1a" name="cid00001"/><!-- ???? -->
+ <map code="0x1b" name="cid00001"/><!-- ???? -->
+ <map code="0x1c" name="cid00001"/><!-- ???? -->
+ <map code="0x1d" name="cid00001"/><!-- ???? -->
+ <map code="0x1e" name="cid00001"/><!-- ???? -->
+ <map code="0x1f" name="cid00001"/><!-- ???? -->
+ <map code="0x20" name="cid00001"/><!-- SPACE -->
+ <map code="0x21" name="cid00002"/><!-- EXCLAMATION MARK -->
+ <map code="0xa0" name="cid00001"/><!-- NO-BREAK SPACE -->
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w1000.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w1000.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="8 -120 995 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w1000.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w1000.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ <FontDict index="2">
+ <FontName value="MasterSet_Kanji-w1000.00-Proportional"/>
+ <Private>
+ <BlueValues value="0 0"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="683"/>
+ <nominalWidthX value="614"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid00001" fdSelectIndex="2">
+ -405 endchar
+ </CharString>
+ <CharString name="cid00002" fdSelectIndex="2">
+ -316 -11 209 hstemhm
+ 48 202 -182 161.5 hintmask 10100000
+ 241 773 rmoveto
+ -185 0 rlineto
+ 24 -515 rlineto
+ 138 0 rlineto
+ hintmask 11000000
+ -69 -269 rmoveto
+ 62 0 39 44 0 60 rrcurveto
+ 0 62 -42 43 -59 0 rrcurveto
+ -57 0 -44 -43 0 -62 rrcurveto
+ 0 -58 40 -46 61 0 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid01177" fdSelectIndex="1">
+ 1000 -84 115 161 86 31 81 30 86 34 111 50 108 -111 157 -126 80 hstemhm
+ 165 137 -23 141 6 146 59 122 -49 144 hintmask 1111100011111000
+ 279 152 rmoveto
+ 0 -92 rlineto
+ 0 -109 33 -35 141 0 rrcurveto
+ 28 0 89 0 30 0 rrcurveto
+ 101 0 37 29 15 113 rrcurveto
+ -37 7 -57 19 -28 19 rrcurveto
+ -5 -62 -6 -10 -34 0 rrcurveto
+ -25 0 -71 0 -19 0 rrcurveto
+ -43 0 -8 3 0 28 rrcurveto
+ 0 90 rlineto
+ -43 -2 rmoveto
+ 55 -23 70 -40 33 -28 rrcurveto
+ 88 89 rlineto
+ -38 28 -72 36 -54 19 rrcurveto
+ 251 -110 rmoveto
+ 58 -57 64 -81 26 -54 rrcurveto
+ 121 69 rlineto
+ -30 57 -68 75 -58 53 rrcurveto
+ -678 -14 rmoveto
+ -22 -67 -45 -63 -59 -39 rrcurveto
+ 113 -77 rlineto
+ 69 49 39 75 27 78 rrcurveto
+ -153 684 rmoveto
+ 0 -111 rlineto
+ 770 0 rlineto
+ 0 111 rlineto
+ -820 -158 rmoveto
+ 0 -111 rlineto
+ 874 0 rlineto
+ 0 111 rlineto
+ hintmask 0000001000100000
+ -512 204 rmoveto
+ hintmask 0000000100100000
+ 0 -126 rlineto
+ 146 0 rlineto
+ hintmask 0000001000100000
+ 0 126 rlineto
+ hintmask 0111010010001000
+ -322 -154 rmoveto
+ 9 -25 10 -34 3 -21 rrcurveto
+ 138 30 rlineto
+ -5 20 -11 32 -11 23 rrcurveto
+ 232 0 rmoveto
+ -5 -21 -13 -29 -9 -24 rrcurveto
+ 128 -26 rlineto
+ 12 18 17 23 22 32 rrcurveto
+ -465 -390 rmoveto
+ 402 0 rlineto
+ 0 -31 rlineto
+ -402 0 rlineto
+ 0 142 rmoveto
+ 402 0 rlineto
+ 0 -30 rlineto
+ -402 0 rlineto
+ -137 116 rmoveto
+ 0 -314 rlineto
+ 683 0 rlineto
+ 0 314 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid06449" fdSelectIndex="1">
+ 1000 -86 106 92 77 -23 23 30 20 -20 22.5 -22.5 90 -56 56 21 95 21 90 28 90 -6 148 -116 116 -116 175 hstemhm
+ 61 129 -50 128 -7 144 -59 114 -55 40 89 131 -127 114 -60 145 -4 135 -60 136 -95 112 hintmask 110001011101011101101101
+ 50 796 rmoveto
+ 0 -116 rlineto
+ 901 0 rlineto
+ 0 116 rlineto
+ -800 -487 rmoveto
+ 0 -90 rlineto
+ 707 0 rlineto
+ 0 90 rlineto
+ hintmask 000000000000100100000000
+ -597 546 rmoveto
+ hintmask 000000000010000100000000
+ 0 -207 rlineto
+ 144 0 rlineto
+ hintmask 000000000000100100001000
+ 0 207 rlineto
+ 187 0 rmoveto
+ hintmask 000000000010000000001000
+ 0 -207 rlineto
+ 145 0 rlineto
+ hintmask 000000000000100000001000
+ 0 207 rlineto
+ hintmask 000000111100011010010100
+ -85 -291 rmoveto
+ 81 0 rlineto
+ 0 -28 rlineto
+ -81 0 rlineto
+ -192 28 rmoveto
+ 78 0 rlineto
+ 0 -28 rlineto
+ -78 0 rlineto
+ -192 28 rmoveto
+ 78 0 rlineto
+ 0 -28 rlineto
+ -78 0 rlineto
+ -128 118 rmoveto
+ 0 -208 rlineto
+ 728 0 rlineto
+ 0 208 rlineto
+ -807 -229 rmoveto
+ 0 -172 rlineto
+ 129 0 rlineto
+ 0 77 rlineto
+ hintmask 000000110000000000000010
+ 618 0 rlineto
+ 0 -77 rlineto
+ 136 0 rlineto
+ 0 172 rlineto
+ hintmask 000010000000000100000000
+ -673 -173 rmoveto
+ -39 -47 -72 -41 -108 -29 rrcurveto
+ 22 -16 31 -39 14 -25 rrcurveto
+ hintmask 010000000000000001000000
+ 124 44 81 54 57 78 rrcurveto
+ 24 -42 rmoveto
+ 0 -13 rlineto
+ -48 -105 -135 -52 -170 -18 rrcurveto
+ 20 -24 24 -45 9 -29 rrcurveto
+ hintmask 001000000000000001000000
+ 197 32 152 70 67 161 rrcurveto
+ hintmask 110100000000000001100001
+ -72 26 rlineto
+ -21 -3 rlineto
+ -248 -133 rmoveto
+ 25 -16 33 -29 17 -20 rrcurveto
+ 82 54 rlineto
+ -18 18 -32 25 -28 15 rrcurveto
+ 10 86 rmoveto
+ -77 -77 rlineto
+ 253 0 rlineto
+ 0 77 rlineto
+ 89 50 rmoveto
+ 0 -186 rlineto
+ 0 -106 30 -33 126 0 rrcurveto
+ 25 0 81 0 27 0 rrcurveto
+ 90 0 34 28 14 99 rrcurveto
+ -35 7 -51 18 -26 17 rrcurveto
+ -4 -53 -7 -10 -29 0 rrcurveto
+ -20 0 -65 0 -16 0 rrcurveto
+ -37 0 -6 4 0 30 rrcurveto
+ 0 185 rlineto
+ 150 -26 rmoveto
+ -55 -24 -92 -21 -84 -13 rrcurveto
+ 13 -23 15 -40 6 -24 rrcurveto
+ 93 11 112 20 85 32 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid06821" fdSelectIndex="1">
+ 1000 -82 111 26 82 31 59 -59 78 31 79 -7 124 -124 84 74 46 -46 69 -47 47 23 56 -56 97 -16 95 -95 173 hstemhm
+ 100 131 -63 63 93 115 -91 91 -91 121 -86 56 -11 147 -73 73 -50 130 64 150 14 101 hintmask 00011000000000000000000100000000
+ 286 277 rmoveto
+ 433 0 rlineto
+ 0 -31 rlineto
+ -433 0 rlineto
+ -140 110 rmoveto
+ 0 -188 rlineto
+ 723 0 rlineto
+ 0 188 rlineto
+ hintmask 00100000000000000000100000000000
+ -441 -129 rmoveto
+ 0 -248 rlineto
+ 147 -32 rlineto
+ 0 280 rlineto
+ hintmask 01000000000010010000010000000000
+ -73 -90 rmoveto
+ 0 -82 rlineto
+ 370 0 rlineto
+ 0 82 rlineto
+ -704 638 rmoveto
+ 0 -95 rlineto
+ 784 0 rlineto
+ 0 95 rlineto
+ hintmask 00000000000010100000000000000000
+ -852 0 rmoveto
+ 0 -116 rlineto
+ 0 -74 -7 -95 -76 -71 rrcurveto
+ 28 -16 57 -47 20 -24 rrcurveto
+ 90 85 19 137 0 103 rrcurveto
+ 0 118 rlineto
+ hintmask 00000000010100001000000000000000
+ 93 -79 rmoveto
+ 0 -167 rlineto
+ hintmask 00000000010100000100000000000000
+ 115 0 rlineto
+ 0 167 rlineto
+ hintmask 00000000101000000001000000000000
+ -56 -41 rmoveto
+ 0 -56 rlineto
+ 176 0 rlineto
+ 0 56 rlineto
+ -343 -79 rmoveto
+ 0 -69 rlineto
+ 383 0 rlineto
+ 0 69 rlineto
+ hintmask 00000011000000000100000000000000
+ -251 -23 rmoveto
+ 0 -109 rlineto
+ 0 -8 -3 -3 -8 0 rrcurveto
+ -7 0 -20 0 -17 1 rrcurveto
+ 13 -22 19 -35 8 -28 rrcurveto
+ hintmask 00000011000001000010001000000000
+ 39 0 32 0 29 14 rrcurveto
+ 29 14 7 17 0 46 rrcurveto
+ 0 113 rlineto
+ -220 -49 rmoveto
+ -13 -34 -24 -34 -31 -26 rrcurveto
+ 21 -12 35 -24 17 -14 rrcurveto
+ 33 30 31 47 18 46 rrcurveto
+ 123 -9 rmoveto
+ 24 -30 24 -42 9 -28 rrcurveto
+ 79 30 rlineto
+ -10 28 -26 41 -25 29 rrcurveto
+ -9 351 rmoveto
+ hintmask 10000101000001000000001010000000
+ 22 -272 141 -231 154 -1 rrcurveto
+ 83 0 41 26 18 132 rrcurveto
+ -32 10 -43 23 -26 24 rrcurveto
+ -5 -66 -8 -25 -20 0 rrcurveto
+ -70 0 -109 184 -16 196 rrcurveto
+ 122 -178 rmoveto
+ -42 -96 -82 -86 -94 -52 rrcurveto
+ 27 -19 46 -42 20 -23 rrcurveto
+ 96 64 93 105 54 117 rrcurveto
+ -205 150 rmoveto
+ 49 -16 64 -28 32 -21 rrcurveto
+ 63 74 rlineto
+ -35 21 -65 25 -48 12 rrcurveto
+ -451 -736 rmoveto
+ -96 -33 rlineto
+ 77 -146 117 -27 215 0 rrcurveto
+ 234 0 rlineto
+ 68 0 rlineto
+ 5 33 18 52 16 26 rrcurveto
+ -72 -3 -209 0 -54 0 rrcurveto
+ -159 1 -110 10 -50 87 rrcurveto
+ -109 40 rmoveto
+ -18 -82 -58 -57 -91 -34 rrcurveto
+ 30 -21 53 -48 22 -25 rrcurveto
+ 100 50 72 81 30 120 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid07253" fdSelectIndex="1">
+ 1000 -94 86 19 87 -85 85 -84 84 -69 69 -35 35 -33 33 22 49 22 49 21 45 -45 63 23 90 -60 60 24 21 -21 67 -56 56 23 64 23 67 -30 147 -92 92 -92 125 hstemhm
+ 153 132 -81 136 -44 44 -42 107 37 128 22 143 -26 139 -68 46 hintmask 10000011101100101101000101110000
+ 58 822 rmoveto
+ 0 -92 rlineto
+ 883 0 rlineto
+ 0 92 rlineto
+ hintmask 00000000000000000000100000000000
+ -677 33 rmoveto
+ hintmask 00000000000000000010000000000000
+ 0 -180 rlineto
+ 141 0 rlineto
+ hintmask 00000000000000000000100000100000
+ 0 180 rlineto
+ 187 0 rmoveto
+ hintmask 00000000000000000010000000100000
+ 0 -180 rlineto
+ 143 0 rlineto
+ hintmask 00000000000100101100110000110000
+ 0 180 rlineto
+ -450 -304 rmoveto
+ 424 0 rlineto
+ 0 -23 rlineto
+ -424 0 rlineto
+ 0 110 rmoveto
+ 424 0 rlineto
+ 0 -23 rlineto
+ -424 0 rlineto
+ -132 90 rmoveto
+ 0 -244 rlineto
+ 695 0 rlineto
+ 0 244 rlineto
+ -807 -268 rmoveto
+ 0 -90 rlineto
+ 919 0 rlineto
+ 0 90 rlineto
+ hintmask 00000001100000000000000100000000
+ -664 -197 rmoveto
+ 0 -49 rlineto
+ 469 0 rlineto
+ 0 49 rlineto
+ -469 -71 rmoveto
+ 0 -49 rlineto
+ 482 0 rlineto
+ 0 49 rlineto
+ hintmask 00000010000000000000001000000000
+ -574 -71 rmoveto
+ hintmask 00001000000000000000001000001000
+ 0 -69 rlineto
+ 622 0 rlineto
+ hintmask 00000010000001000000000000001000
+ 0 69 rlineto
+ -511 394 rmoveto
+ -38 -100 -88 -88 -172 -56 rrcurveto
+ 25 -21 36 -48 13 -31 rrcurveto
+ hintmask 00000100010010010000000001000000
+ 192 75 103 107 59 142 rrcurveto
+ 263 -61 rmoveto
+ -104 -34 rlineto
+ 65 -100 107 -78 129 -36 rrcurveto
+ 18 33 37 49 28 25 rrcurveto
+ -120 23 -106 51 -54 67 rrcurveto
+ -266 -105 rmoveto
+ 0 -243 rlineto
+ 128 0 rlineto
+ 0 243 rlineto
+ hintmask 10000010000000000000000000001000
+ 210 -208 rmoveto
+ 0 -12 rlineto
+ -5 -52 -8 -25 -9 -9 rrcurveto
+ -6 -7 -6 -1 -9 0 rrcurveto
+ -10 0 -16 1 -21 2 rrcurveto
+ 13 -24 11 -39 1 -28 rrcurveto
+ 37 -1 33 1 19 2 rrcurveto
+ 21 2 21 7 17 17 rrcurveto
+ 20 19 11 39 9 68 rrcurveto
+ 2 15 2 25 0 0 rrcurveto
+ -742 -45 rmoveto
+ -15 -36 -32 -39 -39 -23 rrcurveto
+ 101 -56 rlineto
+ hintmask 10010000000000000000000000000000
+ 45 29 26 41 18 45 rrcurveto
+ hintmask 00100000000000000000000010000000
+ 14 -1 rmoveto
+ 9 -33 7 -45 -1 -28 rrcurveto
+ 107 17 rlineto
+ -1 27 -9 44 -11 32 rrcurveto
+ hintmask 01000000000000000000000000100000
+ 33 -16 rmoveto
+ 22 -29 21 -41 8 -27 rrcurveto
+ 97 32 rlineto
+ -10 27 -22 38 -24 26 rrcurveto
+ hintmask 00010000001000000000001000000000
+ 52 -29 rmoveto
+ 24 -21 27 -32 11 -21 rrcurveto
+ 84 42 rlineto
+ -13 22 -29 29 -25 20 rrcurveto
+ -325 277 rmoveto
+ -63 -63 rlineto
+ 437 0 rlineto
+ 0 63 rlineto
+ -485 -44 rmoveto
+ hintmask 00000010000000000000001000000000
+ 0 -215 rlineto
+ hintmask 00000010001000000000000100000000
+ 136 0 rlineto
+ 0 261 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid13393" fdSelectIndex="1">
+ 1000 -76 112 -29 29 34 99 -55 124 -35 101 -101 173 -19 98 231 103 -41 41 -26 49 hstemhm
+ 66 126 61 127 -122 44 305 135 60 40 hintmask 1010101101110110
+ 558 789 rmoveto
+ 0 -103 rlineto
+ 284 0 rlineto
+ 0 103 rlineto
+ -379 -485 rmoveto
+ 0 -101 rlineto
+ 469 0 rlineto
+ 0 101 rlineto
+ -428 151 rmoveto
+ 0 -98 rlineto
+ 343 0 rlineto
+ 0 98 rlineto
+ -472 -419 rmoveto
+ 0 -112 rlineto
+ 590 0 rlineto
+ 0 112 rlineto
+ -512 133 rmoveto
+ 0 -99 rlineto
+ 455 0 rlineto
+ 0 99 rlineto
+ -106 620 rmoveto
+ 0 -19 rlineto
+ -68 -125 -188 -94 -197 -38 rrcurveto
+ 25 -27 30 -51 14 -32 rrcurveto
+ hintmask 0000000010000010
+ 218 54 203 108 96 183 rrcurveto
+ hintmask 0100010100000110
+ -87 46 rlineto
+ -21 -5 rlineto
+ -254 -64 rmoveto
+ -111 -39 rlineto
+ 97 -139 155 -90 200 -39 rrcurveto
+ 17 34 36 52 28 26 rrcurveto
+ -189 27 -156 68 -77 100 rrcurveto
+ 1 133 rmoveto
+ -38 -72 -71 -75 -109 -55 rrcurveto
+ 28 -19 42 -46 19 -30 rrcurveto
+ 125 75 80 90 60 107 rrcurveto
+ -266 -459 rmoveto
+ -19 -59 -35 -61 -44 -40 rrcurveto
+ 28 -15 48 -31 23 -19 rrcurveto
+ 45 47 45 76 25 74 rrcurveto
+ 47 30 rmoveto
+ 0 -369 rlineto
+ 135 0 rlineto
+ 0 369 rlineto
+ hintmask 0000000000101000
+ -676 436 rmoveto
+ 0 -908 rlineto
+ 126 0 rlineto
+ 0 779 rlineto
+ 110 0 rlineto
+ 0 129 rlineto
+ -44 0 rmoveto
+ 0 -43 rlineto
+ -11 -62 -29 -153 -24 -90 rrcurveto
+ hintmask 0001000000010000
+ 49 -63 10 -61 0 -42 rrcurveto
+ 0 -29 -5 -17 -10 -8 rrcurveto
+ -7 -5 -10 -3 -9 0 rrcurveto
+ -11 0 -10 0 -15 2 rrcurveto
+ 20 -35 10 -54 1 -35 rrcurveto
+ 24 -1 23 1 17 2 rrcurveto
+ 23 4 20 7 17 13 rrcurveto
+ 34 24 15 43 0 71 rrcurveto
+ 0 57 -10 68 -56 76 rrcurveto
+ hintmask 0000000001001000
+ 26 79 32 115 25 90 rrcurveto
+ hintmask 0000000000001000
+ -95 54 rlineto
+ -20 -5 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid17290" fdSelectIndex="1">
+ 1000 92 122 -43 43 65 120 -120 198 -24 99 55 92 32 91 hstemhm
+ 118 138 72 115 -64 64 0 133 -67 107 -76 99 -99 222 -115 115 -64 64 69 109 -74 99 hintmask 011011111011001010000000
+ 328 822 rmoveto
+ 0 -240 rlineto
+ 0 -100 26 -29 92 0 rrcurveto
+ hintmask 000010000000100000000000
+ 19 0 44 0 20 0 rrcurveto
+ 68 0 30 25 12 85 rrcurveto
+ hintmask 101010101000010000000000
+ -31 7 -46 16 -22 17 rrcurveto
+ -3 -43 -4 -8 -17 0 rrcurveto
+ -10 0 -32 0 -8 0 rrcurveto
+ -20 0 -3 3 0 28 rrcurveto
+ 0 239 rlineto
+ -115 -423 rmoveto
+ 0 -120 rlineto
+ 622 0 rlineto
+ 0 120 rlineto
+ -649 -185 rmoveto
+ 0 -122 rlineto
+ 671 0 rlineto
+ 0 122 rlineto
+ hintmask 010101100111001000000000
+ -529 263 rmoveto
+ 0 -306 rlineto
+ 133 0 rlineto
+ 0 306 rlineto
+ 116 -1 rmoveto
+ 0 -306 rlineto
+ 134 0 rlineto
+ 0 306 rlineto
+ -447 346 rmoveto
+ 0 -91 rlineto
+ 130 0 rlineto
+ 0 -32 rlineto
+ -130 0 rlineto
+ 0 -92 rlineto
+ 237 0 rlineto
+ 0 215 rlineto
+ 31 0 rmoveto
+ hintmask 000010100000001001000000
+ 0 -240 rlineto
+ 0 -100 26 -29 93 0 rrcurveto
+ 20 0 47 0 21 0 rrcurveto
+ 69 0 30 26 12 88 rrcurveto
+ -31 7 -46 16 -22 17 rrcurveto
+ -3 -46 -5 -9 -17 0 rrcurveto
+ -11 0 -35 0 -9 0 rrcurveto
+ -21 0 -3 3 0 29 rrcurveto
+ 0 238 rlineto
+ hintmask 000001110000000110000000
+ -64 0 rmoveto
+ 0 -91 rlineto
+ 133 0 rlineto
+ 0 -32 rlineto
+ -133 0 rlineto
+ 0 -92 rlineto
+ 242 0 rlineto
+ 0 215 rlineto
+ -456 -735 rmoveto
+ -41 -39 -82 -31 -84 -18 rrcurveto
+ 30 -23 50 -49 23 -27 rrcurveto
+ 87 30 96 52 55 63 rrcurveto
+ 46 -15 rmoveto
+ 66 -33 83 -52 39 -35 rrcurveto
+ 122 71 rlineto
+ -47 37 -86 49 -64 28 rrcurveto
+ -580 760 rmoveto
+ -41 -142 -71 -142 -77 -91 rrcurveto
+ 22 -39 35 -85 11 -36 rrcurveto
+ 104 122 94 197 57 176 rrcurveto
+ -213 -251 rmoveto
+ 0 -658 rlineto
+ 138 0 rlineto
+ 0 790 rlineto
+ -4 2 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid17852" fdSelectIndex="1">
+ 1000 -89 107 113 107 62 111 -17 17 70 111 -111 183 -133 130 -125 125 -5 120 -120 199 -153 74 hstemhm
+ 37 238 -133 133 -133 202 14 128 -59 59 -40 40 13 118 -68 68 -11 136 -29 120 7 121 -76 103 hintmask 000000100001000000000000
+ 37 661 rmoveto
+ 0 -130 rlineto
+ hintmask 000000100000010000000000
+ 307 0 rlineto
+ 0 130 rlineto
+ hintmask 000000010010100100000000
+ -202 194 rmoveto
+ 0 -950 rlineto
+ 133 0 rlineto
+ 0 950 rlineto
+ -127 -291 rmoveto
+ -21 -118 -53 -156 -61 -93 rrcurveto
+ 21 -35 31 -55 13 -40 rrcurveto
+ 72 111 54 200 29 158 rrcurveto
+ 36 -15 rmoveto
+ -59 -73 rlineto
+ 27 -50 51 -103 24 -62 rrcurveto
+ 72 129 rlineto
+ -16 23 -78 112 -21 24 rrcurveto
+ 158 255 rmoveto
+ hintmask 000000001000000100000000
+ 0 -120 rlineto
+ 536 0 rlineto
+ hintmask 010000000010000000100000
+ 0 120 rlineto
+ -414 -538 rmoveto
+ 0 -107 rlineto
+ 149 0 rlineto
+ 0 107 rlineto
+ hintmask 000000000100000001010000
+ -199 85 rmoveto
+ 0 -320 rlineto
+ 118 0 rlineto
+ 0 320 rlineto
+ -11 532 rmoveto
+ hintmask 000000000010000000010000
+ 0 -153 rlineto
+ 136 0 rlineto
+ hintmask 000101000100000000010000
+ 0 153 rlineto
+ -215 -191 rmoveto
+ 0 -270 rlineto
+ 113 0 rlineto
+ 0 270 rlineto
+ 42 0 rmoveto
+ 0 -270 rlineto
+ 113 0 rlineto
+ 0 270 rlineto
+ 109 -388 rmoveto
+ -40 -32 -66 -44 -43 -21 rrcurveto
+ 57 -87 rlineto
+ 45 22 67 36 46 35 rrcurveto
+ hintmask 101010000000000010001100
+ -524 407 rmoveto
+ 0 -111 rlineto
+ 394 0 rlineto
+ 0 -70 rlineto
+ -394 0 rlineto
+ 0 -111 rlineto
+ 515 0 rlineto
+ 0 292 rlineto
+ -248 -269 rmoveto
+ 0 -273 rlineto
+ 0 -105 19 -34 91 0 rrcurveto
+ hintmask 100000000010001000001010
+ 17 0 22 0 18 0 rrcurveto
+ 68 0 29 34 11 118 rrcurveto
+ -32 8 -48 19 -23 18 rrcurveto
+ -3 -77 -3 -13 -13 0 rrcurveto
+ -4 0 -13 0 -4 0 rrcurveto
+ -11 0 -1 3 0 29 rrcurveto
+ 0 273 rlineto
+ -387 -293 rmoveto
+ 15 -121 rlineto
+ 74 11 85 12 82 13 rrcurveto
+ -7 115 rlineto
+ -92 -12 -91 -11 -66 -7 rrcurveto
+ -88 746 rmoveto
+ 0 -327 rlineto
+ 0 -142 -5 -196 -70 -132 rrcurveto
+ 29 -14 56 -41 22 -23 rrcurveto
+ 82 148 14 240 0 160 rrcurveto
+ 0 327 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid18480" fdSelectIndex="1">
+ 1000 -84 132 295 117 42 117 20 164 -129 129 -129 181 hstemhm
+ 143 144 -61 61 -35 144 -67 141 131 145 6 144 -66 132 hintmask 1110100101110000
+ 56 803 rmoveto
+ 0 -129 rlineto
+ 892 0 rlineto
+ 0 129 rlineto
+ hintmask 0000010010000000
+ -696 52 rmoveto
+ hintmask 0001000010000000
+ 0 -216 rlineto
+ 144 0 rlineto
+ hintmask 0000010010100000
+ 0 216 rlineto
+ 205 0 rmoveto
+ hintmask 0001000000100000
+ 0 -216 rlineto
+ 145 0 rlineto
+ hintmask 0010011000100000
+ 0 216 rlineto
+ -603 -236 rmoveto
+ 0 -216 rlineto
+ 0 -126 -9 -174 -110 -117 rrcurveto
+ 34 -16 63 -44 26 -25 rrcurveto
+ hintmask 1110000101010000
+ 119 131 21 218 0 151 rrcurveto
+ 0 218 rlineto
+ -61 0 rmoveto
+ 0 -117 rlineto
+ 526 0 rlineto
+ 0 -42 rlineto
+ -526 0 rlineto
+ 0 -117 rlineto
+ 670 0 rlineto
+ 0 276 rlineto
+ -567 -300 rmoveto
+ 0 -231 rlineto
+ 0 -132 45 -40 171 0 rrcurveto
+ 35 0 144 0 38 0 rrcurveto
+ hintmask 1000000001001000
+ 140 0 41 39 19 155 rrcurveto
+ -39 8 -61 21 -32 22 rrcurveto
+ -7 -99 -10 -14 -60 0 rrcurveto
+ -41 0 -124 0 -33 0 rrcurveto
+ -74 0 -11 4 0 39 rrcurveto
+ 0 228 rlineto
+ 309 12 rmoveto
+ -93 -45 -152 -37 -143 -21 rrcurveto
+ 16 -29 20 -51 6 -32 rrcurveto
+ 153 19 175 35 131 57 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid22370" fdSelectIndex="1">
+ 1000 62 77 23 73 22 73 22 77 24 93 28 94 -16 149 -103 103 -103 157 hstemhm
+ 114 128 -76 141 -39 141 -75 114 94 114 -69 142 -30 148 -95 135 hintmask 111111010011001100000000
+ 50 801 rmoveto
+ 0 -103 rlineto
+ 901 0 rlineto
+ 0 103 rlineto
+ hintmask 000000001001000000000000
+ -683 54 rmoveto
+ hintmask 000000100001000000000000
+ 0 -203 rlineto
+ 141 0 rlineto
+ hintmask 000000001001001000000000
+ 0 203 rlineto
+ 178 0 rmoveto
+ hintmask 000000100000001000000000
+ 0 -203 rlineto
+ 142 0 rlineto
+ hintmask 000000001000001000000000
+ 0 203 rlineto
+ hintmask 000011000100110010000000
+ -73 -281 rmoveto
+ 96 0 rlineto
+ 0 -28 rlineto
+ -96 0 rlineto
+ -208 28 rmoveto
+ 94 0 rlineto
+ 0 -28 rlineto
+ -94 0 rlineto
+ -206 28 rmoveto
+ 92 0 rlineto
+ 0 -28 rlineto
+ -92 0 rlineto
+ -128 122 rmoveto
+ 0 -215 rlineto
+ 773 0 rlineto
+ 0 215 rlineto
+ hintmask 111100000010000100000000
+ -580 -411 rmoveto
+ 392 0 rlineto
+ 0 -22 rlineto
+ -392 0 rlineto
+ 0 -73 rmoveto
+ 392 0 rlineto
+ 0 -23 rlineto
+ -392 0 rlineto
+ 0 213 rmoveto
+ 392 0 rlineto
+ 0 -22 rlineto
+ -392 0 rlineto
+ -141 99 rmoveto
+ 0 -367 rlineto
+ 681 0 rlineto
+ 0 367 rlineto
+ -312 -424 rmoveto
+ 108 -32 106 -41 57 -28 rrcurveto
+ 184 66 rlineto
+ -77 29 -135 44 -111 31 rrcurveto
+ -333 -2 rmoveto
+ -71 -32 -124 -28 -112 -15 rrcurveto
+ 30 -22 48 -48 24 -27 rrcurveto
+ 106 24 136 43 87 48 rrcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid00001" width="209" lsb="0"/>
+ <mtx name="cid00002" width="298" lsb="48"/>
+ <mtx name="cid01177" width="1000" lsb="19"/>
+ <mtx name="cid06449" width="1000" lsb="50"/>
+ <mtx name="cid06821" width="1000" lsb="17"/>
+ <mtx name="cid07253" width="1000" lsb="17"/>
+ <mtx name="cid13393" width="1000" lsb="66"/>
+ <mtx name="cid17290" width="1000" lsb="8"/>
+ <mtx name="cid17852" width="1000" lsb="13"/>
+ <mtx name="cid18480" width="1000" lsb="24"/>
+ <mtx name="cid22370" width="1000" lsb="27"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid00001" height="1000" tsb="880"/>
+ <mtx name="cid00002" height="1000" tsb="107"/>
+ <mtx name="cid01177" height="1000" tsb="25"/>
+ <mtx name="cid06449" height="1000" tsb="25"/>
+ <mtx name="cid06821" height="1000" tsb="20"/>
+ <mtx name="cid07253" height="1000" tsb="25"/>
+ <mtx name="cid13393" height="1000" tsb="22"/>
+ <mtx name="cid17290" height="1000" tsb="25"/>
+ <mtx name="cid17852" height="1000" tsb="25"/>
+ <mtx name="cid18480" height="1000" tsb="25"/>
+ <mtx name="cid22370" height="1000" tsb="25"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w439.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w439.00.ttx
new file mode 100644
index 00000000..5a0df527
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w439.00.ttx
@@ -0,0 +1,466 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid06821"/>
+ <GlyphID id="2" name="cid18480"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0x3ae58124"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:06:43 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="29"/>
+ <yMin value="-120"/>
+ <xMax value="973"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="29"/>
+ <minRightSideBearing value="27"/>
+ <xMaxExtent value="973"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="3"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="977"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00001000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="33512"/>
+ <usLastCharIndex value="36441"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w439.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w439.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w439.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w439.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w439.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w439.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="29 -120 973 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w439.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w439.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid06821" fdSelectIndex="1">
+ 1000 -69 66 68 52 53 38 -38 51 67 51 8 72 -64 52 118 31 -31 47 -27 27 47 42 -42 93 -10 58 -58 144 hstemhm
+ 115 74 -37 37 153 67 -51 51 -51 70 -51 32 50 81 -38 38 19 74 142 82 55 61 hintmask 00011000000000000000000100000000
+ 234 288 rmoveto
+ 541 0 rlineto
+ 0 -67 rlineto
+ -541 0 rlineto
+ -78 118 rmoveto
+ 0 -169 rlineto
+ 701 0 rlineto
+ 0 169 rlineto
+ hintmask 00100000000000000000100000000000
+ -398 -131 rmoveto
+ 0 -239 rlineto
+ 81 -16 rlineto
+ 0 255 rlineto
+ hintmask 01000000000010010000010000000000
+ -38 -91 rmoveto
+ 0 -52 rlineto
+ 385 0 rlineto
+ 0 52 rlineto
+ -735 643 rmoveto
+ 0 -58 rlineto
+ 799 0 rlineto
+ 0 58 rlineto
+ hintmask 00000000000010100000000000000000
+ -836 0 rmoveto
+ 0 -131 rlineto
+ 0 -79 -10 -102 -76 -77 rrcurveto
+ 17 -9 31 -26 11 -14 rrcurveto
+ 84 85 17 127 0 94 rrcurveto
+ 0 132 rlineto
+ hintmask 00000000010100001000000000000000
+ 153 -48 rmoveto
+ 0 -167 rlineto
+ hintmask 00000000010100000100000000000000
+ 67 0 rlineto
+ 0 167 rlineto
+ hintmask 00000000101000000001000000000000
+ -32 -51 rmoveto
+ 0 -42 rlineto
+ 181 0 rlineto
+ 0 42 rlineto
+ -355 -89 rmoveto
+ 0 -47 rlineto
+ 388 0 rlineto
+ 0 47 rlineto
+ hintmask 00000011000000000100000000000000
+ -233 -16 rmoveto
+ 0 -137 rlineto
+ 0 -8 -2 -3 -10 -1 rrcurveto
+ -9 0 -26 0 -34 1 rrcurveto
+ 9 -15 12 -21 4 -17 rrcurveto
+ hintmask 00000011000001000010001000000000
+ 45 0 31 0 22 9 rrcurveto
+ 23 9 5 13 0 32 rrcurveto
+ 0 138 rlineto
+ -171 -49 rmoveto
+ -19 -39 -33 -36 -39 -29 rrcurveto
+ 14 -7 23 -16 10 -9 rrcurveto
+ 38 30 38 47 23 46 rrcurveto
+ 140 -8 rmoveto
+ 27 -24 29 -33 13 -24 rrcurveto
+ 47 24 rlineto
+ -14 24 -30 33 -27 21 rrcurveto
+ 62 339 rmoveto
+ hintmask 10000101000001000000001010000000
+ 17 -280 136 -219 157 0 rrcurveto
+ 64 0 29 31 11 118 rrcurveto
+ -19 6 -25 13 -17 15 rrcurveto
+ -4 -81 -9 -30 -26 0 rrcurveto
+ -108 -2 -118 185 -14 244 rrcurveto
+ 170 -173 rmoveto
+ -57 -121 -107 -100 -119 -63 rrcurveto
+ 15 -11 26 -24 11 -13 rrcurveto
+ 119 70 113 109 65 135 rrcurveto
+ -176 151 rmoveto
+ 51 -16 63 -26 34 -21 rrcurveto
+ 36 47 rlineto
+ -35 21 -64 24 -50 13 rrcurveto
+ -452 -751 rmoveto
+ -56 -23 rlineto
+ 84 -121 133 -22 225 0 rrcurveto
+ 206 0 rlineto
+ 66 0 rlineto
+ 4 19 11 31 10 16 rrcurveto
+ -51 -1 -208 0 -36 0 rrcurveto
+ -190 0 -132 13 -66 88 rrcurveto
+ -45 52 rmoveto
+ -25 -90 -77 -59 -100 -35 rrcurveto
+ 18 -12 30 -28 12 -14 rrcurveto
+ 103 45 87 72 31 112 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid18480" fdSelectIndex="1">
+ 1000 -77 75 369 68 105 68 29 132 -73 73 -73 150 hstemhm
+ 152 80 -37 37 55 80 -32 78 215 81 92 80 -18 75 hintmask 1110100101110000
+ 57 769 rmoveto
+ 0 -73 rlineto
+ 889 0 rlineto
+ 0 73 rlineto
+ hintmask 0000010010000000
+ -659 77 rmoveto
+ hintmask 0001000010000000
+ 0 -209 rlineto
+ 80 0 rlineto
+ hintmask 0000010010100000
+ 0 209 rlineto
+ 261 0 rmoveto
+ hintmask 0001000000100000
+ 0 -209 rlineto
+ 81 0 rlineto
+ hintmask 0010011000100000
+ 0 209 rlineto
+ -557 -238 rmoveto
+ 0 -211 rlineto
+ 0 -132 -12 -179 -110 -128 rrcurveto
+ 19 -9 34 -24 15 -14 rrcurveto
+ hintmask 1110000101010000
+ 115 135 19 205 0 145 rrcurveto
+ 0 212 rlineto
+ -37 0 rmoveto
+ 0 -68 rlineto
+ 606 0 rlineto
+ 0 -105 rlineto
+ -606 0 rlineto
+ 0 -68 rlineto
+ 686 0 rlineto
+ 0 241 rlineto
+ -546 -272 rmoveto
+ 0 -293 rlineto
+ 0 -95 37 -25 134 0 rrcurveto
+ 28 0 219 0 30 0 rrcurveto
+ hintmask 1000000001001000
+ 116 0 26 35 13 137 rrcurveto
+ -22 5 -34 12 -19 13 rrcurveto
+ -7 -109 -10 -18 -66 0 rrcurveto
+ -49 0 -187 0 -37 0 rrcurveto
+ -80 0 -14 8 0 38 rrcurveto
+ 0 292 rlineto
+ 385 -21 rmoveto
+ -97 -49 -177 -47 -157 -32 rrcurveto
+ 9 -17 12 -28 4 -18 rrcurveto
+ 164 31 185 46 125 56 rrcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid06821" width="1000" lsb="29"/>
+ <mtx name="cid18480" width="1000" lsb="30"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid06821" height="1000" tsb="32"/>
+ <mtx name="cid18480" height="1000" tsb="34"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w440.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w440.00.ttx
new file mode 100644
index 00000000..b0a8ffa6
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w440.00.ttx
@@ -0,0 +1,466 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid06821"/>
+ <GlyphID id="2" name="cid18480"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0xc82be45b"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:06:51 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="29"/>
+ <yMin value="-120"/>
+ <xMax value="973"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="29"/>
+ <minRightSideBearing value="27"/>
+ <xMaxExtent value="973"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="3"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="977"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00001000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="33512"/>
+ <usLastCharIndex value="36441"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w440.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w440.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w440.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w440.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x82e8" name="cid18480"/><!-- CJK UNIFIED IDEOGRAPH-82E8 -->
+ <map code="0x8e59" name="cid06821"/><!-- CJK UNIFIED IDEOGRAPH-8E59 -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w440.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w440.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="29 -120 973 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w440.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w440.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid06821" fdSelectIndex="1">
+ 1000 -69 66 68 52 53 39 -39 51 67 51 8 72 -64 52 118 31 -31 47 -27 27 47 42 -42 93 -10 58 -58 144 hstemhm
+ 115 75 -38 38 152 67 -51 51 -51 70 -51 32 50 81 -38 38 19 74 141 83 55 61 hintmask 00011000000000000000000100000000
+ 234 288 rmoveto
+ 540 0 rlineto
+ 0 -67 rlineto
+ -540 0 rlineto
+ -78 118 rmoveto
+ 0 -169 rlineto
+ 701 0 rlineto
+ 0 169 rlineto
+ hintmask 00100000000000000000100000000000
+ -398 -130 rmoveto
+ 0 -240 rlineto
+ 81 -16 rlineto
+ 0 256 rlineto
+ hintmask 01000000000010010000010000000000
+ -38 -92 rmoveto
+ 0 -52 rlineto
+ 385 0 rlineto
+ 0 52 rlineto
+ -735 643 rmoveto
+ 0 -58 rlineto
+ 799 0 rlineto
+ 0 58 rlineto
+ hintmask 00000000000010100000000000000000
+ -836 0 rmoveto
+ 0 -131 rlineto
+ 0 -79 -10 -101 -76 -78 rrcurveto
+ 17 -9 31 -26 11 -14 rrcurveto
+ 84 85 18 127 0 94 rrcurveto
+ 0 132 rlineto
+ hintmask 00000000010100001000000000000000
+ 152 -48 rmoveto
+ 0 -167 rlineto
+ hintmask 00000000010100000100000000000000
+ 67 0 rlineto
+ 0 167 rlineto
+ hintmask 00000000101000000001000000000000
+ -32 -51 rmoveto
+ 0 -42 rlineto
+ 181 0 rlineto
+ 0 42 rlineto
+ -355 -89 rmoveto
+ 0 -47 rlineto
+ 388 0 rlineto
+ 0 47 rlineto
+ hintmask 00000011000000000100000000000000
+ -233 -16 rmoveto
+ 0 -137 rlineto
+ 0 -8 -2 -3 -10 -1 rrcurveto
+ -9 0 -26 0 -34 1 rrcurveto
+ 9 -15 12 -21 4 -17 rrcurveto
+ hintmask 00000011000001000010001000000000
+ 45 0 31 0 23 9 rrcurveto
+ 22 9 5 13 0 32 rrcurveto
+ 0 138 rlineto
+ -171 -49 rmoveto
+ -19 -39 -33 -36 -39 -29 rrcurveto
+ 14 -7 23 -16 10 -9 rrcurveto
+ 38 30 38 47 23 46 rrcurveto
+ 140 -8 rmoveto
+ 30 -29 32 -40 14 -28 rrcurveto
+ 48 23 rlineto
+ -15 28 -33 40 -30 26 rrcurveto
+ 61 340 rmoveto
+ hintmask 10000101000001000000001010000000
+ 17 -280 136 -219 157 0 rrcurveto
+ 64 0 29 31 11 118 rrcurveto
+ -19 6 -25 13 -17 15 rrcurveto
+ -4 -81 -9 -30 -26 0 rrcurveto
+ -108 -1 -118 184 -14 244 rrcurveto
+ 170 -173 rmoveto
+ -42 -107 -79 -95 -91 -61 rrcurveto
+ 16 -11 27 -25 11 -13 rrcurveto
+ 91 68 86 106 49 120 rrcurveto
+ -178 151 rmoveto
+ 51 -16 63 -26 34 -21 rrcurveto
+ 36 47 rlineto
+ -35 21 -64 24 -50 13 rrcurveto
+ -452 -751 rmoveto
+ -56 -23 rlineto
+ 84 -121 133 -22 225 0 rrcurveto
+ 206 0 rlineto
+ 66 0 rlineto
+ 3 19 12 31 10 16 rrcurveto
+ -51 -1 -208 0 -36 0 rrcurveto
+ -190 0 -132 13 -66 88 rrcurveto
+ -45 52 rmoveto
+ -25 -90 -77 -59 -100 -35 rrcurveto
+ 18 -12 30 -28 12 -14 rrcurveto
+ 103 45 87 72 31 112 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid18480" fdSelectIndex="1">
+ 1000 -77 75 369 68 105 68 27 134 -73 73 -73 150 hstemhm
+ 152 80 -37 37 55 80 -32 78 215 81 92 80 -19 76 hintmask 1110100101110000
+ 57 769 rmoveto
+ 0 -73 rlineto
+ 889 0 rlineto
+ 0 73 rlineto
+ hintmask 0000010010000000
+ -659 77 rmoveto
+ hintmask 0001000010000000
+ 0 -211 rlineto
+ 80 0 rlineto
+ hintmask 0000010010100000
+ 0 211 rlineto
+ 261 0 rmoveto
+ hintmask 0001000000100000
+ 0 -211 rlineto
+ 81 0 rlineto
+ hintmask 0010011000100000
+ 0 211 rlineto
+ -557 -238 rmoveto
+ 0 -211 rlineto
+ 0 -132 -12 -179 -110 -128 rrcurveto
+ 19 -9 34 -24 15 -14 rrcurveto
+ hintmask 1110000101010000
+ 115 135 19 205 0 145 rrcurveto
+ 0 212 rlineto
+ -37 0 rmoveto
+ 0 -68 rlineto
+ 606 0 rlineto
+ 0 -105 rlineto
+ -606 0 rlineto
+ 0 -68 rlineto
+ 686 0 rlineto
+ 0 241 rlineto
+ -546 -272 rmoveto
+ 0 -293 rlineto
+ 0 -95 37 -25 134 0 rrcurveto
+ 28 0 219 0 30 0 rrcurveto
+ hintmask 1000000001001000
+ 116 0 26 35 13 137 rrcurveto
+ -22 5 -34 12 -20 13 rrcurveto
+ -6 -109 -11 -18 -65 0 rrcurveto
+ -49 0 -187 0 -37 0 rrcurveto
+ -80 0 -14 8 0 38 rrcurveto
+ 0 292 rlineto
+ 385 -21 rmoveto
+ -97 -49 -177 -47 -157 -32 rrcurveto
+ 9 -17 12 -28 4 -18 rrcurveto
+ 164 31 185 46 125 56 rrcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid06821" width="1000" lsb="29"/>
+ <mtx name="cid18480" width="1000" lsb="30"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid06821" height="1000" tsb="32"/>
+ <mtx name="cid18480" height="1000" tsb="34"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w599.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w599.00.ttx
new file mode 100644
index 00000000..65809d40
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w599.00.ttx
@@ -0,0 +1,487 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid17290"/>
+ <GlyphID id="2" name="cid17852"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0x1125c42f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:07:13 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="10"/>
+ <yMin value="-120"/>
+ <xMax value="979"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="10"/>
+ <minRightSideBearing value="21"/>
+ <xMaxExtent value="979"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="3"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="978"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00001000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="20686"/>
+ <usLastCharIndex value="27162"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w599.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w599.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w599.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w599.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w599.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w599.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="10 -120 979 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w599.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w599.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid17290" fdSelectIndex="1">
+ 1000 100 82 -54 54 94 80 -80 158 21 71 85 67 66 66 hstemhm
+ 138 94 95 81 -45 45 51 90 -21 76 -48 71 -71 178 -81 81 -45 45 122 77 -44 71 hintmask 011011111011001010000000
+ 327 810 rmoveto
+ 0 -256 rlineto
+ 0 -78 22 -21 79 0 rrcurveto
+ hintmask 000010000000100000000000
+ 17 0 74 0 17 0 rrcurveto
+ 61 0 22 23 8 84 rrcurveto
+ hintmask 101010101000010000000000
+ -22 5 -32 11 -17 13 rrcurveto
+ -3 -56 -4 -9 -22 0 rrcurveto
+ -15 0 -60 0 -12 0 rrcurveto
+ -28 0 -4 4 0 25 rrcurveto
+ 0 255 rlineto
+ -81 -454 rmoveto
+ 0 -80 rlineto
+ 612 0 rlineto
+ 0 80 rlineto
+ -650 -174 rmoveto
+ 0 -82 rlineto
+ 678 0 rlineto
+ 0 82 rlineto
+ hintmask 010101100111001000000000
+ -508 252 rmoveto
+ 0 -306 rlineto
+ 90 0 rlineto
+ 0 306 rlineto
+ 157 -1 rmoveto
+ 0 -306 rlineto
+ 91 0 rlineto
+ 0 306 rlineto
+ -434 377 rmoveto
+ 0 -66 rlineto
+ 165 0 rlineto
+ 0 -66 rlineto
+ -165 0 rlineto
+ 0 -67 rlineto
+ 241 0 rlineto
+ 0 199 rlineto
+ 49 0 rmoveto
+ hintmask 000010100000001001000000
+ 0 -256 rlineto
+ 0 -78 22 -21 80 0 rrcurveto
+ 17 0 78 0 18 0 rrcurveto
+ 61 0 23 23 8 84 rrcurveto
+ -23 5 -31 11 -17 13 rrcurveto
+ -3 -56 -5 -9 -22 0 rrcurveto
+ -17 0 -63 0 -12 0 rrcurveto
+ -29 0 -4 4 0 25 rrcurveto
+ 0 255 rlineto
+ hintmask 000001110000000110000000
+ -45 0 rmoveto
+ 0 -66 rlineto
+ 167 0 rlineto
+ 0 -66 rlineto
+ -167 0 rlineto
+ 0 -67 rlineto
+ 244 0 rlineto
+ 0 199 rlineto
+ -443 -726 rmoveto
+ -45 -45 -86 -38 -83 -24 rrcurveto
+ 21 -16 35 -35 15 -18 rrcurveto
+ 84 32 96 54 55 61 rrcurveto
+ 108 -12 rmoveto
+ 70 -36 85 -56 42 -38 rrcurveto
+ 82 52 rlineto
+ -46 39 -88 53 -69 32 rrcurveto
+ -547 756 rmoveto
+ -47 -152 -77 -150 -85 -98 rrcurveto
+ 16 -26 26 -56 8 -24 rrcurveto
+ 102 120 91 184 58 176 rrcurveto
+ -173 -237 rmoveto
+ 0 -671 rlineto
+ 94 0 rlineto
+ 0 761 rlineto
+ -2 2 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid17852" fdSelectIndex="1">
+ 1000 -81 75 160 76 101 76 -34 34 96 76 -76 147 -99 90 -82 82 32 84 -84 176 -141 49 hstemhm
+ 43 218 -92 92 -92 181 16 89 -42 42 -29 29 34 83 -45 45 48 93 -1 84 73 85 -48 73 hintmask 000000100001000000000000
+ 43 641 rmoveto
+ 0 -90 rlineto
+ hintmask 000000100000010000000000
+ 307 0 rlineto
+ 0 90 rlineto
+ hintmask 000000010010100100000000
+ -181 208 rmoveto
+ 0 -937 rlineto
+ 92 0 rlineto
+ 0 937 rlineto
+ -91 -270 rmoveto
+ -25 -135 -61 -170 -64 -94 rrcurveto
+ 15 -23 23 -38 10 -27 rrcurveto
+ 71 107 62 201 31 159 rrcurveto
+ 23 -66 rmoveto
+ -44 -50 rlineto
+ 26 -41 60 -98 23 -51 rrcurveto
+ 52 87 rlineto
+ -16 24 -80 106 -21 23 rrcurveto
+ 158 264 rmoveto
+ hintmask 000000001000000100000000
+ 0 -84 rlineto
+ 542 0 rlineto
+ hintmask 010000000010000000100000
+ 0 84 rlineto
+ -428 -527 rmoveto
+ 0 -76 rlineto
+ 159 0 rlineto
+ 0 76 rlineto
+ hintmask 000000000100000001010000
+ -197 78 rmoveto
+ 0 -327 rlineto
+ 83 0 rlineto
+ 0 327 rlineto
+ 48 541 rmoveto
+ hintmask 000000000010000000010000
+ 0 -141 rlineto
+ 93 0 rlineto
+ hintmask 000101000100000000010000
+ 0 141 rlineto
+ -175 -199 rmoveto
+ 0 -277 rlineto
+ 80 0 rlineto
+ 0 277 rlineto
+ 86 0 rmoveto
+ 0 -277 rlineto
+ 80 0 rlineto
+ 0 277 rlineto
+ 126 -375 rmoveto
+ -45 -34 -75 -45 -50 -25 rrcurveto
+ 40 -60 rlineto
+ 52 24 74 38 51 39 rrcurveto
+ hintmask 101010000000000010001100
+ -531 367 rmoveto
+ 0 -76 rlineto
+ 443 0 rlineto
+ 0 -96 rlineto
+ -443 0 rlineto
+ 0 -76 rlineto
+ 528 0 rlineto
+ 0 248 rlineto
+ -242 -270 rmoveto
+ 0 -286 rlineto
+ 0 -80 18 -24 76 0 rrcurveto
+ hintmask 100000000010001000001010
+ 15 0 53 0 16 0 rrcurveto
+ 60 0 21 29 8 113 rrcurveto
+ -23 6 -34 12 -16 14 rrcurveto
+ -3 -86 -4 -13 -19 0 rrcurveto
+ -11 0 -41 0 -9 0 rrcurveto
+ -20 0 -3 4 0 26 rrcurveto
+ 0 285 rlineto
+ -370 -306 rmoveto
+ 13 -85 rlineto
+ 75 13 91 16 89 16 rrcurveto
+ -5 81 rlineto
+ -99 -16 -96 -16 -68 -9 rrcurveto
+ -60 754 rmoveto
+ 0 -322 rlineto
+ 0 -142 -5 -196 -72 -135 rrcurveto
+ 21 -10 38 -27 16 -16 rrcurveto
+ 79 146 12 226 0 154 rrcurveto
+ 0 322 rlineto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid17290" width="1000" lsb="10"/>
+ <mtx name="cid17852" width="1000" lsb="20"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid17290" height="1000" tsb="35"/>
+ <mtx name="cid17852" height="1000" tsb="31"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w600.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w600.00.ttx
new file mode 100644
index 00000000..e0b217f8
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w600.00.ttx
@@ -0,0 +1,487 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid17290"/>
+ <GlyphID id="2" name="cid17852"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0xa6c15fdb"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:07:20 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="10"/>
+ <yMin value="-120"/>
+ <xMax value="979"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="10"/>
+ <minRightSideBearing value="21"/>
+ <xMaxExtent value="979"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="3"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="978"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00001000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="20686"/>
+ <usLastCharIndex value="27162"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w600.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w600.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w600.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w600.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x50ce" name="cid17290"/><!-- CJK UNIFIED IDEOGRAPH-50CE -->
+ <map code="0x6a1a" name="cid17852"/><!-- CJK UNIFIED IDEOGRAPH-6A1A -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w600.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w600.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="10 -120 979 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w600.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w600.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid17290" fdSelectIndex="1">
+ 1000 104 85 -31 31 103 84 -84 185 -22 71 85 67 66 66 hstemhm
+ 138 94 95 81 -45 45 49 92 -21 76 -48 71 -71 178 -81 81 -45 45 122 77 -44 71 hintmask 011011111011001010000000
+ 327 810 rmoveto
+ 0 -256 rlineto
+ 0 -78 22 -21 79 0 rrcurveto
+ hintmask 000010000000100000000000
+ 17 0 74 0 17 0 rrcurveto
+ 61 0 22 23 8 84 rrcurveto
+ hintmask 101010101000010000000000
+ -22 5 -32 11 -17 13 rrcurveto
+ -3 -56 -4 -9 -22 0 rrcurveto
+ -15 0 -60 0 -12 0 rrcurveto
+ -28 0 -4 4 0 25 rrcurveto
+ 0 255 rlineto
+ -89 -434 rmoveto
+ 0 -84 rlineto
+ 624 0 rlineto
+ 0 84 rlineto
+ -654 -187 rmoveto
+ 0 -85 rlineto
+ 678 0 rlineto
+ 0 85 rlineto
+ hintmask 010101100111001000000000
+ -510 288 rmoveto
+ 0 -319 rlineto
+ 92 0 rlineto
+ 0 319 rlineto
+ 157 -1 rmoveto
+ 0 -319 rlineto
+ 92 0 rlineto
+ 0 319 rlineto
+ -435 334 rmoveto
+ 0 -66 rlineto
+ 165 0 rlineto
+ 0 -66 rlineto
+ -165 0 rlineto
+ 0 -67 rlineto
+ 241 0 rlineto
+ 0 199 rlineto
+ 49 0 rmoveto
+ hintmask 000010100000001001000000
+ 0 -256 rlineto
+ 0 -78 22 -21 80 0 rrcurveto
+ 17 0 78 0 18 0 rrcurveto
+ 61 0 23 24 8 85 rrcurveto
+ -22 5 -32 11 -17 13 rrcurveto
+ -3 -57 -5 -10 -22 0 rrcurveto
+ -17 0 -63 0 -12 0 rrcurveto
+ -29 0 -4 4 0 26 rrcurveto
+ 0 254 rlineto
+ hintmask 000001110000000110000000
+ -45 0 rmoveto
+ 0 -66 rlineto
+ 167 0 rlineto
+ 0 -66 rlineto
+ -167 0 rlineto
+ 0 -67 rlineto
+ 244 0 rlineto
+ 0 199 rlineto
+ -443 -726 rmoveto
+ -45 -45 -86 -38 -83 -24 rrcurveto
+ 21 -16 35 -35 15 -18 rrcurveto
+ 84 32 96 54 55 61 rrcurveto
+ 108 -12 rmoveto
+ 70 -36 85 -56 42 -38 rrcurveto
+ 82 52 rlineto
+ -46 39 -88 53 -69 32 rrcurveto
+ -547 756 rmoveto
+ -47 -152 -77 -150 -85 -98 rrcurveto
+ 16 -26 26 -56 8 -24 rrcurveto
+ 102 120 91 184 58 176 rrcurveto
+ -173 -237 rmoveto
+ 0 -671 rlineto
+ 94 0 rlineto
+ 0 761 rlineto
+ -2 2 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid17852" fdSelectIndex="1">
+ 1000 -81 75 157 76 92 78 -14 14 109 78 -78 178 -133 90 -82 82 32 84 -84 176 -141 49 hstemhm
+ 43 218 -92 92 -92 181 16 89 -42 42 -29 29 34 83 -45 45 48 93 -1 84 73 85 -48 73 hintmask 000000100001000000000000
+ 43 641 rmoveto
+ 0 -90 rlineto
+ hintmask 000000100000010000000000
+ 307 0 rlineto
+ 0 90 rlineto
+ hintmask 000000010010100100000000
+ -181 208 rmoveto
+ 0 -937 rlineto
+ 92 0 rlineto
+ 0 937 rlineto
+ -91 -270 rmoveto
+ -25 -135 -61 -170 -64 -94 rrcurveto
+ 15 -23 23 -38 10 -27 rrcurveto
+ 71 107 62 201 31 159 rrcurveto
+ 23 -66 rmoveto
+ -44 -50 rlineto
+ 26 -41 60 -98 23 -51 rrcurveto
+ 52 87 rlineto
+ -16 24 -80 106 -21 23 rrcurveto
+ 158 264 rmoveto
+ hintmask 000000001000000100000000
+ 0 -84 rlineto
+ 545 0 rlineto
+ hintmask 010000000010000000100000
+ 0 84 rlineto
+ -431 -530 rmoveto
+ 0 -76 rlineto
+ 159 0 rlineto
+ 0 76 rlineto
+ hintmask 000000000100000001010000
+ -197 115 rmoveto
+ 0 -356 rlineto
+ 83 0 rlineto
+ 0 356 rlineto
+ 48 507 rmoveto
+ hintmask 000000000010000000010000
+ 0 -141 rlineto
+ 93 0 rlineto
+ hintmask 000101000100000000010000
+ 0 141 rlineto
+ -175 -165 rmoveto
+ 0 -301 rlineto
+ 80 0 rlineto
+ 0 301 rlineto
+ 84 0 rmoveto
+ 0 -301 rlineto
+ 80 0 rlineto
+ 0 301 rlineto
+ 128 -409 rmoveto
+ -45 -34 -75 -45 -50 -25 rrcurveto
+ 40 -60 rlineto
+ 52 24 74 38 51 39 rrcurveto
+ hintmask 101010000000000010001100
+ -531 372 rmoveto
+ 0 -78 rlineto
+ 443 0 rlineto
+ 0 -109 rlineto
+ -443 0 rlineto
+ 0 -78 rlineto
+ 528 0 rlineto
+ 0 265 rlineto
+ -242 -241 rmoveto
+ 0 -318 rlineto
+ 0 -82 18 -24 76 0 rrcurveto
+ hintmask 100000000010001000001010
+ 15 0 53 0 16 0 rrcurveto
+ 60 0 21 30 8 112 rrcurveto
+ -23 5 -33 13 -17 14 rrcurveto
+ -3 -85 -4 -14 -19 0 rrcurveto
+ -10 0 -42 0 -9 0 rrcurveto
+ -20 0 -3 4 0 26 rrcurveto
+ 0 319 rlineto
+ -370 -340 rmoveto
+ 13 -85 rlineto
+ 75 13 91 16 89 16 rrcurveto
+ -5 81 rlineto
+ -99 -16 -96 -16 -68 -9 rrcurveto
+ -60 754 rmoveto
+ 0 -322 rlineto
+ 0 -142 -5 -196 -72 -135 rrcurveto
+ 21 -10 38 -27 16 -16 rrcurveto
+ 79 146 12 226 0 154 rrcurveto
+ 0 322 rlineto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid17290" width="1000" lsb="10"/>
+ <mtx name="cid17852" width="1000" lsb="20"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid17290" height="1000" tsb="35"/>
+ <mtx name="cid17852" height="1000" tsb="31"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w669.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w669.00.ttx
new file mode 100644
index 00000000..94831b49
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w669.00.ttx
@@ -0,0 +1,492 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid01177"/>
+ <GlyphID id="2" name="cid07253"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0x6e00b443"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:07:27 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="23"/>
+ <yMin value="-120"/>
+ <xMax value="983"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="23"/>
+ <minRightSideBearing value="17"/>
+ <xMaxExtent value="983"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="3"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="978"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00001000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="24847"/>
+ <usLastCharIndex value="39488"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w669.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w669.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w669.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w669.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w669.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w669.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="23 -120 983 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w669.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w669.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid01177" fdSelectIndex="1">
+ 1000 -80 89 189 69 50 65 49 69 44 86 75 89 -87 143 -117 61 hstemhm
+ 173 105 9 108 48 111 94 94 -15 110 hintmask 1111100011111000
+ 287 149 rmoveto
+ 0 -111 rlineto
+ 0 -92 30 -26 122 0 rrcurveto
+ 25 0 118 0 26 0 rrcurveto
+ 92 0 30 27 12 114 rrcurveto
+ -29 6 -43 14 -22 15 rrcurveto
+ -5 -76 -6 -11 -39 0 rrcurveto
+ -29 0 -96 0 -22 0 rrcurveto
+ -48 0 -8 4 0 26 rrcurveto
+ 0 110 rlineto
+ -11 9 rmoveto
+ 58 -25 71 -42 34 -31 rrcurveto
+ 68 69 rlineto
+ -38 30 -73 39 -57 22 rrcurveto
+ 271 -96 rmoveto
+ 64 -55 70 -79 29 -54 rrcurveto
+ 92 54 rlineto
+ -33 56 -73 75 -63 51 rrcurveto
+ -642 -11 rmoveto
+ -23 -67 -47 -66 -64 -39 rrcurveto
+ 86 -59 rlineto
+ 72 47 41 75 29 75 rrcurveto
+ -143 667 rmoveto
+ 0 -87 rlineto
+ 772 0 rlineto
+ 0 87 rlineto
+ -819 -164 rmoveto
+ 0 -86 rlineto
+ 872 0 rlineto
+ 0 86 rlineto
+ hintmask 0000001000100000
+ -495 220 rmoveto
+ hintmask 0000000100100000
+ 0 -117 rlineto
+ 111 0 rlineto
+ hintmask 0000001000100000
+ 0 117 rlineto
+ hintmask 0111010010001000
+ -296 -145 rmoveto
+ 14 -30 15 -40 5 -25 rrcurveto
+ 105 24 rlineto
+ -7 25 -15 38 -16 28 rrcurveto
+ 281 1 rmoveto
+ -9 -26 -18 -38 -13 -27 rrcurveto
+ 97 -22 rlineto
+ 16 23 20 31 22 36 rrcurveto
+ -477 -386 rmoveto
+ 449 0 rlineto
+ 0 -50 rlineto
+ -449 0 rlineto
+ 0 164 rmoveto
+ 449 0 rlineto
+ 0 -49 rlineto
+ -449 0 rlineto
+ -105 118 rmoveto
+ 0 -302 rlineto
+ 664 0 rlineto
+ 0 302 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid07253" fdSelectIndex="1">
+ 1000 -90 68 42 76 -74 74 -72 72 -57 57 -29 29 -27 27 30 43 30 43 29 37 -37 53 32 72 -47 47 32 18 -18 56 -46 46 35 54 34 56 -25 134 -74 74 -74 120 hstemhm
+ 165 101 -57 105 -36 36 2 84 54 99 58 109 15 106 -46 35 hintmask 10000011101100101101000101110000
+ 57 804 rmoveto
+ 0 -74 rlineto
+ 886 0 rlineto
+ 0 74 rlineto
+ hintmask 00000000000000000000100000000000
+ -665 46 rmoveto
+ hintmask 00000000000000000010000000000000
+ 0 -180 rlineto
+ 107 0 rlineto
+ hintmask 00000000000000000000100000100000
+ 0 180 rlineto
+ 226 0 rmoveto
+ hintmask 00000000000000000010000000100000
+ 0 -180 rlineto
+ 109 0 rlineto
+ hintmask 00000000000100101100110000110000
+ 0 180 rlineto
+ -454 -299 rmoveto
+ 469 0 rlineto
+ 0 -35 rlineto
+ -469 0 rlineto
+ 0 123 rmoveto
+ 469 0 rlineto
+ 0 -34 rlineto
+ -469 0 rlineto
+ -101 90 rmoveto
+ 0 -235 rlineto
+ 676 0 rlineto
+ 0 235 rlineto
+ -798 -267 rmoveto
+ 0 -72 rlineto
+ 915 0 rlineto
+ 0 72 rlineto
+ hintmask 00000001100000000000000100000000
+ -680 -186 rmoveto
+ 0 -43 rlineto
+ 495 0 rlineto
+ 0 43 rlineto
+ -495 -73 rmoveto
+ 0 -43 rlineto
+ 507 0 rlineto
+ 0 43 rlineto
+ hintmask 00000010000000000000001000000000
+ -576 -73 rmoveto
+ hintmask 00001000000000000000001000001000
+ 0 -57 rlineto
+ 621 0 rlineto
+ hintmask 00000010000001000000000000001000
+ 0 57 rlineto
+ -501 390 rmoveto
+ -40 -97 -96 -93 -170 -59 rrcurveto
+ 19 -16 28 -36 11 -24 rrcurveto
+ hintmask 00000100010010010000000001000000
+ 186 73 105 107 58 129 rrcurveto
+ 274 -62 rmoveto
+ -80 -27 rlineto
+ 64 -94 111 -79 120 -37 rrcurveto
+ 14 26 29 37 21 20 rrcurveto
+ -114 26 -110 58 -55 70 rrcurveto
+ -250 -100 rmoveto
+ 0 -241 rlineto
+ 99 0 rlineto
+ 0 241 rlineto
+ hintmask 10000010000000000000000000001000
+ 242 -212 rmoveto
+ 0 -10 rlineto
+ -6 -63 -8 -28 -9 -9 rrcurveto
+ -6 -7 -6 -1 -10 0 rrcurveto
+ -10 0 -21 1 -25 3 rrcurveto
+ 11 -19 8 -32 1 -22 rrcurveto
+ 35 -1 32 1 17 1 rrcurveto
+ 21 2 18 6 15 14 rrcurveto
+ 19 18 9 38 9 74 rrcurveto
+ 2 13 2 21 0 0 rrcurveto
+ -717 -42 rmoveto
+ -16 -39 -32 -41 -41 -23 rrcurveto
+ 76 -45 rlineto
+ hintmask 10010000000000000000000000000000
+ 48 28 27 44 18 46 rrcurveto
+ hintmask 00100000000000000000000010000000
+ 43 -2 rmoveto
+ 10 -34 8 -47 -1 -29 rrcurveto
+ 84 14 rlineto
+ -1 28 -10 46 -12 33 rrcurveto
+ hintmask 01000000000000000000000000100000
+ 57 -13 rmoveto
+ 22 -30 21 -41 8 -28 rrcurveto
+ 76 25 rlineto
+ -10 28 -21 39 -24 28 rrcurveto
+ hintmask 00010000001000000000001000000000
+ 72 -22 rmoveto
+ 24 -21 27 -32 11 -22 rrcurveto
+ 65 34 rlineto
+ -12 22 -29 30 -25 20 rrcurveto
+ -342 274 rmoveto
+ -49 -53 rlineto
+ 456 0 rlineto
+ 0 53 rlineto
+ -495 -37 rmoveto
+ hintmask 00000010000000000000001000000000
+ 0 -218 rlineto
+ hintmask 00000010001000000000000100000000
+ 105 0 rlineto
+ 0 257 rlineto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid01177" width="1000" lsb="28"/>
+ <mtx name="cid07253" width="1000" lsb="23"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid01177" height="1000" tsb="30"/>
+ <mtx name="cid07253" height="1000" tsb="30"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w670.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w670.00.ttx
new file mode 100644
index 00000000..eff2eec2
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w670.00.ttx
@@ -0,0 +1,492 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid01177"/>
+ <GlyphID id="2" name="cid07253"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0x97cdda5"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:07:35 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="23"/>
+ <yMin value="-120"/>
+ <xMax value="983"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="23"/>
+ <minRightSideBearing value="17"/>
+ <xMaxExtent value="983"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="3"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="978"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00001000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="24847"/>
+ <usLastCharIndex value="39488"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w670.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w670.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w670.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w670.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x610f" name="cid01177"/><!-- CJK UNIFIED IDEOGRAPH-610F -->
+ <map code="0x9a40" name="cid07253"/><!-- CJK UNIFIED IDEOGRAPH-9A40 -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w670.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w670.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="23 -120 983 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w670.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w670.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid01177" fdSelectIndex="1">
+ 1000 -80 87 191 68 52 64 50 68 44 84 77 87 -84 142 -117 59 hstemhm
+ 174 102 12 104 53 108 96 92 -11 106 hintmask 1111100011111000
+ 288 149 rmoveto
+ 0 -113 rlineto
+ 0 -90 29 -26 121 0 rrcurveto
+ 24 0 121 0 26 0 rrcurveto
+ 91 0 29 28 12 113 rrcurveto
+ -28 6 -42 14 -22 14 rrcurveto
+ -5 -77 -6 -11 -39 0 rrcurveto
+ -29 0 -99 0 -22 0 rrcurveto
+ -48 0 -9 4 0 26 rrcurveto
+ 0 112 rlineto
+ -8 10 rmoveto
+ 59 -26 71 -42 34 -31 rrcurveto
+ 66 67 rlineto
+ -38 31 -73 39 -58 22 rrcurveto
+ 274 -95 rmoveto
+ 64 -54 70 -79 30 -54 rrcurveto
+ 89 52 rlineto
+ -33 56 -73 75 -64 51 rrcurveto
+ -638 -11 rmoveto
+ -24 -67 -46 -66 -65 -39 rrcurveto
+ 83 -57 rlineto
+ 73 46 41 75 28 76 rrcurveto
+ -141 664 rmoveto
+ 0 -84 rlineto
+ 772 0 rlineto
+ 0 84 rlineto
+ -819 -164 rmoveto
+ 0 -84 rlineto
+ 872 0 rlineto
+ 0 84 rlineto
+ hintmask 0000001000100000
+ -493 222 rmoveto
+ hintmask 0000000100100000
+ 0 -117 rlineto
+ 108 0 rlineto
+ hintmask 0000001000100000
+ 0 117 rlineto
+ hintmask 0111010010001000
+ -294 -145 rmoveto
+ 15 -30 14 -40 5 -26 rrcurveto
+ 102 24 rlineto
+ -6 25 -16 39 -16 28 rrcurveto
+ 285 1 rmoveto
+ -9 -27 -19 -38 -13 -28 rrcurveto
+ 95 -21 rlineto
+ 16 24 19 31 23 37 rrcurveto
+ -478 -386 rmoveto
+ 454 0 rlineto
+ 0 -52 rlineto
+ -454 0 rlineto
+ 0 166 rmoveto
+ 454 0 rlineto
+ 0 -50 rlineto
+ -454 0 rlineto
+ -102 118 rmoveto
+ 0 -302 rlineto
+ 662 0 rlineto
+ 0 302 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid07253" fdSelectIndex="1">
+ 1000 -89 66 44 75 -73 73 -71 71 -56 56 -29 29 -27 27 31 42 31 43 29 37 -37 52 33 70 -46 46 33 18 -18 55 -45 45 36 53 35 55 -24 132 -72 72 -72 120 hstemhm
+ 166 99 -55 101 -34 34 7 81 57 95 62 106 18 103 -44 34 hintmask 10000011101100101101000101110000
+ 57 802 rmoveto
+ 0 -72 rlineto
+ 886 0 rlineto
+ 0 72 rlineto
+ hintmask 00000000000000000000100000000000
+ -664 48 rmoveto
+ hintmask 00000000000000000010000000000000
+ 0 -180 rlineto
+ 105 0 rlineto
+ hintmask 00000000000000000000100000100000
+ 0 180 rlineto
+ 229 0 rmoveto
+ hintmask 00000000000000000010000000100000
+ 0 -180 rlineto
+ 106 0 rlineto
+ hintmask 00000000000100101100110000110000
+ 0 180 rlineto
+ -454 -299 rmoveto
+ 472 0 rlineto
+ 0 -36 rlineto
+ -472 0 rlineto
+ 0 124 rmoveto
+ 472 0 rlineto
+ 0 -35 rlineto
+ -472 0 rlineto
+ -99 90 rmoveto
+ 0 -234 rlineto
+ 674 0 rlineto
+ 0 234 rlineto
+ -797 -267 rmoveto
+ 0 -70 rlineto
+ 915 0 rlineto
+ 0 70 rlineto
+ hintmask 00000001100000000000000100000000
+ -681 -184 rmoveto
+ 0 -43 rlineto
+ 497 0 rlineto
+ 0 43 rlineto
+ -497 -74 rmoveto
+ 0 -42 rlineto
+ 508 0 rlineto
+ 0 42 rlineto
+ hintmask 00000010000000000000001000000000
+ -575 -73 rmoveto
+ hintmask 00001000000000000000001000001000
+ 0 -56 rlineto
+ 620 0 rlineto
+ hintmask 00000010000001000000000000001000
+ 0 56 rlineto
+ -499 390 rmoveto
+ -41 -98 -96 -93 -171 -59 rrcurveto
+ 19 -16 28 -35 10 -23 rrcurveto
+ hintmask 00000100010010010000000001000000
+ 186 73 105 107 58 128 rrcurveto
+ 274 -62 rmoveto
+ -78 -27 rlineto
+ 64 -93 112 -79 120 -37 rrcurveto
+ 13 25 28 36 21 19 rrcurveto
+ -114 26 -110 60 -56 70 rrcurveto
+ -247 -99 rmoveto
+ 0 -242 rlineto
+ 95 0 rlineto
+ 0 242 rlineto
+ hintmask 10000010000000000000000000001000
+ 245 -213 rmoveto
+ 0 -10 rlineto
+ -6 -64 -7 -28 -10 -9 rrcurveto
+ -6 -7 -6 -1 -10 0 rrcurveto
+ -10 0 -21 1 -25 2 rrcurveto
+ 10 -18 8 -31 1 -21 rrcurveto
+ 34 -1 32 0 18 2 rrcurveto
+ 21 1 17 6 15 14 rrcurveto
+ 18 18 10 38 9 75 rrcurveto
+ 2 12 1 21 0 0 rrcurveto
+ -714 -42 rmoveto
+ -16 -39 -32 -41 -41 -23 rrcurveto
+ 74 -45 rlineto
+ hintmask 10010000000000000000000000000000
+ 47 29 28 44 17 46 rrcurveto
+ hintmask 00100000000000000000000010000000
+ 46 -2 rmoveto
+ 10 -35 8 -46 0 -29 rrcurveto
+ 81 13 rlineto
+ -1 28 -9 46 -13 34 rrcurveto
+ hintmask 01000000000000000000000000100000
+ 60 -13 rmoveto
+ 22 -30 20 -42 8 -28 rrcurveto
+ 74 25 rlineto
+ -9 28 -22 40 -23 28 rrcurveto
+ hintmask 00010000001000000000001000000000
+ 73 -21 rmoveto
+ 24 -22 27 -32 12 -22 rrcurveto
+ 63 33 rlineto
+ -12 22 -29 30 -25 21 rrcurveto
+ -343 273 rmoveto
+ -48 -52 rlineto
+ 457 0 rlineto
+ 0 52 rlineto
+ -495 -37 rmoveto
+ hintmask 00000010000000000000001000000000
+ 0 -218 rlineto
+ hintmask 00000010001000000000000100000000
+ 101 0 rlineto
+ 0 257 rlineto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid01177" width="1000" lsb="29"/>
+ <mtx name="cid07253" width="1000" lsb="23"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid01177" height="1000" tsb="30"/>
+ <mtx name="cid07253" height="1000" tsb="30"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w799.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w799.00.ttx
new file mode 100644
index 00000000..cfccfa21
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w799.00.ttx
@@ -0,0 +1,393 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid13393"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0xb0503f01"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:07:57 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="69"/>
+ <yMin value="-120"/>
+ <xMax value="991"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="69"/>
+ <minRightSideBearing value="9"/>
+ <xMaxExtent value="991"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="2"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="978"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00100000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="63964"/>
+ <usLastCharIndex value="63964"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w799.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w799.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w799.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w799.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="28" language="0" nGroups="1">
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ <cmap_format_14 platformID="0" platEncID="5">
+ <map uv="0x9686" uvs="0xfe00" name="cid13393"/>
+ <map uv="0x9686" uvs="0xe0101" name="cid13393"/>
+ </cmap_format_14>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="28" language="0" nGroups="1">
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w799.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w799.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="69 -120 991 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w799.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w799.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid13393" fdSelectIndex="1">
+ 1000 -71 96 -48 48 50 85 -35 105 -23 86 -86 140 17 84 240 88 -34 34 -9 42 hstemhm
+ 69 107 88 108 -103 37 307 114 82 34 hintmask 1010101101110110
+ 552 776 rmoveto
+ 0 -88 rlineto
+ 291 0 rlineto
+ 0 88 rlineto
+ -382 -483 rmoveto
+ 0 -86 rlineto
+ 463 0 rlineto
+ 0 86 rlineto
+ -426 155 rmoveto
+ 0 -84 rlineto
+ 349 0 rlineto
+ 0 84 rlineto
+ -480 -423 rmoveto
+ 0 -96 rlineto
+ 597 0 rlineto
+ 0 96 rlineto
+ -516 135 rmoveto
+ 0 -85 rlineto
+ 456 0 rlineto
+ 0 85 rlineto
+ -95 616 rmoveto
+ 0 -16 rlineto
+ -72 -134 -195 -99 -195 -40 rrcurveto
+ 22 -23 25 -43 12 -27 rrcurveto
+ hintmask 0000000010000010
+ 213 54 207 110 96 184 rrcurveto
+ hintmask 0100010100000110
+ -74 39 rlineto
+ -18 -5 rlineto
+ -268 -57 rmoveto
+ -93 -34 rlineto
+ 94 -142 159 -95 200 -40 rrcurveto
+ 15 29 30 44 24 22 rrcurveto
+ -191 29 -160 77 -78 110 rrcurveto
+ 13 136 rmoveto
+ -38 -74 -73 -81 -110 -59 rrcurveto
+ 24 -16 36 -39 16 -25 rrcurveto
+ 123 76 80 93 58 104 rrcurveto
+ -235 -472 rmoveto
+ -21 -62 -36 -63 -46 -42 rrcurveto
+ 24 -13 41 -26 20 -16 rrcurveto
+ 46 48 45 76 26 74 rrcurveto
+ 58 9 rmoveto
+ 0 -370 rlineto
+ 114 0 rlineto
+ 0 370 rlineto
+ hintmask 0000000000101000
+ -658 462 rmoveto
+ 0 -902 rlineto
+ 107 0 rlineto
+ 0 792 rlineto
+ 130 0 rlineto
+ 0 110 rlineto
+ -37 0 rmoveto
+ 0 -36 rlineto
+ -14 -65 -32 -143 -29 -91 rrcurveto
+ hintmask 0001000000010000
+ 57 -68 13 -64 0 -46 rrcurveto
+ 0 -30 -5 -20 -12 -9 rrcurveto
+ -7 -6 -11 -3 -10 0 rrcurveto
+ -13 0 -13 0 -18 2 rrcurveto
+ 18 -30 9 -46 1 -29 rrcurveto
+ 23 -1 24 0 18 2 rrcurveto
+ 22 4 20 7 16 12 rrcurveto
+ 32 22 14 43 0 66 rrcurveto
+ 0 59 -13 70 -62 78 rrcurveto
+ hintmask 0000000001001000
+ 29 80 34 112 27 88 rrcurveto
+ hintmask 0000000000001000
+ -80 46 rlineto
+ -18 -4 rlineto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid13393" width="1000" lsb="69"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid13393" height="1000" tsb="25"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w800.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w800.00.ttx
new file mode 100644
index 00000000..765a381d
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w800.00.ttx
@@ -0,0 +1,393 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid13393"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0xab041b5d"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:08:04 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="69"/>
+ <yMin value="-120"/>
+ <xMax value="991"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="69"/>
+ <minRightSideBearing value="9"/>
+ <xMaxExtent value="991"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="2"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="978"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00100000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="63964"/>
+ <usLastCharIndex value="63964"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w800.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w800.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w800.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w800.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="28" language="0" nGroups="1">
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ <cmap_format_14 platformID="0" platEncID="5">
+ <map uv="0x9686" uvs="0xfe00" name="cid13393"/>
+ <map uv="0x9686" uvs="0xe0101" name="cid13393"/>
+ </cmap_format_14>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="28" language="0" nGroups="1">
+ <map code="0xf9dc" name="cid13393"/><!-- CJK COMPATIBILITY IDEOGRAPH-F9DC -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w800.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w800.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="69 -120 991 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w800.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w800.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid13393" fdSelectIndex="1">
+ 1000 -71 96 -27 27 50 85 -35 105 -23 86 -86 161 -8 84 248 88 -34 34 -13 42 hstemhm
+ 69 107 88 108 -103 37 307 114 82 34 hintmask 1010101101110110
+ 552 780 rmoveto
+ 0 -88 rlineto
+ 291 0 rlineto
+ 0 88 rlineto
+ -382 -487 rmoveto
+ 0 -86 rlineto
+ 463 0 rlineto
+ 0 86 rlineto
+ -426 151 rmoveto
+ 0 -84 rlineto
+ 349 0 rlineto
+ 0 84 rlineto
+ -480 -419 rmoveto
+ 0 -96 rlineto
+ 597 0 rlineto
+ 0 96 rlineto
+ -516 135 rmoveto
+ 0 -85 rlineto
+ 456 0 rlineto
+ 0 85 rlineto
+ -95 620 rmoveto
+ 0 -16 rlineto
+ -72 -134 -195 -99 -195 -40 rrcurveto
+ 22 -23 25 -43 12 -27 rrcurveto
+ hintmask 0000000010000010
+ 213 54 207 110 96 184 rrcurveto
+ hintmask 0100010100000110
+ -74 39 rlineto
+ -18 -5 rlineto
+ -268 -57 rmoveto
+ -93 -34 rlineto
+ 94 -142 159 -95 200 -40 rrcurveto
+ 15 29 30 44 24 22 rrcurveto
+ -191 29 -160 77 -78 110 rrcurveto
+ 13 132 rmoveto
+ -38 -74 -73 -81 -110 -59 rrcurveto
+ 24 -16 36 -39 16 -25 rrcurveto
+ 123 76 80 93 58 104 rrcurveto
+ -239 -466 rmoveto
+ -21 -62 -36 -63 -46 -42 rrcurveto
+ 24 -13 41 -27 20 -16 rrcurveto
+ 46 48 45 76 26 75 rrcurveto
+ 62 24 rmoveto
+ 0 -370 rlineto
+ 114 0 rlineto
+ 0 370 rlineto
+ hintmask 0000000000101000
+ -658 441 rmoveto
+ 0 -902 rlineto
+ 107 0 rlineto
+ 0 792 rlineto
+ 130 0 rlineto
+ 0 110 rlineto
+ -37 0 rmoveto
+ 0 -36 rlineto
+ -14 -65 -32 -143 -29 -91 rrcurveto
+ hintmask 0001000000010000
+ 57 -68 13 -64 0 -46 rrcurveto
+ 0 -30 -5 -20 -12 -9 rrcurveto
+ -7 -6 -11 -3 -10 0 rrcurveto
+ -13 0 -13 0 -18 2 rrcurveto
+ 18 -30 9 -46 1 -29 rrcurveto
+ 23 -1 24 0 18 2 rrcurveto
+ 22 4 20 7 16 12 rrcurveto
+ 32 22 14 43 0 66 rrcurveto
+ 0 59 -13 70 -62 78 rrcurveto
+ hintmask 0000000001001000
+ 29 80 34 112 27 88 rrcurveto
+ hintmask 0000000000001000
+ -80 46 rlineto
+ -18 -4 rlineto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid13393" width="1000" lsb="69"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid13393" height="1000" tsb="25"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w889.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w889.00.ttx
new file mode 100644
index 00000000..a90da39a
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w889.00.ttx
@@ -0,0 +1,473 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid06449"/>
+ <GlyphID id="2" name="cid22370"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0xe198766"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:08:11 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="30"/>
+ <yMin value="-120"/>
+ <xMax value="986"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="30"/>
+ <minRightSideBearing value="14"/>
+ <xMaxExtent value="986"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="3"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="978"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00001000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="34130"/>
+ <usLastCharIndex value="34216"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w889.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w889.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w889.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w889.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w889.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w889.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="30 -120 986 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w889.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w889.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid06449" fdSelectIndex="1">
+ 1000 -83 97 105 72 -22 22 34 18 -18 21.5 -21.5 83 -52 52 28 87 26 83 38 84 12 126 -106 106 -106 167 hstemhm
+ 63 118 -40 117 9 132 -50 104 -41 37 87 120 -111 105 -52 132 14 124 -51 125 -85 103 hintmask 110001011101011101101101
+ 50 792 rmoveto
+ 0 -106 rlineto
+ 901 0 rlineto
+ 0 106 rlineto
+ -800 -484 rmoveto
+ 0 -83 rlineto
+ 706 0 rlineto
+ 0 83 rlineto
+ hintmask 000000000000100100000000
+ -590 545 rmoveto
+ hintmask 000000000010000100000000
+ 0 -187 rlineto
+ 132 0 rlineto
+ hintmask 000000000000100100001000
+ 0 187 rlineto
+ 199 0 rmoveto
+ hintmask 000000000010000000001000
+ 0 -187 rlineto
+ 132 0 rlineto
+ hintmask 000000000000100000001000
+ 0 187 rlineto
+ hintmask 000000111100011010010100
+ -80 -283 rmoveto
+ 94 0 rlineto
+ 0 -38 rlineto
+ -94 0 rlineto
+ -197 38 rmoveto
+ 92 0 rlineto
+ 0 -38 rlineto
+ -92 0 rlineto
+ -195 38 rmoveto
+ 91 0 rlineto
+ 0 -38 rlineto
+ -91 0 rlineto
+ -117 122 rmoveto
+ 0 -205 rlineto
+ 727 0 rlineto
+ 0 205 rlineto
+ -805 -231 rmoveto
+ 0 -167 rlineto
+ 118 0 rlineto
+ 0 80 rlineto
+ hintmask 000000110000000000000010
+ 636 0 rlineto
+ 0 -80 rlineto
+ 125 0 rlineto
+ 0 167 rlineto
+ hintmask 000010000000000100000000
+ -666 -167 rmoveto
+ -41 -49 -74 -44 -109 -32 rrcurveto
+ 20 -15 29 -35 13 -23 rrcurveto
+ hintmask 010000000000000001000000
+ 124 45 82 56 57 78 rrcurveto
+ 35 -46 rmoveto
+ 0 -13 rlineto
+ -49 -109 -140 -55 -169 -19 rrcurveto
+ 18 -22 23 -42 8 -26 rrcurveto
+ hintmask 001000000000000001000000
+ 194 32 155 72 67 160 rrcurveto
+ hintmask 110100000000000001100001
+ -66 24 rlineto
+ -19 -2 rlineto
+ -258 -127 rmoveto
+ 30 -17 37 -31 20 -21 rrcurveto
+ 75 50 rlineto
+ -20 20 -37 27 -32 16 rrcurveto
+ 17 83 rmoveto
+ -72 -72 rlineto
+ 255 0 rlineto
+ 0 72 rlineto
+ 87 52 rmoveto
+ 0 -196 rlineto
+ 0 -100 29 -30 121 0 rrcurveto
+ 24 0 92 0 26 0 rrcurveto
+ 87 0 32 27 13 98 rrcurveto
+ -33 6 -46 17 -24 16 rrcurveto
+ -4 -56 -7 -11 -30 0 rrcurveto
+ -22 0 -75 0 -17 0 rrcurveto
+ -39 0 -7 5 0 29 rrcurveto
+ 0 195 rlineto
+ 164 -30 rmoveto
+ -56 -25 -96 -22 -86 -14 rrcurveto
+ 12 -21 14 -37 5 -22 rrcurveto
+ 95 12 114 21 84 33 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid22370" fdSelectIndex="1">
+ 1000 62 72 29 68 28 68 28 72 29 86 37 87 17 114 -95 95 -95 151 hstemhm
+ 116 117 -65 129 -23 128 -65 105 106 105 -60 130 -14 135 -83 124 hintmask 111111010011001100000000
+ 50 797 rmoveto
+ 0 -95 rlineto
+ 901 0 rlineto
+ 0 95 rlineto
+ hintmask 000000001001000000000000
+ -677 56 rmoveto
+ hintmask 000000100001000000000000
+ 0 -170 rlineto
+ 128 0 rlineto
+ hintmask 000000001001001000000000
+ 0 170 rlineto
+ 191 0 rmoveto
+ hintmask 000000100000001000000000
+ 0 -170 rlineto
+ 130 0 rlineto
+ hintmask 000000001000001000000000
+ 0 170 rlineto
+ hintmask 000011000100110010000000
+ -70 -274 rmoveto
+ 108 0 rlineto
+ 0 -37 rlineto
+ -108 0 rlineto
+ -211 37 rmoveto
+ 106 0 rlineto
+ 0 -37 rlineto
+ -106 0 rlineto
+ -209 37 rmoveto
+ 104 0 rlineto
+ 0 -37 rlineto
+ -104 0 rlineto
+ -117 124 rmoveto
+ 0 -210 rlineto
+ 769 0 rlineto
+ 0 210 rlineto
+ hintmask 111100000010000100000000
+ -588 -407 rmoveto
+ 412 0 rlineto
+ 0 -28 rlineto
+ -412 0 rlineto
+ 0 -68 rmoveto
+ 412 0 rlineto
+ 0 -29 rlineto
+ -412 0 rlineto
+ 0 221 rmoveto
+ 412 0 rlineto
+ 0 -28 rlineto
+ -412 0 rlineto
+ -129 100 rmoveto
+ 0 -365 rlineto
+ 676 0 rlineto
+ 0 365 rlineto
+ -302 -420 rmoveto
+ 110 -32 108 -41 59 -28 rrcurveto
+ 167 61 rlineto
+ -77 29 -134 43 -112 31 rrcurveto
+ -325 -1 rmoveto
+ -72 -33 -125 -29 -111 -16 rrcurveto
+ 27 -20 44 -44 22 -25 rrcurveto
+ 106 24 135 43 87 47 rrcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid06449" width="1000" lsb="50"/>
+ <mtx name="cid22370" width="1000" lsb="30"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid06449" height="1000" tsb="27"/>
+ <mtx name="cid22370" height="1000" tsb="27"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w890.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w890.00.ttx
new file mode 100644
index 00000000..a0aed4f5
--- /dev/null
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w890.00.ttx
@@ -0,0 +1,473 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="cid06449"/>
+ <GlyphID id="2" name="cid22370"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.002"/>
+ <checkSumAdjustment value="0x3deef2bc"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Thu Dec 13 12:08:19 2018"/>
+ <modified value="Tue Apr 16 22:17:21 2019"/>
+ <xMin value="30"/>
+ <yMin value="-120"/>
+ <xMax value="986"/>
+ <yMax value="880"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="30"/>
+ <minRightSideBearing value="14"/>
+ <xMaxExtent value="986"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="3"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="978"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00001000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBE"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="34130"/>
+ <usLastCharIndex value="34216"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00100000 00000010 00000000 10011111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w890.00
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.002;ADBE;MasterSet_Kanji-w890.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ SHSansJPVF w890.00
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.002;hotconv 1.0.109;makeotfexe 2.5.65596 DEVELOPMENT
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ MasterSet_Kanji-w890.00
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ </cmap_format_12>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="40" language="0" nGroups="2">
+ <map code="0x8552" name="cid22370"/><!-- CJK UNIFIED IDEOGRAPH-8552 -->
+ <map code="0x85a8" name="cid06449"/><!-- CJK UNIFIED IDEOGRAPH-85A8 -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="MasterSet_Kanji-w890.00">
+ <ROS Registry="Adobe" Order="Japan1" Supplement="6"/>
+ <Notice value="1997-2007, 2012 Adobe Systems Incorporated. All Rights Reserved. Kozuka Mincho is either a registered trademark or trademark of Adobe Systems Incorporated in the United States and/or other countries.&quot;"/>
+ <FullName value="Master Set Kanji w890.00"/>
+ <FamilyName value="Master Set Kanji"/>
+ <Weight value="ExtraLight"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="30 -120 986 880"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1119273886"/>
+ <CIDFontVersion value="6.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="23058"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="MasterSet_Kanji-w890.00-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="607"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="MasterSet_Kanji-w890.00-Kanji"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ 393 -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 hintmask 10111000
+ 100 -120 rmoveto
+ 800 0 rlineto
+ 0 1000 rlineto
+ -800 0 rlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 0 rlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ 0 -818 rlineto
+ -668 -41 rmoveto
+ 318 409 rlineto
+ 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 rlineto
+ -318 -409 rlineto
+ endchar
+ </CharString>
+ <CharString name="cid06449" fdSelectIndex="1">
+ 1000 -83 98 104 72 -22 22 34 18 -18 21.5 -21.5 83 -52 52 28 87 26 83 38 84 -7 145 -106 106 -106 167 hstemhm
+ 63 118 -40 117 9 132 -50 105 -42 37 87 120 -111 105 -52 132 14 124 -51 125 -85 103 hintmask 110001011101011101101101
+ 50 792 rmoveto
+ 0 -106 rlineto
+ 901 0 rlineto
+ 0 106 rlineto
+ -800 -484 rmoveto
+ 0 -83 rlineto
+ 706 0 rlineto
+ 0 83 rlineto
+ hintmask 000000000000100100000000
+ -590 545 rmoveto
+ hintmask 000000000010000100000000
+ 0 -206 rlineto
+ 132 0 rlineto
+ hintmask 000000000000100100001000
+ 0 206 rlineto
+ 199 0 rmoveto
+ hintmask 000000000010000000001000
+ 0 -206 rlineto
+ 132 0 rlineto
+ hintmask 000000000000100000001000
+ 0 206 rlineto
+ hintmask 000000111100011010010100
+ -80 -283 rmoveto
+ 94 0 rlineto
+ 0 -38 rlineto
+ -94 0 rlineto
+ -196 38 rmoveto
+ 91 0 rlineto
+ 0 -38 rlineto
+ -91 0 rlineto
+ -196 38 rmoveto
+ 91 0 rlineto
+ 0 -38 rlineto
+ -91 0 rlineto
+ -117 122 rmoveto
+ 0 -205 rlineto
+ 727 0 rlineto
+ 0 205 rlineto
+ -805 -231 rmoveto
+ 0 -167 rlineto
+ 118 0 rlineto
+ 0 80 rlineto
+ hintmask 000000110000000000000010
+ 636 0 rlineto
+ 0 -80 rlineto
+ 125 0 rlineto
+ 0 167 rlineto
+ hintmask 000010000000000100000000
+ -666 -167 rmoveto
+ -41 -49 -74 -44 -109 -32 rrcurveto
+ 20 -15 29 -35 13 -23 rrcurveto
+ hintmask 010000000000000001000000
+ 124 45 82 56 57 78 rrcurveto
+ 35 -46 rmoveto
+ 0 -13 rlineto
+ -49 -109 -140 -55 -169 -19 rrcurveto
+ 18 -22 23 -42 8 -26 rrcurveto
+ hintmask 001000000000000001000000
+ 194 32 155 72 67 160 rrcurveto
+ hintmask 110100000000000001100001
+ -66 24 rlineto
+ -19 -2 rlineto
+ -258 -127 rmoveto
+ 30 -17 37 -31 20 -21 rrcurveto
+ 75 50 rlineto
+ -20 20 -37 27 -32 16 rrcurveto
+ 17 83 rmoveto
+ -72 -72 rlineto
+ 255 0 rlineto
+ 0 72 rlineto
+ 87 52 rmoveto
+ 0 -196 rlineto
+ 0 -100 29 -30 121 0 rrcurveto
+ 24 0 92 0 26 0 rrcurveto
+ 87 0 32 27 13 98 rrcurveto
+ -33 6 -46 17 -24 16 rrcurveto
+ -4 -56 -7 -10 -31 0 rrcurveto
+ -21 0 -75 0 -17 0 rrcurveto
+ -39 0 -7 4 0 29 rrcurveto
+ 0 195 rlineto
+ 164 -30 rmoveto
+ -56 -25 -96 -22 -86 -14 rrcurveto
+ 12 -21 14 -37 5 -22 rrcurveto
+ 95 12 114 21 84 33 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid22370" fdSelectIndex="1">
+ 1000 62 72 29 68 28 68 28 72 29 86 37 87 -15 146 -95 95 -95 151 hstemhm
+ 116 118 -66 129 -23 128 -65 105 106 105 -60 130 -14 135 -83 124 hintmask 111111010011001100000000
+ 50 797 rmoveto
+ 0 -95 rlineto
+ 901 0 rlineto
+ 0 95 rlineto
+ hintmask 000000001001000000000000
+ -677 56 rmoveto
+ hintmask 000000100001000000000000
+ 0 -202 rlineto
+ 128 0 rlineto
+ hintmask 000000001001001000000000
+ 0 202 rlineto
+ 191 0 rmoveto
+ hintmask 000000100000001000000000
+ 0 -202 rlineto
+ 130 0 rlineto
+ hintmask 000000001000001000000000
+ 0 202 rlineto
+ hintmask 000011000100110010000000
+ -70 -274 rmoveto
+ 108 0 rlineto
+ 0 -37 rlineto
+ -108 0 rlineto
+ -211 37 rmoveto
+ 106 0 rlineto
+ 0 -37 rlineto
+ -106 0 rlineto
+ -208 37 rmoveto
+ 103 0 rlineto
+ 0 -37 rlineto
+ -103 0 rlineto
+ -118 124 rmoveto
+ 0 -210 rlineto
+ 769 0 rlineto
+ 0 210 rlineto
+ hintmask 111100000010000100000000
+ -588 -407 rmoveto
+ 412 0 rlineto
+ 0 -28 rlineto
+ -412 0 rlineto
+ 0 -68 rmoveto
+ 412 0 rlineto
+ 0 -29 rlineto
+ -412 0 rlineto
+ 0 221 rmoveto
+ 412 0 rlineto
+ 0 -28 rlineto
+ -412 0 rlineto
+ -129 100 rmoveto
+ 0 -365 rlineto
+ 676 0 rlineto
+ 0 365 rlineto
+ -302 -420 rmoveto
+ 110 -32 108 -41 59 -28 rrcurveto
+ 167 61 rlineto
+ -77 29 -134 43 -112 31 rrcurveto
+ -325 -1 rmoveto
+ -72 -33 -125 -29 -111 -16 rrcurveto
+ 27 -20 44 -44 22 -25 rrcurveto
+ 106 24 135 43 87 47 rrcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=0 -->
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=0 -->
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid06449" width="1000" lsb="50"/>
+ <mtx name="cid22370" width="1000" lsb="30"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="0"/>
+ <minBottomSideBearing value="0"/>
+ <yMaxExtent value="1000"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid06449" height="1000" tsb="27"/>
+ <mtx name="cid22370" height="1000" tsb="27"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_ttx_varfont_otf/TestCFF2VF.ttx b/Tests/varLib/data/master_ttx_varfont_otf/TestCFF2VF.ttx
new file mode 100644
index 00000000..c2a718ec
--- /dev/null
+++ b/Tests/varLib/data/master_ttx_varfont_otf/TestCFF2VF.ttx
@@ -0,0 +1,835 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="glyph00003"/>
+ <GlyphID id="4" name="dollar"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.01"/>
+ <checkSumAdjustment value="0xf8d4dd69"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Wed Oct 17 15:44:59 2018"/>
+ <modified value="Tue Nov 13 20:50:41 2018"/>
+ <xMin value="31"/>
+ <yMin value="-113"/>
+ <xMax value="569"/>
+ <yMax value="751"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="984"/>
+ <descent value="-273"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="600"/>
+ <minLeftSideBearing value="31"/>
+ <minRightSideBearing value="31"/>
+ <xMaxExtent value="569"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="5"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="600"/>
+ <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="291"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="9"/>
+ <bContrast value="3"/>
+ <bStrokeVariation value="4"/>
+ <bArmStyle value="3"/>
+ <bLetterForm value="2"/>
+ <bMidline value="2"/>
+ <bXHeight value="4"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="ADBO"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="36"/>
+ <usLastCharIndex value="84"/>
+ <sTypoAscender value="750"/>
+ <sTypoDescender value="-250"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="984"/>
+ <usWinDescent value="273"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="486"/>
+ <sCapHeight value="660"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="600" lsb="62"/>
+ <mtx name="A" width="600" lsb="31"/>
+ <mtx name="T" width="600" lsb="41"/>
+ <mtx name="dollar" width="600" lsb="85"/>
+ <mtx name="glyph00003" width="600" lsb="85"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ </cmap_format_4>
+ <cmap_format_6 platformID="1" platEncID="0" language="0">
+ <map code="0x24" name="dollar"/>
+ <map code="0x41" name="A"/>
+ <map code="0x54" name="T"/>
+ </cmap_format_6>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+ <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+ <map code="0x54" name="T"/><!-- LATIN CAPITAL LETTER T -->
+ </cmap_format_4>
+ </cmap>
+
+ <name>
+ <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ 1.010;ADBO;SourceCodeVariable-Roman
+ </namerecord>
+ <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Version 1.010;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SourceCodeVariable-Roman
+ </namerecord>
+ <namerecord nameID="17" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Roman
+ </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">
+ ExtraLight
+ </namerecord>
+ <namerecord nameID="258" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestCFF2Roman-ExtraLight
+ </namerecord>
+ <namerecord nameID="259" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Light
+ </namerecord>
+ <namerecord nameID="260" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestCFF2Roman-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">
+ TestCFF2Roman-Regular
+ </namerecord>
+ <namerecord nameID="263" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Medium
+ </namerecord>
+ <namerecord nameID="264" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestCFF2Roman-Medium
+ </namerecord>
+ <namerecord nameID="265" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Semibold
+ </namerecord>
+ <namerecord nameID="266" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestCFF2Roman-Semibold
+ </namerecord>
+ <namerecord nameID="267" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Bold
+ </namerecord>
+ <namerecord nameID="268" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestCFF2Roman-Bold
+ </namerecord>
+ <namerecord nameID="269" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Black
+ </namerecord>
+ <namerecord nameID="270" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ TestCFF2Roman-Black
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.010;ADBO;SourceCodeVariable-Roman
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Source Code Variable
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.010;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SourceCodeVariable-Roman
+ </namerecord>
+ <namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
+ Roman
+ </namerecord>
+ <namerecord nameID="256" platformID="3" platEncID="1" langID="0x409">
+ Weight
+ </namerecord>
+ <namerecord nameID="257" platformID="3" platEncID="1" langID="0x409">
+ ExtraLight
+ </namerecord>
+ <namerecord nameID="258" platformID="3" platEncID="1" langID="0x409">
+ TestCFF2Roman-ExtraLight
+ </namerecord>
+ <namerecord nameID="259" platformID="3" platEncID="1" langID="0x409">
+ Light
+ </namerecord>
+ <namerecord nameID="260" platformID="3" platEncID="1" langID="0x409">
+ TestCFF2Roman-Light
+ </namerecord>
+ <namerecord nameID="261" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="262" platformID="3" platEncID="1" langID="0x409">
+ TestCFF2Roman-Regular
+ </namerecord>
+ <namerecord nameID="263" platformID="3" platEncID="1" langID="0x409">
+ Medium
+ </namerecord>
+ <namerecord nameID="264" platformID="3" platEncID="1" langID="0x409">
+ TestCFF2Roman-Medium
+ </namerecord>
+ <namerecord nameID="265" platformID="3" platEncID="1" langID="0x409">
+ Semibold
+ </namerecord>
+ <namerecord nameID="266" platformID="3" platEncID="1" langID="0x409">
+ TestCFF2Roman-Semibold
+ </namerecord>
+ <namerecord nameID="267" platformID="3" platEncID="1" langID="0x409">
+ Bold
+ </namerecord>
+ <namerecord nameID="268" platformID="3" platEncID="1" langID="0x409">
+ TestCFF2Roman-Bold
+ </namerecord>
+ <namerecord nameID="269" platformID="3" platEncID="1" langID="0x409">
+ Black
+ </namerecord>
+ <namerecord nameID="270" platformID="3" platEncID="1" langID="0x409">
+ TestCFF2Roman-Black
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="1"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <BASE>
+ <Version value="0x00010000"/>
+ <HorizAxis>
+ <BaseTagList>
+ <!-- BaseTagCount=2 -->
+ <BaselineTag index="0" value="ideo"/>
+ <BaselineTag index="1" value="romn"/>
+ </BaseTagList>
+ <BaseScriptList>
+ <!-- BaseScriptCount=4 -->
+ <BaseScriptRecord index="0">
+ <BaseScriptTag value="DFLT"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="1">
+ <BaseScriptTag value="cyrl"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="2">
+ <BaseScriptTag value="grek"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ <BaseScriptRecord index="3">
+ <BaseScriptTag value="latn"/>
+ <BaseScript>
+ <BaseValues>
+ <DefaultIndex value="1"/>
+ <!-- BaseCoordCount=2 -->
+ <BaseCoord index="0" Format="1">
+ <Coordinate value="-170"/>
+ </BaseCoord>
+ <BaseCoord index="1" Format="1">
+ <Coordinate value="0"/>
+ </BaseCoord>
+ </BaseValues>
+ <!-- BaseLangSysCount=0 -->
+ </BaseScript>
+ </BaseScriptRecord>
+ </BaseScriptList>
+ </HorizAxis>
+ </BASE>
+
+ <CFF2>
+ <major value="2"/>
+ <minor value="0"/>
+ <CFFFont name="CFF2Font">
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FDArray>
+ <FontDict index="0">
+ <Private>
+ <BlueValues>
+ <blend value="-12 0 0"/>
+ <blend value="0 0 0"/>
+ <blend value="486 -8 14"/>
+ <blend value="498 0 0"/>
+ <blend value="574 4 -8"/>
+ <blend value="586 0 0"/>
+ <blend value="638 6 -10"/>
+ <blend value="650 0 0"/>
+ <blend value="656 2 -2"/>
+ <blend value="668 0 0"/>
+ <blend value="712 6 -10"/>
+ <blend value="724 0 0"/>
+ </BlueValues>
+ <OtherBlues>
+ <blend value="-217 -17 29"/>
+ <blend value="-205 0 0"/>
+ </OtherBlues>
+ <BlueScale value="0.0625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW>
+ <blend value="67 -39 67"/>
+ </StdHW>
+ <StdVW>
+ <blend value="85 -51 87"/>
+ </StdVW>
+ <Subrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ <CharString index="0">
+ 304 7 -12 1 blend
+ 34 rmoveto
+ 125 86 65 96 -22 38 2 -3 -9 15 -2 4 4 blend
+ hvcurveto
+ 183 -324 -21 110 1 -1 -14 22 -11 17 32 -54 4 blend
+ vvcurveto
+ 50 42 32 67 68 36 -21 -36 47 18 -29 15 -24 12 -21 18 -31 8 -13 -2 3 -3 5 -2 4 -3 5 9 blend
+ vhcurveto
+ 44 49 -24 40 -29 49 2 blend
+ rlineto
+ 44 -46 -54 33 -89 -6 8 5 -7 9 -15 -1 3 4 -8 5 blend
+ hhcurveto
+ -115 -81 -59 -94 16 -26 3 -7 5 -9 6 -10 4 blend
+ hvcurveto
+ -174 324 22 -124 8 -14 14 -22 6 -10 -32 56 4 blend
+ vvcurveto
+ -51 -42 -35 -78 -76 -62 31 37 -52 -19 31 -14 23 -15 25 -25 41 -9 15 -4 7 7 -11 -3 3 12 -20 9 blend
+ vhcurveto
+ -39 -58</CharString>
+ <CharString index="1">
+ 1 blend
+ hlineto
+ </CharString>
+ <CharString index="2">
+ 2 blend
+ rmoveto
+ </CharString>
+ </Subrs>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef">
+ 62 22 -38 1 blend
+ hmoveto
+ 476 -44 76 1 blend
+ 660 -476 44 -76 -106 callsubr
+ 109 -601 -61 103 -27 45 -105 callsubr
+ 73 131 54 102 29 -47 45 -75 10 -18 4 -6 4 blend
+ rlineto
+ 4 hlineto
+ 52 -102 73 -131 10 -16 -4 6 27 -47 -45 75 4 blend
+ rlineto
+ -300 52 -42 72 -10 16 -105 callsubr
+ 461 75 -125 1 blend
+ vlineto
+ 127 -232 27 -45 -38 64 2 blend
+ rlineto
+ 44 48 -22 36 -22 36 -105 callsubr
+ -50 93 -66 119 -6 10 -1 3 -28 48 49 -83 4 blend
+ rlineto
+ 234 68 -114 -106 callsubr
+ -65 -119 -49 -93 -29 47 -49 83 -5 9 1 -3 4 blend
+ rlineto
+ 44 -48 -22 36 22 -36 -105 callsubr
+ 126 232 26 -44 38 -64 2 blend
+ rlineto
+ -461 -75 125 1 blend
+ vlineto
+ </CharString>
+ <CharString name="A">
+ 31 19 -31 1 blend
+ hmoveto
+ 86 -54 90 -106 callsubr
+ 115 366 23 73 21 72 21 76 25 -42 30 -50 5 -9 7 -11 3 -4 -4 6 3 -7 6 -10 8 blend
+ rlinecurve
+ 4 hlineto
+ 20 -76 22 -72 23 -73 113 -366 4 -6 -6 10 2 -3 4 -6 5 -9 -7 11 25 -40 -30 50 8 blend
+ rcurveline
+ 90 -56 92 -106 callsubr
+ -221 656 -15 25 4 -6 2 blend
+ rlineto
+ -96 68 -112 -106 callsubr
+ -104 -457 -30 49 33 -55 -105 callsubr
+ 301 68 -301 -8 15 -40 65 8 -15 3 blend
+ hlineto
+ </CharString>
+ <CharString name="T">
+ 258 26 -44 1 blend
+ hmoveto
+ 84 585 217 71 -518 -71 217 -52 88 47 -79 17 -30 -43 73 18 -28 43 -73 17 -30 7 blend
+ hlineto
+ </CharString>
+ <CharString name="dollar">
+ -107 callsubr
+ 73 -26 73 -26 73 -27 21 -35 36 -58 -28 -8 -12 -28 0 28 -14 -2 18 -3 27 27 8 blend
+ rlinecurve
+ -24 566 6 -21 0 -34 -105 callsubr
+ 56 -26 56 -106 callsubr
+ 50 0 9 1 blend
+ 0 50 50 0 9 0 10 2 blend
+ vvcurveto
+ -56 26 -56 -106 callsubr
+ -50 0 -9 1 blend
+ 0 -50 -50 0 -9 0 -10 2 blend
+ vvcurveto
+ -562 0 102 1 blend
+ vmoveto
+ -148 56 148 0 -68 -26 56 0 68 3 blend
+ vlineto
+ </CharString>
+ <CharString name="glyph00003">
+ -107 callsubr
+ 21 -35 36 -58 2 blend
+ rlineto
+ -43 52 84 -36 83 5 -11 -7 13 -11 17 -4 8 8 -13 5 blend
+ hhcurveto
+ -51 -147 -19 32 1 -3 -105 callsubr
+ 159 857 -56 7 -159 -858 -1 1 3 -3 26 -44 -3 5 1 -1 -2 4 6 blend
+ rlineto
+ </CharString>
+ </CharStrings>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=2 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=1 -->
+ <VarData index="0">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=2 -->
+ <VarRegionIndex index="0" value="0"/>
+ <VarRegionIndex index="1" value="1"/>
+ </VarData>
+ </VarStore>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF2>
+
+ <GPOS>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=1 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="size"/>
+ <Feature>
+ <FeatureParamsSize>
+ <DesignSize value="10.0"/>
+ <SubfamilyID value="0"/>
+ <SubfamilyNameID value="0"/>
+ <RangeStart value="0.0"/>
+ <RangeEnd value="0.0"/>
+ </FeatureParamsSize>
+ <!-- LookupCount=0 -->
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=0 -->
+ </LookupList>
+ </GPOS>
+
+ <GSUB>
+ <Version value="0x00010001"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=2 -->
+ <FeatureIndex index="0" value="1"/>
+ <FeatureIndex index="1" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=2 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="rvrn"/>
+ <Feature>
+ <!-- LookupCount=0 -->
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="1">
+ <FeatureTag value="test"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=2 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="dollar" out="glyph00003"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="dollar" out="glyph00003"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ <FeatureVariations>
+ <Version value="0x00010000"/>
+ <!-- FeatureVariationCount=1 -->
+ <FeatureVariationRecord index="0">
+ <ConditionSet>
+ <!-- ConditionCount=1 -->
+ <ConditionTable index="0" Format="1">
+ <AxisIndex value="0"/>
+ <FilterRangeMinValue value="-1.0"/>
+ <FilterRangeMaxValue value="0.36707"/>
+ </ConditionTable>
+ </ConditionSet>
+ <FeatureTableSubstitution>
+ <Version value="0x00010000"/>
+ <!-- SubstitutionCount=1 -->
+ <SubstitutionRecord index="0">
+ <FeatureIndex value="0"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="1"/>
+ </Feature>
+ </SubstitutionRecord>
+ </FeatureTableSubstitution>
+ </FeatureVariationRecord>
+ </FeatureVariations>
+ </GSUB>
+
+ <HVAR>
+ <Version value="0x00010000"/>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=2 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=1 -->
+ <VarData index="0">
+ <!-- ItemCount=5 -->
+ <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="[]"/>
+ </VarData>
+ </VarStore>
+ </HVAR>
+
+ <MVAR>
+ <Version value="0x00010000"/>
+ <Reserved value="0"/>
+ <ValueRecordSize value="8"/>
+ <!-- ValueRecordCount=2 -->
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=2 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="-1.0"/>
+ <PeakCoord value="-1.0"/>
+ <EndCoord value="0.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=1 -->
+ <VarData index="0">
+ <!-- ItemCount=2 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=2 -->
+ <VarRegionIndex index="0" value="0"/>
+ <VarRegionIndex index="1" value="1"/>
+ <Item index="0" value="[-8, 14]"/>
+ <Item index="1" value="[-5, 9]"/>
+ </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="0x00010002"/>
+ <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>
+
+ <avar>
+ <segment axis="wght">
+ <mapping from="-1.0" to="-1.0"/>
+ <mapping from="-0.5" to="-0.7283"/>
+ <mapping from="0.0" to="0.0"/>
+ <mapping from="0.2" to="0.1867"/>
+ <mapping from="0.4" to="0.36707"/>
+ <mapping from="0.6" to="0.7215"/>
+ <mapping from="1.0" to="1.0"/>
+ </segment>
+ </avar>
+
+ <fvar>
+
+ <!-- Weight -->
+ <Axis>
+ <AxisTag>wght</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>200.0</MinValue>
+ <DefaultValue>400.0</DefaultValue>
+ <MaxValue>900.0</MaxValue>
+ <AxisNameID>256</AxisNameID>
+ </Axis>
+
+ <!-- ExtraLight -->
+ <!-- PostScript: TestCFF2Roman-ExtraLight -->
+ <NamedInstance flags="0x0" postscriptNameID="258" subfamilyNameID="257">
+ <coord axis="wght" value="200.0"/>
+ </NamedInstance>
+
+ <!-- Light -->
+ <!-- PostScript: TestCFF2Roman-Light -->
+ <NamedInstance flags="0x0" postscriptNameID="260" subfamilyNameID="259">
+ <coord axis="wght" value="300.0"/>
+ </NamedInstance>
+
+ <!-- Regular -->
+ <!-- PostScript: TestCFF2Roman-Regular -->
+ <NamedInstance flags="0x0" postscriptNameID="262" subfamilyNameID="261">
+ <coord axis="wght" value="400.0"/>
+ </NamedInstance>
+
+ <!-- Medium -->
+ <!-- PostScript: TestCFF2Roman-Medium -->
+ <NamedInstance flags="0x0" postscriptNameID="264" subfamilyNameID="263">
+ <coord axis="wght" value="500.0"/>
+ </NamedInstance>
+
+ <!-- Semibold -->
+ <!-- PostScript: TestCFF2Roman-Semibold -->
+ <NamedInstance flags="0x0" postscriptNameID="266" subfamilyNameID="265">
+ <coord axis="wght" value="600.0"/>
+ </NamedInstance>
+
+ <!-- Bold -->
+ <!-- PostScript: TestCFF2Roman-Bold -->
+ <NamedInstance flags="0x0" postscriptNameID="268" subfamilyNameID="267">
+ <coord axis="wght" value="700.0"/>
+ </NamedInstance>
+
+ <!-- Black -->
+ <!-- PostScript: TestCFF2Roman-Black -->
+ <NamedInstance flags="0x0" postscriptNameID="270" subfamilyNameID="269">
+ <coord axis="wght" value="900.0"/>
+ </NamedInstance>
+ </fvar>
+
+ <DSIG>
+ <!-- note that the Digital Signature will be invalid after recompilation! -->
+ <tableHeader flag="0x0" numSigs="0" version="1"/>
+ </DSIG>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_vvar_cff2/TestVVAR.0.ttx b/Tests/varLib/data/master_vvar_cff2/TestVVAR.0.ttx
new file mode 100644
index 00000000..7383c171
--- /dev/null
+++ b/Tests/varLib/data/master_vvar_cff2/TestVVAR.0.ttx
@@ -0,0 +1,821 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="uniFF20"/>
+ <GlyphID id="2" name="uniFF21"/>
+ <GlyphID id="3" name="uniFF41"/>
+ <GlyphID id="4" name="uni3042"/>
+ <GlyphID id="5" name="uni6280"/>
+ <GlyphID id="6" name="uni56FD"/>
+ <GlyphID id="7" name="c30719"/>
+ <GlyphID id="8" name="c30790"/>
+ <GlyphID id="9" name="c30816"/>
+ <GlyphID id="10" name="c30843"/>
+ <GlyphID id="11" name="c31621"/>
+ <GlyphID id="12" name="c32051"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.00299"/>
+ <checkSumAdjustment value="0xaa083de0"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Feb 19 17:21:59 2019"/>
+ <modified value="Tue Feb 19 17:21:59 2019"/>
+ <xMin value="19"/>
+ <yMin value="-83"/>
+ <xMax value="966"/>
+ <yMax value="840"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="19"/>
+ <minRightSideBearing value="23"/>
+ <xMaxExtent value="966"/>
+ <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>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="13"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="822"/>
+ <usWeightClass value="250"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="3"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="12354"/>
+ <usLastCharIndex value="65345"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Han Sans VVAR TEST
+ </namerecord>
+ <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ 1.003;UKWN;SHSansVVARTest_75-w0.00
+ </namerecord>
+ <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Han Sans VVAR TEST
+ </namerecord>
+ <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Version 1.003;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansVVARTest_75-w0.00
+ </namerecord>
+ <namerecord nameID="8" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Adobe Systems Co., Ltd.
+ </namerecord>
+ <namerecord nameID="9" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Ryoko Nishizuka
+ </namerecord>
+ <namerecord nameID="10" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Masataka HATTORI (variable font production)
+ </namerecord>
+ <namerecord nameID="11" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ http://www.adobe.com
+ </namerecord>
+ <namerecord nameID="17" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Master3
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Source Han Sans VVAR TEST
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.003;UKWN;SHSansVVARTest_75-w0.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Source Han Sans VVAR TEST
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.003;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SHSansVVARTest_75-w0.00
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Adobe Systems Co., Ltd.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Ryoko Nishizuka
+ </namerecord>
+ <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409">
+ Masataka HATTORI 服部正貴 (variable font production)
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.adobe.com
+ </namerecord>
+ <namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
+ Master3
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x3042" name="uni3042"/><!-- HIRAGANA LETTER A -->
+ <map code="0x56fd" name="uni56FD"/><!-- CJK UNIFIED IDEOGRAPH-56FD -->
+ <map code="0x6280" name="uni6280"/><!-- CJK UNIFIED IDEOGRAPH-6280 -->
+ <map code="0xff20" name="uniFF20"/><!-- FULLWIDTH COMMERCIAL AT -->
+ <map code="0xff21" name="uniFF21"/><!-- FULLWIDTH LATIN CAPITAL LETTER A -->
+ <map code="0xff41" name="uniFF41"/><!-- FULLWIDTH LATIN SMALL LETTER A -->
+ </cmap_format_4>
+ <cmap_format_6 platformID="1" platEncID="0" language="0">
+ </cmap_format_6>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x3042" name="uni3042"/><!-- HIRAGANA LETTER A -->
+ <map code="0x56fd" name="uni56FD"/><!-- CJK UNIFIED IDEOGRAPH-56FD -->
+ <map code="0x6280" name="uni6280"/><!-- CJK UNIFIED IDEOGRAPH-6280 -->
+ <map code="0xff20" name="uniFF20"/><!-- FULLWIDTH COMMERCIAL AT -->
+ <map code="0xff21" name="uniFF21"/><!-- FULLWIDTH LATIN CAPITAL LETTER A -->
+ <map code="0xff41" name="uniFF41"/><!-- FULLWIDTH LATIN SMALL LETTER A -->
+ </cmap_format_4>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="SHSansVVARTest_75-w0.00">
+ <version value="1.0"/>
+ <FamilyName value="SHSansVVARTest_75"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="19 -83 966 840"/>
+ <StrokeWidth value="0"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <Encoding name="StandardEncoding"/>
+ <Private>
+ <BlueValues value="0 0"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="857"/>
+ </Private>
+ <CharStrings>
+ <CharString name=".notdef">
+ -669 endchar
+ </CharString>
+ <CharString name="c30719">
+ 667 26 rmoveto
+ -12 22 rlineto
+ -47 -20 -60 -12 -73 0 rrcurveto
+ -168 0 -128 95 0 142 rrcurveto
+ 0 170 146 130 211 0 rrcurveto
+ 180 0 104 -93 0 -133 rrcurveto
+ 0 -100 -81 -70 -60 0 rrcurveto
+ -50 0 -17 22 22 78 rrcurveto
+ 49 166 rlineto
+ -31 9 -32 8 -47 0 rrcurveto
+ -150 0 -117 -98 0 -105 rrcurveto
+ 0 -65 58 -38 58 0 rrcurveto
+ 74 0 53 25 44 55 rrcurveto
+ 4 0 rlineto
+ -9 -60 39 -20 43 0 rrcurveto
+ 90 0 96 72 0 128 rrcurveto
+ 0 140 -120 103 -193 0 rrcurveto
+ -233 0 -168 -141 0 -184 rrcurveto
+ 0 -160 149 -102 182 0 rrcurveto
+ 70 0 67 11 57 25 rrcurveto
+ -23 379 rmoveto
+ -32 -109 rlineto
+ -20 -69 -71 -69 -88 0 rrcurveto
+ -62 0 -31 34 0 42 rrcurveto
+ 0 95 102 86 124 0 rrcurveto
+ 38 0 25 -5 15 -5 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="c30790">
+ 768 0 rmoveto
+ 37 0 rlineto
+ -297 546 rlineto
+ -35 0 rlineto
+ -296 -546 rlineto
+ 34 0 rlineto
+ 106 190 rlineto
+ 346 0 rlineto
+ 105 -190 rlineto
+ -439 217 rmoveto
+ 62 110 rlineto
+ 34 65 32 55 32 67 rrcurveto
+ 4 0 rlineto
+ 34 -67 30 -54 35 -66 rrcurveto
+ 61 -110 rlineto
+ -324 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="c30816">
+ 276 98 rmoveto
+ 0 -74 92 -33 92 0 rrcurveto
+ 80 0 83 33 62 36 rrcurveto
+ 2 0 rlineto
+ 4 -60 rlineto
+ 29 0 rlineto
+ 0 255 rlineto
+ 0 83 -54 68 -140 0 rrcurveto
+ -94 0 -93 -35 -37 -24 rrcurveto
+ 18 -25 rlineto
+ 40 23 81 32 83 0 rrcurveto
+ 128 0 34 -62 1 -67 rrcurveto
+ -290 -19 -121 -42 0 -89 rrcurveto
+ 35 2 rmoveto
+ 0 65 93 39 283 19 rrcurveto
+ 0 -131 rlineto
+ -79 -48 -75 -25 -70 0 rrcurveto
+ -74 0 -78 23 0 58 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="c30843">
+ 411 586 rmoveto
+ 0 -5 -1 -11 -1 -12 rrcurveto
+ -7 -56 -23 -131 0 -107 rrcurveto
+ 0 -83 26 -102 28 -67 rrcurveto
+ 28 10 rlineto
+ -29 66 -27 95 0 79 rrcurveto
+ 0 111 18 128 14 56 rrcurveto
+ 2 10 4 14 3 4 rrcurveto
+ -35 1 rlineto
+ -254 -92 rmoveto
+ 1 -31 rlineto
+ 35 -2 78 -2 33 0 rrcurveto
+ 147 0 184 11 152 19 rrcurveto
+ -1 29 rlineto
+ -124 -20 -198 -13 -161 0 rrcurveto
+ -25 0 -87 3 -34 6 rrcurveto
+ 513 -70 rmoveto
+ -1 -9 -3 -10 -2 -6 rrcurveto
+ -51 -139 -97 -93 -105 -65 rrcurveto
+ -69 -42 -62 -17 -53 0 rrcurveto
+ -42 0 -26 18 0 36 rrcurveto
+ 0 84 110 92 126 39 rrcurveto
+ 53 17 75 18 77 0 rrcurveto
+ 164 0 92 -72 0 -81 rrcurveto
+ 0 -117 -146 -66 -168 -14 rrcurveto
+ 18 -25 rlineto
+ 219 27 106 85 0 109 rrcurveto
+ 0 93 -99 84 -191 0 rrcurveto
+ -55 0 -80 -11 -67 -20 rrcurveto
+ -137 -43 -128 -101 0 -100 rrcurveto
+ 0 -52 42 -29 59 0 rrcurveto
+ 54 0 73 23 64 39 rrcurveto
+ 115 68 96 106 63 142 rrcurveto
+ 3 8 3 8 4 8 rrcurveto
+ -34 8 rlineto
+ endchar
+ </CharString>
+ <CharString name="c31621">
+ 389 497 rmoveto
+ 0 -26 rlineto
+ 554 0 rlineto
+ 0 26 rlineto
+ -554 0 rlineto
+ 23 -174 rmoveto
+ 0 -27 rlineto
+ 479 0 rlineto
+ 0 27 rlineto
+ -479 0 rlineto
+ 241 308 rmoveto
+ 0 -324 rlineto
+ 28 0 rlineto
+ 0 324 rlineto
+ -28 0 rlineto
+ -158 -332 rmoveto
+ -27 -9 rlineto
+ 80 -174 169 -123 229 -55 rrcurveto
+ 5 8 7 10 8 6 rrcurveto
+ -229 49 -166 122 -76 166 rrcurveto
+ 386 24 rmoveto
+ 0 -6 rlineto
+ -86 -194 -242 -117 -228 -43 rrcurveto
+ 7 -6 7 -11 3 -8 rrcurveto
+ 234 49 243 118 94 211 rrcurveto
+ -19 9 rlineto
+ -6 -2 rlineto
+ -7 0 rlineto
+ -854 -111 rmoveto
+ 14 -28 rlineto
+ 91 23 125 31 119 30 rrcurveto
+ -5 27 rlineto
+ -128 -33 -131 -31 -85 -19 rrcurveto
+ 15 254 rmoveto
+ 0 -26 rlineto
+ 325 0 rlineto
+ 0 26 rlineto
+ -325 0 rlineto
+ 164 164 rmoveto
+ 0 -650 rlineto
+ 0 -11 -6 -3 -13 0 rrcurveto
+ -13 -1 -43 0 -53 1 rrcurveto
+ 4 -8 6 -12 2 -7 rrcurveto
+ 64 0 34 1 18 4 rrcurveto
+ 19 5 9 10 0 22 rrcurveto
+ 0 649 rlineto
+ -28 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="c32051">
+ 231 479 rmoveto
+ 0 -26 rlineto
+ 546 0 rlineto
+ 0 26 rlineto
+ -546 0 rlineto
+ 30 -166 rmoveto
+ 0 -27 rlineto
+ 487 0 rlineto
+ 0 27 rlineto
+ -487 0 rlineto
+ -50 -190 rmoveto
+ 0 -26 rlineto
+ 592 0 rlineto
+ 0 26 rlineto
+ -592 0 rlineto
+ 270 348 rmoveto
+ 0 -362 rlineto
+ 28 0 rlineto
+ 0 362 rlineto
+ -28 0 rlineto
+ 124 -227 rmoveto
+ 46 -28 52 -40 25 -26 rrcurveto
+ 22 13 rlineto
+ -25 27 -52 38 -47 28 rrcurveto
+ -21 -12 rlineto
+ -518 347 rmoveto
+ 0 -653 rlineto
+ 29 0 rlineto
+ 0 627 rlineto
+ 771 0 rlineto
+ 0 -627 rlineto
+ 28 0 rlineto
+ 0 653 rlineto
+ -828 0 rlineto
+ 14 -588 rmoveto
+ 0 -26 rlineto
+ 799 0 rlineto
+ 0 26 rlineto
+ -799 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="uni3042">
+ -107 304 779 rmoveto
+ 0 -6 -1 -13 -1 -16 rrcurveto
+ -5 -73 -17 -177 0 -145 rrcurveto
+ 0 -105 19 -135 22 -89 rrcurveto
+ 30 9 rlineto
+ -22 88 -20 128 0 100 rrcurveto
+ 0 151 13 173 11 74 rrcurveto
+ 1 12 3 18 3 5 rrcurveto
+ -36 1 rlineto
+ -188 -126 rmoveto
+ 1 -33 rlineto
+ 27 -3 58 -3 27 0 rrcurveto
+ 110 0 142 16 111 25 rrcurveto
+ 0 31 rlineto
+ -95 -26 -144 -19 -125 0 rrcurveto
+ -21 0 -66 5 -25 7 rrcurveto
+ 382 -89 rmoveto
+ -1 -11 -2 -9 -3 -9 rrcurveto
+ -37 -188 -69 -128 -76 -89 rrcurveto
+ -51 -56 -47 -22 -39 0 rrcurveto
+ -30 0 -19 24 0 49 rrcurveto
+ 0 117 79 126 92 53 rrcurveto
+ 39 23 56 23 59 0 rrcurveto
+ 120 0 67 -98 0 -110 rrcurveto
+ 0 -162 -102 -88 -128 -18 rrcurveto
+ 18 -26 rlineto
+ 167 36 77 111 0 145 rrcurveto
+ 0 122 -78 112 -144 0 rrcurveto
+ -42 0 -61 -15 -50 -27 rrcurveto
+ -105 -57 -96 -133 0 -133 rrcurveto
+ 0 -67 34 -37 46 0 rrcurveto
+ 44 0 56 30 48 51 rrcurveto
+ 83 92 74 143 46 190 rrcurveto
+ 4 10 3 7 3 9 rrcurveto
+ -35 10 rlineto
+ endchar
+ </CharString>
+ <CharString name="uni56FD">
+ -107 175 638 rmoveto
+ 0 -28 rlineto
+ 404 0 rlineto
+ 0 28 rlineto
+ -404 0 rlineto
+ 22 -225 rmoveto
+ 0 -28 rlineto
+ 362 0 rlineto
+ 0 28 rlineto
+ -362 0 rlineto
+ -36 -254 rmoveto
+ 0 -29 rlineto
+ 437 0 rlineto
+ 0 29 rlineto
+ -437 0 rlineto
+ 196 470 rmoveto
+ 0 -487 rlineto
+ 30 0 rlineto
+ 0 487 rlineto
+ -30 0 rlineto
+ 95 -303 rmoveto
+ 33 -38 37 -54 17 -36 rrcurveto
+ 23 16 rlineto
+ -18 36 -37 52 -34 38 rrcurveto
+ -21 -14 rlineto
+ -388 460 rmoveto
+ 0 -868 rlineto
+ 31 0 rlineto
+ 0 841 rlineto
+ 562 0 rlineto
+ 0 -841 rlineto
+ 31 0 rlineto
+ 0 868 rlineto
+ -624 0 rlineto
+ 16 -788 rmoveto
+ 0 -27 rlineto
+ 590 0 rlineto
+ 0 27 rlineto
+ -590 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="uni6280">
+ -107 293 659 rmoveto
+ 0 -28 rlineto
+ 415 0 rlineto
+ 0 28 rlineto
+ -415 0 rlineto
+ 16 -233 rmoveto
+ 0 -28 rlineto
+ 355 0 rlineto
+ 0 28 rlineto
+ -355 0 rlineto
+ 177 414 rmoveto
+ 0 -432 rlineto
+ 31 0 rlineto
+ 0 432 rlineto
+ -31 0 rlineto
+ -108 -439 rmoveto
+ -29 -9 rlineto
+ 61 -235 124 -167 171 -73 rrcurveto
+ 5 8 9 11 8 6 rrcurveto
+ -169 66 -124 165 -56 228 rrcurveto
+ 276 25 rmoveto
+ 0 -7 rlineto
+ -62 -262 -176 -156 -173 -58 rrcurveto
+ 7 -5 8 -12 2 -9 rrcurveto
+ 180 66 178 156 69 278 rrcurveto
+ -20 11 rlineto
+ -6 -2 rlineto
+ -7 0 rlineto
+ -635 -150 rmoveto
+ 13 -28 rlineto
+ 68 30 95 43 89 40 rrcurveto
+ -5 28 rlineto
+ -96 -43 -99 -43 -65 -27 rrcurveto
+ 12 342 rmoveto
+ 0 -28 rlineto
+ 245 0 rlineto
+ 0 28 rlineto
+ -245 0 rlineto
+ 119 221 rmoveto
+ 0 -873 rlineto
+ 0 -15 -5 -4 -9 0 rrcurveto
+ -10 -1 -32 0 -39 1 rrcurveto
+ 5 -8 5 -12 2 -7 rrcurveto
+ 49 -1 26 1 16 5 rrcurveto
+ 16 6 6 10 0 26 rrcurveto
+ 0 872 rlineto
+ -30 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="uniFF20">
+ -107 501 35 rmoveto
+ -9 27 rlineto
+ -35 -29 -45 -16 -54 0 rrcurveto
+ -126 0 -96 130 0 189 rrcurveto
+ 0 226 111 176 155 0 rrcurveto
+ 135 0 77 -123 0 -181 rrcurveto
+ 0 -133 -60 -95 -44 0 rrcurveto
+ -34 0 -13 29 15 106 rrcurveto
+ 35 223 rlineto
+ -22 12 -26 9 -36 0 rrcurveto
+ -114 0 -86 -130 0 -141 rrcurveto
+ 0 -85 43 -51 45 0 rrcurveto
+ 54 0 40 34 32 75 rrcurveto
+ 3 0 rlineto
+ -6 -82 29 -27 34 0 rrcurveto
+ 71 0 72 95 0 172 rrcurveto
+ 0 185 -93 138 -146 0 rrcurveto
+ -176 0 -126 -187 0 -246 rrcurveto
+ 0 -213 113 -136 137 0 rrcurveto
+ 53 0 50 15 43 34 rrcurveto
+ -24 509 rmoveto
+ -22 -149 rlineto
+ -15 -95 -50 -94 -61 0 rrcurveto
+ -45 0 -23 46 0 58 rrcurveto
+ 0 128 73 119 89 0 rrcurveto
+ 26 0 18 -7 10 -6 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="uniFF21">
+ -107 569 0 rmoveto
+ 41 0 rlineto
+ -220 726 rlineto
+ -42 0 rlineto
+ -219 -726 rlineto
+ 38 0 rlineto
+ 75 260 rlineto
+ 253 0 rlineto
+ 74 -260 rlineto
+ -316 288 rmoveto
+ 42 153 rlineto
+ 25 87 24 73 23 89 rrcurveto
+ 3 0 rlineto
+ 25 -89 22 -71 25 -89 rrcurveto
+ 43 -153 rlineto
+ -232 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="uniFF41">
+ -107 202 128 rmoveto
+ 0 -99 68 -41 71 0 rrcurveto
+ 59 0 62 44 46 49 rrcurveto
+ 2 0 rlineto
+ 4 -81 rlineto
+ 31 0 rlineto
+ 0 341 rlineto
+ 0 106 -45 90 -106 0 rrcurveto
+ -71 0 -70 -48 -31 -30 rrcurveto
+ 17 -26 rlineto
+ 32 31 59 43 59 0 rrcurveto
+ 92 0 26 -87 2 -93 rrcurveto
+ -217 -26 -90 -56 0 -117 rrcurveto
+ 38 2 rmoveto
+ 0 90 65 53 204 26 rrcurveto
+ 0 -180 rlineto
+ -57 -68 -53 -33 -52 0 rrcurveto
+ -53 0 -54 30 0 82 rrcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=2 -->
+ <FeatureIndex index="0" value="0"/>
+ <FeatureIndex index="1" value="1"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=2 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="vert"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="1">
+ <FeatureTag value="vrt2"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="1"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=2 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="uni3042" out="c30843"/>
+ <Substitution in="uni56FD" out="c32051"/>
+ <Substitution in="uni6280" out="c31621"/>
+ <Substitution in="uniFF20" out="c30719"/>
+ <Substitution in="uniFF21" out="c30790"/>
+ <Substitution in="uniFF41" out="c30816"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="uni3042" out="c30843"/>
+ <Substitution in="uni56FD" out="c32051"/>
+ <Substitution in="uni6280" out="c31621"/>
+ <Substitution in="uniFF20" out="c30719"/>
+ <Substitution in="uniFF21" out="c30790"/>
+ <Substitution in="uniFF41" out="c30816"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="6"/>
+ <VOriginRecord>
+ <glyphName value="c30719"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c30790"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c30816"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c30843"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c31621"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c32051"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="188" lsb="0"/>
+ <mtx name="c30719" width="1000" lsb="142"/>
+ <mtx name="c30790" width="1000" lsb="177"/>
+ <mtx name="c30816" width="1000" lsb="276"/>
+ <mtx name="c30843" width="1000" lsb="128"/>
+ <mtx name="c31621" width="1000" lsb="27"/>
+ <mtx name="c32051" width="1000" lsb="87"/>
+ <mtx name="uni3042" width="750" lsb="92"/>
+ <mtx name="uni56FD" width="750" lsb="64"/>
+ <mtx name="uni6280" width="750" lsb="19"/>
+ <mtx name="uniFF20" width="750" lsb="105"/>
+ <mtx name="uniFF21" width="750" lsb="129"/>
+ <mtx name="uniFF41" width="750" lsb="202"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="29"/>
+ <minBottomSideBearing value="28"/>
+ <yMaxExtent value="963"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="8"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="880"/>
+ <mtx name="c30719" height="750" tsb="83"/>
+ <mtx name="c30790" height="750" tsb="114"/>
+ <mtx name="c30816" height="750" tsb="254"/>
+ <mtx name="c30843" height="750" tsb="74"/>
+ <mtx name="c31621" height="750" tsb="29"/>
+ <mtx name="c32051" height="750" tsb="69"/>
+ <mtx name="uni3042" height="1000" tsb="101"/>
+ <mtx name="uni56FD" height="1000" tsb="94"/>
+ <mtx name="uni6280" height="1000" tsb="40"/>
+ <mtx name="uniFF20" height="1000" tsb="112"/>
+ <mtx name="uniFF21" height="1000" tsb="154"/>
+ <mtx name="uniFF41" height="1000" tsb="343"/>
+ </vmtx>
+
+ <DSIG>
+ <!-- note that the Digital Signature will be invalid after recompilation! -->
+ <tableHeader flag="0x0" numSigs="0" version="1"/>
+ </DSIG>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_vvar_cff2/TestVVAR.1.ttx b/Tests/varLib/data/master_vvar_cff2/TestVVAR.1.ttx
new file mode 100644
index 00000000..f6020977
--- /dev/null
+++ b/Tests/varLib/data/master_vvar_cff2/TestVVAR.1.ttx
@@ -0,0 +1,821 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" 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="uniFF20"/>
+ <GlyphID id="2" name="uniFF21"/>
+ <GlyphID id="3" name="uniFF41"/>
+ <GlyphID id="4" name="uni3042"/>
+ <GlyphID id="5" name="uni6280"/>
+ <GlyphID id="6" name="uni56FD"/>
+ <GlyphID id="7" name="c30719"/>
+ <GlyphID id="8" name="c30790"/>
+ <GlyphID id="9" name="c30816"/>
+ <GlyphID id="10" name="c30843"/>
+ <GlyphID id="11" name="c31621"/>
+ <GlyphID id="12" name="c32051"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.00299"/>
+ <checkSumAdjustment value="0x1101e854"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Tue Feb 19 17:22:00 2019"/>
+ <modified value="Tue Feb 19 17:22:00 2019"/>
+ <xMin value="11"/>
+ <yMin value="-96"/>
+ <xMax value="987"/>
+ <yMax value="854"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-317"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="11"/>
+ <minRightSideBearing value="4"/>
+ <xMaxExtent value="987"/>
+ <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>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="13"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="822"/>
+ <usWeightClass value="900"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000100"/>
+ <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="228"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="10"/>
+ <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 00000000"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 00000000"/>
+ <usFirstCharIndex value="12354"/>
+ <usLastCharIndex value="65345"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="317"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="380"/>
+ <sCapHeight value="760"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="1"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Han Sans VVAR TEST
+ </namerecord>
+ <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ 1.003;UKWN;SHSansVVARTest_75-w1000.00
+ </namerecord>
+ <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Source Han Sans VVAR TEST
+ </namerecord>
+ <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Version 1.003;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SHSansVVARTest_75-w1000.00
+ </namerecord>
+ <namerecord nameID="8" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Adobe Systems Co., Ltd.
+ </namerecord>
+ <namerecord nameID="9" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Ryoko Nishizuka
+ </namerecord>
+ <namerecord nameID="10" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Masataka HATTORI (variable font production)
+ </namerecord>
+ <namerecord nameID="11" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ http://www.adobe.com
+ </namerecord>
+ <namerecord nameID="17" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Master4
+ </namerecord>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2018 Adobe systems Co., Ltd. All Rights Reserved.
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Source Han Sans VVAR TEST
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.003;UKWN;SHSansVVARTest_75-w1000.00
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Source Han Sans VVAR TEST
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.003;hotconv 1.0.109;makeotfexe 2.5.65596
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SHSansVVARTest_75-w1000.00
+ </namerecord>
+ <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409">
+ Adobe Systems Co., Ltd.
+ </namerecord>
+ <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409">
+ Ryoko Nishizuka
+ </namerecord>
+ <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409">
+ Masataka HATTORI 服部正貴 (variable font production)
+ </namerecord>
+ <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409">
+ http://www.adobe.com
+ </namerecord>
+ <namerecord nameID="17" platformID="3" platEncID="1" langID="0x409">
+ Master4
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x3042" name="uni3042"/><!-- HIRAGANA LETTER A -->
+ <map code="0x56fd" name="uni56FD"/><!-- CJK UNIFIED IDEOGRAPH-56FD -->
+ <map code="0x6280" name="uni6280"/><!-- CJK UNIFIED IDEOGRAPH-6280 -->
+ <map code="0xff20" name="uniFF20"/><!-- FULLWIDTH COMMERCIAL AT -->
+ <map code="0xff21" name="uniFF21"/><!-- FULLWIDTH LATIN CAPITAL LETTER A -->
+ <map code="0xff41" name="uniFF41"/><!-- FULLWIDTH LATIN SMALL LETTER A -->
+ </cmap_format_4>
+ <cmap_format_6 platformID="1" platEncID="0" language="0">
+ </cmap_format_6>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x3042" name="uni3042"/><!-- HIRAGANA LETTER A -->
+ <map code="0x56fd" name="uni56FD"/><!-- CJK UNIFIED IDEOGRAPH-56FD -->
+ <map code="0x6280" name="uni6280"/><!-- CJK UNIFIED IDEOGRAPH-6280 -->
+ <map code="0xff20" name="uniFF20"/><!-- FULLWIDTH COMMERCIAL AT -->
+ <map code="0xff21" name="uniFF21"/><!-- FULLWIDTH LATIN CAPITAL LETTER A -->
+ <map code="0xff41" name="uniFF41"/><!-- FULLWIDTH LATIN SMALL LETTER A -->
+ </cmap_format_4>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="SHSansVVARTest_75-w1000.00">
+ <version value="1.0"/>
+ <FamilyName value="SHSansVVARTest_75"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-100"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="11 -96 987 854"/>
+ <StrokeWidth value="0"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <Encoding name="StandardEncoding"/>
+ <Private>
+ <BlueValues value="0 0"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="0"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="857"/>
+ </Private>
+ <CharStrings>
+ <CharString name=".notdef">
+ -669 endchar
+ </CharString>
+ <CharString name="c30719">
+ 683 21 rmoveto
+ -20 52 rlineto
+ -46 -17 -62 -8 -59 0 rrcurveto
+ -170 0 -122 79 0 145 rrcurveto
+ 0 163 152 100 177 0 rrcurveto
+ 178 0 96 -86 0 -108 rrcurveto
+ 0 -100 -63 -45 -49 2 rrcurveto
+ -33 1 -9 22 12 47 rrcurveto
+ 35 160 rlineto
+ -29 12 -55 10 -50 0 rrcurveto
+ -164 0 -104 -95 0 -105 rrcurveto
+ 0 -72 54 -42 74 0 rrcurveto
+ 61 0 51 22 36 42 rrcurveto
+ 3 0 rlineto
+ 4 -42 38 -22 55 0 rrcurveto
+ 121 0 94 81 0 125 rrcurveto
+ 0 145 -142 105 -201 0 rrcurveto
+ -256 0 -171 -154 0 -174 rrcurveto
+ 0 -171 167 -103 188 0 rrcurveto
+ 80 0 60 8 69 23 rrcurveto
+ -98 352 rmoveto
+ -18 -78 rlineto
+ -10 -49 -46 -34 -44 0 rrcurveto
+ -38 0 -19 18 0 31 rrcurveto
+ 0 63 60 52 78 0 rrcurveto
+ 15 0 12 -1 10 -2 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="c30790">
+ 688 0 rmoveto
+ 179 0 rlineto
+ -266 562 rlineto
+ -207 0 rlineto
+ -261 -562 rlineto
+ 172 0 rlineto
+ 55 125 rlineto
+ 272 0 rlineto
+ 56 -125 rlineto
+ -293 232 rmoveto
+ 24 44 rlineto
+ 24 56 27 68 23 58 rrcurveto
+ 4 0 rlineto
+ 25 -56 28 -70 24 -56 rrcurveto
+ 23 -44 rlineto
+ -202 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="c30816">
+ 229 121 rmoveto
+ 0 -71 73 -59 114 0 rrcurveto
+ 74 0 72 25 57 30 rrcurveto
+ 5 0 rlineto
+ 11 -46 rlineto
+ 132 0 rlineto
+ 0 242 rlineto
+ 0 138 -96 61 -158 0 rrcurveto
+ -96 0 -91 -23 -77 -34 rrcurveto
+ 59 -92 rlineto
+ 62 25 56 14 57 0 rrcurveto
+ 78 0 40 -18 4 -34 rrcurveto
+ -270 -12 -106 -51 0 -95 rrcurveto
+ 154 12 rmoveto
+ 0 32 49 25 173 6 rrcurveto
+ 0 -63 rlineto
+ -42 -19 -45 -17 -51 0 rrcurveto
+ -50 0 -34 11 0 25 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="c30843">
+ 361 613 rmoveto
+ 1 -15 -2 -21 -2 -15 rrcurveto
+ -12 -81 -17 -104 0 -94 rrcurveto
+ 0 -120 29 -115 31 -68 rrcurveto
+ 126 33 rlineto
+ -34 78 -29 80 0 133 rrcurveto
+ 0 87 16 101 20 74 rrcurveto
+ 4 13 4 14 6 17 rrcurveto
+ -141 3 rlineto
+ -230 -68 rmoveto
+ 3 -107 rlineto
+ 48 -2 78 -3 55 0 rrcurveto
+ 152 0 213 10 136 19 rrcurveto
+ -1 108 rlineto
+ -157 -31 -145 -5 -193 0 rrcurveto
+ -66 0 -88 8 -35 3 rrcurveto
+ 490 -108 rmoveto
+ -1 -20 -8 -40 -7 -19 rrcurveto
+ -39 -92 -64 -56 -69 -45 rrcurveto
+ -60 -43 -67 -27 -47 0 rrcurveto
+ -32 0 -12 11 0 20 rrcurveto
+ 0 38 67 64 97 34 rrcurveto
+ 48 16 71 21 93 0 rrcurveto
+ 132 0 70 -47 0 -58 rrcurveto
+ 0 -58 -70 -76 -196 -17 rrcurveto
+ 73 -98 rlineto
+ 249 29 80 109 0 105 rrcurveto
+ 0 125 -143 81 -186 0 rrcurveto
+ -78 0 -82 -12 -65 -17 rrcurveto
+ -162 -44 -126 -113 0 -108 rrcurveto
+ 0 -84 64 -36 74 0 rrcurveto
+ 91 0 89 36 65 36 rrcurveto
+ 92 47 104 98 57 134 rrcurveto
+ 7 18 17 44 8 17 rrcurveto
+ -134 27 rlineto
+ endchar
+ </CharString>
+ <CharString name="c31621">
+ 399 539 rmoveto
+ 0 -104 rlineto
+ 554 0 rlineto
+ 0 104 rlineto
+ -554 0 rlineto
+ 16 -169 rmoveto
+ 0 -102 rlineto
+ 426 0 rlineto
+ 0 102 rlineto
+ -426 0 rlineto
+ 193 273 rmoveto
+ 0 -321 rlineto
+ 132 0 rlineto
+ 0 321 rlineto
+ -132 0 rlineto
+ -41 -370 rmoveto
+ -120 -33 rlineto
+ 91 -146 145 -105 217 -53 rrcurveto
+ 19 30 39 46 29 24 rrcurveto
+ -202 38 -147 87 -71 112 rrcurveto
+ 242 97 rmoveto
+ 0 -17 rlineto
+ -59 -167 -186 -106 -249 -42 rrcurveto
+ 25 -24 32 -50 13 -30 rrcurveto
+ 276 61 199 122 81 229 rrcurveto
+ -86 27 rlineto
+ -22 -3 rlineto
+ -24 0 rlineto
+ -792 -100 rmoveto
+ 31 -108 rlineto
+ 102 19 129 22 120 24 rrcurveto
+ -16 104 rlineto
+ -131 -24 -140 -23 -95 -14 rrcurveto
+ 17 238 rmoveto
+ 0 -105 rlineto
+ 349 0 rlineto
+ 0 105 rlineto
+ -349 0 rlineto
+ 122 134 rmoveto
+ 0 -596 rlineto
+ 0 -11 -5 -3 -14 0 rrcurveto
+ -13 0 -42 0 -37 1 rrcurveto
+ 16 -29 16 -45 4 -29 rrcurveto
+ 72 0 50 3 36 17 rrcurveto
+ 35 17 11 28 0 51 rrcurveto
+ 0 596 rlineto
+ -129 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="c32051">
+ 252 482 rmoveto
+ 0 -92 rlineto
+ 490 0 rlineto
+ 0 92 rlineto
+ -490 0 rlineto
+ 26 -138 rmoveto
+ 0 -89 rlineto
+ 443 0 rlineto
+ 0 89 rlineto
+ -443 0 rlineto
+ -36 -167 rmoveto
+ 0 -94 rlineto
+ 515 0 rlineto
+ 0 94 rlineto
+ -515 0 rlineto
+ 194 280 rmoveto
+ 0 -319 rlineto
+ 122 0 rlineto
+ 0 319 rlineto
+ -122 0 rlineto
+ 146 -225 rmoveto
+ 27 -22 32 -31 15 -18 rrcurveto
+ 87 41 rlineto
+ -16 18 -35 29 -27 20 rrcurveto
+ -83 -37 rlineto
+ -513 380 rmoveto
+ 0 -686 rlineto
+ 132 0 rlineto
+ 0 581 rlineto
+ 595 0 rlineto
+ 0 -581 rlineto
+ 137 0 rlineto
+ 0 686 rlineto
+ -864 0 rlineto
+ 77 -550 rmoveto
+ 0 -105 rlineto
+ 702 0 rlineto
+ 0 105 rlineto
+ -702 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="uni3042">
+ -107 260 812 rmoveto
+ 0 -18 -1 -26 -2 -20 rrcurveto
+ -10 -103 -11 -143 0 -129 rrcurveto
+ 0 -153 22 -150 23 -90 rrcurveto
+ 118 38 rlineto
+ -28 103 -21 110 0 166 rrcurveto
+ 0 121 12 139 15 96 rrcurveto
+ 4 16 3 18 6 22 rrcurveto
+ -130 3 rlineto
+ -168 -96 rmoveto
+ 3 -128 rlineto
+ 40 -2 58 -4 47 0 rrcurveto
+ 114 0 167 14 98 25 rrcurveto
+ -1 128 rlineto
+ -126 -39 -96 -8 -152 0 rrcurveto
+ -59 0 -66 9 -27 5 rrcurveto
+ 363 -137 rmoveto
+ -1 -23 -7 -48 -6 -23 rrcurveto
+ -27 -131 -41 -83 -43 -63 rrcurveto
+ -43 -57 -52 -35 -34 0 rrcurveto
+ -21 0 -6 16 0 30 rrcurveto
+ 0 60 41 91 66 47 rrcurveto
+ 34 22 53 26 74 0 rrcurveto
+ 92 0 47 -68 0 -82 rrcurveto
+ 0 -89 -35 -99 -154 -21 rrcurveto
+ 67 -117 rlineto
+ 194 37 53 141 0 142 rrcurveto
+ 0 160 -116 109 -138 0 rrcurveto
+ -64 0 -63 -16 -48 -23 rrcurveto
+ -127 -58 -94 -150 0 -142 rrcurveto
+ 0 -106 52 -46 61 0 rrcurveto
+ 75 0 70 46 50 48 rrcurveto
+ 65 66 78 134 42 179 rrcurveto
+ 6 23 16 51 7 20 rrcurveto
+ -123 32 rlineto
+ endchar
+ </CharString>
+ <CharString name="uni56FD">
+ -107 194 642 rmoveto
+ 0 -110 rlineto
+ 355 0 rlineto
+ 0 110 rlineto
+ -355 0 rlineto
+ 18 -190 rmoveto
+ 0 -106 rlineto
+ 323 0 rlineto
+ 0 106 rlineto
+ -323 0 rlineto
+ -23 -227 rmoveto
+ 0 -111 rlineto
+ 368 0 rlineto
+ 0 111 rlineto
+ -368 0 rlineto
+ 128 387 rmoveto
+ 0 -434 rlineto
+ 112 0 rlineto
+ 0 434 rlineto
+ -112 0 rlineto
+ 114 -300 rmoveto
+ 16 -31 20 -43 9 -26 rrcurveto
+ 80 49 rlineto
+ -11 26 -22 40 -15 28 rrcurveto
+ -77 -43 rlineto
+ -383 499 rmoveto
+ 0 -907 rlineto
+ 122 0 rlineto
+ 0 784 rlineto
+ 407 0 rlineto
+ 0 -784 rlineto
+ 127 0 rlineto
+ 0 907 rlineto
+ -656 0 rlineto
+ 72 -741 rmoveto
+ 0 -123 rlineto
+ 505 0 rlineto
+ 0 123 rlineto
+ -505 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="uni6280">
+ -107 301 710 rmoveto
+ 0 -123 rlineto
+ 416 0 rlineto
+ 0 123 rlineto
+ -416 0 rlineto
+ 10 -226 rmoveto
+ 0 -121 rlineto
+ 309 0 rlineto
+ 0 121 rlineto
+ -309 0 rlineto
+ 135 370 rmoveto
+ 0 -428 rlineto
+ 122 0 rlineto
+ 0 428 rlineto
+ -122 0 rlineto
+ -4 -486 rmoveto
+ -112 -37 rlineto
+ 72 -202 103 -143 160 -71 rrcurveto
+ 17 35 37 54 27 28 rrcurveto
+ -147 54 -106 123 -51 159 rrcurveto
+ 148 116 rmoveto
+ 0 -21 rlineto
+ -38 -227 -126 -145 -191 -56 rrcurveto
+ 22 -29 29 -58 12 -36 rrcurveto
+ 217 80 140 160 58 302 rrcurveto
+ -80 34 rlineto
+ -20 -4 rlineto
+ -23 0 rlineto
+ -579 -136 rmoveto
+ 27 -128 rlineto
+ 78 26 99 32 90 32 rrcurveto
+ -14 123 rlineto
+ -100 -33 -107 -33 -73 -19 rrcurveto
+ 13 320 rmoveto
+ 0 -123 rlineto
+ 267 0 rlineto
+ 0 123 rlineto
+ -267 0 rlineto
+ 82 185 rmoveto
+ 0 -805 rlineto
+ 0 -14 -4 -4 -10 -1 rrcurveto
+ -10 0 -31 0 -24 2 rrcurveto
+ 14 -34 15 -55 3 -34 rrcurveto
+ 56 0 41 4 30 20 rrcurveto
+ 31 21 8 32 0 63 rrcurveto
+ 0 805 rlineto
+ -119 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="uniFF20">
+ -107 516 29 rmoveto
+ -17 64 rlineto
+ -34 -24 -47 -12 -41 0 rrcurveto
+ -127 0 -92 109 0 192 rrcurveto
+ 0 219 116 140 126 0 rrcurveto
+ 132 0 70 -115 0 -151 rrcurveto
+ 0 -133 -42 -64 -35 2 rrcurveto
+ -21 0 -5 30 7 68 rrcurveto
+ 23 215 rlineto
+ -20 16 -49 12 -37 0 rrcurveto
+ -127 0 -74 -127 0 -140 rrcurveto
+ 0 -94 40 -55 58 0 rrcurveto
+ 44 0 36 30 25 59 rrcurveto
+ 3 0 rlineto
+ 6 -60 29 -29 43 0 rrcurveto
+ 98 0 70 105 0 169 rrcurveto
+ 0 191 -110 140 -154 0 rrcurveto
+ -198 0 -128 -202 0 -236 rrcurveto
+ 0 -224 129 -137 143 0 rrcurveto
+ 62 0 43 10 55 32 rrcurveto
+ -90 475 rmoveto
+ -11 -111 rlineto
+ -5 -69 -28 -52 -24 0 rrcurveto
+ -23 0 -12 27 0 44 rrcurveto
+ 0 90 37 76 47 0 rrcurveto
+ 7 0 5 -2 7 -3 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="uniFF21">
+ -107 498 0 rmoveto
+ 166 0 rlineto
+ -192 746 rlineto
+ -195 0 rlineto
+ -188 -746 rlineto
+ 162 0 rlineto
+ 29 179 rlineto
+ 187 0 rlineto
+ 31 -179 rlineto
+ -187 306 rmoveto
+ 10 73 rlineto
+ 15 76 20 87 16 80 rrcurveto
+ 3 0 rlineto
+ 15 -78 21 -89 15 -76 rrcurveto
+ 10 -73 rlineto
+ -125 0 rlineto
+ endchar
+ </CharString>
+ <CharString name="uniFF41">
+ -107 161 157 rmoveto
+ 0 -95 51 -74 91 0 rrcurveto
+ 53 0 52 34 42 43 rrcurveto
+ 3 0 rlineto
+ 11 -65 rlineto
+ 122 0 rlineto
+ 0 326 rlineto
+ 0 172 -81 82 -124 0 rrcurveto
+ -72 0 -68 -32 -66 -44 rrcurveto
+ 53 -108 rlineto
+ 51 32 37 22 37 0 rrcurveto
+ 48 0 30 -33 5 -52 rrcurveto
+ -199 -17 -76 -65 0 -126 rrcurveto
+ 143 13 rmoveto
+ 0 50 27 37 105 9 rrcurveto
+ 0 -96 rlineto
+ -24 -33 -27 -23 -35 0 rrcurveto
+ -30 0 -16 17 0 39 rrcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=1 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=2 -->
+ <FeatureIndex index="0" value="0"/>
+ <FeatureIndex index="1" value="1"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=2 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="vert"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="1">
+ <FeatureTag value="vrt2"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="1"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=2 -->
+ <Lookup index="0">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="uni3042" out="c30843"/>
+ <Substitution in="uni56FD" out="c32051"/>
+ <Substitution in="uni6280" out="c31621"/>
+ <Substitution in="uniFF20" out="c30719"/>
+ <Substitution in="uniFF21" out="c30790"/>
+ <Substitution in="uniFF41" out="c30816"/>
+ </SingleSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0" Format="1">
+ <Substitution in="uni3042" out="c30843"/>
+ <Substitution in="uni56FD" out="c32051"/>
+ <Substitution in="uni6280" out="c31621"/>
+ <Substitution in="uniFF20" out="c30719"/>
+ <Substitution in="uniFF21" out="c30790"/>
+ <Substitution in="uniFF41" out="c30816"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="6"/>
+ <VOriginRecord>
+ <glyphName value="c30719"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c30790"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c30816"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c30843"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c31621"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ <VOriginRecord>
+ <glyphName value="c32051"/>
+ <vOrigin value="660"/>
+ </VOriginRecord>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="188" lsb="0"/>
+ <mtx name="c30719" width="1000" lsb="119"/>
+ <mtx name="c30790" width="1000" lsb="133"/>
+ <mtx name="c30816" width="1000" lsb="229"/>
+ <mtx name="c30843" width="1000" lsb="87"/>
+ <mtx name="c31621" width="1000" lsb="17"/>
+ <mtx name="c32051" width="1000" lsb="69"/>
+ <mtx name="uni3042" width="750" lsb="56"/>
+ <mtx name="uni56FD" width="750" lsb="48"/>
+ <mtx name="uni6280" width="750" lsb="11"/>
+ <mtx name="uniFF20" width="750" lsb="84"/>
+ <mtx name="uniFF21" width="750" lsb="89"/>
+ <mtx name="uniFF41" width="750" lsb="161"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="17"/>
+ <minBottomSideBearing value="16"/>
+ <yMaxExtent value="976"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="8"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="880"/>
+ <mtx name="c30719" height="750" tsb="68"/>
+ <mtx name="c30790" height="750" tsb="98"/>
+ <mtx name="c30816" height="750" tsb="219"/>
+ <mtx name="c30843" height="750" tsb="47"/>
+ <mtx name="c31621" height="750" tsb="17"/>
+ <mtx name="c32051" height="750" tsb="48"/>
+ <mtx name="uni3042" height="1000" tsb="68"/>
+ <mtx name="uni56FD" height="1000" tsb="69"/>
+ <mtx name="uni6280" height="1000" tsb="26"/>
+ <mtx name="uniFF20" height="1000" tsb="94"/>
+ <mtx name="uniFF21" height="1000" tsb="134"/>
+ <mtx name="uniFF41" height="1000" tsb="300"/>
+ </vmtx>
+
+ <DSIG>
+ <!-- note that the Digital Signature will be invalid after recompilation! -->
+ <tableHeader flag="0x0" numSigs="0" version="1"/>
+ </DSIG>
+
+</ttFont>
diff --git a/Tests/varLib/data/test_results/BuildTestCFF2.ttx b/Tests/varLib/data/test_results/BuildTestCFF2.ttx
index a4e859f1..37ed3aaf 100644
--- a/Tests/varLib/data/test_results/BuildTestCFF2.ttx
+++ b/Tests/varLib/data/test_results/BuildTestCFF2.ttx
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<ttFont sfntVersion="OTTO" ttLibVersion="3.32">
+<ttFont sfntVersion="OTTO" ttLibVersion="3.38">
<fvar>
@@ -67,29 +67,29 @@
<BlueValues>
<blend value="-12 0 0"/>
<blend value="0 0 0"/>
- <blend value="486 -8 14"/>
+ <blend value="486 -8 -8"/>
<blend value="498 0 0"/>
- <blend value="574 4 -8"/>
+ <blend value="574 4 4"/>
<blend value="586 0 0"/>
- <blend value="638 6 -10"/>
+ <blend value="638 6 6"/>
<blend value="650 0 0"/>
- <blend value="656 2 -2"/>
+ <blend value="656 2 2"/>
<blend value="668 0 0"/>
- <blend value="712 6 -10"/>
+ <blend value="712 6 6"/>
<blend value="724 0 0"/>
</BlueValues>
<OtherBlues>
- <blend value="-217 -17 29"/>
+ <blend value="-217 -17 -17"/>
<blend value="-205 0 0"/>
</OtherBlues>
<BlueScale value="0.0625"/>
<BlueShift value="7"/>
<BlueFuzz value="0"/>
<StdHW>
- <blend value="67 -39.0 67.0"/>
+ <blend value="67 -39.0 -39.0"/>
</StdHW>
<StdVW>
- <blend value="85 -51.0 87.0"/>
+ <blend value="85 -51.0 -51.0"/>
</StdVW>
</Private>
</FontDict>
@@ -197,7 +197,7 @@
40 437 -40 -437 -18 31 12 -8 18 -31 -12 8 4 blend
hlineto
</CharString>
- <CharString name="glyph00003">
+ <CharString name="dollar.a">
304 7 -12 1 blend
34 rmoveto
125 86 65 96 -22 38 2 -3 -9 15 -2 4 4 blend
diff --git a/Tests/varLib/data/test_results/TestSparseCFF2VF.ttx b/Tests/varLib/data/test_results/TestSparseCFF2VF.ttx
new file mode 100644
index 00000000..442ae91e
--- /dev/null
+++ b/Tests/varLib/data/test_results/TestSparseCFF2VF.ttx
@@ -0,0 +1,1301 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" ttLibVersion="3.41">
+
+ <fvar>
+
+ <!-- Weight -->
+ <Axis>
+ <AxisTag>wght</AxisTag>
+ <Flags>0x0</Flags>
+ <MinValue>200.0</MinValue>
+ <DefaultValue>200.0</DefaultValue>
+ <MaxValue>900.0</MaxValue>
+ <AxisNameID>256</AxisNameID>
+ </Axis>
+
+ <!-- Kanji-w0.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w0.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="258" subfamilyNameID="257">
+ <coord axis="wght" value="200.0"/>
+ </NamedInstance>
+
+ <!-- Kanji-w239.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w239.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="260" subfamilyNameID="259">
+ <coord axis="wght" value="324.6875"/>
+ </NamedInstance>
+
+ <!-- Kanji-w240.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w240.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="262" subfamilyNameID="261">
+ <coord axis="wght" value="325.0"/>
+ </NamedInstance>
+
+ <!-- Kanji-w439.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w439.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="264" subfamilyNameID="263">
+ <coord axis="wght" value="428.82353"/>
+ </NamedInstance>
+
+ <!-- Kanji-w440.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w440.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="266" subfamilyNameID="265">
+ <coord axis="wght" value="429.41176"/>
+ </NamedInstance>
+
+ <!-- Kanji-w499.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w499.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="268" subfamilyNameID="267">
+ <coord axis="wght" value="464.11765"/>
+ </NamedInstance>
+
+ <!-- Kanji-w500.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w500.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="270" subfamilyNameID="269">
+ <coord axis="wght" value="464.70589"/>
+ </NamedInstance>
+
+ <!-- Kanji-w599.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w599.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="272" subfamilyNameID="271">
+ <coord axis="wght" value="535.45454"/>
+ </NamedInstance>
+
+ <!-- Kanji-w600.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w600.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="274" subfamilyNameID="273">
+ <coord axis="wght" value="536.36363"/>
+ </NamedInstance>
+
+ <!-- Kanji-w669.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w669.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="276" subfamilyNameID="275">
+ <coord axis="wght" value="599.09091"/>
+ </NamedInstance>
+
+ <!-- Kanji-w670.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w670.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="278" subfamilyNameID="277">
+ <coord axis="wght" value="600.0"/>
+ </NamedInstance>
+
+ <!-- Kanji-w699.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w699.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="280" subfamilyNameID="279">
+ <coord axis="wght" value="626.36363"/>
+ </NamedInstance>
+
+ <!-- Kanji-w700.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w700.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="282" subfamilyNameID="281">
+ <coord axis="wght" value="627.27272"/>
+ </NamedInstance>
+
+ <!-- Kanji-799.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-799.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="284" subfamilyNameID="283">
+ <coord axis="wght" value="717.27272"/>
+ </NamedInstance>
+
+ <!-- Kanji-w800.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w800.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="286" subfamilyNameID="285">
+ <coord axis="wght" value="718.18182"/>
+ </NamedInstance>
+
+ <!-- Kanji-w889.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w889.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="288" subfamilyNameID="287">
+ <coord axis="wght" value="799.09091"/>
+ </NamedInstance>
+
+ <!-- Kanji-w890.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w890.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="290" subfamilyNameID="289">
+ <coord axis="wght" value="800.0"/>
+ </NamedInstance>
+
+ <!-- Kanji-w1000.00 -->
+ <!-- PostScript: SHSansJPVFTest-Kanji-w1000.00 -->
+ <NamedInstance flags="0x0" postscriptNameID="292" subfamilyNameID="291">
+ <coord axis="wght" value="900.0"/>
+ </NamedInstance>
+ </fvar>
+
+ <CFF2>
+ <major value="2"/>
+ <minor value="0"/>
+ <CFFFont name="CFF2Font">
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="0"/>
+ <StdHW value="1"/>
+ <StdVW value="1"/>
+ </Private>
+ </FontDict>
+ <FontDict index="2">
+ <Private>
+ <BlueValues value="0 0"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ -120 50 859 91 -50 50 hstemhm
+ 100 50 700 50 vstemhm
+ hintmask 10111000
+ 100 -120 rmoveto
+ 800 1000 -800 hlineto
+ 400 -459 rmoveto
+ -318 409 rlineto
+ 636 hlineto
+ -286 -450 rmoveto
+ hintmask 11011000
+ 318 409 rlineto
+ -818 vlineto
+ -668 -41 rmoveto
+ 318 409 318 -409 rlineto
+ -668 859 rmoveto
+ 318 -409 -318 -409 rlineto
+ </CharString>
+ <CharString name="cid00001" fdSelectIndex="2">
+ </CharString>
+ <CharString name="cid00002" fdSelectIndex="2">
+ -12 83 1 126 2 blend
+ hstemhm
+ 74 73 -57 40 -26 129 -125 122 4 blend
+ vstemhm
+ hintmask 10100000
+ 134 755 107 18 2 blend
+ rmoveto
+ -48 -137 1 blend
+ hlineto
+ 8 -565 16 50 2 blend
+ rlineto
+ 32 106 1 blend
+ hlineto
+ hintmask 11000000
+ -17 -202 -52 -67 2 blend
+ rmoveto
+ 24 14 18 22 25 -14 18 -22 -23 -14 -21 -24 -18 13 -20 22 38 25 26 38 37 -28 25 -37 -34 -30 -22 -38 -40 27 -26 39 16 blend
+ hvcurveto
+ </CharString>
+ <CharString name="cid01177" fdSelectIndex="1">
+ 1 vsindex
+ -72 30 253 30 94 30 92 30 65 30 131 45 -30 112 -99 17 -8 0 -12 59 -2 85 -64 2 -92 39 -1 56 -44 2 -63 35 -1 51 -43 1 -62 39 -1 56 -21 0 -31 56 -2 81 -56 2 -81 44 -2 63 -57 3 -81 31 -1 45 -18 0 -27 44 -2 63 16 blend
+ hstemhm
+ 193 30 83 30 147 30 173 30 66 30 -20 1 -28 75 -3 107 -74 3 -106 78 -4 111 -99 5 -141 81 -3 116 -79 2 -114 64 -2 92 -81 4 -115 80 -4 114 10 blend
+ vstemhm
+ hintmask 1111100011111000
+ 306 142 -19 1 -27 7 0 10 2 blend
+ rmoveto
+ -156 45 -2 64 1 blend
+ vlineto
+ -50 22 -8 79 -42 2 -59 8 -1 11 -18 0 -27 43 -1 62 4 blend
+ vhcurveto
+ 17 186 8 -1 11 -68 3 -97 2 blend
+ 0 18 8 0 12 1 blend
+ hhcurveto
+ 70 13 25 114 5 22 -1 31 17 -1 24 2 1 4 0 -1 -1 7 0 10 5 blend
+ hvcurveto
+ -9 3 -12 4 -9 6 -20 1 -28 3 0 4 -31 1 -45 10 0 15 -13 0 -19 9 -1 13 6 blend
+ rrcurveto
+ -109 -4 -7 -13 -49 -38 -156 33 -1 47 -1 0 -1 1 0 1 2 0 3 10 0 15 9 0 13 60 -3 85 7 blend
+ 0 -27 5 0 8 1 blend
+ hhcurveto
+ -59 -10 5 22 11 0 16 2 -1 2 -1 0 -2 4 0 6 4 blend
+ hvcurveto
+ 157 -47 2 -67 1 blend
+ vlineto
+ 63 34 -74 3 -106 -25 1 -36 2 blend
+ rmoveto
+ 65 -30 74 -47 37 -37 -7 1 -10 5 -1 7 -3 0 -4 5 0 7 -3 0 -4 6 0 9 6 blend
+ rrcurveto
+ 20 22 -37 36 -75 47 -65 28 48 -2 68 47 -2 67 -1 0 -1 -6 1 -8 2 0 3 -8 0 -11 8 -1 11 -6 0 -9 8 blend
+ rlinecurve
+ 320 -64 -49 3 -69 -32 1 -46 2 blend
+ rmoveto
+ 76 -49 83 -75 38 -12 0 -18 -6 1 -8 -13 0 -19 -4 0 -6 -9 1 -12 5 blend
+ -54 rrcurveto
+ 23 19 -38 54 -84 73 -76 49 69 -3 98 35 -2 50 5 0 8 2 0 3 11 0 16 2 0 2 13 -1 18 2 0 4 8 blend
+ rlinecurve
+ -557 -5 -85 4 -121 -6 0 -9 2 blend
+ rmoveto
+ -28 -68 -50 -72 -77 -40 5 -1 6 1 0 1 3 1 5 6 0 9 13 -1 18 1 0 1 6 blend
+ rrcurveto
+ 24 -17 79 42 47 74 31 71 62 -3 89 -42 2 -60 -7 1 -10 5 -1 7 -6 0 -8 1 0 1 -2 -1 -4 4 1 7 8 blend
+ rlinecurve
+ -117 625 -26 2 -36 42 -3 59 2 blend
+ rmoveto
+ -30 775 30 -57 3 -81 -3 0 -5 57 -3 81 3 blend
+ vlineto
+ -818 -176 -1 0 -2 12 0 18 2 blend
+ rmoveto
+ -30 869 30 -56 2 -81 3 0 5 56 -2 81 3 blend
+ vlineto
+ hintmask 0000001000100000
+ -455 258 -40 2 -57 -38 2 -54 2 blend
+ rmoveto
+ hintmask 0000000100100000
+ -99 30 -18 0 -27 81 -3 116 2 blend
+ vlineto
+ hintmask 0000001000100000
+ 99 18 0 27 1 blend
+ vlineto
+ hintmask 0111010010001000
+ -236 -127 -60 2 -86 -18 0 -27 2 blend
+ rmoveto
+ 26 -40 25 -53 9 -36 -12 1 -17 10 0 15 -10 -1 -15 13 0 19 -4 0 -6 11 -1 15 6 blend
+ rrcurveto
+ 29 12 -10 35 -25 53 -27 39 76 -3 109 12 0 18 3 1 5 -10 0 -15 10 -1 14 -15 1 -21 11 0 16 -11 0 -16 8 blend
+ rlinecurve
+ 393 2 -112 4 -161 -1 0 -2 2 blend
+ rmoveto
+ -16 -38 -31 -57 -23 -35 7 0 11 12 -1 17 13 -1 18 19 0 28 10 0 14 8 -1 11 6 blend
+ rrcurveto
+ 27 -12 24 36 26 48 23 46 70 -2 101 -10 1 -14 -8 0 -12 -13 1 -18 -6 -1 -9 -17 0 -25 -1 1 -1 -10 1 -14 8 blend
+ rlinecurve
+ -504 -378 27 -1 39 -8 0 -12 2 blend
+ rmoveto
+ 559 -94 -559 -110 5 -157 44 -2 63 110 -5 157 3 blend
+ hlineto
+ 216 -52 2 -74 1 blend
+ vmoveto
+ 559 -92 -559 -110 5 -157 43 -1 62 110 -5 157 3 blend
+ hlineto
+ -30 122 -75 3 -107 -4 0 -6 2 blend
+ rmoveto
+ -276 619 276 -26 0 -38 45 -2 64 26 0 38 3 blend
+ vlineto
+ </CharString>
+ <CharString name="cid06449" fdSelectIndex="1">
+ 2 vsindex
+ -60 30 203 30 -9 9 67 7 -7 14 -14 30 -20 20 80 30 59 30 121 30 18 93 -30 30 -30 108 -23 0 -26 67 2 76 -98 -2 -111 42 0 47 -13 0 -14 13 0 14 -33 0 -37 11 0 13 -11 0 -13 8 0 9 -7 0 -8 53 0 60 -32 0 -36 32 0 36 -52 0 -59 57 1 65 -33 0 -38 53 0 60 -83 -1 -93 54 0 60 -6 -19 -24 33 19 55 -76 -1 -86 76 1 86 -76 -1 -86 59 1 67 26 blend
+ hstemhm
+ 77 30 42 30 139 30 23 30 71 10 74 30 15 30 16 30 158 30 28 30 -4 29 -14 0 -16 88 1 99 -82 -1 -92 87 1 98 -130 -1 -146 102 1 114 -73 -1 -82 74 2 84 -112 -2 -126 27 0 30 13 0 15 90 1 101 -126 -1 -142 75 1 84 -68 -1 -76 102 1 115 -144 -1 -162 94 1 105 -79 -1 -88 95 1 106 -81 -1 -91 74 1 83 22 blend
+ vstemhm
+ hintmask 110001011101011101101101
+ 53 761 -3 0 -3 31 0 35 2 blend
+ rmoveto
+ -30 896 30 -76 -1 -86 5 0 5 76 1 86 3 blend
+ vlineto
+ -802 -461 2 0 2 -23 0 -26 2 blend
+ rmoveto
+ -30 703 30 -53 0 -60 3 0 4 53 0 60 3 blend
+ vlineto
+ hintmask 000000000000100100000000
+ -532 539 -58 -1 -65 6 0 7 2 blend
+ rmoveto
+ hintmask 000000000010000100000000
+ -171 30 -16 -19 -36 102 1 114 2 blend
+ vlineto
+ hintmask 000000000000100100001000
+ 171 16 19 36 1 blend
+ vlineto
+ 299 -100 -1 -112 1 blend
+ hmoveto
+ hintmask 000000000010000000001000
+ -171 30 -16 -19 -36 102 1 115 2 blend
+ vlineto
+ hintmask 000000000000100000001000
+ 171 16 19 36 1 blend
+ vlineto
+ hintmask 000000111100011010010100
+ -46 -219 -34 0 -39 -64 -1 -72 2 blend
+ rmoveto
+ 204 -121 -204 -110 -1 -123 83 1 93 110 1 123 3 blend
+ hlineto
+ -230 121 33 1 38 -83 -1 -93 2 blend
+ rmoveto
+ 200 -121 -200 -108 -2 -122 83 1 93 108 2 122 3 blend
+ hlineto
+ -222 121 27 -1 30 -83 -1 -93 2 blend
+ rmoveto
+ 192 -121 -192 -101 -1 -114 83 1 93 101 1 114 3 blend
+ hlineto
+ -30 151 -87 -1 -98 -29 0 -33 2 blend
+ rmoveto
+ -181 716 181 -24 0 -27 11 0 12 24 0 27 3 blend
+ vlineto
+ -788 -240 -17 0 -19 9 0 11 2 blend
+ rmoveto
+ -130 30 100 -37 0 -42 88 1 99 -20 0 -23 3 blend
+ vlineto
+ hintmask 000000110000000000000010
+ 786 -100 30 130 -150 -1 -168 20 0 23 95 1 106 37 0 42 4 blend
+ hlineto
+ hintmask 000010000000000100000000
+ -610 -123 -56 -1 -63 -44 0 -50 2 blend
+ rmoveto
+ -50 -62 -93 -73 -118 -54 8 -4 10 -9 6 -7 9 0 11 13 0 15 19 0 21 29 0 32 9 0 10 22 0 25 12 0 14 -11 0 -12 19 0 21 -26 0 -30 7 0 8 -16 0 -18 12 blend
+ rrcurveto
+ hintmask 010000000000000001000000
+ 121 58 92 75 59 70 3 0 3 -13 0 -14 -10 0 -11 -19 0 -21 -2 0 -2 8 0 8 6 blend
+ rrcurveto
+ 124 -78 -89 -1 -100 32 0 36 2 blend
+ rmoveto
+ -7 -6 0 -6 1 blend
+ vlineto
+ -65 -139 -176 -81 -162 -31 6 -6 8 -12 3 -8 16 0 17 30 0 34 36 0 41 26 0 29 -7 0 -8 12 0 13 12 0 14 -16 0 -18 15 0 16 -30 0 -33 5 0 6 -18 0 -21 12 blend
+ rrcurveto
+ hintmask 001000000000000001000000
+ 168 37 178 84 72 154 26 0 29 -5 0 -5 -23 0 -26 -12 0 -14 -5 0 -5 6 0 7 6 blend
+ rrcurveto
+ hintmask 110100000000000001100001
+ -19 11 -6 -2 -47 0 -53 13 0 15 -13 0 -15 0 0 -1 4 blend
+ rlineto
+ -333 -72 75 1 85 -55 0 -61 2 blend
+ rmoveto
+ 65 -25 75 -46 38 -35 -35 0 -40 8 0 9 -38 0 -42 15 0 17 -18 0 -21 14 0 15 6 blend
+ rrcurveto
+ 26 19 -39 34 -76 45 -64 25 49 0 56 31 0 35 19 0 21 -14 0 -16 39 0 44 -18 0 -20 32 0 36 -9 0 -10 8 blend
+ rlinecurve
+ 72 55 -55 0 -62 28 0 31 2 blend
+ rmoveto
+ -30 -30 -42 0 -47 -42 0 -47 2 blend
+ rlineto
+ 269 30 -14 0 -16 42 0 47 2 blend
+ hlineto
+ 74 74 13 0 15 -22 0 -24 2 blend
+ rmoveto
+ -276 80 1 90 1 blend
+ vlineto
+ -52 21 -9 77 -48 0 -54 8 0 9 -21 0 -24 44 0 49 4 blend
+ vhcurveto
+ 16 182 8 0 9 -90 -1 -101 2 blend
+ 0 18 8 0 9 1 blend
+ hhcurveto
+ 62 12 21 88 4 25 0 28 20 0 22 6 0 7 10 0 11 9 0 10 5 blend
+ hvcurveto
+ -9 2 -12 5 -8 6 -24 0 -26 4 0 5 -34 0 -39 12 0 13 -16 0 -18 10 0 11 6 blend
+ rrcurveto
+ -81 25 0 28 1 blend
+ -4 -6 -11 -41 -37 -154 -1 0 -1 0 1 1 11 -1 12 15 1 17 79 1 89 5 blend
+ 0 -26 9 0 10 1 blend
+ hhcurveto
+ -56 -9 6 25 17 0 19 2 0 3 -1 -1 -2 4 0 5 4 blend
+ hvcurveto
+ 276 -81 -1 -91 1 blend
+ vlineto
+ 278 -62 -114 -1 -128 32 0 36 2 blend
+ rmoveto
+ -66 -32 -126 -33 -107 -23 5 -7 5 -10 2 -7 110 22 126 32 81 36 10 0 11 7 0 8 30 0 34 11 0 12 21 0 23 9 0 10 7 0 8 -14 0 -16 9 0 10 -27 0 -30 3 0 4 -15 0 -17 -15 0 -17 -10 0 -11 -12 0 -14 -11 0 -12 3 0 4 -3 0 -4 18 blend
+ rrcurveto
+ </CharString>
+ <CharString name="cid06821" fdSelectIndex="1">
+ 3 vsindex
+ -58 30 100 30 70 22 -22 30 94 30 19 31 -17 28 152 20 -20 30 -12 12 66 30 -30 89 -5 30 -30 121 -11 0 -24 36 0 81 -32 0 -74 22 0 52 -17 0 -39 16 1 37 -16 -1 -37 21 0 48 -27 0 -63 21 0 49 -11 0 -26 41 0 93 -47 0 -107 24 0 56 -34 0 -78 11 0 26 -11 0 -26 17 0 39 -15 0 -35 15 0 35 -19 0 -43 12 0 26 -12 0 -26 4 0 8 -5 0 -11 28 0 65 -28 0 -65 23 0 52 28 blend
+ hstemhm
+ 127 30 -18 18 199 30 -20 20 -20 30 -24 14 97 30 -11 11 72 31 202 30 87 29 -12 0 -27 44 1 101 -19 -1 -45 19 1 45 -46 -1 -106 37 0 85 -31 0 -71 31 0 71 -31 0 -71 40 0 91 -27 0 -62 18 0 42 -47 0 -108 51 0 117 -27 0 -62 27 0 62 -53 0 -122 43 0 99 -60 -1 -138 52 1 120 -32 0 -73 32 0 72 22 blend
+ vstemhm
+ hintmask 00011000000000000000000100000000
+ 193 296 41 0 93 -8 0 -19 2 blend
+ rmoveto
+ 625 -94 -625 -84 -1 -192 27 0 63 84 1 192 3 blend
+ hlineto
+ -30 124 -48 0 -110 -6 0 -14 2 blend
+ rmoveto
+ -154 685 154 -15 0 -34 16 0 38 15 0 34 3 blend
+ vlineto
+ hintmask 00100000000000000000100000000000
+ -365 -132 -33 0 -76 1 1 3 2 blend
+ rmoveto
+ -232 -7 -1 -16 1 blend
+ vlineto
+ 30 -5 51 0 117 -11 0 -27 2 blend
+ rlineto
+ 237 18 1 43 1 blend
+ vlineto
+ hintmask 01000000000010010000010000000000
+ -11 -92 -27 0 -62 1 -1 2 2 blend
+ rmoveto
+ -30 397 30 -22 0 -52 -12 0 -27 22 0 52 3 blend
+ vlineto
+ -760 647 25 0 56 -4 0 -9 2 blend
+ rmoveto
+ -30 811 30 -28 0 -65 -12 0 -27 28 0 65 3 blend
+ vlineto
+ hintmask 00000000000010100000000000000000
+ -823 -13 0 -29 1 blend
+ hmoveto
+ -143 12 0 27 1 blend
+ vlineto
+ -83 -13 -107 -75 -82 4 0 9 3 0 6 5 1 12 -1 0 -1 5 -1 11 5 blend
+ vhcurveto
+ 7 -4 11 -9 5 -6 10 0 21 -5 0 -12 20 0 46 -17 0 -38 6 0 15 -8 0 -18 6 blend
+ rrcurveto
+ 79 5 0 11 1 blend
+ 85 16 118 88 1 1 3 9 0 19 6 0 15 3 blend
+ vvcurveto
+ 143 -11 0 -25 1 blend
+ vlineto
+ hintmask 00000000010100001000000000000000
+ 199 -25 -46 -1 -106 -23 0 -54 2 blend
+ rmoveto
+ -167 vlineto
+ hintmask 00000000010100000100000000000000
+ 30 37 0 85 1 blend
+ 167 hlineto
+ hintmask 00000000101000000001000000000000
+ -14 -59 -18 0 -42 8 0 18 2 blend
+ rmoveto
+ -30 185 30 -12 0 -26 -4 0 -9 12 0 26 3 blend
+ vlineto
+ -365 -96 10 0 22 7 0 17 2 blend
+ rmoveto
+ -30 392 30 -17 0 -39 -4 0 -9 17 0 39 3 blend
+ vlineto
+ hintmask 00000011000000000100000000000000
+ -218 -10 -15 0 -33 -6 0 -13 2 blend
+ rmoveto
+ -160 23 0 51 1 blend
+ vlineto
+ -8 -2 0 0 -1 1 blend
+ -3 -11 -1 1 0 3 0 0 1 2 blend
+ vhcurveto
+ -11 -1 -30 2 0 4 1 0 1 4 0 10 3 blend
+ 0 -47 13 0 30 1 blend
+ 1 5 -9 6 -10 2 -9 4 0 8 -6 0 -13 6 0 13 -11 0 -25 2 0 6 -8 0 -19 6 blend
+ rrcurveto
+ hintmask 00000011000001000010001000000000
+ 50 30 -5 0 -11 1 0 2 2 blend
+ 0 6 17 3 0 8 5 1 12 2 blend
+ hvcurveto
+ 17 5 4 9 21 6 -1 12 4 0 9 1 0 3 4 0 8 11 0 25 5 blend
+ vvcurveto
+ 159 -21 0 -46 1 blend
+ vlineto
+ -132 -50 -39 0 -88 1 0 1 2 blend
+ rmoveto
+ -25 -42 -40 -39 -44 -30 8 -4 13 -10 5 -4 41 6 0 12 3 0 8 7 0 16 3 0 5 5 0 13 1 0 4 6 0 13 -3 0 -8 10 0 22 -6 0 -14 5 0 12 -5 0 -10 -3 0 -8 13 blend
+ 30 45 -7 0 -14 1 blend
+ 47 26 45 -3 0 -8 1 0 1 2 blend
+ rrcurveto
+ 153 -7 -13 0 -30 -1 0 -2 2 blend
+ rmoveto
+ 35 -27 38 -39 18 -28 -8 3 -11 3 -5 -3 -9 3 -14 6 -7 -3 -5 1 -9 4 -4 0 6 blend
+ rrcurveto
+ 24 18 -18 27 -39 39 -34 25 23 1 55 6 -1 12 4 -1 8 -3 4 1 9 -3 13 -6 7 2 7 -3 9 -4 5 4 8 blend
+ rlinecurve
+ 115 330 -53 -1 -124 9 1 21 2 blend
+ rmoveto
+ hintmask 10000101000001000000001010000000
+ 14 -286 131 -209 160 0 50 1 18 34 6 108 -9 3 -11 5 -9 7 -4 -92 -9 -34 -31 -1 -137 -2 -126 185 -12 281 3 0 8 6 0 14 5 0 10 -10 0 -22 -3 0 -6 0 0 -1 14 0 33 -1 0 -1 11 0 23 -3 0 -8 5 0 12 10 0 24 -10 0 -23 3 0 7 -14 0 -32 8 0 18 -8 0 -17 8 0 17 0 0 -1 11 0 26 0 0 1 4 0 9 5 0 11 1 0 1 29 0 67 0 1 2 8 0 17 0 -1 -1 -2 0 -4 -37 0 -85 30 blend
+ rrcurveto
+ 207 -169 -37 0 -85 -4 0 -9 2 blend
+ rmoveto
+ -61 -129 -111 -108 -121 -69 7 -5 12 -11 5 -6 119 74 113 110 66 136 4 15 19 8 14 33 4 28 29 8 5 22 2 28 27 6 2 17 8 1 20 -6 0 -14 14 1 34 -13 -1 -31 6 0 15 -7 0 -17 0 -28 -23 -4 -2 -10 0 -27 -20 -1 -3 -5 -1 -16 -12 -1 -15 -19 18 blend
+ rrcurveto
+ -156 153 -20 -2 -49 -2 0 -3 2 blend
+ rmoveto
+ 52 -15 63 -26 34 -1 0 -3 -1 0 -1 0 0 1 0 0 -2 0 0 -2 5 blend
+ -21 rrcurveto
+ 15 27 -34 20 -64 24 -51 14 21 0 48 20 0 47 -1 0 -1 1 0 1 0 0 -1 0 0 1 1 0 3 -1 0 -2 8 blend
+ rlinecurve
+ -453 -763 1 0 2 12 0 27 2 blend
+ rmoveto
+ -25 -16 -31 0 -71 -7 0 -17 2 blend
+ rlineto
+ -100 89 146 -18 233 -21 0 -46 -5 0 -12 -13 0 -29 -4 0 -9 -8 0 -18 5 blend
+ hhcurveto
+ 249 23 0 53 1 blend
+ hlineto
+ 2 8 6 14 6 8 -35 0 -207 2 -1 3 11 0 25 5 1 12 17 0 38 4 0 10 8 0 18 -16 0 -37 -1 0 -3 -1 0 -2 9 blend
+ 0 -22 -14 0 -32 1 blend
+ 0 -214 0 -150 15 -78 89 24 0 55 0 0 1 18 0 40 -2 0 -5 12 0 28 -1 0 -2 6 blend
+ rrcurveto
+ 5 62 -50 0 -114 -10 0 -22 2 blend
+ rmoveto
+ -30 -97 -92 -60 -107 -36 8 -6 12 -11 4 -6 105 41 99 65 32 106 5 0 12 7 0 15 15 0 34 1 0 3 7 0 16 1 0 2 10 0 22 -6 0 -15 18 0 41 -17 0 -37 8 0 18 -8 0 -19 -2 0 -5 4 0 9 -12 0 -27 7 0 16 -1 0 -2 6 0 14 18 blend
+ rrcurveto
+ </CharString>
+ <CharString name="cid07253" fdSelectIndex="1">
+ 1 vsindex
+ -80 27 95 49 -48 48 -45 45 -30 30 -16 16 -13 13 49 30 48 30 47 19 -19 30 53 30 -18 18 51 11 -11 30 -22 22 62 30 60 30 15 81 -30 30 -30 102 -10 1 -14 41 -2 59 -53 2 -76 27 -1 38 -26 1 -37 26 -1 37 -27 1 -39 27 -1 39 -27 1 -39 27 -1 39 -13 0 -19 13 0 19 -14 0 -20 14 0 20 -19 1 -27 13 -1 19 -18 1 -26 13 0 19 -18 0 -26 18 0 26 -18 0 -26 23 -1 33 -21 1 -30 42 -2 60 -29 1 -42 29 -1 42 -19 1 -27 7 0 10 -7 0 -10 26 -1 37 -24 1 -34 24 -1 34 -27 1 -39 24 -1 34 -26 1 -37 26 -1 37 -40 1 -45 53 -2 66 -44 2 -62 44 -2 62 -44 2 -62 18 0 23 42 blend
+ hstemhm
+ 193 30 -1 30 -15 15 106 29 96 30 142 30 109 30 5 10 -28 1 -40 71 -2 102 -56 2 -80 75 -4 106 -21 2 -29 21 -2 29 -104 5 -148 55 -3 78 -42 3 -59 69 -4 98 -84 4 -120 79 -3 113 -94 3 -135 76 -3 109 -51 2 -73 25 -1 36 16 blend
+ vstemhm
+ hintmask 10000011101100101101000101110000
+ 55 767 2 0 3 37 -2 55 2 blend
+ rmoveto
+ -30 892 30 -44 2 -62 -6 0 -9 44 -2 62 3 blend
+ vlineto
+ hintmask 00000000000000000000100000000000
+ -637 72 -28 1 -40 -26 2 -39 2 blend
+ rmoveto
+ hintmask 00000000000000000010000000000000
+ -153 30 -27 0 -27 77 -2 111 2 blend
+ vlineto
+ hintmask 00000000000000000000100000100000
+ 153 27 0 27 1 blend
+ vlineto
+ 315 -89 3 -128 1 blend
+ hmoveto
+ hintmask 00000000000000000010000000100000
+ -153 30 -27 0 -27 79 -3 113 2 blend
+ vlineto
+ hintmask 00000000000100101100110000110000
+ 153 27 0 27 1 blend
+ vlineto
+ -462 -288 8 0 12 -11 0 -16 2 blend
+ rmoveto
+ 571 -62 -571 -102 3 -147 27 -1 39 102 -3 147 3 blend
+ hlineto
+ 152 -29 1 -42 1 blend
+ vmoveto
+ 571 -60 -571 -102 3 -147 26 -1 37 102 -3 147 3 blend
+ hlineto
+ -30 -71 2 -102 1 blend
+ 90 rmoveto
+ -212 631 212 -23 1 -32 45 -2 64 23 -1 32 3 blend
+ vlineto
+ -776 -263 -22 1 -31 -4 0 -5 2 blend
+ rmoveto
+ -30 905 30 -42 2 -60 10 0 14 42 -2 60 3 blend
+ vlineto
+ hintmask 00000001100000000000000100000000
+ -716 -160 36 -1 52 -26 2 -37 2 blend
+ rmoveto
+ -30 554 30 -13 0 -19 -59 2 -85 13 0 19 3 blend
+ vlineto
+ -554 -78 59 -2 85 5 -1 7 2 blend
+ rmoveto
+ -30 563 30 -13 1 -19 -56 1 -81 13 -1 19 3 blend
+ vlineto
+ hintmask 00000010000000000000001000000000
+ -578 -79 2 1 4 6 0 8 2 blend
+ rmoveto
+ hintmask 00001000000000000000001000001000
+ -30 617 -27 1 -39 4 -1 5 2 blend
+ vlineto
+ hintmask 00000010000001000000000000001000
+ 30 27 -1 39 1 blend
+ vlineto
+ -477 382 -24 2 -34 8 0 12 2 blend
+ rmoveto
+ -46 -92 -113 -104 -167 -65 7 -5 10 -9 5 -8 6 -1 8 -5 -1 -8 17 0 25 11 0 16 -3 -1 -5 6 0 9 12 0 18 -11 0 -16 18 0 26 -27 1 -39 6 -1 8 -16 1 -23 12 blend
+ rrcurveto
+ hintmask 00000100010010010000000001000000
+ 172 70 111 106 55 101 14 0 20 3 0 5 -6 0 -8 1 0 1 3 0 4 28 -1 41 6 blend
+ rrcurveto
+ 298 -65 -24 0 -35 3 0 4 2 blend
+ rmoveto
+ -25 -12 -55 2 -79 -15 0 -22 2 blend
+ rlineto
+ 62 -80 121 -81 100 -38 5 8 9 11 7 6 -101 33 -119 76 -59 77 2 0 3 -14 1 -20 -10 1 -14 2 0 3 20 0 29 1 0 2 9 -1 13 18 -1 25 20 -1 28 26 -1 38 14 0 21 14 -1 19 -13 0 -19 -7 0 -10 9 0 13 -18 2 -25 4 -1 5 -7 0 -10 18 blend
+ rrcurveto
+ -211 -88 -39 3 -55 -12 1 -17 2 blend
+ rmoveto
+ -239 30 239 -2 -1 -4 69 -4 98 2 1 4 3 blend
+ vlineto
+ hintmask 10000010000000000000000000001000
+ 316 -223 -74 3 -106 11 -1 15 2 blend
+ rmoveto
+ -6 -4 0 -6 1 blend
+ vlineto
+ -8 -87 -7 -34 -10 -10 2 0 3 24 -1 35 -1 1 -1 6 0 9 1 -1 1 1 0 1 6 blend
+ rrcurveto
+ -6 -1 0 -1 1 blend
+ -6 -6 -1 -12 2 0 3 1 blend
+ hhcurveto
+ -11 -31 1 0 1 10 0 15 2 blend
+ 1 3 -34 0 -1 -1 9 0 13 2 blend
+ hvcurveto
+ 5 -8 3 -13 6 -1 8 -11 1 -16 5 0 8 -19 1 -26 4 blend
+ 1 -8 28 -2 30 -1 14 1 -14 1 -20 7 -1 9 1 0 1 2 0 3 2 -1 2 3 1 5 0 1 1 7 blend
+ 21 0 10 4 10 9 16 15 7 35 2 -1 2 8 -1 11 2 0 3 5 0 7 5 0 8 3 -1 4 3 0 4 2 1 4 3 0 4 9 blend
+ 9 89 -15 1 -21 1 blend
+ rrcurveto
+ 7 1 1 12 6 -1 8 1 0 1 1 -1 1 9 0 13 4 blend
+ 0 hhcurveto
+ -660 -34 -57 3 -82 -8 0 -11 2 blend
+ rmoveto
+ -17 -46 1 0 2 7 0 10 2 blend
+ -32 -46 -46 5 0 7 5 0 7 2 blend
+ -23 20 -21 56 -2 81 -24 0 -35 2 blend
+ rcurveline
+ hintmask 10010000000000000000000000000000
+ 52 28 31 51 17 46 -4 -1 -7 0 1 1 -4 1 -5 -7 0 -10 1 -1 1 0 0 -1 6 blend
+ rrcurveto
+ hintmask 00100000000000000000000010000000
+ 110 -3 -67 3 -96 1 0 2 2 blend
+ rmoveto
+ 13 -38 10 -49 0 -32 -3 0 -4 4 -1 5 -2 0 -3 2 1 4 -1 1 -1 3 0 4 6 blend
+ rrcurveto
+ 29 6 55 -3 78 8 -1 11 2 blend
+ -1 31 -10 50 -15 37 -3 0 -4 0 1 1 -4 0 -6 3 -1 4 -4 1 -5 5 blend
+ rlinecurve
+ hintmask 01000000000000000000000000100000
+ 113 -6 -56 3 -80 -7 0 -10 2 blend
+ rmoveto
+ 22 -32 20 -44 7 -30 2 0 3 1 -1 1 3 -1 3 1 0 1 2 0 3 5 blend
+ rrcurveto
+ 28 10 -8 29 -21 44 -23 32 48 -2 69 15 0 22 -2 1 -2 -1 0 -2 0 -1 -1 -5 1 -6 -1 1 -1 -4 0 -6 8 blend
+ rlinecurve
+ hintmask 00010000001000000000001000000000
+ 117 -5 -45 1 -65 -17 1 -24 2 blend
+ rmoveto
+ 25 -23 -1 0 -1 2 -1 2 2 blend
+ 27 -32 13 -23 -2 1 -2 1 0 2 2 blend
+ rrcurveto
+ 21 14 -12 44 -2 63 20 -1 28 0 0 -1 3 blend
+ 22 -27 32 -26 22 -2 0 -2 -2 0 -3 1 0 1 -2 1 -2 4 blend
+ rlinecurve
+ -381 267 39 -1 56 7 -1 10 2 blend
+ rmoveto
+ -16 -30 -33 1 -47 -23 1 -33 2 blend
+ rlineto
+ 498 30 -42 1 -61 23 -1 33 2 blend
+ hlineto
+ -516 -23 21 0 31 -14 0 -21 2 blend
+ rmoveto
+ hintmask 00000010000000000000001000000000
+ -224 6 0 9 1 blend
+ vlineto
+ hintmask 00000010001000000000000100000000
+ 30 247 75 -4 106 10 0 14 2 blend
+ hlineto
+ </CharString>
+ <CharString name="cid13393" fdSelectIndex="1">
+ 4 vsindex
+ -50 30 -19 19 114 30 44 30 23 30 -30 114 35 30 316 30 -10 10 37 12 -21 0 -26 66 0 82 -29 21 -10 29 -21 10 -64 0 -80 55 0 69 -79 0 -99 75 0 94 -46 0 -58 56 0 71 -56 0 -71 26 21 59 -18 -25 -54 54 0 68 -76 8 -85 58 0 73 -24 0 -31 24 0 31 -46 -4 -63 30 0 37 20 blend
+ hstemhm
+ 82 30 197 30 -26 8 317 30 168 13 -13 0 -16 77 0 96 -109 -1 -136 78 0 97 -77 0 -96 29 0 36 -10 0 -12 84 0 105 -86 0 -108 21 0 27 10 blend
+ vstemhm
+ hintmask 1010101101110110
+ 529 746 23 0 29 30 4 43 2 blend
+ rmoveto
+ -30 320 30 -58 0 -73 -29 0 -36 58 0 73 3 blend
+ vlineto
+ -397 -495 15 0 18 12 -4 10 2 blend
+ rmoveto
+ -30 442 30 -56 0 -71 21 0 27 56 0 71 3 blend
+ vlineto
+ -420 149 -6 0 -8 6 -4 2 2 blend
+ rmoveto
+ -30 374 30 -54 0 -68 -25 0 -31 54 0 68 3 blend
+ vlineto
+ -514 -420 34 0 42 -3 4 1 2 blend
+ rmoveto
+ -30 626 30 -66 0 -82 -29 0 -36 66 0 82 3 blend
+ vlineto
+ -531 144 15 0 19 -9 0 -11 2 blend
+ rmoveto
+ -30 460 30 -55 0 -69 -4 0 -5 55 0 69 3 blend
+ vlineto
+ -53 622 -42 0 -53 -6 4 -2 2 blend
+ rmoveto
+ -7 -9 0 -12 1 blend
+ vlineto
+ -86 -171 -222 -118 -188 -45 7 -7 8 -11 3 -8 14 0 18 37 0 46 27 0 34 19 0 24 -7 0 -9 5 0 7 15 0 18 -16 0 -20 17 0 22 -32 0 -40 9 0 11 -19 0 -24 12 blend
+ rrcurveto
+ hintmask 0000000010000010
+ 192 51 224 119 94 187 21 0 26 3 0 3 -17 0 -21 -9 0 -11 2 0 2 -3 0 -4 6 blend
+ rrcurveto
+ hintmask 0100010100000110
+ -19 12 -6 -2 -55 0 -68 27 0 34 -12 0 -15 -3 0 -3 4 blend
+ rlineto
+ -323 -32 55 0 69 -25 0 -32 2 blend
+ rmoveto
+ -25 -11 -68 0 -86 -23 0 -28 2 blend
+ rlineto
+ 83 -154 177 -116 201 -44 4 8 9 12 7 6 -200 39 -177 113 -79 147 11 0 14 12 0 15 -18 0 -22 21 0 26 -1 0 -1 4 0 5 11 0 13 21 0 26 21 0 27 32 0 40 17 0 21 16 0 20 9 0 11 -10 0 -12 17 0 21 -36 0 -45 1 0 2 -37 0 -47 18 blend
+ rrcurveto
+ 59 127 -46 0 -58 9 -4 6 2 blend
+ rmoveto
+ -40 -82 -80 -104 -112 -75 8 -4 10 -9 6 -7 115 80 2 0 2 8 0 10 7 0 9 23 0 29 2 0 3 16 0 20 16 0 20 -12 0 -15 26 0 32 -30 0 -37 10 0 13 -18 0 -23 8 0 10 -4 0 -5 14 blend
+ 80 106 47 90 -13 0 -16 11 0 13 14 0 17 3 blend
+ rrcurveto
+ -129 -493 -106 -5 -137 21 6 34 2 blend
+ rmoveto
+ -27 -73 -43 -71 -51 -50 8 -5 13 -9 5 -5 49 52 47 77 29 77 6 0 8 11 0 14 7 0 8 8 0 10 5 0 7 8 0 10 16 0 20 -8 0 -10 28 0 35 -17 -1 -22 15 0 18 -11 0 -14 -3 0 -4 -4 0 -5 -2 0 -2 -1 0 -1 -3 0 -4 -3 1 -3 18 blend
+ rrcurveto
+ 124 -1 -66 4 -77 10 15 31 2 blend
+ rmoveto
+ -374 30 374 4 0 5 84 0 105 -4 0 -5 3 blend
+ vlineto
+ hintmask 0000000000101000
+ -586 460 -72 0 -90 2 -21 -24 2 blend
+ rmoveto
+ -875 30 845 209 30 -27 0 -33 77 0 96 -53 0 -66 -79 0 -99 80 0 99 5 blend
+ vlineto
+ -8 -29 0 -36 1 blend
+ hmoveto
+ -7 -29 0 -36 1 blend
+ vlineto
+ -28 -75 -43 -102 -46 -95 14 0 17 10 0 13 11 0 14 -41 0 -51 17 0 22 4 0 5 6 blend
+ rrcurveto
+ hintmask 0001000000010000
+ 89 -91 24 -74 -63 -32 0 -40 23 0 28 -11 0 -14 10 0 13 17 0 21 5 blend
+ vvcurveto
+ -33 -6 -35 -19 -13 3 0 4 1 0 1 15 0 18 7 0 9 4 0 5 5 blend
+ vhcurveto
+ -10 -6 -12 3 0 3 0 0 1 1 0 2 3 blend
+ -3 -14 -1 -20 -2 -26 1 -29 4 0 5 1 0 1 7 0 9 2 0 2 13 0 16 -1 0 -1 11 0 14 7 blend
+ 2 7 -9 4 -13 11 0 13 -21 0 -26 5 0 6 -33 0 -41 4 blend
+ 1 -8 22 -2 27 0 22 -21 0 -27 1 0 2 1 0 1 -3 0 -4 0 0 1 -4 0 -5 6 blend
+ 2 19 2 17 5 12 9 3 0 4 2 0 2 3 0 3 2 0 2 4 0 5 3 0 4 6 blend
+ rrcurveto
+ 25 17 10 7 0 9 5 0 7 4 0 5 3 blend
+ 43 44 22 0 27 1 blend
+ vvcurveto
+ 67 -22 76 -86 89 -8 0 -10 9 0 12 -6 0 -8 24 0 30 -11 0 -13 5 blend
+ vhcurveto
+ hintmask 0000000001001000
+ 39 84 42 98 33 81 -10 0 -13 -4 0 -5 -8 0 -10 14 0 17 -6 0 -8 7 0 9 6 blend
+ rrcurveto
+ hintmask 0000000000001000
+ -20 14 -6 -2 -60 0 -75 32 0 40 -12 0 -14 -2 0 -3 4 blend
+ rlineto
+ </CharString>
+ <CharString name="cid17290" fdSelectIndex="1">
+ 5 vsindex
+ 121 30 -22 22 148 30 -30 136 23 30 129 30 116 30 -21 4 -29 52 3 92 -32 23 -21 32 -23 21 -54 9 -83 50 4 90 -50 -4 -90 22 27 62 -2 -43 -47 41 0 69 -44 0 -74 37 0 62 -50 0 -84 36 0 61 14 blend
+ hstemhm
+ 167 30 129 30 -16 16 123 30 48 30 -6 29 -29 111 -30 30 -16 16 201 30 1 29 -29 0 -49 64 0 108 -34 0 -57 51 0 85 -29 0 -48 29 0 48 -72 -2 -123 60 2 103 -69 0 -115 46 0 77 -42 0 -70 42 0 70 -42 0 -70 67 0 111 -51 0 -85 51 0 85 -29 0 -48 29 0 48 -79 0 -132 47 0 79 -45 0 -75 42 0 70 22 blend
+ vstemhm
+ hintmask 011011111011001010000000
+ 326 793 1 0 2 17 0 29 2 blend
+ rmoveto
+ -280 24 0 40 1 blend
+ vlineto
+ -47 16 -8 59 -31 0 -53 6 0 10 -13 0 -21 20 0 33 4 blend
+ vhcurveto
+ hintmask 000010000000100000000000
+ 13 120 4 0 6 -46 0 -76 2 blend
+ 0 13 4 0 7 1 blend
+ hhcurveto
+ 49 10 20 82 4 12 0 19 12 0 20 3 0 5 2 0 3 4 0 8 5 blend
+ hvcurveto
+ hintmask 101010101000010000000000
+ -10 2 -11 5 -8 6 -12 0 -21 3 0 5 -21 0 -35 6 0 11 -9 0 -14 7 0 11 6 blend
+ rrcurveto
+ -75 19 0 32 1 blend
+ -3 -5 -10 -29 -24 -102 1 0 1 1 0 2 7 0 12 9 0 14 42 0 70 5 blend
+ 0 -18 6 0 10 1 blend
+ hhcurveto
+ -38 -6 4 21 10 0 18 2 0 3 0 0 -1 4 0 7 4 blend
+ hvcurveto
+ 280 -25 0 -41 1 blend
+ vlineto
+ -41 -464 -40 -8 -74 10 20 41 2 blend
+ rmoveto
+ -30 617 30 -50 -4 -90 -5 12 5 50 4 90 3 blend
+ vlineto
+ -661 -178 11 -4 12 4 -13 -7 2 blend
+ rmoveto
+ -30 689 30 -52 -3 -92 -11 0 -18 52 3 92 3 blend
+ vlineto
+ hintmask 010101100111001000000000
+ -481 284 -27 -2 -48 -32 36 -21 2 blend
+ rmoveto
+ -306 30 306 0 -13 0 60 2 103 0 13 0 3 blend
+ vlineto
+ 218 0 -61 0 -102 -1 0 -1 2 blend
+ rmoveto
+ -306 30 306 0 -13 0 61 1 104 0 13 0 3 blend
+ vlineto
+ -417 358 -17 -1 -30 19 -43 -12 2 blend
+ rmoveto
+ -30 217 -116 -217 -30 247 176 -36 0 -61 -52 0 -87 50 0 84 52 0 87 -37 0 -62 -6 0 -10 23 0 39 7 blend
+ vlineto
+ 75 -26 0 -44 1 blend
+ hmoveto
+ hintmask 000010100000001001000000
+ -280 24 0 40 1 blend
+ vlineto
+ -47 17 -8 60 -31 0 -53 5 0 9 -13 0 -21 20 0 33 4 blend
+ vhcurveto
+ 12 125 5 0 8 -47 0 -78 2 blend
+ 0 14 4 0 7 1 blend
+ hhcurveto
+ 49 11 20 82 3 12 0 20 12 0 19 3 1 6 2 1 6 5 0 9 5 blend
+ hvcurveto
+ -9 2 -12 4 -8 7 -14 1 -22 3 0 5 -19 -1 -34 7 0 12 -9 0 -14 6 0 10 6 blend
+ rrcurveto
+ -75 19 -1 29 1 blend
+ -3 -5 -10 -30 -25 -105 1 -1 1 8 0 13 8 0 14 42 0 70 4 blend
+ 0 -18 6 0 9 1 blend
+ hhcurveto
+ -40 -6 4 21 11 0 19 2 0 3 0 0 -1 4 1 8 4 blend
+ hvcurveto
+ 280 -25 -1 -42 1 blend
+ vlineto
+ hintmask 000001110000000110000000
+ -16 -29 0 -48 1 blend
+ hmoveto
+ -30 217 -116 -217 -30 247 176 -36 0 -61 -50 0 -84 50 0 84 50 0 84 -37 0 -62 -3 0 -5 23 0 39 7 blend
+ vlineto
+ -424 -714 -19 0 -32 -12 0 -21 2 blend
+ rmoveto
+ -52 -54 -91 -49 -81 -33 8 -5 11 -13 4 -6 80 36 94 56 56 58 7 0 11 9 0 15 5 0 9 11 0 18 -2 0 -3 9 0 15 13 0 22 -11 0 -18 24 0 39 -22 0 -36 11 0 19 -12 0 -21 4 0 7 -4 0 -6 2 0 2 -2 0 -4 -1 0 -1 3 0 5 18 blend
+ rrcurveto
+ 200 -7 -92 0 -154 -5 0 -8 2 blend
+ rmoveto
+ 76 -41 90 -62 46 -42 -6 0 -10 5 0 8 -5 0 -7 6 0 10 -4 0 -7 4 0 7 6 blend
+ rrcurveto
+ 22 23 -46 42 -91 60 -75 39 60 0 100 29 0 48 0 0 -1 -3 0 -5 3 0 5 -7 0 -11 6 0 11 -7 0 -11 8 blend
+ rlinecurve
+ -499 750 -48 0 -81 6 0 10 2 blend
+ rmoveto
+ -54 -167 -87 -164 -96 -108 7 -6 11 -12 4 -6 98 116 88 165 58 175 7 0 13 15 0 25 10 0 16 14 0 22 11 0 19 10 0 17 9 0 15 -20 0 -33 15 0 24 -44 0 -73 4 0 7 -18 0 -30 4 0 6 4 0 6 3 0 6 19 0 32 0 0 -1 1 0 1 18 blend
+ rrcurveto
+ -113 -214 -60 0 -100 -23 0 -37 2 blend
+ rmoveto
+ -691 30 718 20 0 33 64 0 108 43 0 72 3 blend
+ vlineto
+ -1 -1 0 -3 1 blend
+ 2 rlineto
+ </CharString>
+ <CharString name="cid17852" fdSelectIndex="1">
+ 5 vsindex
+ -67 29 219 30 154 30 -16 16 150 30 -30 122 -85 30 -18 18 87 30 -30 140 -122 12 -14 0 -22 46 0 78 -59 -3 -106 46 0 77 -53 -9 -92 46 2 81 -18 20 -1 18 -20 1 -54 13 -80 46 2 81 -46 -2 -81 25 31 61 -14 -34 -48 60 0 100 -64 0 -107 64 0 107 -55 0 -92 54 0 90 -54 0 -90 36 0 59 -19 0 -31 37 0 62 22 blend
+ hstemhm
+ 51 188 -30 30 -30 149 21 30 -18 18 -13 13 66 30 -12 12 135 30 41 30 172 30 -6 28 -8 0 -14 30 0 50 -62 0 -103 62 0 103 -62 0 -103 32 0 53 -5 0 -7 59 0 98 -24 0 -41 24 0 41 -16 0 -27 16 0 27 -32 0 -53 53 0 88 -33 0 -56 33 0 56 -87 0 -146 63 0 106 -42 0 -70 54 0 90 -99 0 -165 55 0 91 -42 0 -70 45 0 75 24 blend
+ vstemhm
+ hintmask 000000100001000000000000
+ 51 612 -8 0 -14 29 0 49 2 blend
+ rmoveto
+ -30 -60 0 -100 1 blend
+ vlineto
+ hintmask 000000100000010000000000
+ 307 30 60 0 100 1 blend
+ hlineto
+ hintmask 000000010010100100000000
+ -149 228 -32 0 -53 -20 0 -34 2 blend
+ rmoveto
+ -918 30 918 -19 0 -32 62 0 103 19 0 32 3 blend
+ vlineto
+ -36 -238 -55 0 -91 -32 0 -53 2 blend
+ rmoveto
+ -31 -160 -74 -193 -68 -95 7 -5 10 -11 6 -8 70 101 74 203 33 160 6 0 10 25 0 42 13 0 21 23 0 37 4 0 7 1 0 2 8 0 14 -18 0 -30 13 0 21 -27 0 -44 4 0 7 -19 0 -32 1 0 2 6 0 10 -12 0 -20 -2 0 -3 -2 0 -4 -1 0 -2 18 blend
+ rrcurveto
+ 4 -143 19 0 32 77 0 128 2 blend
+ rmoveto
+ -21 -16 25 -26 72 -92 21 -33 -23 0 -38 -34 0 -57 1 0 2 -15 0 -24 -12 0 -21 -6 0 -11 2 0 3 -18 0 -29 8 blend
+ rlinecurve
+ 24 24 -18 25 -81 96 -22 22 28 0 48 63 0 105 2 0 2 -1 0 -2 1 0 3 10 0 16 1 0 1 1 0 2 8 blend
+ rlinecurve
+ 157 278 1 0 1 -14 0 -23 2 blend
+ rmoveto
+ hintmask 000000001000000100000000
+ -30 559 -54 0 -90 -17 3 -23 2 blend
+ vlineto
+ hintmask 010000000010000000100000
+ 30 54 0 90 1 blend
+ vlineto
+ -457 -518 29 -3 43 -9 -3 -20 2 blend
+ rmoveto
+ -30 176 30 -46 0 -77 -17 0 -27 46 0 77 3 blend
+ vlineto
+ hintmask 000000000100000001010000
+ -194 120 -3 0 -5 -42 37 -35 2 blend
+ rmoveto
+ -365 30 365 38 -29 45 53 0 88 -38 29 -45 3 blend
+ vlineto
+ 135 508 -87 0 -146 33 -34 24 2 blend
+ rmoveto
+ hintmask 000000000010000000010000
+ -122 30 -19 0 -31 63 0 106 2 blend
+ vlineto
+ hintmask 000101000100000000010000
+ 122 19 0 31 1 blend
+ vlineto
+ -115 -172 -60 0 -100 -27 34 -19 2 blend
+ rmoveto
+ -288 30 288 11 -24 18 50 0 83 -11 24 -18 3 blend
+ vlineto
+ 148 -62 -2 -106 1 blend
+ hmoveto
+ -288 30 288 11 -24 18 50 0 83 -11 24 -18 3 blend
+ vlineto
+ 156 -394 -30 2 -47 19 -34 6 2 blend
+ rmoveto
+ -52 -36 -89 -48 -61 -29 7 0 12 2 0 4 14 0 23 3 0 4 11 0 18 4 0 8 6 blend
+ rrcurveto
+ 15 -21 62 28 86 41 57 44 25 0 42 -39 0 -66 -10 0 -17 -4 0 -6 -12 0 -19 -3 0 -5 -6 0 -11 -5 0 -9 8 blend
+ rlinecurve
+ hintmask 101010000000000010001100
+ -541 323 10 0 17 44 5 84 2 blend
+ rmoveto
+ -30 517 -150 -517 -30 547 210 -46 -2 -81 -74 0 -123 54 -13 80 74 0 123 -46 -2 -81 -19 0 -32 38 17 82 7 blend
+ vlineto
+ -232 -242 -10 0 -16 -28 29 -27 2 blend
+ rmoveto
+ -344 58 -32 71 1 blend
+ vlineto
+ -47 15 -9 54 -33 -2 -58 3 0 4 -15 0 -25 22 0 37 4 blend
+ vhcurveto
+ hintmask 100000000010001000001010
+ 12 100 3 0 5 -47 0 -78 2 blend
+ 0 12 4 0 6 1 blend
+ hhcurveto
+ 48 10 25 102 3 12 0 20 11 0 19 4 1 9 11 -1 16 5 0 8 5 blend
+ hvcurveto
+ -9 3 -11 4 -8 6 -14 0 -23 3 -1 5 -23 1 -37 8 1 15 -8 -1 -15 8 0 12 6 blend
+ rrcurveto
+ -97 11 1 20 1 blend
+ -3 -4 -14 -29 -21 -84 0 0 1 1 -1 1 10 0 16 10 1 17 43 -1 71 5 blend
+ 0 -16 7 0 12 1 blend
+ hhcurveto
+ -33 -6 5 22 13 0 22 3 0 5 -1 0 -2 4 0 7 4 blend
+ hvcurveto
+ 344 -59 34 -71 1 blend
+ vlineto
+ -346 -371 -24 0 -41 65 -34 78 2 blend
+ rmoveto
+ 10 -31 77 16 100 22 99 21 3 0 5 -54 0 -90 -2 0 -3 -3 0 -5 -9 0 -15 -6 0 -10 -10 0 -17 -5 0 -8 8 blend
+ rlinecurve
+ -2 29 -108 -22 -104 -22 -72 -13 -3 0 -5 52 0 86 9 0 16 6 0 10 8 0 13 6 0 11 4 0 6 4 0 6 8 blend
+ rlinecurve
+ -16 767 -44 0 -72 -13 0 -21 2 blend
+ rmoveto
+ -316 -6 0 -11 1 blend
+ vlineto
+ -142 -7 -194 -74 -141 2 0 2 -2 0 -2 2 0 4 6 0 9 4 blend
+ vhcurveto
+ 8 -3 13 -7 5 -6 13 0 21 -7 0 -11 25 0 43 -20 0 -34 11 0 17 -10 0 -17 6 blend
+ rrcurveto
+ 75 143 10 205 145 4 0 7 3 0 5 2 0 4 21 0 35 9 0 15 5 blend
+ vvcurveto
+ 316 6 0 11 1 blend
+ vlineto
+ </CharString>
+ <CharString name="cid18480" fdSelectIndex="1">
+ 3 vsindex
+ -71 30 427 30 153 30 33 111 -30 30 -30 126 -6 0 -13 45 0 102 -58 0 -132 38 0 87 -48 0 -111 38 0 87 -4 -2 -13 21 2 53 -43 0 -99 43 0 99 -43 0 -99 24 0 55 12 blend
+ hstemhm
+ 159 30 -19 19 126 30 -6 30 281 30 160 30 18 31 -7 0 -16 50 0 114 -18 0 -42 18 0 42 -71 0 -161 50 0 114 -26 0 -61 48 0 111 -66 0 -150 51 0 115 -68 0 -154 50 0 114 -36 -1 -84 44 1 101 14 blend
+ vstemhm
+ hintmask 1110100101110000
+ 58 743 -1 0 -2 26 0 60 2 blend
+ rmoveto
+ -30 887 30 -43 0 -99 2 0 5 43 0 99 3 blend
+ vlineto
+ hintmask 0000010010000000
+ -630 96 -29 0 -66 -19 0 -44 2 blend
+ rmoveto
+ hintmask 0001000010000000
+ -207 30 -2 -2 -9 50 0 114 2 blend
+ vlineto
+ hintmask 0000010010100000
+ 207 2 2 9 1 blend
+ vlineto
+ 305 -44 0 -100 1 blend
+ hmoveto
+ hintmask 0001000000100000
+ -207 30 -2 -2 -9 51 0 115 2 blend
+ vlineto
+ hintmask 0010011000100000
+ 207 2 2 9 1 blend
+ vlineto
+ -521 -240 -36 0 -82 2 0 4 2 blend
+ rmoveto
+ -206 -5 0 -10 1 blend
+ vlineto
+ -137 -15 -184 -109 -136 5 0 11 3 0 6 5 0 10 -1 0 -1 8 0 19 5 blend
+ vhcurveto
+ 7 -3 12 -9 5 -6 12 0 27 -6 0 -13 22 0 51 -15 0 -35 10 0 21 -8 0 -19 6 blend
+ rrcurveto
+ hintmask 1110000101010000
+ 112 139 18 194 141 3 0 7 -4 0 -8 1 0 3 11 0 24 4 0 10 5 blend
+ vvcurveto
+ 207 5 0 11 1 blend
+ vlineto
+ -19 -18 0 -42 1 blend
+ hmoveto
+ -30 670 -153 -670 -30 700 213 -38 0 -87 -64 0 -144 48 0 111 64 0 144 -38 0 -87 -14 0 -30 28 0 63 7 blend
+ vlineto
+ -531 -249 -15 0 -36 -23 0 -51 2 blend
+ rmoveto
+ -343 50 0 112 1 blend
+ vlineto
+ -66 31 -12 105 -29 0 -66 6 0 14 -13 0 -28 29 0 66 4 blend
+ vhcurveto
+ 23 278 5 0 12 -59 0 -134 2 blend
+ 0 24 6 0 14 1 blend
+ hhcurveto
+ hintmask 1000000001001000
+ 96 15 31 123 8 20 0 44 11 0 26 4 0 8 14 0 32 5 0 11 5 blend
+ hvcurveto
+ -9 3 -13 4 -9 7 -13 0 -30 2 0 5 -21 0 -48 8 0 17 -10 -1 -23 6 0 15 6 blend
+ rrcurveto
+ -117 -6 -11 -21 -69 -56 -236 8 0 18 -1 1 -1 1 -1 1 3 0 7 3 1 9 7 0 15 49 0 112 7 blend
+ 0 -41 4 0 8 1 blend
+ hhcurveto
+ -84 -16 11 37 4 0 10 2 0 5 -3 0 -7 1 0 2 4 blend
+ hvcurveto
+ 343 -51 0 -115 1 blend
+ vlineto
+ 444 -47 -59 0 -135 26 0 59 2 blend
+ rmoveto
+ -101 -52 -195 -56 -169 -40 4 -7 5 -10 3 -7 172 40 193 54 120 56 4 0 8 3 0 7 18 0 43 9 0 19 12 0 26 8 0 19 5 0 12 -10 0 -22 7 0 15 -18 0 -41 1 0 3 -11 0 -25 -8 0 -19 -9 0 -21 -8 0 -18 -8 0 -19 5 0 11 0 0 1 18 blend
+ rrcurveto
+ </CharString>
+ <CharString name="cid22370" fdSelectIndex="1">
+ 2 vsindex
+ 64 30 77 30 76 30 74 30 72 30 109 30 25 84 -30 30 -30 108 -2 0 -2 42 0 47 -48 0 -54 38 0 43 -48 0 -54 38 0 43 -46 0 -52 42 0 47 -43 0 -48 56 1 63 -72 -1 -81 57 1 64 -8 -32 -41 30 32 65 -65 -1 -73 65 1 73 -65 -1 -73 43 0 49 18 blend
+ hstemhm
+ 135 30 21 30 102 30 14 30 205 30 17 30 113 30 19 30 -19 0 -21 87 2 98 -86 -2 -97 99 1 111 -125 -1 -141 98 1 111 -79 -1 -89 75 1 84 -99 -1 -111 75 1 84 -77 -1 -86 100 1 112 -127 -1 -143 105 1 118 -102 -1 -114 94 1 105 16 blend
+ vstemhm
+ hintmask 111111010011001100000000
+ 53 761 -3 0 -3 36 0 40 2 blend
+ rmoveto
+ -30 896 30 -65 -1 -73 5 0 5 65 1 73 3 blend
+ vlineto
+ hintmask 000000001001000000000000
+ -631 78 -46 0 -52 -22 0 -24 2 blend
+ rmoveto
+ hintmask 000000100001000000000000
+ -162 30 -8 -32 -41 98 1 111 2 blend
+ vlineto
+ hintmask 000000001001001000000000
+ 162 8 32 41 1 blend
+ vlineto
+ 296 -105 -1 -118 1 blend
+ hmoveto
+ hintmask 000000100000001000000000
+ -162 30 -8 -32 -41 100 1 112 2 blend
+ vlineto
+ hintmask 000000001000001000000000
+ 162 8 32 41 1 blend
+ vlineto
+ hintmask 000011000100110010000000
+ -47 -217 -23 0 -26 -57 -1 -64 2 blend
+ rmoveto
+ 209 -109 -209 -101 -1 -113 72 1 81 101 1 113 3 blend
+ hlineto
+ -235 109 24 0 27 -72 -1 -81 2 blend
+ rmoveto
+ 205 -109 -205 -99 -1 -111 72 1 81 99 1 111 3 blend
+ hlineto
+ -227 109 18 1 21 -72 -1 -81 2 blend
+ rmoveto
+ 197 -109 -197 -93 -2 -105 72 1 81 93 2 105 3 blend
+ hlineto
+ -30 139 -87 -2 -98 -15 0 -17 2 blend
+ rmoveto
+ -169 731 169 -41 0 -46 38 0 42 41 0 46 3 blend
+ vlineto
+ hintmask 111100000010000100000000
+ -650 -375 62 1 70 -32 0 -36 2 blend
+ rmoveto
+ 571 -76 -571 -159 -1 -179 48 0 54 159 1 179 3 blend
+ hlineto
+ -30 -38 0 -43 1 blend
+ vmoveto
+ 571 -77 -571 -159 -1 -179 48 0 54 159 1 179 3 blend
+ hlineto
+ 287 -66 -1 -74 1 blend
+ vmoveto
+ 571 -74 -571 -159 -1 -179 46 0 52 159 1 179 3 blend
+ hlineto
+ -30 104 -99 -1 -111 -4 0 -5 2 blend
+ rmoveto
+ -347 631 347 -18 0 -20 45 0 50 18 0 20 3 blend
+ vlineto
+ -216 -389 -86 -1 -96 -31 0 -35 2 blend
+ rmoveto
+ 127 -34 121 -39 72 -31 -17 0 -19 2 0 2 -13 0 -15 -2 0 -2 -13 0 -15 3 0 3 6 blend
+ rrcurveto
+ 31 22 -78 32 -126 39 -121 136 1 153 39 0 44 1 0 1 -3 0 -3 -8 0 -9 4 0 5 9 0 10 7 blend
+ 31 rlinecurve
+ -258 -1 -67 -1 -75 0 0 -1 2 blend
+ rmoveto
+ -81 -39 -128 -36 -107 -23 8 -6 12 -12 5 -6 103 25 130 41 86 43 9 0 10 6 0 7 3 0 4 7 0 8 -4 0 -5 7 0 8 19 0 22 -14 0 -16 32 0 36 -32 0 -36 17 0 19 -19 0 -21 3 0 3 -1 0 -1 5 0 6 2 0 2 1 0 1 4 0 5 18 blend
+ rrcurveto
+ </CharString>
+ </CharStrings>
+ <VarStore Format="1">
+ <Format value="1"/>
+ <VarRegionList>
+ <!-- RegionAxisCount=1 -->
+ <!-- RegionCount=16 -->
+ <Region index="0">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="1">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.669"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="2">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.669"/>
+ <PeakCoord value="0.67"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="3">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.67"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="4">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.889"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="5">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.889"/>
+ <PeakCoord value="0.89"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="6">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.89"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="7">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.439"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="8">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.439"/>
+ <PeakCoord value="0.44"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="9">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.44"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="10">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.799"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="11">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.799"/>
+ <PeakCoord value="0.8"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="12">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.8"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="13">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.0"/>
+ <PeakCoord value="0.599"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="14">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.599"/>
+ <PeakCoord value="0.6"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ <Region index="15">
+ <VarRegionAxis index="0">
+ <StartCoord value="0.6"/>
+ <PeakCoord value="1.0"/>
+ <EndCoord value="1.0"/>
+ </VarRegionAxis>
+ </Region>
+ </VarRegionList>
+ <!-- VarDataCount=6 -->
+ <VarData index="0">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=1 -->
+ <VarRegionIndex index="0" value="0"/>
+ </VarData>
+ <VarData index="1">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="1"/>
+ <VarRegionIndex index="1" value="2"/>
+ <VarRegionIndex index="2" value="3"/>
+ </VarData>
+ <VarData index="2">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="4"/>
+ <VarRegionIndex index="1" value="5"/>
+ <VarRegionIndex index="2" value="6"/>
+ </VarData>
+ <VarData index="3">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="7"/>
+ <VarRegionIndex index="1" value="8"/>
+ <VarRegionIndex index="2" value="9"/>
+ </VarData>
+ <VarData index="4">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="10"/>
+ <VarRegionIndex index="1" value="11"/>
+ <VarRegionIndex index="2" value="12"/>
+ </VarData>
+ <VarData index="5">
+ <!-- ItemCount=0 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=3 -->
+ <VarRegionIndex index="0" value="13"/>
+ <VarRegionIndex index="1" value="14"/>
+ <VarRegionIndex index="2" value="15"/>
+ </VarData>
+ </VarStore>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ </GlobalSubrs>
+ </CFF2>
+
+</ttFont>
diff --git a/Tests/varLib/data/test_results/TestVVAR.ttx b/Tests/varLib/data/test_results/TestVVAR.ttx
new file mode 100644
index 00000000..53c038c1
--- /dev/null
+++ b/Tests/varLib/data/test_results/TestVVAR.ttx
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" ttLibVersion="3.39">
+
+ <VVAR>
+ <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=1 -->
+ <NumShorts value="0"/>
+ <!-- VarRegionCount=0 -->
+ <Item index="0" value="[]"/>
+ </VarData>
+ </VarStore>
+ <AdvHeightMap>
+ <Map glyph=".notdef" outer="0" inner="0"/>
+ <Map glyph="c30719" outer="0" inner="0"/>
+ <Map glyph="c30790" outer="0" inner="0"/>
+ <Map glyph="c30816" outer="0" inner="0"/>
+ <Map glyph="c30843" outer="0" inner="0"/>
+ <Map glyph="c31621" outer="0" inner="0"/>
+ <Map glyph="c32051" outer="0" inner="0"/>
+ <Map glyph="uni3042" outer="0" inner="0"/>
+ <Map glyph="uni56FD" outer="0" inner="0"/>
+ <Map glyph="uni6280" outer="0" inner="0"/>
+ <Map glyph="uniFF20" outer="0" inner="0"/>
+ <Map glyph="uniFF21" outer="0" inner="0"/>
+ <Map glyph="uniFF41" outer="0" inner="0"/>
+ </AdvHeightMap>
+ <VOrgMap>
+ <Map glyph=".notdef" outer="0" inner="0"/>
+ <Map glyph="c30719" outer="0" inner="0"/>
+ <Map glyph="c30790" outer="0" inner="0"/>
+ <Map glyph="c30816" outer="0" inner="0"/>
+ <Map glyph="c30843" outer="0" inner="0"/>
+ <Map glyph="c31621" outer="0" inner="0"/>
+ <Map glyph="c32051" outer="0" inner="0"/>
+ <Map glyph="uni3042" outer="0" inner="0"/>
+ <Map glyph="uni56FD" outer="0" inner="0"/>
+ <Map glyph="uni6280" outer="0" inner="0"/>
+ <Map glyph="uniFF20" outer="0" inner="0"/>
+ <Map glyph="uniFF21" outer="0" inner="0"/>
+ <Map glyph="uniFF41" outer="0" inner="0"/>
+ </VOrgMap>
+ </VVAR>
+
+</ttFont>
diff --git a/Tests/varLib/mutator_test.py b/Tests/varLib/mutator_test.py
index 8625de3c..d781d59e 100644
--- a/Tests/varLib/mutator_test.py
+++ b/Tests/varLib/mutator_test.py
@@ -162,13 +162,22 @@ class MutatorTest(unittest.TestCase):
self.expect_ttx(instfont, expected_ttx_path, tables)
def test_varlib_mutator_CFF2(self):
+ suffix = '.otf'
+ ttx_dir = self.get_test_input('master_ttx_varfont_otf')
+
+ self.temp_dir()
+ ttx_paths = self.get_file_list(ttx_dir, '.ttx', 'TestCFF2VF')
+ for path in ttx_paths:
+ self.compile_font(path, suffix, self.tempdir)
+
+ varfont_name = 'TestCFF2VF'
+ varfont_path = os.path.join(self.tempdir, varfont_name + suffix)
- otf_vf_path = self.get_test_input('TestCFF2VF.otf')
expected_ttx_name = 'InterpolateTestCFF2VF'
tables = ["hmtx", "CFF2"]
loc = {'wght':float(200)}
- varfont = TTFont(otf_vf_path)
+ varfont = TTFont(varfont_path)
new_font = make_instance(varfont, loc)
expected_ttx_path = self.get_test_output(expected_ttx_name + '.ttx')
self.expect_ttx(new_font, expected_ttx_path, tables)
diff --git a/Tests/varLib/varLib_test.py b/Tests/varLib/varLib_test.py
index 32e7ab5e..f3037339 100644
--- a/Tests/varLib/varLib_test.py
+++ b/Tests/varLib/varLib_test.py
@@ -229,20 +229,49 @@ class BuildTest(unittest.TestCase):
def test_varlib_build_CFF2(self):
ds_path = self.get_test_input('TestCFF2.designspace')
- suffix = '.otf'
- expected_ttx_name = 'BuildTestCFF2'
+ ttx_dir = self.get_test_input("master_cff2")
+ expected_ttx_path = self.get_test_output("BuildTestCFF2.ttx")
+
+ self.temp_dir()
+ for path in self.get_file_list(ttx_dir, '.ttx', 'TestCFF2_'):
+ self.compile_font(path, ".otf", self.tempdir)
+
+ ds = DesignSpaceDocument.fromfile(ds_path)
+ for source in ds.sources:
+ source.path = os.path.join(
+ self.tempdir, os.path.basename(source.filename).replace(".ufo", ".otf")
+ )
+ ds.updatePaths()
+
+ varfont, _, _ = build(ds)
+ varfont = reload_font(varfont)
+
tables = ["fvar", "CFF2"]
+ self.expect_ttx(varfont, expected_ttx_path, tables)
- finder = lambda s: s.replace('.ufo', suffix)
- varfont, model, _ = build(ds_path, finder)
- # some data (e.g. counts printed in TTX inline comments) is only
- # calculated at compile time, so before we can compare the TTX
- # dumps we need to save to a temporary stream, and realod the font
+
+ def test_varlib_build_sparse_CFF2(self):
+ ds_path = self.get_test_input('TestSparseCFF2VF.designspace')
+ ttx_dir = self.get_test_input("master_sparse_cff2")
+ expected_ttx_path = self.get_test_output("TestSparseCFF2VF.ttx")
+
+ self.temp_dir()
+ for path in self.get_file_list(ttx_dir, '.ttx', 'MasterSet_Kanji-'):
+ self.compile_font(path, ".otf", self.tempdir)
+
+ ds = DesignSpaceDocument.fromfile(ds_path)
+ for source in ds.sources:
+ source.path = os.path.join(
+ self.tempdir, os.path.basename(source.filename).replace(".ufo", ".otf")
+ )
+ ds.updatePaths()
+
+ varfont, _, _ = build(ds)
varfont = reload_font(varfont)
- expected_ttx_path = self.get_test_output(expected_ttx_name + '.ttx')
+ tables = ["fvar", "CFF2"]
self.expect_ttx(varfont, expected_ttx_path, tables)
- self.check_ttx_dump(varfont, expected_ttx_path, tables, suffix)
+
def test_varlib_main_ttf(self):
"""Mostly for testing varLib.main()
@@ -442,6 +471,31 @@ class BuildTest(unittest.TestCase):
mvar_tags = [vr.ValueTag for vr in varfont["MVAR"].table.ValueRecord]
assert all(tag in mvar_tags for tag in fontTools.varLib.mvar.MVAR_ENTRIES)
+ def test_varlib_build_VVAR_CFF2(self):
+ ds_path = self.get_test_input('TestVVAR.designspace')
+ ttx_dir = self.get_test_input("master_vvar_cff2")
+ expected_ttx_name = 'TestVVAR'
+ suffix = '.otf'
+
+ self.temp_dir()
+ for path in self.get_file_list(ttx_dir, '.ttx', 'TestVVAR'):
+ font, savepath = self.compile_font(path, suffix, self.tempdir)
+
+ ds = DesignSpaceDocument.fromfile(ds_path)
+ for source in ds.sources:
+ source.path = os.path.join(
+ self.tempdir, os.path.basename(source.filename).replace(".ufo", suffix)
+ )
+ ds.updatePaths()
+
+ varfont, _, _ = build(ds)
+ varfont = reload_font(varfont)
+
+ expected_ttx_path = self.get_test_output(expected_ttx_name + '.ttx')
+ tables = ["VVAR"]
+ self.expect_ttx(varfont, expected_ttx_path, tables)
+ self.check_ttx_dump(varfont, expected_ttx_path, tables, suffix)
+
def test_load_masters_layerName_without_required_font():
ds = DesignSpaceDocument()
diff --git a/Tests/voltLib/parser_test.py b/Tests/voltLib/parser_test.py
index a532b375..3bfa17c8 100644
--- a/Tests/voltLib/parser_test.py
+++ b/Tests/voltLib/parser_test.py
@@ -1,12 +1,9 @@
from __future__ import print_function, division, absolute_import
from __future__ import unicode_literals
+from fontTools.misc.py23 import *
from fontTools.voltLib import ast
from fontTools.voltLib.error import VoltLibError
from fontTools.voltLib.parser import Parser
-from io import open
-import os
-import shutil
-import tempfile
import unittest
@@ -1119,22 +1116,8 @@ class ParserTest(unittest.TestCase):
def_glyph.type, def_glyph.components),
(".notdef", 0, None, "BASE", None))
- def setUp(self):
- self.tempdir = None
- self.num_tempfiles = 0
-
- def tearDown(self):
- if self.tempdir:
- shutil.rmtree(self.tempdir)
-
def parse(self, text):
- if not self.tempdir:
- self.tempdir = tempfile.mkdtemp()
- self.num_tempfiles += 1
- path = os.path.join(self.tempdir, "tmp%d.vtp" % self.num_tempfiles)
- with open(path, "w") as outfile:
- outfile.write(text)
- return Parser(path).parse()
+ return Parser(UnicodeIO(text)).parse()
if __name__ == "__main__":
import sys
diff --git a/requirements.txt b/requirements.txt
index 8532edd5..f26fe104 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,4 +6,4 @@ unicodedata2==11.0.0; python_version < '3.7' and platform_python_implementation
scipy==1.2.1; platform_python_implementation != "PyPy"
munkres==1.0.12; platform_python_implementation == "PyPy" # pyup: ignore
zopfli==0.1.6
-fs==2.4.4
+fs==2.4.5
diff --git a/setup.cfg b/setup.cfg
index a3bcdd1c..98f1c5da 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,5 @@
[bumpversion]
-current_version = 3.39.0
+current_version = 3.41.2
commit = True
tag = False
tag_name = {new_version}
diff --git a/setup.py b/setup.py
index 0b244a49..2d3124a2 100755
--- a/setup.py
+++ b/setup.py
@@ -352,7 +352,7 @@ def find_data_files(manpath="share/man"):
setup(
name="fonttools",
- version="3.39.0",
+ version="3.41.2",
description="Tools to manipulate font files",
author="Just van Rossum",
author_email="just@letterror.com",