wip instancer: update uniqueID

This commit is contained in:
Marc Foley 2020-10-12 18:14:27 +01:00
parent ce1d8a9955
commit b328475072
2 changed files with 46 additions and 8 deletions

View File

@ -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():

View File

@ -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?