diff options
author | Elliott Hughes <enh@google.com> | 2023-11-10 19:23:18 +0000 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2023-11-10 19:23:18 +0000 |
commit | 02cec46c7a3918f19153e4e2de707f9d7de83fc8 (patch) | |
tree | c927c514a071f3a5ec125b3f474ad4ce4d39a7fa /Lib/fontTools/ttLib/scaleUpem.py | |
parent | a936b27b9394502de80c116f46aff5b1a1cc3925 (diff) | |
download | fonttools-02cec46c7a3918f19153e4e2de707f9d7de83fc8.tar.gz |
Upgrade fonttools to 4.44.0
This project was upgraded with external_updater.
Usage: tools/external_updater/updater.sh update fonttools
For more info, check https://cs.android.com/android/platform/superproject/+/main:tools/external_updater/README.md
Test: TreeHugger
Change-Id: I5de68c96999d1b8671c251a2555948da63de5bc6
Diffstat (limited to 'Lib/fontTools/ttLib/scaleUpem.py')
-rw-r--r-- | Lib/fontTools/ttLib/scaleUpem.py | 86 |
1 files changed, 72 insertions, 14 deletions
diff --git a/Lib/fontTools/ttLib/scaleUpem.py b/Lib/fontTools/ttLib/scaleUpem.py index 9e0e0ade..3f9b22af 100644 --- a/Lib/fontTools/ttLib/scaleUpem.py +++ b/Lib/fontTools/ttLib/scaleUpem.py @@ -10,7 +10,9 @@ import fontTools.ttLib.tables.otBase as otBase import fontTools.ttLib.tables.otTables as otTables from fontTools.cffLib import VarStoreData import fontTools.cffLib.specializer as cffSpecializer +from fontTools.varLib import builder # for VarData.calculateNumShorts from fontTools.misc.fixedTools import otRound +from fontTools.ttLib.tables._g_l_y_f import VarComponentFlags __all__ = ["scale_upem", "ScalerVisitor"] @@ -111,30 +113,82 @@ def visit(visitor, obj, attr, VOriginRecords): @ScalerVisitor.register_attr(ttLib.getTableClass("glyf"), "glyphs") def visit(visitor, obj, attr, glyphs): for g in glyphs.values(): + for attr in ("xMin", "xMax", "yMin", "yMax"): + v = getattr(g, attr, None) + if v is not None: + setattr(g, attr, visitor.scale(v)) + if g.isComposite(): for component in g.components: component.x = visitor.scale(component.x) component.y = visitor.scale(component.y) - else: - for attr in ("xMin", "xMax", "yMin", "yMax"): - v = getattr(g, attr, None) - if v is not None: - setattr(g, attr, visitor.scale(v)) + continue - glyf = visitor.font["glyf"] - coordinates = g.getCoordinates(glyf)[0] - for i, (x, y) in enumerate(coordinates): - coordinates[i] = visitor.scale(x), visitor.scale(y) + if g.isVarComposite(): + for component in g.components: + for attr in ("translateX", "translateY", "tCenterX", "tCenterY"): + v = getattr(component.transform, attr) + setattr(component.transform, attr, visitor.scale(v)) + continue + + if hasattr(g, "coordinates"): + coordinates = g.coordinates + for i, (x, y) in enumerate(coordinates): + coordinates[i] = visitor.scale(x), visitor.scale(y) @ScalerVisitor.register_attr(ttLib.getTableClass("gvar"), "variations") def visit(visitor, obj, attr, variations): - for varlist in variations.values(): + # VarComposites are a pain to handle :-( + glyfTable = visitor.font["glyf"] + + for glyphName, varlist in variations.items(): + glyph = glyfTable[glyphName] + isVarComposite = glyph.isVarComposite() for var in varlist: coordinates = var.coordinates - for i, xy in enumerate(coordinates): - if xy is None: - continue + + if not isVarComposite: + for i, xy in enumerate(coordinates): + if xy is None: + continue + coordinates[i] = visitor.scale(xy[0]), visitor.scale(xy[1]) + continue + + # VarComposite glyph + + i = 0 + for component in glyph.components: + if component.flags & VarComponentFlags.AXES_HAVE_VARIATION: + i += len(component.location) + if component.flags & ( + VarComponentFlags.HAVE_TRANSLATE_X + | VarComponentFlags.HAVE_TRANSLATE_Y + ): + xy = coordinates[i] + coordinates[i] = visitor.scale(xy[0]), visitor.scale(xy[1]) + i += 1 + if component.flags & VarComponentFlags.HAVE_ROTATION: + i += 1 + if component.flags & ( + VarComponentFlags.HAVE_SCALE_X | VarComponentFlags.HAVE_SCALE_Y + ): + i += 1 + if component.flags & ( + VarComponentFlags.HAVE_SKEW_X | VarComponentFlags.HAVE_SKEW_Y + ): + i += 1 + if component.flags & ( + VarComponentFlags.HAVE_TCENTER_X | VarComponentFlags.HAVE_TCENTER_Y + ): + xy = coordinates[i] + coordinates[i] = visitor.scale(xy[0]), visitor.scale(xy[1]) + i += 1 + + # Phantom points + assert i + 4 == len(coordinates) + for i in range(i, len(coordinates)): + xy = coordinates[i] coordinates[i] = visitor.scale(xy[0]), visitor.scale(xy[1]) @@ -149,7 +203,8 @@ def visit(visitor, obj, attr, kernTables): def _cff_scale(visitor, args): for i, arg in enumerate(args): if not isinstance(arg, list): - args[i] = visitor.scale(arg) + if not isinstance(arg, bytes): + args[i] = visitor.scale(arg) else: num_blends = arg[-1] _cff_scale(visitor, arg) @@ -176,6 +231,8 @@ def visit(visitor, obj, attr, cff): c.program, getNumRegions=getNumRegions ) for op, args in commands: + if op == "vsindex": + continue _cff_scale(visitor, args) c.program[:] = cffSpecializer.commandsToProgram(commands) @@ -231,6 +288,7 @@ def visit(visitor, varData): for item in varData.Item: for i, v in enumerate(item): item[i] = visitor.scale(v) + varData.calculateNumShorts() # COLRv1 |