You can subscribe to this list here.
2001 
_{Jan}

_{Feb}

_{Mar}

_{Apr}

_{May}

_{Jun}

_{Jul}
(1) 
_{Aug}
(33) 
_{Sep}

_{Oct}

_{Nov}
(2) 
_{Dec}


2002 
_{Jan}
(2) 
_{Feb}

_{Mar}
(2) 
_{Apr}

_{May}
(105) 
_{Jun}
(5) 
_{Jul}
(25) 
_{Aug}
(1) 
_{Sep}
(72) 
_{Oct}
(6) 
_{Nov}
(1) 
_{Dec}

2003 
_{Jan}
(12) 
_{Feb}
(2) 
_{Mar}

_{Apr}

_{May}
(3) 
_{Jun}
(5) 
_{Jul}
(5) 
_{Aug}
(47) 
_{Sep}
(18) 
_{Oct}
(5) 
_{Nov}

_{Dec}

2004 
_{Jan}
(1) 
_{Feb}

_{Mar}

_{Apr}

_{May}

_{Jun}

_{Jul}

_{Aug}

_{Sep}
(17) 
_{Oct}

_{Nov}
(2) 
_{Dec}
(3) 
2005 
_{Jan}
(5) 
_{Feb}
(12) 
_{Mar}
(4) 
_{Apr}
(2) 
_{May}
(4) 
_{Jun}
(4) 
_{Jul}

_{Aug}

_{Sep}

_{Oct}

_{Nov}
(1) 
_{Dec}

2006 
_{Jan}
(7) 
_{Feb}
(3) 
_{Mar}
(1) 
_{Apr}

_{May}
(1) 
_{Jun}

_{Jul}

_{Aug}
(5) 
_{Sep}
(4) 
_{Oct}
(29) 
_{Nov}
(21) 
_{Dec}
(15) 
2007 
_{Jan}
(18) 
_{Feb}
(21) 
_{Mar}
(31) 
_{Apr}
(31) 
_{May}
(21) 
_{Jun}
(16) 
_{Jul}
(20) 
_{Aug}
(50) 
_{Sep}
(30) 
_{Oct}
(23) 
_{Nov}
(49) 
_{Dec}
(17) 
2008 
_{Jan}
(15) 
_{Feb}
(44) 
_{Mar}
(58) 
_{Apr}

_{May}
(13) 
_{Jun}
(1) 
_{Jul}

_{Aug}

_{Sep}
(1) 
_{Oct}

_{Nov}

_{Dec}

2009 
_{Jan}

_{Feb}
(2) 
_{Mar}

_{Apr}

_{May}

_{Jun}

_{Jul}

_{Aug}

_{Sep}

_{Oct}

_{Nov}

_{Dec}

2011 
_{Jan}

_{Feb}

_{Mar}
(2) 
_{Apr}

_{May}

_{Jun}

_{Jul}

_{Aug}

_{Sep}

_{Oct}
(1) 
_{Nov}

_{Dec}

2012 
_{Jan}

_{Feb}

_{Mar}
(16) 
_{Apr}

_{May}

_{Jun}

_{Jul}

_{Aug}

_{Sep}

_{Oct}
(5) 
_{Nov}
(1) 
_{Dec}

2013 
_{Jan}

_{Feb}

_{Mar}

_{Apr}

_{May}

_{Jun}
(9) 
_{Jul}

_{Aug}

_{Sep}

_{Oct}

_{Nov}
(2) 
_{Dec}
(1) 
S  M  T  W  T  F  S 






1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22
(11) 
23
(3) 
24
(6) 
25
(9) 
26
(7) 
27

28
(8) 
29
(2) 
30
(1) 
31







From: Just van Rossum <jvr@us...>  20030823 20:24:45

