From d4d8c4ac5b82a4ad47e1f88444b547eefccffe59 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 19 Aug 2022 11:03:23 -0600 Subject: [PATCH] [scaleUpem] Support CFF/CFF2 --- Lib/fontTools/cffLib/__init__.py | 2 ++ Lib/fontTools/subset/cff.py | 1 - Lib/fontTools/ttLib/scaleUpem.py | 44 +++++++++++++++++++++++++++----- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/Lib/fontTools/cffLib/__init__.py b/Lib/fontTools/cffLib/__init__.py index fc82bb27a..3eda9ba48 100644 --- a/Lib/fontTools/cffLib/__init__.py +++ b/Lib/fontTools/cffLib/__init__.py @@ -1037,6 +1037,8 @@ class VarStoreData(object): return len(self.data) def getNumRegions(self, vsIndex): + if vsIndex is None: + vsIndex = 0 varData = self.otVarStore.VarData[vsIndex] numRegions = varData.VarRegionCount return numRegions diff --git a/Lib/fontTools/subset/cff.py b/Lib/fontTools/subset/cff.py index 0dcb79755..532743e35 100644 --- a/Lib/fontTools/subset/cff.py +++ b/Lib/fontTools/subset/cff.py @@ -3,7 +3,6 @@ from fontTools import ttLib from fontTools.pens.basePen import NullPen from fontTools.misc.roundTools import otRound from fontTools.misc.loggingTools import deprecateFunction -from fontTools.varLib.varStore import VarStoreInstancer from fontTools.subset.util import _add_method, _uniq_sort diff --git a/Lib/fontTools/ttLib/scaleUpem.py b/Lib/fontTools/ttLib/scaleUpem.py index 02d356996..8282dd71e 100644 --- a/Lib/fontTools/ttLib/scaleUpem.py +++ b/Lib/fontTools/ttLib/scaleUpem.py @@ -8,6 +8,8 @@ from fontTools.ttLib.ttVisitor import TTVisitor import fontTools.ttLib as ttLib 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.misc.fixedTools import otRound @@ -144,6 +146,41 @@ def visit(visitor, obj, attr, kernTables): kernTable[k] = visitor.scale(kernTable[k]) +def _cff_scale(visitor, args): + new_args = [] + for arg in args: + if not isinstance(arg, list): + new_args.append(visitor.scale(arg)) + else: + num_blends = arg[-1] + _cff_scale(visitor, arg) + arg[-1] = num_blends + new_args.append(arg) + args[:] = new_args + + +@ScalerVisitor.register_attr( + (ttLib.getTableClass("CFF "), ttLib.getTableClass("CFF2")), "cff" +) +def visit(visitor, obj, attr, cff): + cff.desubroutinize() + topDict = cff.topDictIndex[0] + varStore = getattr(topDict, "VarStore", None) + getNumRegions = varStore.getNumRegions if varStore is not None else None + for fontname in cff.keys(): + font = cff[fontname] + cs = font.CharStrings + for g in font.charset: + c, _ = cs.getItemAndSelector(g) + + commands = cffSpecializer.programToCommands( + c.program, getNumRegions=getNumRegions + ) + for op, args in commands: + _cff_scale(visitor, args) + c.program[:] = cffSpecializer.commandsToProgram(commands) + + # ItemVariationStore @@ -229,13 +266,6 @@ def main(args=None): font = TTFont(args[0]) new_upem = int(args[1]) - if "CFF " in font or "CFF2" in font: - print( - "fonttools ttLib.scaleUpem: CFF/CFF2 fonts are not supported.", - file=sys.stderr, - ) - sys.exit(1) - scale_upem(font, new_upem) print("Writing out.ttf")