aboutsummaryrefslogtreecommitdiff
path: root/Tests
diff options
context:
space:
mode:
authorSadaf Ebrahimi <sadafebrahimi@google.com>2022-05-12 18:05:00 +0000
committerSadaf Ebrahimi <sadafebrahimi@google.com>2022-05-12 18:05:00 +0000
commitfc762b549913f1b63f8ad0949d5cb1e8c797bc09 (patch)
tree1dff6c1c2a08ce8152e5b964fc0021acdf9696f1 /Tests
parent0b59a54a78ee22be83fe249c724c19ebd7d26ede (diff)
downloadfonttools-fc762b549913f1b63f8ad0949d5cb1e8c797bc09.tar.gz
Updating fonttools 4.31.2 to fonttools 4.33.3
Test: treehugger Change-Id: I9367f96628439f01492f561c1ef52a561b7194d8
Diffstat (limited to 'Tests')
-rw-r--r--Tests/config_test.py135
-rw-r--r--Tests/designspaceLib/__init__.py0
-rw-r--r--Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_Wght.designspace114
-rw-r--r--Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_WghtWdth.designspace316
-rw-r--r--Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Wght.designspace103
-rw-r--r--Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdth.designspace307
-rw-r--r--Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdthItal.designspace670
-rw-r--r--Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Italic.designspace326
-rw-r--r--Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Roman.designspace334
-rw-r--r--Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_Wght.designspace96
-rw-r--r--Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_WghtWdth.designspace262
-rw-r--r--Tests/designspaceLib/data/split_output/AktivGroteskVF_Wght.designspace85
-rw-r--r--Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdth.designspace253
-rw-r--r--Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdthItal.designspace562
-rw-r--r--Tests/designspaceLib/data/split_output/MutatorSansVariable_Weight.designspace55
-rw-r--r--Tests/designspaceLib/data/split_output/MutatorSansVariable_Weight_Width.designspace129
-rw-r--r--Tests/designspaceLib/data/split_output/MutatorSansVariable_Width.designspace50
-rw-r--r--Tests/designspaceLib/data/split_output/MutatorSerifVariable_Width.designspace29
-rw-r--r--Tests/designspaceLib/data/split_output/SourceSerif4Variable-Italic.designspace266
-rw-r--r--Tests/designspaceLib/data/split_output/SourceSerif4Variable-Roman.designspace274
-rw-r--r--Tests/designspaceLib/data/split_output/test_v5_MutatorSans_and_Serif_serif_0.0.designspace147
-rw-r--r--Tests/designspaceLib/data/split_output/test_v5_MutatorSans_and_Serif_serif_1.0.designspace44
-rw-r--r--Tests/designspaceLib/data/split_output/test_v5_aktiv_.designspace595
-rw-r--r--Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_0.0.designspace282
-rw-r--r--Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_1.0.designspace274
-rw-r--r--Tests/designspaceLib/data/test_v4_original.designspace (renamed from Tests/designspaceLib/data/test.designspace)9
-rw-r--r--Tests/designspaceLib/data/test_v5.designspace294
-rw-r--r--Tests/designspaceLib/data/test_v5_MutatorSans_and_Serif.designspace206
-rw-r--r--Tests/designspaceLib/data/test_v5_aktiv.designspace621
-rw-r--r--Tests/designspaceLib/data/test_v5_decovar.designspace242
-rw-r--r--Tests/designspaceLib/data/test_v5_discrete.designspace139
-rw-r--r--Tests/designspaceLib/data/test_v5_original.designspace90
-rw-r--r--Tests/designspaceLib/data/test_v5_sourceserif.designspace646
-rw-r--r--Tests/designspaceLib/designspace_test.py74
-rw-r--r--Tests/designspaceLib/designspace_v5_test.py888
-rw-r--r--Tests/designspaceLib/fixtures.py8
-rw-r--r--Tests/designspaceLib/split_test.py150
-rw-r--r--Tests/designspaceLib/statNames_test.py61
-rw-r--r--Tests/feaLib/data/spec6h_ii.ttx24
-rw-r--r--Tests/feaLib/data/spec6h_iii_3d.ttx20
-rw-r--r--Tests/fontBuilder/fontBuilder_test.py16
-rw-r--r--Tests/merge/data/CFFFont_expected.ttx2
-rw-r--r--Tests/misc/configTools_test.py80
-rw-r--r--Tests/misc/psCharStrings_test.py9
-rw-r--r--Tests/otlLib/optimize_test.py39
-rw-r--r--Tests/subset/data/expect_harfbuzz_repacker.ttx78
-rw-r--r--Tests/subset/data/expect_lcar_0.ttx2
-rw-r--r--Tests/subset/data/expect_lcar_1.ttx2
-rw-r--r--Tests/subset/data/expect_opbd_0.ttx2
-rw-r--r--Tests/subset/data/expect_opbd_1.ttx2
-rw-r--r--Tests/subset/data/expect_prop_0.ttx2
-rw-r--r--Tests/subset/data/expect_prop_1.ttx2
-rw-r--r--Tests/subset/data/harfbuzz_repacker.ttx1542
-rw-r--r--Tests/subset/subset_test.py422
-rw-r--r--Tests/varLib/data/test_results/InterpolateLayoutGPOS_8_diff.ttx (renamed from Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_diff.ttx)24
-rw-r--r--Tests/varLib/data/test_results/InterpolateLayoutGPOS_8_same.ttx (renamed from Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_same.ttx)24
-rw-r--r--Tests/varLib/instancer/instancer_test.py9
-rw-r--r--Tests/varLib/interpolate_layout_test.py12
-rw-r--r--Tests/varLib/stat_test.py167
59 files changed, 11332 insertions, 284 deletions
diff --git a/Tests/config_test.py b/Tests/config_test.py
new file mode 100644
index 00000000..58163913
--- /dev/null
+++ b/Tests/config_test.py
@@ -0,0 +1,135 @@
+from fontTools.misc.configTools import AbstractConfig, Options
+import pytest
+from fontTools.config import (
+ OPTIONS,
+ Config,
+ ConfigUnknownOptionError,
+ ConfigValueParsingError,
+ ConfigValueValidationError,
+)
+from fontTools.ttLib import TTFont
+
+
+def test_can_register_option():
+ MY_OPTION = Config.register_option(
+ name="tests:MY_OPTION",
+ help="Test option, value should be True or False, default = True",
+ default=True,
+ parse=lambda v: v in ("True", "true", 1, True),
+ validate=lambda v: v == True or v == False,
+ )
+
+ assert MY_OPTION.name == "tests:MY_OPTION"
+ assert (
+ MY_OPTION.help == "Test option, value should be True or False, default = True"
+ )
+ assert MY_OPTION.default == True
+ assert MY_OPTION.parse("true") == True
+ assert MY_OPTION.validate("hello") == False
+
+ ttFont = TTFont(cfg={"tests:MY_OPTION": True})
+ assert True == ttFont.cfg.get("tests:MY_OPTION")
+ assert True == ttFont.cfg.get(MY_OPTION)
+
+
+# to parametrize tests of Config mapping interface accepting either a str or Option
+@pytest.fixture(
+ params=[
+ pytest.param("fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL", id="str"),
+ pytest.param(
+ OPTIONS["fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL"], id="Option"
+ ),
+ ]
+)
+def COMPRESSION_LEVEL(request):
+ return request.param
+
+
+def test_ttfont_has_config(COMPRESSION_LEVEL):
+ ttFont = TTFont(cfg={COMPRESSION_LEVEL: 8})
+ assert 8 == ttFont.cfg.get(COMPRESSION_LEVEL)
+
+
+def test_ttfont_can_take_superset_of_fonttools_config(COMPRESSION_LEVEL):
+ # Create MyConfig with all options from fontTools.config plus some
+ my_options = Options(Config.options)
+ MY_OPTION = my_options.register("custom:my_option", "help", "default", str, any)
+
+ class MyConfig(AbstractConfig):
+ options = my_options
+
+ ttFont = TTFont(cfg=MyConfig({"custom:my_option": "my_value"}))
+ assert 0 == ttFont.cfg.get(COMPRESSION_LEVEL)
+ assert "my_value" == ttFont.cfg.get(MY_OPTION)
+
+ # but the default Config doens't know about MY_OPTION
+ with pytest.raises(ConfigUnknownOptionError):
+ TTFont(cfg={MY_OPTION: "my_value"})
+
+
+def test_no_config_returns_default_values(COMPRESSION_LEVEL):
+ ttFont = TTFont()
+ assert 0 == ttFont.cfg.get(COMPRESSION_LEVEL)
+ assert 3 == ttFont.cfg.get(COMPRESSION_LEVEL, 3)
+
+
+def test_can_set_config(COMPRESSION_LEVEL):
+ ttFont = TTFont()
+ ttFont.cfg.set(COMPRESSION_LEVEL, 5)
+ assert 5 == ttFont.cfg.get(COMPRESSION_LEVEL)
+ ttFont.cfg.set(COMPRESSION_LEVEL, 6)
+ assert 6 == ttFont.cfg.get(COMPRESSION_LEVEL)
+
+
+def test_different_ttfonts_have_different_configs(COMPRESSION_LEVEL):
+ cfg = Config({COMPRESSION_LEVEL: 5})
+ ttFont1 = TTFont(cfg=cfg)
+ ttFont2 = TTFont(cfg=cfg)
+ ttFont2.cfg.set(COMPRESSION_LEVEL, 6)
+ assert 5 == ttFont1.cfg.get(COMPRESSION_LEVEL)
+ assert 6 == ttFont2.cfg.get(COMPRESSION_LEVEL)
+
+
+def test_cannot_set_inexistent_key():
+ with pytest.raises(ConfigUnknownOptionError):
+ TTFont(cfg={"notALib.notAModule.inexistent": 4})
+
+
+def test_value_not_parsed_by_default(COMPRESSION_LEVEL):
+ # Note: value given as a string
+ with pytest.raises(ConfigValueValidationError):
+ TTFont(cfg={COMPRESSION_LEVEL: "8"})
+
+
+def test_value_gets_parsed_if_asked(COMPRESSION_LEVEL):
+ # Note: value given as a string
+ ttFont = TTFont(cfg=Config({COMPRESSION_LEVEL: "8"}, parse_values=True))
+ assert 8 == ttFont.cfg.get(COMPRESSION_LEVEL)
+
+
+def test_value_parsing_can_error(COMPRESSION_LEVEL):
+ with pytest.raises(ConfigValueParsingError):
+ TTFont(
+ cfg=Config(
+ {COMPRESSION_LEVEL: "not an int"},
+ parse_values=True,
+ )
+ )
+
+
+def test_value_gets_validated(COMPRESSION_LEVEL):
+ # Note: 12 is not a valid value for GPOS compression level (must be in 0-9)
+ with pytest.raises(ConfigValueValidationError):
+ TTFont(cfg={COMPRESSION_LEVEL: 12})
+
+
+def test_implements_mutable_mapping(COMPRESSION_LEVEL):
+ cfg = Config()
+ cfg[COMPRESSION_LEVEL] = 2
+ assert 2 == cfg[COMPRESSION_LEVEL]
+ assert list(iter(cfg))
+ assert 1 == len(cfg)
+ del cfg[COMPRESSION_LEVEL]
+ assert 0 == cfg[COMPRESSION_LEVEL]
+ assert not list(iter(cfg))
+ assert 0 == len(cfg)
diff --git a/Tests/designspaceLib/__init__.py b/Tests/designspaceLib/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/Tests/designspaceLib/__init__.py
diff --git a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_Wght.designspace b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_Wght.designspace
new file mode 100644
index 00000000..aa8e4f9c
--- /dev/null
+++ b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_Wght.designspace
@@ -0,0 +1,114 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ </axes>
+ <rules processing="last">
+ <rule name="BRACKET.CYR">
+ <sub name="ghe.loclSRB" with="ghe.ital.loclSRB"/>
+ <sub name="ghe.loclMKD" with="ghe.ital.loclMKD"/>
+ <sub name="de.loclMKDSRB" with="de.ital.loclMKDSRB"/>
+ <sub name="pe.loclMKDSRB" with="pe.ital.loclMKDSRB"/>
+ <sub name="te.loclMKDSRB" with="te.ital.loclMKDSRB"/>
+ <sub name="gje.loclMKD" with="gje.ital.loclMKD"/>
+ <sub name="sha.loclMKDSRB" with="sha.ital.loclMKDSRB"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../AktivGrotesk_HairIt.ufo" name="Aktiv Grotesk Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic {126,100,1}" layer="{126,100,1}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_BlkIt.ufo" name="Aktiv Grotesk Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Hair Italic" familyname="Aktiv Grotesk" stylename="Hair Italic" filename="../instances/AktivGrotesk_HairIt.ufo" postscriptfontname="AktivGrotesk-HairItalic" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Thin Italic" familyname="Aktiv Grotesk" stylename="Thin Italic" filename="../instances/AktivGrotesk_ThIt.ufo" postscriptfontname="AktivGrotesk-ThinItalic" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Light Italic" familyname="Aktiv Grotesk" stylename="Light Italic" filename="../instances/AktivGrotesk_LtIt.ufo" postscriptfontname="AktivGrotesk-LightItalic" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Italic" familyname="Aktiv Grotesk" stylename="Italic" filename="../instances/AktivGrotesk_It.ufo" postscriptfontname="AktivGrotesk-Italic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Medium Italic" familyname="Aktiv Grotesk" stylename="Medium Italic" filename="../instances/AktivGrotesk_MdIt.ufo" postscriptfontname="AktivGrotesk-MediumItalic" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold Italic" familyname="Aktiv Grotesk" stylename="SemiBold Italic" filename="../../build/instances/AktivGrotesk_SBdIt.ufo" postscriptfontname="AktivGrotesk-SemiBoldItalic" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Bold Italic" familyname="Aktiv Grotesk" stylename="Bold Italic" filename="../instances/AktivGrotesk_BdIt.ufo" postscriptfontname="AktivGrotesk-BoldItalic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk XBold Italic" familyname="Aktiv Grotesk" stylename="XBold Italic" filename="../instances/AktivGrotesk_XBdIt.ufo" postscriptfontname="AktivGrotesk-XBoldItalic" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Black Italic" familyname="Aktiv Grotesk" stylename="Black Italic" filename="../instances/AktivGrotesk_BlkIt.ufo" postscriptfontname="AktivGrotesk-BlackItalic" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_WghtWdth.designspace b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_WghtWdth.designspace
new file mode 100644
index 00000000..2e22c019
--- /dev/null
+++ b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Italics_WghtWdth.designspace
@@ -0,0 +1,316 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ <axis tag="wdth" name="Width" minimum="75" maximum="125" default="100"/>
+ </axes>
+ <rules processing="last">
+ <rule name="BRACKET.CYR">
+ <sub name="ghe.loclSRB" with="ghe.ital.loclSRB"/>
+ <sub name="ghe.loclMKD" with="ghe.ital.loclMKD"/>
+ <sub name="de.loclMKDSRB" with="de.ital.loclMKDSRB"/>
+ <sub name="pe.loclMKDSRB" with="pe.ital.loclMKDSRB"/>
+ <sub name="te.loclMKDSRB" with="te.ital.loclMKDSRB"/>
+ <sub name="gje.loclMKD" with="gje.ital.loclMKD"/>
+ <sub name="sha.loclMKDSRB" with="sha.ital.loclMKDSRB"/>
+ </rule>
+ <rule name="BRACKET.116.185">
+ <conditionset>
+ <condition name="Weight" minimum="116" maximum="185"/>
+ <condition name="Width" minimum="75" maximum="97.5"/>
+ </conditionset>
+ <sub name="cent" with="cent.BRACKET.130"/>
+ <sub name="dollar" with="dollar.BRACKET.130"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../AktivGroteskCd_HairIt.ufo" name="Aktiv Grotesk Cd Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_HairIt.ufo" name="Aktiv Grotesk Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_HairIt.ufo" name="Aktiv Grotesk Ex Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_It.ufo" name="Aktiv Grotesk Cd Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic {126,100,1}" layer="{126,100,1}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_It.ufo" name="Aktiv Grotesk Ex Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_BlkIt.ufo" name="Aktiv Grotesk Cd Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_BlkIt.ufo" name="Aktiv Grotesk Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_BlkIt.ufo" name="Aktiv Grotesk Ex Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Cd Hair Italic" familyname="Aktiv Grotesk" stylename="Cd Hair Italic" filename="../instances/AktivGroteskCd_HairIt.ufo" postscriptfontname="AktivGrotesk-CdHairItalic" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Hair Italic" familyname="Aktiv Grotesk" stylename="Hair Italic" filename="../instances/AktivGrotesk_HairIt.ufo" postscriptfontname="AktivGrotesk-HairItalic" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair Italic" familyname="Aktiv Grotesk" stylename="Ex Hair Italic" filename="../instances/AktivGroteskEx_HairIt.ufo" postscriptfontname="AktivGrotesk-ExHairItalic" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin Italic" familyname="Aktiv Grotesk" stylename="Cd Thin Italic" filename="../instances/AktivGroteskCd_ThIt.ufo" postscriptfontname="AktivGrotesk-CdThinItalic" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Thin Italic" familyname="Aktiv Grotesk" stylename="Thin Italic" filename="../instances/AktivGrotesk_ThIt.ufo" postscriptfontname="AktivGrotesk-ThinItalic" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin Italic" familyname="Aktiv Grotesk" stylename="Ex Thin Italic" filename="../instances/AktivGroteskEx_ThIt.ufo" postscriptfontname="AktivGrotesk-ExThinItalic" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light Italic" familyname="Aktiv Grotesk" stylename="Cd Light Italic" filename="../instances/AktivGroteskCd_LtIt.ufo" postscriptfontname="AktivGrotesk-CdLightItalic" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Light Italic" familyname="Aktiv Grotesk" stylename="Light Italic" filename="../instances/AktivGrotesk_LtIt.ufo" postscriptfontname="AktivGrotesk-LightItalic" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light Italic" familyname="Aktiv Grotesk" stylename="Ex Light Italic" filename="../instances/AktivGroteskEx_LtIt.ufo" postscriptfontname="AktivGrotesk-ExLightItalic" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Italic" familyname="Aktiv Grotesk" stylename="Cd Italic" filename="../instances/AktivGroteskCd_It.ufo" postscriptfontname="AktivGrotesk-CdItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Italic" familyname="Aktiv Grotesk" stylename="Italic" filename="../instances/AktivGrotesk_It.ufo" postscriptfontname="AktivGrotesk-Italic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Italic" familyname="Aktiv Grotesk" stylename="Ex Italic" filename="../instances/AktivGroteskEx_It.ufo" postscriptfontname="AktivGrotesk-ExItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium Italic" familyname="Aktiv Grotesk" stylename="Cd Medium Italic" filename="../instances/AktivGroteskCd_MdIt.ufo" postscriptfontname="AktivGrotesk-CdMediumItalic" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Medium Italic" familyname="Aktiv Grotesk" stylename="Medium Italic" filename="../instances/AktivGrotesk_MdIt.ufo" postscriptfontname="AktivGrotesk-MediumItalic" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium Italic" familyname="Aktiv Grotesk" stylename="Ex Medium Italic" filename="../instances/AktivGroteskEx_MdIt.ufo" postscriptfontname="AktivGrotesk-ExMediumItalic" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold Italic" familyname="Aktiv Grotesk" stylename="Cd SemiBold Italic" filename="../../build/instances/AktivGroteskCd_SBdIt.ufo" postscriptfontname="AktivGrotesk-CdSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold Italic" familyname="Aktiv Grotesk" stylename="SemiBold Italic" filename="../../build/instances/AktivGrotesk_SBdIt.ufo" postscriptfontname="AktivGrotesk-SemiBoldItalic" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold Italic" familyname="Aktiv Grotesk" stylename="Ex SemiBold Italic" filename="../../build/instances/AktivGroteskEx_SBdIt.ufo" postscriptfontname="AktivGrotesk-ExSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold Italic" familyname="Aktiv Grotesk" stylename="Cd Bold Italic" filename="../instances/AktivGroteskCd_BdIt.ufo" postscriptfontname="AktivGrotesk-CdBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Bold Italic" familyname="Aktiv Grotesk" stylename="Bold Italic" filename="../instances/AktivGrotesk_BdIt.ufo" postscriptfontname="AktivGrotesk-BoldItalic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold Italic" familyname="Aktiv Grotesk" stylename="Ex Bold Italic" filename="../instances/AktivGroteskEx_BdIt.ufo" postscriptfontname="AktivGrotesk-ExBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold Italic" familyname="Aktiv Grotesk" stylename="Cd XBold Italic" filename="../instances/AktivGroteskCd_XBdIt.ufo" postscriptfontname="AktivGrotesk-CdXBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk XBold Italic" familyname="Aktiv Grotesk" stylename="XBold Italic" filename="../instances/AktivGrotesk_XBdIt.ufo" postscriptfontname="AktivGrotesk-XBoldItalic" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold Italic" familyname="Aktiv Grotesk" stylename="Ex XBold Italic" filename="../instances/AktivGroteskEx_XBdIt.ufo" postscriptfontname="AktivGrotesk-ExXBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black Italic" familyname="Aktiv Grotesk" stylename="Cd Black Italic" filename="../instances/AktivGroteskCd_BlkIt.ufo" postscriptfontname="AktivGrotesk-CdBlackItalic" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Black Italic" familyname="Aktiv Grotesk" stylename="Black Italic" filename="../instances/AktivGrotesk_BlkIt.ufo" postscriptfontname="AktivGrotesk-BlackItalic" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black Italic" familyname="Aktiv Grotesk" stylename="Ex Black Italic" filename="../instances/AktivGroteskEx_BlkIt.ufo" postscriptfontname="AktivGrotesk-ExBlackItalic" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Wght.designspace b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Wght.designspace
new file mode 100644
index 00000000..2ae35f77
--- /dev/null
+++ b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_Wght.designspace
@@ -0,0 +1,103 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ </axes>
+ <sources>
+ <source filename="../AktivGrotesk_Hair.ufo" name="Aktiv Grotesk Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" layer="{126,100,0}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Blk.ufo" name="Aktiv Grotesk Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Hair" familyname="Aktiv Grotesk" stylename="Hair" filename="../instances/AktivGrotesk_Hair.ufo" postscriptfontname="AktivGrotesk-Hair" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Thin" familyname="Aktiv Grotesk" stylename="Thin" filename="../instances/AktivGrotesk_Th.ufo" postscriptfontname="AktivGrotesk-Thin" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Light" familyname="Aktiv Grotesk" stylename="Light" filename="../instances/AktivGrotesk_Lt.ufo" postscriptfontname="AktivGrotesk-Light" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Medium" familyname="Aktiv Grotesk" stylename="Medium" filename="../instances/AktivGrotesk_Md.ufo" postscriptfontname="AktivGrotesk-Medium" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold" familyname="Aktiv Grotesk" stylename="SemiBold" filename="../../build/instances/AktivGrotesk_SBd.ufo" postscriptfontname="AktivGrotesk-SemiBold" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Bold" familyname="Aktiv Grotesk" stylename="Bold" filename="../instances/AktivGrotesk_Bd.ufo" postscriptfontname="AktivGrotesk-Bold" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk XBold" familyname="Aktiv Grotesk" stylename="XBold" filename="../instances/AktivGrotesk_XBd.ufo" postscriptfontname="AktivGrotesk-XBold" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Black" familyname="Aktiv Grotesk" stylename="Black" filename="../instances/AktivGrotesk_Blk.ufo" postscriptfontname="AktivGrotesk-Black" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdth.designspace b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdth.designspace
new file mode 100644
index 00000000..219d2262
--- /dev/null
+++ b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdth.designspace
@@ -0,0 +1,307 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ <axis tag="wdth" name="Width" minimum="75" maximum="125" default="100"/>
+ </axes>
+ <rules processing="last">
+ <rule name="BRACKET.116.185">
+ <conditionset>
+ <condition name="Weight" minimum="116" maximum="185"/>
+ <condition name="Width" minimum="75" maximum="97.5"/>
+ </conditionset>
+ <sub name="cent" with="cent.BRACKET.130"/>
+ <sub name="dollar" with="dollar.BRACKET.130"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../AktivGroteskCd_Hair.ufo" name="Aktiv Grotesk Cd Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Hair.ufo" name="Aktiv Grotesk Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Hair.ufo" name="Aktiv Grotesk Ex Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Rg.ufo" name="Aktiv Grotesk Cd">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" layer="{126,100,0}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Rg.ufo" name="Aktiv Grotesk Ex">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Blk.ufo" name="Aktiv Grotesk Cd Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Blk.ufo" name="Aktiv Grotesk Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Blk.ufo" name="Aktiv Grotesk Ex Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Cd Hair" familyname="Aktiv Grotesk" stylename="Cd Hair" filename="../instances/AktivGroteskCd_Hair.ufo" postscriptfontname="AktivGrotesk-CdHair" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Hair" familyname="Aktiv Grotesk" stylename="Hair" filename="../instances/AktivGrotesk_Hair.ufo" postscriptfontname="AktivGrotesk-Hair" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair" familyname="Aktiv Grotesk" stylename="Ex Hair" filename="../instances/AktivGroteskEx_Hair.ufo" postscriptfontname="AktivGrotesk-ExHair" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin" familyname="Aktiv Grotesk" stylename="Cd Thin" filename="../instances/AktivGroteskCd_Th.ufo" postscriptfontname="AktivGrotesk-CdThin" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Thin" familyname="Aktiv Grotesk" stylename="Thin" filename="../instances/AktivGrotesk_Th.ufo" postscriptfontname="AktivGrotesk-Thin" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin" familyname="Aktiv Grotesk" stylename="Ex Thin" filename="../instances/AktivGroteskEx_Th.ufo" postscriptfontname="AktivGrotesk-ExThin" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light" familyname="Aktiv Grotesk" stylename="Cd Light" filename="../instances/AktivGroteskCd_Lt.ufo" postscriptfontname="AktivGrotesk-CdLight" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Light" familyname="Aktiv Grotesk" stylename="Light" filename="../instances/AktivGrotesk_Lt.ufo" postscriptfontname="AktivGrotesk-Light" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light" familyname="Aktiv Grotesk" stylename="Ex Light" filename="../instances/AktivGroteskEx_Lt.ufo" postscriptfontname="AktivGrotesk-ExLight" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd" familyname="Aktiv Grotesk" stylename="Cd" filename="../instances/AktivGroteskCd_Rg.ufo" postscriptfontname="AktivGrotesk-Cd" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex" familyname="Aktiv Grotesk" stylename="Ex" filename="../instances/AktivGroteskEx_Rg.ufo" postscriptfontname="AktivGrotesk-Ex" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium" familyname="Aktiv Grotesk" stylename="Cd Medium" filename="../instances/AktivGroteskCd_Md.ufo" postscriptfontname="AktivGrotesk-CdMedium" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Medium" familyname="Aktiv Grotesk" stylename="Medium" filename="../instances/AktivGrotesk_Md.ufo" postscriptfontname="AktivGrotesk-Medium" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium" familyname="Aktiv Grotesk" stylename="Ex Medium" filename="../instances/AktivGroteskEx_Md.ufo" postscriptfontname="AktivGrotesk-ExMedium" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold" familyname="Aktiv Grotesk" stylename="Cd SemiBold" filename="../../build/instances/AktivGroteskCd_SBd.ufo" postscriptfontname="AktivGrotesk-CdSemiBold" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold" familyname="Aktiv Grotesk" stylename="SemiBold" filename="../../build/instances/AktivGrotesk_SBd.ufo" postscriptfontname="AktivGrotesk-SemiBold" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold" familyname="Aktiv Grotesk" stylename="Ex SemiBold" filename="../../build/instances/AktivGroteskEx_SBd.ufo" postscriptfontname="AktivGrotesk-ExSemiBold" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold" familyname="Aktiv Grotesk" stylename="Cd Bold" filename="../instances/AktivGroteskCd_Bd.ufo" postscriptfontname="AktivGrotesk-CdBold" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Bold" familyname="Aktiv Grotesk" stylename="Bold" filename="../instances/AktivGrotesk_Bd.ufo" postscriptfontname="AktivGrotesk-Bold" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold" familyname="Aktiv Grotesk" stylename="Ex Bold" filename="../instances/AktivGroteskEx_Bd.ufo" postscriptfontname="AktivGrotesk-ExBold" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold" familyname="Aktiv Grotesk" stylename="Cd XBold" filename="../instances/AktivGroteskCd_XBd.ufo" postscriptfontname="AktivGrotesk-CdXBold" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk XBold" familyname="Aktiv Grotesk" stylename="XBold" filename="../instances/AktivGrotesk_XBd.ufo" postscriptfontname="AktivGrotesk-XBold" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold" familyname="Aktiv Grotesk" stylename="Ex XBold" filename="../instances/AktivGroteskEx_XBd.ufo" postscriptfontname="AktivGrotesk-ExXBold" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black" familyname="Aktiv Grotesk" stylename="Cd Black" filename="../instances/AktivGroteskCd_Blk.ufo" postscriptfontname="AktivGrotesk-CdBlack" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Black" familyname="Aktiv Grotesk" stylename="Black" filename="../instances/AktivGrotesk_Blk.ufo" postscriptfontname="AktivGrotesk-Black" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black" familyname="Aktiv Grotesk" stylename="Ex Black" filename="../instances/AktivGroteskEx_Blk.ufo" postscriptfontname="AktivGrotesk-ExBlack" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdthItal.designspace b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdthItal.designspace
new file mode 100644
index 00000000..5b419bad
--- /dev/null
+++ b/Tests/designspaceLib/data/convert5to4_output/AktivGroteskVF_WghtWdthItal.designspace
@@ -0,0 +1,670 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ <axis tag="wdth" name="Width" minimum="75" maximum="125" default="100"/>
+ <axis tag="ital" name="Italic" minimum="0" maximum="1" default="0"/>
+ </axes>
+ <rules processing="last">
+ <rule name="BRACKET.CYR">
+ <conditionset>
+ <condition name="Italic" minimum="0.1" maximum="1"/>
+ </conditionset>
+ <sub name="ghe.loclSRB" with="ghe.ital.loclSRB"/>
+ <sub name="ghe.loclMKD" with="ghe.ital.loclMKD"/>
+ <sub name="de.loclMKDSRB" with="de.ital.loclMKDSRB"/>
+ <sub name="pe.loclMKDSRB" with="pe.ital.loclMKDSRB"/>
+ <sub name="te.loclMKDSRB" with="te.ital.loclMKDSRB"/>
+ <sub name="gje.loclMKD" with="gje.ital.loclMKD"/>
+ <sub name="sha.loclMKDSRB" with="sha.ital.loclMKDSRB"/>
+ </rule>
+ <rule name="BRACKET.116.185">
+ <conditionset>
+ <condition name="Weight" minimum="116" maximum="185"/>
+ <condition name="Width" minimum="75" maximum="97.5"/>
+ </conditionset>
+ <sub name="cent" with="cent.BRACKET.130"/>
+ <sub name="dollar" with="dollar.BRACKET.130"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../AktivGroteskCd_Hair.ufo" name="Aktiv Grotesk Cd Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_HairIt.ufo" name="Aktiv Grotesk Cd Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Hair.ufo" name="Aktiv Grotesk Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_HairIt.ufo" name="Aktiv Grotesk Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Hair.ufo" name="Aktiv Grotesk Ex Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_HairIt.ufo" name="Aktiv Grotesk Ex Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Rg.ufo" name="Aktiv Grotesk Cd">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_It.ufo" name="Aktiv Grotesk Cd Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" layer="{126,100,0}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic {126,100,1}" layer="{126,100,1}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Rg.ufo" name="Aktiv Grotesk Ex">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_It.ufo" name="Aktiv Grotesk Ex Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Blk.ufo" name="Aktiv Grotesk Cd Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_BlkIt.ufo" name="Aktiv Grotesk Cd Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Blk.ufo" name="Aktiv Grotesk Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_BlkIt.ufo" name="Aktiv Grotesk Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Blk.ufo" name="Aktiv Grotesk Ex Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_BlkIt.ufo" name="Aktiv Grotesk Ex Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Cd Hair" familyname="Aktiv Grotesk" stylename="Cd Hair" filename="../instances/AktivGroteskCd_Hair.ufo" postscriptfontname="AktivGrotesk-CdHair" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Hair Italic" familyname="Aktiv Grotesk" stylename="Cd Hair Italic" filename="../instances/AktivGroteskCd_HairIt.ufo" postscriptfontname="AktivGrotesk-CdHairItalic" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Hair" familyname="Aktiv Grotesk" stylename="Hair" filename="../instances/AktivGrotesk_Hair.ufo" postscriptfontname="AktivGrotesk-Hair" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Hair Italic" familyname="Aktiv Grotesk" stylename="Hair Italic" filename="../instances/AktivGrotesk_HairIt.ufo" postscriptfontname="AktivGrotesk-HairItalic" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair" familyname="Aktiv Grotesk" stylename="Ex Hair" filename="../instances/AktivGroteskEx_Hair.ufo" postscriptfontname="AktivGrotesk-ExHair" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair Italic" familyname="Aktiv Grotesk" stylename="Ex Hair Italic" filename="../instances/AktivGroteskEx_HairIt.ufo" postscriptfontname="AktivGrotesk-ExHairItalic" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin" familyname="Aktiv Grotesk" stylename="Cd Thin" filename="../instances/AktivGroteskCd_Th.ufo" postscriptfontname="AktivGrotesk-CdThin" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin Italic" familyname="Aktiv Grotesk" stylename="Cd Thin Italic" filename="../instances/AktivGroteskCd_ThIt.ufo" postscriptfontname="AktivGrotesk-CdThinItalic" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Thin" familyname="Aktiv Grotesk" stylename="Thin" filename="../instances/AktivGrotesk_Th.ufo" postscriptfontname="AktivGrotesk-Thin" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Thin Italic" familyname="Aktiv Grotesk" stylename="Thin Italic" filename="../instances/AktivGrotesk_ThIt.ufo" postscriptfontname="AktivGrotesk-ThinItalic" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin" familyname="Aktiv Grotesk" stylename="Ex Thin" filename="../instances/AktivGroteskEx_Th.ufo" postscriptfontname="AktivGrotesk-ExThin" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin Italic" familyname="Aktiv Grotesk" stylename="Ex Thin Italic" filename="../instances/AktivGroteskEx_ThIt.ufo" postscriptfontname="AktivGrotesk-ExThinItalic" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light" familyname="Aktiv Grotesk" stylename="Cd Light" filename="../instances/AktivGroteskCd_Lt.ufo" postscriptfontname="AktivGrotesk-CdLight" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light Italic" familyname="Aktiv Grotesk" stylename="Cd Light Italic" filename="../instances/AktivGroteskCd_LtIt.ufo" postscriptfontname="AktivGrotesk-CdLightItalic" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Light" familyname="Aktiv Grotesk" stylename="Light" filename="../instances/AktivGrotesk_Lt.ufo" postscriptfontname="AktivGrotesk-Light" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Light Italic" familyname="Aktiv Grotesk" stylename="Light Italic" filename="../instances/AktivGrotesk_LtIt.ufo" postscriptfontname="AktivGrotesk-LightItalic" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light" familyname="Aktiv Grotesk" stylename="Ex Light" filename="../instances/AktivGroteskEx_Lt.ufo" postscriptfontname="AktivGrotesk-ExLight" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light Italic" familyname="Aktiv Grotesk" stylename="Ex Light Italic" filename="../instances/AktivGroteskEx_LtIt.ufo" postscriptfontname="AktivGrotesk-ExLightItalic" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd" familyname="Aktiv Grotesk" stylename="Cd" filename="../instances/AktivGroteskCd_Rg.ufo" postscriptfontname="AktivGrotesk-Cd" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Italic" familyname="Aktiv Grotesk" stylename="Cd Italic" filename="../instances/AktivGroteskCd_It.ufo" postscriptfontname="AktivGrotesk-CdItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Italic" familyname="Aktiv Grotesk" stylename="Italic" filename="../instances/AktivGrotesk_It.ufo" postscriptfontname="AktivGrotesk-Italic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex" familyname="Aktiv Grotesk" stylename="Ex" filename="../instances/AktivGroteskEx_Rg.ufo" postscriptfontname="AktivGrotesk-Ex" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Italic" familyname="Aktiv Grotesk" stylename="Ex Italic" filename="../instances/AktivGroteskEx_It.ufo" postscriptfontname="AktivGrotesk-ExItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium" familyname="Aktiv Grotesk" stylename="Cd Medium" filename="../instances/AktivGroteskCd_Md.ufo" postscriptfontname="AktivGrotesk-CdMedium" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium Italic" familyname="Aktiv Grotesk" stylename="Cd Medium Italic" filename="../instances/AktivGroteskCd_MdIt.ufo" postscriptfontname="AktivGrotesk-CdMediumItalic" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Medium" familyname="Aktiv Grotesk" stylename="Medium" filename="../instances/AktivGrotesk_Md.ufo" postscriptfontname="AktivGrotesk-Medium" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Medium Italic" familyname="Aktiv Grotesk" stylename="Medium Italic" filename="../instances/AktivGrotesk_MdIt.ufo" postscriptfontname="AktivGrotesk-MediumItalic" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium" familyname="Aktiv Grotesk" stylename="Ex Medium" filename="../instances/AktivGroteskEx_Md.ufo" postscriptfontname="AktivGrotesk-ExMedium" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium Italic" familyname="Aktiv Grotesk" stylename="Ex Medium Italic" filename="../instances/AktivGroteskEx_MdIt.ufo" postscriptfontname="AktivGrotesk-ExMediumItalic" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold" familyname="Aktiv Grotesk" stylename="Cd SemiBold" filename="../../build/instances/AktivGroteskCd_SBd.ufo" postscriptfontname="AktivGrotesk-CdSemiBold" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold Italic" familyname="Aktiv Grotesk" stylename="Cd SemiBold Italic" filename="../../build/instances/AktivGroteskCd_SBdIt.ufo" postscriptfontname="AktivGrotesk-CdSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold" familyname="Aktiv Grotesk" stylename="SemiBold" filename="../../build/instances/AktivGrotesk_SBd.ufo" postscriptfontname="AktivGrotesk-SemiBold" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold Italic" familyname="Aktiv Grotesk" stylename="SemiBold Italic" filename="../../build/instances/AktivGrotesk_SBdIt.ufo" postscriptfontname="AktivGrotesk-SemiBoldItalic" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold" familyname="Aktiv Grotesk" stylename="Ex SemiBold" filename="../../build/instances/AktivGroteskEx_SBd.ufo" postscriptfontname="AktivGrotesk-ExSemiBold" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold Italic" familyname="Aktiv Grotesk" stylename="Ex SemiBold Italic" filename="../../build/instances/AktivGroteskEx_SBdIt.ufo" postscriptfontname="AktivGrotesk-ExSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold" familyname="Aktiv Grotesk" stylename="Cd Bold" filename="../instances/AktivGroteskCd_Bd.ufo" postscriptfontname="AktivGrotesk-CdBold" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold Italic" familyname="Aktiv Grotesk" stylename="Cd Bold Italic" filename="../instances/AktivGroteskCd_BdIt.ufo" postscriptfontname="AktivGrotesk-CdBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Bold" familyname="Aktiv Grotesk" stylename="Bold" filename="../instances/AktivGrotesk_Bd.ufo" postscriptfontname="AktivGrotesk-Bold" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Bold Italic" familyname="Aktiv Grotesk" stylename="Bold Italic" filename="../instances/AktivGrotesk_BdIt.ufo" postscriptfontname="AktivGrotesk-BoldItalic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold" familyname="Aktiv Grotesk" stylename="Ex Bold" filename="../instances/AktivGroteskEx_Bd.ufo" postscriptfontname="AktivGrotesk-ExBold" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold Italic" familyname="Aktiv Grotesk" stylename="Ex Bold Italic" filename="../instances/AktivGroteskEx_BdIt.ufo" postscriptfontname="AktivGrotesk-ExBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold" familyname="Aktiv Grotesk" stylename="Cd XBold" filename="../instances/AktivGroteskCd_XBd.ufo" postscriptfontname="AktivGrotesk-CdXBold" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold Italic" familyname="Aktiv Grotesk" stylename="Cd XBold Italic" filename="../instances/AktivGroteskCd_XBdIt.ufo" postscriptfontname="AktivGrotesk-CdXBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk XBold" familyname="Aktiv Grotesk" stylename="XBold" filename="../instances/AktivGrotesk_XBd.ufo" postscriptfontname="AktivGrotesk-XBold" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk XBold Italic" familyname="Aktiv Grotesk" stylename="XBold Italic" filename="../instances/AktivGrotesk_XBdIt.ufo" postscriptfontname="AktivGrotesk-XBoldItalic" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold" familyname="Aktiv Grotesk" stylename="Ex XBold" filename="../instances/AktivGroteskEx_XBd.ufo" postscriptfontname="AktivGrotesk-ExXBold" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold Italic" familyname="Aktiv Grotesk" stylename="Ex XBold Italic" filename="../instances/AktivGroteskEx_XBdIt.ufo" postscriptfontname="AktivGrotesk-ExXBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black" familyname="Aktiv Grotesk" stylename="Cd Black" filename="../instances/AktivGroteskCd_Blk.ufo" postscriptfontname="AktivGrotesk-CdBlack" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black Italic" familyname="Aktiv Grotesk" stylename="Cd Black Italic" filename="../instances/AktivGroteskCd_BlkIt.ufo" postscriptfontname="AktivGrotesk-CdBlackItalic" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Black" familyname="Aktiv Grotesk" stylename="Black" filename="../instances/AktivGrotesk_Blk.ufo" postscriptfontname="AktivGrotesk-Black" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Black Italic" familyname="Aktiv Grotesk" stylename="Black Italic" filename="../instances/AktivGrotesk_BlkIt.ufo" postscriptfontname="AktivGrotesk-BlackItalic" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black" familyname="Aktiv Grotesk" stylename="Ex Black" filename="../instances/AktivGroteskEx_Blk.ufo" postscriptfontname="AktivGrotesk-ExBlack" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black Italic" familyname="Aktiv Grotesk" stylename="Ex Black Italic" filename="../instances/AktivGroteskEx_BlkIt.ufo" postscriptfontname="AktivGrotesk-ExBlackItalic" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Italic.designspace b/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Italic.designspace
new file mode 100644
index 00000000..adfe245d
--- /dev/null
+++ b/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Italic.designspace
@@ -0,0 +1,326 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+ <axes>
+ <axis tag="wght" name="weight" minimum="200" maximum="900" default="400">
+ <map input="200" output="0"/>
+ <map input="300" output="145"/>
+ <map input="400" output="394"/>
+ <map input="600" output="594"/>
+ <map input="700" output="823"/>
+ <map input="900" output="1000"/>
+ </axis>
+ <axis tag="opsz" name="optical" minimum="8" maximum="60" default="20"/>
+ </axes>
+ <sources>
+ <source filename="../caption/master_0/SourceSerif-Italic_c0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_1/SourceSerif-Italic_c1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_2/SourceSerif-Italic_c2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../text/master_0/SourceSerif-Italic_0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_1/SourceSerif-Italic_1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_2/SourceSerif-Italic_2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../display/master_0/SourceSerif-Italic_d0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_1/SourceSerif-Italic_d1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_2/SourceSerif-Italic_d2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Source Serif 4 Caption ExtraLight Italic" familyname="Source Serif 4" stylename="Caption ExtraLight Italic" filename="Source Serif 4-Caption ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionExtraLight" stylemapfamilyname="Source Serif 4 Caption ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption Light Italic" familyname="Source Serif 4" stylename="Caption Light Italic" filename="Source Serif 4-Caption Light Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionLight" stylemapfamilyname="Source Serif 4 Caption Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption Italic" familyname="Source Serif 4" stylename="Caption Italic" filename="Source Serif 4-Caption Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionRegular" stylemapfamilyname="Source Serif 4 Caption Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption Semibold Italic" familyname="Source Serif 4" stylename="Caption Semibold Italic" filename="Source Serif 4-Caption Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionSemibold" stylemapfamilyname="Source Serif 4 Caption Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption Bold Italic" familyname="Source Serif 4" stylename="Caption Bold Italic" filename="Source Serif 4-Caption Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionBold" stylemapfamilyname="Source Serif 4 Caption Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption Black Italic" familyname="Source Serif 4" stylename="Caption Black Italic" filename="Source Serif 4-Caption Black Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionBlack" stylemapfamilyname="Source Serif 4 Caption Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText ExtraLight Italic" familyname="Source Serif 4" stylename="SmText ExtraLight Italic" filename="Source Serif 4-SmText ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextExtraLight" stylemapfamilyname="Source Serif 4 SmallText ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText Light Italic" familyname="Source Serif 4" stylename="SmText Light Italic" filename="Source Serif 4-SmText Light Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextLight" stylemapfamilyname="Source Serif 4 SmallText Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText Italic" familyname="Source Serif 4" stylename="SmText Italic" filename="Source Serif 4-SmText Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextRegular" stylemapfamilyname="Source Serif 4 SmallText Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText Semibold Italic" familyname="Source Serif 4" stylename="SmText Semibold Italic" filename="Source Serif 4-SmText Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextSemibold" stylemapfamilyname="Source Serif 4 SmallText Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText Bold Italic" familyname="Source Serif 4" stylename="SmText Bold Italic" filename="Source Serif 4-SmText Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextBold" stylemapfamilyname="Source Serif 4 SmallText Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText Black Italic" familyname="Source Serif 4" stylename="SmText Black Italic" filename="Source Serif 4-SmText Black Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextBlack" stylemapfamilyname="Source Serif 4 SmallText Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 ExtraLight Italic" familyname="Source Serif 4" stylename="ExtraLight Italic" filename="Source Serif 4-ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-ExtraLight" stylemapfamilyname="Source Serif 4 ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Light Italic" familyname="Source Serif 4" stylename="Light Italic" filename="Source Serif 4-Light Italic.ttf" postscriptfontname="SourceSerif4Italic-Light" stylemapfamilyname="Source Serif 4 Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Italic" familyname="Source Serif 4" stylename="Italic" filename="Source Serif 4-Italic.ttf" postscriptfontname="SourceSerif4Italic-Regular" stylemapfamilyname="Source Serif 4 Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Semibold Italic" familyname="Source Serif 4" stylename="Semibold Italic" filename="Source Serif 4-Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-Semibold" stylemapfamilyname="Source Serif 4 Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Bold Italic" familyname="Source Serif 4" stylename="Bold Italic" filename="Source Serif 4-Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-Bold" stylemapfamilyname="Source Serif 4 Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Black Italic" familyname="Source Serif 4" stylename="Black Italic" filename="Source Serif 4-Black Italic.ttf" postscriptfontname="SourceSerif4Italic-Black" stylemapfamilyname="Source Serif 4 Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead ExtraLight Italic" familyname="Source Serif 4" stylename="Subhead ExtraLight Italic" filename="Source Serif 4-Subhead ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadExtraLight" stylemapfamilyname="Source Serif 4 Subhead ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead Light Italic" familyname="Source Serif 4" stylename="Subhead Light Italic" filename="Source Serif 4-Subhead Light Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadLight" stylemapfamilyname="Source Serif 4 Subhead Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead Italic" familyname="Source Serif 4" stylename="Subhead Italic" filename="Source Serif 4-Subhead Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadRegular" stylemapfamilyname="Source Serif 4 Subhead Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead Semibold Italic" familyname="Source Serif 4" stylename="Subhead Semibold Italic" filename="Source Serif 4-Subhead Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadSemibold" stylemapfamilyname="Source Serif 4 Subhead Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead Bold Italic" familyname="Source Serif 4" stylename="Subhead Bold Italic" filename="Source Serif 4-Subhead Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadBold" stylemapfamilyname="Source Serif 4 Subhead Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead Black Italic" familyname="Source Serif 4" stylename="Subhead Black Italic" filename="Source Serif 4-Subhead Black Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadBlack" stylemapfamilyname="Source Serif 4 Subhead Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display ExtraLight Italic" familyname="Source Serif 4" stylename="Display ExtraLight Italic" filename="Source Serif 4-Display ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayExtraLight" stylemapfamilyname="Source Serif 4 Display ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display Light Italic" familyname="Source Serif 4" stylename="Display Light Italic" filename="Source Serif 4-Display Light Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayLight" stylemapfamilyname="Source Serif 4 Display Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display Italic" familyname="Source Serif 4" stylename="Display Italic" filename="Source Serif 4-Display Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayRegular" stylemapfamilyname="Source Serif 4 Display Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display Semibold Italic" familyname="Source Serif 4" stylename="Display Semibold Italic" filename="Source Serif 4-Display Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplaySemibold" stylemapfamilyname="Source Serif 4 Display Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display Bold Italic" familyname="Source Serif 4" stylename="Display Bold Italic" filename="Source Serif 4-Display Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayBold" stylemapfamilyname="Source Serif 4 Display Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display Black Italic" familyname="Source Serif 4" stylename="Display Black Italic" filename="Source Serif 4-Display Black Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayBlack" stylemapfamilyname="Source Serif 4 Display Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ </instances>
+ <lib>
+ <dict>
+ <key>public.skipExportGlyphs</key>
+ <array>
+ <string>caron.alt</string>
+ <string>commabelowcmb.alt</string>
+ <string>f.liga</string>
+ <string>f.ligalong</string>
+ <string>tonos.cap</string>
+ <string>dieresiscmb.tight</string>
+ <string>turkicdsccmb</string>
+ </array>
+ </dict>
+ </lib>
+</designspace>
diff --git a/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Roman.designspace b/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Roman.designspace
new file mode 100644
index 00000000..30f181e3
--- /dev/null
+++ b/Tests/designspaceLib/data/convert5to4_output/SourceSerif4Variable-Roman.designspace
@@ -0,0 +1,334 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+ <axes>
+ <axis tag="wght" name="weight" minimum="200" maximum="900" default="400">
+ <map input="200" output="0"/>
+ <map input="300" output="145"/>
+ <map input="400" output="394"/>
+ <map input="600" output="594"/>
+ <map input="700" output="823"/>
+ <map input="900" output="1000"/>
+ </axis>
+ <axis tag="opsz" name="optical" minimum="8" maximum="60" default="20"/>
+ </axes>
+ <sources>
+ <source filename="../caption/master_0/SourceSerif_c0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_1/SourceSerif_c1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_2/SourceSerif_c2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../text/master_0/SourceSerif_0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_1/SourceSerif_1.ufo" familyname="Source Serif 4">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_2/SourceSerif_2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../display/master_0/SourceSerif_d0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_1/SourceSerif_d1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_2/SourceSerif_d2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Source Serif 4 Caption ExtraLight" familyname="Source Serif 4" stylename="Caption ExtraLight" filename="Source Serif 4-Caption ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-CaptionExtraLight" stylemapfamilyname="Source Serif 4 Caption ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption Light" familyname="Source Serif 4" stylename="Caption Light" filename="Source Serif 4-Caption Light.ttf" postscriptfontname="SourceSerif4Roman-CaptionLight" stylemapfamilyname="Source Serif 4 Caption Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption" familyname="Source Serif 4" stylename="Caption" filename="Source Serif 4-Caption.ttf" postscriptfontname="SourceSerif4Roman-CaptionRegular" stylemapfamilyname="Source Serif 4 Caption" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption Semibold" familyname="Source Serif 4" stylename="Caption Semibold" filename="Source Serif 4-Caption Semibold.ttf" postscriptfontname="SourceSerif4Roman-CaptionSemibold" stylemapfamilyname="Source Serif 4 Caption Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption Bold" familyname="Source Serif 4" stylename="Caption Bold" filename="Source Serif 4-Caption Bold.ttf" postscriptfontname="SourceSerif4Roman-CaptionBold" stylemapfamilyname="Source Serif 4 Caption Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Caption Black" familyname="Source Serif 4" stylename="Caption Black" filename="Source Serif 4-Caption Black.ttf" postscriptfontname="SourceSerif4Roman-CaptionBlack" stylemapfamilyname="Source Serif 4 Caption Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText ExtraLight" familyname="Source Serif 4" stylename="SmText ExtraLight" filename="Source Serif 4-SmText ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-SmTextExtraLight" stylemapfamilyname="Source Serif 4 SmallText ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText Light" familyname="Source Serif 4" stylename="SmText Light" filename="Source Serif 4-SmText Light.ttf" postscriptfontname="SourceSerif4Roman-SmTextLight" stylemapfamilyname="Source Serif 4 SmallText Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText" familyname="Source Serif 4" stylename="SmText" filename="Source Serif 4-SmText.ttf" postscriptfontname="SourceSerif4Roman-SmTextRegular" stylemapfamilyname="Source Serif 4 SmallText" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText Semibold" familyname="Source Serif 4" stylename="SmText Semibold" filename="Source Serif 4-SmText Semibold.ttf" postscriptfontname="SourceSerif4Roman-SmTextSemibold" stylemapfamilyname="Source Serif 4 SmallText Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText Bold" familyname="Source Serif 4" stylename="SmText Bold" filename="Source Serif 4-SmText Bold.ttf" postscriptfontname="SourceSerif4Roman-SmTextBold" stylemapfamilyname="Source Serif 4 SmallText Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 SmText Black" familyname="Source Serif 4" stylename="SmText Black" filename="Source Serif 4-SmText Black.ttf" postscriptfontname="SourceSerif4Roman-SmTextBlack" stylemapfamilyname="Source Serif 4 SmallText Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 ExtraLight" familyname="Source Serif 4" stylename="ExtraLight" filename="Source Serif 4-ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-ExtraLight" stylemapfamilyname="Source Serif 4 ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Light" familyname="Source Serif 4" stylename="Light" filename="Source Serif 4-Light.ttf" postscriptfontname="SourceSerif4Roman-Light" stylemapfamilyname="Source Serif 4 Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Regular" familyname="Source Serif 4" stylename="Regular" filename="Source Serif 4-Regular.ttf" postscriptfontname="SourceSerif4Roman-Regular" stylemapfamilyname="Source Serif 4" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Semibold" familyname="Source Serif 4" stylename="Semibold" filename="Source Serif 4-Semibold.ttf" postscriptfontname="SourceSerif4Roman-Semibold" stylemapfamilyname="Source Serif 4 Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Bold" familyname="Source Serif 4" stylename="Bold" filename="Source Serif 4-Bold.ttf" postscriptfontname="SourceSerif4Roman-Bold" stylemapfamilyname="Source Serif 4 Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Black" familyname="Source Serif 4" stylename="Black" filename="Source Serif 4-Black.ttf" postscriptfontname="SourceSerif4Roman-Black" stylemapfamilyname="Source Serif 4 Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead ExtraLight" familyname="Source Serif 4" stylename="Subhead ExtraLight" filename="Source Serif 4-Subhead ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-SubheadExtraLight" stylemapfamilyname="Source Serif 4 Subhead ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead Light" familyname="Source Serif 4" stylename="Subhead Light" filename="Source Serif 4-Subhead Light.ttf" postscriptfontname="SourceSerif4Roman-SubheadLight" stylemapfamilyname="Source Serif 4 Subhead Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead" familyname="Source Serif 4" stylename="Subhead" filename="Source Serif 4-Subhead.ttf" postscriptfontname="SourceSerif4Roman-SubheadRegular" stylemapfamilyname="Source Serif 4 Subhead" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead Semibold" familyname="Source Serif 4" stylename="Subhead Semibold" filename="Source Serif 4-Subhead Semibold.ttf" postscriptfontname="SourceSerif4Roman-SubheadSemibold" stylemapfamilyname="Source Serif 4 Subhead Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead Bold" familyname="Source Serif 4" stylename="Subhead Bold" filename="Source Serif 4-Subhead Bold.ttf" postscriptfontname="SourceSerif4Roman-SubheadBold" stylemapfamilyname="Source Serif 4 Subhead Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Subhead Black" familyname="Source Serif 4" stylename="Subhead Black" filename="Source Serif 4-Subhead Black.ttf" postscriptfontname="SourceSerif4Roman-SubheadBlack" stylemapfamilyname="Source Serif 4 Subhead Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display ExtraLight" familyname="Source Serif 4" stylename="Display ExtraLight" filename="Source Serif 4-Display ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-DisplayExtraLight" stylemapfamilyname="Source Serif 4 Display ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display Light" familyname="Source Serif 4" stylename="Display Light" filename="Source Serif 4-Display Light.ttf" postscriptfontname="SourceSerif4Roman-DisplayLight" stylemapfamilyname="Source Serif 4 Display Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display" familyname="Source Serif 4" stylename="Display" filename="Source Serif 4-Display.ttf" postscriptfontname="SourceSerif4Roman-DisplayRegular" stylemapfamilyname="Source Serif 4 Display" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display Semibold" familyname="Source Serif 4" stylename="Display Semibold" filename="Source Serif 4-Display Semibold.ttf" postscriptfontname="SourceSerif4Roman-DisplaySemibold" stylemapfamilyname="Source Serif 4 Display Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display Bold" familyname="Source Serif 4" stylename="Display Bold" filename="Source Serif 4-Display Bold.ttf" postscriptfontname="SourceSerif4Roman-DisplayBold" stylemapfamilyname="Source Serif 4 Display Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ <instance name="Source Serif 4 Display Black" familyname="Source Serif 4" stylename="Display Black" filename="Source Serif 4-Display Black.ttf" postscriptfontname="SourceSerif4Roman-DisplayBlack" stylemapfamilyname="Source Serif 4 Display Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ <kerning/>
+ <info/>
+ </instance>
+ </instances>
+ <lib>
+ <dict>
+ <key>public.skipExportGlyphs</key>
+ <array>
+ <string>caron.alt</string>
+ <string>commabelowcmb.alt</string>
+ <string>tonos.cap</string>
+ <string>f.ligalong</string>
+ <string>dieresiscmb.tight</string>
+ <string>IJ</string>
+ <string>Tbar</string>
+ <string>colontriangularmod</string>
+ <string>crossmark</string>
+ <string>ij</string>
+ <string>overline</string>
+ <string>similar</string>
+ <string>tbar</string>
+ <string>triangularbullet</string>
+ <string>turkicdsccmb</string>
+ </array>
+ </dict>
+ </lib>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_Wght.designspace b/Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_Wght.designspace
new file mode 100644
index 00000000..dc38cd7d
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_Wght.designspace
@@ -0,0 +1,96 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ </axes>
+ <rules processing="last">
+ <rule name="BRACKET.CYR">
+ <sub name="ghe.loclSRB" with="ghe.ital.loclSRB"/>
+ <sub name="ghe.loclMKD" with="ghe.ital.loclMKD"/>
+ <sub name="de.loclMKDSRB" with="de.ital.loclMKDSRB"/>
+ <sub name="pe.loclMKDSRB" with="pe.ital.loclMKDSRB"/>
+ <sub name="te.loclMKDSRB" with="te.ital.loclMKDSRB"/>
+ <sub name="gje.loclMKD" with="gje.ital.loclMKD"/>
+ <sub name="sha.loclMKDSRB" with="sha.ital.loclMKDSRB"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../AktivGrotesk_HairIt.ufo" name="Aktiv Grotesk Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic {126,100,1}" layer="{126,100,1}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_BlkIt.ufo" name="Aktiv Grotesk Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Hair Italic" familyname="Aktiv Grotesk" stylename="Hair Italic" filename="../instances/AktivGrotesk_HairIt.ufo" postscriptfontname="AktivGrotesk-HairItalic" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Thin Italic" familyname="Aktiv Grotesk" stylename="Thin Italic" filename="../instances/AktivGrotesk_ThIt.ufo" postscriptfontname="AktivGrotesk-ThinItalic" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Light Italic" familyname="Aktiv Grotesk" stylename="Light Italic" filename="../instances/AktivGrotesk_LtIt.ufo" postscriptfontname="AktivGrotesk-LightItalic" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Italic" familyname="Aktiv Grotesk" stylename="Italic" filename="../instances/AktivGrotesk_It.ufo" postscriptfontname="AktivGrotesk-Italic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Medium Italic" familyname="Aktiv Grotesk" stylename="Medium Italic" filename="../instances/AktivGrotesk_MdIt.ufo" postscriptfontname="AktivGrotesk-MediumItalic" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold Italic" familyname="Aktiv Grotesk" stylename="SemiBold Italic" filename="../../build/instances/AktivGrotesk_SBdIt.ufo" postscriptfontname="AktivGrotesk-SemiBoldItalic" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Bold Italic" familyname="Aktiv Grotesk" stylename="Bold Italic" filename="../instances/AktivGrotesk_BdIt.ufo" postscriptfontname="AktivGrotesk-BoldItalic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk XBold Italic" familyname="Aktiv Grotesk" stylename="XBold Italic" filename="../instances/AktivGrotesk_XBdIt.ufo" postscriptfontname="AktivGrotesk-XBoldItalic" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Black Italic" familyname="Aktiv Grotesk" stylename="Black Italic" filename="../instances/AktivGrotesk_BlkIt.ufo" postscriptfontname="AktivGrotesk-BlackItalic" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_WghtWdth.designspace b/Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_WghtWdth.designspace
new file mode 100644
index 00000000..8cda9140
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/AktivGroteskVF_Italics_WghtWdth.designspace
@@ -0,0 +1,262 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ <axis tag="wdth" name="Width" minimum="75" maximum="125" default="100"/>
+ </axes>
+ <rules processing="last">
+ <rule name="BRACKET.CYR">
+ <sub name="ghe.loclSRB" with="ghe.ital.loclSRB"/>
+ <sub name="ghe.loclMKD" with="ghe.ital.loclMKD"/>
+ <sub name="de.loclMKDSRB" with="de.ital.loclMKDSRB"/>
+ <sub name="pe.loclMKDSRB" with="pe.ital.loclMKDSRB"/>
+ <sub name="te.loclMKDSRB" with="te.ital.loclMKDSRB"/>
+ <sub name="gje.loclMKD" with="gje.ital.loclMKD"/>
+ <sub name="sha.loclMKDSRB" with="sha.ital.loclMKDSRB"/>
+ </rule>
+ <rule name="BRACKET.116.185">
+ <conditionset>
+ <condition name="Weight" minimum="116" maximum="185"/>
+ <condition name="Width" minimum="75" maximum="97.5"/>
+ </conditionset>
+ <sub name="cent" with="cent.BRACKET.130"/>
+ <sub name="dollar" with="dollar.BRACKET.130"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../AktivGroteskCd_HairIt.ufo" name="Aktiv Grotesk Cd Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_HairIt.ufo" name="Aktiv Grotesk Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_HairIt.ufo" name="Aktiv Grotesk Ex Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_It.ufo" name="Aktiv Grotesk Cd Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic {126,100,1}" layer="{126,100,1}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_It.ufo" name="Aktiv Grotesk Ex Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_BlkIt.ufo" name="Aktiv Grotesk Cd Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_BlkIt.ufo" name="Aktiv Grotesk Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_BlkIt.ufo" name="Aktiv Grotesk Ex Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Cd Hair Italic" familyname="Aktiv Grotesk" stylename="Cd Hair Italic" filename="../instances/AktivGroteskCd_HairIt.ufo" postscriptfontname="AktivGrotesk-CdHairItalic" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Hair Italic" familyname="Aktiv Grotesk" stylename="Hair Italic" filename="../instances/AktivGrotesk_HairIt.ufo" postscriptfontname="AktivGrotesk-HairItalic" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair Italic" familyname="Aktiv Grotesk" stylename="Ex Hair Italic" filename="../instances/AktivGroteskEx_HairIt.ufo" postscriptfontname="AktivGrotesk-ExHairItalic" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin Italic" familyname="Aktiv Grotesk" stylename="Cd Thin Italic" filename="../instances/AktivGroteskCd_ThIt.ufo" postscriptfontname="AktivGrotesk-CdThinItalic" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Thin Italic" familyname="Aktiv Grotesk" stylename="Thin Italic" filename="../instances/AktivGrotesk_ThIt.ufo" postscriptfontname="AktivGrotesk-ThinItalic" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin Italic" familyname="Aktiv Grotesk" stylename="Ex Thin Italic" filename="../instances/AktivGroteskEx_ThIt.ufo" postscriptfontname="AktivGrotesk-ExThinItalic" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light Italic" familyname="Aktiv Grotesk" stylename="Cd Light Italic" filename="../instances/AktivGroteskCd_LtIt.ufo" postscriptfontname="AktivGrotesk-CdLightItalic" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Light Italic" familyname="Aktiv Grotesk" stylename="Light Italic" filename="../instances/AktivGrotesk_LtIt.ufo" postscriptfontname="AktivGrotesk-LightItalic" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light Italic" familyname="Aktiv Grotesk" stylename="Ex Light Italic" filename="../instances/AktivGroteskEx_LtIt.ufo" postscriptfontname="AktivGrotesk-ExLightItalic" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Italic" familyname="Aktiv Grotesk" stylename="Cd Italic" filename="../instances/AktivGroteskCd_It.ufo" postscriptfontname="AktivGrotesk-CdItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Italic" familyname="Aktiv Grotesk" stylename="Italic" filename="../instances/AktivGrotesk_It.ufo" postscriptfontname="AktivGrotesk-Italic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Italic" familyname="Aktiv Grotesk" stylename="Ex Italic" filename="../instances/AktivGroteskEx_It.ufo" postscriptfontname="AktivGrotesk-ExItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium Italic" familyname="Aktiv Grotesk" stylename="Cd Medium Italic" filename="../instances/AktivGroteskCd_MdIt.ufo" postscriptfontname="AktivGrotesk-CdMediumItalic" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Medium Italic" familyname="Aktiv Grotesk" stylename="Medium Italic" filename="../instances/AktivGrotesk_MdIt.ufo" postscriptfontname="AktivGrotesk-MediumItalic" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium Italic" familyname="Aktiv Grotesk" stylename="Ex Medium Italic" filename="../instances/AktivGroteskEx_MdIt.ufo" postscriptfontname="AktivGrotesk-ExMediumItalic" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold Italic" familyname="Aktiv Grotesk" stylename="Cd SemiBold Italic" filename="../../build/instances/AktivGroteskCd_SBdIt.ufo" postscriptfontname="AktivGrotesk-CdSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold Italic" familyname="Aktiv Grotesk" stylename="SemiBold Italic" filename="../../build/instances/AktivGrotesk_SBdIt.ufo" postscriptfontname="AktivGrotesk-SemiBoldItalic" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold Italic" familyname="Aktiv Grotesk" stylename="Ex SemiBold Italic" filename="../../build/instances/AktivGroteskEx_SBdIt.ufo" postscriptfontname="AktivGrotesk-ExSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold Italic" familyname="Aktiv Grotesk" stylename="Cd Bold Italic" filename="../instances/AktivGroteskCd_BdIt.ufo" postscriptfontname="AktivGrotesk-CdBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Bold Italic" familyname="Aktiv Grotesk" stylename="Bold Italic" filename="../instances/AktivGrotesk_BdIt.ufo" postscriptfontname="AktivGrotesk-BoldItalic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold Italic" familyname="Aktiv Grotesk" stylename="Ex Bold Italic" filename="../instances/AktivGroteskEx_BdIt.ufo" postscriptfontname="AktivGrotesk-ExBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold Italic" familyname="Aktiv Grotesk" stylename="Cd XBold Italic" filename="../instances/AktivGroteskCd_XBdIt.ufo" postscriptfontname="AktivGrotesk-CdXBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk XBold Italic" familyname="Aktiv Grotesk" stylename="XBold Italic" filename="../instances/AktivGrotesk_XBdIt.ufo" postscriptfontname="AktivGrotesk-XBoldItalic" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold Italic" familyname="Aktiv Grotesk" stylename="Ex XBold Italic" filename="../instances/AktivGroteskEx_XBdIt.ufo" postscriptfontname="AktivGrotesk-ExXBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black Italic" familyname="Aktiv Grotesk" stylename="Cd Black Italic" filename="../instances/AktivGroteskCd_BlkIt.ufo" postscriptfontname="AktivGrotesk-CdBlackItalic" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Black Italic" familyname="Aktiv Grotesk" stylename="Black Italic" filename="../instances/AktivGrotesk_BlkIt.ufo" postscriptfontname="AktivGrotesk-BlackItalic" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black Italic" familyname="Aktiv Grotesk" stylename="Ex Black Italic" filename="../instances/AktivGroteskEx_BlkIt.ufo" postscriptfontname="AktivGrotesk-ExBlackItalic" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/AktivGroteskVF_Wght.designspace b/Tests/designspaceLib/data/split_output/AktivGroteskVF_Wght.designspace
new file mode 100644
index 00000000..db621655
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/AktivGroteskVF_Wght.designspace
@@ -0,0 +1,85 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ </axes>
+ <sources>
+ <source filename="../AktivGrotesk_Hair.ufo" name="Aktiv Grotesk Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" layer="{126,100,0}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Blk.ufo" name="Aktiv Grotesk Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Hair" familyname="Aktiv Grotesk" stylename="Hair" filename="../instances/AktivGrotesk_Hair.ufo" postscriptfontname="AktivGrotesk-Hair" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Thin" familyname="Aktiv Grotesk" stylename="Thin" filename="../instances/AktivGrotesk_Th.ufo" postscriptfontname="AktivGrotesk-Thin" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Light" familyname="Aktiv Grotesk" stylename="Light" filename="../instances/AktivGrotesk_Lt.ufo" postscriptfontname="AktivGrotesk-Light" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Medium" familyname="Aktiv Grotesk" stylename="Medium" filename="../instances/AktivGrotesk_Md.ufo" postscriptfontname="AktivGrotesk-Medium" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold" familyname="Aktiv Grotesk" stylename="SemiBold" filename="../../build/instances/AktivGrotesk_SBd.ufo" postscriptfontname="AktivGrotesk-SemiBold" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Bold" familyname="Aktiv Grotesk" stylename="Bold" filename="../instances/AktivGrotesk_Bd.ufo" postscriptfontname="AktivGrotesk-Bold" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk XBold" familyname="Aktiv Grotesk" stylename="XBold" filename="../instances/AktivGrotesk_XBd.ufo" postscriptfontname="AktivGrotesk-XBold" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Black" familyname="Aktiv Grotesk" stylename="Black" filename="../instances/AktivGrotesk_Blk.ufo" postscriptfontname="AktivGrotesk-Black" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdth.designspace b/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdth.designspace
new file mode 100644
index 00000000..113c6897
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdth.designspace
@@ -0,0 +1,253 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ <axis tag="wdth" name="Width" minimum="75" maximum="125" default="100"/>
+ </axes>
+ <rules processing="last">
+ <rule name="BRACKET.116.185">
+ <conditionset>
+ <condition name="Weight" minimum="116" maximum="185"/>
+ <condition name="Width" minimum="75" maximum="97.5"/>
+ </conditionset>
+ <sub name="cent" with="cent.BRACKET.130"/>
+ <sub name="dollar" with="dollar.BRACKET.130"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../AktivGroteskCd_Hair.ufo" name="Aktiv Grotesk Cd Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Hair.ufo" name="Aktiv Grotesk Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Hair.ufo" name="Aktiv Grotesk Ex Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Rg.ufo" name="Aktiv Grotesk Cd">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" layer="{126,100,0}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Rg.ufo" name="Aktiv Grotesk Ex">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Blk.ufo" name="Aktiv Grotesk Cd Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Blk.ufo" name="Aktiv Grotesk Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Blk.ufo" name="Aktiv Grotesk Ex Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Cd Hair" familyname="Aktiv Grotesk" stylename="Cd Hair" filename="../instances/AktivGroteskCd_Hair.ufo" postscriptfontname="AktivGrotesk-CdHair" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Hair" familyname="Aktiv Grotesk" stylename="Hair" filename="../instances/AktivGrotesk_Hair.ufo" postscriptfontname="AktivGrotesk-Hair" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair" familyname="Aktiv Grotesk" stylename="Ex Hair" filename="../instances/AktivGroteskEx_Hair.ufo" postscriptfontname="AktivGrotesk-ExHair" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin" familyname="Aktiv Grotesk" stylename="Cd Thin" filename="../instances/AktivGroteskCd_Th.ufo" postscriptfontname="AktivGrotesk-CdThin" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Thin" familyname="Aktiv Grotesk" stylename="Thin" filename="../instances/AktivGrotesk_Th.ufo" postscriptfontname="AktivGrotesk-Thin" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin" familyname="Aktiv Grotesk" stylename="Ex Thin" filename="../instances/AktivGroteskEx_Th.ufo" postscriptfontname="AktivGrotesk-ExThin" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light" familyname="Aktiv Grotesk" stylename="Cd Light" filename="../instances/AktivGroteskCd_Lt.ufo" postscriptfontname="AktivGrotesk-CdLight" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Light" familyname="Aktiv Grotesk" stylename="Light" filename="../instances/AktivGrotesk_Lt.ufo" postscriptfontname="AktivGrotesk-Light" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light" familyname="Aktiv Grotesk" stylename="Ex Light" filename="../instances/AktivGroteskEx_Lt.ufo" postscriptfontname="AktivGrotesk-ExLight" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd" familyname="Aktiv Grotesk" stylename="Cd" filename="../instances/AktivGroteskCd_Rg.ufo" postscriptfontname="AktivGrotesk-Cd" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex" familyname="Aktiv Grotesk" stylename="Ex" filename="../instances/AktivGroteskEx_Rg.ufo" postscriptfontname="AktivGrotesk-Ex" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium" familyname="Aktiv Grotesk" stylename="Cd Medium" filename="../instances/AktivGroteskCd_Md.ufo" postscriptfontname="AktivGrotesk-CdMedium" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Medium" familyname="Aktiv Grotesk" stylename="Medium" filename="../instances/AktivGrotesk_Md.ufo" postscriptfontname="AktivGrotesk-Medium" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium" familyname="Aktiv Grotesk" stylename="Ex Medium" filename="../instances/AktivGroteskEx_Md.ufo" postscriptfontname="AktivGrotesk-ExMedium" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold" familyname="Aktiv Grotesk" stylename="Cd SemiBold" filename="../../build/instances/AktivGroteskCd_SBd.ufo" postscriptfontname="AktivGrotesk-CdSemiBold" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold" familyname="Aktiv Grotesk" stylename="SemiBold" filename="../../build/instances/AktivGrotesk_SBd.ufo" postscriptfontname="AktivGrotesk-SemiBold" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold" familyname="Aktiv Grotesk" stylename="Ex SemiBold" filename="../../build/instances/AktivGroteskEx_SBd.ufo" postscriptfontname="AktivGrotesk-ExSemiBold" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold" familyname="Aktiv Grotesk" stylename="Cd Bold" filename="../instances/AktivGroteskCd_Bd.ufo" postscriptfontname="AktivGrotesk-CdBold" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Bold" familyname="Aktiv Grotesk" stylename="Bold" filename="../instances/AktivGrotesk_Bd.ufo" postscriptfontname="AktivGrotesk-Bold" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold" familyname="Aktiv Grotesk" stylename="Ex Bold" filename="../instances/AktivGroteskEx_Bd.ufo" postscriptfontname="AktivGrotesk-ExBold" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold" familyname="Aktiv Grotesk" stylename="Cd XBold" filename="../instances/AktivGroteskCd_XBd.ufo" postscriptfontname="AktivGrotesk-CdXBold" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk XBold" familyname="Aktiv Grotesk" stylename="XBold" filename="../instances/AktivGrotesk_XBd.ufo" postscriptfontname="AktivGrotesk-XBold" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold" familyname="Aktiv Grotesk" stylename="Ex XBold" filename="../instances/AktivGroteskEx_XBd.ufo" postscriptfontname="AktivGrotesk-ExXBold" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black" familyname="Aktiv Grotesk" stylename="Cd Black" filename="../instances/AktivGroteskCd_Blk.ufo" postscriptfontname="AktivGrotesk-CdBlack" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Black" familyname="Aktiv Grotesk" stylename="Black" filename="../instances/AktivGrotesk_Blk.ufo" postscriptfontname="AktivGrotesk-Black" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black" familyname="Aktiv Grotesk" stylename="Ex Black" filename="../instances/AktivGroteskEx_Blk.ufo" postscriptfontname="AktivGrotesk-ExBlack" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdthItal.designspace b/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdthItal.designspace
new file mode 100644
index 00000000..4a1ef48f
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/AktivGroteskVF_WghtWdthItal.designspace
@@ -0,0 +1,562 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ <axis tag="wdth" name="Width" minimum="75" maximum="125" default="100"/>
+ <axis tag="ital" name="Italic" minimum="0" maximum="1" default="0"/>
+ </axes>
+ <rules processing="last">
+ <rule name="BRACKET.CYR">
+ <conditionset>
+ <condition name="Italic" minimum="0.1" maximum="1"/>
+ </conditionset>
+ <sub name="ghe.loclSRB" with="ghe.ital.loclSRB"/>
+ <sub name="ghe.loclMKD" with="ghe.ital.loclMKD"/>
+ <sub name="de.loclMKDSRB" with="de.ital.loclMKDSRB"/>
+ <sub name="pe.loclMKDSRB" with="pe.ital.loclMKDSRB"/>
+ <sub name="te.loclMKDSRB" with="te.ital.loclMKDSRB"/>
+ <sub name="gje.loclMKD" with="gje.ital.loclMKD"/>
+ <sub name="sha.loclMKDSRB" with="sha.ital.loclMKDSRB"/>
+ </rule>
+ <rule name="BRACKET.116.185">
+ <conditionset>
+ <condition name="Weight" minimum="116" maximum="185"/>
+ <condition name="Width" minimum="75" maximum="97.5"/>
+ </conditionset>
+ <sub name="cent" with="cent.BRACKET.130"/>
+ <sub name="dollar" with="dollar.BRACKET.130"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../AktivGroteskCd_Hair.ufo" name="Aktiv Grotesk Cd Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_HairIt.ufo" name="Aktiv Grotesk Cd Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Hair.ufo" name="Aktiv Grotesk Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_HairIt.ufo" name="Aktiv Grotesk Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Hair.ufo" name="Aktiv Grotesk Ex Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_HairIt.ufo" name="Aktiv Grotesk Ex Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Rg.ufo" name="Aktiv Grotesk Cd">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_It.ufo" name="Aktiv Grotesk Cd Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" layer="{126,100,0}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic {126,100,1}" layer="{126,100,1}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Rg.ufo" name="Aktiv Grotesk Ex">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_It.ufo" name="Aktiv Grotesk Ex Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Blk.ufo" name="Aktiv Grotesk Cd Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_BlkIt.ufo" name="Aktiv Grotesk Cd Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Blk.ufo" name="Aktiv Grotesk Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_BlkIt.ufo" name="Aktiv Grotesk Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Blk.ufo" name="Aktiv Grotesk Ex Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_BlkIt.ufo" name="Aktiv Grotesk Ex Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Aktiv Grotesk Cd Hair" familyname="Aktiv Grotesk" stylename="Cd Hair" filename="../instances/AktivGroteskCd_Hair.ufo" postscriptfontname="AktivGrotesk-CdHair" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Hair Italic" familyname="Aktiv Grotesk" stylename="Cd Hair Italic" filename="../instances/AktivGroteskCd_HairIt.ufo" postscriptfontname="AktivGrotesk-CdHairItalic" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Hair" familyname="Aktiv Grotesk" stylename="Hair" filename="../instances/AktivGrotesk_Hair.ufo" postscriptfontname="AktivGrotesk-Hair" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Hair Italic" familyname="Aktiv Grotesk" stylename="Hair Italic" filename="../instances/AktivGrotesk_HairIt.ufo" postscriptfontname="AktivGrotesk-HairItalic" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair" familyname="Aktiv Grotesk" stylename="Ex Hair" filename="../instances/AktivGroteskEx_Hair.ufo" postscriptfontname="AktivGrotesk-ExHair" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair Italic" familyname="Aktiv Grotesk" stylename="Ex Hair Italic" filename="../instances/AktivGroteskEx_HairIt.ufo" postscriptfontname="AktivGrotesk-ExHairItalic" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin" familyname="Aktiv Grotesk" stylename="Cd Thin" filename="../instances/AktivGroteskCd_Th.ufo" postscriptfontname="AktivGrotesk-CdThin" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin Italic" familyname="Aktiv Grotesk" stylename="Cd Thin Italic" filename="../instances/AktivGroteskCd_ThIt.ufo" postscriptfontname="AktivGrotesk-CdThinItalic" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Thin" familyname="Aktiv Grotesk" stylename="Thin" filename="../instances/AktivGrotesk_Th.ufo" postscriptfontname="AktivGrotesk-Thin" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Thin Italic" familyname="Aktiv Grotesk" stylename="Thin Italic" filename="../instances/AktivGrotesk_ThIt.ufo" postscriptfontname="AktivGrotesk-ThinItalic" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin" familyname="Aktiv Grotesk" stylename="Ex Thin" filename="../instances/AktivGroteskEx_Th.ufo" postscriptfontname="AktivGrotesk-ExThin" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin Italic" familyname="Aktiv Grotesk" stylename="Ex Thin Italic" filename="../instances/AktivGroteskEx_ThIt.ufo" postscriptfontname="AktivGrotesk-ExThinItalic" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light" familyname="Aktiv Grotesk" stylename="Cd Light" filename="../instances/AktivGroteskCd_Lt.ufo" postscriptfontname="AktivGrotesk-CdLight" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light Italic" familyname="Aktiv Grotesk" stylename="Cd Light Italic" filename="../instances/AktivGroteskCd_LtIt.ufo" postscriptfontname="AktivGrotesk-CdLightItalic" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Light" familyname="Aktiv Grotesk" stylename="Light" filename="../instances/AktivGrotesk_Lt.ufo" postscriptfontname="AktivGrotesk-Light" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Light Italic" familyname="Aktiv Grotesk" stylename="Light Italic" filename="../instances/AktivGrotesk_LtIt.ufo" postscriptfontname="AktivGrotesk-LightItalic" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light" familyname="Aktiv Grotesk" stylename="Ex Light" filename="../instances/AktivGroteskEx_Lt.ufo" postscriptfontname="AktivGrotesk-ExLight" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light Italic" familyname="Aktiv Grotesk" stylename="Ex Light Italic" filename="../instances/AktivGroteskEx_LtIt.ufo" postscriptfontname="AktivGrotesk-ExLightItalic" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd" familyname="Aktiv Grotesk" stylename="Cd" filename="../instances/AktivGroteskCd_Rg.ufo" postscriptfontname="AktivGrotesk-Cd" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Italic" familyname="Aktiv Grotesk" stylename="Cd Italic" filename="../instances/AktivGroteskCd_It.ufo" postscriptfontname="AktivGrotesk-CdItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Italic" familyname="Aktiv Grotesk" stylename="Italic" filename="../instances/AktivGrotesk_It.ufo" postscriptfontname="AktivGrotesk-Italic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex" familyname="Aktiv Grotesk" stylename="Ex" filename="../instances/AktivGroteskEx_Rg.ufo" postscriptfontname="AktivGrotesk-Ex" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Italic" familyname="Aktiv Grotesk" stylename="Ex Italic" filename="../instances/AktivGroteskEx_It.ufo" postscriptfontname="AktivGrotesk-ExItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium" familyname="Aktiv Grotesk" stylename="Cd Medium" filename="../instances/AktivGroteskCd_Md.ufo" postscriptfontname="AktivGrotesk-CdMedium" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium Italic" familyname="Aktiv Grotesk" stylename="Cd Medium Italic" filename="../instances/AktivGroteskCd_MdIt.ufo" postscriptfontname="AktivGrotesk-CdMediumItalic" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Medium" familyname="Aktiv Grotesk" stylename="Medium" filename="../instances/AktivGrotesk_Md.ufo" postscriptfontname="AktivGrotesk-Medium" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Medium Italic" familyname="Aktiv Grotesk" stylename="Medium Italic" filename="../instances/AktivGrotesk_MdIt.ufo" postscriptfontname="AktivGrotesk-MediumItalic" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium" familyname="Aktiv Grotesk" stylename="Ex Medium" filename="../instances/AktivGroteskEx_Md.ufo" postscriptfontname="AktivGrotesk-ExMedium" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium Italic" familyname="Aktiv Grotesk" stylename="Ex Medium Italic" filename="../instances/AktivGroteskEx_MdIt.ufo" postscriptfontname="AktivGrotesk-ExMediumItalic" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold" familyname="Aktiv Grotesk" stylename="Cd SemiBold" filename="../../build/instances/AktivGroteskCd_SBd.ufo" postscriptfontname="AktivGrotesk-CdSemiBold" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold Italic" familyname="Aktiv Grotesk" stylename="Cd SemiBold Italic" filename="../../build/instances/AktivGroteskCd_SBdIt.ufo" postscriptfontname="AktivGrotesk-CdSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold" familyname="Aktiv Grotesk" stylename="SemiBold" filename="../../build/instances/AktivGrotesk_SBd.ufo" postscriptfontname="AktivGrotesk-SemiBold" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold Italic" familyname="Aktiv Grotesk" stylename="SemiBold Italic" filename="../../build/instances/AktivGrotesk_SBdIt.ufo" postscriptfontname="AktivGrotesk-SemiBoldItalic" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold" familyname="Aktiv Grotesk" stylename="Ex SemiBold" filename="../../build/instances/AktivGroteskEx_SBd.ufo" postscriptfontname="AktivGrotesk-ExSemiBold" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold Italic" familyname="Aktiv Grotesk" stylename="Ex SemiBold Italic" filename="../../build/instances/AktivGroteskEx_SBdIt.ufo" postscriptfontname="AktivGrotesk-ExSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold" familyname="Aktiv Grotesk" stylename="Cd Bold" filename="../instances/AktivGroteskCd_Bd.ufo" postscriptfontname="AktivGrotesk-CdBold" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold Italic" familyname="Aktiv Grotesk" stylename="Cd Bold Italic" filename="../instances/AktivGroteskCd_BdIt.ufo" postscriptfontname="AktivGrotesk-CdBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Bold" familyname="Aktiv Grotesk" stylename="Bold" filename="../instances/AktivGrotesk_Bd.ufo" postscriptfontname="AktivGrotesk-Bold" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Bold Italic" familyname="Aktiv Grotesk" stylename="Bold Italic" filename="../instances/AktivGrotesk_BdIt.ufo" postscriptfontname="AktivGrotesk-BoldItalic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold" familyname="Aktiv Grotesk" stylename="Ex Bold" filename="../instances/AktivGroteskEx_Bd.ufo" postscriptfontname="AktivGrotesk-ExBold" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold Italic" familyname="Aktiv Grotesk" stylename="Ex Bold Italic" filename="../instances/AktivGroteskEx_BdIt.ufo" postscriptfontname="AktivGrotesk-ExBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold" familyname="Aktiv Grotesk" stylename="Cd XBold" filename="../instances/AktivGroteskCd_XBd.ufo" postscriptfontname="AktivGrotesk-CdXBold" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold Italic" familyname="Aktiv Grotesk" stylename="Cd XBold Italic" filename="../instances/AktivGroteskCd_XBdIt.ufo" postscriptfontname="AktivGrotesk-CdXBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk XBold" familyname="Aktiv Grotesk" stylename="XBold" filename="../instances/AktivGrotesk_XBd.ufo" postscriptfontname="AktivGrotesk-XBold" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk XBold Italic" familyname="Aktiv Grotesk" stylename="XBold Italic" filename="../instances/AktivGrotesk_XBdIt.ufo" postscriptfontname="AktivGrotesk-XBoldItalic" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold" familyname="Aktiv Grotesk" stylename="Ex XBold" filename="../instances/AktivGroteskEx_XBd.ufo" postscriptfontname="AktivGrotesk-ExXBold" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold Italic" familyname="Aktiv Grotesk" stylename="Ex XBold Italic" filename="../instances/AktivGroteskEx_XBdIt.ufo" postscriptfontname="AktivGrotesk-ExXBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black" familyname="Aktiv Grotesk" stylename="Cd Black" filename="../instances/AktivGroteskCd_Blk.ufo" postscriptfontname="AktivGrotesk-CdBlack" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black Italic" familyname="Aktiv Grotesk" stylename="Cd Black Italic" filename="../instances/AktivGroteskCd_BlkIt.ufo" postscriptfontname="AktivGrotesk-CdBlackItalic" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Black" familyname="Aktiv Grotesk" stylename="Black" filename="../instances/AktivGrotesk_Blk.ufo" postscriptfontname="AktivGrotesk-Black" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Black Italic" familyname="Aktiv Grotesk" stylename="Black Italic" filename="../instances/AktivGrotesk_BlkIt.ufo" postscriptfontname="AktivGrotesk-BlackItalic" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black" familyname="Aktiv Grotesk" stylename="Ex Black" filename="../instances/AktivGroteskEx_Blk.ufo" postscriptfontname="AktivGrotesk-ExBlack" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black Italic" familyname="Aktiv Grotesk" stylename="Ex Black Italic" filename="../instances/AktivGroteskEx_BlkIt.ufo" postscriptfontname="AktivGrotesk-ExBlackItalic" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/MutatorSansVariable_Weight.designspace b/Tests/designspaceLib/data/split_output/MutatorSansVariable_Weight.designspace
new file mode 100644
index 00000000..6dcc6002
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/MutatorSansVariable_Weight.designspace
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="weight" minimum="300" maximum="700" default="300">
+ <map input="300" output="0"/>
+ <map input="500" output="500"/>
+ <map input="700" output="1000"/>
+ </axis>
+ </axes>
+ <rules>
+ <rule name="fold_I_serifs">
+ <sub name="I" with="I.narrow"/>
+ </rule>
+ <rule name="fold_S_terminals">
+ <conditionset>
+ <condition name="weight" minimum="0" maximum="500"/>
+ </conditionset>
+ <sub name="S" with="S.closed"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../MutatorSansLightCondensed.ufo" name="master.MutatorMathTest.LightCondensed.0" familyname="MutatorMathTest" stylename="LightCondensed">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansBoldCondensed.ufo" name="master.MutatorMathTest.BoldCondensed.1" familyname="MutatorMathTest" stylename="BoldCondensed">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightCondensed.ufo" name="support.crossbar" layer="support.crossbar">
+ <location>
+ <dimension name="weight" xvalue="700"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="MutatorMathTest Sans Light Condensed" familyname="MutatorMathTest" stylename="Sans Light Condensed" filename="MutatorMathTest-Sans Light Condensed.ttf" postscriptfontname="MutatorMathTest-SansLightCondensed" stylemapfamilyname="MutatorMathTest Sans Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Bold Condensed" familyname="MutatorMathTest" stylename="Sans Bold Condensed" filename="MutatorMathTest-Sans Bold Condensed.ttf" postscriptfontname="MutatorMathTest-SansBoldCondensed" stylemapfamilyname="MutatorMathTest Sans Bold Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Light Condensed" familyname="MutatorMathTest" stylename="Sans Light Condensed" filename="MutatorMathTest-Sans Light Condensed.ttf" postscriptfontname="MutatorMathTest-SansLightCondensed" stylemapfamilyname="MutatorMathTest Sans Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/MutatorSansVariable_Weight_Width.designspace b/Tests/designspaceLib/data/split_output/MutatorSansVariable_Weight_Width.designspace
new file mode 100644
index 00000000..e83be97f
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/MutatorSansVariable_Weight_Width.designspace
@@ -0,0 +1,129 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="weight" minimum="300" maximum="700" default="300">
+ <map input="300" output="0"/>
+ <map input="500" output="500"/>
+ <map input="700" output="1000"/>
+ </axis>
+ <axis tag="wdth" name="width" minimum="50" maximum="200" default="50">
+ <map input="50" output="0"/>
+ <map input="100" output="500"/>
+ <map input="200" output="1000"/>
+ </axis>
+ </axes>
+ <rules>
+ <rule name="fold_I_serifs">
+ <conditionset>
+ <condition name="width" minimum="0" maximum="328"/>
+ </conditionset>
+ <sub name="I" with="I.narrow"/>
+ </rule>
+ <rule name="fold_S_terminals">
+ <conditionset>
+ <condition name="weight" minimum="0" maximum="500"/>
+ </conditionset>
+ <sub name="S" with="S.closed"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../MutatorSansLightCondensed.ufo" name="master.MutatorMathTest.LightCondensed.0" familyname="MutatorMathTest" stylename="LightCondensed">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansBoldCondensed.ufo" name="master.MutatorMathTest.BoldCondensed.1" familyname="MutatorMathTest" stylename="BoldCondensed">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightWide.ufo" name="master.MutatorMathTest.LightWide.2" familyname="MutatorMathTest" stylename="LightWide">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansBoldWide.ufo" name="master.MutatorMathTest.BoldWide.3" familyname="MutatorMathTest" stylename="BoldWide">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightCondensed.ufo" name="support.crossbar" layer="support.crossbar">
+ <location>
+ <dimension name="weight" xvalue="700"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightCondensed.ufo" name="support.S.wide" layer="support.S.wide">
+ <location>
+ <dimension name="weight" xvalue="700"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightCondensed.ufo" name="support.S.middle" layer="support.S.middle">
+ <location>
+ <dimension name="weight" xvalue="700"/>
+ <dimension name="width" xvalue="569.078"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="MutatorMathTest Sans Light Condensed" familyname="MutatorMathTest" stylename="Sans Light Condensed" filename="MutatorMathTest-Sans Light Condensed.ttf" postscriptfontname="MutatorMathTest-SansLightCondensed" stylemapfamilyname="MutatorMathTest Sans Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Bold Condensed" familyname="MutatorMathTest" stylename="Sans Bold Condensed" filename="MutatorMathTest-Sans Bold Condensed.ttf" postscriptfontname="MutatorMathTest-SansBoldCondensed" stylemapfamilyname="MutatorMathTest Sans Bold Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Light Extended" familyname="MutatorMathTest" stylename="Sans Light Extended" filename="MutatorMathTest-Sans Light Extended.ttf" postscriptfontname="MutatorMathTest-SansLightExtended" stylemapfamilyname="MutatorMathTest Sans Light Extended" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Bold Extended" familyname="MutatorMathTest" stylename="Sans Bold Extended" filename="MutatorMathTest-Sans Bold Extended.ttf" postscriptfontname="MutatorMathTest-SansBoldExtended" stylemapfamilyname="MutatorMathTest Sans Bold Extended" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Medium" familyname="MutatorMathTest" stylename="Sans Medium" filename="MutatorMathTest-Sans Medium.ttf" postscriptfontname="MutatorMathTest-SansMedium" stylemapfamilyname="MutatorMathTest Sans Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ <dimension name="width" xvalue="327"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Medium" familyname="MutatorMathTest" stylename="Sans Medium" filename="MutatorMathTest-Sans Medium.ttf" postscriptfontname="MutatorMathTest-SansMedium" stylemapfamilyname="MutatorMathTest Sans Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ <dimension name="width" xvalue="327"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Bold" familyname="MutatorMathTest" stylename="Sans Bold" filename="MutatorMathTest-Sans Bold.ttf" postscriptfontname="MutatorMathTest-SansBold" stylemapfamilyname="MutatorMathTest Sans Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="569.078"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Medium Extended" familyname="MutatorMathTest" stylename="Sans Medium Extended" filename="MutatorMathTest-Sans Medium Extended.ttf" postscriptfontname="MutatorMathTest-SansMediumExtended" stylemapfamilyname="MutatorMathTest Sans Medium Extended" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Light Condensed" familyname="MutatorMathTest" stylename="Sans Light Condensed" filename="MutatorMathTest-Sans Light Condensed.ttf" postscriptfontname="MutatorMathTest-SansLightCondensed" stylemapfamilyname="MutatorMathTest Sans Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/MutatorSansVariable_Width.designspace b/Tests/designspaceLib/data/split_output/MutatorSansVariable_Width.designspace
new file mode 100644
index 00000000..9384c73c
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/MutatorSansVariable_Width.designspace
@@ -0,0 +1,50 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wdth" name="width" minimum="50" maximum="200" default="50">
+ <map input="50" output="0"/>
+ <map input="100" output="500"/>
+ <map input="200" output="1000"/>
+ </axis>
+ </axes>
+ <rules>
+ <rule name="fold_I_serifs">
+ <conditionset>
+ <condition name="width" minimum="0" maximum="328"/>
+ </conditionset>
+ <sub name="I" with="I.narrow"/>
+ </rule>
+ <rule name="fold_S_terminals">
+ <sub name="S" with="S.closed"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../MutatorSansLightCondensed.ufo" name="master.MutatorMathTest.LightCondensed.0" familyname="MutatorMathTest" stylename="LightCondensed">
+ <location>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightWide.ufo" name="master.MutatorMathTest.LightWide.2" familyname="MutatorMathTest" stylename="LightWide">
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="MutatorMathTest Sans Light Condensed" familyname="MutatorMathTest" stylename="Sans Light Condensed" filename="MutatorMathTest-Sans Light Condensed.ttf" postscriptfontname="MutatorMathTest-SansLightCondensed" stylemapfamilyname="MutatorMathTest Sans Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Light Extended" familyname="MutatorMathTest" stylename="Sans Light Extended" filename="MutatorMathTest-Sans Light Extended.ttf" postscriptfontname="MutatorMathTest-SansLightExtended" stylemapfamilyname="MutatorMathTest Sans Light Extended" stylemapstylename="regular">
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Light Condensed" familyname="MutatorMathTest" stylename="Sans Light Condensed" filename="MutatorMathTest-Sans Light Condensed.ttf" postscriptfontname="MutatorMathTest-SansLightCondensed" stylemapfamilyname="MutatorMathTest Sans Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/MutatorSerifVariable_Width.designspace b/Tests/designspaceLib/data/split_output/MutatorSerifVariable_Width.designspace
new file mode 100644
index 00000000..b71025a2
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/MutatorSerifVariable_Width.designspace
@@ -0,0 +1,29 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wdth" name="width" minimum="50" maximum="200" default="50">
+ <map input="50" output="0"/>
+ <map input="100" output="500"/>
+ <map input="200" output="1000"/>
+ </axis>
+ </axes>
+ <sources>
+ <source filename="../MutatorSerifLightCondensed.ufo" familyname="MutatorMathTest" stylename="SerifLightCondensed">
+ <location>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSerifLightWide.ufo" familyname="MutatorMathTest" stylename="SerifLightWide">
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="MutatorMathTest Serif Light Condensed" familyname="MutatorMathTest" stylename="Serif Light Condensed" filename="MutatorMathTest-Serif Light Condensed.ttf" postscriptfontname="MutatorMathTest-SerifLightCondensed" stylemapfamilyname="MutatorMathTest Serif Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Italic.designspace b/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Italic.designspace
new file mode 100644
index 00000000..c1eb95d9
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Italic.designspace
@@ -0,0 +1,266 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="weight" minimum="200" maximum="900" default="400">
+ <map input="200" output="0"/>
+ <map input="300" output="145"/>
+ <map input="400" output="394"/>
+ <map input="600" output="594"/>
+ <map input="700" output="823"/>
+ <map input="900" output="1000"/>
+ </axis>
+ <axis tag="opsz" name="optical" minimum="8" maximum="60" default="20"/>
+ </axes>
+ <sources>
+ <source filename="../caption/master_0/SourceSerif-Italic_c0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_1/SourceSerif-Italic_c1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_2/SourceSerif-Italic_c2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../text/master_0/SourceSerif-Italic_0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_1/SourceSerif-Italic_1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_2/SourceSerif-Italic_2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../display/master_0/SourceSerif-Italic_d0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_1/SourceSerif-Italic_d1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_2/SourceSerif-Italic_d2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Source Serif 4 Caption ExtraLight Italic" familyname="Source Serif 4" stylename="Caption ExtraLight Italic" filename="Source Serif 4-Caption ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionExtraLight" stylemapfamilyname="Source Serif 4 Caption ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Light Italic" familyname="Source Serif 4" stylename="Caption Light Italic" filename="Source Serif 4-Caption Light Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionLight" stylemapfamilyname="Source Serif 4 Caption Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Italic" familyname="Source Serif 4" stylename="Caption Italic" filename="Source Serif 4-Caption Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionRegular" stylemapfamilyname="Source Serif 4 Caption Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Semibold Italic" familyname="Source Serif 4" stylename="Caption Semibold Italic" filename="Source Serif 4-Caption Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionSemibold" stylemapfamilyname="Source Serif 4 Caption Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Bold Italic" familyname="Source Serif 4" stylename="Caption Bold Italic" filename="Source Serif 4-Caption Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionBold" stylemapfamilyname="Source Serif 4 Caption Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Black Italic" familyname="Source Serif 4" stylename="Caption Black Italic" filename="Source Serif 4-Caption Black Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionBlack" stylemapfamilyname="Source Serif 4 Caption Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText ExtraLight Italic" familyname="Source Serif 4" stylename="SmText ExtraLight Italic" filename="Source Serif 4-SmText ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextExtraLight" stylemapfamilyname="Source Serif 4 SmallText ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Light Italic" familyname="Source Serif 4" stylename="SmText Light Italic" filename="Source Serif 4-SmText Light Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextLight" stylemapfamilyname="Source Serif 4 SmallText Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Italic" familyname="Source Serif 4" stylename="SmText Italic" filename="Source Serif 4-SmText Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextRegular" stylemapfamilyname="Source Serif 4 SmallText Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Semibold Italic" familyname="Source Serif 4" stylename="SmText Semibold Italic" filename="Source Serif 4-SmText Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextSemibold" stylemapfamilyname="Source Serif 4 SmallText Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Bold Italic" familyname="Source Serif 4" stylename="SmText Bold Italic" filename="Source Serif 4-SmText Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextBold" stylemapfamilyname="Source Serif 4 SmallText Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Black Italic" familyname="Source Serif 4" stylename="SmText Black Italic" filename="Source Serif 4-SmText Black Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextBlack" stylemapfamilyname="Source Serif 4 SmallText Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 ExtraLight Italic" familyname="Source Serif 4" stylename="ExtraLight Italic" filename="Source Serif 4-ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-ExtraLight" stylemapfamilyname="Source Serif 4 ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Light Italic" familyname="Source Serif 4" stylename="Light Italic" filename="Source Serif 4-Light Italic.ttf" postscriptfontname="SourceSerif4Italic-Light" stylemapfamilyname="Source Serif 4 Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Italic" familyname="Source Serif 4" stylename="Italic" filename="Source Serif 4-Italic.ttf" postscriptfontname="SourceSerif4Italic-Regular" stylemapfamilyname="Source Serif 4 Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Semibold Italic" familyname="Source Serif 4" stylename="Semibold Italic" filename="Source Serif 4-Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-Semibold" stylemapfamilyname="Source Serif 4 Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Bold Italic" familyname="Source Serif 4" stylename="Bold Italic" filename="Source Serif 4-Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-Bold" stylemapfamilyname="Source Serif 4 Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Black Italic" familyname="Source Serif 4" stylename="Black Italic" filename="Source Serif 4-Black Italic.ttf" postscriptfontname="SourceSerif4Italic-Black" stylemapfamilyname="Source Serif 4 Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead ExtraLight Italic" familyname="Source Serif 4" stylename="Subhead ExtraLight Italic" filename="Source Serif 4-Subhead ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadExtraLight" stylemapfamilyname="Source Serif 4 Subhead ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Light Italic" familyname="Source Serif 4" stylename="Subhead Light Italic" filename="Source Serif 4-Subhead Light Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadLight" stylemapfamilyname="Source Serif 4 Subhead Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Italic" familyname="Source Serif 4" stylename="Subhead Italic" filename="Source Serif 4-Subhead Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadRegular" stylemapfamilyname="Source Serif 4 Subhead Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Semibold Italic" familyname="Source Serif 4" stylename="Subhead Semibold Italic" filename="Source Serif 4-Subhead Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadSemibold" stylemapfamilyname="Source Serif 4 Subhead Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Bold Italic" familyname="Source Serif 4" stylename="Subhead Bold Italic" filename="Source Serif 4-Subhead Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadBold" stylemapfamilyname="Source Serif 4 Subhead Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Black Italic" familyname="Source Serif 4" stylename="Subhead Black Italic" filename="Source Serif 4-Subhead Black Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadBlack" stylemapfamilyname="Source Serif 4 Subhead Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display ExtraLight Italic" familyname="Source Serif 4" stylename="Display ExtraLight Italic" filename="Source Serif 4-Display ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayExtraLight" stylemapfamilyname="Source Serif 4 Display ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Light Italic" familyname="Source Serif 4" stylename="Display Light Italic" filename="Source Serif 4-Display Light Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayLight" stylemapfamilyname="Source Serif 4 Display Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Italic" familyname="Source Serif 4" stylename="Display Italic" filename="Source Serif 4-Display Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayRegular" stylemapfamilyname="Source Serif 4 Display Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Semibold Italic" familyname="Source Serif 4" stylename="Display Semibold Italic" filename="Source Serif 4-Display Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplaySemibold" stylemapfamilyname="Source Serif 4 Display Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Bold Italic" familyname="Source Serif 4" stylename="Display Bold Italic" filename="Source Serif 4-Display Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayBold" stylemapfamilyname="Source Serif 4 Display Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Black Italic" familyname="Source Serif 4" stylename="Display Black Italic" filename="Source Serif 4-Display Black Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayBlack" stylemapfamilyname="Source Serif 4 Display Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ </instances>
+ <lib>
+ <dict>
+ <key>public.skipExportGlyphs</key>
+ <array>
+ <string>caron.alt</string>
+ <string>commabelowcmb.alt</string>
+ <string>f.liga</string>
+ <string>f.ligalong</string>
+ <string>tonos.cap</string>
+ <string>dieresiscmb.tight</string>
+ <string>turkicdsccmb</string>
+ </array>
+ </dict>
+ </lib>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Roman.designspace b/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Roman.designspace
new file mode 100644
index 00000000..1eee53e0
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/SourceSerif4Variable-Roman.designspace
@@ -0,0 +1,274 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="weight" minimum="200" maximum="900" default="400">
+ <map input="200" output="0"/>
+ <map input="300" output="145"/>
+ <map input="400" output="394"/>
+ <map input="600" output="594"/>
+ <map input="700" output="823"/>
+ <map input="900" output="1000"/>
+ </axis>
+ <axis tag="opsz" name="optical" minimum="8" maximum="60" default="20"/>
+ </axes>
+ <sources>
+ <source filename="../caption/master_0/SourceSerif_c0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_1/SourceSerif_c1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_2/SourceSerif_c2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../text/master_0/SourceSerif_0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_1/SourceSerif_1.ufo" familyname="Source Serif 4">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_2/SourceSerif_2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../display/master_0/SourceSerif_d0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_1/SourceSerif_d1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_2/SourceSerif_d2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="Source Serif 4 Caption ExtraLight" familyname="Source Serif 4" stylename="Caption ExtraLight" filename="Source Serif 4-Caption ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-CaptionExtraLight" stylemapfamilyname="Source Serif 4 Caption ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Light" familyname="Source Serif 4" stylename="Caption Light" filename="Source Serif 4-Caption Light.ttf" postscriptfontname="SourceSerif4Roman-CaptionLight" stylemapfamilyname="Source Serif 4 Caption Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption" familyname="Source Serif 4" stylename="Caption" filename="Source Serif 4-Caption.ttf" postscriptfontname="SourceSerif4Roman-CaptionRegular" stylemapfamilyname="Source Serif 4 Caption" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Semibold" familyname="Source Serif 4" stylename="Caption Semibold" filename="Source Serif 4-Caption Semibold.ttf" postscriptfontname="SourceSerif4Roman-CaptionSemibold" stylemapfamilyname="Source Serif 4 Caption Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Bold" familyname="Source Serif 4" stylename="Caption Bold" filename="Source Serif 4-Caption Bold.ttf" postscriptfontname="SourceSerif4Roman-CaptionBold" stylemapfamilyname="Source Serif 4 Caption Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Black" familyname="Source Serif 4" stylename="Caption Black" filename="Source Serif 4-Caption Black.ttf" postscriptfontname="SourceSerif4Roman-CaptionBlack" stylemapfamilyname="Source Serif 4 Caption Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText ExtraLight" familyname="Source Serif 4" stylename="SmText ExtraLight" filename="Source Serif 4-SmText ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-SmTextExtraLight" stylemapfamilyname="Source Serif 4 SmallText ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Light" familyname="Source Serif 4" stylename="SmText Light" filename="Source Serif 4-SmText Light.ttf" postscriptfontname="SourceSerif4Roman-SmTextLight" stylemapfamilyname="Source Serif 4 SmallText Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText" familyname="Source Serif 4" stylename="SmText" filename="Source Serif 4-SmText.ttf" postscriptfontname="SourceSerif4Roman-SmTextRegular" stylemapfamilyname="Source Serif 4 SmallText" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Semibold" familyname="Source Serif 4" stylename="SmText Semibold" filename="Source Serif 4-SmText Semibold.ttf" postscriptfontname="SourceSerif4Roman-SmTextSemibold" stylemapfamilyname="Source Serif 4 SmallText Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Bold" familyname="Source Serif 4" stylename="SmText Bold" filename="Source Serif 4-SmText Bold.ttf" postscriptfontname="SourceSerif4Roman-SmTextBold" stylemapfamilyname="Source Serif 4 SmallText Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Black" familyname="Source Serif 4" stylename="SmText Black" filename="Source Serif 4-SmText Black.ttf" postscriptfontname="SourceSerif4Roman-SmTextBlack" stylemapfamilyname="Source Serif 4 SmallText Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 ExtraLight" familyname="Source Serif 4" stylename="ExtraLight" filename="Source Serif 4-ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-ExtraLight" stylemapfamilyname="Source Serif 4 ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Light" familyname="Source Serif 4" stylename="Light" filename="Source Serif 4-Light.ttf" postscriptfontname="SourceSerif4Roman-Light" stylemapfamilyname="Source Serif 4 Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Regular" familyname="Source Serif 4" stylename="Regular" filename="Source Serif 4-Regular.ttf" postscriptfontname="SourceSerif4Roman-Regular" stylemapfamilyname="Source Serif 4" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Semibold" familyname="Source Serif 4" stylename="Semibold" filename="Source Serif 4-Semibold.ttf" postscriptfontname="SourceSerif4Roman-Semibold" stylemapfamilyname="Source Serif 4 Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Bold" familyname="Source Serif 4" stylename="Bold" filename="Source Serif 4-Bold.ttf" postscriptfontname="SourceSerif4Roman-Bold" stylemapfamilyname="Source Serif 4 Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Black" familyname="Source Serif 4" stylename="Black" filename="Source Serif 4-Black.ttf" postscriptfontname="SourceSerif4Roman-Black" stylemapfamilyname="Source Serif 4 Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead ExtraLight" familyname="Source Serif 4" stylename="Subhead ExtraLight" filename="Source Serif 4-Subhead ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-SubheadExtraLight" stylemapfamilyname="Source Serif 4 Subhead ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Light" familyname="Source Serif 4" stylename="Subhead Light" filename="Source Serif 4-Subhead Light.ttf" postscriptfontname="SourceSerif4Roman-SubheadLight" stylemapfamilyname="Source Serif 4 Subhead Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead" familyname="Source Serif 4" stylename="Subhead" filename="Source Serif 4-Subhead.ttf" postscriptfontname="SourceSerif4Roman-SubheadRegular" stylemapfamilyname="Source Serif 4 Subhead" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Semibold" familyname="Source Serif 4" stylename="Subhead Semibold" filename="Source Serif 4-Subhead Semibold.ttf" postscriptfontname="SourceSerif4Roman-SubheadSemibold" stylemapfamilyname="Source Serif 4 Subhead Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Bold" familyname="Source Serif 4" stylename="Subhead Bold" filename="Source Serif 4-Subhead Bold.ttf" postscriptfontname="SourceSerif4Roman-SubheadBold" stylemapfamilyname="Source Serif 4 Subhead Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Black" familyname="Source Serif 4" stylename="Subhead Black" filename="Source Serif 4-Subhead Black.ttf" postscriptfontname="SourceSerif4Roman-SubheadBlack" stylemapfamilyname="Source Serif 4 Subhead Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display ExtraLight" familyname="Source Serif 4" stylename="Display ExtraLight" filename="Source Serif 4-Display ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-DisplayExtraLight" stylemapfamilyname="Source Serif 4 Display ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Light" familyname="Source Serif 4" stylename="Display Light" filename="Source Serif 4-Display Light.ttf" postscriptfontname="SourceSerif4Roman-DisplayLight" stylemapfamilyname="Source Serif 4 Display Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display" familyname="Source Serif 4" stylename="Display" filename="Source Serif 4-Display.ttf" postscriptfontname="SourceSerif4Roman-DisplayRegular" stylemapfamilyname="Source Serif 4 Display" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Semibold" familyname="Source Serif 4" stylename="Display Semibold" filename="Source Serif 4-Display Semibold.ttf" postscriptfontname="SourceSerif4Roman-DisplaySemibold" stylemapfamilyname="Source Serif 4 Display Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Bold" familyname="Source Serif 4" stylename="Display Bold" filename="Source Serif 4-Display Bold.ttf" postscriptfontname="SourceSerif4Roman-DisplayBold" stylemapfamilyname="Source Serif 4 Display Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Black" familyname="Source Serif 4" stylename="Display Black" filename="Source Serif 4-Display Black.ttf" postscriptfontname="SourceSerif4Roman-DisplayBlack" stylemapfamilyname="Source Serif 4 Display Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ </instances>
+ <lib>
+ <dict>
+ <key>public.skipExportGlyphs</key>
+ <array>
+ <string>caron.alt</string>
+ <string>commabelowcmb.alt</string>
+ <string>tonos.cap</string>
+ <string>f.ligalong</string>
+ <string>dieresiscmb.tight</string>
+ <string>IJ</string>
+ <string>Tbar</string>
+ <string>colontriangularmod</string>
+ <string>crossmark</string>
+ <string>ij</string>
+ <string>overline</string>
+ <string>similar</string>
+ <string>tbar</string>
+ <string>triangularbullet</string>
+ <string>turkicdsccmb</string>
+ </array>
+ </dict>
+ </lib>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/test_v5_MutatorSans_and_Serif_serif_0.0.designspace b/Tests/designspaceLib/data/split_output/test_v5_MutatorSans_and_Serif_serif_0.0.designspace
new file mode 100644
index 00000000..d811ffa0
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/test_v5_MutatorSans_and_Serif_serif_0.0.designspace
@@ -0,0 +1,147 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="weight" minimum="300" maximum="700" default="300">
+ <map input="300" output="0"/>
+ <map input="500" output="500"/>
+ <map input="700" output="1000"/>
+ </axis>
+ <axis tag="wdth" name="width" minimum="50" maximum="200" default="50">
+ <map input="50" output="0"/>
+ <map input="100" output="500"/>
+ <map input="200" output="1000"/>
+ </axis>
+ </axes>
+ <rules>
+ <rule name="fold_I_serifs">
+ <conditionset>
+ <condition name="width" minimum="0" maximum="328"/>
+ </conditionset>
+ <sub name="I" with="I.narrow"/>
+ </rule>
+ <rule name="fold_S_terminals">
+ <conditionset>
+ <condition name="weight" minimum="0" maximum="500"/>
+ </conditionset>
+ <sub name="S" with="S.closed"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../MutatorSansLightCondensed.ufo" name="master.MutatorMathTest.LightCondensed.0" familyname="MutatorMathTest" stylename="LightCondensed">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansBoldCondensed.ufo" name="master.MutatorMathTest.BoldCondensed.1" familyname="MutatorMathTest" stylename="BoldCondensed">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightWide.ufo" name="master.MutatorMathTest.LightWide.2" familyname="MutatorMathTest" stylename="LightWide">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansBoldWide.ufo" name="master.MutatorMathTest.BoldWide.3" familyname="MutatorMathTest" stylename="BoldWide">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightCondensed.ufo" name="support.crossbar" layer="support.crossbar">
+ <location>
+ <dimension name="weight" xvalue="700"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightCondensed.ufo" name="support.S.wide" layer="support.S.wide">
+ <location>
+ <dimension name="weight" xvalue="700"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="../MutatorSansLightCondensed.ufo" name="support.S.middle" layer="support.S.middle">
+ <location>
+ <dimension name="weight" xvalue="700"/>
+ <dimension name="width" xvalue="569.078"/>
+ </location>
+ </source>
+ </sources>
+ <variable-fonts>
+ <variable-font name="MutatorSansVariable_Weight_Width">
+ <axis-subsets>
+ <axis-subset name="weight"/>
+ <axis-subset name="width"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="MutatorSansVariable_Weight">
+ <axis-subsets>
+ <axis-subset name="weight"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="MutatorSansVariable_Width">
+ <axis-subsets>
+ <axis-subset name="width"/>
+ </axis-subsets>
+ </variable-font>
+ </variable-fonts>
+ <instances>
+ <instance name="MutatorMathTest Sans Light Condensed" familyname="MutatorMathTest" stylename="Sans Light Condensed" filename="MutatorMathTest-Sans Light Condensed.ttf" postscriptfontname="MutatorMathTest-SansLightCondensed" stylemapfamilyname="MutatorMathTest Sans Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Bold Condensed" familyname="MutatorMathTest" stylename="Sans Bold Condensed" filename="MutatorMathTest-Sans Bold Condensed.ttf" postscriptfontname="MutatorMathTest-SansBoldCondensed" stylemapfamilyname="MutatorMathTest Sans Bold Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Light Extended" familyname="MutatorMathTest" stylename="Sans Light Extended" filename="MutatorMathTest-Sans Light Extended.ttf" postscriptfontname="MutatorMathTest-SansLightExtended" stylemapfamilyname="MutatorMathTest Sans Light Extended" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Bold Extended" familyname="MutatorMathTest" stylename="Sans Bold Extended" filename="MutatorMathTest-Sans Bold Extended.ttf" postscriptfontname="MutatorMathTest-SansBoldExtended" stylemapfamilyname="MutatorMathTest Sans Bold Extended" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Medium" familyname="MutatorMathTest" stylename="Sans Medium" filename="MutatorMathTest-Sans Medium.ttf" postscriptfontname="MutatorMathTest-SansMedium" stylemapfamilyname="MutatorMathTest Sans Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ <dimension name="width" xvalue="327"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Medium" familyname="MutatorMathTest" stylename="Sans Medium" filename="MutatorMathTest-Sans Medium.ttf" postscriptfontname="MutatorMathTest-SansMedium" stylemapfamilyname="MutatorMathTest Sans Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ <dimension name="width" xvalue="327"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Bold" familyname="MutatorMathTest" stylename="Sans Bold" filename="MutatorMathTest-Sans Bold.ttf" postscriptfontname="MutatorMathTest-SansBold" stylemapfamilyname="MutatorMathTest Sans Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="569.078"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Medium Extended" familyname="MutatorMathTest" stylename="Sans Medium Extended" filename="MutatorMathTest-Sans Medium Extended.ttf" postscriptfontname="MutatorMathTest-SansMediumExtended" stylemapfamilyname="MutatorMathTest Sans Medium Extended" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance name="MutatorMathTest Sans Light Condensed" familyname="MutatorMathTest" stylename="Sans Light Condensed" filename="MutatorMathTest-Sans Light Condensed.ttf" postscriptfontname="MutatorMathTest-SansLightCondensed" stylemapfamilyname="MutatorMathTest Sans Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/test_v5_MutatorSans_and_Serif_serif_1.0.designspace b/Tests/designspaceLib/data/split_output/test_v5_MutatorSans_and_Serif_serif_1.0.designspace
new file mode 100644
index 00000000..5e3a6f52
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/test_v5_MutatorSans_and_Serif_serif_1.0.designspace
@@ -0,0 +1,44 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="weight" minimum="300" maximum="700" default="300">
+ <map input="300" output="0"/>
+ <map input="500" output="500"/>
+ <map input="700" output="1000"/>
+ </axis>
+ <axis tag="wdth" name="width" minimum="50" maximum="200" default="50">
+ <map input="50" output="0"/>
+ <map input="100" output="500"/>
+ <map input="200" output="1000"/>
+ </axis>
+ </axes>
+ <sources>
+ <source filename="../MutatorSerifLightCondensed.ufo" familyname="MutatorMathTest" stylename="SerifLightCondensed">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../MutatorSerifLightWide.ufo" familyname="MutatorMathTest" stylename="SerifLightWide">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="1000"/>
+ </location>
+ </source>
+ </sources>
+ <variable-fonts>
+ <variable-font name="MutatorSerifVariable_Width">
+ <axis-subsets>
+ <axis-subset name="width"/>
+ </axis-subsets>
+ </variable-font>
+ </variable-fonts>
+ <instances>
+ <instance name="MutatorMathTest Serif Light Condensed" familyname="MutatorMathTest" stylename="Serif Light Condensed" filename="MutatorMathTest-Serif Light Condensed.ttf" postscriptfontname="MutatorMathTest-SerifLightCondensed" stylemapfamilyname="MutatorMathTest Serif Light Condensed" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="0"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/test_v5_aktiv_.designspace b/Tests/designspaceLib/data/split_output/test_v5_aktiv_.designspace
new file mode 100644
index 00000000..4451e6e6
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/test_v5_aktiv_.designspace
@@ -0,0 +1,595 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ </axis>
+ <axis tag="wdth" name="Width" minimum="75" maximum="125" default="100"/>
+ <axis tag="ital" name="Italic" minimum="0" maximum="1" default="0"/>
+ </axes>
+ <rules processing="last">
+ <rule name="BRACKET.CYR">
+ <conditionset>
+ <condition name="Italic" minimum="0.1" maximum="1"/>
+ </conditionset>
+ <sub name="ghe.loclSRB" with="ghe.ital.loclSRB"/>
+ <sub name="ghe.loclMKD" with="ghe.ital.loclMKD"/>
+ <sub name="de.loclMKDSRB" with="de.ital.loclMKDSRB"/>
+ <sub name="pe.loclMKDSRB" with="pe.ital.loclMKDSRB"/>
+ <sub name="te.loclMKDSRB" with="te.ital.loclMKDSRB"/>
+ <sub name="gje.loclMKD" with="gje.ital.loclMKD"/>
+ <sub name="sha.loclMKDSRB" with="sha.ital.loclMKDSRB"/>
+ </rule>
+ <rule name="BRACKET.116.185">
+ <conditionset>
+ <condition name="Weight" minimum="116" maximum="185"/>
+ <condition name="Width" minimum="75" maximum="97.5"/>
+ </conditionset>
+ <sub name="cent" with="cent.BRACKET.130"/>
+ <sub name="dollar" with="dollar.BRACKET.130"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="../AktivGroteskCd_Hair.ufo" name="Aktiv Grotesk Cd Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_HairIt.ufo" name="Aktiv Grotesk Cd Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Hair.ufo" name="Aktiv Grotesk Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_HairIt.ufo" name="Aktiv Grotesk Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Hair.ufo" name="Aktiv Grotesk Ex Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_HairIt.ufo" name="Aktiv Grotesk Ex Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Rg.ufo" name="Aktiv Grotesk Cd">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_It.ufo" name="Aktiv Grotesk Cd Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" layer="{126,100,0}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic {126,100,1}" layer="{126,100,1}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Rg.ufo" name="Aktiv Grotesk Ex">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_It.ufo" name="Aktiv Grotesk Ex Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_Blk.ufo" name="Aktiv Grotesk Cd Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskCd_BlkIt.ufo" name="Aktiv Grotesk Cd Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_Blk.ufo" name="Aktiv Grotesk Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGrotesk_BlkIt.ufo" name="Aktiv Grotesk Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_Blk.ufo" name="Aktiv Grotesk Ex Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="../AktivGroteskEx_BlkIt.ufo" name="Aktiv Grotesk Ex Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ </sources>
+ <variable-fonts>
+ <variable-font name="AktivGroteskVF_WghtWdthItal">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Width"/>
+ <axis-subset name="Italic"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="AktivGroteskVF_WghtWdth">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Width"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="AktivGroteskVF_Wght">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="AktivGroteskVF_Italics_WghtWdth">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Width"/>
+ <axis-subset name="Italic" uservalue="1"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="AktivGroteskVF_Italics_Wght">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Italic" uservalue="1"/>
+ </axis-subsets>
+ </variable-font>
+ </variable-fonts>
+ <instances>
+ <instance name="Aktiv Grotesk Cd Hair" familyname="Aktiv Grotesk" stylename="Cd Hair" filename="../instances/AktivGroteskCd_Hair.ufo" postscriptfontname="AktivGrotesk-CdHair" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Hair Italic" familyname="Aktiv Grotesk" stylename="Cd Hair Italic" filename="../instances/AktivGroteskCd_HairIt.ufo" postscriptfontname="AktivGrotesk-CdHairItalic" stylemapfamilyname="Aktiv Grotesk Cd Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Hair" familyname="Aktiv Grotesk" stylename="Hair" filename="../instances/AktivGrotesk_Hair.ufo" postscriptfontname="AktivGrotesk-Hair" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Hair Italic" familyname="Aktiv Grotesk" stylename="Hair Italic" filename="../instances/AktivGrotesk_HairIt.ufo" postscriptfontname="AktivGrotesk-HairItalic" stylemapfamilyname="Aktiv Grotesk Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair" familyname="Aktiv Grotesk" stylename="Ex Hair" filename="../instances/AktivGroteskEx_Hair.ufo" postscriptfontname="AktivGrotesk-ExHair" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Hair Italic" familyname="Aktiv Grotesk" stylename="Ex Hair Italic" filename="../instances/AktivGroteskEx_HairIt.ufo" postscriptfontname="AktivGrotesk-ExHairItalic" stylemapfamilyname="Aktiv Grotesk Ex Hair" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin" familyname="Aktiv Grotesk" stylename="Cd Thin" filename="../instances/AktivGroteskCd_Th.ufo" postscriptfontname="AktivGrotesk-CdThin" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Thin Italic" familyname="Aktiv Grotesk" stylename="Cd Thin Italic" filename="../instances/AktivGroteskCd_ThIt.ufo" postscriptfontname="AktivGrotesk-CdThinItalic" stylemapfamilyname="Aktiv Grotesk Cd Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Thin" familyname="Aktiv Grotesk" stylename="Thin" filename="../instances/AktivGrotesk_Th.ufo" postscriptfontname="AktivGrotesk-Thin" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Thin Italic" familyname="Aktiv Grotesk" stylename="Thin Italic" filename="../instances/AktivGrotesk_ThIt.ufo" postscriptfontname="AktivGrotesk-ThinItalic" stylemapfamilyname="Aktiv Grotesk Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin" familyname="Aktiv Grotesk" stylename="Ex Thin" filename="../instances/AktivGroteskEx_Th.ufo" postscriptfontname="AktivGrotesk-ExThin" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Thin Italic" familyname="Aktiv Grotesk" stylename="Ex Thin Italic" filename="../instances/AktivGroteskEx_ThIt.ufo" postscriptfontname="AktivGrotesk-ExThinItalic" stylemapfamilyname="Aktiv Grotesk Ex Thin" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light" familyname="Aktiv Grotesk" stylename="Cd Light" filename="../instances/AktivGroteskCd_Lt.ufo" postscriptfontname="AktivGrotesk-CdLight" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Light Italic" familyname="Aktiv Grotesk" stylename="Cd Light Italic" filename="../instances/AktivGroteskCd_LtIt.ufo" postscriptfontname="AktivGrotesk-CdLightItalic" stylemapfamilyname="Aktiv Grotesk Cd Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Light" familyname="Aktiv Grotesk" stylename="Light" filename="../instances/AktivGrotesk_Lt.ufo" postscriptfontname="AktivGrotesk-Light" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Light Italic" familyname="Aktiv Grotesk" stylename="Light Italic" filename="../instances/AktivGrotesk_LtIt.ufo" postscriptfontname="AktivGrotesk-LightItalic" stylemapfamilyname="Aktiv Grotesk Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light" familyname="Aktiv Grotesk" stylename="Ex Light" filename="../instances/AktivGroteskEx_Lt.ufo" postscriptfontname="AktivGrotesk-ExLight" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Light Italic" familyname="Aktiv Grotesk" stylename="Ex Light Italic" filename="../instances/AktivGroteskEx_LtIt.ufo" postscriptfontname="AktivGrotesk-ExLightItalic" stylemapfamilyname="Aktiv Grotesk Ex Light" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd" familyname="Aktiv Grotesk" stylename="Cd" filename="../instances/AktivGroteskCd_Rg.ufo" postscriptfontname="AktivGrotesk-Cd" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Italic" familyname="Aktiv Grotesk" stylename="Cd Italic" filename="../instances/AktivGroteskCd_It.ufo" postscriptfontname="AktivGrotesk-CdItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk " familyname="Aktiv Grotesk" stylename="" filename="../instances/AktivGrotesk_Rg.ufo" postscriptfontname="AktivGrotesk-" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Italic" familyname="Aktiv Grotesk" stylename="Italic" filename="../instances/AktivGrotesk_It.ufo" postscriptfontname="AktivGrotesk-Italic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex" familyname="Aktiv Grotesk" stylename="Ex" filename="../instances/AktivGroteskEx_Rg.ufo" postscriptfontname="AktivGrotesk-Ex" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Italic" familyname="Aktiv Grotesk" stylename="Ex Italic" filename="../instances/AktivGroteskEx_It.ufo" postscriptfontname="AktivGrotesk-ExItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium" familyname="Aktiv Grotesk" stylename="Cd Medium" filename="../instances/AktivGroteskCd_Md.ufo" postscriptfontname="AktivGrotesk-CdMedium" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Medium Italic" familyname="Aktiv Grotesk" stylename="Cd Medium Italic" filename="../instances/AktivGroteskCd_MdIt.ufo" postscriptfontname="AktivGrotesk-CdMediumItalic" stylemapfamilyname="Aktiv Grotesk Cd Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Medium" familyname="Aktiv Grotesk" stylename="Medium" filename="../instances/AktivGrotesk_Md.ufo" postscriptfontname="AktivGrotesk-Medium" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Medium Italic" familyname="Aktiv Grotesk" stylename="Medium Italic" filename="../instances/AktivGrotesk_MdIt.ufo" postscriptfontname="AktivGrotesk-MediumItalic" stylemapfamilyname="Aktiv Grotesk Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium" familyname="Aktiv Grotesk" stylename="Ex Medium" filename="../instances/AktivGroteskEx_Md.ufo" postscriptfontname="AktivGrotesk-ExMedium" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Medium Italic" familyname="Aktiv Grotesk" stylename="Ex Medium Italic" filename="../instances/AktivGroteskEx_MdIt.ufo" postscriptfontname="AktivGrotesk-ExMediumItalic" stylemapfamilyname="Aktiv Grotesk Ex Medium" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold" familyname="Aktiv Grotesk" stylename="Cd SemiBold" filename="../../build/instances/AktivGroteskCd_SBd.ufo" postscriptfontname="AktivGrotesk-CdSemiBold" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd SemiBold Italic" familyname="Aktiv Grotesk" stylename="Cd SemiBold Italic" filename="../../build/instances/AktivGroteskCd_SBdIt.ufo" postscriptfontname="AktivGrotesk-CdSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold" familyname="Aktiv Grotesk" stylename="SemiBold" filename="../../build/instances/AktivGrotesk_SBd.ufo" postscriptfontname="AktivGrotesk-SemiBold" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk SemiBold Italic" familyname="Aktiv Grotesk" stylename="SemiBold Italic" filename="../../build/instances/AktivGrotesk_SBdIt.ufo" postscriptfontname="AktivGrotesk-SemiBoldItalic" stylemapfamilyname="Aktiv Grotesk SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold" familyname="Aktiv Grotesk" stylename="Ex SemiBold" filename="../../build/instances/AktivGroteskEx_SBd.ufo" postscriptfontname="AktivGrotesk-ExSemiBold" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex SemiBold Italic" familyname="Aktiv Grotesk" stylename="Ex SemiBold Italic" filename="../../build/instances/AktivGroteskEx_SBdIt.ufo" postscriptfontname="AktivGrotesk-ExSemiBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex SemiBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold" familyname="Aktiv Grotesk" stylename="Cd Bold" filename="../instances/AktivGroteskCd_Bd.ufo" postscriptfontname="AktivGrotesk-CdBold" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Bold Italic" familyname="Aktiv Grotesk" stylename="Cd Bold Italic" filename="../instances/AktivGroteskCd_BdIt.ufo" postscriptfontname="AktivGrotesk-CdBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Bold" familyname="Aktiv Grotesk" stylename="Bold" filename="../instances/AktivGrotesk_Bd.ufo" postscriptfontname="AktivGrotesk-Bold" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Bold Italic" familyname="Aktiv Grotesk" stylename="Bold Italic" filename="../instances/AktivGrotesk_BdIt.ufo" postscriptfontname="AktivGrotesk-BoldItalic" stylemapfamilyname="Aktiv Grotesk" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold" familyname="Aktiv Grotesk" stylename="Ex Bold" filename="../instances/AktivGroteskEx_Bd.ufo" postscriptfontname="AktivGrotesk-ExBold" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Bold Italic" familyname="Aktiv Grotesk" stylename="Ex Bold Italic" filename="../instances/AktivGroteskEx_BdIt.ufo" postscriptfontname="AktivGrotesk-ExBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex" stylemapstylename="bold italic">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold" familyname="Aktiv Grotesk" stylename="Cd XBold" filename="../instances/AktivGroteskCd_XBd.ufo" postscriptfontname="AktivGrotesk-CdXBold" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd XBold Italic" familyname="Aktiv Grotesk" stylename="Cd XBold Italic" filename="../instances/AktivGroteskCd_XBdIt.ufo" postscriptfontname="AktivGrotesk-CdXBoldItalic" stylemapfamilyname="Aktiv Grotesk Cd XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk XBold" familyname="Aktiv Grotesk" stylename="XBold" filename="../instances/AktivGrotesk_XBd.ufo" postscriptfontname="AktivGrotesk-XBold" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk XBold Italic" familyname="Aktiv Grotesk" stylename="XBold Italic" filename="../instances/AktivGrotesk_XBdIt.ufo" postscriptfontname="AktivGrotesk-XBoldItalic" stylemapfamilyname="Aktiv Grotesk XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold" familyname="Aktiv Grotesk" stylename="Ex XBold" filename="../instances/AktivGroteskEx_XBd.ufo" postscriptfontname="AktivGrotesk-ExXBold" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex XBold Italic" familyname="Aktiv Grotesk" stylename="Ex XBold Italic" filename="../instances/AktivGroteskEx_XBdIt.ufo" postscriptfontname="AktivGrotesk-ExXBoldItalic" stylemapfamilyname="Aktiv Grotesk Ex XBold" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black" familyname="Aktiv Grotesk" stylename="Cd Black" filename="../instances/AktivGroteskCd_Blk.ufo" postscriptfontname="AktivGrotesk-CdBlack" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Cd Black Italic" familyname="Aktiv Grotesk" stylename="Cd Black Italic" filename="../instances/AktivGroteskCd_BlkIt.ufo" postscriptfontname="AktivGrotesk-CdBlackItalic" stylemapfamilyname="Aktiv Grotesk Cd Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Black" familyname="Aktiv Grotesk" stylename="Black" filename="../instances/AktivGrotesk_Blk.ufo" postscriptfontname="AktivGrotesk-Black" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Black Italic" familyname="Aktiv Grotesk" stylename="Black Italic" filename="../instances/AktivGrotesk_BlkIt.ufo" postscriptfontname="AktivGrotesk-BlackItalic" stylemapfamilyname="Aktiv Grotesk Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black" familyname="Aktiv Grotesk" stylename="Ex Black" filename="../instances/AktivGroteskEx_Blk.ufo" postscriptfontname="AktivGrotesk-ExBlack" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="regular">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance name="Aktiv Grotesk Ex Black Italic" familyname="Aktiv Grotesk" stylename="Ex Black Italic" filename="../instances/AktivGroteskEx_BlkIt.ufo" postscriptfontname="AktivGrotesk-ExBlackItalic" stylemapfamilyname="Aktiv Grotesk Ex Black" stylemapstylename="italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_0.0.designspace b/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_0.0.designspace
new file mode 100644
index 00000000..447461fb
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_0.0.designspace
@@ -0,0 +1,282 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="weight" minimum="200" maximum="900" default="400">
+ <map input="200" output="0"/>
+ <map input="300" output="145"/>
+ <map input="400" output="394"/>
+ <map input="600" output="594"/>
+ <map input="700" output="823"/>
+ <map input="900" output="1000"/>
+ </axis>
+ <axis tag="opsz" name="optical" minimum="8" maximum="60" default="20"/>
+ </axes>
+ <sources>
+ <source filename="../caption/master_0/SourceSerif_c0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_1/SourceSerif_c1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_2/SourceSerif_c2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../text/master_0/SourceSerif_0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_1/SourceSerif_1.ufo" familyname="Source Serif 4">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_2/SourceSerif_2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../display/master_0/SourceSerif_d0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_1/SourceSerif_d1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_2/SourceSerif_d2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ </sources>
+ <variable-fonts>
+ <variable-font name="SourceSerif4Variable-Roman">
+ <axis-subsets>
+ <axis-subset name="weight"/>
+ <axis-subset name="optical"/>
+ </axis-subsets>
+ <lib>
+ <dict>
+ <key>public.skipExportGlyphs</key>
+ <array>
+ <string>caron.alt</string>
+ <string>commabelowcmb.alt</string>
+ <string>tonos.cap</string>
+ <string>f.ligalong</string>
+ <string>dieresiscmb.tight</string>
+ <string>IJ</string>
+ <string>Tbar</string>
+ <string>colontriangularmod</string>
+ <string>crossmark</string>
+ <string>ij</string>
+ <string>overline</string>
+ <string>similar</string>
+ <string>tbar</string>
+ <string>triangularbullet</string>
+ <string>turkicdsccmb</string>
+ </array>
+ </dict>
+ </lib>
+ </variable-font>
+ </variable-fonts>
+ <instances>
+ <instance name="Source Serif 4 Caption ExtraLight" familyname="Source Serif 4" stylename="Caption ExtraLight" filename="Source Serif 4-Caption ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-CaptionExtraLight" stylemapfamilyname="Source Serif 4 Caption ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Light" familyname="Source Serif 4" stylename="Caption Light" filename="Source Serif 4-Caption Light.ttf" postscriptfontname="SourceSerif4Roman-CaptionLight" stylemapfamilyname="Source Serif 4 Caption Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption" familyname="Source Serif 4" stylename="Caption" filename="Source Serif 4-Caption.ttf" postscriptfontname="SourceSerif4Roman-CaptionRegular" stylemapfamilyname="Source Serif 4 Caption" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Semibold" familyname="Source Serif 4" stylename="Caption Semibold" filename="Source Serif 4-Caption Semibold.ttf" postscriptfontname="SourceSerif4Roman-CaptionSemibold" stylemapfamilyname="Source Serif 4 Caption Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Bold" familyname="Source Serif 4" stylename="Caption Bold" filename="Source Serif 4-Caption Bold.ttf" postscriptfontname="SourceSerif4Roman-CaptionBold" stylemapfamilyname="Source Serif 4 Caption Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Black" familyname="Source Serif 4" stylename="Caption Black" filename="Source Serif 4-Caption Black.ttf" postscriptfontname="SourceSerif4Roman-CaptionBlack" stylemapfamilyname="Source Serif 4 Caption Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText ExtraLight" familyname="Source Serif 4" stylename="SmText ExtraLight" filename="Source Serif 4-SmText ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-SmTextExtraLight" stylemapfamilyname="Source Serif 4 SmallText ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Light" familyname="Source Serif 4" stylename="SmText Light" filename="Source Serif 4-SmText Light.ttf" postscriptfontname="SourceSerif4Roman-SmTextLight" stylemapfamilyname="Source Serif 4 SmallText Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText" familyname="Source Serif 4" stylename="SmText" filename="Source Serif 4-SmText.ttf" postscriptfontname="SourceSerif4Roman-SmTextRegular" stylemapfamilyname="Source Serif 4 SmallText" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Semibold" familyname="Source Serif 4" stylename="SmText Semibold" filename="Source Serif 4-SmText Semibold.ttf" postscriptfontname="SourceSerif4Roman-SmTextSemibold" stylemapfamilyname="Source Serif 4 SmallText Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Bold" familyname="Source Serif 4" stylename="SmText Bold" filename="Source Serif 4-SmText Bold.ttf" postscriptfontname="SourceSerif4Roman-SmTextBold" stylemapfamilyname="Source Serif 4 SmallText Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Black" familyname="Source Serif 4" stylename="SmText Black" filename="Source Serif 4-SmText Black.ttf" postscriptfontname="SourceSerif4Roman-SmTextBlack" stylemapfamilyname="Source Serif 4 SmallText Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 ExtraLight" familyname="Source Serif 4" stylename="ExtraLight" filename="Source Serif 4-ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-ExtraLight" stylemapfamilyname="Source Serif 4 ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Light" familyname="Source Serif 4" stylename="Light" filename="Source Serif 4-Light.ttf" postscriptfontname="SourceSerif4Roman-Light" stylemapfamilyname="Source Serif 4 Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Regular" familyname="Source Serif 4" stylename="Regular" filename="Source Serif 4-Regular.ttf" postscriptfontname="SourceSerif4Roman-Regular" stylemapfamilyname="Source Serif 4" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Semibold" familyname="Source Serif 4" stylename="Semibold" filename="Source Serif 4-Semibold.ttf" postscriptfontname="SourceSerif4Roman-Semibold" stylemapfamilyname="Source Serif 4 Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Bold" familyname="Source Serif 4" stylename="Bold" filename="Source Serif 4-Bold.ttf" postscriptfontname="SourceSerif4Roman-Bold" stylemapfamilyname="Source Serif 4 Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Black" familyname="Source Serif 4" stylename="Black" filename="Source Serif 4-Black.ttf" postscriptfontname="SourceSerif4Roman-Black" stylemapfamilyname="Source Serif 4 Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead ExtraLight" familyname="Source Serif 4" stylename="Subhead ExtraLight" filename="Source Serif 4-Subhead ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-SubheadExtraLight" stylemapfamilyname="Source Serif 4 Subhead ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Light" familyname="Source Serif 4" stylename="Subhead Light" filename="Source Serif 4-Subhead Light.ttf" postscriptfontname="SourceSerif4Roman-SubheadLight" stylemapfamilyname="Source Serif 4 Subhead Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead" familyname="Source Serif 4" stylename="Subhead" filename="Source Serif 4-Subhead.ttf" postscriptfontname="SourceSerif4Roman-SubheadRegular" stylemapfamilyname="Source Serif 4 Subhead" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Semibold" familyname="Source Serif 4" stylename="Subhead Semibold" filename="Source Serif 4-Subhead Semibold.ttf" postscriptfontname="SourceSerif4Roman-SubheadSemibold" stylemapfamilyname="Source Serif 4 Subhead Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Bold" familyname="Source Serif 4" stylename="Subhead Bold" filename="Source Serif 4-Subhead Bold.ttf" postscriptfontname="SourceSerif4Roman-SubheadBold" stylemapfamilyname="Source Serif 4 Subhead Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Black" familyname="Source Serif 4" stylename="Subhead Black" filename="Source Serif 4-Subhead Black.ttf" postscriptfontname="SourceSerif4Roman-SubheadBlack" stylemapfamilyname="Source Serif 4 Subhead Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display ExtraLight" familyname="Source Serif 4" stylename="Display ExtraLight" filename="Source Serif 4-Display ExtraLight.ttf" postscriptfontname="SourceSerif4Roman-DisplayExtraLight" stylemapfamilyname="Source Serif 4 Display ExtraLight" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Light" familyname="Source Serif 4" stylename="Display Light" filename="Source Serif 4-Display Light.ttf" postscriptfontname="SourceSerif4Roman-DisplayLight" stylemapfamilyname="Source Serif 4 Display Light" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display" familyname="Source Serif 4" stylename="Display" filename="Source Serif 4-Display.ttf" postscriptfontname="SourceSerif4Roman-DisplayRegular" stylemapfamilyname="Source Serif 4 Display" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Semibold" familyname="Source Serif 4" stylename="Display Semibold" filename="Source Serif 4-Display Semibold.ttf" postscriptfontname="SourceSerif4Roman-DisplaySemibold" stylemapfamilyname="Source Serif 4 Display Semibold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Bold" familyname="Source Serif 4" stylename="Display Bold" filename="Source Serif 4-Display Bold.ttf" postscriptfontname="SourceSerif4Roman-DisplayBold" stylemapfamilyname="Source Serif 4 Display Bold" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Black" familyname="Source Serif 4" stylename="Display Black" filename="Source Serif 4-Display Black.ttf" postscriptfontname="SourceSerif4Roman-DisplayBlack" stylemapfamilyname="Source Serif 4 Display Black" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_1.0.designspace b/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_1.0.designspace
new file mode 100644
index 00000000..e1ef12f6
--- /dev/null
+++ b/Tests/designspaceLib/data/split_output/test_v5_sourceserif_italic_1.0.designspace
@@ -0,0 +1,274 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="weight" minimum="200" maximum="900" default="400">
+ <map input="200" output="0"/>
+ <map input="300" output="145"/>
+ <map input="400" output="394"/>
+ <map input="600" output="594"/>
+ <map input="700" output="823"/>
+ <map input="900" output="1000"/>
+ </axis>
+ <axis tag="opsz" name="optical" minimum="8" maximum="60" default="20"/>
+ </axes>
+ <sources>
+ <source filename="../caption/master_0/SourceSerif-Italic_c0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_1/SourceSerif-Italic_c1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../caption/master_2/SourceSerif-Italic_c2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </source>
+ <source filename="../text/master_0/SourceSerif-Italic_0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_1/SourceSerif-Italic_1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../text/master_2/SourceSerif-Italic_2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="../display/master_0/SourceSerif-Italic_d0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_1/SourceSerif-Italic_d1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ <source filename="../display/master_2/SourceSerif-Italic_d2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </source>
+ </sources>
+ <variable-fonts>
+ <variable-font name="SourceSerif4Variable-Italic">
+ <axis-subsets>
+ <axis-subset name="weight"/>
+ <axis-subset name="optical"/>
+ </axis-subsets>
+ <lib>
+ <dict>
+ <key>public.skipExportGlyphs</key>
+ <array>
+ <string>caron.alt</string>
+ <string>commabelowcmb.alt</string>
+ <string>f.liga</string>
+ <string>f.ligalong</string>
+ <string>tonos.cap</string>
+ <string>dieresiscmb.tight</string>
+ <string>turkicdsccmb</string>
+ </array>
+ </dict>
+ </lib>
+ </variable-font>
+ </variable-fonts>
+ <instances>
+ <instance name="Source Serif 4 Caption ExtraLight Italic" familyname="Source Serif 4" stylename="Caption ExtraLight Italic" filename="Source Serif 4-Caption ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionExtraLight" stylemapfamilyname="Source Serif 4 Caption ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Light Italic" familyname="Source Serif 4" stylename="Caption Light Italic" filename="Source Serif 4-Caption Light Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionLight" stylemapfamilyname="Source Serif 4 Caption Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Italic" familyname="Source Serif 4" stylename="Caption Italic" filename="Source Serif 4-Caption Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionRegular" stylemapfamilyname="Source Serif 4 Caption Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Semibold Italic" familyname="Source Serif 4" stylename="Caption Semibold Italic" filename="Source Serif 4-Caption Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionSemibold" stylemapfamilyname="Source Serif 4 Caption Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Bold Italic" familyname="Source Serif 4" stylename="Caption Bold Italic" filename="Source Serif 4-Caption Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionBold" stylemapfamilyname="Source Serif 4 Caption Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Caption Black Italic" familyname="Source Serif 4" stylename="Caption Black Italic" filename="Source Serif 4-Caption Black Italic.ttf" postscriptfontname="SourceSerif4Italic-CaptionBlack" stylemapfamilyname="Source Serif 4 Caption Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText ExtraLight Italic" familyname="Source Serif 4" stylename="SmText ExtraLight Italic" filename="Source Serif 4-SmText ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextExtraLight" stylemapfamilyname="Source Serif 4 SmallText ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Light Italic" familyname="Source Serif 4" stylename="SmText Light Italic" filename="Source Serif 4-SmText Light Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextLight" stylemapfamilyname="Source Serif 4 SmallText Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Italic" familyname="Source Serif 4" stylename="SmText Italic" filename="Source Serif 4-SmText Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextRegular" stylemapfamilyname="Source Serif 4 SmallText Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Semibold Italic" familyname="Source Serif 4" stylename="SmText Semibold Italic" filename="Source Serif 4-SmText Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextSemibold" stylemapfamilyname="Source Serif 4 SmallText Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Bold Italic" familyname="Source Serif 4" stylename="SmText Bold Italic" filename="Source Serif 4-SmText Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextBold" stylemapfamilyname="Source Serif 4 SmallText Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 SmText Black Italic" familyname="Source Serif 4" stylename="SmText Black Italic" filename="Source Serif 4-SmText Black Italic.ttf" postscriptfontname="SourceSerif4Italic-SmTextBlack" stylemapfamilyname="Source Serif 4 SmallText Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="16"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 ExtraLight Italic" familyname="Source Serif 4" stylename="ExtraLight Italic" filename="Source Serif 4-ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-ExtraLight" stylemapfamilyname="Source Serif 4 ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Light Italic" familyname="Source Serif 4" stylename="Light Italic" filename="Source Serif 4-Light Italic.ttf" postscriptfontname="SourceSerif4Italic-Light" stylemapfamilyname="Source Serif 4 Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Italic" familyname="Source Serif 4" stylename="Italic" filename="Source Serif 4-Italic.ttf" postscriptfontname="SourceSerif4Italic-Regular" stylemapfamilyname="Source Serif 4 Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Semibold Italic" familyname="Source Serif 4" stylename="Semibold Italic" filename="Source Serif 4-Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-Semibold" stylemapfamilyname="Source Serif 4 Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Bold Italic" familyname="Source Serif 4" stylename="Bold Italic" filename="Source Serif 4-Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-Bold" stylemapfamilyname="Source Serif 4 Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Black Italic" familyname="Source Serif 4" stylename="Black Italic" filename="Source Serif 4-Black Italic.ttf" postscriptfontname="SourceSerif4Italic-Black" stylemapfamilyname="Source Serif 4 Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead ExtraLight Italic" familyname="Source Serif 4" stylename="Subhead ExtraLight Italic" filename="Source Serif 4-Subhead ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadExtraLight" stylemapfamilyname="Source Serif 4 Subhead ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Light Italic" familyname="Source Serif 4" stylename="Subhead Light Italic" filename="Source Serif 4-Subhead Light Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadLight" stylemapfamilyname="Source Serif 4 Subhead Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Italic" familyname="Source Serif 4" stylename="Subhead Italic" filename="Source Serif 4-Subhead Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadRegular" stylemapfamilyname="Source Serif 4 Subhead Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Semibold Italic" familyname="Source Serif 4" stylename="Subhead Semibold Italic" filename="Source Serif 4-Subhead Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadSemibold" stylemapfamilyname="Source Serif 4 Subhead Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Bold Italic" familyname="Source Serif 4" stylename="Subhead Bold Italic" filename="Source Serif 4-Subhead Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadBold" stylemapfamilyname="Source Serif 4 Subhead Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Subhead Black Italic" familyname="Source Serif 4" stylename="Subhead Black Italic" filename="Source Serif 4-Subhead Black Italic.ttf" postscriptfontname="SourceSerif4Italic-SubheadBlack" stylemapfamilyname="Source Serif 4 Subhead Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="32"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display ExtraLight Italic" familyname="Source Serif 4" stylename="Display ExtraLight Italic" filename="Source Serif 4-Display ExtraLight Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayExtraLight" stylemapfamilyname="Source Serif 4 Display ExtraLight Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Light Italic" familyname="Source Serif 4" stylename="Display Light Italic" filename="Source Serif 4-Display Light Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayLight" stylemapfamilyname="Source Serif 4 Display Light Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Italic" familyname="Source Serif 4" stylename="Display Italic" filename="Source Serif 4-Display Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayRegular" stylemapfamilyname="Source Serif 4 Display Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Semibold Italic" familyname="Source Serif 4" stylename="Display Semibold Italic" filename="Source Serif 4-Display Semibold Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplaySemibold" stylemapfamilyname="Source Serif 4 Display Semibold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Bold Italic" familyname="Source Serif 4" stylename="Display Bold Italic" filename="Source Serif 4-Display Bold Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayBold" stylemapfamilyname="Source Serif 4 Display Bold Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ <instance name="Source Serif 4 Display Black Italic" familyname="Source Serif 4" stylename="Display Black Italic" filename="Source Serif 4-Display Black Italic.ttf" postscriptfontname="SourceSerif4Italic-DisplayBlack" stylemapfamilyname="Source Serif 4 Display Black Italic" stylemapstylename="regular">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/test.designspace b/Tests/designspaceLib/data/test_v4_original.designspace
index e12f1568..d3b46c7f 100644
--- a/Tests/designspaceLib/data/test.designspace
+++ b/Tests/designspaceLib/data/test_v4_original.designspace
@@ -1,5 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<designspace format="4.1">
+ <!-- NOTE: this file is kept at format 4, to check that round-tripping it
+ doesn't upgrade the format. -->
<axes>
<axis tag="wght" name="weight" minimum="0" maximum="1000" default="0">
<labelname xml:lang="en">Wéíght</labelname>
@@ -50,6 +52,13 @@
</sources>
<instances>
<instance name="instance.ufo1" familyname="InstanceFamilyName" stylename="InstanceStyleName" filename="instances/instanceTest1.ufo" postscriptfontname="InstancePostscriptName" stylemapfamilyname="InstanceStyleMapFamilyName" stylemapstylename="InstanceStyleMapStyleName">
+ <stylename xml:lang="fr">Demigras</stylename>
+ <stylename xml:lang="ja">半ば</stylename>
+ <familyname xml:lang="fr">Montserrat</familyname>
+ <familyname xml:lang="ja">モンセラート</familyname>
+ <stylemapstylename xml:lang="de">Standard</stylemapstylename>
+ <stylemapfamilyname xml:lang="de">Montserrat Halbfett</stylemapfamilyname>
+ <stylemapfamilyname xml:lang="ja">モンセラート SemiBold</stylemapfamilyname>
<location>
<dimension name="weight" xvalue="500"/>
<dimension name="width" xvalue="20"/>
diff --git a/Tests/designspaceLib/data/test_v5.designspace b/Tests/designspaceLib/data/test_v5.designspace
new file mode 100644
index 00000000..2f611b49
--- /dev/null
+++ b/Tests/designspaceLib/data/test_v5.designspace
@@ -0,0 +1,294 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes elidedfallbackname="Regular">
+ <axis tag="wght" name="weight" minimum="200" maximum="1000" default="200">
+ <labelname xml:lang="en">Wéíght</labelname>
+ <labelname xml:lang="fa-IR">قطر</labelname>
+ <map input="200" output="0"/>
+ <map input="300" output="100"/>
+ <map input="400" output="368"/>
+ <map input="600" output="600"/>
+ <map input="700" output="824"/>
+ <map input="900" output="1000"/>
+ <!-- All axes provide STAT information with the "labels" element. -->
+ <labels>
+ <label uservalue="200" userminimum="200" usermaximum="250" name="Extra Light">
+ <labelname xml:lang="de">Extraleicht</labelname>
+ <labelname xml:lang="fr">Extra léger</labelname>
+ </label>
+ <label uservalue="300" userminimum="250" usermaximum="350" name="Light"/>
+ <label uservalue="400" userminimum="350" usermaximum="450" name="Regular" elidable="true"/>
+ <label uservalue="600" userminimum="450" usermaximum="650" name="Semi Bold"/>
+ <label uservalue="700" userminimum="650" usermaximum="850" name="Bold"/>
+ <label uservalue="900" userminimum="850" usermaximum="900" name="Black"/>
+ </labels>
+ </axis>
+
+ <axis tag="wdth" name="width" minimum="50" maximum="150" default="100" hidden="1">
+ <labelname xml:lang="fr">Chasse</labelname>
+ <map input="50" output="10"/>
+ <map input="100" output="20"/>
+ <map input="125" output="66"/>
+ <map input="150" output="990"/>
+ <labels ordering="1">
+ <label uservalue="50" name="Condensed"/>
+ <label uservalue="100" name="Normal" elidable="true" oldersibling="true"/>
+ <label uservalue="125" name="Wide"/>
+ <!-- Allow specifying only one end of the range, the other is assumed to
+ be infinity as does otlLib buildStatTable -->
+ <label uservalue="150" userminimum="150" name="Extra Wide"/>
+ </labels>
+ </axis>
+
+ <!--
+ Discrete axes provide a list of discrete values.
+ No interpolation is allowed between these.
+ -->
+ <axis tag="ital" name="Italic" values="0 1" default="0">
+ <labels>
+ <!-- Discrete axes also provide STAT information. -->
+ <label uservalue="0" name="Roman" elidable="true" linkeduservalue="1"/>
+ <label uservalue="1" name="Italic"/>
+ </labels>
+ </axis>
+ </axes>
+
+ <!-- Freestanding labels are analogues of STAT format 4 entries.
+ They give names to freestyle locations. -->
+ <labels>
+ <label name="Some Style">
+ <labelname xml:lang="fr">Un Style</labelname>
+ <location>
+ <dimension name="weight" uservalue="300"/>
+ <dimension name="width" uservalue="50"/>
+ <dimension name="Italic" uservalue="0"/>
+ </location>
+ </label>
+ <label name="Other">
+ <location>
+ <dimension name="weight" uservalue="700"/>
+ <dimension name="width" uservalue="100"/>
+ <dimension name="Italic" uservalue="1"/>
+ </location>
+ </label>
+ </labels>
+
+ <rules processing="last">
+ <rule name="named.rule.1">
+ <conditionset>
+ <condition name="axisName_a" minimum="0" maximum="1"/>
+ <condition name="axisName_b" minimum="2" maximum="3"/>
+ </conditionset>
+ <sub name="a" with="a.alt"/>
+ </rule>
+ </rules>
+
+ <sources>
+ <source filename="masters/masterTest1.ufo" name="master.ufo1" familyname="MasterFamilyName" stylename="MasterStyleNameOne">
+ <familyname xml:lang="fr">Montserrat</familyname>
+ <familyname xml:lang="ja">モンセラート</familyname>
+ <lib copy="1"/>
+ <features copy="1"/>
+ <info copy="1"/>
+ <glyph name="A" mute="1"/>
+ <glyph name="Z" mute="1"/>
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="width" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="masters/masterTest2.ufo" name="master.ufo2" familyname="MasterFamilyName" stylename="MasterStyleNameTwo">
+ <kerning mute="1"/>
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="20"/>
+ </location>
+ </source>
+ <source filename="masters/masterTest2.ufo" name="master.ufo2" familyname="MasterFamilyName" stylename="Supports" layer="supports">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="width" xvalue="20"/>
+ </location>
+ </source>
+ </sources>
+
+ <variable-fonts>
+ <!--
+ If this element is present, all output targets must be listed within it.
+ If it is not present, the full Designspace is the output, like in version 4.x.
+
+ Continuous axes can be included either:
+ * in full,
+ * or only on a reduced interval (different minimum-maximum),
+ * or only at 1 discrete location
+ Dicrete axes cannot be included in full, and we must specify a value
+ (or the compiler should assume the default value).
+ -->
+ <variable-font name="Test_WghtWdth" filename="Test_WghtWdth_different_from_name.ttf">
+ <!-- This one is the Roman (default location along ital),
+ with full range for the Weight axis. -->
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Width"/>
+ </axis-subsets>
+ <lib>
+ <dict>
+ <key>com.vtt.source</key>
+ <string>sources/vtt/Test_WghtWdth.vtt</string>
+ </dict>
+ </lib>
+ </variable-font>
+ <variable-font name="Test_Wght">
+ <!-- This one is the Roman (default location along ital),
+ with full range for the Weight axis. -->
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ </axis-subsets>
+ <lib>
+ <dict>
+ <key>com.vtt.source</key>
+ <string>sources/vtt/Test_Wght.vtt</string>
+ </dict>
+ </lib>
+ </variable-font>
+ <variable-font name="TestCd_Wght">
+ <!-- This one is the Roman (default location along ital),
+ with full range for the Weight axis. -->
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Width" uservalue="0"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="TestWd_Wght">
+ <!-- This one is the Roman (default location along ital),
+ with full range for the Weight axis. -->
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Width" uservalue="1000"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="TestItalic_Wght">
+ <!-- This one is the Italic, with full range for the Weight axis. -->
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Italic" uservalue="1"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="TestRB_Wght">
+ <!-- As an example, this would be the Roman with a reduced range. -->
+ <axis-subsets>
+ <axis-subset name="Weight" userminimum="400" usermaximum="700" userdefault="400"/>
+ <axis-subset name="Italic" uservalue="0"/>
+ </axis-subsets>
+ </variable-font>
+ </variable-fonts>
+
+ <instances>
+ <instance name="instance.ufo1" familyname="InstanceFamilyName" stylename="InstanceStyleName" filename="instances/instanceTest1.ufo" postscriptfontname="InstancePostscriptName" stylemapfamilyname="InstanceStyleMapFamilyName" stylemapstylename="InstanceStyleMapStyleName">
+ <stylename xml:lang="fr">Demigras</stylename>
+ <stylename xml:lang="ja">半ば</stylename>
+ <familyname xml:lang="fr">Montserrat</familyname>
+ <familyname xml:lang="ja">モンセラート</familyname>
+ <stylemapstylename xml:lang="de">Standard</stylemapstylename>
+ <stylemapfamilyname xml:lang="de">Montserrat Halbfett</stylemapfamilyname>
+ <stylemapfamilyname xml:lang="ja">モンセラート SemiBold</stylemapfamilyname>
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ <dimension name="width" xvalue="20"/>
+ </location>
+
+ <!-- The following elements are deprecated in v5.0. They can still be
+ read, but they won't be written out again (they don't roundtrip). -->
+ <!-- ROUNDTRIP_TEST_REMOVE_ME_BEGIN -->
+ <glyphs>
+ <glyph mute="1" unicode="0x123 0x124 0x125" name="arrow"/>
+ </glyphs>
+ <kerning/>
+ <info/>
+ <!-- ROUNDTRIP_TEST_REMOVE_ME_END -->
+
+ <lib>
+ <dict>
+ <key>com.coolDesignspaceApp.binaryData</key>
+ <data>
+ PGJpbmFyeSBndW5rPg==
+ </data>
+ <key>com.coolDesignspaceApp.specimenText</key>
+ <string>Hamburgerwhatever</string>
+ </dict>
+ </lib>
+ </instance>
+ <instance name="instance.ufo2" familyname="InstanceFamilyName" stylename="InstanceStyleName" filename="instances/instanceTest2.ufo" postscriptfontname="InstancePostscriptName" stylemapfamilyname="InstanceStyleMapFamilyName" stylemapstylename="InstanceStyleMapStyleName">
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ <dimension name="width" xvalue="400" yvalue="300"/>
+ </location>
+ <!-- ROUNDTRIP_TEST_REMOVE_ME_BEGIN -->
+ <glyphs>
+ <glyph unicode="0x65 0xc9 0x12d" name="arrow">
+ <location>
+ <dimension name="weight" xvalue="120"/>
+ <dimension name="width" xvalue="100"/>
+ </location>
+ <note>A note about this glyph</note>
+ <masters>
+ <master glyphname="BB" source="master.ufo1">
+ <location>
+ <dimension name="weight" xvalue="20"/>
+ <dimension name="width" xvalue="20"/>
+ </location>
+ </master>
+ <master glyphname="CC" source="master.ufo2">
+ <location>
+ <dimension name="weight" xvalue="900"/>
+ <dimension name="width" xvalue="900"/>
+ </location>
+ </master>
+ </masters>
+ </glyph>
+ <glyph name="arrow2"/>
+ </glyphs>
+ <kerning/>
+ <info/>
+ <!-- ROUNDTRIP_TEST_REMOVE_ME_END -->
+ </instance>
+
+ <!--
+ These instances will derive all their data from the data above.
+
+ Instances can specify their location either:
+ - using the name of a location label
+ - with design coordinates (xvalue="")
+ - with user coordinates (uservalue="")
+ - with a mix of both coordinate systems
+ -->
+ <instance location="asdf"/>
+ <instance>
+ <location>
+ <dimension name="weight" xvalue="600"/>
+ <dimension name="width" xvalue="401" yvalue="420"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="weight" xvalue="10"/>
+ <dimension name="width" uservalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="weight" uservalue="300"/>
+ <dimension name="width" uservalue="130"/>
+ <dimension name="Italic" uservalue="1"/>
+ </location>
+ </instance>
+ </instances>
+
+ <lib>
+ <dict>
+ <key>com.coolDesignspaceApp.previewSize</key>
+ <integer>30</integer>
+ </dict>
+ </lib>
+</designspace>
diff --git a/Tests/designspaceLib/data/test_v5_MutatorSans_and_Serif.designspace b/Tests/designspaceLib/data/test_v5_MutatorSans_and_Serif.designspace
new file mode 100644
index 00000000..d0fbb3d2
--- /dev/null
+++ b/Tests/designspaceLib/data/test_v5_MutatorSans_and_Serif.designspace
@@ -0,0 +1,206 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes elidedfallbackname="Regular">
+ <axis tag="SRIF" name="serif" values="0 1" default="0">
+ <labels>
+ <label uservalue="0" name="Sans"/>
+ <label uservalue="1" name="Serif"/>
+ </labels>
+ </axis>
+ <axis tag="wght" name="weight" minimum="300" maximum="700" default="300">
+ <map input="300" output="0"/>
+ <map input="500" output="500"/>
+ <map input="700" output="1000"/>
+ <labels>
+ <label uservalue="300" userminimum="300" usermaximum="400" name="Light"/>
+ <label uservalue="500" userminimum="400" usermaximum="600" name="Medium"/>
+ <label uservalue="700" userminimum="600" usermaximum="700" name="Bold"/>
+ </labels>
+ </axis>
+ <axis tag="wdth" name="width" minimum="50" maximum="200" default="50">
+ <map input="50" output="0"/>
+ <map input="100" output="500"/>
+ <map input="200" output="1000"/>
+ <labels>
+ <label uservalue="50" userminimum="50" usermaximum="75" name="Condensed"/>
+ <label uservalue="100" userminimum="75" usermaximum="125" name="Normal" elidable="true"/>
+ <label uservalue="200" userminimum="125" usermaximum="200" name="Extended"/>
+ </labels>
+ </axis>
+ </axes>
+ <labels>
+ <label name="S1">
+ <location>
+ <dimension name="width" uservalue="158.9044"/>
+ <dimension name="weight" uservalue="610.2436"/>
+ </location>
+ </label>
+ <label name="S2">
+ <location>
+ <dimension name="width" uservalue="159.1956"/>
+ <dimension name="weight" uservalue="642.2196"/>
+ </location>
+ </label>
+ </labels>
+ <rules>
+ <rule name="fold_I_serifs">
+ <conditionset>
+ <condition name="width" minimum="0" maximum="328"/>
+ <condition name="serif" minimum="0" maximum="0"/>
+ </conditionset>
+ <sub name="I" with="I.narrow"/>
+ </rule>
+ <rule name="fold_S_terminals">
+ <conditionset>
+ <condition name="width" minimum="0" maximum="1000"/>
+ <condition name="weight" minimum="0" maximum="500"/>
+ <condition name="serif" minimum="0" maximum="0.5"/>
+ </conditionset>
+ <sub name="S" with="S.closed"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="MutatorSansLightCondensed.ufo" name="master.MutatorMathTest.LightCondensed.0" familyname="MutatorMathTest" stylename="LightCondensed">
+ <location>
+ <dimension name="width" xvalue="0"/>
+ <dimension name="weight" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="MutatorSansBoldCondensed.ufo" name="master.MutatorMathTest.BoldCondensed.1" familyname="MutatorMathTest" stylename="BoldCondensed">
+ <location>
+ <dimension name="width" xvalue="0"/>
+ <dimension name="weight" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="MutatorSansLightWide.ufo" name="master.MutatorMathTest.LightWide.2" familyname="MutatorMathTest" stylename="LightWide">
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ <dimension name="weight" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="MutatorSansBoldWide.ufo" name="master.MutatorMathTest.BoldWide.3" familyname="MutatorMathTest" stylename="BoldWide">
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ <dimension name="weight" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="MutatorSansLightCondensed.ufo" name="support.crossbar" layer="support.crossbar">
+ <location>
+ <dimension name="width" xvalue="0"/>
+ <dimension name="weight" xvalue="700"/>
+ </location>
+ </source>
+ <source filename="MutatorSansLightCondensed.ufo" name="support.S.wide" layer="support.S.wide">
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ <dimension name="weight" xvalue="700"/>
+ </location>
+ </source>
+ <source filename="MutatorSansLightCondensed.ufo" name="support.S.middle" layer="support.S.middle">
+ <location>
+ <dimension name="width" xvalue="569.078000"/>
+ <dimension name="weight" xvalue="700"/>
+ </location>
+ </source>
+ <source filename="MutatorSerifLightCondensed.ufo" familyname="MutatorMathTest" stylename="SerifLightCondensed">
+ <location>
+ <dimension name="width" xvalue="0"/>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="serif" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="MutatorSerifLightWide.ufo" familyname="MutatorMathTest" stylename="SerifLightWide">
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="serif" xvalue="1"/>
+ </location>
+ </source>
+ </sources>
+ <variable-fonts>
+ <variable-font name="MutatorSansVariable_Weight_Width">
+ <axis-subsets>
+ <axis-subset name="weight"/>
+ <axis-subset name="width"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="MutatorSansVariable_Weight">
+ <axis-subsets>
+ <axis-subset name="weight"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="MutatorSansVariable_Width">
+ <axis-subsets>
+ <axis-subset name="width"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="MutatorSerifVariable_Width">
+ <axis-subsets>
+ <axis-subset name="serif" uservalue="1"/>
+ <axis-subset name="width"/>
+ </axis-subsets>
+ </variable-font>
+ </variable-fonts>
+ <instances>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="0"/>
+ <dimension name="weight" xvalue="0"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="0"/>
+ <dimension name="weight" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ <dimension name="weight" xvalue="0"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ <dimension name="weight" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="327"/>
+ <dimension name="weight" xvalue="500"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="327"/>
+ <dimension name="weight" xvalue="500"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="569.078"/>
+ <dimension name="weight" xvalue="1000"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="1000"/>
+ <dimension name="weight" xvalue="500"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="0"/>
+ <dimension name="serif" xvalue="0"/>
+ </location>
+ </instance>
+ <instance>
+ <location>
+ <dimension name="width" xvalue="0"/>
+ <dimension name="serif" xvalue="1"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/test_v5_aktiv.designspace b/Tests/designspaceLib/data/test_v5_aktiv.designspace
new file mode 100644
index 00000000..32dfd1ae
--- /dev/null
+++ b/Tests/designspaceLib/data/test_v5_aktiv.designspace
@@ -0,0 +1,621 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="Weight" minimum="100" maximum="900" default="400">
+ <map input="100" output="22"/>
+ <map input="200" output="38"/>
+ <map input="300" output="57"/>
+ <map input="400" output="84"/>
+ <map input="500" output="98"/>
+ <map input="600" output="115"/>
+ <map input="700" output="133"/>
+ <map input="800" output="158"/>
+ <map input="900" output="185"/>
+ <labels ordering="1">
+ <label uservalue="100" name="Hair"/>
+ <label uservalue="200" name="Thin"/>
+ <label uservalue="300" name="Light"/>
+ <label uservalue="400" name="Regular" elidable="true" linkeduservalue="700"/>
+ <label uservalue="500" name="Medium"/>
+ <label uservalue="600" name="SemiBold"/>
+ <label uservalue="700" name="Bold"/>
+ <label uservalue="800" name="XBold"/>
+ <label uservalue="900" name="Black"/>
+ </labels>
+ </axis>
+ <axis tag="wdth" name="Width" minimum="75" maximum="125" default="100">
+ <labels ordering="0">
+ <label uservalue="75" name="Cd"/>
+ <label uservalue="100" name="Normal" elidable="true"/>
+ <label uservalue="125" name="Ex"/>
+ </labels>
+ </axis>
+ <axis tag="ital" name="Italic" minimum="0" maximum="1" default="0">
+ <labels ordering="2">
+ <label uservalue="0" name="Upright" elidable="true" linkeduservalue="1"/>
+ <label uservalue="1" name="Italic"/>
+ </labels>
+ </axis>
+ </axes>
+
+ <rules processing="last">
+ <rule name="BRACKET.CYR">
+ <conditionset>
+ <condition name="Italic" minimum="0.1" maximum="1"/>
+ </conditionset>
+ <sub name="ghe.loclSRB" with="ghe.ital.loclSRB"/>
+ <sub name="ghe.loclMKD" with="ghe.ital.loclMKD"/>
+ <sub name="de.loclMKDSRB" with="de.ital.loclMKDSRB"/>
+ <sub name="pe.loclMKDSRB" with="pe.ital.loclMKDSRB"/>
+ <sub name="te.loclMKDSRB" with="te.ital.loclMKDSRB"/>
+ <sub name="gje.loclMKD" with="gje.ital.loclMKD"/>
+ <sub name="sha.loclMKDSRB" with="sha.ital.loclMKDSRB"/>
+ </rule>
+ <rule name="BRACKET.116.185">
+ <conditionset>
+ <condition name="Weight" minimum="116" maximum="185"/>
+ <condition name="Width" minimum="75" maximum="97.5"/>
+ </conditionset>
+ <sub name="cent" with="cent.BRACKET.130"/>
+ <sub name="dollar" with="dollar.BRACKET.130"/>
+ </rule>
+ </rules>
+
+ <sources>
+ <source filename="AktivGroteskCd_Hair.ufo" name="Aktiv Grotesk Cd Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskCd_HairIt.ufo" name="Aktiv Grotesk Cd Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="AktivGrotesk_Hair.ufo" name="Aktiv Grotesk Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGrotesk_HairIt.ufo" name="Aktiv Grotesk Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskEx_Hair.ufo" name="Aktiv Grotesk Ex Hair">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskEx_HairIt.ufo" name="Aktiv Grotesk Ex Hair Italic">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskCd_Rg.ufo" name="Aktiv Grotesk Cd">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskCd_It.ufo" name="Aktiv Grotesk Cd Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" familyname="Aktiv Grotesk">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGrotesk_Rg.ufo" name="Aktiv Grotesk Regular" layer="{126,100,0}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="AktivGrotesk_It.ufo" name="Aktiv Grotesk Italic {126,100,1}" layer="{126,100,1}">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskEx_Rg.ufo" name="Aktiv Grotesk Ex">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskEx_It.ufo" name="Aktiv Grotesk Ex Italic">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskCd_Blk.ufo" name="Aktiv Grotesk Cd Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskCd_BlkIt.ufo" name="Aktiv Grotesk Cd Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="AktivGrotesk_Blk.ufo" name="Aktiv Grotesk Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGrotesk_BlkIt.ufo" name="Aktiv Grotesk Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskEx_Blk.ufo" name="Aktiv Grotesk Ex Black">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="AktivGroteskEx_BlkIt.ufo" name="Aktiv Grotesk Ex Black Italic">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ </sources>
+
+ <variable-fonts>
+ <variable-font name="AktivGroteskVF_WghtWdthItal">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Width"/>
+ <axis-subset name="Italic"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="AktivGroteskVF_WghtWdth">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Width"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="AktivGroteskVF_Wght">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="AktivGroteskVF_Italics_WghtWdth">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Width"/>
+ <axis-subset name="Italic" uservalue="1"/>
+ </axis-subsets>
+ </variable-font>
+ <variable-font name="AktivGroteskVF_Italics_Wght">
+ <axis-subsets>
+ <axis-subset name="Weight"/>
+ <axis-subset name="Italic" uservalue="1"/>
+ </axis-subsets>
+ </variable-font>
+ </variable-fonts>
+
+ <instances>
+ <instance filename="instances/AktivGroteskCd_Hair.ufo">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_HairIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_Hair.ufo">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_HairIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_Hair.ufo">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_HairIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="22"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_Th.ufo">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_ThIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_Th.ufo">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_ThIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_Th.ufo">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_ThIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="38"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_Lt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_LtIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_Lt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_LtIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_Lt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_LtIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="57"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_Rg.ufo">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_It.ufo">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_Rg.ufo">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_It.ufo">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_Rg.ufo">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_It.ufo">
+ <location>
+ <dimension name="Weight" xvalue="84"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_Md.ufo">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_MdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_Md.ufo">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_MdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_Md.ufo">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_MdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="98"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="../build/instances/AktivGroteskCd_SBd.ufo">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="../build/instances/AktivGroteskCd_SBdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="../build/instances/AktivGrotesk_SBd.ufo">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="../build/instances/AktivGrotesk_SBdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="../build/instances/AktivGroteskEx_SBd.ufo">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="../build/instances/AktivGroteskEx_SBdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="115"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_Bd.ufo">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_BdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_Bd.ufo">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_BdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_Bd.ufo">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_BdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="133"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_XBd.ufo">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_XBdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_XBd.ufo">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_XBdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_XBd.ufo">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_XBdIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="158"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_Blk.ufo">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskCd_BlkIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_Blk.ufo">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGrotesk_BlkIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="100"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_Blk.ufo">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance filename="instances/AktivGroteskEx_BlkIt.ufo">
+ <location>
+ <dimension name="Weight" xvalue="185"/>
+ <dimension name="Width" xvalue="125"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/test_v5_decovar.designspace b/Tests/designspaceLib/data/test_v5_decovar.designspace
new file mode 100644
index 00000000..fd31626e
--- /dev/null
+++ b/Tests/designspaceLib/data/test_v5_decovar.designspace
@@ -0,0 +1,242 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="BLDA" name="Inline" minimum="0" maximum="1000" default="0"/>
+ <axis tag="TRMD" name="Shearded" minimum="0" maximum="1000" default="0"/>
+ <axis tag="TRMC" name="Rounded Slab" minimum="0" maximum="1000" default="0"/>
+ <axis tag="SKLD" name="Stripes" minimum="0" maximum="1000" default="0"/>
+ <axis tag="TRML" name="Worm Terminal" minimum="0" maximum="1000" default="0"/>
+ <axis tag="SKLA" name="Inline Skeleton" minimum="0" maximum="1000" default="0"/>
+ <axis tag="TRMF" name="Open Inline Terminal" minimum="0" maximum="1000" default="0"/>
+ <axis tag="TRMK" name="Inline Terminal" minimum="0" maximum="1000" default="0"/>
+ <axis tag="BLDB" name="Worm" minimum="0" maximum="1000" default="0"/>
+ <axis tag="WMX2" name="Weight" minimum="0" maximum="1000" default="0"/>
+ <axis tag="TRMB" name="Flared" minimum="0" maximum="1000" default="0"/>
+ <axis tag="TRMA" name="Rounded" minimum="0" maximum="1000" default="0"/>
+ <axis tag="SKLB" name="Worm Skeleton" minimum="0" maximum="1000" default="0"/>
+ <axis tag="TRMG" name="Slab" minimum="0" maximum="1000" default="0"/>
+ <axis tag="TRME" name="Bifurcated" minimum="0" maximum="1000" default="0"/>
+ </axes>
+
+ <!-- Labels without location or just partly specified location are at the default location plus the explicitly given sub-locations. -->
+ <labels>
+ <label name="Default" elidable="true"/>
+ <label name="Open">
+ <labelname xml:lang="de">Offen</labelname>
+ <location>
+ <dimension name="Inline" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Worm">
+ <location>
+ <dimension name="Worm" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Checkered">
+ <location>
+ <dimension name="Inline Skeleton" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Checkered Reverse">
+ <location>
+ <dimension name="Inline Terminal" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Striped">
+ <location>
+ <dimension name="Stripes" uservalue="500"/>
+ </location>
+ </label>
+ <label name="Rounded">
+ <location>
+ <dimension name="Rounded" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Flared">
+ <location>
+ <dimension name="Flared" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Flared Open">
+ <location>
+ <dimension name="Inline Skeleton" uservalue="1000"/>
+ <dimension name="Flared" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Rounded Slab">
+ <location>
+ <dimension name="Rounded Slab" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Sheared">
+ <location>
+ <dimension name="Shearded" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Bifurcated">
+ <location>
+ <dimension name="Bifurcated" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Inline">
+ <location>
+ <dimension name="Inline Skeleton" uservalue="500"/>
+ <dimension name="Open Inline Terminal" uservalue="500"/>
+ </location>
+ </label>
+ <label name="Slab">
+ <location>
+ <dimension name="Slab" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Contrast">
+ <location>
+ <dimension name="Weight" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Fancy">
+ <location>
+ <dimension name="Inline Skeleton" uservalue="1000"/>
+ <dimension name="Weight" uservalue="1000"/>
+ <dimension name="Flared" uservalue="1000"/>
+ </location>
+ </label>
+ <label name="Mayhem">
+ <location>
+ <dimension name="Rounded Slab" uservalue="750"/>
+ <dimension name="Worm Terminal" uservalue="250"/>
+ <dimension name="Inline Skeleton" uservalue="1000"/>
+ <dimension name="Open Inline Terminal" uservalue="250"/>
+ <dimension name="Inline Terminal" uservalue="250"/>
+ <dimension name="Worm" uservalue="1000"/>
+ <dimension name="Weight" uservalue="750"/>
+ <dimension name="Flared" uservalue="500"/>
+ <dimension name="Rounded" uservalue="500"/>
+ <dimension name="Worm Skeleton" uservalue="1000"/>
+ <dimension name="Slab" uservalue="750"/>
+ <dimension name="Bifurcated" uservalue="500"/>
+ </location>
+ </label>
+ </labels>
+
+ <sources>
+ <source filename="DecovarAlpha-Regular24.ufo" name="master_Regular"/>
+ <source filename="DecovarAlpha-Regular24SkelA.ufo" name="master_sklA">
+ <location>
+ <dimension name="Inline Skeleton" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24SkelD2.ufo" name="master_sklD2">
+ <location>
+ <dimension name="Stripes" xvalue="500"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24SkelD4.ufo" name="master_sklD4">
+ <location>
+ <dimension name="Stripes" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24SkelB2.ufo" name="master_sklB2">
+ <location>
+ <dimension name="Worm Skeleton" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24TermA.ufo" name="master_trmA">
+ <location>
+ <dimension name="Rounded" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24TermB.ufo" name="master_trmB">
+ <location>
+ <dimension name="Flared" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24TermC.ufo" name="master_trmC">
+ <location>
+ <dimension name="Rounded Slab" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24TermD.ufo" name="master_trmD">
+ <location>
+ <dimension name="Shearded" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24TermE.ufo" name="master_trmE">
+ <location>
+ <dimension name="Bifurcated" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24TermF.ufo" name="master_trmF">
+ <location>
+ <dimension name="Open Inline Terminal" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24TermG.ufo" name="master_trmG">
+ <location>
+ <dimension name="Slab" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24TermSkelA.ufo" name="master_trmK">
+ <location>
+ <dimension name="Inline Terminal" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24TermSkelB.ufo" name="master_trmL">
+ <location>
+ <dimension name="Worm Terminal" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24WeightMax1.ufo" name="master_wmx1">
+ <location>
+ <dimension name="Weight" xvalue="5"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24WeightMax1.5.ufo" name="master_wmx1.5">
+ <location>
+ <dimension name="Weight" xvalue="507.806"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24WeightMax2.ufo" name="master_wmx2">
+ <location>
+ <dimension name="Weight" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24bldA.ufo" name="master_bldA">
+ <location>
+ <dimension name="Inline" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="DecovarAlpha-Regular24bldB.ufo" name="master_bldB">
+ <location>
+ <dimension name="Worm" xvalue="1000"/>
+ </location>
+ </source>
+ </sources>
+
+ <instances>
+ <!--
+ This designspace defines LocationLabels (STAT format 4) for various
+ points within the design space. In order to define instances at these
+ locations, DS version 5 provides the `location="..."` attribute which
+ means that the instance is in the same location as the LocationLabel
+ with the given name.
+ -->
+ <instance location="Default" filename="DecovarAlpha-Default.ufo"/>
+ <instance location="Open" filename="DecovarAlpha-Open.ufo"/>
+ <instance location="Worm" filename="DecovarAlpha-Worm.ufo"/>
+ <instance location="Checkered" filename="DecovarAlpha-Checkered.ufo"/>
+ <instance location="Checkered Reverse" filename="DecovarAlpha-CheckeredReverse.ufo"/>
+ <instance location="Striped" filename="DecovarAlpha-Striped.ufo"/>
+ <instance location="Rounded" filename="DecovarAlpha-Rounded.ufo"/>
+ <instance location="Flared" filename="DecovarAlpha-Flared.ufo"/>
+ <instance location="Flared Open" filename="DecovarAlpha-FlaredOpen.ufo"/>
+ <instance location="Rounded Slab" filename="DecovarAlpha-RoundedSlab.ufo"/>
+ <instance location="Sheared" filename="DecovarAlpha-Sheared.ufo"/>
+ <instance location="Bifurcated" filename="DecovarAlpha-Bifurcated.ufo"/>
+ <instance location="Inline" filename="DecovarAlpha-Inline.ufo"/>
+ <instance location="Slab" filename="DecovarAlpha-Slab.ufo"/>
+ <instance location="Contrast" filename="DecovarAlpha-Contrast.ufo"/>
+ <instance location="Fancy" filename="DecovarAlpha-Fancy.ufo"/>
+ <instance location="Mayhem" filename="DecovarAlpha-Mayhem.ufo"/>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/test_v5_discrete.designspace b/Tests/designspaceLib/data/test_v5_discrete.designspace
new file mode 100644
index 00000000..f42f2dc9
--- /dev/null
+++ b/Tests/designspaceLib/data/test_v5_discrete.designspace
@@ -0,0 +1,139 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="Weight" values="400 700 900" default="400">
+ <labels>
+ <label uservalue="400" name="Regular" elidable="true" linkeduservalue="700"/>
+ <label uservalue="700" name="Bold"/>
+ <label uservalue="900" name="Black"/>
+ </labels>
+ </axis>
+ <axis tag="wdth" name="Width" values="75 100" default="100">
+ <labels>
+ <label uservalue="75" name="Narrow"/>
+ <label uservalue="100" name="Normal" elidable="true"/>
+ </labels>
+ </axis>
+ <axis tag="ital" name="Italic" values="0 1" default="0">
+ <labels>
+ <label uservalue="0" name="Roman" elidable="true" linkeduservalue="1"/>
+ <label uservalue="1" name="Italic"/>
+ </labels>
+ </axis>
+ </axes>
+
+ <sources>
+ <source filename="arial.ufo" name="Arial Regular">
+ <location>
+ <dimension name="Weight" xvalue="400"/>
+ </location>
+ </source>
+ <source filename="arialbd.ufo" name="Arial Bold">
+ <location>
+ <dimension name="Weight" xvalue="700"/>
+ </location>
+ </source>
+ <source filename="ariblk.ufo" name="Arial Black">
+ <location>
+ <dimension name="Weight" xvalue="900"/>
+ </location>
+ </source>
+ <source filename="ariali.ufo" name="Arial Italic">
+ <location>
+ <dimension name="Weight" xvalue="400"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="arialbi.ufo" name="Arial Bold Italic">
+ <location>
+ <dimension name="Weight" xvalue="700"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="ARIALN.ufo" name="Arial Narrow">
+ <location>
+ <dimension name="Weight" xvalue="400"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="ARIALNB.ufo" name="Arial Narrow Bold">
+ <location>
+ <dimension name="Weight" xvalue="700"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </source>
+ <source filename="ARIALNBI.ufo" name="Arial Narrow Bold Italic">
+ <location>
+ <dimension name="Weight" xvalue="700"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="ARIALNI.ufo" name="Arial Narrow Italic">
+ <location>
+ <dimension name="Weight" xvalue="400"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </source>
+ </sources>
+
+ <instances>
+ <instance name="Arial Regular">
+ <location>
+ <dimension name="Weight" xvalue="400"/>
+ </location>
+ </instance>
+ <instance name="Arial Bold">
+ <!-- Should be stylemapstylename="bold" -->
+ <location>
+ <dimension name="Weight" xvalue="700"/>
+ </location>
+ </instance>
+ <instance name="Arial Black">
+ <location>
+ <dimension name="Weight" xvalue="900"/>
+ </location>
+ </instance>
+ <instance name="Arial Italic">
+ <!-- Should be stylemapstylename="italic" -->
+ <location>
+ <dimension name="Weight" xvalue="400"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Arial Bold Italic">
+ <!-- Should be stylemapstylename="bold italic" -->
+ <location>
+ <dimension name="Weight" xvalue="700"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Arial Narrow">
+ <location>
+ <dimension name="Weight" xvalue="400"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Arial Narrow Bold">
+ <location>
+ <dimension name="Weight" xvalue="700"/>
+ <dimension name="Width" xvalue="75"/>
+ </location>
+ </instance>
+ <instance name="Arial Narrow Bold Italic">
+ <location>
+ <dimension name="Weight" xvalue="700"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance name="Arial Narrow Italic">
+ <location>
+ <dimension name="Weight" xvalue="400"/>
+ <dimension name="Width" xvalue="75"/>
+ <dimension name="Italic" xvalue="1"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/data/test_v5_original.designspace b/Tests/designspaceLib/data/test_v5_original.designspace
new file mode 100644
index 00000000..d144a073
--- /dev/null
+++ b/Tests/designspaceLib/data/test_v5_original.designspace
@@ -0,0 +1,90 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <!--
+ NOTE: this file is the same as test_v4_original, except:
+ - the format is 5,
+ - source location width = 20 are not written out because it's the default
+ - instance <glyphs>, <kerning>, <info> are removed because deprecated
+ -->
+ <axes>
+ <axis tag="wght" name="weight" minimum="0" maximum="1000" default="0">
+ <labelname xml:lang="en">Wéíght</labelname>
+ <labelname xml:lang="fa-IR">قطر</labelname>
+ </axis>
+ <axis tag="wdth" name="width" minimum="0" maximum="1000" default="15" hidden="1">
+ <labelname xml:lang="fr">Chasse</labelname>
+ <map input="0" output="10"/>
+ <map input="15" output="20"/>
+ <map input="401" output="66"/>
+ <map input="1000" output="990"/>
+ </axis>
+ </axes>
+ <rules processing="last">
+ <rule name="named.rule.1">
+ <conditionset>
+ <condition name="axisName_a" minimum="0" maximum="1"/>
+ <condition name="axisName_b" minimum="2" maximum="3"/>
+ </conditionset>
+ <sub name="a" with="a.alt"/>
+ </rule>
+ </rules>
+ <sources>
+ <source filename="masters/masterTest1.ufo" name="master.ufo1" familyname="MasterFamilyName" stylename="MasterStyleNameOne">
+ <lib copy="1"/>
+ <features copy="1"/>
+ <info copy="1"/>
+ <glyph name="A" mute="1"/>
+ <glyph name="Z" mute="1"/>
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="masters/masterTest2.ufo" name="master.ufo2" familyname="MasterFamilyName" stylename="MasterStyleNameTwo">
+ <kerning mute="1"/>
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ </location>
+ </source>
+ <source filename="masters/masterTest2.ufo" name="master.ufo2" familyname="MasterFamilyName" stylename="Supports" layer="supports">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ </location>
+ </source>
+ </sources>
+ <instances>
+ <instance name="instance.ufo1" familyname="InstanceFamilyName" stylename="InstanceStyleName" filename="instances/instanceTest1.ufo" postscriptfontname="InstancePostscriptName" stylemapfamilyname="InstanceStyleMapFamilyName" stylemapstylename="InstanceStyleMapStyleName">
+ <stylename xml:lang="fr">Demigras</stylename>
+ <stylename xml:lang="ja">半ば</stylename>
+ <familyname xml:lang="fr">Montserrat</familyname>
+ <familyname xml:lang="ja">モンセラート</familyname>
+ <stylemapstylename xml:lang="de">Standard</stylemapstylename>
+ <stylemapfamilyname xml:lang="de">Montserrat Halbfett</stylemapfamilyname>
+ <stylemapfamilyname xml:lang="ja">モンセラート SemiBold</stylemapfamilyname>
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ </location>
+ <lib>
+ <dict>
+ <key>com.coolDesignspaceApp.binaryData</key>
+ <data>
+ PGJpbmFyeSBndW5rPg==
+ </data>
+ <key>com.coolDesignspaceApp.specimenText</key>
+ <string>Hamburgerwhatever</string>
+ </dict>
+ </lib>
+ </instance>
+ <instance name="instance.ufo2" familyname="InstanceFamilyName" stylename="InstanceStyleName" filename="instances/instanceTest2.ufo" postscriptfontname="InstancePostscriptName" stylemapfamilyname="InstanceStyleMapFamilyName" stylemapstylename="InstanceStyleMapStyleName">
+ <location>
+ <dimension name="weight" xvalue="500"/>
+ <dimension name="width" xvalue="400" yvalue="300"/>
+ </location>
+ </instance>
+ </instances>
+ <lib>
+ <dict>
+ <key>com.coolDesignspaceApp.previewSize</key>
+ <integer>30</integer>
+ </dict>
+ </lib>
+</designspace>
diff --git a/Tests/designspaceLib/data/test_v5_sourceserif.designspace b/Tests/designspaceLib/data/test_v5_sourceserif.designspace
new file mode 100644
index 00000000..d3a32177
--- /dev/null
+++ b/Tests/designspaceLib/data/test_v5_sourceserif.designspace
@@ -0,0 +1,646 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="5.0">
+ <axes>
+ <axis tag="wght" name="weight" minimum="200" maximum="900" default="400">
+ <map input="200" output="0"/>
+ <map input="300" output="145"/>
+ <map input="400" output="394"/>
+ <map input="600" output="594"/>
+ <map input="700" output="823"/>
+ <map input="900" output="1000"/>
+ <labels ordering="1">
+ <label uservalue="200" userminimum="200" usermaximum="250" name="ExtraLight"/>
+ <label uservalue="300" userminimum="250" usermaximum="350" name="Light"/>
+ <label uservalue="400" userminimum="350" usermaximum="450" name="Regular" elidable="true"/>
+ <label uservalue="600" userminimum="550" usermaximum="650" name="Semibold"/>
+ <label uservalue="700" userminimum="650" usermaximum="750" name="Bold"/>
+ <label uservalue="775" userminimum="750" usermaximum="800" name="ExtraBold"/>
+ <label uservalue="900" userminimum="800" usermaximum="900" name="Black"/>
+ </labels>
+ </axis>
+ <axis tag="opsz" name="optical" minimum="8" maximum="60" default="20">
+ <labels ordering="0">
+ <label uservalue="8" userminimum="8" usermaximum="12" name="Caption"/>
+ <label uservalue="16" userminimum="12" usermaximum="18" name="SmallText"/>
+ <label uservalue="20" userminimum="18" usermaximum="26" name="Text" elidable="true"/>
+ <label uservalue="32" userminimum="26" usermaximum="48" name="Subhead"/>
+ <label uservalue="60" userminimum="48" usermaximum="60" name="Display"/>
+ </labels>
+ </axis>
+ <axis tag="ital" name="italic" values="0 1" default="0">
+ <labels ordering="2">
+ <label uservalue="0" name="Roman" elidable="true"/>
+ <label uservalue="1" name="Italic"/>
+ </labels>
+ </axis>
+ </axes>
+
+ <sources>
+ <source filename="caption/master_0/SourceSerif_c0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="caption/master_1/SourceSerif_c1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="caption/master_2/SourceSerif_c2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="text/master_0/SourceSerif_0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="text/master_1/SourceSerif_1.ufo" familyname="Source Serif 4">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="text/master_2/SourceSerif_2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="display/master_0/SourceSerif_d0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="display/master_1/SourceSerif_d1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </source>
+ <source filename="display/master_2/SourceSerif_d2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </source>
+
+ <source filename="caption/master_0/SourceSerif-Italic_c0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="caption/master_1/SourceSerif-Italic_c1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="caption/master_2/SourceSerif-Italic_c2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="text/master_0/SourceSerif-Italic_0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="text/master_1/SourceSerif-Italic_1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="text/master_2/SourceSerif-Italic_2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="display/master_0/SourceSerif-Italic_d0.ufo">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="display/master_1/SourceSerif-Italic_d1.ufo">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </source>
+ <source filename="display/master_2/SourceSerif-Italic_d2.ufo">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </source>
+ </sources>
+
+ <variable-fonts>
+ <variable-font name="SourceSerif4Variable-Roman">
+ <axis-subsets>
+ <axis-subset name="weight"/>
+ <axis-subset name="optical"/>
+ <axis-subset name="italic" uservalue="0"/>
+ </axis-subsets>
+ <!-- The per-variable-font lib is to be merged into the global lib on
+ conversion to a DS v4, overwriting keys in the global lib. -->
+ <lib>
+ <dict>
+ <key>public.skipExportGlyphs</key>
+ <array>
+ <string>caron.alt</string>
+ <string>commabelowcmb.alt</string>
+ <string>tonos.cap</string>
+ <string>f.ligalong</string>
+ <string>dieresiscmb.tight</string>
+ <string>IJ</string>
+ <string>Tbar</string>
+ <string>colontriangularmod</string>
+ <string>crossmark</string>
+ <string>ij</string>
+ <string>overline</string>
+ <string>similar</string>
+ <string>tbar</string>
+ <string>triangularbullet</string>
+ <string>turkicdsccmb</string>
+ </array>
+ </dict>
+ </lib>
+ </variable-font>
+ <variable-font name="SourceSerif4Variable-Italic">
+ <axis-subsets>
+ <axis-subset name="weight"/>
+ <axis-subset name="optical"/>
+ <axis-subset name="italic" uservalue="1"/>
+ </axis-subsets>
+ <lib>
+ <dict>
+ <key>public.skipExportGlyphs</key>
+ <array>
+ <string>caron.alt</string>
+ <string>commabelowcmb.alt</string>
+ <string>f.liga</string>
+ <string>f.ligalong</string>
+ <string>tonos.cap</string>
+ <string>dieresiscmb.tight</string>
+ <string>turkicdsccmb</string>
+ </array>
+ </dict>
+ </lib>
+ </variable-font>
+ </variable-fonts>
+
+ <instances>
+ <instance postscriptfontname="SourceSerif4Roman-CaptionExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-CaptionLight">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-CaptionRegular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-CaptionSemibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-CaptionBold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-CaptionBlack">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance stylename="SmText ExtraLight" postscriptfontname="SourceSerif4Roman-SmTextExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance stylename="SmText Light" postscriptfontname="SourceSerif4Roman-SmTextLight">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance stylename="SmText" postscriptfontname="SourceSerif4Roman-SmTextRegular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance stylename="SmText Semibold" postscriptfontname="SourceSerif4Roman-SmTextSemibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance stylename="SmText Bold" postscriptfontname="SourceSerif4Roman-SmTextBold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance stylename="SmText Black" postscriptfontname="SourceSerif4Roman-SmTextBlack">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-ExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-Light">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance stylename="Regular" postscriptfontname="SourceSerif4Roman-Regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-Semibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-Bold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-Black">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-SubheadExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-SubheadLight">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-SubheadRegular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-SubheadSemibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-SubheadBold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-SubheadBlack">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-DisplayExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-DisplayLight">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-DisplayRegular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-DisplaySemibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-DisplayBold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Roman-DisplayBlack">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="0"/>
+ </location>
+ </instance>
+
+ <instance postscriptfontname="SourceSerif4Italic-CaptionExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-CaptionLight">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-CaptionRegular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-CaptionSemibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-CaptionBold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-CaptionBlack">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="8"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance stylename="SmText ExtraLight Italic" postscriptfontname="SourceSerif4Italic-SmTextExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance stylename="SmText Light Italic" postscriptfontname="SourceSerif4Italic-SmTextLight">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance stylename="SmText Italic" postscriptfontname="SourceSerif4Italic-SmTextRegular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance stylename="SmText Semibold Italic" postscriptfontname="SourceSerif4Italic-SmTextSemibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance stylename="SmText Bold Italic" postscriptfontname="SourceSerif4Italic-SmTextBold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance stylename="SmText Black Italic" postscriptfontname="SourceSerif4Italic-SmTextBlack">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="16"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-ExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-Light">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-Regular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-Semibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-Bold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-Black">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="20"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-SubheadExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-SubheadLight">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-SubheadRegular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-SubheadSemibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-SubheadBold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-SubheadBlack">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="32"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-DisplayExtraLight">
+ <location>
+ <dimension name="weight" xvalue="0"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-DisplayLight">
+ <location>
+ <dimension name="weight" xvalue="145"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-DisplayRegular">
+ <location>
+ <dimension name="weight" xvalue="394"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-DisplaySemibold">
+ <location>
+ <dimension name="weight" xvalue="594"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-DisplayBold">
+ <location>
+ <dimension name="weight" xvalue="823"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ <instance postscriptfontname="SourceSerif4Italic-DisplayBlack">
+ <location>
+ <dimension name="weight" xvalue="1000"/>
+ <dimension name="optical" xvalue="60"/>
+ <dimension name="italic" xvalue="1"/>
+ </location>
+ </instance>
+ </instances>
+</designspace>
diff --git a/Tests/designspaceLib/designspace_test.py b/Tests/designspaceLib/designspace_test.py
index b6ee9d65..ee2d19e6 100644
--- a/Tests/designspaceLib/designspace_test.py
+++ b/Tests/designspaceLib/designspace_test.py
@@ -1,15 +1,26 @@
# coding=utf-8
import os
-import sys
-import pytest
-import warnings
+import re
-from fontTools.misc import plistlib
-from fontTools.designspaceLib import (
- DesignSpaceDocument, SourceDescriptor, AxisDescriptor, RuleDescriptor,
- InstanceDescriptor, evaluateRule, processRules, posix, DesignSpaceDocumentError)
+import pytest
from fontTools import ttLib
+from fontTools.designspaceLib import (
+ AxisDescriptor,
+ AxisLabelDescriptor,
+ DesignSpaceDocument,
+ DesignSpaceDocumentError,
+ DiscreteAxisDescriptor,
+ InstanceDescriptor,
+ RuleDescriptor,
+ SourceDescriptor,
+ evaluateRule,
+ posix,
+ processRules,
+)
+from fontTools.designspaceLib.types import Range
+from fontTools.misc import plistlib
+
def _axesAsDict(axes):
"""
@@ -30,19 +41,22 @@ def _axesAsDict(axes):
def assert_equals_test_file(path, test_filename):
- with open(path) as fp:
+ with open(path, encoding="utf-8") as fp:
actual = fp.read()
test_path = os.path.join(os.path.dirname(__file__), test_filename)
- with open(test_path) as fp:
+ with open(test_path, encoding="utf-8") as fp:
expected = fp.read()
+ expected = re.sub(r"<!--(.|\n)*?-->", "", expected)
+ expected = re.sub(r"\s*\n+", "\n", expected)
assert actual == expected
def test_fill_document(tmpdir):
tmpdir = str(tmpdir)
- testDocPath = os.path.join(tmpdir, "test.designspace")
+ testDocPath = os.path.join(tmpdir, "test_v4.designspace")
+ testDocPath5 = os.path.join(tmpdir, "test_v5.designspace")
masterPath1 = os.path.join(tmpdir, "masters", "masterTest1.ufo")
masterPath2 = os.path.join(tmpdir, "masters", "masterTest2.ufo")
instancePath1 = os.path.join(tmpdir, "instances", "instanceTest1.ufo")
@@ -121,6 +135,10 @@ def test_fill_document(tmpdir):
i1.postScriptFontName = "InstancePostscriptName"
i1.styleMapFamilyName = "InstanceStyleMapFamilyName"
i1.styleMapStyleName = "InstanceStyleMapStyleName"
+ i1.localisedStyleName = dict(fr="Demigras", ja="半ば")
+ i1.localisedFamilyName = dict(fr="Montserrat", ja="モンセラート")
+ i1.localisedStyleMapStyleName = dict(de="Standard")
+ i1.localisedStyleMapFamilyName = dict(de="Montserrat Halbfett", ja="モンセラート SemiBold")
glyphData = dict(name="arrow", mute=True, unicodes=[0x123, 0x124, 0x125])
i1.glyphs['arrow'] = glyphData
i1.lib['com.coolDesignspaceApp.binaryData'] = plistlib.Data(b'<binary gunk>')
@@ -158,16 +176,21 @@ def test_fill_document(tmpdir):
])
r1.subs.append(("a", "a.alt"))
doc.addRule(r1)
- # write the document
+ # write the document; without an explicit format it will be 5.0 by default
+ doc.write(testDocPath5)
+ assert os.path.exists(testDocPath5)
+ assert_equals_test_file(testDocPath5, 'data/test_v5_original.designspace')
+ # write again with an explicit format = 4.1
+ doc.formatVersion = "4.1"
doc.write(testDocPath)
assert os.path.exists(testDocPath)
- assert_equals_test_file(testDocPath, 'data/test.designspace')
+ assert_equals_test_file(testDocPath, 'data/test_v4_original.designspace')
# import it again
new = DesignSpaceDocument()
new.read(testDocPath)
assert new.default.location == {'width': 20.0, 'weight': 0.0}
- assert new.filename == 'test.designspace'
+ assert new.filename == 'test_v4.designspace'
assert new.lib == doc.lib
assert new.instances[0].lib == doc.instances[0].lib
@@ -197,6 +220,7 @@ def test_unicodes(tmpdir):
instancePath1 = os.path.join(tmpdir, "instances", "instanceTest1.ufo")
instancePath2 = os.path.join(tmpdir, "instances", "instanceTest2.ufo")
doc = DesignSpaceDocument()
+ doc.formatVersion = "4.1" # This test about instance glyphs is deprecated in v5
# add master 1
s1 = SourceDescriptor()
s1.filename = os.path.relpath(masterPath1, os.path.dirname(testDocPath))
@@ -832,7 +856,7 @@ def test_updatePaths(tmpdir):
def test_read_with_path_object():
import pathlib
- source = (pathlib.Path(__file__) / "../data/test.designspace").resolve()
+ source = (pathlib.Path(__file__) / "../data/test_v4_original.designspace").resolve()
assert source.exists()
doc = DesignSpaceDocument()
doc.read(source)
@@ -841,7 +865,7 @@ def test_read_with_path_object():
def test_with_with_path_object(tmpdir):
import pathlib
tmpdir = str(tmpdir)
- dest = pathlib.Path(tmpdir) / "test.designspace"
+ dest = pathlib.Path(tmpdir) / "test_v4_original.designspace"
doc = DesignSpaceDocument()
doc.write(dest)
assert dest.exists()
@@ -1020,3 +1044,23 @@ def test_addRuleDescriptor(tmp_path):
# Test it doesn't crash.
ds.write(tmp_path / "test.designspace")
+
+
+def test_deepcopyExceptFonts():
+ ds = DesignSpaceDocument()
+ ds.addSourceDescriptor(font=object())
+ ds.addSourceDescriptor(font=object())
+
+ ds_copy = ds.deepcopyExceptFonts()
+
+ assert ds.tostring() == ds_copy.tostring()
+ assert ds.sources[0].font is ds_copy.sources[0].font
+ assert ds.sources[1].font is ds_copy.sources[1].font
+
+
+def test_Range_post_init():
+ # test min and max are sorted and default is clamped to either min/max
+ r = Range(minimum=2, maximum=-1, default=-2)
+ assert r.minimum == -1
+ assert r.maximum == 2
+ assert r.default == -1
diff --git a/Tests/designspaceLib/designspace_v5_test.py b/Tests/designspaceLib/designspace_v5_test.py
new file mode 100644
index 00000000..9e803340
--- /dev/null
+++ b/Tests/designspaceLib/designspace_v5_test.py
@@ -0,0 +1,888 @@
+import re
+import shutil
+from pathlib import Path
+
+import pytest
+from fontTools.designspaceLib import (
+ AxisDescriptor,
+ AxisLabelDescriptor,
+ DesignSpaceDocument,
+ DiscreteAxisDescriptor,
+ InstanceDescriptor,
+ LocationLabelDescriptor,
+ RangeAxisSubsetDescriptor,
+ SourceDescriptor,
+ ValueAxisSubsetDescriptor,
+ VariableFontDescriptor,
+ posix,
+)
+
+from .fixtures import datadir
+
+
+def assert_descriptors_equal(actual, expected):
+ assert len(actual) == len(expected)
+ for a, e in zip(actual, expected):
+ assert a.asdict() == e.asdict()
+
+
+def test_read_v5_document_simple(datadir):
+ doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
+
+ assert_descriptors_equal(
+ doc.axes,
+ [
+ AxisDescriptor(
+ tag="wght",
+ name="weight",
+ minimum=200,
+ maximum=1000,
+ default=200,
+ labelNames={"en": "Wéíght", "fa-IR": "قطر"},
+ map=[
+ (200, 0),
+ (300, 100),
+ (400, 368),
+ (600, 600),
+ (700, 824),
+ (900, 1000),
+ ],
+ axisOrdering=None,
+ axisLabels=[
+ AxisLabelDescriptor(
+ name="Extra Light",
+ userMinimum=200,
+ userValue=200,
+ userMaximum=250,
+ labelNames={"de": "Extraleicht", "fr": "Extra léger"},
+ ),
+ AxisLabelDescriptor(
+ name="Light", userMinimum=250, userValue=300, userMaximum=350
+ ),
+ AxisLabelDescriptor(
+ name="Regular",
+ userMinimum=350,
+ userValue=400,
+ userMaximum=450,
+ elidable=True,
+ ),
+ AxisLabelDescriptor(
+ name="Semi Bold",
+ userMinimum=450,
+ userValue=600,
+ userMaximum=650,
+ ),
+ AxisLabelDescriptor(
+ name="Bold", userMinimum=650, userValue=700, userMaximum=850
+ ),
+ AxisLabelDescriptor(
+ name="Black", userMinimum=850, userValue=900, userMaximum=900
+ ),
+ ],
+ ),
+ AxisDescriptor(
+ tag="wdth",
+ name="width",
+ minimum=50,
+ maximum=150,
+ default=100,
+ hidden=True,
+ labelNames={"fr": "Chasse"},
+ map=[(50, 10), (100, 20), (125, 66), (150, 990)],
+ axisOrdering=1,
+ axisLabels=[
+ AxisLabelDescriptor(name="Condensed", userValue=50),
+ AxisLabelDescriptor(
+ name="Normal", elidable=True, olderSibling=True, userValue=100
+ ),
+ AxisLabelDescriptor(name="Wide", userValue=125),
+ AxisLabelDescriptor(
+ name="Extra Wide", userValue=150, userMinimum=150
+ ),
+ ],
+ ),
+ DiscreteAxisDescriptor(
+ tag="ital",
+ name="Italic",
+ values=[0, 1],
+ default=0,
+ axisOrdering=None,
+ axisLabels=[
+ AxisLabelDescriptor(
+ name="Roman", userValue=0, elidable=True, linkedUserValue=1
+ ),
+ AxisLabelDescriptor(name="Italic", userValue=1),
+ ],
+ ),
+ ],
+ )
+
+ assert_descriptors_equal(
+ doc.locationLabels,
+ [
+ LocationLabelDescriptor(
+ name="Some Style",
+ labelNames={"fr": "Un Style"},
+ userLocation={"weight": 300, "width": 50, "Italic": 0},
+ ),
+ LocationLabelDescriptor(
+ name="Other", userLocation={"weight": 700, "width": 100, "Italic": 1}
+ ),
+ ],
+ )
+
+ assert_descriptors_equal(
+ doc.sources,
+ [
+ SourceDescriptor(
+ filename="masters/masterTest1.ufo",
+ path=posix(str((datadir / "masters/masterTest1.ufo").resolve())),
+ name="master.ufo1",
+ layerName=None,
+ location={"weight": 0.0, "width": 20.0},
+ copyLib=True,
+ copyInfo=True,
+ copyGroups=False,
+ copyFeatures=True,
+ muteKerning=False,
+ muteInfo=False,
+ mutedGlyphNames=["A", "Z"],
+ familyName="MasterFamilyName",
+ styleName="MasterStyleNameOne",
+ localisedFamilyName={"fr": "Montserrat", "ja": "モンセラート"},
+ ),
+ SourceDescriptor(
+ filename="masters/masterTest2.ufo",
+ path=posix(str((datadir / "masters/masterTest2.ufo").resolve())),
+ name="master.ufo2",
+ layerName=None,
+ location={"weight": 1000.0, "width": 20.0},
+ copyLib=False,
+ copyInfo=False,
+ copyGroups=False,
+ copyFeatures=False,
+ muteKerning=True,
+ muteInfo=False,
+ mutedGlyphNames=[],
+ familyName="MasterFamilyName",
+ styleName="MasterStyleNameTwo",
+ localisedFamilyName={},
+ ),
+ SourceDescriptor(
+ filename="masters/masterTest2.ufo",
+ path=posix(str((datadir / "masters/masterTest2.ufo").resolve())),
+ name="master.ufo2",
+ layerName="supports",
+ location={"weight": 1000.0, "width": 20.0},
+ copyLib=False,
+ copyInfo=False,
+ copyGroups=False,
+ copyFeatures=False,
+ muteKerning=False,
+ muteInfo=False,
+ mutedGlyphNames=[],
+ familyName="MasterFamilyName",
+ styleName="Supports",
+ localisedFamilyName={},
+ ),
+ ],
+ )
+
+ assert_descriptors_equal(
+ doc.variableFonts,
+ [
+ VariableFontDescriptor(
+ name="Test_WghtWdth",
+ filename="Test_WghtWdth_different_from_name.ttf",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(name="Weight"),
+ RangeAxisSubsetDescriptor(name="Width"),
+ ],
+ lib={"com.vtt.source": "sources/vtt/Test_WghtWdth.vtt"},
+ ),
+ VariableFontDescriptor(
+ name="Test_Wght",
+ axisSubsets=[RangeAxisSubsetDescriptor(name="Weight")],
+ lib={"com.vtt.source": "sources/vtt/Test_Wght.vtt"},
+ ),
+ VariableFontDescriptor(
+ name="TestCd_Wght",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(name="Weight"),
+ ValueAxisSubsetDescriptor(name="Width", userValue=0),
+ ],
+ ),
+ VariableFontDescriptor(
+ name="TestWd_Wght",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(name="Weight"),
+ ValueAxisSubsetDescriptor(name="Width", userValue=1000),
+ ],
+ ),
+ VariableFontDescriptor(
+ name="TestItalic_Wght",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(name="Weight"),
+ ValueAxisSubsetDescriptor(name="Italic", userValue=1),
+ ],
+ ),
+ VariableFontDescriptor(
+ name="TestRB_Wght",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(
+ name="Weight", userMinimum=400, userDefault=400, userMaximum=700
+ ),
+ ValueAxisSubsetDescriptor(name="Italic", userValue=0),
+ ],
+ ),
+ ],
+ )
+
+ assert_descriptors_equal(
+ doc.instances,
+ [
+ InstanceDescriptor(
+ filename="instances/instanceTest1.ufo",
+ path=posix(str((datadir / "instances/instanceTest1.ufo").resolve())),
+ name="instance.ufo1",
+ designLocation={"weight": 500.0, "width": 20.0},
+ familyName="InstanceFamilyName",
+ styleName="InstanceStyleName",
+ postScriptFontName="InstancePostscriptName",
+ styleMapFamilyName="InstanceStyleMapFamilyName",
+ styleMapStyleName="InstanceStyleMapStyleName",
+ localisedFamilyName={"fr": "Montserrat", "ja": "モンセラート"},
+ localisedStyleName={"fr": "Demigras", "ja": "半ば"},
+ localisedStyleMapFamilyName={
+ "de": "Montserrat Halbfett",
+ "ja": "モンセラート SemiBold",
+ },
+ localisedStyleMapStyleName={"de": "Standard"},
+ glyphs={"arrow": {"mute": True, "unicodes": [291, 292, 293]}},
+ lib={
+ "com.coolDesignspaceApp.binaryData": b"<binary gunk>",
+ "com.coolDesignspaceApp.specimenText": "Hamburgerwhatever",
+ },
+ ),
+ InstanceDescriptor(
+ filename="instances/instanceTest2.ufo",
+ path=posix(str((datadir / "instances/instanceTest2.ufo").resolve())),
+ name="instance.ufo2",
+ designLocation={"weight": 500.0, "width": (400.0, 300.0)},
+ familyName="InstanceFamilyName",
+ styleName="InstanceStyleName",
+ postScriptFontName="InstancePostscriptName",
+ styleMapFamilyName="InstanceStyleMapFamilyName",
+ styleMapStyleName="InstanceStyleMapStyleName",
+ glyphs={
+ "arrow": {
+ "unicodes": [101, 201, 301],
+ "note": "A note about this glyph",
+ "instanceLocation": {"weight": 120.0, "width": 100.0},
+ "masters": [
+ {
+ "font": "master.ufo1",
+ "location": {"weight": 20.0, "width": 20.0},
+ "glyphName": "BB",
+ },
+ {
+ "font": "master.ufo2",
+ "location": {"weight": 900.0, "width": 900.0},
+ "glyphName": "CC",
+ },
+ ],
+ },
+ "arrow2": {},
+ },
+ ),
+ InstanceDescriptor(
+ locationLabel="asdf",
+ ),
+ InstanceDescriptor(
+ designLocation={"weight": 600.0, "width": (401.0, 420.0)},
+ ),
+ InstanceDescriptor(
+ designLocation={"weight": 10.0, "Italic": 0.0},
+ userLocation={"width": 100.0},
+ ),
+ InstanceDescriptor(
+ userLocation={"weight": 300.0, "width": 130.0, "Italic": 1.0},
+ ),
+ ],
+ )
+
+
+def test_read_v5_document_decovar(datadir):
+ doc = DesignSpaceDocument.fromfile(datadir / "test_v5_decovar.designspace")
+
+ assert not doc.variableFonts
+
+ assert_descriptors_equal(
+ doc.axes,
+ [
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Inline", tag="BLDA"
+ ),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Shearded", tag="TRMD"
+ ),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Rounded Slab", tag="TRMC"
+ ),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Stripes", tag="SKLD"
+ ),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Worm Terminal", tag="TRML"
+ ),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Inline Skeleton", tag="SKLA"
+ ),
+ AxisDescriptor(
+ default=0,
+ maximum=1000,
+ minimum=0,
+ name="Open Inline Terminal",
+ tag="TRMF",
+ ),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Inline Terminal", tag="TRMK"
+ ),
+ AxisDescriptor(default=0, maximum=1000, minimum=0, name="Worm", tag="BLDB"),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Weight", tag="WMX2"
+ ),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Flared", tag="TRMB"
+ ),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Rounded", tag="TRMA"
+ ),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Worm Skeleton", tag="SKLB"
+ ),
+ AxisDescriptor(default=0, maximum=1000, minimum=0, name="Slab", tag="TRMG"),
+ AxisDescriptor(
+ default=0, maximum=1000, minimum=0, name="Bifurcated", tag="TRME"
+ ),
+ ],
+ )
+
+ assert_descriptors_equal(
+ doc.locationLabels,
+ [
+ LocationLabelDescriptor(name="Default", elidable=True, userLocation={}),
+ LocationLabelDescriptor(
+ name="Open", userLocation={"Inline": 1000}, labelNames={"de": "Offen"}
+ ),
+ LocationLabelDescriptor(name="Worm", userLocation={"Worm": 1000}),
+ LocationLabelDescriptor(
+ name="Checkered", userLocation={"Inline Skeleton": 1000}
+ ),
+ LocationLabelDescriptor(
+ name="Checkered Reverse", userLocation={"Inline Terminal": 1000}
+ ),
+ LocationLabelDescriptor(name="Striped", userLocation={"Stripes": 500}),
+ LocationLabelDescriptor(name="Rounded", userLocation={"Rounded": 1000}),
+ LocationLabelDescriptor(name="Flared", userLocation={"Flared": 1000}),
+ LocationLabelDescriptor(
+ name="Flared Open",
+ userLocation={"Inline Skeleton": 1000, "Flared": 1000},
+ ),
+ LocationLabelDescriptor(
+ name="Rounded Slab", userLocation={"Rounded Slab": 1000}
+ ),
+ LocationLabelDescriptor(name="Sheared", userLocation={"Shearded": 1000}),
+ LocationLabelDescriptor(
+ name="Bifurcated", userLocation={"Bifurcated": 1000}
+ ),
+ LocationLabelDescriptor(
+ name="Inline",
+ userLocation={"Inline Skeleton": 500, "Open Inline Terminal": 500},
+ ),
+ LocationLabelDescriptor(name="Slab", userLocation={"Slab": 1000}),
+ LocationLabelDescriptor(name="Contrast", userLocation={"Weight": 1000}),
+ LocationLabelDescriptor(
+ name="Fancy",
+ userLocation={"Inline Skeleton": 1000, "Flared": 1000, "Weight": 1000},
+ ),
+ LocationLabelDescriptor(
+ name="Mayhem",
+ userLocation={
+ "Inline Skeleton": 1000,
+ "Worm Skeleton": 1000,
+ "Rounded": 500,
+ "Flared": 500,
+ "Rounded Slab": 750,
+ "Bifurcated": 500,
+ "Open Inline Terminal": 250,
+ "Slab": 750,
+ "Inline Terminal": 250,
+ "Worm Terminal": 250,
+ "Weight": 750,
+ "Worm": 1000,
+ },
+ ),
+ ],
+ )
+
+ assert [i.locationLabel for i in doc.instances] == [
+ "Default",
+ "Open",
+ "Worm",
+ "Checkered",
+ "Checkered Reverse",
+ "Striped",
+ "Rounded",
+ "Flared",
+ "Flared Open",
+ "Rounded Slab",
+ "Sheared",
+ "Bifurcated",
+ "Inline",
+ "Slab",
+ "Contrast",
+ "Fancy",
+ "Mayhem",
+ ]
+
+
+def test_read_v5_document_discrete(datadir):
+ doc = DesignSpaceDocument.fromfile(datadir / "test_v5_discrete.designspace")
+
+ assert not doc.locationLabels
+ assert not doc.variableFonts
+
+ assert_descriptors_equal(
+ doc.axes,
+ [
+ DiscreteAxisDescriptor(
+ default=400,
+ values=[400, 700, 900],
+ name="Weight",
+ tag="wght",
+ axisLabels=[
+ AxisLabelDescriptor(
+ name="Regular",
+ userValue=400,
+ elidable=True,
+ linkedUserValue=700,
+ ),
+ AxisLabelDescriptor(name="Bold", userValue=700),
+ AxisLabelDescriptor(name="Black", userValue=900),
+ ],
+ ),
+ DiscreteAxisDescriptor(
+ default=100,
+ values=[75, 100],
+ name="Width",
+ tag="wdth",
+ axisLabels=[
+ AxisLabelDescriptor(name="Narrow", userValue=75),
+ AxisLabelDescriptor(name="Normal", userValue=100, elidable=True),
+ ],
+ ),
+ DiscreteAxisDescriptor(
+ default=0,
+ values=[0, 1],
+ name="Italic",
+ tag="ital",
+ axisLabels=[
+ AxisLabelDescriptor(
+ name="Roman", userValue=0, elidable=True, linkedUserValue=1
+ ),
+ AxisLabelDescriptor(name="Italic", userValue=1),
+ ],
+ ),
+ ],
+ )
+
+
+def test_read_v5_document_aktiv(datadir):
+ doc = DesignSpaceDocument.fromfile(datadir / "test_v5_aktiv.designspace")
+
+ assert not doc.locationLabels
+
+ assert_descriptors_equal(
+ doc.axes,
+ [
+ AxisDescriptor(
+ tag="wght",
+ name="Weight",
+ minimum=100,
+ default=400,
+ maximum=900,
+ map=[
+ (100, 22),
+ (200, 38),
+ (300, 57),
+ (400, 84),
+ (500, 98),
+ (600, 115),
+ (700, 133),
+ (800, 158),
+ (900, 185),
+ ],
+ axisOrdering=1,
+ axisLabels=[
+ AxisLabelDescriptor(name="Hair", userValue=100),
+ AxisLabelDescriptor(userValue=200, name="Thin"),
+ AxisLabelDescriptor(userValue=300, name="Light"),
+ AxisLabelDescriptor(
+ userValue=400,
+ name="Regular",
+ elidable=True,
+ linkedUserValue=700,
+ ),
+ AxisLabelDescriptor(userValue=500, name="Medium"),
+ AxisLabelDescriptor(userValue=600, name="SemiBold"),
+ AxisLabelDescriptor(userValue=700, name="Bold"),
+ AxisLabelDescriptor(userValue=800, name="XBold"),
+ AxisLabelDescriptor(userValue=900, name="Black"),
+ ],
+ ),
+ AxisDescriptor(
+ tag="wdth",
+ name="Width",
+ minimum=75,
+ default=100,
+ maximum=125,
+ axisOrdering=0,
+ axisLabels=[
+ AxisLabelDescriptor(name="Cd", userValue=75),
+ AxisLabelDescriptor(name="Normal", elidable=True, userValue=100),
+ AxisLabelDescriptor(name="Ex", userValue=125),
+ ],
+ ),
+ AxisDescriptor(
+ tag="ital",
+ name="Italic",
+ minimum=0,
+ default=0,
+ maximum=1,
+ axisOrdering=2,
+ axisLabels=[
+ AxisLabelDescriptor(
+ name="Upright", userValue=0, elidable=True, linkedUserValue=1
+ ),
+ AxisLabelDescriptor(name="Italic", userValue=1),
+ ],
+ ),
+ ],
+ )
+
+ assert_descriptors_equal(
+ doc.variableFonts,
+ [
+ VariableFontDescriptor(
+ name="AktivGroteskVF_WghtWdthItal",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(name="Weight"),
+ RangeAxisSubsetDescriptor(name="Width"),
+ RangeAxisSubsetDescriptor(name="Italic"),
+ ],
+ ),
+ VariableFontDescriptor(
+ name="AktivGroteskVF_WghtWdth",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(name="Weight"),
+ RangeAxisSubsetDescriptor(name="Width"),
+ ],
+ ),
+ VariableFontDescriptor(
+ name="AktivGroteskVF_Wght",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(name="Weight"),
+ ],
+ ),
+ VariableFontDescriptor(
+ name="AktivGroteskVF_Italics_WghtWdth",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(name="Weight"),
+ RangeAxisSubsetDescriptor(name="Width"),
+ ValueAxisSubsetDescriptor(name="Italic", userValue=1),
+ ],
+ ),
+ VariableFontDescriptor(
+ name="AktivGroteskVF_Italics_Wght",
+ axisSubsets=[
+ RangeAxisSubsetDescriptor(name="Weight"),
+ ValueAxisSubsetDescriptor(name="Italic", userValue=1),
+ ],
+ ),
+ ],
+ )
+
+
+@pytest.fixture
+def map_doc():
+ """Generate a document with a few axes to test the mapping functions"""
+ doc = DesignSpaceDocument()
+ doc.addAxis(
+ AxisDescriptor(
+ tag="wght",
+ name="Weight",
+ minimum=100,
+ maximum=900,
+ default=100,
+ map=[(100, 10), (900, 90)],
+ )
+ )
+ doc.addAxis(
+ AxisDescriptor(
+ tag="wdth",
+ name="Width",
+ minimum=75,
+ maximum=200,
+ default=100,
+ map=[(75, 7500), (100, 10000), (200, 20000)],
+ )
+ )
+ doc.addAxis(
+ AxisDescriptor(tag="CUST", name="Custom", minimum=1, maximum=2, default=1.5)
+ )
+ doc.addLocationLabel(
+ LocationLabelDescriptor(
+ name="Wonky", userLocation={"Weight": 800, "Custom": 1.2}
+ )
+ )
+ return doc
+
+
+def test_doc_location_map_forward(map_doc: DesignSpaceDocument):
+ assert map_doc.map_forward({"Weight": 400, "Width": 150, "Custom": 2}) == {
+ "Weight": 40,
+ "Width": 15000,
+ "Custom": 2,
+ }, "The mappings should be used to compute the design locations"
+ assert map_doc.map_forward({"Weight": 400}) == {
+ "Weight": 40,
+ "Width": 10000,
+ "Custom": 1.5,
+ }, "Missing user locations should be assumed equal to the axis's default"
+
+
+def test_doc_location_map_backward(map_doc: DesignSpaceDocument):
+ assert map_doc.map_backward({"Weight": 40, "Width": 15000, "Custom": 2}) == {
+ "Weight": 400,
+ "Width": 150,
+ "Custom": 2,
+ }, "The mappings should be used to compute the user locations"
+ assert map_doc.map_backward({"Weight": 40}) == {
+ "Weight": 400,
+ "Width": 100,
+ "Custom": 1.5,
+ }, "Missing design locations should be assumed equal to the axis's default"
+ assert map_doc.map_backward(
+ {"Weight": (40, 50), "Width": (15000, 100000), "Custom": (2, 1.5)}
+ ) == {
+ "Weight": 400,
+ "Width": 150,
+ "Custom": 2,
+ }, "Only the xvalue of anisotropic locations is used"
+
+
+def test_instance_location_from_label(map_doc):
+ inst = InstanceDescriptor(locationLabel="Wonky")
+ assert inst.getFullUserLocation(map_doc) == {
+ "Weight": 800,
+ "Width": 100,
+ "Custom": 1.2,
+ }, "an instance with a locationLabel uses the user location from that label, empty values on the label use axis defaults"
+ assert inst.getFullDesignLocation(map_doc) == {
+ "Weight": 80,
+ "Width": 10000,
+ "Custom": 1.2,
+ }, "an instance with a locationLabel computes the design location from that label, empty values on the label use axis defaults"
+
+ inst = InstanceDescriptor(locationLabel="Wonky", userLocation={"Width": 200})
+ assert inst.getFullUserLocation(map_doc) == {
+ "Weight": 800,
+ "Width": 100,
+ "Custom": 1.2,
+ }, "an instance with a locationLabel uses the user location from that label, other location values are ignored"
+ assert inst.getFullDesignLocation(map_doc) == {
+ "Weight": 80,
+ "Width": 10000,
+ "Custom": 1.2,
+ }, "an instance with a locationLabel computes the design location from that label, other location values are ignored"
+
+
+def test_instance_location_no_data(map_doc):
+ inst = InstanceDescriptor()
+ assert inst.getFullUserLocation(map_doc) == {
+ "Weight": 100,
+ "Width": 100,
+ "Custom": 1.5,
+ }, "an instance without any location data has the default user location"
+ assert inst.getFullDesignLocation(map_doc) == {
+ "Weight": 10,
+ "Width": 10000,
+ "Custom": 1.5,
+ }, "an instance without any location data has the default design location"
+
+
+def test_instance_location_design_first(map_doc):
+ inst = InstanceDescriptor(
+ designLocation={"Weight": (60, 61), "Width": 11000, "Custom": 1.2},
+ userLocation={"Weight": 700, "Width": 180, "Custom": 1.4},
+ )
+ assert inst.getFullUserLocation(map_doc) == {
+ "Weight": 600,
+ "Width": 110,
+ "Custom": 1.2,
+ }, "when both design and user location data are provided, design wins"
+ assert inst.getFullDesignLocation(map_doc) == {
+ "Weight": (60, 61),
+ "Width": 11000,
+ "Custom": 1.2,
+ }, "when both design and user location data are provided, design wins (incl. anisotropy)"
+
+
+def test_instance_location_mix(map_doc):
+ inst = InstanceDescriptor(
+ designLocation={"Weight": (60, 61)},
+ userLocation={"Width": 180},
+ )
+ assert inst.getFullUserLocation(map_doc) == {
+ "Weight": 600,
+ "Width": 180,
+ "Custom": 1.5,
+ }, "instance location is a mix of design and user locations"
+ assert inst.getFullDesignLocation(map_doc) == {
+ "Weight": (60, 61),
+ "Width": 18000,
+ "Custom": 1.5,
+ }, "instance location is a mix of design and user location"
+
+
+@pytest.mark.parametrize(
+ "filename",
+ [
+ "test_v4_original.designspace",
+ "test_v5_original.designspace",
+ "test_v5_aktiv.designspace",
+ "test_v5_decovar.designspace",
+ "test_v5_discrete.designspace",
+ "test_v5_sourceserif.designspace",
+ "test_v5.designspace",
+ ],
+)
+def test_roundtrip(tmpdir, datadir, filename):
+ test_file = datadir / filename
+ output_path = tmpdir / filename
+ # Move the file to the tmpdir so that the filenames stay the same
+ # (they're relative to the file's path)
+ shutil.copy(test_file, output_path)
+ doc = DesignSpaceDocument.fromfile(output_path)
+ doc.write(output_path)
+ # The input XML has comments and empty lines for documentation purposes
+ xml = test_file.read_text(encoding="utf-8")
+ xml = re.sub(
+ r"<!-- ROUNDTRIP_TEST_REMOVE_ME_BEGIN -->(.|\n)*?<!-- ROUNDTRIP_TEST_REMOVE_ME_END -->",
+ "",
+ xml,
+ )
+ xml = re.sub(r"<!--(.|\n)*?-->", "", xml)
+ xml = re.sub(r"\s*\n+", "\n", xml)
+ assert output_path.read_text(encoding="utf-8") == xml
+
+
+def test_using_v5_features_upgrades_format(tmpdir, datadir):
+ test_file = datadir / "test_v4_original.designspace"
+ output_4_path = tmpdir / "test_v4.designspace"
+ output_5_path = tmpdir / "test_v5.designspace"
+ shutil.copy(test_file, output_4_path)
+ doc = DesignSpaceDocument.fromfile(output_4_path)
+ doc.write(output_4_path)
+ assert 'format="4.1"' in output_4_path.read_text(encoding="utf-8")
+ doc.addVariableFont(VariableFontDescriptor(name="TestVF"))
+ doc.write(output_5_path)
+ assert 'format="5.0"' in output_5_path.read_text(encoding="utf-8")
+
+
+def test_addAxisDescriptor_discrete():
+ ds = DesignSpaceDocument()
+
+ axis = ds.addAxisDescriptor(
+ name="Italic",
+ tag="ital",
+ values=[0, 1],
+ default=0,
+ hidden=True,
+ map=[(0, -12), (1, 0)],
+ axisOrdering=3,
+ axisLabels=[
+ AxisLabelDescriptor(
+ name="Roman",
+ userValue=0,
+ elidable=True,
+ olderSibling=True,
+ linkedUserValue=1,
+ labelNames={"fr": "Romain"},
+ )
+ ],
+ )
+
+ assert ds.axes[0] is axis
+ assert_descriptors_equal(
+ [axis],
+ [
+ DiscreteAxisDescriptor(
+ tag="ital",
+ name="Italic",
+ values=[0, 1],
+ default=0,
+ hidden=True,
+ map=[(0, -12), (1, 0)],
+ axisOrdering=3,
+ axisLabels=[
+ AxisLabelDescriptor(
+ name="Roman",
+ userValue=0,
+ elidable=True,
+ olderSibling=True,
+ linkedUserValue=1,
+ labelNames={"fr": "Romain"},
+ )
+ ],
+ )
+ ],
+ )
+
+
+def test_addLocationLabelDescriptor():
+ ds = DesignSpaceDocument()
+
+ label = ds.addLocationLabelDescriptor(
+ name="Somewhere",
+ userLocation={},
+ elidable=True,
+ olderSibling=True,
+ labelNames={"fr": "Quelque part"},
+ )
+
+ assert ds.locationLabels[0] is label
+ assert_descriptors_equal(
+ [label],
+ [
+ LocationLabelDescriptor(
+ name="Somewhere",
+ userLocation={},
+ elidable=True,
+ olderSibling=True,
+ labelNames={"fr": "Quelque part"},
+ )
+ ],
+ )
+
+
+def test_addVariableFontDescriptor():
+ ds = DesignSpaceDocument()
+
+ vf = ds.addVariableFontDescriptor(name="TestVF", filename="TestVF.ttf")
+
+ assert ds.variableFonts[0] is vf
+ assert_descriptors_equal(
+ [vf], [VariableFontDescriptor(name="TestVF", filename="TestVF.ttf")]
+ )
diff --git a/Tests/designspaceLib/fixtures.py b/Tests/designspaceLib/fixtures.py
new file mode 100644
index 00000000..66041bed
--- /dev/null
+++ b/Tests/designspaceLib/fixtures.py
@@ -0,0 +1,8 @@
+from pathlib import Path
+
+import pytest
+
+
+@pytest.fixture
+def datadir():
+ return Path(__file__).parent / "data"
diff --git a/Tests/designspaceLib/split_test.py b/Tests/designspaceLib/split_test.py
new file mode 100644
index 00000000..8708f704
--- /dev/null
+++ b/Tests/designspaceLib/split_test.py
@@ -0,0 +1,150 @@
+import shutil
+from pathlib import Path
+
+import pytest
+from fontTools.designspaceLib import DesignSpaceDocument
+from fontTools.designspaceLib.split import splitInterpolable, splitVariableFonts, convert5to4
+
+from .fixtures import datadir
+
+UPDATE_REFERENCE_OUT_FILES_INSTEAD_OF_TESTING = False
+
+
+@pytest.mark.parametrize(
+ "test_ds,expected_interpolable_spaces",
+ [
+ (
+ "test_v5_aktiv.designspace",
+ [
+ (
+ {},
+ {
+ "AktivGroteskVF_Italics_Wght",
+ "AktivGroteskVF_Italics_WghtWdth",
+ "AktivGroteskVF_Wght",
+ "AktivGroteskVF_WghtWdth",
+ "AktivGroteskVF_WghtWdthItal",
+ },
+ )
+ ],
+ ),
+ (
+ "test_v5_sourceserif.designspace",
+ [
+ (
+ {"italic": 0},
+ {"SourceSerif4Variable-Roman"},
+ ),
+ (
+ {"italic": 1},
+ {"SourceSerif4Variable-Italic"},
+ ),
+ ],
+ ),
+ (
+ "test_v5_MutatorSans_and_Serif.designspace",
+ [
+ (
+ {"serif": 0},
+ {
+ "MutatorSansVariable_Weight_Width",
+ "MutatorSansVariable_Weight",
+ "MutatorSansVariable_Width",
+ },
+ ),
+ (
+ {"serif": 1},
+ {
+ "MutatorSerifVariable_Width",
+ },
+ ),
+ ],
+ ),
+ ],
+)
+def test_split(datadir, tmpdir, test_ds, expected_interpolable_spaces):
+ data_in = datadir / test_ds
+ temp_in = Path(tmpdir) / test_ds
+ shutil.copy(data_in, temp_in)
+ doc = DesignSpaceDocument.fromfile(temp_in)
+
+ for i, (location, sub_doc) in enumerate(splitInterpolable(doc)):
+ expected_location, expected_vf_names = expected_interpolable_spaces[i]
+ assert location == expected_location
+ vfs = list(splitVariableFonts(sub_doc))
+ assert expected_vf_names == set(vf[0] for vf in vfs)
+
+ loc_str = "_".join(f"{name}_{value}"for name, value in sorted(location.items()))
+ data_out = datadir / "split_output" / f"{temp_in.stem}_{loc_str}.designspace"
+ temp_out = Path(tmpdir) / "out" / f"{temp_in.stem}_{loc_str}.designspace"
+ temp_out.parent.mkdir(exist_ok=True)
+ sub_doc.write(temp_out)
+
+ if UPDATE_REFERENCE_OUT_FILES_INSTEAD_OF_TESTING:
+ data_out.write_text(temp_out.read_text(encoding="utf-8"), encoding="utf-8")
+ else:
+ assert data_out.read_text(encoding="utf-8") == temp_out.read_text(
+ encoding="utf-8"
+ )
+
+ for vf_name, vf_doc in vfs:
+ data_out = (datadir / "split_output" / vf_name).with_suffix(".designspace")
+ temp_out = (Path(tmpdir) / "out" / vf_name).with_suffix(".designspace")
+ temp_out.parent.mkdir(exist_ok=True)
+ vf_doc.write(temp_out)
+
+ if UPDATE_REFERENCE_OUT_FILES_INSTEAD_OF_TESTING:
+ data_out.write_text(
+ temp_out.read_text(encoding="utf-8"), encoding="utf-8"
+ )
+ else:
+ assert data_out.read_text(encoding="utf-8") == temp_out.read_text(
+ encoding="utf-8"
+ )
+
+
+
+
+@pytest.mark.parametrize(
+ "test_ds,expected_vfs",
+ [
+ (
+ "test_v5_aktiv.designspace",
+ {
+ "AktivGroteskVF_Italics_Wght",
+ "AktivGroteskVF_Italics_WghtWdth",
+ "AktivGroteskVF_Wght",
+ "AktivGroteskVF_WghtWdth",
+ "AktivGroteskVF_WghtWdthItal",
+ },
+ ),
+ (
+ "test_v5_sourceserif.designspace",
+ {
+ "SourceSerif4Variable-Italic",
+ "SourceSerif4Variable-Roman",
+ },
+ ),
+ ],
+)
+def test_convert5to4(datadir, tmpdir, test_ds, expected_vfs):
+ data_in = datadir / test_ds
+ temp_in = tmpdir / test_ds
+ shutil.copy(data_in, temp_in)
+ doc = DesignSpaceDocument.fromfile(temp_in)
+
+ variable_fonts = convert5to4(doc)
+
+ assert variable_fonts.keys() == expected_vfs
+ for vf_name, vf in variable_fonts.items():
+ data_out = (datadir / "convert5to4_output" / vf_name).with_suffix(".designspace")
+ temp_out = (Path(tmpdir) / "out" / vf_name).with_suffix(".designspace")
+ temp_out.parent.mkdir(exist_ok=True)
+ vf.write(temp_out)
+
+ if UPDATE_REFERENCE_OUT_FILES_INSTEAD_OF_TESTING:
+ data_out.write_text(temp_out.read_text(encoding="utf-8"), encoding="utf-8")
+ else:
+ assert data_out.read_text(encoding="utf-8") == temp_out.read_text(
+ encoding="utf-8"
+ )
diff --git a/Tests/designspaceLib/statNames_test.py b/Tests/designspaceLib/statNames_test.py
new file mode 100644
index 00000000..076abc90
--- /dev/null
+++ b/Tests/designspaceLib/statNames_test.py
@@ -0,0 +1,61 @@
+from fontTools.designspaceLib import DesignSpaceDocument
+from fontTools.designspaceLib.statNames import StatNames, getStatNames
+
+from .fixtures import datadir
+
+
+def test_instance_getStatNames(datadir):
+ doc = DesignSpaceDocument.fromfile(datadir / "test_v5_sourceserif.designspace")
+
+ assert getStatNames(doc, doc.instances[0].getFullUserLocation(doc)) == StatNames(
+ familyNames={"en": "Source Serif 4"},
+ styleNames={"en": "Caption ExtraLight"},
+ postScriptFontName="SourceSerif4-CaptionExtraLight",
+ styleMapFamilyNames={"en": "Source Serif 4 Caption ExtraLight"},
+ styleMapStyleName="regular",
+ )
+
+
+def test_not_all_ordering_specified_and_translations(datadir):
+ doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
+
+ assert getStatNames(doc, {"weight": 200, "width": 125, "Italic": 1}) == StatNames(
+ familyNames={
+ "en": "MasterFamilyName",
+ "fr": "Montserrat",
+ "ja": "モンセラート",
+ },
+ styleNames={
+ "fr": "Wide Extra léger Italic",
+ "de": "Wide Extraleicht Italic",
+ "en": "Wide Extra Light Italic",
+ },
+ postScriptFontName="MasterFamilyName-WideExtraLightItalic",
+ styleMapFamilyNames={
+ "en": "MasterFamilyName Wide Extra Light",
+ "fr": "Montserrat Wide Extra léger",
+ "de": "MasterFamilyName Wide Extraleicht",
+ "ja": "モンセラート Wide Extra Light",
+ },
+ styleMapStyleName="italic",
+ )
+
+
+def test_detect_ribbi_aktiv(datadir):
+ doc = DesignSpaceDocument.fromfile(datadir / "test_v5_aktiv.designspace")
+
+ assert getStatNames(doc, {"Weight": 600, "Width": 125, "Italic": 1}) == StatNames(
+ familyNames={"en": "Aktiv Grotesk"},
+ styleNames={"en": "Ex SemiBold Italic"},
+ postScriptFontName="AktivGrotesk-ExSemiBoldItalic",
+ styleMapFamilyNames={"en": "Aktiv Grotesk Ex SemiBold"},
+ styleMapStyleName="italic",
+ )
+
+ assert getStatNames(doc, {"Weight": 700, "Width": 75, "Italic": 1}) == StatNames(
+ familyNames={"en": "Aktiv Grotesk"},
+ styleNames={"en": "Cd Bold Italic"},
+ postScriptFontName="AktivGrotesk-CdBoldItalic",
+ styleMapFamilyNames={"en": "Aktiv Grotesk Cd"},
+ styleMapStyleName="bold italic",
+ )
diff --git a/Tests/feaLib/data/spec6h_ii.ttx b/Tests/feaLib/data/spec6h_ii.ttx
index 2f0efc6f..e8ec85f2 100644
--- a/Tests/feaLib/data/spec6h_ii.ttx
+++ b/Tests/feaLib/data/spec6h_ii.ttx
@@ -112,23 +112,25 @@
</MarkBasePos>
</Lookup>
<Lookup index="2">
- <LookupType value="7"/>
+ <LookupType value="8"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
- <ContextPos index="0" Format="3">
- <!-- GlyphCount=3 -->
- <!-- PosCount=2 -->
- <Coverage index="0">
+ <ChainContextPos index="0" Format="3">
+ <!-- BacktrackGlyphCount=0 -->
+ <!-- InputGlyphCount=3 -->
+ <InputCoverage index="0">
<Glyph value="T"/>
- </Coverage>
- <Coverage index="1">
+ </InputCoverage>
+ <InputCoverage index="1">
<Glyph value="c"/>
<Glyph value="o"/>
- </Coverage>
- <Coverage index="2">
+ </InputCoverage>
+ <InputCoverage index="2">
<Glyph value="grave"/>
<Glyph value="acute"/>
- </Coverage>
+ </InputCoverage>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- PosCount=2 -->
<PosLookupRecord index="0">
<SequenceIndex value="0"/>
<LookupListIndex value="0"/>
@@ -137,7 +139,7 @@
<SequenceIndex value="2"/>
<LookupListIndex value="1"/>
</PosLookupRecord>
- </ContextPos>
+ </ChainContextPos>
</Lookup>
</LookupList>
</GPOS>
diff --git a/Tests/feaLib/data/spec6h_iii_3d.ttx b/Tests/feaLib/data/spec6h_iii_3d.ttx
index 2335dd0b..a608f0e6 100644
--- a/Tests/feaLib/data/spec6h_iii_3d.ttx
+++ b/Tests/feaLib/data/spec6h_iii_3d.ttx
@@ -30,23 +30,25 @@
<LookupList>
<!-- LookupCount=2 -->
<Lookup index="0">
- <LookupType value="7"/>
+ <LookupType value="8"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
- <ContextPos index="0" Format="3">
- <!-- GlyphCount=2 -->
- <!-- PosCount=1 -->
- <Coverage index="0">
+ <ChainContextPos index="0" Format="3">
+ <!-- BacktrackGlyphCount=0 -->
+ <!-- InputGlyphCount=2 -->
+ <InputCoverage index="0">
<Glyph value="L"/>
- </Coverage>
- <Coverage index="1">
+ </InputCoverage>
+ <InputCoverage index="1">
<Glyph value="quoteright"/>
- </Coverage>
+ </InputCoverage>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- PosCount=1 -->
<PosLookupRecord index="0">
<SequenceIndex value="1"/>
<LookupListIndex value="1"/>
</PosLookupRecord>
- </ContextPos>
+ </ChainContextPos>
</Lookup>
<Lookup index="1">
<LookupType value="1"/>
diff --git a/Tests/fontBuilder/fontBuilder_test.py b/Tests/fontBuilder/fontBuilder_test.py
index 6368cb87..775e94d9 100644
--- a/Tests/fontBuilder/fontBuilder_test.py
+++ b/Tests/fontBuilder/fontBuilder_test.py
@@ -1,13 +1,13 @@
import os
import pytest
-import re
from fontTools.ttLib import TTFont
from fontTools.pens.ttGlyphPen import TTGlyphPen
from fontTools.pens.t2CharStringPen import T2CharStringPen
from fontTools.fontBuilder import FontBuilder
from fontTools.ttLib.tables.TupleVariation import TupleVariation
from fontTools.misc.psCharStrings import T2CharString
+from fontTools.misc.testTools import stripVariableItemsFromTTX
def getTestData(fileName, mode="r"):
@@ -16,16 +16,6 @@ def getTestData(fileName, mode="r"):
return f.read()
-def strip_VariableItems(string):
- # ttlib changes with the fontTools version
- string = re.sub(' ttLibVersion=".*"', '', string)
- # head table checksum and creation and mod date changes with each save.
- string = re.sub('<checkSumAdjustment value="[^"]+"/>', '', string)
- string = re.sub('<modified value="[^"]+"/>', '', string)
- string = re.sub('<created value="[^"]+"/>', '', string)
- return string
-
-
def drawTestGlyph(pen):
pen.moveTo((100, 100))
pen.lineTo((100, 1000))
@@ -91,8 +81,8 @@ def _verifyOutput(outPath, tables=None):
f = TTFont(outPath)
f.saveXML(outPath + ".ttx", tables=tables)
with open(outPath + ".ttx") as f:
- testData = strip_VariableItems(f.read())
- refData = strip_VariableItems(getTestData(os.path.basename(outPath) + ".ttx"))
+ testData = stripVariableItemsFromTTX(f.read())
+ refData = stripVariableItemsFromTTX(getTestData(os.path.basename(outPath) + ".ttx"))
assert refData == testData
diff --git a/Tests/merge/data/CFFFont_expected.ttx b/Tests/merge/data/CFFFont_expected.ttx
index 6e0acc22..c8870e44 100644
--- a/Tests/merge/data/CFFFont_expected.ttx
+++ b/Tests/merge/data/CFFFont_expected.ttx
@@ -834,7 +834,7 @@
<!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
will be recalculated by the compiler -->
<version value="4"/>
- <xAvgCharWidth value="505"/>
+ <xAvgCharWidth value="501"/>
<usWeightClass value="400"/>
<usWidthClass value="5"/>
<fsType value="00000000 00000000"/>
diff --git a/Tests/misc/configTools_test.py b/Tests/misc/configTools_test.py
new file mode 100644
index 00000000..94afb233
--- /dev/null
+++ b/Tests/misc/configTools_test.py
@@ -0,0 +1,80 @@
+import dataclasses
+import pytest
+
+from fontTools.misc.configTools import (
+ AbstractConfig,
+ Option,
+ Options,
+ ConfigUnknownOptionError,
+)
+
+
+def test_can_create_custom_config_system():
+ class MyConfig(AbstractConfig):
+ options = Options()
+
+ MyConfig.register_option(
+ "test:option_name",
+ "This is an option",
+ 0,
+ int,
+ lambda v: isinstance(v, int),
+ )
+
+ cfg = MyConfig({"test:option_name": "10"}, parse_values=True)
+
+ assert 10 == cfg["test:option_name"]
+
+ # This config is independent from "the" fontTools config
+ with pytest.raises(ConfigUnknownOptionError):
+ MyConfig({"fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL": 4})
+
+ # Test the repr()
+ assert repr(cfg) == "MyConfig({'test:option_name': 10})"
+
+ # Test the skip_unknown param: just check that the following does not raise
+ MyConfig({"test:unknown": "whatever"}, skip_unknown=True)
+
+ # Test that it raises on unknown option
+ with pytest.raises(ConfigUnknownOptionError):
+ cfg.get("test:unknown")
+
+
+def test_options_are_unique():
+ class MyConfig(AbstractConfig):
+ options = Options()
+
+ opt1 = MyConfig.register_option("test:OPT_1", "", "foo", str, any)
+ cfg = MyConfig({opt1: "bar"})
+ assert cfg[opt1] == "bar"
+
+ opt2 = Option("test:OPT_1", "", "foo", str, any)
+
+ assert dataclasses.asdict(opt1) == dataclasses.asdict(opt2)
+ assert opt1 != opt2
+
+ with pytest.raises(ConfigUnknownOptionError):
+ cfg.get(opt2)
+ with pytest.raises(ConfigUnknownOptionError):
+ cfg.set(opt2, "bar")
+
+
+def test_optional_bool():
+ for v in ("yes", "YES", "Yes", "1", "True", "true", "TRUE"):
+ assert Option.parse_optional_bool(v) is True
+
+ for v in ("no", "NO", "No", "0", "False", "false", "FALSE"):
+ assert Option.parse_optional_bool(v) is False
+
+ for v in ("auto", "AUTO", "Auto", "None", "none", "NONE"):
+ assert Option.parse_optional_bool(v) is None
+
+ with pytest.raises(ValueError, match="invalid optional bool"):
+ Option.parse_optional_bool("foobar")
+
+ assert Option.validate_optional_bool(True)
+ assert Option.validate_optional_bool(False)
+ assert Option.validate_optional_bool(None)
+ assert not Option.validate_optional_bool(1)
+ assert not Option.validate_optional_bool(0)
+ assert not Option.validate_optional_bool("1")
diff --git a/Tests/misc/psCharStrings_test.py b/Tests/misc/psCharStrings_test.py
index 47ff4fda..5e36fe73 100644
--- a/Tests/misc/psCharStrings_test.py
+++ b/Tests/misc/psCharStrings_test.py
@@ -8,6 +8,7 @@ from fontTools.misc.psCharStrings import (
read_fixed1616,
read_realNumber,
)
+from fontTools.pens.recordingPen import RecordingPen
import unittest
@@ -158,6 +159,14 @@ class T2CharStringTest(unittest.TestCase):
self.assertNotIsInstance(expected_arg, str)
self.assertAlmostEqual(arg, expected_arg)
+ def test_pen_closePath(self):
+ # Test CFF2/T2 charstring: it does NOT end in "endchar"
+ # https://github.com/fonttools/fonttools/issues/2455
+ cs = self.stringToT2CharString("100 100 rmoveto -50 -150 200 0 -50 150 rrcurveto")
+ pen = RecordingPen()
+ cs.draw(pen)
+ self.assertEqual(pen.value[-1], ('closePath', ()))
+
if __name__ == "__main__":
import sys
diff --git a/Tests/otlLib/optimize_test.py b/Tests/otlLib/optimize_test.py
index 40cf389e..a2e43322 100644
--- a/Tests/otlLib/optimize_test.py
+++ b/Tests/otlLib/optimize_test.py
@@ -1,17 +1,15 @@
+import contextlib
import logging
+import os
from pathlib import Path
from subprocess import run
-import contextlib
-import os
from typing import List, Optional, Tuple
-from fontTools.ttLib import TTFont
import pytest
-
from fontTools.feaLib.builder import addOpenTypeFeaturesFromString
from fontTools.fontBuilder import FontBuilder
-
-from fontTools.ttLib.tables.otBase import OTTableWriter, ValueRecord
+from fontTools.ttLib import TTFont
+from fontTools.ttLib.tables.otBase import OTTableWriter
def test_main(tmpdir: Path):
@@ -34,7 +32,7 @@ def test_main(tmpdir: Path):
[
"fonttools",
"otlLib.optimize",
- "--gpos-compact-mode",
+ "--gpos-compression-level",
"5",
str(input),
"-o",
@@ -127,9 +125,9 @@ def get_kerning_by_blocks(blocks: List[Tuple[int, int]]) -> Tuple[List[str], str
@pytest.mark.parametrize(
- ("blocks", "mode", "expected_subtables", "expected_bytes"),
+ ("blocks", "level", "expected_subtables", "expected_bytes"),
[
- # Mode = 0 = no optimization leads to 650 bytes of GPOS
+ # Level = 0 = no optimization leads to 650 bytes of GPOS
([(15, 3), (2, 10)], None, 1, 602),
# Optimization level 1 recognizes the 2 blocks and splits into 2
# subtables = adds 1 subtable leading to a size reduction of
@@ -143,13 +141,13 @@ def get_kerning_by_blocks(blocks: List[Tuple[int, int]]) -> Tuple[List[str], str
([(4, 4) for _ in range(20)], 9, 20, 1886),
# On a fully occupied kerning matrix, even the strategy 9 doesn't
# split anything.
- ([(10, 10)], 9, 1, 304)
+ ([(10, 10)], 9, 1, 304),
],
)
def test_optimization_mode(
caplog,
blocks: List[Tuple[int, int]],
- mode: Optional[int],
+ level: Optional[int],
expected_subtables: int,
expected_bytes: int,
):
@@ -161,15 +159,10 @@ def test_optimization_mode(
glyphs, features = get_kerning_by_blocks(blocks)
glyphs = [".notdef space"] + glyphs
- env = {}
- if mode is not None:
- # NOTE: activating this optimization via the environment variable is
- # experimental and may not be supported once an alternative mechanism
- # is in place. See: https://github.com/fonttools/fonttools/issues/2349
- env["FONTTOOLS_GPOS_COMPACT_MODE"] = str(mode)
- with set_env(**env):
- fb = FontBuilder(1000)
- fb.setupGlyphOrder(glyphs)
- addOpenTypeFeaturesFromString(fb.font, features)
- assert expected_subtables == count_pairpos_subtables(fb.font)
- assert expected_bytes == count_pairpos_bytes(fb.font)
+ fb = FontBuilder(1000)
+ if level is not None:
+ fb.font.cfg["fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL"] = level
+ fb.setupGlyphOrder(glyphs)
+ addOpenTypeFeaturesFromString(fb.font, features)
+ assert expected_subtables == count_pairpos_subtables(fb.font)
+ assert expected_bytes == count_pairpos_bytes(fb.font)
diff --git a/Tests/subset/data/expect_harfbuzz_repacker.ttx b/Tests/subset/data/expect_harfbuzz_repacker.ttx
new file mode 100644
index 00000000..aeebe7ba
--- /dev/null
+++ b/Tests/subset/data/expect_harfbuzz_repacker.ttx
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" ttLibVersion="4.29">
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=2 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="hang"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="1"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=2 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="aalt"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="1">
+ <FeatureTag value="jp90"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="1"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=2 -->
+ <Lookup index="0">
+ <LookupType value="3"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <AlternateSubst index="0">
+ <AlternateSet glyph="cid12223">
+ <Alternate glyph="cid62031"/>
+ <Alternate glyph="cid62033"/>
+ <Alternate glyph="cid61789"/>
+ </AlternateSet>
+ <AlternateSet glyph="cid61789">
+ <Alternate glyph="cid62031"/>
+ <Alternate glyph="cid62033"/>
+ <Alternate glyph="cid12223"/>
+ </AlternateSet>
+ </AlternateSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0">
+ <Substitution in="cid12223" out="cid61789"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+</ttFont>
diff --git a/Tests/subset/data/expect_lcar_0.ttx b/Tests/subset/data/expect_lcar_0.ttx
index feb866d7..0edcaa11 100644
--- a/Tests/subset/data/expect_lcar_0.ttx
+++ b/Tests/subset/data/expect_lcar_0.ttx
@@ -12,5 +12,5 @@
</Carets>
</LigatureCarets>
</lcar>
-
+
</ttFont>
diff --git a/Tests/subset/data/expect_lcar_1.ttx b/Tests/subset/data/expect_lcar_1.ttx
index 26b50082..72b4aabc 100644
--- a/Tests/subset/data/expect_lcar_1.ttx
+++ b/Tests/subset/data/expect_lcar_1.ttx
@@ -12,5 +12,5 @@
</Carets>
</LigatureCarets>
</lcar>
-
+
</ttFont>
diff --git a/Tests/subset/data/expect_opbd_0.ttx b/Tests/subset/data/expect_opbd_0.ttx
index 55842a01..3f6c4199 100644
--- a/Tests/subset/data/expect_opbd_0.ttx
+++ b/Tests/subset/data/expect_opbd_0.ttx
@@ -14,5 +14,5 @@
</OpticalBoundsDeltas>
</OpticalBounds>
</opbd>
-
+
</ttFont>
diff --git a/Tests/subset/data/expect_opbd_1.ttx b/Tests/subset/data/expect_opbd_1.ttx
index 080abd91..7b40401b 100644
--- a/Tests/subset/data/expect_opbd_1.ttx
+++ b/Tests/subset/data/expect_opbd_1.ttx
@@ -14,5 +14,5 @@
</OpticalBoundsPoints>
</OpticalBounds>
</opbd>
-
+
</ttFont>
diff --git a/Tests/subset/data/expect_prop_0.ttx b/Tests/subset/data/expect_prop_0.ttx
index f8ca1509..64201e12 100644
--- a/Tests/subset/data/expect_prop_0.ttx
+++ b/Tests/subset/data/expect_prop_0.ttx
@@ -7,5 +7,5 @@
<DefaultProperties value="3"/>
</GlyphProperties>
</prop>
-
+
</ttFont>
diff --git a/Tests/subset/data/expect_prop_1.ttx b/Tests/subset/data/expect_prop_1.ttx
index f7f2d23c..a582ac21 100644
--- a/Tests/subset/data/expect_prop_1.ttx
+++ b/Tests/subset/data/expect_prop_1.ttx
@@ -10,5 +10,5 @@
</Properties>
</GlyphProperties>
</prop>
-
+
</ttFont>
diff --git a/Tests/subset/data/harfbuzz_repacker.ttx b/Tests/subset/data/harfbuzz_repacker.ttx
new file mode 100644
index 00000000..667d8687
--- /dev/null
+++ b/Tests/subset/data/harfbuzz_repacker.ttx
@@ -0,0 +1,1542 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="OTTO" ttLibVersion="4.29">
+
+ <GlyphOrder>
+ <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="cid12223"/>
+ <GlyphID id="2" name="cid12224"/>
+ <GlyphID id="3" name="cid12342"/>
+ <GlyphID id="4" name="cid15450"/>
+ <GlyphID id="5" name="cid15451"/>
+ <GlyphID id="6" name="cid15452"/>
+ <GlyphID id="7" name="cid18153"/>
+ <GlyphID id="8" name="cid18154"/>
+ <GlyphID id="9" name="cid18155"/>
+ <GlyphID id="10" name="cid59592"/>
+ <GlyphID id="11" name="cid59593"/>
+ <GlyphID id="12" name="cid61789"/>
+ <GlyphID id="13" name="cid61811"/>
+ <GlyphID id="14" name="cid62031"/>
+ <GlyphID id="15" name="cid62032"/>
+ <GlyphID id="16" name="cid62033"/>
+ <GlyphID id="17" name="cid62034"/>
+ <GlyphID id="18" name="cid62039"/>
+ <GlyphID id="19" name="cid62104"/>
+ <GlyphID id="20" name="cid62105"/>
+ <GlyphID id="21" name="cid62172"/>
+ </GlyphOrder>
+
+ <head>
+ <!-- Most of this table will be recalculated by the compiler -->
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.004"/>
+ <checkSumAdjustment value="0x96aa8849"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Mon Jun 15 05:06:56 2015"/>
+ <modified value="Sat Mar 5 04:13:07 2022"/>
+ <xMin value="30"/>
+ <yMin value="-82"/>
+ <xMax value="972"/>
+ <yMax value="838"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="3"/>
+ <fontDirectionHint value="2"/>
+ <indexToLocFormat value="0"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x00010000"/>
+ <ascent value="1160"/>
+ <descent value="-320"/>
+ <lineGap value="0"/>
+ <advanceWidthMax value="1000"/>
+ <minLeftSideBearing value="30"/>
+ <minRightSideBearing value="28"/>
+ <xMaxExtent value="972"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfHMetrics value="1"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x5000"/>
+ <numGlyphs value="22"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="979"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00000000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="325"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="2"/>
+ <bSerifStyle value="11"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange2 value="00001000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="GOOG"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="21417"/>
+ <usLastCharIndex value="24674"/>
+ <sTypoAscender value="880"/>
+ <sTypoDescender value="-120"/>
+ <sTypoLineGap value="0"/>
+ <usWinAscent value="1160"/>
+ <usWinDescent value="320"/>
+ <ulCodePageRange1 value="01100000 00101110 00000001 00000111"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="543"/>
+ <sCapHeight value="733"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="6"/>
+ </OS_2>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright © 2014, 2015 Adobe Systems Incorporated (http://www.adobe.com/).
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans CJK JP Regular
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+ 1.004;GOOG;NotoSansCJKjp-Regular;ADOBE
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Noto Sans CJK JP Regular
+ </namerecord>
+ <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+ Version 1.004;PS 1.004;hotconv 1.0.82;makeotf.lib2.5.63406
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ NotoSansCJKjp-Regular
+ </namerecord>
+ </name>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="0" platEncID="3" language="0">
+ <map code="0x53a9" name="cid12223"/><!-- CJK UNIFIED IDEOGRAPH-53A9 -->
+ <map code="0x53f1" name="cid12342"/><!-- CJK UNIFIED IDEOGRAPH-53F1 -->
+ <map code="0x5abe" name="cid15450"/><!-- CJK UNIFIED IDEOGRAPH-5ABE -->
+ <map code="0x6062" name="cid18153"/><!-- CJK UNIFIED IDEOGRAPH-6062 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="0" platEncID="4" format="12" reserved="0" length="64" language="0" nGroups="4">
+ <map code="0x53a9" name="cid12223"/><!-- CJK UNIFIED IDEOGRAPH-53A9 -->
+ <map code="0x53f1" name="cid12342"/><!-- CJK UNIFIED IDEOGRAPH-53F1 -->
+ <map code="0x5abe" name="cid15450"/><!-- CJK UNIFIED IDEOGRAPH-5ABE -->
+ <map code="0x6062" name="cid18153"/><!-- CJK UNIFIED IDEOGRAPH-6062 -->
+ </cmap_format_12>
+ <cmap_format_14 platformID="0" platEncID="5">
+ <map uv="0x53f1" uvs="0xe0100"/>
+ <map uv="0x5abe" uvs="0xe0100"/>
+ <map uv="0x53a9" uvs="0xe0100" name="cid61789"/>
+ <map uv="0x6062" uvs="0xe0100" name="cid61811"/>
+ <map uv="0x53a9" uvs="0xe0101" name="cid62031"/>
+ <map uv="0x53f1" uvs="0xe0101" name="cid62039"/>
+ <map uv="0x5abe" uvs="0xe0101" name="cid62104"/>
+ <map uv="0x6062" uvs="0xe0101" name="cid62172"/>
+ <map uv="0x6062" uvs="0xe0102"/>
+ <map uv="0x53a9" uvs="0xe0102" name="cid62032"/>
+ <map uv="0x5abe" uvs="0xe0102" name="cid62105"/>
+ <map uv="0x53a9" uvs="0xe0103" name="cid62033"/>
+ <map uv="0x53a9" uvs="0xe0104" name="cid62034"/>
+ <map uv="0x53a9" uvs="0xe0105"/>
+ </cmap_format_14>
+ <cmap_format_4 platformID="3" platEncID="1" language="0">
+ <map code="0x53a9" name="cid12223"/><!-- CJK UNIFIED IDEOGRAPH-53A9 -->
+ <map code="0x53f1" name="cid12342"/><!-- CJK UNIFIED IDEOGRAPH-53F1 -->
+ <map code="0x5abe" name="cid15450"/><!-- CJK UNIFIED IDEOGRAPH-5ABE -->
+ <map code="0x6062" name="cid18153"/><!-- CJK UNIFIED IDEOGRAPH-6062 -->
+ </cmap_format_4>
+ <cmap_format_12 platformID="3" platEncID="10" format="12" reserved="0" length="64" language="0" nGroups="4">
+ <map code="0x53a9" name="cid12223"/><!-- CJK UNIFIED IDEOGRAPH-53A9 -->
+ <map code="0x53f1" name="cid12342"/><!-- CJK UNIFIED IDEOGRAPH-53F1 -->
+ <map code="0x5abe" name="cid15450"/><!-- CJK UNIFIED IDEOGRAPH-5ABE -->
+ <map code="0x6062" name="cid18153"/><!-- CJK UNIFIED IDEOGRAPH-6062 -->
+ </cmap_format_12>
+ </cmap>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-125"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+ <CFF>
+ <major value="1"/>
+ <minor value="0"/>
+ <CFFFont name="NotoSansCJKjp-Regular">
+ <ROS Registry="Adobe" Order="Identity" Supplement="0"/>
+ <Notice value="Copyright 2014, 2015 Adobe Systems Incorporated (http://www.adobe.com/). Noto is a trademark of Google Inc."/>
+ <FullName value="Noto Sans CJK JP Regular"/>
+ <FamilyName value="Noto Sans CJK JP"/>
+ <Weight value="Regular"/>
+ <isFixedPitch value="0"/>
+ <ItalicAngle value="0"/>
+ <UnderlinePosition value="-150"/>
+ <UnderlineThickness value="50"/>
+ <PaintType value="0"/>
+ <CharstringType value="2"/>
+ <FontMatrix value="0.001 0 0 0.001 0 0"/>
+ <FontBBox value="30 -82 972 838"/>
+ <StrokeWidth value="0"/>
+ <XUID value="1 11 9274312"/>
+ <CIDFontVersion value="1.004"/>
+ <CIDFontRevision value="0"/>
+ <CIDFontType value="0"/>
+ <CIDCount value="65535"/>
+ <!-- charset is dumped separately as the 'GlyphOrder' element -->
+ <FDSelect format="3"/>
+ <FDArray>
+ <FontDict index="0">
+ <FontName value="NotoSansCJKjp-Regular-Generic"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ <StdHW value="40"/>
+ <StdVW value="40"/>
+ <StemSnapH value="40 120"/>
+ <StemSnapV value="40 120"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="107"/>
+ </Private>
+ </FontDict>
+ <FontDict index="1">
+ <FontName value="NotoSansCJKjp-Regular-Ideographs"/>
+ <Private>
+ <BlueValues value="-250 -250 1100 1100"/>
+ <BlueScale value="0.039625"/>
+ <BlueShift value="7"/>
+ <BlueFuzz value="1"/>
+ <StdHW value="58"/>
+ <StdVW value="63"/>
+ <StemSnapH value="58 65 84"/>
+ <StemSnapV value="63 73 89"/>
+ <ForceBold value="0"/>
+ <LanguageGroup value="1"/>
+ <ExpansionFactor value="0.06"/>
+ <initialRandomSeed value="0"/>
+ <defaultWidthX value="1000"/>
+ <nominalWidthX value="0"/>
+ <Subrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ <CharString index="0">
+ -351 rmoveto
+ -8 48 -27 80 -31 60 -101 callsubr
+ return
+ </CharString>
+ <CharString index="1">
+ 68 16 113 -95 callsubr
+ return
+ </CharString>
+ <CharString index="2">
+ 77 -94 callsubr
+ return
+ </CharString>
+ <CharString index="3">
+ 7 -100 callsubr
+ return
+ </CharString>
+ <CharString index="4">
+ hlineto
+ 14 70 12 68 11 61 -68 6 rcurveline
+ -10 -62 -12 -71 -14 -72 rrcurveto
+ -97 -67 84 -85 callsubr
+ return
+ </CharString>
+ <CharString index="5">
+ -59.5 return
+ </CharString>
+ <CharString index="6">
+ -46 -17 rcurveline
+ 28 -62 26 -81 8 -50 rrcurveto
+ return
+ </CharString>
+ <CharString index="7">
+ -92 callsubr
+ -34 return
+ </CharString>
+ <CharString index="8">
+ -103 callsubr
+ 11 44 30 return
+ </CharString>
+ <CharString index="9">
+ -96 callsubr
+ 141 -71 callsubr
+ return
+ </CharString>
+ <CharString index="10">
+ -98 callsubr
+ 190 -107 callsubr
+ return
+ </CharString>
+ <CharString index="11">
+ -106 callsubr
+ -60 rlinecurve
+ return
+ </CharString>
+ <CharString index="12">
+ 90 vvcurveto
+ -50 -104 callsubr
+ return
+ </CharString>
+ <CharString index="13">
+ -89 callsubr
+ 87 return
+ </CharString>
+ <CharString index="14">
+ hlineto
+ hintmask 011000000010101000000000
+ -62 181 vlineto
+ -31 -154 -66 -109 -129 -72 22 17 10 33 4 65 -18 5 -26 9 -14 11 rrcurveto
+ -80 -4 -4 -12 -27 hhcurveto
+ -113 hlineto
+ -33 -5 4 24 hvcurveto
+ 87 vlineto
+ 80 19 87 29 62 32 -54 46 rcurveline
+ -41 -26 -68 -26 -66 -20 rrcurveto
+ 98 -65 -240 vlineto
+ -68 19 -19 77 vhcurveto
+ -96 callgsubr
+ 18 15 2 7 11 hvcurveto
+ 14 -11 27 -24 10 -12 87 54 60 66 41 85 rrcurveto
+ hintmask 100000000000001010000000
+ -92 vlineto
+ -55 5 -16 15 -12 vhcurveto
+ -12 13 23 -4 18 hhcurveto
+ 53 hlineto
+ 18 21 3 6 11 hvcurveto
+ 14 7 9 13 5 18 5 17 3 52 1 44 -16 5 -20 10 -12 11 rrcurveto
+ -48 -2 -37 -2 -16 vhcurveto
+ -3 -15 -4 -9 -5 -3 rrcurveto
+ -3 -5 -12 -2 -9 hhcurveto
+ endchar
+ </CharString>
+ <CharString index="15">
+ -2 -87 -16 -108 return
+ </CharString>
+ <CharString index="16">
+ -86 callsubr
+ -23 31 -26 29 -76 callsubr
+ 72 45 58 63 45 86 37 -37 32 -36 22 -31 45 60 rcurveline
+ return
+ </CharString>
+ <CharString index="17">
+ 16 -78 callsubr
+ return
+ </CharString>
+ <CharString index="18">
+ vlineto
+ -220 vmoveto
+ return
+ </CharString>
+ <CharString index="19">
+ 70 912 -70 return
+ </CharString>
+ <CharString index="20">
+ 135 62 187 36 230 rrcurveto
+ 318 -129 rmoveto
+ -16 -85 -28 -89 -34 -60 15 -5 27 -13 11 -9 34 63 31 95 19 90 rrcurveto
+ -337 5 rmoveto
+ -12 -84 -21 -85 -36 -58 15 -7 24 -15 10 -9 36 62 26 93 15 93 rrcurveto
+ 58 112 rmoveto
+ -13 -323 -42 -198 -222 -79 14 -15 19 -26 9 -20 128 51 72 83 42 122 42 -113 66 -88 92 -48 11 18 20 25 16 13 -112 49 -72 112 -36 137 17 84 8 99 4 114 rrcurveto
+ endchar
+ </CharString>
+ <CharString index="21">
+ -100 callgsubr
+ -120 -99 callsubr
+ return
+ </CharString>
+ <CharString index="22">
+ hlineto
+ -24 -124 -27 -121 -22 -85 59 -35 rcurveline
+ return
+ </CharString>
+ <CharString index="23">
+ 189 721 rmoveto
+ 755 68 -825 -294 hlineto
+ -156 -7 -220 -76 -157 vhcurveto
+ 18 -7 31 -18 14 -11 rrcurveto
+ 79 164 11 241 164 vvcurveto
+ return
+ </CharString>
+ <CharString index="24">
+ 104 54 73 69 50 91 rrcurveto
+ -117 vlineto
+ -45 4 -14 16 -13 vhcurveto
+ -13 14 23 -3 22 hhcurveto
+ 55 hlineto
+ 18 22 3 7 12 hvcurveto
+ 15 8 10 12 6 18 6 17 3 50 1 45 -17 6 -24 13 -12 12 1 -46 -2 -40 -2 -15 -3 -11 -6 -7 -5 -4 rrcurveto
+ -3 -6 -12 -1 -10 hhcurveto
+ endchar
+ </CharString>
+ <CharString index="25">
+ 284 -154 rmoveto
+ -70 -166 70 vlineto
+ -193 vmoveto
+ 71 166 -71 vlineto
+ 70 -316 rmoveto
+ 56 -236 75 230 54 -230 75 227 305 -140 vlineto
+ 10 22 11 26 11 24 -69 16 rcurveline
+ -5 -25 -10 -35 -10 -28 rrcurveto
+ -89 -678 64 -92 callgsubr
+ return
+ </CharString>
+ <CharString index="26">
+ rmoveto
+ 69 913 -69 hlineto
+ return
+ </CharString>
+ <CharString index="27">
+ 61 -31 69 75 53 cntrmask 0110111011111000
+ cntrmask 1001000110100101
+ hintmask 1110110111111101
+ 949 715 rmoveto
+ 68 -827 -281 vlineto
+ -154 -7 -218 -77 -155 vhcurveto
+ 18 -7 30 -18 14 -11 rrcurveto
+ 81 163 10 238 162 vvcurveto
+ 213 vlineto
+ return
+ </CharString>
+ <CharString index="28">
+ 6 -99 callgsubr
+ return
+ </CharString>
+ <CharString index="29">
+ -15 19 -26 10 -18 return
+ </CharString>
+ <CharString index="30">
+ -164 68 164 345 -85 hlineto
+ -13 -69 callsubr
+ 9 -18 9 -25 3 -18 -49 callsubr
+ 26 -107 callgsubr
+ 85 56 vlineto
+ endchar
+ </CharString>
+ <CharString index="31">
+ -27 rlinecurve
+ -43 -85 -56 -59 callsubr
+ return
+ </CharString>
+ <CharString index="32">
+ rmoveto
+ -88 callsubr
+ hlineto
+ return
+ </CharString>
+ <CharString index="33">
+ -14 -1 vhcurveto
+ -13 -1 -48 0 return
+ </CharString>
+ <CharString index="34">
+ -147 69 114 55 -114 60 134 57 -134 82 -68 -82 -154 82 -67 -82 -129 -57 129 -60 -105 -55 105 -69 -144 -56 250 -57 hlineto
+ return
+ </CharString>
+ <CharString index="35">
+ -55 9 -4 -83 -18 -109 -27 -64 rlinecurve
+ 126 -467 -81 callsubr
+ 193 -350 rmoveto
+ -8 48 -27 79 -29 62 -53 -20 rcurveline
+ 28 -63 return
+ </CharString>
+ <CharString index="36">
+ -465 -75 callsubr
+ return
+ </CharString>
+ <CharString index="37">
+ hstemhm
+ 83 50 39 70 return
+ </CharString>
+ <CharString index="38">
+ -60 callsubr
+ -52 2 return
+ </CharString>
+ <CharString index="39">
+ -61.5 return
+ </CharString>
+ <CharString index="40">
+ -38 -90 callsubr
+ return
+ </CharString>
+ <CharString index="41">
+ 68 -102 callsubr
+ return
+ </CharString>
+ <CharString index="42">
+ hstem
+ 83 50 39 70 return
+ </CharString>
+ <CharString index="43">
+ 232 -58 callsubr
+ 762 return
+ </CharString>
+ <CharString index="44">
+ -134 hlineto
+ 134 return
+ </CharString>
+ <CharString index="45">
+ rrcurveto
+ hintmask 101000000000001000000000
+ 85 -380 rmoveto
+ -9 -7 2 4 -4 hvcurveto
+ -5 3 -1 11 19 vvcurveto
+ 275 -6 4 return
+ </CharString>
+ <CharString index="46">
+ 10 18 20 25 16 return
+ </CharString>
+ <CharString index="47">
+ -4 -54 callsubr
+ return
+ </CharString>
+ <CharString index="48">
+ -62 -67 -67 callsubr
+ return
+ </CharString>
+ <CharString index="49">
+ -57 callsubr
+ -50 callsubr
+ return
+ </CharString>
+ <CharString index="50">
+ -53 callsubr
+ -90 -34 29 -35 28 return
+ </CharString>
+ <CharString index="51">
+ rmoveto
+ -11 -131 -23 -110 return
+ </CharString>
+ <CharString index="52">
+ -124 hlineto
+ 124 return
+ </CharString>
+ <CharString index="53">
+ -3 -74 callsubr
+ return
+ </CharString>
+ <CharString index="54">
+ -56 callsubr
+ -33 return
+ </CharString>
+ <CharString index="55">
+ -40 -79 callsubr
+ return
+ </CharString>
+ <CharString index="56">
+ 120 -69 -120 return
+ </CharString>
+ <CharString index="57">
+ -34 25 18 76 18 87 18 86 rrcurveto
+ return
+ </CharString>
+ <CharString index="58">
+ rrcurveto
+ 72 45 0 11 28 hvcurveto
+ return
+ </CharString>
+ <CharString index="59">
+ hvcurveto
+ 25 11 7 19 36 vvcurveto
+ return
+ </CharString>
+ <CharString index="60">
+ -7 31 -18 13 -11 rrcurveto
+ return
+ </CharString>
+ <CharString index="61">
+ -14 19 -25 9 -17 return
+ </CharString>
+ </Subrs>
+ </Private>
+ </FontDict>
+ </FDArray>
+ <CharStrings>
+ <CharString name=".notdef" fdSelectIndex="0">
+ endchar
+ </CharString>
+ <CharString name="cid12223" fdSelectIndex="1">
+ -67 64 55 56 75 54 74 61 -60 56 71 52 70 56 -46 61 83 68 hstemhm
+ 122 69 54 64 166 61 61 61 80 -80 callsubr
+ hintmask 0110111000110000
+ -82 callsubr
+ hintmask 0001000100001010
+ 349 320 rmoveto
+ 199 -95 callgsubr
+ -4 -73 -6 -66 -11 -60 rrcurveto
+ hintmask 1001000000000100
+ 82 -375 rmoveto
+ -10 -7 1 4 -5 hvcurveto
+ -6 3 -2 6 8 vvcurveto
+ 281 vlineto
+ 3 11 rlineto
+ 144 61 hlineto
+ hintmask 0001000100001010
+ -86 callgsubr
+ 11 60 7 66 5 73 rrcurveto
+ 99 61 -339 -260 -40 -61 177 hlineto
+ -41 -161 -80 -107 -154 -69 16 -12 27 -27 9 -11 rrcurveto
+ hintmask 1000000000001101
+ -83 callsubr
+ </CharString>
+ <CharString name="cid12224" fdSelectIndex="1">
+ -58 57 292 65 -54 59 88 56 75 61 80 68 hstemhm
+ 119 71 55 66 155 64 86 63 58 68 -43 66 81 53 cntrmask 1100111100101000
+ cntrmask 0011100110000000
+ hintmask 1011111111101000
+ 946 721 rmoveto
+ 68 -827 -333 vlineto
+ -149 -6 -202 -73 -143 vhcurveto
+ 18 -7 32 -18 13 -13 rrcurveto
+ 76 151 11 225 156 vvcurveto
+ 265 vlineto
+ 276 -139 rmoveto
+ -77 -155 77 vlineto
+ -221 vmoveto
+ 88 155 -88 vlineto
+ 79 -307 rmoveto
+ -16 54 -46 86 -43 64 -53 -21 rcurveline
+ 17 -28 18 -31 16 -30 -127 -47 rcurveline
+ 201 219 340 -285 -514 vlineto
+ -41 -22 -22 -16 -9 vhcurveto
+ 12 -15 16 -28 6 -18 rrcurveto
+ -1 vlineto
+ 17 15 27 13 178 71 11 -24 9 -21 5 -19 rrcurveto
+ 343 -30 rmoveto
+ -8 -7 1 4 -5 hvcurveto
+ -5 3 -1 10 18 vvcurveto
+ hintmask 1101111111101000
+ 220 -34 vlineto
+ 3 12 4 12 4 12 rrcurveto
+ 154 65 hlineto
+ hintmask 1101111111011000
+ -139 hlineto
+ 17 77 9 77 5 70 rrcurveto
+ 104 61 -341 -61 -83 callgsubr
+ -5 -68 -8 -79 -18 -77 rrcurveto
+ -91 hlineto
+ 14 58 16 85 9 39 rrcurveto
+ -63 hlineto
+ -7 -39 -22 -117 -9 -18 -6 -16 -8 -5 -12 -5 7 -13 15 -30 5 -16 rrcurveto
+ -1 vlineto
+ 8 8 29 5 37 hhcurveto
+ 60 hlineto
+ -38 -122 -70 -115 -131 -72 17 -12 20 -21 10 -15 rrcurveto
+ hintmask 1011111111101000
+ 104 59 67 84 45 94 rrcurveto
+ -130 vlineto
+ -55 6 -16 15 -11 vhcurveto
+ -12 14 24 -5 20 hhcurveto
+ 55 hlineto
+ 16 23 3 6 12 hvcurveto
+ 14 7 9 11 6 17 6 17 3 47 2 41 -18 6 -22 10 -13 11 rrcurveto
+ -43 -1 -33 -4 -16 vhcurveto
+ -2 -12 -4 -8 -6 -3 rrcurveto
+ -3 -5 -10 -1 -10 hhcurveto
+ endchar
+ </CharString>
+ <CharString name="cid12342" fdSelectIndex="1">
+ -59 73 170 70 411 69 hstem
+ 77 72 144 73 189 76 255 72 cntrmask 01111100
+ 293 665 rmoveto
+ -411 -144 411 vlineto
+ 217 69 rmoveto
+ -289 -646 72 96 217 hlineto
+ 316 -170 rmoveto
+ -43 -8 10 50 hvcurveto
+ 287 vlineto
+ 112 75 108 90 83 96 -72 49 rcurveline
+ -61 -77 -82 -75 -88 -65 rrcurveto
+ 361 -76 -414 vlineto
+ -60 -39 -60 -35 -58 -27 17 -15 24 -26 12 -16 41 20 42 23 42 26 rrcurveto
+ -236 vlineto
+ -105 27 -30 91 vhcurveto
+ -97 callgsubr
+ 93 20 60 167 10 hvcurveto
+ -22 5 -30 14 -20 16 rrcurveto
+ -150 -5 -7 -39 -43 hhcurveto
+ endchar
+ </CharString>
+ <CharString name="cid15450" fdSelectIndex="1">
+ -75 62 102 61 74 52 71 54 60 55 48 67 -45 53 64 55 hstemhm
+ 311 71 57 68 17 66 41 69 44 67 19 69 cntrmask 1111101101010100
+ cntrmask 0000000000101000
+ hintmask 1111101101010100
+ 700 150 rmoveto
+ 74 130 -74 vlineto
+ -323 74 rmoveto
+ 124 -74 -55 callsubr
+ 197 rmoveto
+ -71 -124 71 vlineto
+ 323 hmoveto
+ -71 -130 71 vlineto
+ hintmask 0000010010000000
+ -389 217 -58 callsubr
+ hintmask 0000101100101000
+ 395 22 rmoveto
+ 154 -70 -154 hlineto
+ 187 vmoveto
+ 154 -64 -154 hlineto
+ hintmask 0101100000010100
+ 367 -489 rmoveto
+ -58 251 -199 60 252 55 hlineto
+ hintmask 0001101100111000
+ -141 70 103 53 -103 64 122 55 -122 78 -67 -78 -154 78 -66 -78 -125 -55 125 -64 -98 -53 98 -70 -138 -55 245 -60 hlineto
+ hintmask 1101010011000100
+ -192 -251 -65 -40 hlineto
+ -21 24 -26 25 -28 25 45 113 27 145 11 185 -43 6 rcurveline
+ -91 callsubr
+ -4 5 -4 6 -5 5 rrcurveto
+ 47 -164 68 164 323 -87 hlineto
+ -11 -4 -3 -11 -1 vhcurveto
+ -13 -1 -40 0 -46 1 8 -17 11 -27 3 -18 rrcurveto
+ 62 41 0 11 26 -48 callsubr
+ 87 58 vlineto
+ endchar
+ </CharString>
+ <CharString name="cid15451" fdSelectIndex="1">
+ -76 61 101 59 74 52 72 56 57 56 51 68 -50 55 60 57 hstemhm
+ 160 67 55 69 66 68 28 67 39 66 49 68 28 69 cntrmask 1111101100101010
+ cntrmask 0000000000010100
+ hintmask 1111101100101010
+ 685 145 rmoveto
+ 74 145 -74 vlineto
+ -345 74 rmoveto
+ 134 -74 -63 callsubr
+ 198 rmoveto
+ -72 -134 72 vlineto
+ 345 hmoveto
+ -72 -145 72 vlineto
+ hintmask 0000010001000000
+ -403 220 rmoveto
+ -10 -120 -18 -101 -29 -86 -29 24 -31 22 -29 21 17 69 18 84 16 87 rrcurveto
+ hintmask 0000101100010100
+ 393 18 rmoveto
+ 154 -69 -154 hlineto
+ 184 vmoveto
+ 154 -60 -154 hlineto
+ hintmask 0101100000001010
+ 375 -491 rmoveto
+ -56 254 -214 57 264 56 hlineto
+ hintmask 0001101100011100
+ -73 callsubr
+ hintmask 1101010011100010
+ -202 -254 -51 -17 hlineto
+ -24 27 -29 28 -34 29 39 107 24 137 9 171 -52 callsubr
+ -100 hlineto
+ 12 68 10 67 6 61 -67 3 rcurveline
+ -6 -61 -9 -68 -11 -70 rrcurveto
+ -90 -68 78 hlineto
+ -19 -102 -22 -98 -21 -71 45 -31 48 -38 44 -38 -42 -93 -56 -66 -69 -40 14 -46 callsubr
+ 73 48 60 67 44 93 38 -36 31 -36 22 -30 47 50 rcurveline
+ 30 -77 callsubr
+ </CharString>
+ <CharString name="cid15452" fdSelectIndex="1">
+ -76 61 101 59 74 52 72 56 57 56 -103 callgsubr
+ 70 -68 callsubr
+ -66 callsubr
+ 66 -102 callgsubr
+ 55 60 57 hstemhm
+ 43 139 -45 68 57 66 41 17 31 68 28 67 39 66 49 68 28 69 cntrmask 111110001100110101000000
+ cntrmask 000000000000001010100000
+ hintmask 000000100000100000000000
+ 262 556 rmoveto
+ -1 -96 -8 -114 -39 -111 -27 25 -29 25 -27 24 14 70 15 84 14 87 rrcurveto
+ -105 callgsubr
+ 211 13 rmoveto
+ hintmask 000000001000110000000000
+ 1 66 -58 -3 rlineto
+ hintmask 000000100010100000000000
+ 69 -66 -72 vlineto
+ -80 -4 rlineto
+ -106 callgsubr
+ 10 74 8 72 5 65 -68 3 rcurveline
+ -4 -66 -8 -76 -10 -75 rrcurveto
+ hintmask 000001000010100000000000
+ -76 -3 8 -70 60 3 -15 -97 -17 -93 -16 -68 rlinecurve
+ 41 -35 45 -42 41 -42 -32 -70 -47 -68 -68 -61 17 -10 24 -22 11 -15 65 59 47 66 34 68 29 -32 26 -29 17 -24 44 55 rcurveline
+ -20 28 -31 33 -35 35 rrcurveto
+ hintmask 011100010000101010100000
+ 51 132 9 135 1 111 rrcurveto
+ 357 -415 rmoveto
+ 74 145 -74 vlineto
+ -345 74 rmoveto
+ 134 -74 -63 callsubr
+ 198 rmoveto
+ -72 -134 72 vlineto
+ 345 hmoveto
+ -72 -145 72 vlineto
+ hintmask 000010001100000101000000
+ -105 238 rmoveto
+ 154 -69 -154 hlineto
+ 184 vmoveto
+ 154 -60 -154 hlineto
+ hintmask 010110000000000010100000
+ 375 -491 rmoveto
+ -56 254 -214 57 264 56 hlineto
+ hintmask 000110001100010111000000
+ -73 callsubr
+ hintmask 110100000000001000100000
+ -202 -254 -51 -59 51 -77 callsubr
+ </CharString>
+ <CharString name="cid18153" fdSelectIndex="1">
+ 656 68 -65 callsubr
+ 161 66 60 55 87 68 cntrmask 01110100
+ 81 367 rmoveto
+ 36 -97 callsubr
+ 157 192 rmoveto
+ 486 68 -486 112 -66 -112 -82 -68 82 -109 hlineto
+ -191 -12 -213 -118 -175 vhcurveto
+ 17 -9 26 -21 13 -13 rrcurveto
+ 127 187 13 228 208 vvcurveto
+ 382 -272 rmoveto
+ 32 56 37 93 31 77 -65 16 rcurveline
+ -19 -69 -39 -99 -30 -60 rrcurveto
+ -274 -33 rmoveto
+ 40 57 12 94 8 84 -55 13 rcurveline
+ -5 -81 -15 -88 -34 -51 rrcurveto
+ 264 344 rmoveto
+ -68 -259 hlineto
+ -71 -36 -210 -209 -108 vhcurveto
+ 13 -15 19 -28 9 -15 165 88 61 159 12 71 12 -70 55 -164 154 -84 10 17 20 29 12 15 rrcurveto
+ -195 105 -34 212 69 vvcurveto
+ endchar
+ </CharString>
+ <CharString name="cid18154" fdSelectIndex="1">
+ 617 68 hstemhm
+ 92 55 22 69 266 70 128 63 hintmask 11000000
+ 99 370 rmoveto
+ 28 72 17 113 3 83 rrcurveto
+ hintmask 10111000
+ -72 callsubr
+ 26 -81 7 -50 rrcurveto
+ 635 -89 callgsubr
+ 68 -384 vlineto
+ 7 47 5 49 5 51 -70 6 rcurveline
+ -5 -53 -5 -51 -7 -49 rrcurveto
+ -139 -68 130 hlineto
+ -33 -210 -57 -173 -109 -118 16 -12 28 -26 11 -13 115 -87 callsubr
+ </CharString>
+ <CharString name="cid18155" fdSelectIndex="1">
+ 617 68 hstemhm
+ 92 55 22 69 240 70 -54 70 -8 60 76 66 cntrmask 00100010
+ hintmask 11000000
+ 99 370 rmoveto
+ 28 72 17 113 3 83 rrcurveto
+ hintmask 10110000
+ -72 callsubr
+ 25 -81 8 -50 rrcurveto
+ 635 -89 callgsubr
+ 68 -393 vlineto
+ hintmask 10001000
+ 6 47 5 49 5 51 -70 6 rcurveline
+ hintmask 10010000
+ -4 -53 -6 -51 -6 -49 rrcurveto
+ -131 -68 -84 callgsubr
+ -32 -213 -56 -176 -109 -120 16 -11 29 -26 10 -14 116 137 60 191 35 232 rrcurveto
+ 332 -129 rmoveto
+ -19 -82 -32 -90 -33 -62 16 -5 26 -13 13 -9 31 64 35 97 22 85 rrcurveto
+ hintmask 10000110
+ -313 -229 rmoveto
+ -4 59 -16 107 -16 84 -56 -9 rcurveline
+ 14 -83 14 -109 4 -64 rrcurveto
+ 136 355 rmoveto
+ -6 -328 -13 -180 -251 -94 14 -13 20 -25 9 -17 138 55 71 80 39 115 42 -112 66 -89 93 -48 -61 callsubr
+ 13 -113 50 -73 115 -36 139 14 84 4 98 2 114 rrcurveto
+ endchar
+ </CharString>
+ <CharString name="cid59592" fdSelectIndex="1">
+ -49 71 205 69 377 70 hstem
+ 79 70 159 71 161 75 281 69 cntrmask 01111100
+ 308 673 rmoveto
+ -377 -159 377 vlineto
+ 230 70 rmoveto
+ -300 -602 70 86 230 hlineto
+ 292 -205 rmoveto
+ -47 -9 10 51 hvcurveto
+ 345 vlineto
+ 345 85 -18 68 -327 -80 rlineto
+ 319 -75 -337 vlineto
+ -158 -39 17 -69 141 35 rlineto
+ -326 vlineto
+ -105 29 -28 95 vhcurveto
+ 178 hlineto
+ 92 21 53 154 10 hvcurveto
+ -21 6 -29 13 -19 13 rrcurveto
+ -134 -6 -7 -34 -45 hhcurveto
+ endchar
+ </CharString>
+ <CharString name="cid59593" fdSelectIndex="1">
+ -50 72 192 70 219 73 97 70 hstem
+ 78 71 159 72 160 75 254 70 cntrmask 10101110
+ cntrmask 01010000
+ 308 673 rmoveto
+ -389 -159 389 vlineto
+ 231 70 rmoveto
+ -302 -626 71 97 231 hlineto
+ 576 289 rmoveto
+ 73 -341 244 -75 -244 -116 -73 116 -421 vlineto
+ -104 27 -28 90 vhcurveto
+ -90 callgsubr
+ 89 20 53 154 10 hvcurveto
+ -22 5 -29 14 -19 14 rrcurveto
+ -134 -6 -6 -34 -41 hhcurveto
+ -85 callgsubr
+ -42 -9 10 48 hvcurveto
+ 423 vlineto
+ endchar
+ </CharString>
+ <CharString name="cid61789" fdSelectIndex="1">
+ -65 59 305 63 87 56 74 63 79 68 hstemhm
+ 119 70 59 65 157 64 59 63 82 68 -33 69 71 52 cntrmask 1111111110000000
+ cntrmask 0000001001010000
+ -87 callgsubr
+ 189 721 rmoveto
+ 755 68 -825 -294 hlineto
+ -157 -7 -219 -81 -157 vhcurveto
+ 18 -47 callsubr
+ 85 164 11 240 165 vvcurveto
+ 281 87 rmoveto
+ -77 -157 -105 callsubr
+ 157 -87 vlineto
+ 97 -316 rmoveto
+ -15 58 -45 88 -46 65 -59 -20 rcurveline
+ 19 -27 19 -32 16 -31 -49 -18 -49 -17 -45 -15 rrcurveto
+ 205 221 340 -286 -567 vlineto
+ -23 -8 -21 -7 -19 -6 24 -67 rcurveline
+ 77 30 99 37 96 38 10 -25 9 -24 5 -20 rrcurveto
+ 151 339 rmoveto
+ 217 vlineto
+ hintmask 0101000000100000
+ -94 callgsubr
+ -3 -75 -5 -73 -13 -69 rrcurveto
+ hintmask 1100000001000000
+ 81 -368 rmoveto
+ -9 -6 1 3 -5 hvcurveto
+ -5 4 -2 11 19 vvcurveto
+ 264 vlineto
+ 1 3 rlineto
+ 144 63 hlineto
+ hintmask 0101000010100000
+ -131 hlineto
+ 12 69 6 74 4 74 rrcurveto
+ 92 63 -341 -280 -38 -63 182 hlineto
+ -39 -140 -82 -117 -184 -68 15 -13 20 -25 8 -16 rrcurveto
+ hintmask 1000000011010000
+ 127 49 82 73 54 87 rrcurveto
+ -92 vlineto
+ -56 6 -16 15 -13 vhcurveto
+ -12 14 25 -5 20 hhcurveto
+ 56 hlineto
+ 17 23 3 6 11 hvcurveto
+ 15 7 10 12 6 18 rrcurveto
+ 6 15 3 48 41 vvcurveto
+ -16 6 -23 11 -13 12 rrcurveto
+ -43 -2 -34 -2 -14 vhcurveto
+ -2 -14 -5 -8 -6 -3 rrcurveto
+ -3 -5 -12 -1 -10 hhcurveto
+ endchar
+ </CharString>
+ <CharString name="cid61811" fdSelectIndex="1">
+ -75 40 751 67 -65 callsubr
+ 133 69 77 58 86 72 cntrmask 00111010
+ 81 367 rmoveto
+ 36 -97 callsubr
+ 132 252 rmoveto
+ 499 67 -568 -300 hlineto
+ -156 -10 -212 -102 -150 vhcurveto
+ 17 -7 32 -18 13 -11 rrcurveto
+ 104 154 15 236 164 vvcurveto
+ 403 -190 rmoveto
+ 31 57 38 92 30 78 -66 15 rcurveline
+ -19 -68 -39 -99 -30 -60 rrcurveto
+ -275 -36 rmoveto
+ 40 56 14 95 8 85 -58 14 rcurveline
+ -7 -81 -16 -87 -35 -52 rrcurveto
+ 274 352 rmoveto
+ -72 -268 hlineto
+ -74 -38 -216 -214 -112 vhcurveto
+ 13 -15 21 -30 9 -16 169 90 63 165 12 73 13 -72 56 -169 158 -87 11 18 21 31 13 15 rrcurveto
+ -200 110 -35 217 72 vvcurveto
+ endchar
+ </CharString>
+ <CharString name="cid62031" fdSelectIndex="1">
+ -65 53 -29 60 287 62 -58 51 78 49 78 51 -45 62 82 63 hstemhm
+ 122 70 48 61 -58 65 165 62 -41 58 53 61 83 63 -43 65 81 48 cntrmask 010111011101010000000000
+ cntrmask 101000110010001010000000
+ hintmask 010110111101011010000000
+ 949 716 rmoveto
+ 63 -827 -297 vlineto
+ -153 -7 -214 -77 -152 vhcurveto
+ 18 -7 31 -19 14 -11 rrcurveto
+ 80 159 11 236 161 vvcurveto
+ 234 vlineto
+ 281 -228 rmoveto
+ -172 hlineto
+ hintmask 000111000101010000000000
+ 78 172 vlineto
+ -205 vmoveto
+ -172 78 172 hlineto
+ 62 178 rmoveto
+ -128 hlineto
+ 10 22 11 23 10 24 -69 16 rcurveline
+ -6 -24 -11 -32 -11 -29 rrcurveto
+ -101 -307 295 hlineto
+ 131 58 rmoveto
+ hintmask 000100100000010100000000
+ 204 103 vlineto
+ -3 -75 -4 -68 -9 -61 -62 callsubr
+ 140 vlineto
+ hintmask 000100100000010100000000
+ 62 -129 vlineto
+ 9 62 5 67 3 75 rrcurveto
+ 104 62 -333 -266 -44 -93 callsubr
+ </CharString>
+ <CharString name="cid62032" fdSelectIndex="1">
+ -67 64 55 56 75 54 70 61 -56 56 71 52 70 56 -47 60 85 68 hstemhm
+ 122 69 54 64 166 61 66 61 75 -80 callsubr
+ hintmask 1110111011111101
+ -82 callsubr
+ 520 -55 rmoveto
+ -10 -7 1 4 -5 hvcurveto
+ -6 3 -2 6 8 vvcurveto
+ hintmask 1111010111111101
+ 281 vlineto
+ 2 7 rlineto
+ 148 61 hlineto
+ hintmask 1111010111111011
+ -91 callgsubr
+ 11 61 8 67 5 74 rrcurveto
+ 101 60 -365 -60 -88 callgsubr
+ -4 -74 -6 -68 -12 -60 rrcurveto
+ -83 167 -61 hlineto
+ hintmask 1110110111111101
+ -167 -44 vlineto
+ hintmask 1111010111111101
+ -61 175 vlineto
+ -41 -159 -80 -106 -153 -68 16 -12 27 -27 9 -11 -83 callsubr
+ </CharString>
+ <CharString name="cid62033" fdSelectIndex="1">
+ -65 58 304 63 -59 59 88 55 76 63 79 68 hstemhm
+ 119 70 58 65 158 63 83 58 63 68 -32 68 71 53 cntrmask 1100111111000000
+ cntrmask 0011100100101000
+ hintmask 1101111111100000
+ -84 callsubr
+ 281 87 rmoveto
+ -79 -158 79 vlineto
+ hintmask 0011100110000000
+ -221 vmoveto
+ 87 158 -87 vlineto
+ 98 -316 rmoveto
+ -15 59 -44 88 -46 65 -59 -20 rcurveline
+ 19 -27 18 -32 16 -31 -50 -17 -49 -17 -46 -16 rrcurveto
+ 204 221 341 -286 -567 vlineto
+ -23 -7 -21 -7 -19 -6 26 -67 rcurveline
+ 78 29 99 39 95 37 11 -26 8 -24 5 -20 rrcurveto
+ hintmask 0100100001010000
+ 168 337 rmoveto
+ 219 99 vlineto
+ -4 -75 -5 -74 -13 -70 rrcurveto
+ hintmask 1100000000100000
+ 81 -367 rmoveto
+ -9 -6 1 3 -5 hvcurveto
+ -6 4 -1 11 18 vvcurveto
+ 264 -1 vlineto
+ 1 3 rlineto
+ 145 63 hlineto
+ hintmask 0100100001010000
+ -86 callgsubr
+ 13 70 6 74 4 75 rrcurveto
+ 96 63 -371 -63 50 -219 -62 -63 182 hlineto
+ -40 -139 -83 -118 -182 -68 15 -13 19 -24 9 -17 rrcurveto
+ hintmask 1000000000101000
+ 127 50 82 74 54 88 rrcurveto
+ -94 vlineto
+ -56 5 -16 16 -13 vhcurveto
+ -12 14 25 -4 20 hhcurveto
+ 56 hlineto
+ 17 23 2 6 11 hvcurveto
+ 15 7 10 12 6 17 6 16 3 48 1 41 -18 5 -23 12 -12 12 rrcurveto
+ -44 -2 -33 -2 -15 vhcurveto
+ -2 -13 -5 -8 -6 -3 rrcurveto
+ -3 -5 -12 -1 -10 hhcurveto
+ endchar
+ </CharString>
+ <CharString name="cid62034" fdSelectIndex="1">
+ -65 53 -29 60 287 62 -58 51 78 49 78 51 -43 60 82 63 hstemhm
+ 122 70 48 61 -58 65 165 62 -41 58 59 59 79 63 -43 66 80 48 cntrmask 010111011101010000000000
+ cntrmask 101000110010001010000000
+ hintmask 010110111101011010000000
+ 949 716 rmoveto
+ 63 -827 -297 vlineto
+ -153 -7 -214 -77 -152 vhcurveto
+ 18 -7 31 -19 14 -11 rrcurveto
+ 80 159 11 236 161 vvcurveto
+ 234 vlineto
+ 281 -228 rmoveto
+ -172 hlineto
+ hintmask 000111000101010000000000
+ 78 172 vlineto
+ -205 vmoveto
+ -172 78 172 hlineto
+ 62 178 rmoveto
+ -128 hlineto
+ 10 22 11 23 10 24 -69 16 rcurveline
+ -6 -24 -11 -32 -11 -29 rrcurveto
+ -101 -307 295 hlineto
+ 135 58 rmoveto
+ hintmask 000100100000010100000000
+ 206 99 vlineto
+ -3 -76 -4 -68 -9 -62 -62 callsubr
+ 141 vlineto
+ hintmask 000100100000010100000000
+ 62 -130 vlineto
+ 9 62 5 69 4 75 rrcurveto
+ 100 60 -367 -60 43 -206 -50 -93 callsubr
+ </CharString>
+ <CharString name="cid62039" fdSelectIndex="1">
+ -52 71 206 69 377 69 hstem
+ 79 70 162 72 100 75 331 70 cntrmask 01111100
+ 311 671 rmoveto
+ -377 -162 377 vlineto
+ 234 69 rmoveto
+ -304 -618 70 103 234 hlineto
+ 240 -206 rmoveto
+ -54 -11 12 55 hvcurveto
+ 261 vlineto
+ 131 76 143 98 93 94 -55 48 rcurveline
+ -74 -77 -120 -88 -118 -70 rrcurveto
+ 407 -75 -748 vlineto
+ -109 32 -30 103 vhcurveto
+ 206 hlineto
+ 102 22 56 157 11 hvcurveto
+ -21 5 -30 13 -19 14 rrcurveto
+ -138 -7 -9 -36 -53 hhcurveto
+ endchar
+ </CharString>
+ <CharString name="cid62104" fdSelectIndex="1">
+ -76 61 94 56 74 54 69 54 80 56 42 67 -43 53 64 55 hstemhm
+ 311 71 61 68 13 66 41 69 44 67 15 69 cntrmask 1111101101010100
+ cntrmask 0000000000101000
+ hintmask 0110101100111000
+ 590 588 rmoveto
+ 154 -66 -154 hlineto
+ 183 vmoveto
+ 154 -64 -154 hlineto
+ 362 -119 rmoveto
+ -141 66 103 53 -103 64 122 55 -122 76 -67 -76 -154 76 -66 -76 -123 -55 123 -64 -98 -53 98 -66 -138 -56 566 hlineto
+ -252 -331 rmoveto
+ 74 vlineto
+ hintmask 1111010011010100
+ 126 -74 hlineto
+ -315 74 rmoveto
+ 120 -74 -120 hlineto
+ 197 vmoveto
+ -51 callsubr
+ hlineto
+ 315 69 rmoveto
+ -69 -126 69 vlineto
+ -389 -64 callsubr
+ -429 rmoveto
+ -62 74 52 54 -52 123 -195 59 -69 -59 -188 -123 -66 -54 66 -74 -71 -23 hlineto
+ -21 23 -25 25 -27 24 45 113 27 145 11 185 -43 6 rcurveline
+ -91 callsubr
+ -5 6 rlineto
+ 43 -155 68 155 315 -79 hlineto
+ -11 -4 -4 -11 vhcurveto
+ -13 -1 -40 0 -46 2 9 -17 10 -27 3 -18 rrcurveto
+ 62 41 1 10 26 hvcurveto
+ 25 11 7 19 35 vvcurveto
+ 79 -101 callgsubr
+ </CharString>
+ <CharString name="cid62105" fdSelectIndex="1">
+ -76 61 94 58 74 52 69 54 80 54 44 67 -45 53 65 54 hstemhm
+ 311 71 57 68 17 66 43 65 46 67 19 69 cntrmask 1111101101010100
+ cntrmask 0000000000101000
+ hintmask 0110101100111000
+ 590 586 rmoveto
+ 154 -66 -154 hlineto
+ 184 vmoveto
+ 154 -65 -154 hlineto
+ 362 -119 rmoveto
+ -141 66 104 53 -104 65 122 54 -122 78 -67 -78 -154 78 -66 -78 -123 -54 123 -65 -98 -53 98 -66 -138 -54 566 hlineto
+ -254 -329 rmoveto
+ 74 vlineto
+ hintmask 1111010011010100
+ 132 -74 hlineto
+ -323 74 rmoveto
+ 126 -74 -126 hlineto
+ 126 195 rmoveto
+ -69 -126 69 vlineto
+ 323 hmoveto
+ -69 -132 69 vlineto
+ -387 -64 callsubr
+ -427 rmoveto
+ -58 249 -201 57 -65 -57 -194 -249 -67 -25 hlineto
+ -21 23 -25 25 -27 24 45 113 27 145 11 185 -43 6 rcurveline
+ -86 callsubr
+ -23 30 -26 30 -76 callsubr
+ 71 45 58 63 45 85 38 -37 32 -36 22 -30 45 60 rcurveline
+ -5 6 rlineto
+ 39 -155 68 155 323 -79 hlineto
+ -11 -4 -4 -11 vhcurveto
+ -13 -1 -40 0 -46 2 8 -18 11 -26 3 -18 rrcurveto
+ 62 41 1 10 26 hvcurveto
+ 25 11 7 19 35 vvcurveto
+ 79 58 vlineto
+ endchar
+ </CharString>
+ <CharString name="cid62172" fdSelectIndex="1">
+ 650 68 -70 callsubr
+ 223 69 6 54 77 66 cntrmask 01100100
+ hintmask 11110100
+ 81 367 rmoveto
+ 36 -97 callsubr
+ 639 186 rmoveto
+ 68 -427 vlineto
+ 4 37 3 39 3 39 -69 4 rcurveline
+ -3 -41 -3 -39 -4 -39 rrcurveto
+ -120 -68 -93 callgsubr
+ -26 -209 -49 -177 -98 -117 17 -8 35 -20 12 -10 99 131 50 184 29 226 rrcurveto
+ 340 -406 rmoveto
+ 27 56 33 88 25 73 -63 15 rcurveline
+ -16 -64 -33 -95 -27 -58 rrcurveto
+ hintmask 10001100
+ -277 -30 rmoveto
+ 43 53 16 90 10 83 -54 14 rcurveline
+ -9 -80 -19 -84 -40 -51 rrcurveto
+ 265 349 rmoveto
+ -66 -247 hlineto
+ -69 -35 -203 -212 -104 vhcurveto
+ 13 -15 19 -26 8 -16 167 86 61 154 12 68 12 -68 53 -158 155 -82 10 16 19 28 12 16 rrcurveto
+ -196 101 -32 206 66 vvcurveto
+ endchar
+ </CharString>
+ </CharStrings>
+ </CFFFont>
+
+ <GlobalSubrs>
+ <!-- The 'index' attribute is only for humans; it is ignored when parsed. -->
+ <CharString index="0">
+ 11 -104 callgsubr
+ return
+ </CharString>
+ <CharString index="1">
+ hintmask 000001000001000000000000
+ return
+ </CharString>
+ <CharString index="2">
+ hintmask 000000010000010000000000
+ return
+ </CharString>
+ <CharString index="3">
+ 8 18 37 vvcurveto
+ return
+ </CharString>
+ <CharString index="4">
+ 32.5 return
+ </CharString>
+ <CharString index="5">
+ -46.5 return
+ </CharString>
+ <CharString index="6">
+ 62 vlineto
+ endchar
+ </CharString>
+ <CharString index="7">
+ -11 -2 rlineto
+ return
+ </CharString>
+ <CharString index="8">
+ rcurveline
+ -98 callgsubr
+ return
+ </CharString>
+ <CharString index="9">
+ -12 -2 rlineto
+ return
+ </CharString>
+ <CharString index="10">
+ 162 hlineto
+ return
+ </CharString>
+ <CharString index="11">
+ 127 hlineto
+ return
+ </CharString>
+ <CharString index="12">
+ 110 vlineto
+ return
+ </CharString>
+ <CharString index="13">
+ 117 hlineto
+ return
+ </CharString>
+ <CharString index="14">
+ 112 hlineto
+ return
+ </CharString>
+ <CharString index="15">
+ 113 hlineto
+ return
+ </CharString>
+ <CharString index="16">
+ -136 hlineto
+ return
+ </CharString>
+ <CharString index="17">
+ 163 hlineto
+ return
+ </CharString>
+ <CharString index="18">
+ 155 rmoveto
+ return
+ </CharString>
+ <CharString index="19">
+ 195 hlineto
+ return
+ </CharString>
+ <CharString index="20">
+ hintmask 1111111111000000
+ return
+ </CharString>
+ <CharString index="21">
+ -132 hlineto
+ return
+ </CharString>
+ <CharString index="22">
+ -150 hlineto
+ return
+ </CharString>
+ <CharString index="23">
+ 122 hlineto
+ return
+ </CharString>
+ <CharString index="24">
+ 171 hlineto
+ return
+ </CharString>
+ </GlobalSubrs>
+ </CFF>
+
+ <GSUB>
+ <Version value="0x00010000"/>
+ <ScriptList>
+ <!-- ScriptCount=2 -->
+ <ScriptRecord index="0">
+ <ScriptTag value="DFLT"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="0"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ <ScriptRecord index="1">
+ <ScriptTag value="hang"/>
+ <Script>
+ <DefaultLangSys>
+ <ReqFeatureIndex value="65535"/>
+ <!-- FeatureCount=1 -->
+ <FeatureIndex index="0" value="1"/>
+ </DefaultLangSys>
+ <!-- LangSysCount=0 -->
+ </Script>
+ </ScriptRecord>
+ </ScriptList>
+ <FeatureList>
+ <!-- FeatureCount=2 -->
+ <FeatureRecord index="0">
+ <FeatureTag value="aalt"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="0"/>
+ </Feature>
+ </FeatureRecord>
+ <FeatureRecord index="1">
+ <FeatureTag value="jp90"/>
+ <Feature>
+ <!-- LookupCount=1 -->
+ <LookupListIndex index="0" value="1"/>
+ </Feature>
+ </FeatureRecord>
+ </FeatureList>
+ <LookupList>
+ <!-- LookupCount=2 -->
+ <Lookup index="0">
+ <LookupType value="3"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <AlternateSubst index="0">
+ <AlternateSet glyph="cid12223">
+ <Alternate glyph="cid62031"/>
+ <Alternate glyph="cid62033"/>
+ <Alternate glyph="cid61789"/>
+ </AlternateSet>
+ <AlternateSet glyph="cid12342">
+ <Alternate glyph="cid62039"/>
+ <Alternate glyph="cid59592"/>
+ </AlternateSet>
+ <AlternateSet glyph="cid15450">
+ <Alternate glyph="cid62104"/>
+ <Alternate glyph="cid62105"/>
+ </AlternateSet>
+ <AlternateSet glyph="cid18153">
+ <Alternate glyph="cid62172"/>
+ <Alternate glyph="cid61811"/>
+ </AlternateSet>
+ <AlternateSet glyph="cid61789">
+ <Alternate glyph="cid62031"/>
+ <Alternate glyph="cid62033"/>
+ <Alternate glyph="cid12223"/>
+ </AlternateSet>
+ <AlternateSet glyph="cid61811">
+ <Alternate glyph="cid62172"/>
+ <Alternate glyph="cid18153"/>
+ </AlternateSet>
+ </AlternateSubst>
+ </Lookup>
+ <Lookup index="1">
+ <LookupType value="1"/>
+ <LookupFlag value="0"/>
+ <!-- SubTableCount=1 -->
+ <SingleSubst index="0">
+ <Substitution in="cid12223" out="cid61789"/>
+ <Substitution in="cid18153" out="cid61811"/>
+ </SingleSubst>
+ </Lookup>
+ </LookupList>
+ </GSUB>
+
+ <VORG>
+ <majorVersion value="1"/>
+ <minorVersion value="0"/>
+ <defaultVertOriginY value="880"/>
+ <numVertOriginYMetrics value="0"/>
+ </VORG>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="100"/>
+ <mtx name="cid12223" width="1000" lsb="38"/>
+ <mtx name="cid12224" width="1000" lsb="40"/>
+ <mtx name="cid12342" width="1000" lsb="77"/>
+ <mtx name="cid15450" width="1000" lsb="44"/>
+ <mtx name="cid15451" width="1000" lsb="30"/>
+ <mtx name="cid15452" width="1000" lsb="39"/>
+ <mtx name="cid18153" width="1000" lsb="31"/>
+ <mtx name="cid18154" width="1000" lsb="43"/>
+ <mtx name="cid18155" width="1000" lsb="43"/>
+ <mtx name="cid59592" width="1000" lsb="79"/>
+ <mtx name="cid59593" width="1000" lsb="78"/>
+ <mtx name="cid61789" width="1000" lsb="31"/>
+ <mtx name="cid61811" width="1000" lsb="31"/>
+ <mtx name="cid62031" width="1000" lsb="38"/>
+ <mtx name="cid62032" width="1000" lsb="38"/>
+ <mtx name="cid62033" width="1000" lsb="36"/>
+ <mtx name="cid62034" width="1000" lsb="38"/>
+ <mtx name="cid62039" width="1000" lsb="79"/>
+ <mtx name="cid62104" width="1000" lsb="44"/>
+ <mtx name="cid62105" width="1000" lsb="44"/>
+ <mtx name="cid62172" width="1000" lsb="31"/>
+ </hmtx>
+
+ <vhea>
+ <tableVersion value="0x00011000"/>
+ <ascent value="500"/>
+ <descent value="-500"/>
+ <lineGap value="0"/>
+ <advanceHeightMax value="1000"/>
+ <minTopSideBearing value="42"/>
+ <minBottomSideBearing value="38"/>
+ <yMaxExtent value="962"/>
+ <caretSlopeRise value="0"/>
+ <caretSlopeRun value="1"/>
+ <caretOffset value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <reserved4 value="0"/>
+ <metricDataFormat value="0"/>
+ <numberOfVMetrics value="1"/>
+ </vhea>
+
+ <vmtx>
+ <mtx name=".notdef" height="1000" tsb="0"/>
+ <mtx name="cid12223" height="1000" tsb="97"/>
+ <mtx name="cid12224" height="1000" tsb="91"/>
+ <mtx name="cid12342" height="1000" tsb="65"/>
+ <mtx name="cid15450" height="1000" tsb="44"/>
+ <mtx name="cid15451" height="1000" tsb="45"/>
+ <mtx name="cid15452" height="1000" tsb="45"/>
+ <mtx name="cid18153" height="1000" tsb="43"/>
+ <mtx name="cid18154" height="1000" tsb="42"/>
+ <mtx name="cid18155" height="1000" tsb="42"/>
+ <mtx name="cid59592" height="1000" tsb="60"/>
+ <mtx name="cid59593" height="1000" tsb="60"/>
+ <mtx name="cid61789" height="1000" tsb="91"/>
+ <mtx name="cid61811" height="1000" tsb="43"/>
+ <mtx name="cid62031" height="1000" tsb="101"/>
+ <mtx name="cid62032" height="1000" tsb="97"/>
+ <mtx name="cid62033" height="1000" tsb="91"/>
+ <mtx name="cid62034" height="1000" tsb="101"/>
+ <mtx name="cid62039" height="1000" tsb="45"/>
+ <mtx name="cid62104" height="1000" tsb="44"/>
+ <mtx name="cid62105" height="1000" tsb="44"/>
+ <mtx name="cid62172" height="1000" tsb="43"/>
+ </vmtx>
+
+</ttFont>
diff --git a/Tests/subset/subset_test.py b/Tests/subset/subset_test.py
index d195af0f..facafb2a 100644
--- a/Tests/subset/subset_test.py
+++ b/Tests/subset/subset_test.py
@@ -1,5 +1,6 @@
import io
-from fontTools.misc.testTools import getXML
+import fontTools.ttLib.tables.otBase
+from fontTools.misc.testTools import getXML, stripVariableItemsFromTTX
from fontTools.misc.textTools import tobytes, tostr
from fontTools import subset
from fontTools.fontBuilder import FontBuilder
@@ -19,44 +20,36 @@ import pathlib
import pytest
-class SubsetTest(unittest.TestCase):
- def __init__(self, methodName):
- unittest.TestCase.__init__(self, methodName)
- # Python 3 renamed assertRaisesRegexp to assertRaisesRegex,
- # and fires deprecation warnings if a program uses the old name.
- if not hasattr(self, "assertRaisesRegex"):
- self.assertRaisesRegex = self.assertRaisesRegexp
+class SubsetTest:
+ @classmethod
+ def setup_class(cls):
+ cls.tempdir = None
+ cls.num_tempfiles = 0
- def setUp(self):
- self.tempdir = None
- self.num_tempfiles = 0
-
- def tearDown(self):
- if self.tempdir:
- shutil.rmtree(self.tempdir)
+ @classmethod
+ def teardown_class(cls):
+ if cls.tempdir:
+ shutil.rmtree(cls.tempdir, ignore_errors=True)
@staticmethod
def getpath(testfile):
path, _ = os.path.split(__file__)
return os.path.join(path, "data", testfile)
- def temp_path(self, suffix):
- if not self.tempdir:
- self.tempdir = tempfile.mkdtemp()
- self.num_tempfiles += 1
- return os.path.join(self.tempdir,
- "tmp%d%s" % (self.num_tempfiles, suffix))
-
- def read_ttx(self, path):
- lines = []
- with open(path, "r", encoding="utf-8") as ttx:
- for line in ttx.readlines():
- # Elide ttFont attributes because ttLibVersion may change.
- if line.startswith("<ttFont "):
- lines.append("<ttFont>\n")
- else:
- lines.append(line.rstrip() + "\n")
- return lines
+ @classmethod
+ def temp_path(cls, suffix):
+ if not cls.tempdir:
+ cls.tempdir = tempfile.mkdtemp()
+ cls.num_tempfiles += 1
+ return os.path.join(cls.tempdir,
+ "tmp%d%s" % (cls.num_tempfiles, suffix))
+
+ @staticmethod
+ def read_ttx(path):
+ with open(path, "r", encoding="utf-8") as f:
+ ttx = f.read()
+ # don't care whether TTF or OTF, thus strip sfntVersion as well
+ return stripVariableItemsFromTTX(ttx, sfntVersion=True).splitlines(True)
def expect_ttx(self, font, expected_ttx, tables=None):
path = self.temp_path(suffix=".ttx")
@@ -67,21 +60,21 @@ class SubsetTest(unittest.TestCase):
for line in difflib.unified_diff(
expected, actual, fromfile=expected_ttx, tofile=path):
sys.stdout.write(line)
- self.fail("TTX output is different from expected")
+ pytest.fail("TTX output is different from expected")
def compile_font(self, path, suffix):
savepath = self.temp_path(suffix=suffix)
font = TTFont(recalcBBoxes=False, recalcTimestamp=False)
font.importXML(path)
font.save(savepath, reorderTables=None)
- return font, savepath
+ return savepath
# -----
# Tests
# -----
def test_layout_scripts(self):
- _, fontpath = self.compile_font(self.getpath("layout_scripts.ttx"), ".otf")
+ fontpath = self.compile_font(self.getpath("layout_scripts.ttx"), ".otf")
subsetpath = self.temp_path(".otf")
subset.main([fontpath, "--glyphs=*", "--layout-features=*",
"--layout-scripts=latn,arab.URD,arab.dflt",
@@ -91,41 +84,41 @@ class SubsetTest(unittest.TestCase):
["GPOS", "GSUB"])
def test_no_notdef_outline_otf(self):
- _, fontpath = self.compile_font(self.getpath("TestOTF-Regular.ttx"), ".otf")
+ fontpath = self.compile_font(self.getpath("TestOTF-Regular.ttx"), ".otf")
subsetpath = self.temp_path(".otf")
subset.main([fontpath, "--no-notdef-outline", "--gids=0", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_no_notdef_outline_otf.ttx"), ["CFF "])
def test_no_notdef_outline_cid(self):
- _, fontpath = self.compile_font(self.getpath("TestCID-Regular.ttx"), ".otf")
+ fontpath = self.compile_font(self.getpath("TestCID-Regular.ttx"), ".otf")
subsetpath = self.temp_path(".otf")
subset.main([fontpath, "--no-notdef-outline", "--gids=0", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_no_notdef_outline_cid.ttx"), ["CFF "])
def test_no_notdef_outline_ttf(self):
- _, fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--no-notdef-outline", "--gids=0", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_no_notdef_outline_ttf.ttx"), ["glyf", "hmtx"])
def test_subset_ankr(self):
- _, fontpath = self.compile_font(self.getpath("TestANKR.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestANKR.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=one", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_ankr.ttx"), ["ankr"])
def test_subset_ankr_remove(self):
- _, fontpath = self.compile_font(self.getpath("TestANKR.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestANKR.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=two", "--output-file=%s" % subsetpath])
- self.assertNotIn("ankr", TTFont(subsetpath))
+ assert "ankr" not in TTFont(subsetpath)
def test_subset_bsln_format_0(self):
- _, fontpath = self.compile_font(self.getpath("TestBSLN-0.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestBSLN-0.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=one", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
@@ -138,7 +131,7 @@ class SubsetTest(unittest.TestCase):
# a subsetted font with {zero, one} and the implicit .notdef, all
# glyphs in the resulting font use the Roman baseline. In this case,
# we expect a format 0 'bsln' table because it is the most compact.
- _, fontpath = self.compile_font(self.getpath("TestBSLN-1.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestBSLN-1.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+0030-0031",
"--output-file=%s" % subsetpath])
@@ -154,7 +147,7 @@ class SubsetTest(unittest.TestCase):
# subsetted font, we expect a format 1 'bsln' table whose default
# is Roman, but with an override that uses the ideographic baseline
# for uni2EA2.
- _, fontpath = self.compile_font(self.getpath("TestBSLN-1.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestBSLN-1.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+0030-0031,U+2EA2",
"--output-file=%s" % subsetpath])
@@ -165,7 +158,7 @@ class SubsetTest(unittest.TestCase):
# The 'bsln' table in TestBSLN-2 refers to control points in glyph 'P'
# for defining its baselines. Therefore, the subsetted font should
# include this glyph even though it is not requested explicitly.
- _, fontpath = self.compile_font(self.getpath("TestBSLN-2.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestBSLN-2.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=one", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
@@ -179,7 +172,7 @@ class SubsetTest(unittest.TestCase):
# baseline measurement, all glyphs in the resulting font use the Roman
# baseline. In this case, we expect a format 2 'bsln' table because it
# is the most compact encoding.
- _, fontpath = self.compile_font(self.getpath("TestBSLN-3.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestBSLN-3.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+0030",
"--output-file=%s" % subsetpath])
@@ -195,7 +188,7 @@ class SubsetTest(unittest.TestCase):
# subsetted font, we expect a format 1 'bsln' table whose default
# is Roman, but with an override that uses the ideographic baseline
# for uni2EA2.
- _, fontpath = self.compile_font(self.getpath("TestBSLN-3.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestBSLN-3.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+0030-0031,U+2EA2",
"--output-file=%s" % subsetpath])
@@ -203,35 +196,35 @@ class SubsetTest(unittest.TestCase):
self.expect_ttx(subsetfont, self.getpath("expect_bsln_3.ttx"), ["bsln"])
def test_subset_clr(self):
- _, fontpath = self.compile_font(self.getpath("TestCLR-Regular.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestCLR-Regular.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=smileface", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_keep_colr.ttx"), ["GlyphOrder", "hmtx", "glyf", "COLR", "CPAL"])
def test_subset_gvar(self):
- _, fontpath = self.compile_font(self.getpath("TestGVAR.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestGVAR.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+002B,U+2212", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_keep_gvar.ttx"), ["GlyphOrder", "avar", "fvar", "gvar", "name"])
def test_subset_gvar_notdef_outline(self):
- _, fontpath = self.compile_font(self.getpath("TestGVAR.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestGVAR.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+0030", "--notdef_outline", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_keep_gvar_notdef_outline.ttx"), ["GlyphOrder", "avar", "fvar", "gvar", "name"])
def test_subset_lcar_remove(self):
- _, fontpath = self.compile_font(self.getpath("TestLCAR-0.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestLCAR-0.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=one", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
- self.assertNotIn("lcar", subsetfont)
+ assert "lcar" not in subsetfont
def test_subset_lcar_format_0(self):
- _, fontpath = self.compile_font(self.getpath("TestLCAR-0.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestLCAR-0.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+FB01",
"--output-file=%s" % subsetpath])
@@ -239,7 +232,7 @@ class SubsetTest(unittest.TestCase):
self.expect_ttx(subsetfont, self.getpath("expect_lcar_0.ttx"), ["lcar"])
def test_subset_lcar_format_1(self):
- _, fontpath = self.compile_font(self.getpath("TestLCAR-1.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestLCAR-1.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+FB01",
"--output-file=%s" % subsetpath])
@@ -247,14 +240,14 @@ class SubsetTest(unittest.TestCase):
self.expect_ttx(subsetfont, self.getpath("expect_lcar_1.ttx"), ["lcar"])
def test_subset_math(self):
- _, fontpath = self.compile_font(self.getpath("TestMATH-Regular.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestMATH-Regular.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+0041,U+0028,U+0302,U+1D400,U+1D435", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_keep_math.ttx"), ["GlyphOrder", "CFF ", "MATH", "hmtx"])
def test_subset_math_partial(self):
- _, fontpath = self.compile_font(self.getpath("test_math_partial.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("test_math_partial.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--text=A", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
@@ -265,21 +258,21 @@ class SubsetTest(unittest.TestCase):
# the Optical Bounds table. When subsetting, we do not request any
# of those glyphs. Therefore, the produced subsetted font should
# not contain an 'opbd' table.
- _, fontpath = self.compile_font(self.getpath("TestOPBD-0.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestOPBD-0.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=one", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
- self.assertNotIn("opbd", subsetfont)
+ assert "opbd" not in subsetfont
def test_subset_opbd_format_0(self):
- _, fontpath = self.compile_font(self.getpath("TestOPBD-0.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestOPBD-0.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=A", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_opbd_0.ttx"), ["opbd"])
def test_subset_opbd_format_1(self):
- _, fontpath = self.compile_font(self.getpath("TestOPBD-1.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestOPBD-1.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=A", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
@@ -288,12 +281,12 @@ class SubsetTest(unittest.TestCase):
def test_subset_prop_remove_default_zero(self):
# If all glyphs have an AAT glyph property with value 0,
# the "prop" table should be removed from the subsetted font.
- _, fontpath = self.compile_font(self.getpath("TestPROP.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestPROP.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+0041",
"--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
- self.assertNotIn("prop", subsetfont)
+ assert "prop" not in subsetfont
def test_subset_prop_0(self):
# If all glyphs share the same AAT glyph properties, the "prop" table
@@ -302,7 +295,7 @@ class SubsetTest(unittest.TestCase):
# Unless the shared value is zero, in which case the subsetted font
# should have no "prop" table at all. But that case has already been
# tested above in test_subset_prop_remove_default_zero().
- _, fontpath = self.compile_font(self.getpath("TestPROP.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestPROP.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+0030-0032", "--no-notdef-glyph",
"--output-file=%s" % subsetpath])
@@ -313,7 +306,7 @@ class SubsetTest(unittest.TestCase):
# If not all glyphs share the same AAT glyph properties, the subsetted
# font should contain a "prop" table in format 1. To save space, the
# DefaultProperties should be set to the most frequent value.
- _, fontpath = self.compile_font(self.getpath("TestPROP.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestPROP.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=U+0030-0032", "--notdef-outline",
"--output-file=%s" % subsetpath])
@@ -323,32 +316,32 @@ class SubsetTest(unittest.TestCase):
def test_options(self):
# https://github.com/fonttools/fonttools/issues/413
opt1 = subset.Options()
- self.assertTrue('Xyz-' not in opt1.layout_features)
+ assert 'Xyz-' not in opt1.layout_features
opt2 = subset.Options()
opt2.layout_features.append('Xyz-')
- self.assertTrue('Xyz-' in opt2.layout_features)
- self.assertTrue('Xyz-' not in opt1.layout_features)
+ assert 'Xyz-' in opt2.layout_features
+ assert 'Xyz-' not in opt1.layout_features
def test_google_color(self):
- _, fontpath = self.compile_font(self.getpath("google_color.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("google_color.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--gids=0,1", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
- self.assertTrue("CBDT" in subsetfont)
- self.assertTrue("CBLC" in subsetfont)
- self.assertTrue("x" in subsetfont['CBDT'].strikeData[0])
- self.assertFalse("y" in subsetfont['CBDT'].strikeData[0])
+ assert "CBDT" in subsetfont
+ assert "CBLC" in subsetfont
+ assert "x" in subsetfont['CBDT'].strikeData[0]
+ assert "y" not in subsetfont['CBDT'].strikeData[0]
def test_google_color_all(self):
- _, fontpath = self.compile_font(self.getpath("google_color.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("google_color.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=*", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
- self.assertTrue("x" in subsetfont['CBDT'].strikeData[0])
- self.assertTrue("y" in subsetfont['CBDT'].strikeData[0])
+ assert "x" in subsetfont['CBDT'].strikeData[0]
+ assert "y" in subsetfont['CBDT'].strikeData[0]
def test_sbix(self):
- _, fontpath = self.compile_font(self.getpath("sbix.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("sbix.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--gids=0,1", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
@@ -356,7 +349,7 @@ class SubsetTest(unittest.TestCase):
"expect_sbix.ttx"), ["sbix"])
def test_timing_publishes_parts(self):
- _, fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
options = subset.Options()
options.timing = True
@@ -367,15 +360,15 @@ class SubsetTest(unittest.TestCase):
subsetter.subset(font)
logs = captor.records
- self.assertTrue(len(logs) > 5)
- self.assertEqual(len(logs), len([l for l in logs if 'msg' in l.args and 'time' in l.args]))
+ assert len(logs) > 5
+ assert len(logs) == len([l for l in logs if 'msg' in l.args and 'time' in l.args])
# Look for a few things we know should happen
- self.assertTrue(filter(lambda l: l.args['msg'] == "load 'cmap'", logs))
- self.assertTrue(filter(lambda l: l.args['msg'] == "subset 'cmap'", logs))
- self.assertTrue(filter(lambda l: l.args['msg'] == "subset 'glyf'", logs))
+ assert filter(lambda l: l.args['msg'] == "load 'cmap'", logs)
+ assert filter(lambda l: l.args['msg'] == "subset 'cmap'", logs)
+ assert filter(lambda l: l.args['msg'] == "subset 'glyf'", logs)
def test_passthrough_tables(self):
- _, fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
font = TTFont(fontpath)
unknown_tag = 'ZZZZ'
unknown_table = newTable(unknown_tag)
@@ -388,17 +381,17 @@ class SubsetTest(unittest.TestCase):
subsetfont = TTFont(subsetpath)
# tables we can't subset are dropped by default
- self.assertFalse(unknown_tag in subsetfont)
+ assert unknown_tag not in subsetfont
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--passthrough-tables", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
# unknown tables are kept if --passthrough-tables option is passed
- self.assertTrue(unknown_tag in subsetfont)
+ assert unknown_tag in subsetfont
def test_non_BMP_text_arg_input(self):
- _, fontpath = self.compile_font(
+ fontpath = self.compile_font(
self.getpath("TestTTF-Regular_non_BMP_char.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
text = tostr(u"A\U0001F6D2", encoding='utf-8')
@@ -406,11 +399,11 @@ class SubsetTest(unittest.TestCase):
subset.main([fontpath, "--text=%s" % text, "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
- self.assertEqual(subsetfont['maxp'].numGlyphs, 3)
- self.assertEqual(subsetfont.getGlyphOrder(), ['.notdef', 'A', 'u1F6D2'])
+ assert subsetfont['maxp'].numGlyphs == 3
+ assert subsetfont.getGlyphOrder() == ['.notdef', 'A', 'u1F6D2']
def test_non_BMP_text_file_input(self):
- _, fontpath = self.compile_font(
+ fontpath = self.compile_font(
self.getpath("TestTTF-Regular_non_BMP_char.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
text = tobytes(u"A\U0001F6D2", encoding='utf-8')
@@ -424,12 +417,12 @@ class SubsetTest(unittest.TestCase):
finally:
os.remove(tmp.name)
- self.assertEqual(subsetfont['maxp'].numGlyphs, 3)
- self.assertEqual(subsetfont.getGlyphOrder(), ['.notdef', 'A', 'u1F6D2'])
+ assert subsetfont['maxp'].numGlyphs == 3
+ assert subsetfont.getGlyphOrder() == ['.notdef', 'A', 'u1F6D2']
def test_no_hinting_CFF(self):
ttxpath = self.getpath("Lobster.subset.ttx")
- _, fontpath = self.compile_font(ttxpath, ".otf")
+ fontpath = self.compile_font(ttxpath, ".otf")
subsetpath = self.temp_path(".otf")
subset.main([fontpath, "--no-hinting", "--notdef-outline",
"--output-file=%s" % subsetpath, "*"])
@@ -439,7 +432,7 @@ class SubsetTest(unittest.TestCase):
def test_desubroutinize_CFF(self):
ttxpath = self.getpath("Lobster.subset.ttx")
- _, fontpath = self.compile_font(ttxpath, ".otf")
+ fontpath = self.compile_font(ttxpath, ".otf")
subsetpath = self.temp_path(".otf")
subset.main([fontpath, "--desubroutinize", "--notdef-outline",
"--output-file=%s" % subsetpath, "*"])
@@ -449,7 +442,7 @@ class SubsetTest(unittest.TestCase):
def test_desubroutinize_hinted_subrs_CFF(self):
ttxpath = self.getpath("test_hinted_subrs_CFF.ttx")
- _, fontpath = self.compile_font(ttxpath, ".otf")
+ fontpath = self.compile_font(ttxpath, ".otf")
subsetpath = self.temp_path(".otf")
subset.main([fontpath, "--desubroutinize", "--notdef-outline",
"--output-file=%s" % subsetpath, "*"])
@@ -459,7 +452,7 @@ class SubsetTest(unittest.TestCase):
def test_desubroutinize_cntrmask_CFF(self):
ttxpath = self.getpath("test_cntrmask_CFF.ttx")
- _, fontpath = self.compile_font(ttxpath, ".otf")
+ fontpath = self.compile_font(ttxpath, ".otf")
subsetpath = self.temp_path(".otf")
subset.main([fontpath, "--desubroutinize", "--notdef-outline",
"--output-file=%s" % subsetpath, "*"])
@@ -469,7 +462,7 @@ class SubsetTest(unittest.TestCase):
def test_no_hinting_desubroutinize_CFF(self):
ttxpath = self.getpath("test_hinted_subrs_CFF.ttx")
- _, fontpath = self.compile_font(ttxpath, ".otf")
+ fontpath = self.compile_font(ttxpath, ".otf")
subsetpath = self.temp_path(".otf")
subset.main([fontpath, "--no-hinting", "--desubroutinize", "--notdef-outline",
"--output-file=%s" % subsetpath, "*"])
@@ -478,7 +471,7 @@ class SubsetTest(unittest.TestCase):
"expect_no_hinting_desubroutinize_CFF.ttx"), ["CFF "])
def test_no_hinting_TTF(self):
- _, fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--no-hinting", "--notdef-outline",
"--output-file=%s" % subsetpath, "*"])
@@ -486,11 +479,11 @@ class SubsetTest(unittest.TestCase):
self.expect_ttx(subsetfont, self.getpath(
"expect_no_hinting_TTF.ttx"), ["glyf", "maxp"])
for tag in subset.Options().hinting_tables:
- self.assertTrue(tag not in subsetfont)
+ assert tag not in subsetfont
def test_notdef_width_cid(self):
# https://github.com/fonttools/fonttools/pull/845
- _, fontpath = self.compile_font(self.getpath("NotdefWidthCID-Regular.ttx"), ".otf")
+ fontpath = self.compile_font(self.getpath("NotdefWidthCID-Regular.ttx"), ".otf")
subsetpath = self.temp_path(".otf")
subset.main([fontpath, "--no-notdef-outline", "--gids=0,1", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
@@ -503,18 +496,18 @@ class SubsetTest(unittest.TestCase):
head = font['head']
bounds = [head.xMin, head.yMin, head.xMax, head.yMax]
- _, fontpath = self.compile_font(ttxpath, ".ttf")
+ fontpath = self.compile_font(ttxpath, ".ttf")
subsetpath = self.temp_path(".ttf")
# by default, the subsetter does not recalculate the bounding box
subset.main([fontpath, "--output-file=%s" % subsetpath, "*"])
head = TTFont(subsetpath)['head']
- self.assertEqual(bounds, [head.xMin, head.yMin, head.xMax, head.yMax])
+ assert bounds == [head.xMin, head.yMin, head.xMax, head.yMax]
subset.main([fontpath, "--recalc-bounds", "--output-file=%s" % subsetpath, "*"])
head = TTFont(subsetpath)['head']
bounds = [132, 304, 365, 567]
- self.assertEqual(bounds, [head.xMin, head.yMin, head.xMax, head.yMax])
+ assert bounds == [head.xMin, head.yMin, head.xMax, head.yMax]
def test_recalc_bounds_otf(self):
ttxpath = self.getpath("TestOTF-Regular.ttx")
@@ -523,76 +516,76 @@ class SubsetTest(unittest.TestCase):
head = font['head']
bounds = [head.xMin, head.yMin, head.xMax, head.yMax]
- _, fontpath = self.compile_font(ttxpath, ".otf")
+ fontpath = self.compile_font(ttxpath, ".otf")
subsetpath = self.temp_path(".otf")
# by default, the subsetter does not recalculate the bounding box
subset.main([fontpath, "--output-file=%s" % subsetpath, "*"])
head = TTFont(subsetpath)['head']
- self.assertEqual(bounds, [head.xMin, head.yMin, head.xMax, head.yMax])
+ assert bounds == [head.xMin, head.yMin, head.xMax, head.yMax]
subset.main([fontpath, "--recalc-bounds", "--output-file=%s" % subsetpath, "*"])
head = TTFont(subsetpath)['head']
bounds = [132, 304, 365, 567]
- self.assertEqual(bounds, [head.xMin, head.yMin, head.xMax, head.yMax])
+ assert bounds == [head.xMin, head.yMin, head.xMax, head.yMax]
def test_recalc_timestamp_ttf(self):
ttxpath = self.getpath("TestTTF-Regular.ttx")
font = TTFont()
font.importXML(ttxpath)
modified = font['head'].modified
- _, fontpath = self.compile_font(ttxpath, ".ttf")
+ fontpath = self.compile_font(ttxpath, ".ttf")
subsetpath = self.temp_path(".ttf")
# by default, the subsetter does not recalculate the modified timestamp
subset.main([fontpath, "--output-file=%s" % subsetpath, "*"])
- self.assertEqual(modified, TTFont(subsetpath)['head'].modified)
+ assert modified == TTFont(subsetpath)['head'].modified
subset.main([fontpath, "--recalc-timestamp", "--output-file=%s" % subsetpath, "*"])
- self.assertLess(modified, TTFont(subsetpath)['head'].modified)
+ assert modified < TTFont(subsetpath)['head'].modified
def test_recalc_timestamp_otf(self):
ttxpath = self.getpath("TestOTF-Regular.ttx")
font = TTFont()
font.importXML(ttxpath)
modified = font['head'].modified
- _, fontpath = self.compile_font(ttxpath, ".otf")
+ fontpath = self.compile_font(ttxpath, ".otf")
subsetpath = self.temp_path(".otf")
# by default, the subsetter does not recalculate the modified timestamp
subset.main([fontpath, "--output-file=%s" % subsetpath, "*"])
- self.assertEqual(modified, TTFont(subsetpath)['head'].modified)
+ assert modified == TTFont(subsetpath)['head'].modified
subset.main([fontpath, "--recalc-timestamp", "--output-file=%s" % subsetpath, "*"])
- self.assertLess(modified, TTFont(subsetpath)['head'].modified)
+ assert modified < TTFont(subsetpath)['head'].modified
def test_recalc_max_context(self):
ttxpath = self.getpath("Lobster.subset.ttx")
font = TTFont()
font.importXML(ttxpath)
max_context = font['OS/2'].usMaxContext
- _, fontpath = self.compile_font(ttxpath, ".otf")
+ fontpath = self.compile_font(ttxpath, ".otf")
subsetpath = self.temp_path(".otf")
# by default, the subsetter does not recalculate the usMaxContext
subset.main([fontpath, "--drop-tables+=GSUB,GPOS",
"--output-file=%s" % subsetpath])
- self.assertEqual(max_context, TTFont(subsetpath)['OS/2'].usMaxContext)
+ assert max_context == TTFont(subsetpath)['OS/2'].usMaxContext
subset.main([fontpath, "--recalc-max-context",
"--drop-tables+=GSUB,GPOS",
"--output-file=%s" % subsetpath])
- self.assertEqual(0, TTFont(subsetpath)['OS/2'].usMaxContext)
+ assert 0 == TTFont(subsetpath)['OS/2'].usMaxContext
def test_retain_gids_ttf(self):
- _, fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
font = TTFont(fontpath)
- self.assertEqual(font["hmtx"]["A"], (500, 132))
- self.assertEqual(font["hmtx"]["B"], (400, 132))
+ assert font["hmtx"]["A"] == (500, 132)
+ assert font["hmtx"]["B"] == (400, 132)
- self.assertGreater(font["glyf"]["A"].numberOfContours, 0)
- self.assertGreater(font["glyf"]["B"].numberOfContours, 0)
+ assert font["glyf"]["A"].numberOfContours > 0
+ assert font["glyf"]["B"].numberOfContours > 0
subsetpath = self.temp_path(".ttf")
subset.main(
@@ -606,29 +599,29 @@ class SubsetTest(unittest.TestCase):
)
subsetfont = TTFont(subsetpath)
- self.assertEqual(subsetfont.getGlyphOrder(), font.getGlyphOrder()[0:3])
+ assert subsetfont.getGlyphOrder() == font.getGlyphOrder()[0:3]
hmtx = subsetfont["hmtx"]
- self.assertEqual(hmtx["A"], ( 0, 0))
- self.assertEqual(hmtx["B"], (400, 132))
+ assert hmtx["A"] == (0, 0)
+ assert hmtx["B"] == (400, 132)
glyf = subsetfont["glyf"]
- self.assertEqual(glyf["A"].numberOfContours, 0)
- self.assertGreater(glyf["B"].numberOfContours, 0)
+ assert glyf["A"].numberOfContours == 0
+ assert glyf["B"].numberOfContours > 0
def test_retain_gids_cff(self):
- _, fontpath = self.compile_font(self.getpath("TestOTF-Regular.ttx"), ".otf")
+ fontpath = self.compile_font(self.getpath("TestOTF-Regular.ttx"), ".otf")
font = TTFont(fontpath)
- self.assertEqual(font["hmtx"]["A"], (500, 132))
- self.assertEqual(font["hmtx"]["B"], (400, 132))
- self.assertEqual(font["hmtx"]["C"], (500, 0))
+ assert font["hmtx"]["A"] == (500, 132)
+ assert font["hmtx"]["B"] == (400, 132)
+ assert font["hmtx"]["C"] == (500, 0)
font["CFF "].cff[0].decompileAllCharStrings()
cs = font["CFF "].cff[0].CharStrings
- self.assertGreater(len(cs["A"].program), 0)
- self.assertGreater(len(cs["B"].program), 0)
- self.assertGreater(len(cs["C"].program), 0)
+ assert len(cs["A"].program) > 0
+ assert len(cs["B"].program) > 0
+ assert len(cs["C"].program) > 0
subsetpath = self.temp_path(".otf")
subset.main(
@@ -642,29 +635,30 @@ class SubsetTest(unittest.TestCase):
)
subsetfont = TTFont(subsetpath)
- self.assertEqual(subsetfont.getGlyphOrder(), font.getGlyphOrder()[0:3])
+ assert subsetfont.getGlyphOrder() == font.getGlyphOrder()[0:3]
hmtx = subsetfont["hmtx"]
- self.assertEqual(hmtx["A"], (0, 0))
- self.assertEqual(hmtx["B"], (400, 132))
+ assert hmtx["A"] == (0, 0)
+ assert hmtx["B"] == (400, 132)
subsetfont["CFF "].cff[0].decompileAllCharStrings()
cs = subsetfont["CFF "].cff[0].CharStrings
- self.assertEqual(cs["A"].program, ["endchar"])
- self.assertGreater(len(cs["B"].program), 0)
+ assert cs["A"].program == ["endchar"]
+ assert len(cs["B"].program) > 0
def test_retain_gids_cff2(self):
ttx_path = self.getpath("../../varLib/data/master_ttx_varfont_otf/TestCFF2VF.ttx")
- font, fontpath = self.compile_font(ttx_path, ".otf")
+ fontpath = self.compile_font(ttx_path, ".otf")
+ font = TTFont(fontpath)
- self.assertEqual(font["hmtx"]["A"], (600, 31))
- self.assertEqual(font["hmtx"]["T"], (600, 41))
+ assert font["hmtx"]["A"] == (600, 31)
+ assert font["hmtx"]["T"] == (600, 41)
font["CFF2"].cff[0].decompileAllCharStrings()
cs = font["CFF2"].cff[0].CharStrings
- self.assertGreater(len(cs["A"].program), 0)
- self.assertGreater(len(cs["T"].program), 0)
+ assert len(cs["A"].program) > 0
+ assert len(cs["T"].program) > 0
subsetpath = self.temp_path(".otf")
subset.main(
@@ -677,33 +671,33 @@ class SubsetTest(unittest.TestCase):
)
subsetfont = TTFont(subsetpath)
- self.assertEqual(len(subsetfont.getGlyphOrder()), len(font.getGlyphOrder()[0:3]))
+ assert len(subsetfont.getGlyphOrder()) == len(font.getGlyphOrder()[0:3])
hmtx = subsetfont["hmtx"]
- self.assertEqual(hmtx["glyph00001"], ( 0, 0))
- self.assertEqual(hmtx["T"], (600, 41))
+ assert hmtx["glyph00001"] == (0, 0)
+ assert hmtx["T"] == (600, 41)
subsetfont["CFF2"].cff[0].decompileAllCharStrings()
cs = subsetfont["CFF2"].cff[0].CharStrings
- self.assertEqual(cs["glyph00001"].program, [])
- self.assertGreater(len(cs["T"].program), 0)
+ assert cs["glyph00001"].program == []
+ assert len(cs["T"].program) > 0
def test_HVAR_VVAR(self):
- _, fontpath = self.compile_font(self.getpath("TestHVVAR.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestHVVAR.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--text=BD", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_HVVAR.ttx"), ["GlyphOrder", "HVAR", "VVAR", "avar", "fvar"])
def test_HVAR_VVAR_retain_gids(self):
- _, fontpath = self.compile_font(self.getpath("TestHVVAR.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestHVVAR.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--text=BD", "--retain-gids", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("expect_HVVAR_retain_gids.ttx"), ["GlyphOrder", "HVAR", "VVAR", "avar", "fvar"])
def test_subset_flavor(self):
- _, fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("TestTTF-Regular.ttx"), ".ttf")
font = TTFont(fontpath)
woff_path = self.temp_path(".woff")
@@ -717,7 +711,7 @@ class SubsetTest(unittest.TestCase):
)
woff = TTFont(woff_path)
- self.assertEqual(woff.flavor, "woff")
+ assert woff.flavor == "woff"
woff2_path = self.temp_path(".woff2")
subset.main(
@@ -730,7 +724,7 @@ class SubsetTest(unittest.TestCase):
)
woff2 = TTFont(woff2_path)
- self.assertEqual(woff2.flavor, "woff2")
+ assert woff2.flavor == "woff2"
ttf_path = self.temp_path(".ttf")
subset.main(
@@ -742,13 +736,13 @@ class SubsetTest(unittest.TestCase):
)
ttf = TTFont(ttf_path)
- self.assertEqual(ttf.flavor, None)
+ assert ttf.flavor is None
def test_subset_context_subst_format_3(self):
# https://github.com/fonttools/fonttools/issues/1879
# Test font contains 'calt' feature with Format 3 ContextSubst lookup subtables
ttx = self.getpath("TestContextSubstFormat3.ttx")
- font, fontpath = self.compile_font(ttx, ".ttf")
+ fontpath = self.compile_font(ttx, ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--unicodes=*", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
@@ -756,13 +750,14 @@ class SubsetTest(unittest.TestCase):
self.expect_ttx(subsetfont, ttx)
def test_cmap_prune_format12(self):
- _, fontpath = self.compile_font(self.getpath("CmapSubsetTest.ttx"), ".ttf")
+ fontpath = self.compile_font(self.getpath("CmapSubsetTest.ttx"), ".ttf")
subsetpath = self.temp_path(".ttf")
subset.main([fontpath, "--glyphs=a", "--output-file=%s" % subsetpath])
subsetfont = TTFont(subsetpath)
self.expect_ttx(subsetfont, self.getpath("CmapSubsetTest.subset.ttx"), ["cmap"])
- def test_GPOS_PairPos_Format2_useClass0(self):
+ @pytest.mark.parametrize("text, n", [("!", 1), ("#", 2)])
+ def test_GPOS_PairPos_Format2_useClass0(self, text, n):
# Check two things related to class 0 ('every other glyph'):
# 1) that it's reused for ClassDef1 when it becomes empty as the subset glyphset
# is intersected with the table's Coverage
@@ -772,29 +767,27 @@ class SubsetTest(unittest.TestCase):
# The test font (from Harfbuzz test suite) is constructed to trigger these two
# situations depending on the input subset --text.
# https://github.com/fonttools/fonttools/pull/2221
- _, fontpath = self.compile_font(
+ fontpath = self.compile_font(
self.getpath("GPOS_PairPos_Format2_PR_2221.ttx"), ".ttf"
)
subsetpath = self.temp_path(".ttf")
- for n, text in enumerate("!#", start=1):
- expected_ttx = self.getpath(
- f"GPOS_PairPos_Format2_ClassDef{n}_useClass0.subset.ttx"
- )
- with self.subTest(text=text, expected_ttx=expected_ttx):
- subset.main(
- [
- fontpath,
- f"--text='{text}'",
- "--layout-features+=test",
- "--output-file=%s" % subsetpath,
- ]
- )
- subsetfont = TTFont(subsetpath)
- self.expect_ttx(subsetfont, expected_ttx, ["GPOS"])
+ expected_ttx = self.getpath(
+ f"GPOS_PairPos_Format2_ClassDef{n}_useClass0.subset.ttx"
+ )
+ subset.main(
+ [
+ fontpath,
+ f"--text='{text}'",
+ "--layout-features+=test",
+ "--output-file=%s" % subsetpath,
+ ]
+ )
+ subsetfont = TTFont(subsetpath)
+ self.expect_ttx(subsetfont, expected_ttx, ["GPOS"])
def test_GPOS_SinglePos_prune_post_subset_no_value(self):
- _, fontpath = self.compile_font(
+ fontpath = self.compile_font(
self.getpath("GPOS_SinglePos_no_value_issue_2312.ttx"), ".ttf"
)
subsetpath = self.temp_path(".ttf")
@@ -806,6 +799,91 @@ class SubsetTest(unittest.TestCase):
["GlyphOrder", "GPOS"],
)
+ @pytest.mark.parametrize(
+ "installed, enabled, ok",
+ [
+ pytest.param(True, None, True, id="installed-auto-ok"),
+ pytest.param(True, None, False, id="installed-auto-fail"),
+ pytest.param(True, True, True, id="installed-enabled-ok"),
+ pytest.param(True, True, False, id="installed-enabled-fail"),
+ pytest.param(True, False, True, id="installed-disabled"),
+ pytest.param(False, True, True, id="not_installed-enabled"),
+ pytest.param(False, False, True, id="not_installed-disabled"),
+ ],
+ )
+ def test_harfbuzz_repacker(self, caplog, monkeypatch, installed, enabled, ok):
+ # Use a mock to test the pure-python serializer is used when uharfbuzz
+ # returns an error or is not installed
+ have_uharfbuzz = fontTools.ttLib.tables.otBase.have_uharfbuzz
+ if installed:
+ if not have_uharfbuzz:
+ pytest.skip("uharfbuzz is not installed")
+ if not ok:
+ # pretend hb.repack returns an error
+ import uharfbuzz as hb
+
+ def mock_repack(data, obj_list):
+ raise hb.RepackerError("mocking")
+
+ monkeypatch.setattr(hb, "repack", mock_repack)
+ else:
+ if have_uharfbuzz:
+ # pretend uharfbuzz is not installed
+ monkeypatch.setattr(
+ fontTools.ttLib.tables.otBase, "have_uharfbuzz", False
+ )
+
+ fontpath = self.compile_font(self.getpath("harfbuzz_repacker.ttx"), ".otf")
+ subsetpath = self.temp_path(".otf")
+ args = [
+ fontpath,
+ "--unicodes=0x53a9",
+ "--layout-features=*",
+ f"--output-file={subsetpath}",
+ ]
+ if enabled is True:
+ args.append("--harfbuzz-repacker")
+ elif enabled is False:
+ args.append("--no-harfbuzz-repacker")
+ # elif enabled is None: ... is the default
+
+ if enabled is True and not installed:
+ # raise if enabled but not installed
+ with pytest.raises(ImportError, match="uharfbuzz"):
+ subset.main(args)
+ return
+
+ with caplog.at_level(logging.DEBUG, "fontTools.ttLib.tables.otBase"):
+ subset.main(args)
+
+ subsetfont = TTFont(subsetpath)
+ # both hb.repack and pure-python serializer compile to the same ttx
+ self.expect_ttx(
+ subsetfont, self.getpath("expect_harfbuzz_repacker.ttx"), ["GSUB"]
+ )
+
+ if enabled or enabled is None:
+ if installed:
+ assert "serializing 'GSUB' with hb.repack" in caplog.text
+
+ if enabled is None and not installed:
+ assert (
+ "uharfbuzz not found, compiling 'GSUB' with pure-python serializer"
+ ) in caplog.text
+
+ if enabled is False:
+ assert (
+ "hb.repack disabled, compiling 'GSUB' with pure-python serializer"
+ ) in caplog.text
+
+ # test we emit a log.error if hb.repack fails (and we don't if successful)
+ assert (
+ (
+ "hb.repack failed to serialize 'GSUB', reverting to "
+ "pure-python serializer; the error message was: RepackerError: mocking"
+ ) in caplog.text
+ ) ^ ok
+
@pytest.fixture
def featureVarsTestFont():
diff --git a/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_diff.ttx b/Tests/varLib/data/test_results/InterpolateLayoutGPOS_8_diff.ttx
index 14e12097..0086ddc3 100644
--- a/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_diff.ttx
+++ b/Tests/varLib/data/test_results/InterpolateLayoutGPOS_8_diff.ttx
@@ -83,21 +83,23 @@
</MarkBasePos>
</Lookup>
<Lookup index="2">
- <LookupType value="7"/>
+ <LookupType value="8"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
- <ContextPos index="0" Format="1">
+ <ChainContextPos index="0" Format="1">
<Coverage>
<Glyph value="A"/>
</Coverage>
- <!-- PosRuleSetCount=1 -->
- <PosRuleSet index="0">
- <!-- PosRuleCount=1 -->
- <PosRule index="0">
- <!-- GlyphCount=3 -->
- <!-- PosCount=2 -->
+ <!-- ChainPosRuleSetCount=1 -->
+ <ChainPosRuleSet index="0">
+ <!-- ChainPosRuleCount=1 -->
+ <ChainPosRule index="0">
+ <!-- BacktrackGlyphCount=0 -->
+ <!-- InputGlyphCount=3 -->
<Input index="0" value="a"/>
<Input index="1" value="uni0303"/>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- PosCount=2 -->
<PosLookupRecord index="0">
<SequenceIndex value="0"/>
<LookupListIndex value="0"/>
@@ -106,9 +108,9 @@
<SequenceIndex value="2"/>
<LookupListIndex value="1"/>
</PosLookupRecord>
- </PosRule>
- </PosRuleSet>
- </ContextPos>
+ </ChainPosRule>
+ </ChainPosRuleSet>
+ </ChainContextPos>
</Lookup>
</LookupList>
</GPOS>
diff --git a/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_same.ttx b/Tests/varLib/data/test_results/InterpolateLayoutGPOS_8_same.ttx
index eff24fc3..a32c94d0 100644
--- a/Tests/varLib/data/test_results/InterpolateLayoutGPOS_7_same.ttx
+++ b/Tests/varLib/data/test_results/InterpolateLayoutGPOS_8_same.ttx
@@ -83,21 +83,23 @@
</MarkBasePos>
</Lookup>
<Lookup index="2">
- <LookupType value="7"/>
+ <LookupType value="8"/>
<LookupFlag value="0"/>
<!-- SubTableCount=1 -->
- <ContextPos index="0" Format="1">
+ <ChainContextPos index="0" Format="1">
<Coverage>
<Glyph value="A"/>
</Coverage>
- <!-- PosRuleSetCount=1 -->
- <PosRuleSet index="0">
- <!-- PosRuleCount=1 -->
- <PosRule index="0">
- <!-- GlyphCount=3 -->
- <!-- PosCount=2 -->
+ <!-- ChainPosRuleSetCount=1 -->
+ <ChainPosRuleSet index="0">
+ <!-- ChainPosRuleCount=1 -->
+ <ChainPosRule index="0">
+ <!-- BacktrackGlyphCount=0 -->
+ <!-- InputGlyphCount=3 -->
<Input index="0" value="a"/>
<Input index="1" value="uni0303"/>
+ <!-- LookAheadGlyphCount=0 -->
+ <!-- PosCount=2 -->
<PosLookupRecord index="0">
<SequenceIndex value="0"/>
<LookupListIndex value="0"/>
@@ -106,9 +108,9 @@
<SequenceIndex value="2"/>
<LookupListIndex value="1"/>
</PosLookupRecord>
- </PosRule>
- </PosRuleSet>
- </ContextPos>
+ </ChainPosRule>
+ </ChainPosRuleSet>
+ </ChainContextPos>
</Lookup>
</LookupList>
</GPOS>
diff --git a/Tests/varLib/instancer/instancer_test.py b/Tests/varLib/instancer/instancer_test.py
index bb2d1758..b9d4ffe9 100644
--- a/Tests/varLib/instancer/instancer_test.py
+++ b/Tests/varLib/instancer/instancer_test.py
@@ -1,4 +1,5 @@
from fontTools.misc.fixedTools import floatToFixedToFloat
+from fontTools.misc.testTools import stripVariableItemsFromTTX
from fontTools.misc.textTools import Tag
from fontTools import ttLib
from fontTools import designspaceLib
@@ -1386,10 +1387,6 @@ def test_setMacOverlapFlags():
assert b.components[0].flags & flagOverlapCompound != 0
-def _strip_ttLibVersion(string):
- return re.sub(' ttLibVersion=".*"', "", string)
-
-
@pytest.fixture
def varfont2():
f = ttLib.TTFont(recalcTimestamp=False)
@@ -1412,7 +1409,7 @@ def _dump_ttx(ttFont):
ttFont2 = ttLib.TTFont(tmp, recalcBBoxes=False, recalcTimestamp=False)
s = StringIO()
ttFont2.saveXML(s)
- return _strip_ttLibVersion(s.getvalue())
+ return stripVariableItemsFromTTX(s.getvalue())
def _get_expected_instance_ttx(
@@ -1428,7 +1425,7 @@ def _get_expected_instance_ttx(
"r",
encoding="utf-8",
) as fp:
- return _strip_ttLibVersion(fp.read())
+ return stripVariableItemsFromTTX(fp.read())
class InstantiateVariableFontTest(object):
diff --git a/Tests/varLib/interpolate_layout_test.py b/Tests/varLib/interpolate_layout_test.py
index 18dc3a75..219f087f 100644
--- a/Tests/varLib/interpolate_layout_test.py
+++ b/Tests/varLib/interpolate_layout_test.py
@@ -746,8 +746,8 @@ class InterpolateLayoutTest(unittest.TestCase):
self.check_ttx_dump(instfont, expected_ttx_path, tables, suffix)
- def test_varlib_interpolate_layout_GPOS_only_LookupType_7_same_val_ttf(self):
- """Only GPOS; LookupType 7; same values in all masters.
+ def test_varlib_interpolate_layout_GPOS_only_LookupType_8_same_val_ttf(self):
+ """Only GPOS; LookupType 8; same values in all masters.
"""
suffix = '.ttf'
ds_path = self.get_test_input('InterpolateLayout.designspace')
@@ -779,13 +779,13 @@ class InterpolateLayoutTest(unittest.TestCase):
instfont = interpolate_layout(ds_path, {'weight': 500}, finder)
tables = ['GPOS']
- expected_ttx_path = self.get_test_output('InterpolateLayoutGPOS_7_same.ttx')
+ expected_ttx_path = self.get_test_output('InterpolateLayoutGPOS_8_same.ttx')
self.expect_ttx(instfont, expected_ttx_path, tables)
self.check_ttx_dump(instfont, expected_ttx_path, tables, suffix)
- def test_varlib_interpolate_layout_GPOS_only_LookupType_7_diff_val_ttf(self):
- """Only GPOS; LookupType 7; different values in each master.
+ def test_varlib_interpolate_layout_GPOS_only_LookupType_8_diff_val_ttf(self):
+ """Only GPOS; LookupType 8; different values in each master.
"""
suffix = '.ttf'
ds_path = self.get_test_input('InterpolateLayout.designspace')
@@ -831,7 +831,7 @@ class InterpolateLayoutTest(unittest.TestCase):
instfont = interpolate_layout(ds_path, {'weight': 500}, finder)
tables = ['GPOS']
- expected_ttx_path = self.get_test_output('InterpolateLayoutGPOS_7_diff.ttx')
+ expected_ttx_path = self.get_test_output('InterpolateLayoutGPOS_8_diff.ttx')
self.expect_ttx(instfont, expected_ttx_path, tables)
self.check_ttx_dump(instfont, expected_ttx_path, tables, suffix)
diff --git a/Tests/varLib/stat_test.py b/Tests/varLib/stat_test.py
new file mode 100644
index 00000000..6aa88a05
--- /dev/null
+++ b/Tests/varLib/stat_test.py
@@ -0,0 +1,167 @@
+from pathlib import Path
+
+import pytest
+from fontTools.designspaceLib import DesignSpaceDocument
+from fontTools.designspaceLib.split import Range
+from fontTools.varLib.stat import getStatAxes, getStatLocations
+
+
+@pytest.fixture
+def datadir():
+ return Path(__file__).parent / "../designspaceLib/data"
+
+
+def test_getStatAxes(datadir):
+ doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
+
+ assert getStatAxes(
+ doc, {"Italic": 0, "width": Range(50, 150), "weight": Range(200, 900)}
+ ) == [
+ {
+ "values": [
+ {
+ "flags": 0,
+ "name": {
+ "de": "Extraleicht",
+ "en": "Extra Light",
+ "fr": "Extra léger",
+ },
+ "nominalValue": 200.0,
+ "rangeMaxValue": 250.0,
+ "rangeMinValue": 200.0,
+ },
+ {
+ "flags": 0,
+ "name": {"en": "Light"},
+ "nominalValue": 300.0,
+ "rangeMaxValue": 350.0,
+ "rangeMinValue": 250.0,
+ },
+ {
+ "flags": 2,
+ "name": {"en": "Regular"},
+ "nominalValue": 400.0,
+ "rangeMaxValue": 450.0,
+ "rangeMinValue": 350.0,
+ },
+ {
+ "flags": 0,
+ "name": {"en": "Semi Bold"},
+ "nominalValue": 600.0,
+ "rangeMaxValue": 650.0,
+ "rangeMinValue": 450.0,
+ },
+ {
+ "flags": 0,
+ "name": {"en": "Bold"},
+ "nominalValue": 700.0,
+ "rangeMaxValue": 850.0,
+ "rangeMinValue": 650.0,
+ },
+ {
+ "flags": 0,
+ "name": {"en": "Black"},
+ "nominalValue": 900.0,
+ "rangeMaxValue": 900.0,
+ "rangeMinValue": 850.0,
+ },
+ ],
+ "name": {"en": "Wéíght", "fa-IR": "قطر"},
+ "ordering": 2,
+ "tag": "wght",
+ },
+ {
+ "values": [
+ {"flags": 0, "name": {"en": "Condensed"}, "value": 50.0},
+ {"flags": 3, "name": {"en": "Normal"}, "value": 100.0},
+ {"flags": 0, "name": {"en": "Wide"}, "value": 125.0},
+ {
+ "flags": 0,
+ "name": {"en": "Extra Wide"},
+ "nominalValue": 150.0,
+ "rangeMinValue": 150.0,
+ },
+ ],
+ "name": {"en": "width", "fr": "Chasse"},
+ "ordering": 1,
+ "tag": "wdth",
+ },
+ {
+ "values": [
+ {"flags": 2, "linkedValue": 1.0, "name": {"en": "Roman"}, "value": 0.0},
+ ],
+ "name": {"en": "Italic"},
+ "ordering": 3,
+ "tag": "ital",
+ },
+ ]
+
+ assert getStatAxes(doc, {"Italic": 1, "width": 100, "weight": Range(400, 700)}) == [
+ {
+ "values": [
+ {
+ "flags": 2,
+ "name": {"en": "Regular"},
+ "nominalValue": 400.0,
+ "rangeMaxValue": 450.0,
+ "rangeMinValue": 350.0,
+ },
+ {
+ "flags": 0,
+ "name": {"en": "Semi Bold"},
+ "nominalValue": 600.0,
+ "rangeMaxValue": 650.0,
+ "rangeMinValue": 450.0,
+ },
+ {
+ "flags": 0,
+ "name": {"en": "Bold"},
+ "nominalValue": 700.0,
+ "rangeMaxValue": 850.0,
+ "rangeMinValue": 650.0,
+ },
+ ],
+ "name": {"en": "Wéíght", "fa-IR": "قطر"},
+ "ordering": 2,
+ "tag": "wght",
+ },
+ {
+ "values": [
+ {"flags": 3, "name": {"en": "Normal"}, "value": 100.0},
+ ],
+ "name": {"en": "width", "fr": "Chasse"},
+ "ordering": 1,
+ "tag": "wdth",
+ },
+ {
+ "values": [
+ {"flags": 0, "name": {"en": "Italic"}, "value": 1.0},
+ ],
+ "name": {"en": "Italic"},
+ "ordering": 3,
+ "tag": "ital",
+ },
+ ]
+
+
+def test_getStatLocations(datadir):
+ doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
+
+ assert getStatLocations(
+ doc, {"Italic": 0, "width": Range(50, 150), "weight": Range(200, 900)}
+ ) == [
+ {
+ "flags": 0,
+ "location": {"ital": 0.0, "wdth": 50.0, "wght": 300.0},
+ "name": {"en": "Some Style", "fr": "Un Style"},
+ },
+ ]
+ assert getStatLocations(
+ doc, {"Italic": 1, "width": Range(50, 150), "weight": Range(200, 900)}
+ ) == [
+ {
+ "flags": 0,
+ "location": {"ital": 1.0, "wdth": 100.0, "wght": 700.0},
+ "name": {"en": "Other"},
+ },
+ ]