[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
This commit is contained in:
Behdad Esfahbod 2017-05-05 21:21:30 -06:00
parent c3a94fd4e5
commit c8cf233e26

View File

@ -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