1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- # Copyright (c) 2009 Type Supply LLC
- # Author: Tal Leming
- from fontTools.misc.roundTools import otRound, roundFunc
- from fontTools.misc.psCharStrings import T2CharString
- from fontTools.pens.basePen import BasePen
- from fontTools.cffLib.specializer import specializeCommands, commandsToProgram
- class T2CharStringPen(BasePen):
- """Pen to draw Type 2 CharStrings.
- The 'roundTolerance' argument controls the rounding of point coordinates.
- It is defined as the maximum absolute difference between the original
- float and the rounded integer value.
- The default tolerance of 0.5 means that all floats are rounded to integer;
- a value of 0 disables rounding; values in between will only round floats
- which are close to their integral part within the tolerated range.
- """
- def __init__(self, width, glyphSet, roundTolerance=0.5, CFF2=False):
- super(T2CharStringPen, self).__init__(glyphSet)
- self.round = roundFunc(roundTolerance)
- self._CFF2 = CFF2
- self._width = width
- self._commands = []
- self._p0 = (0, 0)
- def _p(self, pt):
- p0 = self._p0
- pt = self._p0 = (self.round(pt[0]), self.round(pt[1]))
- return [pt[0] - p0[0], pt[1] - p0[1]]
- def _moveTo(self, pt):
- self._commands.append(("rmoveto", self._p(pt)))
- def _lineTo(self, pt):
- self._commands.append(("rlineto", self._p(pt)))
- def _curveToOne(self, pt1, pt2, pt3):
- _p = self._p
- self._commands.append(("rrcurveto", _p(pt1) + _p(pt2) + _p(pt3)))
- def _closePath(self):
- pass
- def _endPath(self):
- pass
- 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
|