2022-04-14 15:05:50 +01:00
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
from fontTools.designspaceLib import DesignSpaceDocument
|
|
|
|
from fontTools.designspaceLib.split import Range
|
2024-11-14 12:13:19 +01:00
|
|
|
from fontTools.ttLib import TTFont, newTable
|
|
|
|
from fontTools.varLib.stat import buildVFStatTable, getStatAxes, getStatLocations
|
2022-04-14 15:05:50 +01:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def datadir():
|
|
|
|
return Path(__file__).parent / "../designspaceLib/data"
|
|
|
|
|
|
|
|
|
|
|
|
def test_getStatAxes(datadir):
|
|
|
|
doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
|
|
|
|
|
|
|
|
assert getStatAxes(
|
2022-04-29 18:13:03 +01:00
|
|
|
doc, {"Italic": 0, "Width": Range(50, 150), "Weight": Range(200, 900)}
|
2022-04-14 15:05:50 +01:00
|
|
|
) == [
|
|
|
|
{
|
|
|
|
"values": [
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {
|
|
|
|
"de": "Extraleicht",
|
|
|
|
"en": "Extra Light",
|
|
|
|
"fr": "Extra léger",
|
|
|
|
},
|
|
|
|
"nominalValue": 200.0,
|
|
|
|
"rangeMaxValue": 250.0,
|
|
|
|
"rangeMinValue": 200.0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {"en": "Light"},
|
|
|
|
"nominalValue": 300.0,
|
|
|
|
"rangeMaxValue": 350.0,
|
|
|
|
"rangeMinValue": 250.0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"flags": 2,
|
|
|
|
"name": {"en": "Regular"},
|
|
|
|
"nominalValue": 400.0,
|
|
|
|
"rangeMaxValue": 450.0,
|
|
|
|
"rangeMinValue": 350.0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {"en": "Semi Bold"},
|
|
|
|
"nominalValue": 600.0,
|
|
|
|
"rangeMaxValue": 650.0,
|
|
|
|
"rangeMinValue": 450.0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {"en": "Bold"},
|
|
|
|
"nominalValue": 700.0,
|
|
|
|
"rangeMaxValue": 850.0,
|
|
|
|
"rangeMinValue": 650.0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {"en": "Black"},
|
|
|
|
"nominalValue": 900.0,
|
|
|
|
"rangeMaxValue": 900.0,
|
|
|
|
"rangeMinValue": 850.0,
|
|
|
|
},
|
2022-10-18 17:18:15 +01:00
|
|
|
{
|
|
|
|
"flags": 2,
|
|
|
|
"name": {"en": "Regular"},
|
|
|
|
"value": 400.0,
|
|
|
|
"linkedValue": 700.0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {"en": "Bold"},
|
|
|
|
"value": 700.0,
|
|
|
|
"linkedValue": 400.0,
|
|
|
|
},
|
2022-04-14 15:05:50 +01:00
|
|
|
],
|
|
|
|
"name": {"en": "Wéíght", "fa-IR": "قطر"},
|
|
|
|
"ordering": 2,
|
|
|
|
"tag": "wght",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"values": [
|
|
|
|
{"flags": 0, "name": {"en": "Condensed"}, "value": 50.0},
|
|
|
|
{"flags": 3, "name": {"en": "Normal"}, "value": 100.0},
|
|
|
|
{"flags": 0, "name": {"en": "Wide"}, "value": 125.0},
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {"en": "Extra Wide"},
|
|
|
|
"nominalValue": 150.0,
|
|
|
|
"rangeMinValue": 150.0,
|
|
|
|
},
|
|
|
|
],
|
2022-04-29 18:13:03 +01:00
|
|
|
"name": {"en": "Width", "fr": "Chasse"},
|
2022-04-14 15:05:50 +01:00
|
|
|
"ordering": 1,
|
|
|
|
"tag": "wdth",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"values": [
|
|
|
|
{"flags": 2, "linkedValue": 1.0, "name": {"en": "Roman"}, "value": 0.0},
|
|
|
|
],
|
|
|
|
"name": {"en": "Italic"},
|
|
|
|
"ordering": 3,
|
|
|
|
"tag": "ital",
|
|
|
|
},
|
|
|
|
]
|
|
|
|
|
2022-04-29 18:13:03 +01:00
|
|
|
assert getStatAxes(doc, {"Italic": 1, "Width": 100, "Weight": Range(400, 700)}) == [
|
2022-04-14 15:05:50 +01:00
|
|
|
{
|
|
|
|
"values": [
|
|
|
|
{
|
|
|
|
"flags": 2,
|
|
|
|
"name": {"en": "Regular"},
|
|
|
|
"nominalValue": 400.0,
|
|
|
|
"rangeMaxValue": 450.0,
|
|
|
|
"rangeMinValue": 350.0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {"en": "Semi Bold"},
|
|
|
|
"nominalValue": 600.0,
|
|
|
|
"rangeMaxValue": 650.0,
|
|
|
|
"rangeMinValue": 450.0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {"en": "Bold"},
|
|
|
|
"nominalValue": 700.0,
|
|
|
|
"rangeMaxValue": 850.0,
|
|
|
|
"rangeMinValue": 650.0,
|
|
|
|
},
|
2022-10-18 17:18:15 +01:00
|
|
|
{
|
|
|
|
"flags": 2,
|
|
|
|
"name": {"en": "Regular"},
|
|
|
|
"value": 400.0,
|
|
|
|
"linkedValue": 700.0,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"name": {"en": "Bold"},
|
|
|
|
"value": 700.0,
|
|
|
|
"linkedValue": 400.0,
|
|
|
|
},
|
2022-04-14 15:05:50 +01:00
|
|
|
],
|
|
|
|
"name": {"en": "Wéíght", "fa-IR": "قطر"},
|
|
|
|
"ordering": 2,
|
|
|
|
"tag": "wght",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"values": [
|
|
|
|
{"flags": 3, "name": {"en": "Normal"}, "value": 100.0},
|
|
|
|
],
|
2022-04-29 18:13:03 +01:00
|
|
|
"name": {"en": "Width", "fr": "Chasse"},
|
2022-04-14 15:05:50 +01:00
|
|
|
"ordering": 1,
|
|
|
|
"tag": "wdth",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"values": [
|
|
|
|
{"flags": 0, "name": {"en": "Italic"}, "value": 1.0},
|
|
|
|
],
|
|
|
|
"name": {"en": "Italic"},
|
|
|
|
"ordering": 3,
|
|
|
|
"tag": "ital",
|
|
|
|
},
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def test_getStatLocations(datadir):
|
|
|
|
doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
|
|
|
|
|
|
|
|
assert getStatLocations(
|
2022-04-29 18:13:03 +01:00
|
|
|
doc, {"Italic": 0, "Width": Range(50, 150), "Weight": Range(200, 900)}
|
2022-04-14 15:05:50 +01:00
|
|
|
) == [
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"location": {"ital": 0.0, "wdth": 50.0, "wght": 300.0},
|
|
|
|
"name": {"en": "Some Style", "fr": "Un Style"},
|
|
|
|
},
|
|
|
|
]
|
|
|
|
assert getStatLocations(
|
2022-04-29 18:13:03 +01:00
|
|
|
doc, {"Italic": 1, "Width": Range(50, 150), "Weight": Range(200, 900)}
|
2022-04-14 15:05:50 +01:00
|
|
|
) == [
|
|
|
|
{
|
|
|
|
"flags": 0,
|
|
|
|
"location": {"ital": 1.0, "wdth": 100.0, "wght": 700.0},
|
|
|
|
"name": {"en": "Other"},
|
|
|
|
},
|
|
|
|
]
|
2024-11-14 12:13:19 +01:00
|
|
|
|
|
|
|
|
|
|
|
@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
|