diff options
author | Maxim Yurchuk <maxim-yurchuk@ydb.tech> | 2024-10-18 20:31:38 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-18 20:31:38 +0300 |
commit | 2a74bac2d2d3bccb4e10120f1ead805640ec9dd0 (patch) | |
tree | 047e4818ced5aaf73f58517629e5260b5291f9f0 /contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py | |
parent | 2d9656823e9521d8c29ea4c9a1d0eab78391abfc (diff) | |
parent | 3d834a1923bbf9403cd4a448e7f32b670aa4124f (diff) | |
download | ydb-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.py | 27 |
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 |