From c8cf233e263576889926003ad4e0de0f6522aa30 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 5 May 2017 21:21:30 -0600 Subject: [PATCH] [pens.t2CharStringPen] Hook up to cffLib.specializer Tests are failing now, as cffLib.specializer combines operations whereas previous pen didn't. I checked all failures and they all look like the expectation needs to be updated to me. Fixes https://github.com/fonttools/fonttools/issues/403 --- Lib/fontTools/pens/t2CharStringPen.py | 45 ++++++--------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/Lib/fontTools/pens/t2CharStringPen.py b/Lib/fontTools/pens/t2CharStringPen.py index abdbec480..49b53f561 100644 --- a/Lib/fontTools/pens/t2CharStringPen.py +++ b/Lib/fontTools/pens/t2CharStringPen.py @@ -5,6 +5,7 @@ from __future__ import print_function, division, absolute_import from fontTools.misc.py23 import * from fontTools.misc.psCharStrings import T2CharString from fontTools.pens.basePen import BasePen +from fontTools.cffLib.specializer import specializeProgram class RelativeCoordinatePen(BasePen): @@ -104,8 +105,7 @@ class T2CharStringPen(RelativeCoordinatePen): self.roundPoint = makeRoundFunc(roundTolerance) self._heldMove = None self._program = [] - if width is not None: - self._program.append(round(width)) + self._width = width def _moveTo(self, pt): RelativeCoordinatePen._moveTo(self, self.roundPoint(pt)) @@ -113,12 +113,7 @@ class T2CharStringPen(RelativeCoordinatePen): def _relativeMoveTo(self, pt): pt = self.roundPoint(pt) dx, dy = pt - if dx == 0: - self._heldMove = [dy, "vmoveto"] - elif dy == 0: - self._heldMove = [dx, "hmoveto"] - else: - self._heldMove = [dx, dy, "rmoveto"] + self._heldMove = [dx, dy, "rmoveto"] def _storeHeldMove(self): if self._heldMove is not None: @@ -132,12 +127,7 @@ class T2CharStringPen(RelativeCoordinatePen): self._storeHeldMove() pt = self.roundPoint(pt) dx, dy = pt - if dx == 0: - self._program.extend([dy, "vlineto"]) - elif dy == 0: - self._program.extend([dx, "hlineto"]) - else: - self._program.extend([dx, dy, "rlineto"]) + self._program.extend([dx, dy, "rlineto"]) def _curveToOne(self, pt1, pt2, pt3): RelativeCoordinatePen._curveToOne(self, @@ -153,26 +143,7 @@ class T2CharStringPen(RelativeCoordinatePen): dx1, dy1 = pt1 dx2, dy2 = pt2 dx3, dy3 = pt3 - if dx1 == 0: - if dx3 == 0: - self._program.extend([dy1, dx2, dy2, dy3, "vvcurveto"]) - elif dy3 == 0: - self._program.extend([dy1, dx2, dy2, dx3, "vhcurveto"]) - else: - self._program.extend([dy1, dx2, dy2, dx3, dy3, "vhcurveto"]) - elif dy1 == 0: - if dy3 == 0: - self._program.extend([dx1, dx2, dy2, dx3, "hhcurveto"]) - elif dx3 == 0: - self._program.extend([dx1, dx2, dy2, dy3, "hvcurveto"]) - else: - self._program.extend([dx1, dx2, dy2, dy3, dx3, "hvcurveto"]) - elif dx3 == 0: - self._program.extend([dx1, dy1, dx2, dy2, dy3, "vvcurveto"]) - elif dy3 == 0: - self._program.extend([dy1, dx1, dx2, dy2, dx3, "hhcurveto"]) - else: - self._program.extend([dx1, dy1, dx2, dy2, dx3, dy3, "rrcurveto"]) + self._program.extend([dx1, dy1, dx2, dy2, dx3, dy3, "rrcurveto"]) def _closePath(self): pass @@ -180,8 +151,12 @@ class T2CharStringPen(RelativeCoordinatePen): def _endPath(self): pass - def getCharString(self, private=None, globalSubrs=None): + def getCharString(self, private=None, globalSubrs=None, optimize=True): program = self._program + ["endchar"] + if optimize: + program = specializeProgram(program) + if self._width is not None: + program.insert(0, round(self._width)) charString = T2CharString( program=program, private=private, globalSubrs=globalSubrs) return charString