aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
diff options
context:
space:
mode:
authorMaxim Yurchuk <maxim-yurchuk@ydb.tech>2024-10-18 20:31:38 +0300
committerGitHub <noreply@github.com>2024-10-18 20:31:38 +0300
commit2a74bac2d2d3bccb4e10120f1ead805640ec9dd0 (patch)
tree047e4818ced5aaf73f58517629e5260b5291f9f0 /contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
parent2d9656823e9521d8c29ea4c9a1d0eab78391abfc (diff)
parent3d834a1923bbf9403cd4a448e7f32b670aa4124f (diff)
downloadydb-2a74bac2d2d3bccb4e10120f1ead805640ec9dd0.tar.gz
Merge pull request #10502 from ydb-platform/mergelibs-241016-1210
Library import 241016-1210
Diffstat (limited to 'contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py')
-rw-r--r--contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py27
1 files changed, 20 insertions, 7 deletions
diff --git a/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py b/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
index f71b32afd1..5cf22cf879 100644
--- a/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
+++ b/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
@@ -293,17 +293,19 @@ def add_isomorphisms(points, isomorphisms, reverse):
)
-def find_parents_and_order(glyphsets, locations):
+def find_parents_and_order(glyphsets, locations, *, discrete_axes=set()):
parents = [None] + list(range(len(glyphsets) - 1))
order = list(range(len(glyphsets)))
if locations:
# Order base master first
- bases = (i for i, l in enumerate(locations) if all(v == 0 for v in l.values()))
+ bases = [
+ i
+ for i, l in enumerate(locations)
+ if all(v == 0 for k, v in l.items() if k not in discrete_axes)
+ ]
if bases:
- base = next(bases)
- logging.info("Base master index %s, location %s", base, locations[base])
+ logging.info("Found %s base masters: %s", len(bases), bases)
else:
- base = 0
logging.warning("No base master location found")
# Form a minimum spanning tree of the locations
@@ -317,9 +319,17 @@ def find_parents_and_order(glyphsets, locations):
axes = sorted(axes)
vectors = [tuple(l.get(k, 0) for k in axes) for l in locations]
for i, j in itertools.combinations(range(len(locations)), 2):
+ i_discrete_location = {
+ k: v for k, v in zip(axes, vectors[i]) if k in discrete_axes
+ }
+ j_discrete_location = {
+ k: v for k, v in zip(axes, vectors[j]) if k in discrete_axes
+ }
+ if i_discrete_location != j_discrete_location:
+ continue
graph[i][j] = vdiff_hypot2(vectors[i], vectors[j])
- tree = minimum_spanning_tree(graph)
+ tree = minimum_spanning_tree(graph, overwrite=True)
rows, cols = tree.nonzero()
graph = defaultdict(set)
for row, col in zip(rows, cols):
@@ -330,7 +340,7 @@ def find_parents_and_order(glyphsets, locations):
parents = [None] * len(locations)
order = []
visited = set()
- queue = deque([base])
+ queue = deque(bases)
while queue:
i = queue.popleft()
visited.add(i)
@@ -339,6 +349,9 @@ def find_parents_and_order(glyphsets, locations):
if j not in visited:
parents[j] = i
queue.append(j)
+ assert len(order) == len(
+ parents
+ ), "Not all masters are reachable; report an issue"
except ImportError:
pass