aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.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/ttLib/ttGlyphSet.py
parent50a65e3b48a82d5b51f272664da389f2e0b0c99a (diff)
downloadydb-e95f266d2a3e48e62015220588a4fd73d5d5a5cb.tar.gz
Library import 6 (#888)
Diffstat (limited to 'contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py')
-rw-r--r--contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py b/contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py
index 349cc2c73f..5d188d6a10 100644
--- a/contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py
+++ b/contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py
@@ -9,6 +9,11 @@ from fontTools.misc.fixedTools import otRound
from fontTools.misc.loggingTools import deprecateFunction
from fontTools.misc.transform import Transform
from fontTools.pens.transformPen import TransformPen, TransformPointPen
+from fontTools.pens.recordingPen import (
+ DecomposingRecordingPen,
+ lerpRecordings,
+ replayRecording,
+)
class _TTGlyphSet(Mapping):
@@ -321,3 +326,52 @@ def _setCoordinates(glyph, coord, glyfTable, *, recalcBounds=True):
verticalAdvanceWidth,
topSideBearing,
)
+
+
+class LerpGlyphSet(Mapping):
+ """A glyphset that interpolates between two other glyphsets.
+
+ Factor is typically between 0 and 1. 0 means the first glyphset,
+ 1 means the second glyphset, and 0.5 means the average of the
+ two glyphsets. Other values are possible, and can be useful to
+ extrapolate. Defaults to 0.5.
+ """
+
+ def __init__(self, glyphset1, glyphset2, factor=0.5):
+ self.glyphset1 = glyphset1
+ self.glyphset2 = glyphset2
+ self.factor = factor
+
+ def __getitem__(self, glyphname):
+ if glyphname in self.glyphset1 and glyphname in self.glyphset2:
+ return LerpGlyph(glyphname, self)
+ raise KeyError(glyphname)
+
+ def __contains__(self, glyphname):
+ return glyphname in self.glyphset1 and glyphname in self.glyphset2
+
+ def __iter__(self):
+ set1 = set(self.glyphset1)
+ set2 = set(self.glyphset2)
+ return iter(set1.intersection(set2))
+
+ def __len__(self):
+ set1 = set(self.glyphset1)
+ set2 = set(self.glyphset2)
+ return len(set1.intersection(set2))
+
+
+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
+
+ replayRecording(lerpRecordings(recording1.value, recording2.value, factor), pen)