aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
diff options
context:
space:
mode:
authorAlexSm <alex@ydb.tech>2024-01-09 18:56:40 +0100
committerGitHub <noreply@github.com>2024-01-09 18:56:40 +0100
commite95f266d2a3e48e62015220588a4fd73d5d5a5cb (patch)
treea8a784b6931fe52ad5f511cfef85af14e5f63991 /contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
parent50a65e3b48a82d5b51f272664da389f2e0b0c99a (diff)
downloadydb-e95f266d2a3e48e62015220588a4fd73d5d5a5cb.tar.gz
Library import 6 (#888)
Diffstat (limited to 'contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py')
-rw-r--r--contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py95
1 files changed, 46 insertions, 49 deletions
diff --git a/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py b/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
index 513e5f7409..2a3540fff2 100644
--- a/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
+++ b/contrib/python/fonttools/fontTools/varLib/interpolatableHelpers.py
@@ -1,9 +1,11 @@
+from fontTools.ttLib.ttGlyphSet import LerpGlyphSet
from fontTools.pens.basePen import AbstractPen, BasePen, DecomposingPen
from fontTools.pens.pointPen import AbstractPointPen, SegmentToPointPen
from fontTools.pens.recordingPen import RecordingPen, DecomposingRecordingPen
from fontTools.misc.transform import Transform
from collections import defaultdict, deque
from math import sqrt, copysign, atan2, pi
+from enum import Enum
import itertools
import logging
@@ -11,6 +13,50 @@ import logging
log = logging.getLogger("fontTools.varLib.interpolatable")
+class InterpolatableProblem:
+ NOTHING = "nothing"
+ MISSING = "missing"
+ OPEN_PATH = "open_path"
+ PATH_COUNT = "path_count"
+ NODE_COUNT = "node_count"
+ NODE_INCOMPATIBILITY = "node_incompatibility"
+ CONTOUR_ORDER = "contour_order"
+ WRONG_START_POINT = "wrong_start_point"
+ KINK = "kink"
+ UNDERWEIGHT = "underweight"
+ OVERWEIGHT = "overweight"
+
+ severity = {
+ MISSING: 1,
+ OPEN_PATH: 2,
+ PATH_COUNT: 3,
+ NODE_COUNT: 4,
+ NODE_INCOMPATIBILITY: 5,
+ CONTOUR_ORDER: 6,
+ WRONG_START_POINT: 7,
+ KINK: 8,
+ UNDERWEIGHT: 9,
+ OVERWEIGHT: 10,
+ NOTHING: 11,
+ }
+
+
+def sort_problems(problems):
+ """Sort problems by severity, then by glyph name, then by problem message."""
+ return dict(
+ sorted(
+ problems.items(),
+ key=lambda _: -min(
+ (
+ (InterpolatableProblem.severity[p["type"]] + p.get("tolerance", 0))
+ for p in _[1]
+ ),
+ ),
+ reverse=True,
+ )
+ )
+
+
def rot_list(l, k):
"""Rotate list by k items forward. Ie. item at position 0 will be
at position k in returned list. Negative k is allowed."""
@@ -332,52 +378,3 @@ def transform_from_stats(stats, inverse=False):
trans = trans.translate(stats.meanX, stats.meanY)
return trans
-
-
-class LerpGlyphSet:
- def __init__(self, glyphset1, glyphset2, factor=0.5):
- self.glyphset1 = glyphset1
- self.glyphset2 = glyphset2
- self.factor = factor
-
- def __getitem__(self, glyphname):
- return LerpGlyph(glyphname, self)
-
-
-class LerpGlyph:
- def __init__(self, glyphname, glyphset):
- self.glyphset = glyphset
- self.glyphname = glyphname
-
- def draw(self, pen):
- recording1 = DecomposingRecordingPen(self.glyphset.glyphset1)
- self.glyphset.glyphset1[self.glyphname].draw(recording1)
- recording2 = DecomposingRecordingPen(self.glyphset.glyphset2)
- self.glyphset.glyphset2[self.glyphname].draw(recording2)
-
- factor = self.glyphset.factor
- for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value):
- if op1 != op2:
- raise ValueError("Mismatching operations: %s, %s" % (op1, op2))
- mid_args = [
- (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor)
- for (x1, y1), (x2, y2) in zip(args1, args2)
- ]
- getattr(pen, op1)(*mid_args)
-
-
-def lerp_recordings(recording1, recording2, factor=0.5):
- pen = RecordingPen()
- value = pen.value
- for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value):
- if op1 != op2:
- raise ValueError("Mismatched operations: %s, %s" % (op1, op2))
- if op1 == "addComponent":
- mid_args = args1 # XXX Interpolate transformation?
- else:
- mid_args = [
- (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor)
- for (x1, y1), (x2, y2) in zip(args1, args2)
- ]
- value.append((op1, mid_args))
- return pen