Update of /cvsroot/fonttools/fonttools/Lib/fontTools/pens In directory sc8prcvs1:/tmp/cvsserv13249 Modified Files: basePen.py boundsPen.py Log Message: wrapped some long lines Index: basePen.py =================================================================== RCS file: /cvsroot/fonttools/fonttools/Lib/fontTools/pens/basePen.py,v retrieving revision 1.1 retrieving revision 1.2 diff C2 d r1.1 r1.2 *** basePen.py 23 Aug 2003 20:19:33 0000 1.1  basePen.py 23 Aug 2003 20:24:42 0000 1.2 *************** *** 171,175 **** pt2 = temp else: ! pt3 = (0.5 * (pt2[0] + temp[0]), 0.5 * (pt2[1] + temp[1])) self._curveToOne(pt1, pt2, pt3) pt1, pt2, pt3 = temp, None, None  171,176  pt2 = temp else: ! pt3 = (0.5 * (pt2[0] + temp[0]), ! 0.5 * (pt2[1] + temp[1])) self._curveToOne(pt1, pt2, pt3) pt1, pt2, pt3 = temp, None, None *************** *** 187,193 **** assert n >= 0 if n > 0: ! # Split the string of points into discrete quadratic curve segments. ! # Between any two consecutive offcurve points there's an implied ! # oncurve point exactly in the middle. This is where the segment splits. _qCurveToOne = self._qCurveToOne for i in range(len(points)  2):  188,195  assert n >= 0 if n > 0: ! # Split the string of points into discrete quadratic curve ! # segments. Between any two consecutive offcurve points ! # there's an implied oncurve point exactly in the middle. ! # This is where the segment splits. _qCurveToOne = self._qCurveToOne for i in range(len(points)  2): *************** *** 209,213 **** print "%s %s lineto" % (pt[0], pt[1]) def _curveToOne(self, bcp1, bcp2, pt): ! print "%s %s %s %s %s %s curveto" % (bcp1[0], bcp1[1], bcp2[0], bcp2[1], pt[0], pt[1]) def _closePath(self): print "closepath"  211,216  print "%s %s lineto" % (pt[0], pt[1]) def _curveToOne(self, bcp1, bcp2, pt): ! print "%s %s %s %s %s %s curveto" % (bcp1[0], bcp1[1], ! bcp2[0], bcp2[1], pt[0], pt[1]) def _closePath(self): print "closepath" Index: boundsPen.py =================================================================== RCS file: /cvsroot/fonttools/fonttools/Lib/fontTools/pens/boundsPen.py,v retrieving revision 1.1 retrieving revision 1.2 diff C2 d r1.1 r1.2 *** boundsPen.py 23 Aug 2003 20:19:33 0000 1.1  boundsPen.py 23 Aug 2003 20:24:42 0000 1.2 *************** *** 64,68 **** bounds = updateBounds(bounds, pt) if not pointInRect(bcp1, bounds) or not pointInRect(bcp2, bounds): ! bounds = unionRect(bounds, calcCubicBounds(self._getCurrentPoint(), bcp1, bcp2, pt)) self.bounds = bounds  64,69  bounds = updateBounds(bounds, pt) if not pointInRect(bcp1, bounds) or not pointInRect(bcp2, bounds): ! bounds = unionRect(bounds, calcCubicBounds( ! self._getCurrentPoint(), bcp1, bcp2, pt)) self.bounds = bounds *************** *** 71,75 **** bounds = updateBounds(bounds, pt) if not pointInRect(bcp, bounds): ! bounds = unionRect(bounds, calcQuadraticBounds(self._getCurrentPoint(), bcp, pt)) self.bounds = bounds  72,77  bounds = updateBounds(bounds, pt) if not pointInRect(bcp, bounds): ! bounds = unionRect(bounds, calcQuadraticBounds( ! self._getCurrentPoint(), bcp, pt)) self.bounds = bounds 
From: Just van Rossum <jvr@us...>  20030823 20:19:36

