2022-12-13 11:26:36 +00:00
|
|
|
from fontTools.varLib.featureVars import overlayFeatureVariations
|
2018-11-09 11:47:49 -05:00
|
|
|
|
|
|
|
|
2023-02-08 14:18:49 -07:00
|
|
|
def _test_linear(n):
|
2018-11-09 11:47:49 -05:00
|
|
|
conds = []
|
|
|
|
for i in range(n):
|
|
|
|
end = i / n
|
2022-12-13 11:26:36 +00:00
|
|
|
start = end - 1.0
|
|
|
|
region = [{"X": (start, end)}]
|
|
|
|
subst = {"g%.2g" % start: "g%.2g" % end}
|
2018-11-09 11:47:49 -05:00
|
|
|
conds.append((region, subst))
|
|
|
|
overlaps = overlayFeatureVariations(conds)
|
2018-11-09 16:04:21 -05:00
|
|
|
assert len(overlaps) == 2 * n - 1, overlaps
|
2018-11-09 11:47:49 -05:00
|
|
|
return conds, overlaps
|
|
|
|
|
2023-02-08 14:18:49 -07:00
|
|
|
def test_linear():
|
|
|
|
_test_linear(10)
|
2022-12-13 11:26:36 +00:00
|
|
|
|
2023-02-08 14:18:49 -07:00
|
|
|
def _test_quadratic(n):
|
2018-11-09 18:59:28 -05:00
|
|
|
conds = []
|
|
|
|
for i in range(1, n + 1):
|
2022-12-13 11:26:36 +00:00
|
|
|
region = [{"X": (0, i / n), "Y": (0, (n + 1 - i) / n)}]
|
2018-11-09 18:59:28 -05:00
|
|
|
subst = {str(i): str(n + 1 - i)}
|
|
|
|
conds.append((region, subst))
|
|
|
|
overlaps = overlayFeatureVariations(conds)
|
|
|
|
assert len(overlaps) == n * (n + 1) // 2, overlaps
|
|
|
|
return conds, overlaps
|
|
|
|
|
2023-02-08 14:18:49 -07:00
|
|
|
def test_quadratic():
|
|
|
|
_test_quadratic(10)
|
2022-12-13 11:26:36 +00:00
|
|
|
|
2018-12-05 19:54:14 +01:00
|
|
|
def _merge_substitutions(substitutions):
|
|
|
|
merged = {}
|
|
|
|
for subst in substitutions:
|
|
|
|
merged.update(subst)
|
|
|
|
return merged
|
|
|
|
|
2022-12-13 11:26:36 +00:00
|
|
|
|
2018-12-05 19:54:14 +01:00
|
|
|
def _match_condition(location, overlaps):
|
|
|
|
for box, substitutions in overlaps:
|
|
|
|
for tag, coord in location.items():
|
|
|
|
start, end = box[tag]
|
|
|
|
if start <= coord <= end:
|
|
|
|
return _merge_substitutions(substitutions)
|
|
|
|
return {} # no match
|
|
|
|
|
2022-12-13 11:26:36 +00:00
|
|
|
|
2018-12-05 19:54:14 +01:00
|
|
|
def test_overlaps_1():
|
|
|
|
# https://github.com/fonttools/fonttools/issues/1400
|
|
|
|
conds = [
|
2022-12-13 11:26:36 +00:00
|
|
|
([{"abcd": (4, 9)}], {0: 0}),
|
|
|
|
([{"abcd": (5, 10)}], {1: 1}),
|
|
|
|
([{"abcd": (0, 8)}], {2: 2}),
|
|
|
|
([{"abcd": (3, 7)}], {3: 3}),
|
2018-12-05 19:54:14 +01:00
|
|
|
]
|
|
|
|
overlaps = overlayFeatureVariations(conds)
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 0}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {2: 2}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 1}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {2: 2}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 3}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {2: 2, 3: 3}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 4}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {0: 0, 2: 2, 3: 3}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 5}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {0: 0, 1: 1, 2: 2, 3: 3}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 7}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {0: 0, 1: 1, 2: 2, 3: 3}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 8}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {0: 0, 1: 1, 2: 2}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 9}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {0: 0, 1: 1}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 10}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {1: 1}
|
|
|
|
|
2022-12-13 11:26:36 +00:00
|
|
|
|
2018-12-05 19:54:14 +01:00
|
|
|
def test_overlaps_2():
|
|
|
|
# https://github.com/fonttools/fonttools/issues/1400
|
|
|
|
conds = [
|
2022-12-13 11:26:36 +00:00
|
|
|
([{"abcd": (1, 9)}], {0: 0}),
|
|
|
|
([{"abcd": (8, 10)}], {1: 1}),
|
|
|
|
([{"abcd": (3, 4)}], {2: 2}),
|
|
|
|
([{"abcd": (1, 10)}], {3: 3}),
|
2018-12-05 19:54:14 +01:00
|
|
|
]
|
|
|
|
overlaps = overlayFeatureVariations(conds)
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 0}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 1}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {0: 0, 3: 3}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 2}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {0: 0, 3: 3}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 3}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {0: 0, 2: 2, 3: 3}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 5}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {0: 0, 3: 3}
|
2022-12-13 11:26:36 +00:00
|
|
|
subst = _match_condition({"abcd": 10}, overlaps)
|
2018-12-05 19:54:14 +01:00
|
|
|
assert subst == {1: 1, 3: 3}
|
|
|
|
|
2018-11-09 18:59:28 -05:00
|
|
|
|
|
|
|
def run(test, n, quiet):
|
|
|
|
|
|
|
|
print()
|
|
|
|
print("%s:" % test.__name__)
|
|
|
|
input, output = test(n)
|
2018-11-09 11:54:40 -05:00
|
|
|
if quiet:
|
|
|
|
print(len(output))
|
|
|
|
else:
|
2018-11-09 18:59:28 -05:00
|
|
|
print()
|
2018-11-09 11:54:40 -05:00
|
|
|
print("Input:")
|
|
|
|
pprint(input)
|
|
|
|
print()
|
|
|
|
print("Output:")
|
|
|
|
pprint(output)
|
2018-11-09 18:59:28 -05:00
|
|
|
print()
|
|
|
|
|
2022-12-13 11:26:36 +00:00
|
|
|
|
2018-11-09 18:59:28 -05:00
|
|
|
if __name__ == "__main__":
|
|
|
|
import sys
|
|
|
|
from pprint import pprint
|
2022-12-13 11:26:36 +00:00
|
|
|
|
2018-11-09 18:59:28 -05:00
|
|
|
quiet = False
|
|
|
|
n = 3
|
2022-12-13 11:26:36 +00:00
|
|
|
if len(sys.argv) > 1 and sys.argv[1] == "-q":
|
2018-11-09 18:59:28 -05:00
|
|
|
quiet = True
|
|
|
|
del sys.argv[1]
|
|
|
|
if len(sys.argv) > 1:
|
|
|
|
n = int(sys.argv[1])
|
|
|
|
|
2023-02-08 14:18:49 -07:00
|
|
|
run(_test_linear, n=n, quiet=quiet)
|
|
|
|
run(_test_quadratic, n=n, quiet=quiet)
|