diff --git a/.gitignore b/.gitignore
index 78b51a3a..9ee41731 100644
--- a/.gitignore
+++ b/.gitignore
@@ -49,6 +49,7 @@ coverage.xml
*.cover
.hypothesis/
.pytest_cache/
+tests/data/test.fea
# Translations
*.mo
diff --git a/Lib/fontmake/__main__.py b/Lib/fontmake/__main__.py
index 177eab6d..0147750c 100644
--- a/Lib/fontmake/__main__.py
+++ b/Lib/fontmake/__main__.py
@@ -17,6 +17,7 @@
from argparse import ArgumentParser, FileType
from collections import namedtuple
from contextlib import contextmanager
+from textwrap import dedent
from ufo2ft import CFFOptimization
from ufo2ft.featureWriters import loadFeatureWriterFromString
@@ -237,7 +238,7 @@ def main(args=None):
"--output-path",
default=None,
help="Output font file path. Only valid when the output is a single "
- "file (e.g. input is a single UFO or output is variable font)",
+ "file (e.g. input is a single UFO or output is a single variable font)",
)
outputSubGroup.add_argument(
"--output-dir",
@@ -259,6 +260,24 @@ def main(args=None):
'E.g.: -i "Noto Sans Bold"; or -i ".* UI Condensed". '
"(for Glyphs or MutatorMath sources only). ",
)
+ outputGroup.add_argument(
+ "--variable-fonts",
+ nargs="?",
+ default=True,
+ const=True,
+ metavar="VARIABLE_FONT_FILENAME",
+ help=dedent(
+ """\
+ Filter the list of variable fonts produced from the input
+ Designspace file. By default all listed variable fonts are
+ generated. To generate a specific variable font (or variable fonts)
+ that match a given "filename" attribute, you can pass as argument
+ the full filename or a regular expression. E.g.: --variable-fonts
+ "MyFontVF_WeightOnly.ttf"; or --variable-fonts
+ "MyFontVFItalic_.*.ttf".
+ """
+ ),
+ )
outputGroup.add_argument(
"--use-mutatormath",
action="store_true",
@@ -558,7 +577,13 @@ def main(args=None):
"variable output",
)
else:
- exclude_args(parser, args, ["optimize_gvar"], "static output", positive=False)
+ exclude_args(
+ parser,
+ args,
+ ["variable_fonts", "optimize_gvar"],
+ "static output",
+ positive=False,
+ )
if args.get("use_mutatormath"):
for module in ("defcon", "mutatorMath"):
@@ -607,6 +632,7 @@ def main(args=None):
args,
[
"interpolate",
+ "variable_fonts",
"use_mutatormath",
"interpolate_binary_layout",
"round_instances",
diff --git a/Lib/fontmake/font_project.py b/Lib/fontmake/font_project.py
index 70ac0816..1b006818 100644
--- a/Lib/fontmake/font_project.py
+++ b/Lib/fontmake/font_project.py
@@ -21,6 +21,7 @@
from collections import OrderedDict
from contextlib import contextmanager
from functools import partial
+from pathlib import Path
from re import fullmatch
import attr
@@ -28,6 +29,7 @@
import ufo2ft.errors
import ufoLib2
from fontTools import designspaceLib
+from fontTools.designspaceLib.split import splitInterpolable
from fontTools.misc.loggingTools import Timer, configLogger
from fontTools.misc.plistlib import load as readPlist
from fontTools.ttLib import TTFont
@@ -306,9 +308,10 @@ def build_interpolatable_otfs(self, designspace, **kwargs):
"""
return self._build_interpolatable_masters(designspace, ttf=False, **kwargs)
- def build_variable_font(
+ def build_variable_fonts(
self,
- designspace,
+ designspace: designspaceLib.DesignSpaceDocument,
+ variable_fonts=True,
output_path=None,
output_dir=None,
ttf=True,
@@ -324,22 +327,55 @@ def build_variable_font(
filters=None,
**kwargs,
):
- """Build OpenType variable font from masters in a designspace."""
+ """Build OpenType variable fonts from masters in a designspace."""
assert not (output_path and output_dir), "mutually exclusive args"
- if output_path is None:
- output_path = (
- os.path.splitext(os.path.basename(designspace.path))[0] + "-VF"
+ vfs_in_document = designspace.getVariableFonts()
+ if not vfs_in_document:
+ logger.warning(
+ "No variable fonts in given designspace %s", designspace.path
)
- ext = "ttf" if ttf else "otf"
- output_path = self._output_path(
- output_path, ext, is_variable=True, output_dir=output_dir
+ return {}
+
+ vfs_to_build = []
+ for vf in vfs_in_document:
+ # Skip variable fonts that do not match the user's inclusion regex if given.
+ if isinstance(variable_fonts, str) and not fullmatch(
+ variable_fonts, vf.name
+ ):
+ continue
+ vfs_to_build.append(vf)
+
+ if not vfs_to_build:
+ logger.warning("No variable fonts matching %s", variable_fonts)
+ return {}
+
+ if len(vfs_to_build) > 1 and output_path:
+ raise FontmakeError(
+ "can't specify output path because there are several VFs to build",
+ designspace,
)
- logger.info("Building variable font " + output_path)
+ vf_name_to_output_path = {}
+ if len(vfs_to_build) == 1 and output_path is not None:
+ vf_name_to_output_path[vfs_to_build[0].name] = output_path
+ else:
+ for vf in vfs_to_build:
+ ext = "ttf" if ttf else "otf"
+ font_name = vf.name
+ if vf.filename is not None:
+ font_name = Path(vf.filename).stem
+ output_path = self._output_path(
+ font_name, ext, is_variable=True, output_dir=output_dir
+ )
+ vf_name_to_output_path[vf.name] = output_path
+
+ logger.info(
+ "Building variable fonts " + ", ".join(vf_name_to_output_path.values())
+ )
if ttf:
- font = ufo2ft.compileVariableTTF(
+ fonts = ufo2ft.compileVariableTTFs(
designspace,
featureWriters=feature_writers,
useProductionNames=use_production_names,
@@ -350,9 +386,10 @@ def build_variable_font(
debugFeatureFile=debug_feature_file,
filters=filters,
inplace=True,
+ variableFontNames=list(vf_name_to_output_path),
)
else:
- font = ufo2ft.compileVariableCFF2(
+ fonts = ufo2ft.compileVariableCFF2s(
designspace,
featureWriters=feature_writers,
useProductionNames=use_production_names,
@@ -361,9 +398,11 @@ def build_variable_font(
optimizeCFF=optimize_cff,
filters=filters,
inplace=True,
+ variableFontNames=list(vf_name_to_output_path),
)
- font.save(output_path)
+ for name, font in fonts.items():
+ font.save(vf_name_to_output_path[name])
def _iter_compile(self, ufos, ttf=False, debugFeatureFile=None, **kwargs):
# generator function that calls ufo2ft compiler for each ufo and
@@ -771,6 +810,8 @@ def interpolate_instance_ufos(
interpolation failed.
ValueError: an instance descriptor did not have a filename attribute set.
"""
+ # TODO: (Jany) for each instance, figure out in which "interpolatable sub-space" it is, and give that to mutatormath/the other one
+ # Maybe easier to make 1 designspace per interpolatable sub-space, and call this function X times?
from glyphsLib.interpolation import apply_instance_data_to_ufo
logger.info("Interpolating master UFOs from designspace")
@@ -859,6 +900,8 @@ def interpolate_instance_ufos_mutatormath(
ValueError: "expand_features_to_instances" is True but no source in the
designspace document is designated with ''.
"""
+ # TODO: (Jany) for each instance, figure out in which "interpolatable sub-space" it is, and give that to mutatormath/the other one
+ # Maybe easier to make 1 designspace per interpolatable sub-space, and call this function X times?
from glyphsLib.interpolation import apply_instance_data
from mutatorMath.ufo.document import DesignSpaceDocumentReader
@@ -910,6 +953,7 @@ def run_from_designspace(
designspace_path,
output=(),
interpolate=False,
+ variable_fonts=True,
masters_as_instances=False,
interpolate_binary_layout=False,
round_instances=False,
@@ -930,6 +974,11 @@ def run_from_designspace(
match given name. The string is compiled into a regular
expression and matched against the "name" attribute of
designspace instances using `re.fullmatch`.
+ variable_fonts: if True output all variable fonts, otherwise if the
+ value is a string, only build variable fonts that match the
+ given filename. As above, the string is compiled into a regular
+ expression and matched against the "filename" attribute of
+ designspace variable fonts using `re.fullmatch`.
masters_as_instances: If True, output master fonts as instances.
interpolate_binary_layout: Interpolate layout tables from compiled
master binaries.
@@ -974,15 +1023,22 @@ def run_from_designspace(
preFilters, postFilters = loadFilters(designspace)
filters = preFilters + postFilters
- source_fonts = [source.font for source in designspace.sources]
- # glyphsLib currently stores this custom parameter on the fonts,
- # not the designspace, so we check if it exists in any font's lib.
- explicit_check = any(
- font.lib.get(COMPAT_CHECK_KEY, False) for font in source_fonts
- )
- if interp_outputs or check_compatibility or explicit_check:
- if not CompatibilityChecker(source_fonts).check():
- raise FontmakeError("Compatibility check failed", designspace.path)
+ # Since Designspace version 5, one designspace file can have discrete
+ # axes (that do not interpolate) and thus only some sub-spaces are
+ # actually compatible for interpolation.
+ for discrete_location, subDoc in splitInterpolable(designspace):
+ # glyphsLib currently stores this custom parameter on the fonts,
+ # not the designspace, so we check if it exists in any font's lib.
+ source_fonts = [source.font for source in subDoc.sources]
+ explicit_check = any(
+ font.lib.get(COMPAT_CHECK_KEY, False) for font in source_fonts
+ )
+ if interp_outputs or check_compatibility or explicit_check:
+ if not CompatibilityChecker(source_fonts).check():
+ message = "Compatibility check failed"
+ if discrete_location:
+ message += f" in interpolable sub-space at {discrete_location}"
+ raise FontmakeError(message, designspace.path)
try:
if static_outputs:
@@ -1003,6 +1059,7 @@ def run_from_designspace(
self._run_from_designspace_interpolatable(
designspace,
outputs=interp_outputs,
+ variable_fonts=variable_fonts,
feature_writers=feature_writers,
filters=filters,
**kwargs,
@@ -1078,13 +1135,23 @@ def _run_from_designspace_static(
)
def _run_from_designspace_interpolatable(
- self, designspace, outputs, output_path=None, output_dir=None, **kwargs
+ self,
+ designspace,
+ outputs,
+ variable_fonts=True,
+ output_path=None,
+ output_dir=None,
+ **kwargs,
):
ttf_designspace = otf_designspace = None
if "variable" in outputs:
- self.build_variable_font(
- designspace, output_path=output_path, output_dir=output_dir, **kwargs
+ self.build_variable_fonts(
+ designspace,
+ variable_fonts=variable_fonts,
+ output_path=output_path,
+ output_dir=output_dir,
+ **kwargs,
)
if "ttf-interpolatable" in outputs:
@@ -1092,8 +1159,9 @@ def _run_from_designspace_interpolatable(
self._save_interpolatable_fonts(ttf_designspace, output_dir, ttf=True)
if "variable-cff2" in outputs:
- self.build_variable_font(
+ self.build_variable_fonts(
designspace,
+ variable_fonts=variable_fonts,
output_path=output_path,
output_dir=output_dir,
ttf=False,
@@ -1281,3 +1349,4 @@ def _varLib_finder(source, directory="", ext="ttf"):
def _normpath(fname):
return os.path.normcase(os.path.normpath(fname))
+
diff --git a/requirements.txt b/requirements.txt
index c9330141..4c6d24cd 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,7 +7,8 @@ fontMath==0.9.1
defcon[lxml]==0.10.0; platform_python_implementation == 'CPython'
defcon==0.10.0; platform_python_implementation != 'CPython'
booleanOperations==0.9.0
-ufoLib2==0.13.1
+# ufoLib2==0.13.1
+git+https://github.com/googlefonts/ufoLib2@build-ds5
attrs==21.4.0
cffsubr==0.2.9.post1
compreffor==0.5.1.post1
diff --git a/tests/data/MutatorSansLite/LICENSE b/tests/data/MutatorSansLite/LICENSE
new file mode 100644
index 00000000..affdc0ee
--- /dev/null
+++ b/tests/data/MutatorSansLite/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Erik van Blokland
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/tests/data/MutatorSansLite/MutatorFamily_v5_discrete_axis.designspace b/tests/data/MutatorSansLite/MutatorFamily_v5_discrete_axis.designspace
new file mode 100644
index 00000000..438e6b2d
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorFamily_v5_discrete_axis.designspace
@@ -0,0 +1,206 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/features.fea b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/features.fea
new file mode 100644
index 00000000..901a3dee
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/features.fea
@@ -0,0 +1 @@
+# this is the feature from boldcondensed.
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/fontinfo.plist b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/fontinfo.plist
new file mode 100644
index 00000000..ce38d59e
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/fontinfo.plist
@@ -0,0 +1,69 @@
+
+
+
+
+ ascender
+ 800
+ capHeight
+ 800
+ copyright
+ License same as MutatorMath. BSD 3-clause. [test-token: A]
+ descender
+ -200
+ familyName
+ MutatorMathTest
+ guidelines
+
+
+ italicAngle
+ 0
+ openTypeNameLicense
+ License same as MutatorMath. BSD 3-clause. [test-token: A]
+ openTypeOS2VendorID
+ LTTR
+ postscriptBlueValues
+
+
+ postscriptDefaultWidthX
+ 500
+ postscriptFamilyBlues
+
+
+ postscriptFamilyOtherBlues
+
+
+ postscriptFontName
+ MutatorMathTest-BoldCondensed
+ postscriptFullName
+ MutatorMathTest BoldCondensed
+ postscriptOtherBlues
+
+
+ postscriptSlantAngle
+ 0
+ postscriptStemSnapH
+
+
+ postscriptStemSnapV
+
+
+ postscriptWindowsCharacterSet
+ 1
+ styleMapFamilyName
+
+ styleMapStyleName
+ regular
+ styleName
+ BoldCondensed
+ unitsPerEm
+ 1000
+ versionMajor
+ 1
+ versionMinor
+ 2
+ xHeight
+ 500
+ year
+ 2004
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background/S_.closed.glif
new file mode 100644
index 00000000..171df271
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background/S_.closed.glif
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background/contents.plist b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background/contents.plist
new file mode 100644
index 00000000..070780aa
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background/contents.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background/layerinfo.plist
new file mode 100644
index 00000000..11c425fc
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background/layerinfo.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ color
+ 0.5,1,0,0.7
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/A_.glif b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/A_.glif
new file mode 100644
index 00000000..96c2cbb4
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/A_.glif
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_.glif b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_.glif
new file mode 100644
index 00000000..61d60d10
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_.glif
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_.narrow.glif b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_.narrow.glif
new file mode 100644
index 00000000..50bb19bb
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_.narrow.glif
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_J_.glif b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_J_.glif
new file mode 100644
index 00000000..1b8857b2
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_J_.glif
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/S_.closed.glif
new file mode 100644
index 00000000..8a4d6c74
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/S_.closed.glif
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.letterror.skateboard.navigator
+
+ location
+
+ weight
+ 1000
+ width
+ 108.0069405692
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/S_.glif b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/S_.glif
new file mode 100644
index 00000000..8d959e05
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/S_.glif
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/contents.plist b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/contents.plist
new file mode 100644
index 00000000..9f8a737a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/contents.plist
@@ -0,0 +1,18 @@
+
+
+
+
+ A
+ A_.glif
+ I
+ I_.glif
+ I.narrow
+ I_.narrow.glif
+ IJ
+ I_J_.glif
+ S
+ S_.glif
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/layerinfo.plist
new file mode 100644
index 00000000..a1a92f92
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/layerinfo.plist
@@ -0,0 +1,13 @@
+
+
+
+
+ color
+ 1,0.75,0,0.7
+ lib
+
+ com.typemytype.robofont.segmentType
+ curve
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/layercontents.plist b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/layercontents.plist
new file mode 100644
index 00000000..8964c569
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/layercontents.plist
@@ -0,0 +1,14 @@
+
+
+
+
+
+ foreground
+ glyphs
+
+
+ background
+ glyphs.background
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/lib.plist b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/lib.plist
new file mode 100644
index 00000000..789d780e
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/lib.plist
@@ -0,0 +1,270 @@
+
+
+
+
+ com.defcon.sortDescriptor
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ alphabetical
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ category
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ unicode
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ script
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ suffix
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ decompositionBase
+
+
+ com.letterror.lightMeter.prefs
+
+ chunkSize
+ 5
+ diameter
+ 200
+ drawTail
+
+ invert
+
+ toolDiameter
+ 30
+ toolStyle
+ fluid
+
+ com.typemytype.robofont.background.layerStrokeColor
+
+ 0
+ 0.8
+ 0.2
+ 0.7
+
+ com.typemytype.robofont.compileSettings.autohint
+
+ com.typemytype.robofont.compileSettings.checkOutlines
+
+ com.typemytype.robofont.compileSettings.createDummyDSIG
+
+ com.typemytype.robofont.compileSettings.decompose
+
+ com.typemytype.robofont.compileSettings.generateFormat
+ 0
+ com.typemytype.robofont.compileSettings.releaseMode
+
+ com.typemytype.robofont.foreground.layerStrokeColor
+
+ 0.5
+ 0
+ 0.5
+ 0.7
+
+ com.typemytype.robofont.italicSlantOffset
+ 0
+ com.typemytype.robofont.segmentType
+ curve
+ com.typemytype.robofont.shouldAddPointsInSplineConversion
+ 1
+ com.typesupply.defcon.sortDescriptor
+
+
+ ascending
+
+ space
+ A
+ B
+ C
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
+ N
+ O
+ P
+ Q
+ R
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
+ a
+ b
+ c
+ d
+ e
+ f
+ g
+ h
+ i
+ j
+ k
+ l
+ m
+ n
+ ntilde
+ o
+ p
+ q
+ r
+ s
+ t
+ u
+ v
+ w
+ x
+ y
+ z
+ zcaron
+ zero
+ one
+ two
+ three
+ four
+ five
+ six
+ seven
+ eight
+ nine
+ underscore
+ hyphen
+ endash
+ emdash
+ parenleft
+ parenright
+ bracketleft
+ bracketright
+ braceleft
+ braceright
+ numbersign
+ percent
+ period
+ comma
+ colon
+ semicolon
+ exclam
+ question
+ slash
+ backslash
+ bar
+ at
+ ampersand
+ paragraph
+ bullet
+ dollar
+ trademark
+ fi
+ fl
+ .notdef
+ a_b_c
+ Atilde
+ Adieresis
+ Acircumflex
+ Aring
+ Ccedilla
+ Agrave
+ Aacute
+ quotedblright
+ quotedblleft
+
+ type
+ glyphList
+
+
+ public.glyphOrder
+
+ A
+ Aacute
+ Adieresis
+ B
+ C
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
+ N
+ O
+ P
+ Q
+ R
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
+ IJ
+ S.closed
+ I.narrow
+ J.narrow
+ quotesinglbase
+ quotedblbase
+ quotedblleft
+ quotedblright
+ comma
+ period
+ colon
+ semicolon
+ dot
+ dieresis
+ acute
+ space
+ arrowdown
+ arrowleft
+ arrowright
+ arrowup
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/metainfo.plist b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/metainfo.plist
new file mode 100644
index 00000000..555d9ce4
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/metainfo.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ creator
+ com.github.fonttools.ufoLib
+ formatVersion
+ 3
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/features.fea b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/features.fea
new file mode 100644
index 00000000..50f3fc0a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/features.fea
@@ -0,0 +1 @@
+# this is the feature from BoldWide
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/fontinfo.plist b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/fontinfo.plist
new file mode 100644
index 00000000..2204ed8a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/fontinfo.plist
@@ -0,0 +1,69 @@
+
+
+
+
+ ascender
+ 800
+ capHeight
+ 800
+ copyright
+ License same as MutatorMath. BSD 3-clause. [test-token: B]
+ descender
+ -200
+ familyName
+ MutatorMathTest
+ guidelines
+
+
+ italicAngle
+ 0
+ openTypeNameLicense
+ License same as MutatorMath. BSD 3-clause. [test-token: B]
+ openTypeOS2VendorID
+ LTTR
+ postscriptBlueValues
+
+
+ postscriptDefaultWidthX
+ 500
+ postscriptFamilyBlues
+
+
+ postscriptFamilyOtherBlues
+
+
+ postscriptFontName
+ MutatorMathTest-BoldWide
+ postscriptFullName
+ MutatorMathTest BoldWide
+ postscriptOtherBlues
+
+
+ postscriptSlantAngle
+ 0
+ postscriptStemSnapH
+
+
+ postscriptStemSnapV
+
+
+ postscriptWindowsCharacterSet
+ 1
+ styleMapFamilyName
+
+ styleMapStyleName
+ regular
+ styleName
+ BoldWide
+ unitsPerEm
+ 1000
+ versionMajor
+ 1
+ versionMinor
+ 2
+ xHeight
+ 500
+ year
+ 2004
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/S_.closed.glif
new file mode 100644
index 00000000..8edc65fb
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/S_.closed.glif
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/S_.glif b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/S_.glif
new file mode 100644
index 00000000..c6e56152
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/S_.glif
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/contents.plist b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/contents.plist
new file mode 100644
index 00000000..ad569c1a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/contents.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ S
+ S_.glif
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/layerinfo.plist
new file mode 100644
index 00000000..11c425fc
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/layerinfo.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ color
+ 0.5,1,0,0.7
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/A_.glif b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/A_.glif
new file mode 100644
index 00000000..2ee56837
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/A_.glif
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_.glif b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_.glif
new file mode 100644
index 00000000..65ac4863
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_.glif
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_.narrow.glif b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_.narrow.glif
new file mode 100644
index 00000000..f706273d
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_.narrow.glif
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_J_.glif b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_J_.glif
new file mode 100644
index 00000000..0ede8402
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_J_.glif
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/S_.closed.glif
new file mode 100644
index 00000000..1c43b40f
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/S_.closed.glif
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/S_.glif b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/S_.glif
new file mode 100644
index 00000000..cd5d502e
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/S_.glif
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/contents.plist b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/contents.plist
new file mode 100644
index 00000000..9f8a737a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/contents.plist
@@ -0,0 +1,18 @@
+
+
+
+
+ A
+ A_.glif
+ I
+ I_.glif
+ I.narrow
+ I_.narrow.glif
+ IJ
+ I_J_.glif
+ S
+ S_.glif
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/layerinfo.plist
new file mode 100644
index 00000000..a1a92f92
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/layerinfo.plist
@@ -0,0 +1,13 @@
+
+
+
+
+ color
+ 1,0.75,0,0.7
+ lib
+
+ com.typemytype.robofont.segmentType
+ curve
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/layercontents.plist b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/layercontents.plist
new file mode 100644
index 00000000..8964c569
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/layercontents.plist
@@ -0,0 +1,14 @@
+
+
+
+
+
+ foreground
+ glyphs
+
+
+ background
+ glyphs.background
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/lib.plist b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/lib.plist
new file mode 100644
index 00000000..212920f8
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/lib.plist
@@ -0,0 +1,396 @@
+
+
+
+
+ com.defcon.sortDescriptor
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ alphabetical
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ category
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ unicode
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ script
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ suffix
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ decompositionBase
+
+
+ com.letterror.lightMeter.prefs
+
+ chunkSize
+ 5
+ diameter
+ 200
+ drawTail
+
+ invert
+
+ toolDiameter
+ 30
+ toolStyle
+ fluid
+
+ com.typemytype.robofont.background.layerStrokeColor
+
+ 0
+ 0.8
+ 0.2
+ 0.7
+
+ com.typemytype.robofont.compileSettings.autohint
+
+ com.typemytype.robofont.compileSettings.checkOutlines
+
+ com.typemytype.robofont.compileSettings.createDummyDSIG
+
+ com.typemytype.robofont.compileSettings.decompose
+
+ com.typemytype.robofont.compileSettings.generateFormat
+ 0
+ com.typemytype.robofont.compileSettings.releaseMode
+
+ com.typemytype.robofont.foreground.layerStrokeColor
+
+ 0.5
+ 0
+ 0.5
+ 0.7
+
+ com.typemytype.robofont.italicSlantOffset
+ 0
+ com.typemytype.robofont.segmentType
+ curve
+ com.typemytype.robofont.shouldAddPointsInSplineConversion
+ 1
+ com.typesupply.defcon.sortDescriptor
+
+
+ ascending
+
+ space
+ A
+ Agrave
+ Aacute
+ Acircumflex
+ Atilde
+ Adieresis
+ Aring
+ B
+ C
+ Ccedilla
+ D
+ E
+ Egrave
+ Eacute
+ Ecircumflex
+ Edieresis
+ F
+ G
+ H
+ I
+ Igrave
+ Iacute
+ Icircumflex
+ Idieresis
+ J
+ K
+ L
+ M
+ N
+ Ntilde
+ O
+ Ograve
+ Oacute
+ Ocircumflex
+ Otilde
+ Odieresis
+ P
+ Q
+ R
+ S
+ Scaron
+ T
+ U
+ Ugrave
+ Uacute
+ Ucircumflex
+ Udieresis
+ V
+ W
+ X
+ Y
+ Yacute
+ Ydieresis
+ Z
+ Zcaron
+ AE
+ Eth
+ Oslash
+ Thorn
+ Lslash
+ OE
+ a
+ agrave
+ aacute
+ acircumflex
+ atilde
+ adieresis
+ aring
+ b
+ c
+ ccedilla
+ d
+ e
+ egrave
+ eacute
+ ecircumflex
+ edieresis
+ f
+ g
+ h
+ i
+ igrave
+ iacute
+ icircumflex
+ idieresis
+ j
+ k
+ l
+ m
+ n
+ ntilde
+ o
+ ograve
+ oacute
+ ocircumflex
+ otilde
+ odieresis
+ p
+ q
+ r
+ s
+ scaron
+ t
+ u
+ ugrave
+ uacute
+ ucircumflex
+ udieresis
+ v
+ w
+ x
+ y
+ yacute
+ ydieresis
+ z
+ zcaron
+ ordfeminine
+ ordmasculine
+ germandbls
+ ae
+ eth
+ oslash
+ thorn
+ dotlessi
+ lslash
+ oe
+ zero
+ one
+ two
+ three
+ four
+ five
+ six
+ seven
+ eight
+ nine
+ onesuperior
+ twosuperior
+ threesuperior
+ onequarter
+ onehalf
+ threequarters
+ underscore
+ hyphen
+ endash
+ emdash
+ parenleft
+ parenright
+ bracketleft
+ bracketright
+ braceleft
+ braceright
+ numbersign
+ percent
+ perthousand
+ quotesingle
+ quotedbl
+ quoteleft
+ quoteright
+ quotedblleft
+ quotedblright
+ quotesinglbase
+ quotedblbase
+ guilsinglleft
+ guilsinglright
+ guillemotleft
+ guillemotright
+ asterisk
+ dagger
+ daggerdbl
+ period
+ comma
+ colon
+ semicolon
+ ellipsis
+ exclam
+ exclamdown
+ question
+ questiondown
+ slash
+ backslash
+ fraction
+ bar
+ brokenbar
+ at
+ ampersand
+ section
+ paragraph
+ periodcentered
+ bullet
+ plus
+ minus
+ plusminus
+ divide
+ multiply
+ equal
+ less
+ greater
+ logicalnot
+ mu
+ dollar
+ cent
+ sterling
+ currency
+ yen
+ Euro
+ florin
+ asciicircum
+ asciitilde
+ acute
+ grave
+ hungarumlaut
+ circumflex
+ caron
+ breve
+ tilde
+ macron
+ dieresis
+ dotaccent
+ ring
+ cedilla
+ ogonek
+ copyright
+ registered
+ trademark
+ degree
+ fi
+ fl
+ .notdef
+ a_b_c
+
+ type
+ glyphList
+
+
+ public.glyphOrder
+
+ A
+ Aacute
+ Adieresis
+ B
+ C
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
+ N
+ O
+ P
+ Q
+ R
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
+ S.closed
+ I.narrow
+ J.narrow
+ quotesinglbase
+ quotedblbase
+ quotedblleft
+ quotedblright
+ comma
+ period
+ colon
+ semicolon
+ dot
+ dieresis
+ acute
+ space
+ IJ
+ arrowdown
+ arrowleft
+ arrowright
+ arrowup
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/metainfo.plist b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/metainfo.plist
new file mode 100644
index 00000000..555d9ce4
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/metainfo.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ creator
+ com.github.fonttools.ufoLib
+ formatVersion
+ 3
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/features.fea b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/features.fea
new file mode 100644
index 00000000..d48f133e
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/features.fea
@@ -0,0 +1,2 @@
+# this is the feature from lightCondensed
+# Hi_this_is_the_feature.
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/fontinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/fontinfo.plist
new file mode 100644
index 00000000..9c345653
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/fontinfo.plist
@@ -0,0 +1,69 @@
+
+
+
+
+ ascender
+ 700
+ capHeight
+ 700
+ copyright
+ License same as MutatorMath. BSD 3-clause. [test-token: C]
+ descender
+ -200
+ familyName
+ MutatorMathTest
+ guidelines
+
+
+ italicAngle
+ 0
+ openTypeNameLicense
+ License same as MutatorMath. BSD 3-clause. [test-token: C]
+ openTypeOS2VendorID
+ LTTR
+ postscriptBlueValues
+
+
+ postscriptDefaultWidthX
+ 500
+ postscriptFamilyBlues
+
+
+ postscriptFamilyOtherBlues
+
+
+ postscriptFontName
+ MutatorMathTest-LightCondensed
+ postscriptFullName
+ MutatorMathTest LightCondensed
+ postscriptOtherBlues
+
+
+ postscriptSlantAngle
+ 0
+ postscriptStemSnapH
+
+
+ postscriptStemSnapV
+
+
+ postscriptWindowsCharacterSet
+ 1
+ styleMapFamilyName
+
+ styleMapStyleName
+ regular
+ styleName
+ LightCondensed
+ unitsPerEm
+ 1000
+ versionMajor
+ 1
+ versionMinor
+ 2
+ xHeight
+ 500
+ year
+ 2004
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/S_.closed.glif
new file mode 100644
index 00000000..961125dd
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/S_.closed.glif
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/S_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/S_.glif
new file mode 100644
index 00000000..824f5951
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/S_.glif
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.letterror.skateboard.navigator
+
+ location
+
+ weight
+ 820
+ width
+ 1000
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/contents.plist
new file mode 100644
index 00000000..ad569c1a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/contents.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ S
+ S_.glif
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/layerinfo.plist
new file mode 100644
index 00000000..f4b11f8f
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background/layerinfo.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ color
+ 0,1,1,0.7
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle/S_.closed.glif
new file mode 100644
index 00000000..b215ae51
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle/S_.closed.glif
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.letterror.skateboard.navigator
+
+ location
+
+ weight
+ 700
+ width
+ 569.078
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle/contents.plist
new file mode 100644
index 00000000..070780aa
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle/contents.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle/layerinfo.plist
new file mode 100644
index 00000000..d308c316
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle/layerinfo.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ color
+ 0.5,0,1,0.7
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/S_.closed.glif
new file mode 100644
index 00000000..6166c85a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/S_.closed.glif
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.letterror.skateboard.navigator
+
+ location
+
+ weight
+ 673.7998527961
+ width
+ 1000
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/S_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/S_.glif
new file mode 100644
index 00000000..fb72577c
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/S_.glif
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.letterror.skateboard.navigator
+
+ location
+
+ weight
+ 759.5997715405
+ width
+ 1000
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/contents.plist
new file mode 100644
index 00000000..ad569c1a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/contents.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ S
+ S_.glif
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/layerinfo.plist
new file mode 100644
index 00000000..c8b71789
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide/layerinfo.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ color
+ 0,0.25,1,0.7
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar/S_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar/S_.glif
new file mode 100644
index 00000000..7b885787
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar/S_.glif
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.letterror.skateboard.navigator
+
+ location
+
+ weight
+ 889.1982375724
+ width
+ 0
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar/contents.plist
new file mode 100644
index 00000000..269fb998
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar/contents.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ S
+ S_.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar/layerinfo.plist
new file mode 100644
index 00000000..7c2e64be
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar/layerinfo.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ color
+ 0,1,0.25,0.7
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars/E_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars/E_.glif
new file mode 100644
index 00000000..0efc33a1
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars/E_.glif
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars/contents.plist
new file mode 100644
index 00000000..a14a2f5a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars/contents.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ E
+ E_.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars/layerinfo.plist
new file mode 100644
index 00000000..564c7a6b
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars/layerinfo.plist
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/A_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/A_.glif
new file mode 100644
index 00000000..cda1ef49
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/A_.glif
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+ com.letterror.skateboard.navigator
+
+ location
+
+ space
+ 0
+ weight
+ 600
+ width
+ 500
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/S_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/S_.glif
new file mode 100644
index 00000000..104c47bd
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/S_.glif
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.letterror.skateboard.navigator
+
+ location
+
+ space
+ 25
+ weight
+ 707.6485770089
+ width
+ 181.3105119978
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/contents.plist
new file mode 100644
index 00000000..6aa5de8c
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/contents.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ A
+ A_.glif
+ S
+ S_.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/layerinfo.plist
new file mode 100644
index 00000000..044b46c6
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support/layerinfo.plist
@@ -0,0 +1,13 @@
+
+
+
+
+ color
+ 0,1,0.25,0.7
+ lib
+
+ com.typemytype.robofont.segmentType
+ curve
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/A_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/A_.glif
new file mode 100644
index 00000000..9919ca8a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/A_.glif
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_.glif
new file mode 100644
index 00000000..5833a6b2
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_.glif
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_.narrow.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_.narrow.glif
new file mode 100644
index 00000000..6c0ac44b
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_.narrow.glif
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_J_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_J_.glif
new file mode 100644
index 00000000..66b0b682
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_J_.glif
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/S_.closed.glif
new file mode 100644
index 00000000..2972471f
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/S_.closed.glif
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/S_.glif b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/S_.glif
new file mode 100644
index 00000000..0215663a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/S_.glif
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/contents.plist
new file mode 100644
index 00000000..9f8a737a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/contents.plist
@@ -0,0 +1,18 @@
+
+
+
+
+ A
+ A_.glif
+ I
+ I_.glif
+ I.narrow
+ I_.narrow.glif
+ IJ
+ I_J_.glif
+ S
+ S_.glif
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/layerinfo.plist
new file mode 100644
index 00000000..a1a92f92
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/layerinfo.plist
@@ -0,0 +1,13 @@
+
+
+
+
+ color
+ 1,0.75,0,0.7
+ lib
+
+ com.typemytype.robofont.segmentType
+ curve
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/layercontents.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/layercontents.plist
new file mode 100644
index 00000000..4e957cd1
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/layercontents.plist
@@ -0,0 +1,30 @@
+
+
+
+
+
+ foreground
+ glyphs
+
+
+ support
+ glyphs.support
+
+
+ support.crossbar
+ glyphs.support.crossbar
+
+
+ background
+ glyphs.background
+
+
+ support.S.wide
+ glyphs.support.S_.wide
+
+
+ support.S.middle
+ glyphs.support.S_.middle
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/lib.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/lib.plist
new file mode 100644
index 00000000..47a92b78
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/lib.plist
@@ -0,0 +1,685 @@
+
+
+
+
+ com.defcon.sortDescriptor
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ alphabetical
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ category
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ unicode
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ script
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ suffix
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ decompositionBase
+
+
+ com.letterror.lightMeter.prefs
+
+ chunkSize
+ 5
+ diameter
+ 200
+ drawTail
+
+ invert
+
+ toolDiameter
+ 30
+ toolStyle
+ fluid
+
+ com.typemytype.robofont.background.layerStrokeColor
+
+ 0
+ 0.8
+ 0.2
+ 0.7
+
+ com.typemytype.robofont.compileSettings.autohint
+
+ com.typemytype.robofont.compileSettings.checkOutlines
+
+ com.typemytype.robofont.compileSettings.createDummyDSIG
+
+ com.typemytype.robofont.compileSettings.decompose
+
+ com.typemytype.robofont.compileSettings.generateFormat
+ 0
+ com.typemytype.robofont.compileSettings.releaseMode
+
+ com.typemytype.robofont.foreground.layerStrokeColor
+
+ 0.5
+ 0
+ 0.5
+ 0.7
+
+ com.typemytype.robofont.italicSlantOffset
+ 0
+ com.typemytype.robofont.segmentType
+ curve
+ com.typemytype.robofont.shouldAddPointsInSplineConversion
+ 1
+ com.typesupply.MetricsMachine4.groupColors
+
+ @MMK_L_A
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_L_C
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_L_E
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_L_I
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_L_N
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_L_O
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_L_S
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_L_U
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_L_Y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_L_Z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_L_a
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_L_c
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_L_e
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_L_i
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_L_n
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_L_o
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_L_s
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_L_u
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_L_y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_L_z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_R_A
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_R_C
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_R_E
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_R_I
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_R_N
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_R_O
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_R_S
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_R_U
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_R_Y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_R_Z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_R_a
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_R_c
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_R_e
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_R_i
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_R_n
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_R_o
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_R_s
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_R_u
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_R_y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_R_z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+
+ com.typesupply.defcon.sortDescriptor
+
+
+ ascending
+
+ space
+ A
+ Agrave
+ Aacute
+ Acircumflex
+ Atilde
+ Adieresis
+ Aring
+ B
+ C
+ Ccedilla
+ D
+ E
+ Egrave
+ Eacute
+ Ecircumflex
+ Edieresis
+ F
+ G
+ H
+ I
+ Igrave
+ Iacute
+ Icircumflex
+ Idieresis
+ J
+ K
+ L
+ M
+ N
+ Ntilde
+ O
+ Ograve
+ Oacute
+ Ocircumflex
+ Otilde
+ Odieresis
+ P
+ Q
+ R
+ S
+ Scaron
+ T
+ U
+ Ugrave
+ Uacute
+ Ucircumflex
+ Udieresis
+ V
+ W
+ X
+ Y
+ Yacute
+ Ydieresis
+ Z
+ Zcaron
+ AE
+ Eth
+ Oslash
+ Thorn
+ Lslash
+ OE
+ a
+ agrave
+ aacute
+ acircumflex
+ atilde
+ adieresis
+ aring
+ b
+ c
+ ccedilla
+ d
+ e
+ egrave
+ eacute
+ ecircumflex
+ edieresis
+ f
+ g
+ h
+ i
+ igrave
+ iacute
+ icircumflex
+ idieresis
+ j
+ k
+ l
+ m
+ n
+ ntilde
+ o
+ ograve
+ oacute
+ ocircumflex
+ otilde
+ odieresis
+ p
+ q
+ r
+ s
+ scaron
+ t
+ u
+ ugrave
+ uacute
+ ucircumflex
+ udieresis
+ v
+ w
+ x
+ y
+ yacute
+ ydieresis
+ z
+ zcaron
+ ordfeminine
+ ordmasculine
+ germandbls
+ ae
+ eth
+ oslash
+ thorn
+ dotlessi
+ lslash
+ oe
+ mu
+ zero
+ one
+ two
+ three
+ four
+ five
+ six
+ seven
+ eight
+ nine
+ onesuperior
+ twosuperior
+ threesuperior
+ onequarter
+ onehalf
+ threequarters
+ underscore
+ hyphen
+ endash
+ emdash
+ parenleft
+ parenright
+ bracketleft
+ bracketright
+ braceleft
+ braceright
+ numbersign
+ percent
+ perthousand
+ quotesingle
+ quotedbl
+ quoteleft
+ quoteright
+ quotedblleft
+ quotedblright
+ quotesinglbase
+ quotedblbase
+ guilsinglleft
+ guilsinglright
+ asterisk
+ dagger
+ daggerdbl
+ period
+ comma
+ colon
+ semicolon
+ ellipsis
+ exclam
+ exclamdown
+ question
+ questiondown
+ slash
+ backslash
+ fraction
+ bar
+ brokenbar
+ at
+ ampersand
+ section
+ paragraph
+ periodcentered
+ bullet
+ plus
+ minus
+ plusminus
+ divide
+ multiply
+ equal
+ less
+ greater
+ logicalnot
+ dollar
+ cent
+ sterling
+ currency
+ yen
+ Euro
+ asciicircum
+ asciitilde
+ acute
+ grave
+ hungarumlaut
+ circumflex
+ caron
+ breve
+ tilde
+ macron
+ dieresis
+ dotaccent
+ ring
+ cedilla
+ ogonek
+ copyright
+ registered
+ trademark
+ degree
+ florin
+ guillemotleft
+ guillemotright
+ fi
+ fl
+ a_b_c
+ .notdef
+
+ type
+ glyphList
+
+
+ public.glyphOrder
+
+ A
+ Aacute
+ Adieresis
+ B
+ C
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
+ N
+ O
+ P
+ Q
+ R
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
+ S.closed
+ I.narrow
+ J.narrow
+ quotesinglbase
+ quotedblbase
+ quotedblleft
+ quotedblright
+ comma
+ period
+ colon
+ semicolon
+ arrowleft
+ arrowup
+ arrowright
+ arrowdown
+ dot
+ dieresis
+ acute
+ space
+ IJ
+
+ testLibItemKey
+
+ a
+ b
+ c
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/metainfo.plist b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/metainfo.plist
new file mode 100644
index 00000000..555d9ce4
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/metainfo.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ creator
+ com.github.fonttools.ufoLib
+ formatVersion
+ 3
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/features.fea b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/features.fea
new file mode 100644
index 00000000..29234c51
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/features.fea
@@ -0,0 +1 @@
+# this is the feature from lightWide
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/fontinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/fontinfo.plist
new file mode 100644
index 00000000..4112d763
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/fontinfo.plist
@@ -0,0 +1,69 @@
+
+
+
+
+ ascender
+ 700
+ capHeight
+ 700
+ copyright
+ License same as MutatorMath. BSD 3-clause. [test-token: D]
+ descender
+ -200
+ familyName
+ MutatorMathTest
+ guidelines
+
+
+ italicAngle
+ 0
+ openTypeNameLicense
+ License same as MutatorMath. BSD 3-clause. [test-token: D]
+ openTypeOS2VendorID
+ LTTR
+ postscriptBlueValues
+
+
+ postscriptDefaultWidthX
+ 500
+ postscriptFamilyBlues
+
+
+ postscriptFamilyOtherBlues
+
+
+ postscriptFontName
+ MutatorMathTest-LightWide
+ postscriptFullName
+ MutatorMathTest LightWide
+ postscriptOtherBlues
+
+
+ postscriptSlantAngle
+ 0
+ postscriptStemSnapH
+
+
+ postscriptStemSnapV
+
+
+ postscriptWindowsCharacterSet
+ 1
+ styleMapFamilyName
+
+ styleMapStyleName
+ regular
+ styleName
+ LightWide
+ unitsPerEm
+ 1000
+ versionMajor
+ 1
+ versionMinor
+ 2
+ xHeight
+ 500
+ year
+ 2004
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/S_.closed.glif
new file mode 100644
index 00000000..24ce93ad
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/S_.closed.glif
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/contents.plist
new file mode 100644
index 00000000..070780aa
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/contents.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/layerinfo.plist
new file mode 100644
index 00000000..11c425fc
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/layerinfo.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ color
+ 0.5,1,0,0.7
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00/contents.plist
new file mode 100644
index 00000000..0c67376e
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00/contents.plist
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00/layerinfo.plist
new file mode 100644
index 00000000..cd2c7c02
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00/layerinfo.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ color
+ 0,0.25,1,0.7
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00/S_.glif b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00/S_.glif
new file mode 100644
index 00000000..81a594ce
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00/S_.glif
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00/contents.plist
new file mode 100644
index 00000000..8087673b
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00/contents.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ S
+ S_.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00/layerinfo.plist
new file mode 100644
index 00000000..11dd5c2b
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00/layerinfo.plist
@@ -0,0 +1,13 @@
+
+
+
+
+ color
+ 0,1,0.25,0.7
+ lib
+
+ com.typemytype.robofont.segmentType
+ curve
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38/contents.plist
new file mode 100644
index 00000000..0c67376e
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38/contents.plist
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38/layerinfo.plist
new file mode 100644
index 00000000..7c15f1ab
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38/layerinfo.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ color
+ 0.5,0,1,0.7
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00/S_.glif b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00/S_.glif
new file mode 100644
index 00000000..3ea5029d
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00/S_.glif
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00/contents.plist
new file mode 100644
index 00000000..8087673b
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00/contents.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ S
+ S_.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00/layerinfo.plist
new file mode 100644
index 00000000..5c424780
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00/layerinfo.plist
@@ -0,0 +1,13 @@
+
+
+
+
+ color
+ 0,1,1,0.7
+ lib
+
+ com.typemytype.robofont.segmentType
+ curve
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/A_.glif b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/A_.glif
new file mode 100644
index 00000000..6d724993
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/A_.glif
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_.glif b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_.glif
new file mode 100644
index 00000000..155e81d0
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_.glif
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_.narrow.glif b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_.narrow.glif
new file mode 100644
index 00000000..9d79c5ca
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_.narrow.glif
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_J_.glif b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_J_.glif
new file mode 100644
index 00000000..51d9df58
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_J_.glif
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/S_.closed.glif b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/S_.closed.glif
new file mode 100644
index 00000000..e6a958d1
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/S_.closed.glif
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/S_.glif b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/S_.glif
new file mode 100644
index 00000000..349c3fe9
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/S_.glif
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/contents.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/contents.plist
new file mode 100644
index 00000000..9f8a737a
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/contents.plist
@@ -0,0 +1,18 @@
+
+
+
+
+ A
+ A_.glif
+ I
+ I_.glif
+ I.narrow
+ I_.narrow.glif
+ IJ
+ I_J_.glif
+ S
+ S_.glif
+ S.closed
+ S_.closed.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/layerinfo.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/layerinfo.plist
new file mode 100644
index 00000000..a1a92f92
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/layerinfo.plist
@@ -0,0 +1,13 @@
+
+
+
+
+ color
+ 1,0.75,0,0.7
+ lib
+
+ com.typemytype.robofont.segmentType
+ curve
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/layercontents.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/layercontents.plist
new file mode 100644
index 00000000..8964c569
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/layercontents.plist
@@ -0,0 +1,14 @@
+
+
+
+
+
+ foreground
+ glyphs
+
+
+ background
+ glyphs.background
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/lib.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/lib.plist
new file mode 100644
index 00000000..046c3a3c
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/lib.plist
@@ -0,0 +1,664 @@
+
+
+
+
+ com.defcon.sortDescriptor
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ alphabetical
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ category
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ unicode
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ script
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ suffix
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ decompositionBase
+
+
+ com.typemytype.robofont.background.layerStrokeColor
+
+ 1
+ 0.75
+ 0
+ 0.7
+
+ com.typemytype.robofont.compileSettings.autohint
+
+ com.typemytype.robofont.compileSettings.checkOutlines
+
+ com.typemytype.robofont.compileSettings.createDummyDSIG
+
+ com.typemytype.robofont.compileSettings.decompose
+
+ com.typemytype.robofont.compileSettings.generateFormat
+ 0
+ com.typemytype.robofont.compileSettings.releaseMode
+
+ com.typemytype.robofont.foreground.layerStrokeColor
+
+ 0.5
+ 0
+ 0.5
+ 0.7
+
+ com.typemytype.robofont.italicSlantOffset
+ 0
+ com.typemytype.robofont.segmentType
+ curve
+ com.typemytype.robofont.shouldAddPointsInSplineConversion
+ 1
+ com.typesupply.MetricsMachine4.groupColors
+
+ @MMK_L_A
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_L_C
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_L_E
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_L_I
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_L_N
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_L_O
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_L_S
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_L_U
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_L_Y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_L_Z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_L_a
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_L_c
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_L_e
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_L_i
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_L_n
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_L_o
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_L_s
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_L_u
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_L_y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_L_z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_R_A
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_R_C
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_R_E
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_R_I
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_R_N
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_R_O
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_R_S
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_R_U
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_R_Y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_R_Z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_R_a
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_R_c
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_R_e
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_R_i
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_R_n
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_R_o
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_R_s
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_R_u
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_R_y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_R_z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+
+ com.typesupply.defcon.sortDescriptor
+
+
+ ascending
+
+ space
+ A
+ Agrave
+ Aacute
+ Acircumflex
+ Atilde
+ Adieresis
+ Aring
+ B
+ C
+ Ccedilla
+ D
+ E
+ Egrave
+ Eacute
+ Ecircumflex
+ Edieresis
+ F
+ G
+ H
+ I
+ Igrave
+ Iacute
+ Icircumflex
+ Idieresis
+ J
+ K
+ L
+ M
+ N
+ Ntilde
+ O
+ Ograve
+ Oacute
+ Ocircumflex
+ Otilde
+ Odieresis
+ P
+ Q
+ R
+ S
+ Scaron
+ T
+ U
+ Ugrave
+ Uacute
+ Ucircumflex
+ Udieresis
+ V
+ W
+ X
+ Y
+ Yacute
+ Ydieresis
+ Z
+ Zcaron
+ AE
+ Eth
+ Oslash
+ Thorn
+ Lslash
+ OE
+ a
+ agrave
+ aacute
+ acircumflex
+ atilde
+ adieresis
+ aring
+ b
+ c
+ ccedilla
+ d
+ e
+ egrave
+ eacute
+ ecircumflex
+ edieresis
+ f
+ g
+ h
+ i
+ igrave
+ iacute
+ icircumflex
+ idieresis
+ j
+ k
+ l
+ m
+ n
+ ntilde
+ o
+ ograve
+ oacute
+ ocircumflex
+ otilde
+ odieresis
+ p
+ q
+ r
+ s
+ scaron
+ t
+ u
+ ugrave
+ uacute
+ ucircumflex
+ udieresis
+ v
+ w
+ x
+ y
+ yacute
+ ydieresis
+ z
+ zcaron
+ ordfeminine
+ ordmasculine
+ germandbls
+ ae
+ eth
+ oslash
+ thorn
+ dotlessi
+ lslash
+ oe
+ zero
+ one
+ two
+ three
+ four
+ five
+ six
+ seven
+ eight
+ nine
+ onesuperior
+ twosuperior
+ threesuperior
+ onequarter
+ onehalf
+ threequarters
+ underscore
+ hyphen
+ endash
+ emdash
+ parenleft
+ parenright
+ bracketleft
+ bracketright
+ braceleft
+ braceright
+ numbersign
+ percent
+ perthousand
+ quotesingle
+ quotedbl
+ quoteleft
+ quoteright
+ quotedblleft
+ quotedblright
+ quotesinglbase
+ quotedblbase
+ guilsinglleft
+ guilsinglright
+ guillemotleft
+ guillemotright
+ asterisk
+ dagger
+ daggerdbl
+ period
+ comma
+ colon
+ semicolon
+ ellipsis
+ exclam
+ exclamdown
+ question
+ questiondown
+ slash
+ backslash
+ fraction
+ bar
+ brokenbar
+ at
+ ampersand
+ section
+ paragraph
+ periodcentered
+ bullet
+ plus
+ minus
+ plusminus
+ divide
+ multiply
+ equal
+ less
+ greater
+ logicalnot
+ mu
+ dollar
+ cent
+ sterling
+ currency
+ yen
+ Euro
+ florin
+ asciicircum
+ asciitilde
+ acute
+ grave
+ hungarumlaut
+ circumflex
+ caron
+ breve
+ tilde
+ macron
+ dieresis
+ dotaccent
+ ring
+ cedilla
+ ogonek
+ copyright
+ registered
+ trademark
+ degree
+ fi
+ fl
+ .notdef
+ a_b_c
+
+ type
+ glyphList
+
+
+ public.glyphOrder
+
+ A
+ Aacute
+ Adieresis
+ B
+ C
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
+ N
+ O
+ P
+ Q
+ R
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
+ S.closed
+ I.narrow
+ J.narrow
+ quotesinglbase
+ quotedblbase
+ quotedblleft
+ quotedblright
+ comma
+ period
+ colon
+ semicolon
+ arrowleft
+ arrowup
+ arrowright
+ arrowdown
+ dot
+ dieresis
+ acute
+ space
+ IJ
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/metainfo.plist b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/metainfo.plist
new file mode 100644
index 00000000..555d9ce4
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/metainfo.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ creator
+ com.github.fonttools.ufoLib
+ formatVersion
+ 3
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSans_v5_implicit_one_vf.designspace b/tests/data/MutatorSansLite/MutatorSans_v5_implicit_one_vf.designspace
new file mode 100644
index 00000000..d46aa7a6
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSans_v5_implicit_one_vf.designspace
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSans_v5_several_vfs.designspace b/tests/data/MutatorSansLite/MutatorSans_v5_several_vfs.designspace
new file mode 100644
index 00000000..f87907dc
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSans_v5_several_vfs.designspace
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSans_v5_several_vfs_discrete_axis.designspace b/tests/data/MutatorSansLite/MutatorSans_v5_several_vfs_discrete_axis.designspace
new file mode 100644
index 00000000..8b7dfde4
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSans_v5_several_vfs_discrete_axis.designspace
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/features.fea b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/features.fea
new file mode 100644
index 00000000..d48f133e
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/features.fea
@@ -0,0 +1,2 @@
+# this is the feature from lightCondensed
+# Hi_this_is_the_feature.
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/fontinfo.plist b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/fontinfo.plist
new file mode 100644
index 00000000..5868628c
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/fontinfo.plist
@@ -0,0 +1,69 @@
+
+
+
+
+ ascender
+ 700
+ capHeight
+ 700
+ copyright
+ License same as MutatorMath. BSD 3-clause. [test-token: C]
+ descender
+ -200
+ familyName
+ MutatorMathTest
+ guidelines
+
+
+ italicAngle
+ 0
+ openTypeNameLicense
+ License same as MutatorMath. BSD 3-clause. [test-token: C]
+ openTypeOS2VendorID
+ LTTR
+ postscriptBlueValues
+
+
+ postscriptDefaultWidthX
+ 500
+ postscriptFamilyBlues
+
+
+ postscriptFamilyOtherBlues
+
+
+ postscriptFontName
+ MutatorMathTest-LightCondensed
+ postscriptFullName
+ MutatorMathTest LightCondensed
+ postscriptOtherBlues
+
+
+ postscriptSlantAngle
+ 0
+ postscriptStemSnapH
+
+
+ postscriptStemSnapV
+
+
+ postscriptWindowsCharacterSet
+ 1
+ styleMapFamilyName
+
+ styleMapStyleName
+ regular
+ styleName
+ SerifLightCondensed
+ unitsPerEm
+ 1000
+ versionMajor
+ 1
+ versionMinor
+ 2
+ xHeight
+ 500
+ year
+ 2004
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/glyphs/A_.glif b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/glyphs/A_.glif
new file mode 100644
index 00000000..09716ab2
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/glyphs/A_.glif
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/glyphs/contents.plist b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/glyphs/contents.plist
new file mode 100644
index 00000000..be1cec83
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/glyphs/contents.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ A
+ A_.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/layercontents.plist b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/layercontents.plist
new file mode 100644
index 00000000..0de42769
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/layercontents.plist
@@ -0,0 +1,10 @@
+
+
+
+
+
+ foreground
+ glyphs
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/lib.plist b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/lib.plist
new file mode 100644
index 00000000..47a92b78
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/lib.plist
@@ -0,0 +1,685 @@
+
+
+
+
+ com.defcon.sortDescriptor
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ alphabetical
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ category
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ unicode
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ script
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ suffix
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ decompositionBase
+
+
+ com.letterror.lightMeter.prefs
+
+ chunkSize
+ 5
+ diameter
+ 200
+ drawTail
+
+ invert
+
+ toolDiameter
+ 30
+ toolStyle
+ fluid
+
+ com.typemytype.robofont.background.layerStrokeColor
+
+ 0
+ 0.8
+ 0.2
+ 0.7
+
+ com.typemytype.robofont.compileSettings.autohint
+
+ com.typemytype.robofont.compileSettings.checkOutlines
+
+ com.typemytype.robofont.compileSettings.createDummyDSIG
+
+ com.typemytype.robofont.compileSettings.decompose
+
+ com.typemytype.robofont.compileSettings.generateFormat
+ 0
+ com.typemytype.robofont.compileSettings.releaseMode
+
+ com.typemytype.robofont.foreground.layerStrokeColor
+
+ 0.5
+ 0
+ 0.5
+ 0.7
+
+ com.typemytype.robofont.italicSlantOffset
+ 0
+ com.typemytype.robofont.segmentType
+ curve
+ com.typemytype.robofont.shouldAddPointsInSplineConversion
+ 1
+ com.typesupply.MetricsMachine4.groupColors
+
+ @MMK_L_A
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_L_C
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_L_E
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_L_I
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_L_N
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_L_O
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_L_S
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_L_U
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_L_Y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_L_Z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_L_a
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_L_c
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_L_e
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_L_i
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_L_n
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_L_o
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_L_s
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_L_u
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_L_y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_L_z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_R_A
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_R_C
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_R_E
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_R_I
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_R_N
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_R_O
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_R_S
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_R_U
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_R_Y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_R_Z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_R_a
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_R_c
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_R_e
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_R_i
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_R_n
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_R_o
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_R_s
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_R_u
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_R_y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_R_z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+
+ com.typesupply.defcon.sortDescriptor
+
+
+ ascending
+
+ space
+ A
+ Agrave
+ Aacute
+ Acircumflex
+ Atilde
+ Adieresis
+ Aring
+ B
+ C
+ Ccedilla
+ D
+ E
+ Egrave
+ Eacute
+ Ecircumflex
+ Edieresis
+ F
+ G
+ H
+ I
+ Igrave
+ Iacute
+ Icircumflex
+ Idieresis
+ J
+ K
+ L
+ M
+ N
+ Ntilde
+ O
+ Ograve
+ Oacute
+ Ocircumflex
+ Otilde
+ Odieresis
+ P
+ Q
+ R
+ S
+ Scaron
+ T
+ U
+ Ugrave
+ Uacute
+ Ucircumflex
+ Udieresis
+ V
+ W
+ X
+ Y
+ Yacute
+ Ydieresis
+ Z
+ Zcaron
+ AE
+ Eth
+ Oslash
+ Thorn
+ Lslash
+ OE
+ a
+ agrave
+ aacute
+ acircumflex
+ atilde
+ adieresis
+ aring
+ b
+ c
+ ccedilla
+ d
+ e
+ egrave
+ eacute
+ ecircumflex
+ edieresis
+ f
+ g
+ h
+ i
+ igrave
+ iacute
+ icircumflex
+ idieresis
+ j
+ k
+ l
+ m
+ n
+ ntilde
+ o
+ ograve
+ oacute
+ ocircumflex
+ otilde
+ odieresis
+ p
+ q
+ r
+ s
+ scaron
+ t
+ u
+ ugrave
+ uacute
+ ucircumflex
+ udieresis
+ v
+ w
+ x
+ y
+ yacute
+ ydieresis
+ z
+ zcaron
+ ordfeminine
+ ordmasculine
+ germandbls
+ ae
+ eth
+ oslash
+ thorn
+ dotlessi
+ lslash
+ oe
+ mu
+ zero
+ one
+ two
+ three
+ four
+ five
+ six
+ seven
+ eight
+ nine
+ onesuperior
+ twosuperior
+ threesuperior
+ onequarter
+ onehalf
+ threequarters
+ underscore
+ hyphen
+ endash
+ emdash
+ parenleft
+ parenright
+ bracketleft
+ bracketright
+ braceleft
+ braceright
+ numbersign
+ percent
+ perthousand
+ quotesingle
+ quotedbl
+ quoteleft
+ quoteright
+ quotedblleft
+ quotedblright
+ quotesinglbase
+ quotedblbase
+ guilsinglleft
+ guilsinglright
+ asterisk
+ dagger
+ daggerdbl
+ period
+ comma
+ colon
+ semicolon
+ ellipsis
+ exclam
+ exclamdown
+ question
+ questiondown
+ slash
+ backslash
+ fraction
+ bar
+ brokenbar
+ at
+ ampersand
+ section
+ paragraph
+ periodcentered
+ bullet
+ plus
+ minus
+ plusminus
+ divide
+ multiply
+ equal
+ less
+ greater
+ logicalnot
+ dollar
+ cent
+ sterling
+ currency
+ yen
+ Euro
+ asciicircum
+ asciitilde
+ acute
+ grave
+ hungarumlaut
+ circumflex
+ caron
+ breve
+ tilde
+ macron
+ dieresis
+ dotaccent
+ ring
+ cedilla
+ ogonek
+ copyright
+ registered
+ trademark
+ degree
+ florin
+ guillemotleft
+ guillemotright
+ fi
+ fl
+ a_b_c
+ .notdef
+
+ type
+ glyphList
+
+
+ public.glyphOrder
+
+ A
+ Aacute
+ Adieresis
+ B
+ C
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
+ N
+ O
+ P
+ Q
+ R
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
+ S.closed
+ I.narrow
+ J.narrow
+ quotesinglbase
+ quotedblbase
+ quotedblleft
+ quotedblright
+ comma
+ period
+ colon
+ semicolon
+ arrowleft
+ arrowup
+ arrowright
+ arrowdown
+ dot
+ dieresis
+ acute
+ space
+ IJ
+
+ testLibItemKey
+
+ a
+ b
+ c
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/metainfo.plist b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/metainfo.plist
new file mode 100644
index 00000000..555d9ce4
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/metainfo.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ creator
+ com.github.fonttools.ufoLib
+ formatVersion
+ 3
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/features.fea b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/features.fea
new file mode 100644
index 00000000..29234c51
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/features.fea
@@ -0,0 +1 @@
+# this is the feature from lightWide
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/fontinfo.plist b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/fontinfo.plist
new file mode 100644
index 00000000..af5db170
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/fontinfo.plist
@@ -0,0 +1,69 @@
+
+
+
+
+ ascender
+ 700
+ capHeight
+ 700
+ copyright
+ License same as MutatorMath. BSD 3-clause. [test-token: D]
+ descender
+ -200
+ familyName
+ MutatorMathTest
+ guidelines
+
+
+ italicAngle
+ 0
+ openTypeNameLicense
+ License same as MutatorMath. BSD 3-clause. [test-token: D]
+ openTypeOS2VendorID
+ LTTR
+ postscriptBlueValues
+
+
+ postscriptDefaultWidthX
+ 500
+ postscriptFamilyBlues
+
+
+ postscriptFamilyOtherBlues
+
+
+ postscriptFontName
+ MutatorMathTest-LightWide
+ postscriptFullName
+ MutatorMathTest LightWide
+ postscriptOtherBlues
+
+
+ postscriptSlantAngle
+ 0
+ postscriptStemSnapH
+
+
+ postscriptStemSnapV
+
+
+ postscriptWindowsCharacterSet
+ 1
+ styleMapFamilyName
+
+ styleMapStyleName
+ regular
+ styleName
+ SerifLightWide
+ unitsPerEm
+ 1000
+ versionMajor
+ 1
+ versionMinor
+ 2
+ xHeight
+ 500
+ year
+ 2004
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/glyphs/A_.glif b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/glyphs/A_.glif
new file mode 100644
index 00000000..20000b26
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/glyphs/A_.glif
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.typemytype.robofont.Image.Brightness
+ 0
+ com.typemytype.robofont.Image.Contrast
+ 1
+ com.typemytype.robofont.Image.Saturation
+ 1
+ com.typemytype.robofont.Image.Sharpness
+ 0.4
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/glyphs/contents.plist b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/glyphs/contents.plist
new file mode 100644
index 00000000..be1cec83
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/glyphs/contents.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ A
+ A_.glif
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/layercontents.plist b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/layercontents.plist
new file mode 100644
index 00000000..0de42769
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/layercontents.plist
@@ -0,0 +1,10 @@
+
+
+
+
+
+ foreground
+ glyphs
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/lib.plist b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/lib.plist
new file mode 100644
index 00000000..046c3a3c
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/lib.plist
@@ -0,0 +1,664 @@
+
+
+
+
+ com.defcon.sortDescriptor
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ alphabetical
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ category
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ unicode
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ script
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ suffix
+
+
+ allowPseudoUnicode
+
+ ascending
+
+ type
+ decompositionBase
+
+
+ com.typemytype.robofont.background.layerStrokeColor
+
+ 1
+ 0.75
+ 0
+ 0.7
+
+ com.typemytype.robofont.compileSettings.autohint
+
+ com.typemytype.robofont.compileSettings.checkOutlines
+
+ com.typemytype.robofont.compileSettings.createDummyDSIG
+
+ com.typemytype.robofont.compileSettings.decompose
+
+ com.typemytype.robofont.compileSettings.generateFormat
+ 0
+ com.typemytype.robofont.compileSettings.releaseMode
+
+ com.typemytype.robofont.foreground.layerStrokeColor
+
+ 0.5
+ 0
+ 0.5
+ 0.7
+
+ com.typemytype.robofont.italicSlantOffset
+ 0
+ com.typemytype.robofont.segmentType
+ curve
+ com.typemytype.robofont.shouldAddPointsInSplineConversion
+ 1
+ com.typesupply.MetricsMachine4.groupColors
+
+ @MMK_L_A
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_L_C
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_L_E
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_L_I
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_L_N
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_L_O
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_L_S
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_L_U
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_L_Y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_L_Z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_L_a
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_L_c
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_L_e
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_L_i
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_L_n
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_L_o
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_L_s
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_L_u
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_L_y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_L_z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_R_A
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_R_C
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_R_E
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_R_I
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_R_N
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_R_O
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_R_S
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_R_U
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_R_Y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_R_Z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+ @MMK_R_a
+
+ 1
+ 0
+ 0
+ 0.25
+
+ @MMK_R_c
+
+ 1
+ 0.5
+ 0
+ 0.25
+
+ @MMK_R_e
+
+ 1
+ 1
+ 0
+ 0.25
+
+ @MMK_R_i
+
+ 0
+ 1
+ 0
+ 0.25
+
+ @MMK_R_n
+
+ 0
+ 1
+ 1
+ 0.25
+
+ @MMK_R_o
+
+ 0
+ 0.5
+ 1
+ 0.25
+
+ @MMK_R_s
+
+ 0
+ 0
+ 1
+ 0.25
+
+ @MMK_R_u
+
+ 0.5
+ 0
+ 1
+ 0.25
+
+ @MMK_R_y
+
+ 1
+ 0
+ 1
+ 0.25
+
+ @MMK_R_z
+
+ 1
+ 0
+ 0.5
+ 0.25
+
+
+ com.typesupply.defcon.sortDescriptor
+
+
+ ascending
+
+ space
+ A
+ Agrave
+ Aacute
+ Acircumflex
+ Atilde
+ Adieresis
+ Aring
+ B
+ C
+ Ccedilla
+ D
+ E
+ Egrave
+ Eacute
+ Ecircumflex
+ Edieresis
+ F
+ G
+ H
+ I
+ Igrave
+ Iacute
+ Icircumflex
+ Idieresis
+ J
+ K
+ L
+ M
+ N
+ Ntilde
+ O
+ Ograve
+ Oacute
+ Ocircumflex
+ Otilde
+ Odieresis
+ P
+ Q
+ R
+ S
+ Scaron
+ T
+ U
+ Ugrave
+ Uacute
+ Ucircumflex
+ Udieresis
+ V
+ W
+ X
+ Y
+ Yacute
+ Ydieresis
+ Z
+ Zcaron
+ AE
+ Eth
+ Oslash
+ Thorn
+ Lslash
+ OE
+ a
+ agrave
+ aacute
+ acircumflex
+ atilde
+ adieresis
+ aring
+ b
+ c
+ ccedilla
+ d
+ e
+ egrave
+ eacute
+ ecircumflex
+ edieresis
+ f
+ g
+ h
+ i
+ igrave
+ iacute
+ icircumflex
+ idieresis
+ j
+ k
+ l
+ m
+ n
+ ntilde
+ o
+ ograve
+ oacute
+ ocircumflex
+ otilde
+ odieresis
+ p
+ q
+ r
+ s
+ scaron
+ t
+ u
+ ugrave
+ uacute
+ ucircumflex
+ udieresis
+ v
+ w
+ x
+ y
+ yacute
+ ydieresis
+ z
+ zcaron
+ ordfeminine
+ ordmasculine
+ germandbls
+ ae
+ eth
+ oslash
+ thorn
+ dotlessi
+ lslash
+ oe
+ zero
+ one
+ two
+ three
+ four
+ five
+ six
+ seven
+ eight
+ nine
+ onesuperior
+ twosuperior
+ threesuperior
+ onequarter
+ onehalf
+ threequarters
+ underscore
+ hyphen
+ endash
+ emdash
+ parenleft
+ parenright
+ bracketleft
+ bracketright
+ braceleft
+ braceright
+ numbersign
+ percent
+ perthousand
+ quotesingle
+ quotedbl
+ quoteleft
+ quoteright
+ quotedblleft
+ quotedblright
+ quotesinglbase
+ quotedblbase
+ guilsinglleft
+ guilsinglright
+ guillemotleft
+ guillemotright
+ asterisk
+ dagger
+ daggerdbl
+ period
+ comma
+ colon
+ semicolon
+ ellipsis
+ exclam
+ exclamdown
+ question
+ questiondown
+ slash
+ backslash
+ fraction
+ bar
+ brokenbar
+ at
+ ampersand
+ section
+ paragraph
+ periodcentered
+ bullet
+ plus
+ minus
+ plusminus
+ divide
+ multiply
+ equal
+ less
+ greater
+ logicalnot
+ mu
+ dollar
+ cent
+ sterling
+ currency
+ yen
+ Euro
+ florin
+ asciicircum
+ asciitilde
+ acute
+ grave
+ hungarumlaut
+ circumflex
+ caron
+ breve
+ tilde
+ macron
+ dieresis
+ dotaccent
+ ring
+ cedilla
+ ogonek
+ copyright
+ registered
+ trademark
+ degree
+ fi
+ fl
+ .notdef
+ a_b_c
+
+ type
+ glyphList
+
+
+ public.glyphOrder
+
+ A
+ Aacute
+ Adieresis
+ B
+ C
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
+ N
+ O
+ P
+ Q
+ R
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
+ S.closed
+ I.narrow
+ J.narrow
+ quotesinglbase
+ quotedblbase
+ quotedblleft
+ quotedblright
+ comma
+ period
+ colon
+ semicolon
+ arrowleft
+ arrowup
+ arrowright
+ arrowdown
+ dot
+ dieresis
+ acute
+ space
+ IJ
+
+
+
diff --git a/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/metainfo.plist b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/metainfo.plist
new file mode 100644
index 00000000..555d9ce4
--- /dev/null
+++ b/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/metainfo.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ creator
+ com.github.fonttools.ufoLib
+ formatVersion
+ 3
+
+
diff --git a/tests/test_main.py b/tests/test_main.py
index 7acd0f06..8ab4d48d 100644
--- a/tests/test_main.py
+++ b/tests/test_main.py
@@ -1,10 +1,13 @@
+import logging
import platform
import shutil
+from textwrap import dedent
import fontTools.designspaceLib as designspaceLib
import fontTools.ttLib
import pytest
import ufoLib2
+from fontTools.misc.testTools import getXML
import fontmake.__main__
@@ -757,3 +760,239 @@ def test_autohinting(data_dir, tmp_path, autohint_options):
assert "fpgm" in test_output_ttf # hinted
else:
assert "fpgm" not in test_output_ttf # unhinted
+
+
+def test_main_designspace_v5_builds_STAT(data_dir, tmp_path):
+ fontmake.__main__.main(
+ [
+ "--verbose",
+ "DEBUG",
+ "-m",
+ str(
+ data_dir
+ / "MutatorSansLite"
+ / "MutatorSans_v5_implicit_one_vf.designspace"
+ ),
+ "-o",
+ "variable",
+ "--output-dir",
+ str(tmp_path),
+ ]
+ )
+ test_output_ttf = fontTools.ttLib.TTFont(
+ tmp_path / "MutatorSans_v5_implicit_one_vf-VF.ttf"
+ )
+ stat = test_output_ttf["STAT"]
+ assert (
+ getXML(stat.toXML)
+ == dedent(
+ """\
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ """
+ ).splitlines()
+ )
+
+
+def test_main_designspace_v5_builds_all_vfs(data_dir, tmp_path):
+ fontmake.__main__.main(
+ [
+ "-m",
+ str(
+ data_dir
+ / "MutatorSansLite"
+ / "MutatorFamily_v5_discrete_axis.designspace"
+ ),
+ "-o",
+ "variable",
+ "--output-dir",
+ str(tmp_path),
+ ]
+ )
+
+ assert (tmp_path / "MutatorSansVariable_Weight_Width.ttf").exists()
+ assert (tmp_path / "MutatorSansVariable_Weight.ttf").exists()
+ assert (tmp_path / "MutatorSansVariable_Width.ttf").exists()
+ assert (tmp_path / "MutatorSerifVariable_Width.ttf").exists()
+
+
+def test_main_designspace_v5_select_no_matching_fonts_shows_nice_message(
+ data_dir, tmp_path, caplog
+):
+ with caplog.at_level(logging.WARNING):
+ fontmake.__main__.main(
+ [
+ "-m",
+ str(
+ data_dir
+ / "MutatorSansLite"
+ / "MutatorFamily_v5_discrete_axis.designspace"
+ ),
+ "--variable-fonts",
+ "NothingMatchesThisRegex",
+ "-o",
+ "variable",
+ "--output-dir",
+ str(tmp_path),
+ ]
+ )
+
+ assert "No variable fonts matching NothingMatchesThisRegex" in caplog.text
+
+ # Nothing gets built
+ assert not (tmp_path / "MutatorSansVariable_Weight_Width.ttf").exists()
+ assert not (tmp_path / "MutatorSansVariable_Weight.ttf").exists()
+ assert not (tmp_path / "MutatorSansVariable_Width.ttf").exists()
+ assert not (tmp_path / "MutatorSerifVariable_Width.ttf").exists()
+
+
+def test_main_designspace_v5_select_vfs_to_build(data_dir, tmp_path):
+ fontmake.__main__.main(
+ [
+ "-m",
+ str(
+ data_dir
+ / "MutatorSansLite"
+ / "MutatorFamily_v5_discrete_axis.designspace"
+ ),
+ "--variable-fonts",
+ "MutatorSansVariable_Weight.*",
+ "-o",
+ "variable",
+ "--output-dir",
+ str(tmp_path),
+ ]
+ )
+
+ assert (tmp_path / "MutatorSansVariable_Weight_Width.ttf").exists()
+ assert (tmp_path / "MutatorSansVariable_Weight.ttf").exists()
+ assert not (tmp_path / "MutatorSansVariable_Width.ttf").exists()
+ assert not (tmp_path / "MutatorSerifVariable_Width.ttf").exists()
+
+
+def test_main_designspace_v5_can_use_output_path_with_1_vf(data_dir, tmp_path):
+ fontmake.__main__.main(
+ [
+ "-m",
+ str(
+ data_dir / "MutatorSansLite" / "MutatorSans_v5_several_vfs.designspace"
+ ),
+ "-o",
+ "variable",
+ "--variable-fonts",
+ "MutatorSansVariable_Width",
+ "--output-path",
+ str(tmp_path / "MySingleVF.ttf"),
+ ]
+ )
+
+ assert (tmp_path / "MySingleVF.ttf").exists()
+
+
+def test_main_designspace_v5_dont_interpolate_discrete_axis(data_dir, tmp_path):
+ fontmake.__main__.main(
+ [
+ "-m",
+ str(
+ data_dir
+ / "MutatorSansLite"
+ / "MutatorSans_v5_several_vfs_discrete_axis.designspace"
+ ),
+ "-o",
+ "variable",
+ "--output-dir",
+ str(tmp_path),
+ ]
+ )
+ assert (tmp_path / "MutatorSansCondensedVariable_Weight.ttf").exists()
+ assert (tmp_path / "MutatorSansExtendedVariable_Weight.ttf").exists()