69 lines
2.3 KiB
Python
69 lines
2.3 KiB
Python
# 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
|