fonttools/Documentation/fontToolsDocs/fontTools.pens.basePen.html
Erik van Blokland 3646055ea2 initial import
git-svn-id: http://svn.robofab.com/trunk@1 b5fa9d6c-a76f-4ffd-b3cb-f825fc41095c
2008-01-07 17:40:34 +00:00

180 lines
14 KiB
HTML

<!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: module fontTools.pens.basePen</title>
</head><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong><a href="fontTools.html"><font color="#ffffff">fontTools</font></a>.<a href="fontTools.pens.html"><font color="#ffffff">pens</font></a>.basePen</strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/code/fontTools/Lib/fontTools/pens/basePen.py">/code/fontTools/Lib/fontTools/pens/basePen.py</a></font></td></tr></table>
<p><tt>fontTools.pens.basePen.py&nbsp;--&nbsp;Tools&nbsp;and&nbsp;base&nbsp;classes&nbsp;to&nbsp;build&nbsp;pen&nbsp;objects.<br>
&nbsp;<br>
The&nbsp;Pen&nbsp;Protocol<br>
&nbsp;<br>
A&nbsp;Pen&nbsp;is&nbsp;a&nbsp;kind&nbsp;of&nbsp;object&nbsp;that&nbsp;standardizes&nbsp;the&nbsp;way&nbsp;how&nbsp;to&nbsp;"draw"&nbsp;outlines:<br>
it&nbsp;is&nbsp;a&nbsp;middle&nbsp;man&nbsp;between&nbsp;an&nbsp;outline&nbsp;and&nbsp;a&nbsp;drawing.&nbsp;In&nbsp;other&nbsp;words:<br>
it&nbsp;is&nbsp;an&nbsp;abstraction&nbsp;for&nbsp;drawing&nbsp;outlines,&nbsp;making&nbsp;sure&nbsp;that&nbsp;outline&nbsp;objects<br>
don't&nbsp;need&nbsp;to&nbsp;know&nbsp;the&nbsp;details&nbsp;about&nbsp;how&nbsp;and&nbsp;where&nbsp;they're&nbsp;being&nbsp;drawn,&nbsp;and<br>
that&nbsp;drawings&nbsp;don't&nbsp;need&nbsp;to&nbsp;know&nbsp;the&nbsp;details&nbsp;of&nbsp;how&nbsp;outlines&nbsp;are&nbsp;stored.<br>
&nbsp;<br>
The&nbsp;most&nbsp;basic&nbsp;pattern&nbsp;is&nbsp;this:<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;outline.draw(pen)&nbsp;&nbsp;#&nbsp;'outline'&nbsp;draws&nbsp;itself&nbsp;onto&nbsp;'pen'<br>
&nbsp;<br>
Pens&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;render&nbsp;outlines&nbsp;to&nbsp;the&nbsp;screen,&nbsp;but&nbsp;also&nbsp;to&nbsp;construct<br>
new&nbsp;outlines.&nbsp;Eg.&nbsp;an&nbsp;outline&nbsp;object&nbsp;can&nbsp;be&nbsp;both&nbsp;a&nbsp;drawable&nbsp;object&nbsp;(it&nbsp;has&nbsp;a<br>
draw()&nbsp;method)&nbsp;as&nbsp;well&nbsp;as&nbsp;a&nbsp;pen&nbsp;itself:&nbsp;you&nbsp;*build*&nbsp;an&nbsp;outline&nbsp;using&nbsp;pen<br>
methods.<br>
&nbsp;<br>
The&nbsp;<a href="#AbstractPen">AbstractPen</a>&nbsp;class&nbsp;defines&nbsp;the&nbsp;Pen&nbsp;protocol.&nbsp;It&nbsp;implements&nbsp;almost<br>
nothing&nbsp;(only&nbsp;no-op&nbsp;closePath()&nbsp;and&nbsp;endPath()&nbsp;methods),&nbsp;but&nbsp;is&nbsp;useful<br>
for&nbsp;documentation&nbsp;purposes.&nbsp;Subclassing&nbsp;it&nbsp;basically&nbsp;tells&nbsp;the&nbsp;reader:<br>
"this&nbsp;class&nbsp;implements&nbsp;the&nbsp;Pen&nbsp;protocol.".&nbsp;An&nbsp;examples&nbsp;of&nbsp;an&nbsp;<a href="#AbstractPen">AbstractPen</a><br>
subclass&nbsp;is&nbsp;fontTools.pens.transformPen.TransformPen.<br>
&nbsp;<br>
The&nbsp;<a href="#BasePen">BasePen</a>&nbsp;class&nbsp;is&nbsp;a&nbsp;base&nbsp;implementation&nbsp;useful&nbsp;for&nbsp;pens&nbsp;that&nbsp;actually<br>
draw&nbsp;(for&nbsp;example&nbsp;a&nbsp;pen&nbsp;renders&nbsp;outlines&nbsp;using&nbsp;a&nbsp;native&nbsp;graphics&nbsp;engine).<br>
<a href="#BasePen">BasePen</a>&nbsp;contains&nbsp;a&nbsp;lot&nbsp;of&nbsp;base&nbsp;functionality,&nbsp;making&nbsp;it&nbsp;very&nbsp;easy&nbsp;to&nbsp;build<br>
a&nbsp;pen&nbsp;that&nbsp;fully&nbsp;conforms&nbsp;to&nbsp;the&nbsp;pen&nbsp;protocol.&nbsp;Note&nbsp;that&nbsp;if&nbsp;you&nbsp;subclass<br>
<a href="#BasePen">BasePen</a>,&nbsp;you&nbsp;_don't_&nbsp;override&nbsp;moveTo(),&nbsp;lineTo(),&nbsp;etc.,&nbsp;but&nbsp;_moveTo(),<br>
_lineTo(),&nbsp;etc.&nbsp;See&nbsp;the&nbsp;<a href="#BasePen">BasePen</a>&nbsp;doc&nbsp;string&nbsp;for&nbsp;details.&nbsp;Examples&nbsp;of<br>
<a href="#BasePen">BasePen</a>&nbsp;subclasses&nbsp;are&nbsp;fontTools.pens.boundsPen.BoundsPen&nbsp;and<br>
fontTools.pens.cocoaPen.CocoaPen.<br>
&nbsp;<br>
Coordinates&nbsp;are&nbsp;usually&nbsp;expressed&nbsp;as&nbsp;(x,&nbsp;y)&nbsp;tuples,&nbsp;but&nbsp;generally&nbsp;any<br>
sequence&nbsp;of&nbsp;length&nbsp;2&nbsp;will&nbsp;do.</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="fontTools.pens.basePen.html#AbstractPen">AbstractPen</a>
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="fontTools.pens.basePen.html#BasePen">BasePen</a>
</font></dt></dl>
</dd>
</dl>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="AbstractPen">class <strong>AbstractPen</strong></a></font></td></tr>
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="AbstractPen-addComponent"><strong>addComponent</strong></a>(self, glyphName, transformation)</dt><dd><tt>Add&nbsp;a&nbsp;sub&nbsp;glyph.&nbsp;The&nbsp;'transformation'&nbsp;argument&nbsp;must&nbsp;be&nbsp;a&nbsp;6-tuple<br>
containing&nbsp;an&nbsp;affine&nbsp;transformation,&nbsp;or&nbsp;a&nbsp;Transform&nbsp;object&nbsp;from&nbsp;the<br>
fontTools.misc.transform&nbsp;module.&nbsp;More&nbsp;precisely:&nbsp;it&nbsp;should&nbsp;be&nbsp;a<br>
sequence&nbsp;containing&nbsp;6&nbsp;numbers.</tt></dd></dl>
<dl><dt><a name="AbstractPen-closePath"><strong>closePath</strong></a>(self)</dt><dd><tt>Close&nbsp;the&nbsp;current&nbsp;sub&nbsp;path.&nbsp;You&nbsp;must&nbsp;call&nbsp;either&nbsp;pen.<a href="#AbstractPen-closePath">closePath</a>()<br>
or&nbsp;pen.<a href="#AbstractPen-endPath">endPath</a>()&nbsp;after&nbsp;each&nbsp;sub&nbsp;path.</tt></dd></dl>
<dl><dt><a name="AbstractPen-curveTo"><strong>curveTo</strong></a>(self, *points)</dt><dd><tt>Draw&nbsp;a&nbsp;cubic&nbsp;bezier&nbsp;with&nbsp;an&nbsp;arbitrary&nbsp;number&nbsp;of&nbsp;control&nbsp;points.<br>
&nbsp;<br>
The&nbsp;last&nbsp;point&nbsp;specified&nbsp;is&nbsp;on-curve,&nbsp;all&nbsp;others&nbsp;are&nbsp;off-curve<br>
(control)&nbsp;points.&nbsp;If&nbsp;the&nbsp;number&nbsp;of&nbsp;control&nbsp;points&nbsp;is&nbsp;&gt;&nbsp;2,&nbsp;the<br>
segment&nbsp;is&nbsp;split&nbsp;into&nbsp;multiple&nbsp;bezier&nbsp;segments.&nbsp;This&nbsp;works<br>
like&nbsp;this:<br>
&nbsp;<br>
Let&nbsp;n&nbsp;be&nbsp;the&nbsp;number&nbsp;of&nbsp;control&nbsp;points&nbsp;(which&nbsp;is&nbsp;the&nbsp;number&nbsp;of<br>
arguments&nbsp;to&nbsp;this&nbsp;call&nbsp;minus&nbsp;1).&nbsp;If&nbsp;n==2,&nbsp;a&nbsp;plain&nbsp;vanilla&nbsp;cubic<br>
bezier&nbsp;is&nbsp;drawn.&nbsp;If&nbsp;n==1,&nbsp;we&nbsp;fall&nbsp;back&nbsp;to&nbsp;a&nbsp;quadratic&nbsp;segment&nbsp;and<br>
if&nbsp;n==0&nbsp;we&nbsp;draw&nbsp;a&nbsp;straight&nbsp;line.&nbsp;It&nbsp;gets&nbsp;interesting&nbsp;when&nbsp;n&gt;2:<br>
n-1&nbsp;PostScript-style&nbsp;cubic&nbsp;segments&nbsp;will&nbsp;be&nbsp;drawn&nbsp;as&nbsp;if&nbsp;it&nbsp;were<br>
one&nbsp;curve.&nbsp;See&nbsp;<a href="#-decomposeSuperBezierSegment">decomposeSuperBezierSegment</a>().<br>
&nbsp;<br>
The&nbsp;conversion&nbsp;algorithm&nbsp;used&nbsp;for&nbsp;n&gt;2&nbsp;is&nbsp;inspired&nbsp;by&nbsp;NURB<br>
splines,&nbsp;and&nbsp;is&nbsp;conceptually&nbsp;equivalent&nbsp;to&nbsp;the&nbsp;TrueType&nbsp;"implied<br>
points"&nbsp;principle.&nbsp;See&nbsp;also&nbsp;<a href="#-decomposeQuadraticSegment">decomposeQuadraticSegment</a>().</tt></dd></dl>
<dl><dt><a name="AbstractPen-endPath"><strong>endPath</strong></a>(self)</dt><dd><tt>End&nbsp;the&nbsp;current&nbsp;sub&nbsp;path,&nbsp;but&nbsp;don't&nbsp;close&nbsp;it.&nbsp;You&nbsp;must&nbsp;call<br>
either&nbsp;pen.<a href="#AbstractPen-closePath">closePath</a>()&nbsp;or&nbsp;pen.<a href="#AbstractPen-endPath">endPath</a>()&nbsp;after&nbsp;each&nbsp;sub&nbsp;path.</tt></dd></dl>
<dl><dt><a name="AbstractPen-lineTo"><strong>lineTo</strong></a>(self, pt)</dt><dd><tt>Draw&nbsp;a&nbsp;straight&nbsp;line&nbsp;from&nbsp;the&nbsp;current&nbsp;point&nbsp;to&nbsp;'pt'.</tt></dd></dl>
<dl><dt><a name="AbstractPen-moveTo"><strong>moveTo</strong></a>(self, pt)</dt><dd><tt>Begin&nbsp;a&nbsp;new&nbsp;sub&nbsp;path,&nbsp;set&nbsp;the&nbsp;current&nbsp;point&nbsp;to&nbsp;'pt'.&nbsp;You&nbsp;must<br>
end&nbsp;each&nbsp;sub&nbsp;path&nbsp;with&nbsp;a&nbsp;call&nbsp;to&nbsp;pen.<a href="#AbstractPen-closePath">closePath</a>()&nbsp;or&nbsp;pen.<a href="#AbstractPen-endPath">endPath</a>().</tt></dd></dl>
<dl><dt><a name="AbstractPen-qCurveTo"><strong>qCurveTo</strong></a>(self, *points)</dt><dd><tt>Draw&nbsp;a&nbsp;whole&nbsp;string&nbsp;of&nbsp;quadratic&nbsp;curve&nbsp;segments.<br>
&nbsp;<br>
The&nbsp;last&nbsp;point&nbsp;specified&nbsp;is&nbsp;on-curve,&nbsp;all&nbsp;others&nbsp;are&nbsp;off-curve<br>
points.<br>
&nbsp;<br>
This&nbsp;method&nbsp;implements&nbsp;TrueType-style&nbsp;curves,&nbsp;breaking&nbsp;up&nbsp;curves<br>
using&nbsp;'implied&nbsp;points':&nbsp;between&nbsp;each&nbsp;two&nbsp;consequtive&nbsp;off-curve&nbsp;points,<br>
there&nbsp;is&nbsp;one&nbsp;implied&nbsp;point&nbsp;exactly&nbsp;in&nbsp;the&nbsp;middle&nbsp;between&nbsp;them.&nbsp;See<br>
also&nbsp;<a href="#-decomposeQuadraticSegment">decomposeQuadraticSegment</a>().<br>
&nbsp;<br>
The&nbsp;last&nbsp;argument&nbsp;(normally&nbsp;the&nbsp;on-curve&nbsp;point)&nbsp;may&nbsp;be&nbsp;None.<br>
This&nbsp;is&nbsp;to&nbsp;support&nbsp;contours&nbsp;that&nbsp;have&nbsp;NO&nbsp;on-curve&nbsp;points&nbsp;(a&nbsp;rarely<br>
seen&nbsp;feature&nbsp;of&nbsp;TrueType&nbsp;outlines).</tt></dd></dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="BasePen">class <strong>BasePen</strong></a>(<a href="fontTools.pens.basePen.html#AbstractPen">AbstractPen</a>)</font></td></tr>
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>Base&nbsp;class&nbsp;for&nbsp;drawing&nbsp;pens.&nbsp;You&nbsp;must&nbsp;override&nbsp;_moveTo,&nbsp;_lineTo&nbsp;and<br>
_curveToOne.&nbsp;You&nbsp;may&nbsp;additionally&nbsp;override&nbsp;_closePath,&nbsp;_endPath,<br>
addComponent&nbsp;and/or&nbsp;_qCurveToOne.&nbsp;You&nbsp;should&nbsp;not&nbsp;override&nbsp;any&nbsp;other<br>
methods.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="BasePen-__init__"><strong>__init__</strong></a>(self, glyphSet)</dt></dl>
<dl><dt><a name="BasePen-addComponent"><strong>addComponent</strong></a>(self, glyphName, transformation)</dt><dd><tt>This&nbsp;default&nbsp;implementation&nbsp;simply&nbsp;transforms&nbsp;the&nbsp;points<br>
of&nbsp;the&nbsp;base&nbsp;glyph&nbsp;and&nbsp;draws&nbsp;it&nbsp;onto&nbsp;self.</tt></dd></dl>
<dl><dt><a name="BasePen-closePath"><strong>closePath</strong></a>(self)</dt></dl>
<dl><dt><a name="BasePen-curveTo"><strong>curveTo</strong></a>(self, *points)</dt></dl>
<dl><dt><a name="BasePen-endPath"><strong>endPath</strong></a>(self)</dt></dl>
<dl><dt><a name="BasePen-lineTo"><strong>lineTo</strong></a>(self, pt)</dt></dl>
<dl><dt><a name="BasePen-moveTo"><strong>moveTo</strong></a>(self, pt)</dt></dl>
<dl><dt><a name="BasePen-qCurveTo"><strong>qCurveTo</strong></a>(self, *points)</dt></dl>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#eeaa77">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
<tr><td bgcolor="#eeaa77"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt><a name="-decomposeQuadraticSegment"><strong>decomposeQuadraticSegment</strong></a>(points)</dt><dd><tt>Split&nbsp;the&nbsp;quadratic&nbsp;curve&nbsp;segment&nbsp;described&nbsp;by&nbsp;'points'&nbsp;into&nbsp;a&nbsp;list<br>
of&nbsp;"atomic"&nbsp;quadratic&nbsp;segments.&nbsp;The&nbsp;'points'&nbsp;argument&nbsp;must&nbsp;be&nbsp;a&nbsp;sequence<br>
with&nbsp;length&nbsp;2&nbsp;or&nbsp;greater,&nbsp;containing&nbsp;(x,&nbsp;y)&nbsp;coordinates.&nbsp;The&nbsp;last&nbsp;point<br>
is&nbsp;the&nbsp;destination&nbsp;on-curve&nbsp;point,&nbsp;the&nbsp;rest&nbsp;of&nbsp;the&nbsp;points&nbsp;are&nbsp;off-curve<br>
points.&nbsp;The&nbsp;start&nbsp;point&nbsp;should&nbsp;not&nbsp;be&nbsp;supplied.<br>
&nbsp;<br>
This&nbsp;function&nbsp;returns&nbsp;a&nbsp;list&nbsp;of&nbsp;(pt1,&nbsp;pt2)&nbsp;tuples,&nbsp;which&nbsp;each&nbsp;specify&nbsp;a<br>
plain&nbsp;quadratic&nbsp;bezier&nbsp;segment.</tt></dd></dl>
<dl><dt><a name="-decomposeSuperBezierSegment"><strong>decomposeSuperBezierSegment</strong></a>(points)</dt><dd><tt>Split&nbsp;the&nbsp;SuperBezier&nbsp;described&nbsp;by&nbsp;'points'&nbsp;into&nbsp;a&nbsp;list&nbsp;of&nbsp;regular<br>
bezier&nbsp;segments.&nbsp;The&nbsp;'points'&nbsp;argument&nbsp;must&nbsp;be&nbsp;a&nbsp;sequence&nbsp;with&nbsp;length<br>
3&nbsp;or&nbsp;greater,&nbsp;containing&nbsp;(x,&nbsp;y)&nbsp;coordinates.&nbsp;The&nbsp;last&nbsp;point&nbsp;is&nbsp;the<br>
destination&nbsp;on-curve&nbsp;point,&nbsp;the&nbsp;rest&nbsp;of&nbsp;the&nbsp;points&nbsp;are&nbsp;off-curve&nbsp;points.<br>
The&nbsp;start&nbsp;point&nbsp;should&nbsp;not&nbsp;be&nbsp;supplied.<br>
&nbsp;<br>
This&nbsp;function&nbsp;returns&nbsp;a&nbsp;list&nbsp;of&nbsp;(pt1,&nbsp;pt2,&nbsp;pt3)&nbsp;tuples,&nbsp;which&nbsp;each<br>
specify&nbsp;a&nbsp;regular&nbsp;curveto-style&nbsp;bezier&nbsp;segment.</tt></dd></dl>
</td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><strong>__all__</strong> = ['AbstractPen', 'BasePen', 'decomposeSuperBezierSegment', 'decomposeQuadraticSegment']</td></tr></table>
</body></html>