diff --git a/Lib/fontTools/varLib/instancer.py b/Lib/fontTools/varLib/instancer.py index 4943a5463..e5078fefb 100644 --- a/Lib/fontTools/varLib/instancer.py +++ b/Lib/fontTools/varLib/instancer.py @@ -1369,6 +1369,7 @@ def axisValuesFromAxisLimits(stat, axisLimits): def sortedAxisValues(axisValues): # Sort and remove duplicates so format 4 axisValues are dominant results, seenAxes = [], set() + # ensure format4 axes with the most AxisValueRecords are first format4 = sorted( [a for a in axisValues if a.Format == 4], key=lambda k: len(k.AxisValueRecord), reverse=True @@ -1392,14 +1393,15 @@ def updateNameTable(varfont, axisLimits): if "STAT" not in varfont: raise ValueError("Cannot update name table since there is no STAT table.") stat = varfont['STAT'] - fvar = varfont['fvar'] nametable = varfont["name"] # add default axis values if they are missing from axisLimits - fvarDefaults = {a.axisTag: a.defaultValue for a in fvar.axes} - for k, v in fvarDefaults.items(): - if k not in axisLimits: - axisLimits[k] = v + if 'fvar' in varfont: + fvar = varfont['fvar'] + fvarDefaults = {a.axisTag: a.defaultValue for a in fvar.axes} + for k, v in fvarDefaults.items(): + if k not in axisLimits: + axisLimits[k] = v selectedAxisValues = axisValuesFromAxisLimits(stat, axisLimits) _updateNameRecords(varfont, nametable, selectedAxisValues) @@ -1419,6 +1421,7 @@ def _updateNameRecords(varfont, nametable, axisValues): nametblLangs = set((r.platformID, r.platEncID, r.langID) for r in nametable.names) for lang in nametblLangs: _updateStyleRecords( + varfont, nametable, ribbiAxisValues, nonRibbiAxisValues, @@ -1437,6 +1440,7 @@ def _ribbiAxisValues(nametable, axisValues): def _updateStyleRecords( + varfont, nametable, ribbiAxisValues, nonRibbiAxisValues, @@ -1480,13 +1484,39 @@ def _updateStyleRecords( nameIDs[NameID.FULL_FONT_NAME] = f"{newFamilyName} {newStyleName}" nameIDs[NameID.POSTSCRIPT_NAME] = f"{newFamilyName.replace(' ', '')}-{newStyleName.replace(' ', '')}" - # Update uniqueID - # TODO - # versionRecord = nametable.getName(5, 3, 1, 0x409) + nameIDs[NameID.UNIQUE_FONT_IDENTIFIER] = _uniqueIdRecord(varfont, lang, nameIDs) + for nameID, string in nameIDs.items(): + if not string: + continue nametable.setName(string, nameID, *lang) +def _uniqueIdRecord(varfont, lang, nameIDs): + name = varfont['name'] + record = name.getName(NameID.UNIQUE_FONT_IDENTIFIER, *lang) + if not record: + return None + + def isSubString(string1, string2): + if string2 in string1: + return True + return False + + # Check if full name and postscript name are a substring + for nameID in (4, 6): + nameRecord = name.getName(nameID, *lang) + if not nameRecord: + continue + if isSubString(record.toUnicode(), nameRecord.toUnicode()): + return record.toUnicode().replace( + nameRecord.toUnicode(), + nameIDs[nameRecord.nameID] + ) + # TODO (M Foley) Construct new uniqueID if full name or postscript names are not subsets + return None + + def splitAxisLocationAndRanges(axisLimits, rangeType=AxisRange): location, axisRanges = {}, {} for axisTag, value in axisLimits.items(): diff --git a/Tests/varLib/instancer_test.py b/Tests/varLib/instancer_test.py index a794f79d2..854a4b4fb 100644 --- a/Tests/varLib/instancer_test.py +++ b/Tests/varLib/instancer_test.py @@ -1930,6 +1930,7 @@ def test_updateNameTable_with_registered_axes(varfont): names = _get_name_records(varfont) assert names[(1, 3, 1, 0x409)] == "Test Variable Font" assert names[(2, 3, 1, 0x0409)] == "Regular" + assert names[(3, 3, 1, 0x0409)] == "2.001;GOOG;TestVariableFont-Regular" assert names[(6, 3, 1, 0x409)] == "TestVariableFont-Regular" assert (16, 3, 1, 0x409) not in names assert (17, 3, 1, 0x409) not in names @@ -1939,6 +1940,7 @@ def test_updateNameTable_with_registered_axes(varfont): names = _get_name_records(varfont) assert names[(1, 3, 1, 0x409)] == "Test Variable Font Black" assert names[(2, 3, 1, 0x409)] == "Regular" + assert names[(3, 3, 1, 0x0409)] == "2.001;GOOG;TestVariableFont-Black" assert names[(6, 3, 1, 0x409)] == "TestVariableFont-Black" assert names[(16, 3, 1, 0x409)] == "Test Variable Font" assert names[(17, 3, 1, 0x409)] == "Black" @@ -1948,6 +1950,7 @@ def test_updateNameTable_with_registered_axes(varfont): names = _get_name_records(varfont) assert names[(1, 3, 1, 0x409)] == "Test Variable Font Thin" assert names[(2, 3, 1, 0x409)] == "Regular" + assert names[(3, 3, 1, 0x0409)] == "2.001;GOOG;TestVariableFont-Thin" assert names[(6, 3, 1, 0x409)] == "TestVariableFont-Thin" assert names[(16, 3, 1, 0x409)] == "Test Variable Font" assert names[(17, 3, 1, 0x409)] == "Thin" @@ -1957,6 +1960,7 @@ def test_updateNameTable_with_registered_axes(varfont): names = _get_name_records(varfont) assert names[(1, 3, 1, 0x409)] == "Test Variable Font Thin Condensed" assert names[(2, 3, 1, 0x409)] == "Regular" + assert names[(3, 3, 1, 0x0409)] == "2.001;GOOG;TestVariableFont-ThinCondensed" assert names[(6, 3, 1, 0x409)] == "TestVariableFont-ThinCondensed" assert names[(16, 3, 1, 0x409)] == "Test Variable Font" assert names[(17, 3, 1, 0x409)] == "Thin Condensed" @@ -1975,6 +1979,7 @@ def test_updateNameTable_with_multilingual_names(varfont): names = _get_name_records(varfont) assert names[(1, 3, 1, 0x405)] == "Test Variable Font" assert names[(2, 3, 1, 0x405)] == "Normal" + assert (3, 3, 1, 0x405) not in names assert (16, 3, 1, 0x405) not in names assert (17, 3, 1, 0x405) not in names @@ -1983,6 +1988,7 @@ def test_updateNameTable_with_multilingual_names(varfont): names = _get_name_records(varfont) assert names[(1, 3, 1, 0x405)] == "Test Variable Font Negreta" assert names[(2, 3, 1, 0x405)] == "Normal" + assert (3, 3, 1, 0x405) not in names assert names[(16, 3, 1, 0x405)] == "Test Variable Font" assert names[(17, 3, 1, 0x405)] == "Negreta" @@ -1991,6 +1997,7 @@ def test_updateNameTable_with_multilingual_names(varfont): names = _get_name_records(varfont) assert names[(1, 3, 1, 0x405)] == "Test Variable Font Negreta Zhuštěné" assert names[(2, 3, 1, 0x405)] == "Normal" + assert (3, 3, 1, 0x405) not in names assert names[(16, 3, 1, 0x405)] == "Test Variable Font" assert names[(17, 3, 1, 0x405)] == "Negreta Zhuštěné" @@ -2000,6 +2007,7 @@ def test_updateNametable_partial(varfont): names = _get_name_records(varfont) assert names[(1, 3, 1, 0x409)] == "Test Variable Font Condensed" assert names[(2, 3, 1, 0x409)] == "Regular" + assert (3, 3, 1, 0x405) not in names assert names[(16, 3, 1, 0x409)] == "Test Variable Font" assert names[(17, 3, 1, 0x409)] == "Condensed" #? maybe Condensed Regular?