Update of /cvsroot/fonttools/fonttools/Lib/fontTools/pens In directory sc8prcvs1:/tmp/cvsserv12512 Added Files: __init__.py basePen.py boundsPen.py transformPen.py Log Message: Pen stuff, see http://just.letterror.com/cgibin/wypy?PenProtocol Only lightly tested, component support is not tested at all.  NEW FILE: __init__.py  """Empty __init__.py file to signal Python this directory is a package. (It can't be completely empty since WinZip seems to skip empty files.) """  NEW FILE: basePen.py  """fontTools.pens.basePen.py  Tools and base classes to build pen objects. The Pen Protocol A Pen is a kind of object that standardizes the way how to "draw" outlines: it is a middle man between an outline and a drawing. In other words: it is an abstraction for drawing outlines, making sure that outline objects don't need to know the details about how and where they're being drawn, and that drawings don't need to know the details of how outlines are stored. The most basic pattern is this: outline.draw(pen) # 'outline' draws itself onto 'pen' Pens can be used to render outlines to the screen, but also to construct new outlines. Eg. an outline object can be both a drawable object (it has a draw() method) as well as a pen itself: you *build* an outline using pen methods. The AbstractPen class defines the Pen protocol. The BasePen class is a base implementation useful for drawing pens. See the comments in that class for which methods you need to override. """ __all__ = ["AbstractPen", "BasePen"] class AbstractPen: def moveTo(self, pt): """Begin a new sub path, set the current point to 'pt'.""" raise NotImplementedError def lineTo(self, pt): """Draw a straight line.""" raise NotImplementedError def curveTo(self, *points): """Draw a curve with an *arbitrary* number of control points. Let n be the number of control points (which is the number of arguments to this call minus 1). If n==2, a plain vanilla cubic bezier is drawn. If n==1, we fall back to a quadratic segment and if n==0 we draw a straight line. It gets interesting when n>2: n1 PostScriptstyle cubic segments will be drawn as if it were one curve. The conversion algorithm used for n>2 is inspired by NURB splines, and is conceptually equivalent to the TrueType "implied points" principle. See also qCurve(). """ raise NotImplementedError def qCurveTo(self, *points): """Draw a whole string of quadratic curve segments. This implements TrueTypestyle curves, breaking up curves using implied points: between each two consequtive offcurve points, there is one 'implied' point exactly in the middle between them. 'points' is a sequence of at least two points. Just like with any segment drawing function, the first and the last point are treated as onCurve, the rest as offCurve. """ raise NotImplementedError def closePath(self): """Close the current sub path.""" pass def addComponent(self, glyphName, transformation): """Add a sub glyph.""" raise NotImplementedError class BasePen(AbstractPen): """Base class for drawing pens.""" def __init__(self, glyphSet): self.glyphSet = glyphSet self.__currentPoint = None # must override def _moveTo(self, pt): raise NotImplementedError def _lineTo(self, pt): raise NotImplementedError def _curveToOne(self, pt1, pt2, pt3): raise NotImplementedError # may override def _closePath(self): pass def _qCurveToOne(self, pt1, pt2): """This method implements the basic quadratic curve type. The default implementation delegates the work to the cubic curve function. Optionally override with a native implementation. """ pt0x, pt0y = self.__currentPoint pt1x, pt1y = pt1 pt2x, pt2y = pt2 mid1x = pt0x + 0.66666666666666667 * (pt1x  pt0x) mid1y = pt0y + 0.66666666666666667 * (pt1y  pt0y) mid2x = pt2x + 0.66666666666666667 * (pt1x  pt2x) mid2y = pt2y + 0.66666666666666667 * (pt1y  pt2y) self._curveToOne((mid1x, mid1y), (mid2x, mid2y), pt2) def addComponent(self, glyphName, transformation): """This default implementation simply transforms the points of the base glyph and draws it onto self. """ from fontTools.pens.transformPen import TransformPen tPen = TransformPen(self, transformation) self.glyphSet[glyphName].draw(tPen) # don't override def _getCurrentPoint(self): """Return the current point. This is not part of the public interface, yet is useful for subclasses. """ return self.__currentPoint def closePath(self): self._closePath() self.__currentPoint = None def moveTo(self, pt): self._moveTo(pt) self.__currentPoint = pt def lineTo(self, pt): self._lineTo(pt) self.__currentPoint = pt def curveTo(self, *points): n = len(points)  1 # 'n' is the number of control points assert n >= 0 if n == 2: # The common case, we have exactly two BCP's, so this is a standard # cubic bezier. self._curveToOne(*points) self.__currentPoint = points[1] elif n > 2: # n is the number of control points; split curve into n1 cubic # bezier segments. The algorithm used here is inspired by NURB # splines and the TrueType "implied point" principle, and ensures # the smoothest possible connection between two curve segments, # with no disruption in the curvature. It is practical since it # allows one to construct multiple bezier segments with a much # smaller amount of points. pt1, pt2, pt3 = points[0], None, None for i in range(2, n+1): # calculate points in between control points. nDivisions = min(i, 3, ni+2) d = float(nDivisions) for j in range(1, nDivisions): factor = j / d temp1 = points[i1] temp2 = points[i2] temp = (temp2[0] + factor * (temp1[0]  temp2[0]), temp2[1] + factor * (temp1[1]  temp2[1])) if pt2 is None: pt2 = temp else: pt3 = (0.5 * (pt2[0] + temp[0]), 0.5 * (pt2[1] + temp[1])) self._curveToOne(pt1, pt2, pt3) pt1, pt2, pt3 = temp, None, None self._curveToOne(pt1, points[2], points[1]) self.__currentPoint = points[1] elif n == 1: self._qCurveOne(*points) elif n == 0: self.lineTo(points[0]) else: raise AssertionError, "can't get there from here" def qCurveTo(self, *points): n = len(points)  1 # 'n' is the number of control points assert n >= 0 if n > 0: # Split the string of points into discrete quadratic curve segments. # Between any two consecutive offcurve points there's an implied # oncurve point exactly in the middle. This is where the segment splits. _qCurveToOne = self._qCurveToOne for i in range(len(points)  2): x, y = points[i] nx, ny = points[i+1] impliedPt = (0.5 * (x + nx), 0.5 * (y + ny)) _qCurveToOne(points[i], impliedPt) self.__currentPoint = impliedPt _qCurveToOne(points[2], points[1]) self.__currentPoint = points[1] else: self.lineTo(points[0]) class _TestPen(BasePen): def _moveTo(self, pt): print "%s %s moveto" % (pt[0], pt[1]) def _lineTo(self, pt): print "%s %s lineto" % (pt[0], pt[1]) def _curveToOne(self, bcp1, bcp2, pt): print "%s %s %s %s %s %s curveto" % (bcp1[0], bcp1[1], bcp2[0], bcp2[1], pt[0], pt[1]) def _closePath(self): print "closepath" if __name__ == "__main__": pen = _TestPen(None) pen.moveTo((0, 0)) pen.lineTo((0, 100)) pen.qCurveTo((50, 75), (60, 50), (50, 25), (0, 0)) pen.closePath() pen = _TestPen(None) pen.moveTo((0, 0)) pen.lineTo((0, 100)) pen.curveTo((50, 75), (60, 50), (50, 25), (0, 0)) pen.closePath()  NEW FILE: boundsPen.py  from fontTools.pens.basePen import BasePen from fontTools.misc.arrayTools import updateBounds, pointInRect, unionRect from fontTools.misc.bezierTools import calcCubicBounds, calcQuadraticBounds __all__ = ["BoundsPen", "ControlBoundsPen"] class ControlBoundsPen(BasePen): """Pen to calculate the "control bounds" of a shape. This is the bounding box of all control points, so may be larger than the actual bounding box if there are curves that don't have points on their extremes. When the shape has been drawn, the bounds are available as the 'bounds' attribute of the pen object. It's a 4tuple: (xMin, yMin, xMax, yMax) """ def __init__(self, glyphSet): BasePen.__init__(self, glyphSet) self.bounds = None def _moveTo(self, pt): bounds = self.bounds if bounds: self.bounds = updateBounds(bounds, pt) else: x, y = pt self.bounds = (x, y, x, y) def _lineTo(self, pt): self.bounds = updateBounds(self.bounds, pt) def _curveToOne(self, bcp1, bcp2, pt): bounds = self.bounds bounds = updateBounds(bounds, bcp1) bounds = updateBounds(bounds, bcp2) bounds = updateBounds(bounds, pt) self.bounds = bounds def _qCurveToOne(self, bcp, pt): bounds = self.bounds bounds = updateBounds(bounds, bcp) bounds = updateBounds(bounds, pt) self.bounds = bounds class BoundsPen(ControlBoundsPen): """Pen to calculate the bounds of a shape. It calculates the correct bounds even when the shape contains curves that don't have points on their extremes. This is somewhat slower to compute than the "control bounds". When the shape has been drawn, the bounds are available as the 'bounds' attribute of the pen object. It's a 4tuple: (xMin, yMin, xMax, yMax) """ def _curveToOne(self, bcp1, bcp2, pt): bounds = self.bounds bounds = updateBounds(bounds, pt) if not pointInRect(bcp1, bounds) or not pointInRect(bcp2, bounds): bounds = unionRect(bounds, calcCubicBounds(self._getCurrentPoint(), bcp1, bcp2, pt)) self.bounds = bounds def _qCurveToOne(self, bcp, pt): bounds = self.bounds bounds = updateBounds(bounds, pt) if not pointInRect(bcp, bounds): bounds = unionRect(bounds, calcQuadraticBounds(self._getCurrentPoint(), bcp, pt)) self.bounds = bounds if __name__ == "__main__": def draw(pen): pen.moveTo((0, 0)) pen.lineTo((0, 100)) pen.qCurveTo((50, 75), (60, 50), (50, 25), (0, 0)) pen.curveTo((50, 25), (60, 50), (50, 75), (0, 100)) pen.closePath() pen = ControlBoundsPen(None) draw(pen) print pen.bounds pen = BoundsPen(None) draw(pen) print pen.bounds  NEW FILE: transformPen.py  from fontTools.pens.basePen import AbstractPen __all__ = ["TransformPen"] class TransformPen(AbstractPen): """Pen that passes transforms all coordinates, and passes them to another pen. """ def __init__(self, outPen, transformation): if not hasattr(transformation, "transformPoint"): from fontTools.misc.transform import Transform transformation = Transform(*transformation) self._transformation = transformation self._transformPoint = transformation.transformPoint self._outPen = outPen self._stack = [] def moveTo(self, pt): self._outPen.moveTo(self._transformPoint(pt)) def lineTo(self, pt): self._outPen.moveTo(self._transformPoint(pt)) def curveTo(self, *points): self._outPen.curveTo(*self._transformPoints(points)) def qCurveTo(self, *points): self._outPen.qCurveTo(*self._transformPoints(points)) def _transformPoints(self, points): new = [] transformPoint = self._transformPoint for pt in points: new.append(transformPoint(pt)) return new def closePath(self): self._outPen.closePath() def addComponent(self, glyphName, transformation): transformation = self._transformation.transform(transformation) self._outPen.addComponent(glyphName, transformation) if __name__ == "__main__": from fontTools.pens.basePen import _TestPen pen = TransformPen(_TestPen(None), (2, 0, 0.5, 2, 10, 0)) pen.moveTo((0, 0)) pen.lineTo((0, 100)) pen.curveTo((50, 75), (60, 50), (50, 25), (0, 0)) pen.closePath() 
From: Just van Rossum <jvr@us...>  20030823 20:18:21

Update of /cvsroot/fonttools/fonttools/Lib/fontTools/pens In directory sc8prcvs1:/tmp/cvsserv12471/pens Log Message: Directory /cvsroot/fonttools/fonttools/Lib/fontTools/pens added to the repository 