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:
commit
4a18869794
@ -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)
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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,
|
||||
)
|
||||
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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"),
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user