diff --git a/Lib/fontTools/designspaceLib/statNames.py b/Lib/fontTools/designspaceLib/statNames.py index 0a475c89a..1b6727030 100644 --- a/Lib/fontTools/designspaceLib/statNames.py +++ b/Lib/fontTools/designspaceLib/statNames.py @@ -88,21 +88,30 @@ def getStatNames( # Then build names for all these languages, but fallback to English # whenever a translation is missing. labels = _getAxisLabelsForUserLocation(doc.axes, userLocation) - languages = set(language for label in labels for language in label.labelNames) - languages.add("en") - for language in languages: - styleName = " ".join( - label.labelNames.get(language, label.defaultName) - for label in labels - if not label.elidable - ) - if not styleName and doc.elidedFallbackName is not None: - styleName = doc.elidedFallbackName - styleNames[language] = styleName + if labels: + languages = set(language for label in labels for language in label.labelNames) + languages.add("en") + for language in languages: + styleName = " ".join( + label.labelNames.get(language, label.defaultName) + for label in labels + if not label.elidable + ) + if not styleName and doc.elidedFallbackName is not None: + styleName = doc.elidedFallbackName + styleNames[language] = styleName - postScriptFontName = None - if "en" in familyNames and "en" in styleNames: - postScriptFontName = f"{familyNames['en']}-{styleNames['en']}".replace(" ", "") + if "en" not in familyNames or "en" not in styleNames: + # Not enough information to compute PS names of styleMap names + return StatNames( + familyNames=familyNames, + styleNames=styleNames, + postScriptFontName=None, + styleMapFamilyNames={}, + styleMapStyleName=None, + ) + + postScriptFontName = f"{familyNames['en']}-{styleNames['en']}".replace(" ", "") styleMapStyleName, regularUserLocation = _getRibbiStyle(doc, userLocation) diff --git a/Tests/designspaceLib/data/DS5BreakTest.designspace b/Tests/designspaceLib/data/DS5BreakTest.designspace new file mode 100644 index 000000000..fec1633c7 --- /dev/null +++ b/Tests/designspaceLib/data/DS5BreakTest.designspace @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/designspaceLib/statNames_test.py b/Tests/designspaceLib/statNames_test.py index d33a9ae70..99d1c7fa8 100644 --- a/Tests/designspaceLib/statNames_test.py +++ b/Tests/designspaceLib/statNames_test.py @@ -59,3 +59,20 @@ def test_detect_ribbi_aktiv(datadir): styleMapFamilyNames={"en": "Aktiv Grotesk Cd"}, styleMapStyleName="bold italic", ) + + +def test_getStatNames_on_ds4_doesnt_make_up_bad_names(datadir): + """See this issue on GitHub: https://github.com/googlefonts/ufo2ft/issues/630 + + When as in the example, there's no STAT data present, the getStatName + shouldn't try making up a postscript name. + """ + doc = DesignSpaceDocument.fromfile(datadir / "DS5BreakTest.designspace") + + assert getStatNames(doc, {"Weight": 600, "Width": 125, "Italic": 1}) == StatNames( + familyNames={"en": "DS5BreakTest"}, + styleNames={}, + postScriptFontName=None, + styleMapFamilyNames={}, + styleMapStyleName=None, + )