def test_blend_round_trip(self): ttx_path = self.getpath('TestSparseCFF2VF.ttx') ttf_font = TTFont(recalcBBoxes=False, recalcTimestamp=False) ttf_font.importXML(ttx_path) fontGlyphList = ttf_font.getGlyphOrder() topDict = ttf_font['CFF2'].cff.topDictIndex[0] charstrings = topDict.CharStrings for glyphName in fontGlyphList: cs = charstrings[glyphName] cs.decompile() cmds = programToCommands(cs.program, getNumRegions=cs.getNumRegions) cmds_g = generalizeCommands(cmds) cmds = specializeCommands(cmds_g, generalizeFirst=False) program = commandsToProgram(cmds) self.assertEqual(program, cs.program) program = specializeProgram(program, getNumRegions=cs.getNumRegions) self.assertEqual(program, cs.program) program_g = generalizeProgram(program, getNumRegions=cs.getNumRegions) program = commandsToProgram(cmds_g) self.assertEqual(program, program_g)
def test_blend_round_trip(self): ttx_path = self.getpath('TestSparseCFF2VF.ttx') ttf_font = TTFont(recalcBBoxes=False, recalcTimestamp=False) ttf_font.importXML(ttx_path) fontGlyphList = ttf_font.getGlyphOrder() topDict = ttf_font['CFF2'].cff.topDictIndex[0] charstrings = topDict.CharStrings for glyphName in fontGlyphList: cs = charstrings[glyphName] cs.decompile() cmds = programToCommands(cs.program, getNumRegions=cs.getNumRegions) cmds_g = generalizeCommands(cmds) cmds = specializeCommands(cmds_g, generalizeFirst=False) program = commandsToProgram(cmds) self.assertEqual(program, cs.program) program = specializeProgram(program, getNumRegions=cs.getNumRegions) self.assertEqual(program, cs.program) program_g = generalizeProgram(program, getNumRegions=cs.getNumRegions) program = commandsToProgram(cmds_g) self.assertEqual(program, program_g)
def test_blend_programToCommands(self): ttx_path = self.getpath('TestCFF2Widths.ttx') ttf_font = TTFont(recalcBBoxes=False, recalcTimestamp=False) ttf_font.importXML(ttx_path) fontGlyphList = ttf_font.getGlyphOrder() topDict = ttf_font['CFF2'].cff.topDictIndex[0] charstrings = topDict.CharStrings for glyphName in fontGlyphList: cs = charstrings[glyphName] cs.decompile() cmds = programToCommands(cs.program, getNumRegions=cs.getNumRegions) program = commandsToProgram(cmds) self.assertEqual(program, cs.program)
def getCharString( self, private=None, globalSubrs=None, var_model=None, optimize=True): commands = self._commands commands = self.reorder_blend_args(commands, partial (var_model.getDeltas, round=self.round)) if optimize: commands = specializeCommands( commands, generalizeFirst=False, maxstack=maxStackLimit) program = commandsToProgram(commands) charString = T2CharString( program=program, private=private, globalSubrs=globalSubrs) return charString
def test_blend_round_trip(self): otfvf_path = self.get_test_input('TestSparseCFF2VF.otf') ttf_font = TTFont(otfvf_path) fontGlyphList = ttf_font.getGlyphOrder() topDict = ttf_font['CFF2'].cff.topDictIndex[0] charstrings = topDict.CharStrings for glyphName in fontGlyphList: print(glyphName) cs = charstrings[glyphName] cs.decompile() cmds = programToCommands(cs.program, getNumRegions=cs.getNumRegions) cmds_g = generalizeCommands(cmds) cmds = specializeCommands(cmds_g, generalizeFirst=False) program = commandsToProgram(cmds) self.assertEqual(program, cs.program) program = specializeProgram(program, getNumRegions=cs.getNumRegions) self.assertEqual(program, cs.program) program_g = generalizeProgram(program, getNumRegions=cs.getNumRegions) program = commandsToProgram(cmds_g) self.assertEqual(program, program_g)
def getCharString( self, private=None, globalSubrs=None, var_model=None, optimize=True): commands = self._commands commands = self.reorder_blend_args(commands, var_model.getDeltas, self.roundNumber) if optimize: commands = specializeCommands( commands, generalizeFirst=False, maxstack=maxStackLimit) program = commandsToProgram(commands) charString = T2CharString( program=program, private=private, globalSubrs=globalSubrs) return charString
def getCharString(self, private=None, globalSubrs=None, optimize=True): commands = self._commands if optimize: maxstack = 48 if not self._CFF2 else 513 commands = specializeCommands(commands, generalizeFirst=False, maxstack=maxstack) program = commandsToProgram(commands) if self._width is not None: assert not self._CFF2, "CFF2 does not allow encoding glyph width in CharString." program.insert(0, otRound(self._width)) if not self._CFF2: program.append('endchar') charString = T2CharString( program=program, private=private, globalSubrs=globalSubrs) return charString
def getCharStrings(self, num_masters, private=None, globalSubrs=None, default_idx=0): """ A command looks like: [op_name, [ [source 0 arglist for op], [source 1 arglist for op], ... [source n arglist for op], I am not optimizing this there, as that will be done when the CFF2 Charstring is created in fontTools.varLib.build(). If I did, I would have to rearrange the arguments to: [ [arg 0 for source 0 ... arg 0 for source n] [arg 1 for source 0 ... arg 1 for source n] ... [arg M for source 0 ... arg M for source n] ] before calling specialize. """ t2List = [] merged_commands = self._commands for i in range(num_masters): commands = [] for op in merged_commands: source_op = [op[0], op[1][i]] commands.append(source_op) program = commandsToProgram(commands) if self._width is not None: assert not self._CFF2, ( "CFF2 does not allow encoding glyph width in CharString.") program.insert(0, otRound(self._width)) if not self._CFF2: program.append('endchar') charString = T2CharString(program=program, private=private, globalSubrs=globalSubrs) t2List.append(charString) # if default_idx is not 0, we need to move it to the right index. if default_idx: default_font_cs = t2List.pop(0) t2List.insert(default_idx, default_font_cs) return t2List