[symfont] Speed up a bit

Remove one level of indirection in access to point data in generated
functions; ie. use p0, p1, ... instead of P[0], P[1], ...

Makes for about 10% speedup.
This commit is contained in:
Behdad Esfahbod 2016-07-02 19:30:01 -07:00
parent cde56fce66
commit 7fd9dce0e9

View File

@ -24,7 +24,7 @@ n = 3 # Max Bezier degree; 3 for cubic, 2 for quadratic
t, x, y = sp.symbols('t x y', real=True)
P = tuple(sp.symbols('P[:%d][:2]' % (n+1), real=True))
P = tuple(sp.symbols('p:%d[:2]' % (n+1), real=True))
P = tuple(P[2*i:2*(i+1)] for i in range(len(P) // 2))
# Cubic Bernstein basis functions
@ -57,7 +57,8 @@ class BezierFuncs(object):
def __getitem__(self, i):
if i not in self._bezfuncs:
self._bezfuncs[i] = sp.lambdify('P', green(self._symfunc, Bezier=BezierCurve[i]))
args = ['p%d'%d for d in range(i+1)]
self._bezfuncs[i] = sp.lambdify(args, green(self._symfunc, Bezier=BezierCurve[i]))
return self._bezfuncs[i]
_BezierFuncs = {}
@ -88,21 +89,21 @@ class GreenPen(BasePen):
def _lineTo(self, p1):
p0 = self._getCurrentPoint()
self.value += self._funcs[1]((p0,p1))
self.value += self._funcs[1](p0,p1)
def _qCurveToOne(self, p1, p2):
p0 = self._getCurrentPoint()
self.value += self._funcs[2]((p0,p1,p2))
self.value += self._funcs[2](p0,p1,p2)
def _curveToOne(self, p1, p2, p3):
p0 = self._getCurrentPoint()
self.value += self._funcs[3]((p0,p1,p2,p3))
self.value += self._funcs[3](p0,p1,p2,p3)
def _closePath(self):
p0 = self._getCurrentPoint()
if p0 != self.__startPoint:
p1 = self.__startPoint
self.value += self._funcs[1]((p0,p1))
self.value += self._funcs[1](p0,p1)
#AreaPen = partial(GreenPen, func=1)
Moment1XPen = partial(GreenPen, func=x)