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 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): def buildCmapSubTable(cmapping, format, platformID, platEncID):
@ -938,6 +946,15 @@ def addFvar(font, axes, instances):
fvar = newTable("fvar") fvar = newTable("fvar")
nameTable = font["name"] 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: for axis_def in axes:
axis = Axis() axis = Axis()
@ -963,7 +980,7 @@ def addFvar(font, axes, instances):
if isinstance(name, str): if isinstance(name, str):
name = dict(en=name) name = dict(en=name)
axis.axisNameID = nameTable.addMultilingualName(name, ttFont=font) axis.axisNameID = nameTable.addMultilingualName(name, ttFont=font, mac=macNames)
fvar.axes.append(axis) fvar.axes.append(axis)
for instance in instances: for instance in instances:
@ -980,9 +997,11 @@ def addFvar(font, axes, instances):
name = dict(en=name) name = dict(en=name)
inst = NamedInstance() inst = NamedInstance()
inst.subfamilyNameID = nameTable.addMultilingualName(name, ttFont=font) inst.subfamilyNameID = nameTable.addMultilingualName(
name, ttFont=font, mac=macNames
)
if psname is not None: if psname is not None:
inst.postscriptNameID = nameTable.addName(psname) inst.postscriptNameID = nameTable.addName(psname, platforms=platforms)
inst.coordinates = coordinates inst.coordinates = coordinates
fvar.instances.append(inst) fvar.instances.append(inst)

View File

@ -85,6 +85,15 @@ def _add_fvar(font, axes, instances: List[InstanceDescriptor]):
fvar = newTable("fvar") fvar = newTable("fvar")
nameTable = font["name"] 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(): for a in axes.values():
axis = Axis() axis = Axis()
axis.axisTag = Tag(a.tag) axis.axisTag = Tag(a.tag)
@ -95,7 +104,7 @@ def _add_fvar(font, axes, instances: List[InstanceDescriptor]):
a.maximum, a.maximum,
) )
axis.axisNameID = nameTable.addMultilingualName( axis.axisNameID = nameTable.addMultilingualName(
a.labelNames, font, minNameID=256 a.labelNames, font, minNameID=256, mac=macNames
) )
axis.flags = int(a.hidden) axis.flags = int(a.hidden)
fvar.axes.append(axis) fvar.axes.append(axis)
@ -121,10 +130,12 @@ def _add_fvar(font, axes, instances: List[InstanceDescriptor]):
psname = instance.postScriptFontName psname = instance.postScriptFontName
inst = NamedInstance() inst = NamedInstance()
inst.subfamilyNameID = nameTable.addMultilingualName(localisedStyleName) inst.subfamilyNameID = nameTable.addMultilingualName(
localisedStyleName, mac=macNames
)
if psname is not None: if psname is not None:
psname = tostr(psname) psname = tostr(psname)
inst.postscriptNameID = nameTable.addName(psname) inst.postscriptNameID = nameTable.addName(psname, platforms=platforms)
inst.coordinates = { inst.coordinates = {
axes[k].tag: axes[k].map_backward(v) for k, v in coordinates.items() 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)))): if set(excludedUnicodeLangIDs) == set(range(len((varfont["ltag"].tags)))):
del varfont["ltag"] del varfont["ltag"]
varfont["name"].names[:] = [ 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: 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) 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( return fontTools.otlLib.builder.buildStatTable(
ttFont, ttFont,
getStatAxes(doc, region), getStatAxes(doc, region),
getStatLocations(doc, region), getStatLocations(doc, region),
doc.elidedFallbackName if doc.elidedFallbackName is not None else 2, doc.elidedFallbackName if doc.elidedFallbackName is not None else 2,
macNames=macNames,
) )

View File

@ -177,39 +177,6 @@
</glyf> </glyf>
<name> <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"> <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
HelloTestFont HelloTestFont
</namerecord> </namerecord>

View File

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

View File

@ -161,42 +161,42 @@
<!-- Regular --> <!-- Regular -->
<!-- PostScript: TestFamily-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="wght" value="394.0"/>
<coord axis="cntr" value="0.0"/> <coord axis="cntr" value="0.0"/>
</NamedInstance> </NamedInstance>
<!-- Semibold --> <!-- Semibold -->
<!-- PostScript: TestFamily-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="wght" value="600.0"/>
<coord axis="cntr" value="0.0"/> <coord axis="cntr" value="0.0"/>
</NamedInstance> </NamedInstance>
<!-- Bold --> <!-- Bold -->
<!-- PostScript: TestFamily-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="wght" value="824.0"/>
<coord axis="cntr" value="0.0"/> <coord axis="cntr" value="0.0"/>
</NamedInstance> </NamedInstance>
<!-- Black --> <!-- Black -->
<!-- PostScript: TestFamily-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="wght" value="1000.0"/>
<coord axis="cntr" value="0.0"/> <coord axis="cntr" value="0.0"/>
</NamedInstance> </NamedInstance>
<!-- Black Medium Contrast --> <!-- Black Medium Contrast -->
<!-- PostScript: TestFamily-BlackMediumContrast --> <!-- 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="wght" value="1000.0"/>
<coord axis="cntr" value="50.0"/> <coord axis="cntr" value="50.0"/>
</NamedInstance> </NamedInstance>
<!-- Black High Contrast --> <!-- Black High Contrast -->
<!-- PostScript: TestFamily-BlackHighContrast --> <!-- 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="wght" value="1000.0"/>
<coord axis="cntr" value="100.0"/> <coord axis="cntr" value="100.0"/>
</NamedInstance> </NamedInstance>

View File

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

View File

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

View File

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

View File

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

View File

@ -3,7 +3,8 @@ from pathlib import Path
import pytest import pytest
from fontTools.designspaceLib import DesignSpaceDocument from fontTools.designspaceLib import DesignSpaceDocument
from fontTools.designspaceLib.split import Range 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 @pytest.fixture
@ -189,3 +190,37 @@ def test_getStatLocations(datadir):
"name": {"en": "Other"}, "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