diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py index 75a8c1367..862decacd 100644 --- a/Lib/fontTools/varLib/__init__.py +++ b/Lib/fontTools/varLib/__init__.py @@ -601,6 +601,22 @@ def _add_MVAR(font, masterModel, master_ttfs, axisTags): mvar.ValueRecord = sorted(records, key=lambda r: r.ValueTag) +def _add_BASE(font, masterModel, master_ttfs, axisTags): + + log.info("Generating BASE") + + merger = VariationMerger(masterModel, axisTags, font) + merger.mergeTables(font, master_ttfs, ['BASE']) + store = merger.store_builder.finish() + + if not store.VarData: + return + base = font['BASE'].table + assert base.Version == 0x00010000 + base.Version = 0x00010001 + base.VarStore = store + + def _merge_OTL(font, model, master_fonts, axisTags): log.info("Merging OpenType Layout tables") @@ -906,6 +922,8 @@ def build(designspace, master_finder=lambda s:s, exclude=[], optimize=True): assert 0 == model.mapping[ds.base_idx] log.info("Building variations tables") + if 'BASE' not in exclude and 'BASE' in vf: + _add_BASE(vf, model, master_fonts, axisTags) if 'MVAR' not in exclude: _add_MVAR(vf, model, master_fonts, axisTags) if 'HVAR' not in exclude: diff --git a/Lib/fontTools/varLib/merger.py b/Lib/fontTools/varLib/merger.py index 3f04364fe..b7fb39b4c 100644 --- a/Lib/fontTools/varLib/merger.py +++ b/Lib/fontTools/varLib/merger.py @@ -1052,6 +1052,15 @@ def buildVarDevTable(store_builder, master_values): base, varIdx = store_builder.storeMasters(master_values) return base, builder.buildVarDevTable(varIdx) +@VariationMerger.merger(ot.BaseCoord) +def merge(merger, self, lst): + if self.Format != 1: + raise VarLibMergeError(f"BaseCoord format {self.Format} unsupported.") + self.Coordinate, DeviceTable = buildVarDevTable(merger.store_builder, [a.Coordinate for a in lst]) + if DeviceTable: + self.Format = 3 + self.DeviceTable = DeviceTable + @VariationMerger.merger(ot.CaretValue) def merge(merger, self, lst): if self.Format != 1: diff --git a/Tests/varLib/data/TestBASE.designspace b/Tests/varLib/data/TestBASE.designspace new file mode 100644 index 000000000..6a584a5b7 --- /dev/null +++ b/Tests/varLib/data/TestBASE.designspace @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/varLib/data/master_base_test/TestBASE.0.ttx b/Tests/varLib/data/master_base_test/TestBASE.0.ttx new file mode 100644 index 000000000..07f827f5f --- /dev/null +++ b/Tests/varLib/data/master_base_test/TestBASE.0.ttx @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TestBASE + + + Thin + + + 1.000;UKWN;TestBASE-Thin + + + TestBASE Thin + + + Version 1.000 + + + TestBASE-Thin + + + TestBASE Thin + + + Regular + + + 1.000;UKWN;TestBASE-Thin + + + TestBASE Thin + + + Version 1.000 + + + TestBASE-Thin + + + TestBASE + + + Thin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/varLib/data/master_base_test/TestBASE.900.ttx b/Tests/varLib/data/master_base_test/TestBASE.900.ttx new file mode 100644 index 000000000..8b27fb69a --- /dev/null +++ b/Tests/varLib/data/master_base_test/TestBASE.900.ttx @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TestBASE + + + Black + + + 1.000;UKWN;TestBASE-Black + + + TestBASE Black + + + Version 1.000 + + + TestBASE-Black + + + TestBASE Black + + + Regular + + + 1.000;UKWN;TestBASE-Black + + + TestBASE Black + + + Version 1.000 + + + TestBASE-Black + + + TestBASE + + + Black + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/varLib/data/test_results/TestBASE.ttx b/Tests/varLib/data/test_results/TestBASE.ttx new file mode 100644 index 000000000..23d9337bd --- /dev/null +++ b/Tests/varLib/data/test_results/TestBASE.ttx @@ -0,0 +1,477 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/varLib/varLib_test.py b/Tests/varLib/varLib_test.py index a663eaeb4..2c95784ac 100644 --- a/Tests/varLib/varLib_test.py +++ b/Tests/varLib/varLib_test.py @@ -628,6 +628,31 @@ class BuildTest(unittest.TestCase): self.expect_ttx(varfont, expected_ttx_path, tables) self.check_ttx_dump(varfont, expected_ttx_path, tables, suffix) + def test_varlib_build_BASE(self): + ds_path = self.get_test_input('TestBASE.designspace') + ttx_dir = self.get_test_input("master_base_test") + expected_ttx_name = 'TestBASE' + suffix = '.otf' + + self.temp_dir() + for path in self.get_file_list(ttx_dir, '.ttx', 'TestBASE'): + font, savepath = self.compile_font(path, suffix, self.tempdir) + + ds = DesignSpaceDocument.fromfile(ds_path) + for source in ds.sources: + source.path = os.path.join( + self.tempdir, os.path.basename(source.filename).replace(".ufo", suffix) + ) + ds.updatePaths() + + varfont, _, _ = build(ds) + varfont = reload_font(varfont) + + expected_ttx_path = self.get_test_output(expected_ttx_name + '.ttx') + tables = ["BASE"] + self.expect_ttx(varfont, expected_ttx_path, tables) + self.check_ttx_dump(varfont, expected_ttx_path, tables, suffix) + def test_varlib_build_single_master(self): self._run_varlib_build_test( designspace_name='SingleMaster',