def interpolate(ufos, master_dir, out_dir, instance_data, debug=False): """Create MutatorMath designspace and generate instances. Returns instance UFOs, or unused instance data if debug is True. """ from defcon import Font from mutatorMath.ufo import build designspace_path, instance_files = build_designspace( ufos, master_dir, out_dir, instance_data) print('>>> Building instances') for path, _ in instance_files: clean_ufo(path) build(designspace_path, outputUFOFormatVersion=3) instance_ufos = [] for path, data in instance_files: ufo = Font(path) set_custom_params(ufo, data=data) set_redundant_data(ufo) ufo.save() instance_ufos.append(ufo) if debug: return clear_data(instance_data) return instance_ufos
def test_normalizes_curved_quotes_in_names(self): ufo = Font() data = {'customParameters': ( {'name': '‘bad’', 'value': 1}, {'name': '“also bad”', 'value': 2})} set_custom_params(ufo, data=data) self.assertIn(GLYPHS_PREFIX + "'bad'", ufo.lib) self.assertIn(GLYPHS_PREFIX + '"also bad"', ufo.lib)
def test_gasp_table(self): gasp_table = {'65535': '15', '20': '7', '8': '10'} set_custom_params(self.ufo, parsed=[('GASP Table', gasp_table)]) ufo_range_records = self.ufo.info.openTypeGaspRangeRecords self.assertIsNotNone(ufo_range_records) self.assertEqual(len(ufo_range_records), 3) rec1, rec2, rec3 = ufo_range_records self.assertEqual(rec1['rangeMaxPPEM'], 8) self.assertEqual(rec1['rangeGaspBehavior'], [1, 3]) self.assertEqual(rec2['rangeMaxPPEM'], 20) self.assertEqual(rec2['rangeGaspBehavior'], [0, 1, 2]) self.assertEqual(rec3['rangeMaxPPEM'], 65535) self.assertEqual(rec3['rangeGaspBehavior'], [0, 1, 2, 3])
def test_parse_glyphs_filter(self, mock_parse_glyphs_filter): filter1 = ( 'Filter', 'Transformations;OffsetX:40;OffsetY:60;include:uni0334,uni0335') filter2 = ( 'Filter', 'Transformations;OffsetX:10;OffsetY:-10;exclude:uni0334,uni0335') set_custom_params(self.ufo, parsed=[filter1, filter2]) self.assertEqual(mock_parse_glyphs_filter.call_count, 2) self.assertEqual(mock_parse_glyphs_filter.call_args_list[0], mock.call(filter1[1])) self.assertEqual(mock_parse_glyphs_filter.call_args_list[1], mock.call(filter2[1]))
def apply_instance_data(instance_data): """Open instances, apply data, and re-save. Args: instance_data: List of (path, data) tuples, one for each instance. dst_ufo_list: List to add opened instances to. Returns: List of opened and updated instance UFOs. """ from defcon import Font instance_ufos = [] for path, data in instance_data: ufo = Font(path) set_custom_params(ufo, data=data) set_redundant_data(ufo) ufo.save() instance_ufos.append(ufo) return instance_ufos
def test_set_fsSelection_flags(self): self.assertEqual(self.ufo.info.openTypeOS2Selection, None) set_custom_params(self.ufo, parsed=[('Has WWS Names', False)]) self.assertEqual(self.ufo.info.openTypeOS2Selection, None) set_custom_params(self.ufo, parsed=[('Use Typo Metrics', True)]) self.assertEqual(self.ufo.info.openTypeOS2Selection, [7]) self.ufo = Font() set_custom_params(self.ufo, parsed=[('Has WWS Names', True), ('Use Typo Metrics', True)]) self.assertEqual(self.ufo.info.openTypeOS2Selection, [8, 7])
def test_set_glyphOrder(self): set_custom_params(self.ufo, parsed=[('glyphOrder', ['A', 'B'])]) self.assertEqual(self.ufo.lib[PUBLIC_PREFIX + 'glyphOrder'], ['A', 'B'])
def test_underlineThickness(self): set_custom_params(self.ufo, parsed=[('underlineThickness', 100)]) self.assertEqual(self.ufo.info.postscriptUnderlineThickness, 100) set_custom_params(self.ufo, parsed=[('underlineThickness', 0)]) self.assertEqual(self.ufo.info.postscriptUnderlineThickness, 0)
def test_underlinePosition(self): set_custom_params(self.ufo, parsed=[('underlinePosition', -2)]) self.assertEqual(self.ufo.info.postscriptUnderlinePosition, -2) set_custom_params(self.ufo, parsed=[('underlinePosition', 1)]) self.assertEqual(self.ufo.info.postscriptUnderlinePosition, 1)
def test_set_openTypeOS2CodePageRanges(self): set_custom_params(self.ufo, parsed=[('openTypeOS2CodePageRanges', [0, 1])]) self.assertEqual(self.ufo.info.openTypeOS2CodePageRanges, [0, 1])