Merge pull request #3688 from fonttools/name_consistency

[varLib] Lets not add mac names if the rest of `name` doesn't have them
This commit is contained in:
Cosimo Lupo 2024-11-14 16:20:47 +01:00 committed by GitHub
commit 4a18869794
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 106 additions and 134 deletions

View File

@ -918,7 +918,15 @@ class FontBuilder(object):
"""
from .otlLib.builder import buildStatTable
buildStatTable(self.font, axes, locations, elidedFallbackName)
assert "name" in self.font, "name must to be set up first"
buildStatTable(
self.font,
axes,
locations,
elidedFallbackName,
macNames=any(nr.platformID == 1 for nr in self.font["name"].names),
)
def buildCmapSubTable(cmapping, format, platformID, platEncID):
@ -938,6 +946,15 @@ def addFvar(font, axes, instances):
fvar = newTable("fvar")
nameTable = font["name"]
# if there are not currently any mac names don't add them here, that's inconsistent
# https://github.com/fonttools/fonttools/issues/683
macNames = any(nr.platformID == 1 for nr in getattr(nameTable, "names", ()))
# we have all the best ways to express mac names
platforms = ((3, 1, 0x409),)
if macNames:
platforms = ((1, 0, 0),) + platforms
for axis_def in axes:
axis = Axis()
@ -963,7 +980,7 @@ def addFvar(font, axes, instances):
if isinstance(name, str):
name = dict(en=name)
axis.axisNameID = nameTable.addMultilingualName(name, ttFont=font)
axis.axisNameID = nameTable.addMultilingualName(name, ttFont=font, mac=macNames)
fvar.axes.append(axis)
for instance in instances:
@ -980,9 +997,11 @@ def addFvar(font, axes, instances):
name = dict(en=name)
inst = NamedInstance()
inst.subfamilyNameID = nameTable.addMultilingualName(name, ttFont=font)
inst.subfamilyNameID = nameTable.addMultilingualName(
name, ttFont=font, mac=macNames
)
if psname is not None:
inst.postscriptNameID = nameTable.addName(psname)
inst.postscriptNameID = nameTable.addName(psname, platforms=platforms)
inst.coordinates = coordinates
fvar.instances.append(inst)

View File

@ -85,6 +85,15 @@ def _add_fvar(font, axes, instances: List[InstanceDescriptor]):
fvar = newTable("fvar")
nameTable = font["name"]
# if there are not currently any mac names don't add them here, that's inconsistent
# https://github.com/fonttools/fonttools/issues/683
macNames = any(nr.platformID == 1 for nr in getattr(nameTable, "names", ()))
# we have all the best ways to express mac names
platforms = ((3, 1, 0x409),)
if macNames:
platforms = ((1, 0, 0),) + platforms
for a in axes.values():
axis = Axis()
axis.axisTag = Tag(a.tag)
@ -95,7 +104,7 @@ def _add_fvar(font, axes, instances: List[InstanceDescriptor]):
a.maximum,
)
axis.axisNameID = nameTable.addMultilingualName(
a.labelNames, font, minNameID=256
a.labelNames, font, minNameID=256, mac=macNames
)
axis.flags = int(a.hidden)
fvar.axes.append(axis)
@ -121,10 +130,12 @@ def _add_fvar(font, axes, instances: List[InstanceDescriptor]):
psname = instance.postScriptFontName
inst = NamedInstance()
inst.subfamilyNameID = nameTable.addMultilingualName(localisedStyleName)
inst.subfamilyNameID = nameTable.addMultilingualName(
localisedStyleName, mac=macNames
)
if psname is not None:
psname = tostr(psname)
inst.postscriptNameID = nameTable.addName(psname)
inst.postscriptNameID = nameTable.addName(psname, platforms=platforms)
inst.coordinates = {
axes[k].tag: axes[k].map_backward(v) for k, v in coordinates.items()
}

View File

@ -408,7 +408,9 @@ def instantiateVariableFont(varfont, location, inplace=False, overlap=True):
if set(excludedUnicodeLangIDs) == set(range(len((varfont["ltag"].tags)))):
del varfont["ltag"]
varfont["name"].names[:] = [
n for n in varfont["name"].names if n.nameID not in exclude
n
for n in varfont["name"].names
if n.nameID < 256 or n.nameID not in exclude
]
if "wght" in location and "OS/2" in varfont:

View File

@ -39,11 +39,18 @@ def buildVFStatTable(ttFont: TTFont, doc: DesignSpaceDocument, vfName: str) -> N
region = getVFUserRegion(doc, vf)
# if there are not currently any mac names don't add them here, that's inconsistent
# https://github.com/fonttools/fonttools/issues/683
macNames = any(
nr.platformID == 1 for nr in getattr(ttFont.get("name"), "names", ())
)
return fontTools.otlLib.builder.buildStatTable(
ttFont,
getStatAxes(doc, region),
getStatLocations(doc, region),
doc.elidedFallbackName if doc.elidedFallbackName is not None else 2,
macNames=macNames,
)

View File

@ -177,39 +177,6 @@
</glyf>
<name>
<namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
HelloTestFont
</namerecord>
<namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
TotallyNormal
</namerecord>
<namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
HelloTestFont-TotallyNormal
</namerecord>
<namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
Left
</namerecord>
<namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
Right
</namerecord>
<namerecord nameID="258" platformID="1" platEncID="0" langID="0x0" unicode="True">
Up
</namerecord>
<namerecord nameID="259" platformID="1" platEncID="0" langID="0x0" unicode="True">
Down
</namerecord>
<namerecord nameID="260" platformID="1" platEncID="0" langID="0x0" unicode="True">
Right Up
</namerecord>
<namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
Neutral
</namerecord>
<namerecord nameID="1" platformID="1" platEncID="0" langID="0x4" unicode="True">
HalloTestFont
</namerecord>
<namerecord nameID="2" platformID="1" platEncID="0" langID="0x4" unicode="True">
TotaalNormaal
</namerecord>
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
HelloTestFont
</namerecord>

View File

@ -236,7 +236,7 @@ def test_build_var(tmpdir):
fb.setupHorizontalMetrics(metrics)
fb.setupHorizontalHeader(ascent=824, descent=200)
fb.setupNameTable(nameStrings)
fb.setupNameTable(nameStrings, mac=False)
axes = [
("LEFT", 0, 0, 100, "Left"),

View File

@ -161,42 +161,42 @@
<!-- Regular -->
<!-- PostScript: TestFamily-Regular -->
<NamedInstance flags="0x0" postscriptNameID="263" subfamilyNameID="262">
<NamedInstance flags="0x0" postscriptNameID="262" subfamilyNameID="2">
<coord axis="wght" value="394.0"/>
<coord axis="cntr" value="0.0"/>
</NamedInstance>
<!-- Semibold -->
<!-- PostScript: TestFamily-Semibold -->
<NamedInstance flags="0x0" postscriptNameID="265" subfamilyNameID="264">
<NamedInstance flags="0x0" postscriptNameID="264" subfamilyNameID="263">
<coord axis="wght" value="600.0"/>
<coord axis="cntr" value="0.0"/>
</NamedInstance>
<!-- Bold -->
<!-- PostScript: TestFamily-Bold -->
<NamedInstance flags="0x0" postscriptNameID="267" subfamilyNameID="266">
<NamedInstance flags="0x0" postscriptNameID="266" subfamilyNameID="265">
<coord axis="wght" value="824.0"/>
<coord axis="cntr" value="0.0"/>
</NamedInstance>
<!-- Black -->
<!-- PostScript: TestFamily-Black -->
<NamedInstance flags="0x0" postscriptNameID="269" subfamilyNameID="268">
<NamedInstance flags="0x0" postscriptNameID="268" subfamilyNameID="267">
<coord axis="wght" value="1000.0"/>
<coord axis="cntr" value="0.0"/>
</NamedInstance>
<!-- Black Medium Contrast -->
<!-- PostScript: TestFamily-BlackMediumContrast -->
<NamedInstance flags="0x0" postscriptNameID="271" subfamilyNameID="270">
<NamedInstance flags="0x0" postscriptNameID="270" subfamilyNameID="269">
<coord axis="wght" value="1000.0"/>
<coord axis="cntr" value="50.0"/>
</NamedInstance>
<!-- Black High Contrast -->
<!-- PostScript: TestFamily-BlackHighContrast -->
<NamedInstance flags="0x0" postscriptNameID="273" subfamilyNameID="272">
<NamedInstance flags="0x0" postscriptNameID="272" subfamilyNameID="271">
<coord axis="wght" value="1000.0"/>
<coord axis="cntr" value="100.0"/>
</NamedInstance>

View File

@ -443,63 +443,6 @@
<namerecord nameID="257" platformID="0" platEncID="4" langID="0x0">
کنتراست
</namerecord>
<namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
Weight
</namerecord>
<namerecord nameID="257" platformID="1" platEncID="0" langID="0x0" unicode="True">
Contrast
</namerecord>
<namerecord nameID="258" platformID="1" platEncID="0" langID="0x0" unicode="True">
ExtraLight
</namerecord>
<namerecord nameID="259" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestFamily-ExtraLight
</namerecord>
<namerecord nameID="260" platformID="1" platEncID="0" langID="0x0" unicode="True">
Light
</namerecord>
<namerecord nameID="261" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestFamily-Light
</namerecord>
<namerecord nameID="262" platformID="1" platEncID="0" langID="0x0" unicode="True">
Regular
</namerecord>
<namerecord nameID="263" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestFamily-Regular
</namerecord>
<namerecord nameID="264" platformID="1" platEncID="0" langID="0x0" unicode="True">
Semibold
</namerecord>
<namerecord nameID="265" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestFamily-Semibold
</namerecord>
<namerecord nameID="266" platformID="1" platEncID="0" langID="0x0" unicode="True">
Bold
</namerecord>
<namerecord nameID="267" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestFamily-Bold
</namerecord>
<namerecord nameID="268" platformID="1" platEncID="0" langID="0x0" unicode="True">
Black
</namerecord>
<namerecord nameID="269" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestFamily-Black
</namerecord>
<namerecord nameID="270" platformID="1" platEncID="0" langID="0x0" unicode="True">
Black Medium Contrast
</namerecord>
<namerecord nameID="271" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestFamily-BlackMediumContrast
</namerecord>
<namerecord nameID="272" platformID="1" platEncID="0" langID="0x0" unicode="True">
Black High Contrast
</namerecord>
<namerecord nameID="273" platformID="1" platEncID="0" langID="0x0" unicode="True">
TestFamily-BlackHighContrast
</namerecord>
<namerecord nameID="257" platformID="1" platEncID="0" langID="0x2" unicode="True">
Kontrast
</namerecord>
<namerecord nameID="257" platformID="3" platEncID="1" langID="0x407">
Kontrast
</namerecord>
@ -546,39 +489,36 @@
TestFamily-Light
</namerecord>
<namerecord nameID="262" platformID="3" platEncID="1" langID="0x409">
Regular
</namerecord>
<namerecord nameID="263" platformID="3" platEncID="1" langID="0x409">
TestFamily-Regular
</namerecord>
<namerecord nameID="264" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="263" platformID="3" platEncID="1" langID="0x409">
Semibold
</namerecord>
<namerecord nameID="265" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="264" platformID="3" platEncID="1" langID="0x409">
TestFamily-Semibold
</namerecord>
<namerecord nameID="266" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="265" platformID="3" platEncID="1" langID="0x409">
Bold
</namerecord>
<namerecord nameID="267" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="266" platformID="3" platEncID="1" langID="0x409">
TestFamily-Bold
</namerecord>
<namerecord nameID="268" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="267" platformID="3" platEncID="1" langID="0x409">
Black
</namerecord>
<namerecord nameID="269" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="268" platformID="3" platEncID="1" langID="0x409">
TestFamily-Black
</namerecord>
<namerecord nameID="270" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="269" platformID="3" platEncID="1" langID="0x409">
Black Medium Contrast
</namerecord>
<namerecord nameID="271" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="270" platformID="3" platEncID="1" langID="0x409">
TestFamily-BlackMediumContrast
</namerecord>
<namerecord nameID="272" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="271" platformID="3" platEncID="1" langID="0x409">
Black High Contrast
</namerecord>
<namerecord nameID="273" platformID="3" platEncID="1" langID="0x409">
<namerecord nameID="272" platformID="3" platEncID="1" langID="0x409">
TestFamily-BlackHighContrast
</namerecord>
</name>
@ -807,42 +747,42 @@
<!-- Regular -->
<!-- PostScript: TestFamily-Regular -->
<NamedInstance flags="0x0" postscriptNameID="263" subfamilyNameID="262">
<NamedInstance flags="0x0" postscriptNameID="262" subfamilyNameID="2">
<coord axis="wght" value="394.0"/>
<coord axis="cntr" value="0.0"/>
</NamedInstance>
<!-- Semibold -->
<!-- PostScript: TestFamily-Semibold -->
<NamedInstance flags="0x0" postscriptNameID="265" subfamilyNameID="264">
<NamedInstance flags="0x0" postscriptNameID="264" subfamilyNameID="263">
<coord axis="wght" value="600.0"/>
<coord axis="cntr" value="0.0"/>
</NamedInstance>
<!-- Bold -->
<!-- PostScript: TestFamily-Bold -->
<NamedInstance flags="0x0" postscriptNameID="267" subfamilyNameID="266">
<NamedInstance flags="0x0" postscriptNameID="266" subfamilyNameID="265">
<coord axis="wght" value="824.0"/>
<coord axis="cntr" value="0.0"/>
</NamedInstance>
<!-- Black -->
<!-- PostScript: TestFamily-Black -->
<NamedInstance flags="0x0" postscriptNameID="269" subfamilyNameID="268">
<NamedInstance flags="0x0" postscriptNameID="268" subfamilyNameID="267">
<coord axis="wght" value="1000.0"/>
<coord axis="cntr" value="0.0"/>
</NamedInstance>
<!-- Black Medium Contrast -->
<!-- PostScript: TestFamily-BlackMediumContrast -->
<NamedInstance flags="0x0" postscriptNameID="271" subfamilyNameID="270">
<NamedInstance flags="0x0" postscriptNameID="270" subfamilyNameID="269">
<coord axis="wght" value="1000.0"/>
<coord axis="cntr" value="50.0"/>
</NamedInstance>
<!-- Black High Contrast -->
<!-- PostScript: TestFamily-BlackHighContrast -->
<NamedInstance flags="0x0" postscriptNameID="273" subfamilyNameID="272">
<NamedInstance flags="0x0" postscriptNameID="272" subfamilyNameID="271">
<coord axis="wght" value="1000.0"/>
<coord axis="cntr" value="100.0"/>
</NamedInstance>

View File

@ -228,9 +228,6 @@
</glyf>
<name>
<namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
Weight
</namerecord>
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
Test Family
</namerecord>

View File

@ -68,9 +68,6 @@
</gvar>
<name>
<namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
Weight
</namerecord>
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
Test Family
</namerecord>

View File

@ -236,9 +236,6 @@
</glyf>
<name>
<namerecord nameID="256" platformID="1" platEncID="0" langID="0x0" unicode="True">
Weight
</namerecord>
<namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
Layer Font
</namerecord>

View File

@ -3,7 +3,8 @@ from pathlib import Path
import pytest
from fontTools.designspaceLib import DesignSpaceDocument
from fontTools.designspaceLib.split import Range
from fontTools.varLib.stat import getStatAxes, getStatLocations
from fontTools.ttLib import TTFont, newTable
from fontTools.varLib.stat import buildVFStatTable, getStatAxes, getStatLocations
@pytest.fixture
@ -189,3 +190,37 @@ def test_getStatLocations(datadir):
"name": {"en": "Other"},
},
]
@pytest.mark.parametrize(
"with_mac_names",
[
pytest.param(True, id="with_mac_names"),
pytest.param(False, id="without_mac_names"),
],
)
def test_buildVFStatTable(datadir, with_mac_names):
doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
ttFont = TTFont()
nameTable = newTable("name")
nameTable.names = []
ttFont["name"] = nameTable
if with_mac_names:
# addName adds a name string for both Macintosh and Windows platforms by default
nameTable.addName("Regular")
buildVFStatTable(ttFont, doc, vfName="Test_WghtWdth")
assert "STAT" in ttFont
name_recs = ttFont["name"].names
assert len({nr.nameID for nr in name_recs}) == 15
# test that mac names don't get added if there weren't any before
mac_recs = [nr for nr in name_recs if nr.platformID == 1]
if with_mac_names:
assert len(mac_recs) > 1
else:
assert len(mac_recs) == 0