
    h0                     r   S r SSKJrJr  SSKJrJr  / SQrS r " S S\5      r	 " S S	\\	5      r
 " S
 S\5      r " S S\\5      rSS jr\S:X  ae  \	" 5       r\R!                  S5        \R#                  S5        \R%                  SSS5        \R'                  5         SSKJr  \" \R*                  5        gg)z:Pen recording operations that can be accessed or replayed.    )AbstractPenDecomposingPen)AbstractPointPenDecomposingPointPen)replayRecordingRecordingPenDecomposingRecordingPenDecomposingRecordingPointPenRecordingPointPenlerpRecordingsc                 6    U  H  u  p#[        X5      " U6   M     g)a  Replay a recording, as produced by RecordingPen or DecomposingRecordingPen,
to a pen.

Note that recording does not have to be produced by those pens.
It can be any iterable of tuples of method name and tuple-of-arguments.
Likewise, pen can be any objects receiving those method calls.
N)getattr)	recordingpenoperatoroperandss       M/var/www/html/env/lib/python3.13/site-packages/fontTools/pens/recordingPen.pyr   r      s     () (    c                   X    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS r\rSrg)r      a  Pen recording operations that can be accessed or replayed.

The recording can be accessed as pen.value; or replayed using
pen.replay(otherPen).

:Example:
    .. code-block::

        from fontTools.ttLib import TTFont
        from fontTools.pens.recordingPen import RecordingPen

        glyph_name = 'dollar'
        font_path = 'MyFont.otf'

        font = TTFont(font_path)
        glyphset = font.getGlyphSet()
        glyph = glyphset[glyph_name]

        pen = RecordingPen()
        glyph.draw(pen)
        print(pen.value)
c                     / U l         g Nvalueselfs    r   __init__RecordingPen.__init__5   	    
r   c                 @    U R                   R                  SU445        g )NmoveTor   append)r   p0s     r   r!   RecordingPen.moveTo8       

8bU+,r   c                 @    U R                   R                  SU445        g )NlineTor"   )r   p1s     r   r(   RecordingPen.lineTo;   r&   r   c                 >    U R                   R                  SU45        g )NqCurveTor"   r   pointss     r   r,   RecordingPen.qCurveTo>   s    

:v./r   c                 >    U R                   R                  SU45        g )NcurveTor"   r-   s     r   r1   RecordingPen.curveToA   s    

9f-.r   c                 :    U R                   R                  S5        g )N)	closePath r"   r   s    r   r4   RecordingPen.closePathD   s    

+,r   c                 :    U R                   R                  S5        g )N)endPathr5   r"   r   s    r   r8   RecordingPen.endPathG   s    

/*r   c                 @    U R                   R                  SX445        g )NaddComponentr"   )r   	glyphNametransformations      r   r;   RecordingPen.addComponentJ   s    

>I+FGHr   c                 B    U R                   R                  SXU445        g )NaddVarComponentr"   )r   r<   r=   locations       r   r@   RecordingPen.addVarComponentM   s    

,y(.STUr   c                 0    [        U R                  U5        g r   )r   r   )r   r   s     r   replayRecordingPen.replayP   s    

C(r   r   N)__name__
__module____qualname____firstlineno____doc__r   r!   r(   r,   r1   r4   r8   r;   r@   rD   draw__static_attributes__r5   r   r   r   r      sB    .--0/-+IV) Dr   r   c                       \ rS rSrSrSrSrg)r	   V   a  Same as RecordingPen, except that it doesn't keep components
as references, but draws them decomposed as regular contours.

The constructor takes a required 'glyphSet' positional argument,
a dictionary of glyph objects (i.e. with a 'draw' method) keyed
by thir name; other arguments are forwarded to the DecomposingPen's
constructor::

    >>> class SimpleGlyph(object):
    ...     def draw(self, pen):
    ...         pen.moveTo((0, 0))
    ...         pen.curveTo((1, 1), (2, 2), (3, 3))
    ...         pen.closePath()
    >>> class CompositeGlyph(object):
    ...     def draw(self, pen):
    ...         pen.addComponent('a', (1, 0, 0, 1, -1, 1))
    >>> class MissingComponent(object):
    ...     def draw(self, pen):
    ...         pen.addComponent('foobar', (1, 0, 0, 1, 0, 0))
    >>> class FlippedComponent(object):
    ...     def draw(self, pen):
    ...         pen.addComponent('a', (-1, 0, 0, 1, 0, 0))
    >>> glyphSet = {
    ...    'a': SimpleGlyph(),
    ...    'b': CompositeGlyph(),
    ...    'c': MissingComponent(),
    ...    'd': FlippedComponent(),
    ... }
    >>> for name, glyph in sorted(glyphSet.items()):
    ...     pen = DecomposingRecordingPen(glyphSet)
    ...     try:
    ...         glyph.draw(pen)
    ...     except pen.MissingComponentError:
    ...         pass
    ...     print("{}: {}".format(name, pen.value))
    a: [('moveTo', ((0, 0),)), ('curveTo', ((1, 1), (2, 2), (3, 3))), ('closePath', ())]
    b: [('moveTo', ((-1, 1),)), ('curveTo', ((0, 2), (1, 3), (2, 4))), ('closePath', ())]
    c: []
    d: [('moveTo', ((0, 0),)), ('curveTo', ((-1, 1), (-2, 2), (-3, 3))), ('closePath', ())]

    >>> for name, glyph in sorted(glyphSet.items()):
    ...     pen = DecomposingRecordingPen(
    ...         glyphSet, skipMissingComponents=True, reverseFlipped=True,
    ...     )
    ...     glyph.draw(pen)
    ...     print("{}: {}".format(name, pen.value))
    a: [('moveTo', ((0, 0),)), ('curveTo', ((1, 1), (2, 2), (3, 3))), ('closePath', ())]
    b: [('moveTo', ((-1, 1),)), ('curveTo', ((0, 2), (1, 3), (2, 4))), ('closePath', ())]
    c: []
    d: [('moveTo', ((0, 0),)), ('lineTo', ((-3, 3),)), ('curveTo', ((-2, 2), (-1, 1), (0, 0))), ('closePath', ())]
Fr5   NrF   rG   rH   rI   rJ   skipMissingComponentsrL   r5   r   r   r	   r	   V   s    2j "r   r	   c                   Z    \ rS rSrSrS rSS jrS r SS jrSS jr	 SS	 jr
S
 r\rSrg)r      aK  PointPen recording operations that can be accessed or replayed.

The recording can be accessed as pen.value; or replayed using
pointPen.replay(otherPointPen).

:Example:
    .. code-block::

        from defcon import Font
        from fontTools.pens.recordingPen import RecordingPointPen

        glyph_name = 'a'
        font_path = 'MyFont.ufo'

        font = Font(font_path)
        glyph = font[glyph_name]

        pen = RecordingPointPen()
        glyph.drawPoints(pen)
        print(pen.value)

        new_glyph = font.newGlyph('b')
        pen.replay(new_glyph.getPointPen())
c                     / U l         g r   r   r   s    r   r   RecordingPointPen.__init__   r   r   Nc                 N    Ub  XS'   U R                   R                  SSU45        g )N
identifier	beginPathr5   r"   )r   rV   kwargss      r   rW   RecordingPointPen.beginPath   s)    !#-< 

;F34r   c                 @    U R                   R                  SS0 45        g )Nr8   r5   r"   r   s    r   r8   RecordingPointPen.endPath   s    

9b"-.r   c                 R    Ub  XVS'   U R                   R                  SXX44U45        g )NrV   addPointr"   )r   ptsegmentTypesmoothnamerV   rX   s          r   r]   RecordingPointPen.addPoint   s0     !#-< 

:'FOPr   c                 P    Ub  X4S'   U R                   R                  SX4U45        g )NrV   r;   r"   )r   baseGlyphNamer=   rV   rX   s        r   r;   RecordingPointPen.addComponent   s,    !#-< 

>M+JFSTr   c                 R    Ub  XES'   U R                   R                  SXU4U45        g )NrV   r@   r"   )r   rd   r=   rA   rV   rX   s         r   r@   !RecordingPointPen.addVarComponent   s3     !#-< 

 I6R	
r   c                 R    U R                    H  u  p#n[        X5      " U0 UD6  M     g r   )r   r   )r   pointPenr   argsrX   s        r   rD   RecordingPointPen.replay   s'    &*jj"HFH'88 '1r   r   r   )NFNN)rF   rG   rH   rI   rJ   r   rW   r8   r]   r;   r@   rD   
drawPointsrL   r5   r   r   r   r      sA    25
/ IMQU CG
9 Jr   r   c                       \ rS rSrSrSrSrg)r
      ab  Same as RecordingPointPen, except that it doesn't keep components
as references, but draws them decomposed as regular contours.

The constructor takes a required 'glyphSet' positional argument,
a dictionary of pointPen-drawable glyph objects (i.e. with a 'drawPoints' method)
keyed by thir name; other arguments are forwarded to the DecomposingPointPen's
constructor::

    >>> from pprint import pprint
    >>> class SimpleGlyph(object):
    ...     def drawPoints(self, pen):
    ...         pen.beginPath()
    ...         pen.addPoint((0, 0), "line")
    ...         pen.addPoint((1, 1))
    ...         pen.addPoint((2, 2))
    ...         pen.addPoint((3, 3), "curve")
    ...         pen.endPath()
    >>> class CompositeGlyph(object):
    ...     def drawPoints(self, pen):
    ...         pen.addComponent('a', (1, 0, 0, 1, -1, 1))
    >>> class MissingComponent(object):
    ...     def drawPoints(self, pen):
    ...         pen.addComponent('foobar', (1, 0, 0, 1, 0, 0))
    >>> class FlippedComponent(object):
    ...     def drawPoints(self, pen):
    ...         pen.addComponent('a', (-1, 0, 0, 1, 0, 0))
    >>> glyphSet = {
    ...    'a': SimpleGlyph(),
    ...    'b': CompositeGlyph(),
    ...    'c': MissingComponent(),
    ...    'd': FlippedComponent(),
    ... }
    >>> for name, glyph in sorted(glyphSet.items()):
    ...     pen = DecomposingRecordingPointPen(glyphSet)
    ...     try:
    ...         glyph.drawPoints(pen)
    ...     except pen.MissingComponentError:
    ...         pass
    ...     pprint({name: pen.value})
    {'a': [('beginPath', (), {}),
           ('addPoint', ((0, 0), 'line', False, None), {}),
           ('addPoint', ((1, 1), None, False, None), {}),
           ('addPoint', ((2, 2), None, False, None), {}),
           ('addPoint', ((3, 3), 'curve', False, None), {}),
           ('endPath', (), {})]}
    {'b': [('beginPath', (), {}),
           ('addPoint', ((-1, 1), 'line', False, None), {}),
           ('addPoint', ((0, 2), None, False, None), {}),
           ('addPoint', ((1, 3), None, False, None), {}),
           ('addPoint', ((2, 4), 'curve', False, None), {}),
           ('endPath', (), {})]}
    {'c': []}
    {'d': [('beginPath', (), {}),
           ('addPoint', ((0, 0), 'line', False, None), {}),
           ('addPoint', ((-1, 1), None, False, None), {}),
           ('addPoint', ((-2, 2), None, False, None), {}),
           ('addPoint', ((-3, 3), 'curve', False, None), {}),
           ('endPath', (), {})]}

    >>> for name, glyph in sorted(glyphSet.items()):
    ...     pen = DecomposingRecordingPointPen(
    ...         glyphSet, skipMissingComponents=True, reverseFlipped=True,
    ...     )
    ...     glyph.drawPoints(pen)
    ...     pprint({name: pen.value})
    {'a': [('beginPath', (), {}),
           ('addPoint', ((0, 0), 'line', False, None), {}),
           ('addPoint', ((1, 1), None, False, None), {}),
           ('addPoint', ((2, 2), None, False, None), {}),
           ('addPoint', ((3, 3), 'curve', False, None), {}),
           ('endPath', (), {})]}
    {'b': [('beginPath', (), {}),
           ('addPoint', ((-1, 1), 'line', False, None), {}),
           ('addPoint', ((0, 2), None, False, None), {}),
           ('addPoint', ((1, 3), None, False, None), {}),
           ('addPoint', ((2, 4), 'curve', False, None), {}),
           ('endPath', (), {})]}
    {'c': []}
    {'d': [('beginPath', (), {}),
           ('addPoint', ((0, 0), 'curve', False, None), {}),
           ('addPoint', ((-3, 3), 'line', False, None), {}),
           ('addPoint', ((-2, 2), None, False, None), {}),
           ('addPoint', ((-1, 1), None, False, None), {}),
           ('endPath', (), {})]}
Fr5   NrO   r5   r   r   r
   r
      s    Tn "r   r
   c              #     #    [        U 5      [        U5      :w  a"  [        S[        U 5      [        U5      4-  5      e[        X5       Hr  u  u  p4u  pVX5:w  a  [        SU< SU< 35      eUS:X  a  [        S5      e[        XF5       VVV	V
s/ s H  u  u  pxu  pXyU-
  U-  -   XU-
  U-  -   4PM      nn	nnn
X;4v   Mt     gs  sn
n	nnf 7f)a  Linearly interpolate between two recordings. The recordings
must be decomposed, i.e. they must not contain any components.

Factor is typically between 0 and 1. 0 means the first recording,
1 means the second recording, and 0.5 means the average of the
two recordings. Other values are possible, and can be useful to
extrapolate. Defaults to 0.5.

Returns a generator with the new recording.
zMismatched lengths: %d and %dzMismatched operations: z, r;   zCannot interpolate componentsN)len
ValueErrorzip)
recording1
recording2factorop1args1op2args2x1y1x2y2mid_argss               r   r   r   +  s      :#j/)+s:J.PP
 	
 '**&A"ls:SIJJ. <== +.e*;*;&HRhr Bw&(("R6/A*AB*;   o 'Bs   B	C%B?0C__main__)r   r   )r   d   )2   K   )<   r   )r      )pprintN)g      ?)rJ   fontTools.pens.basePenr   r   fontTools.pens.pointPenr   r   __all__r   r   r	   r   r
   r   rF   r   r!   r(   r1   r4   r   r   r5   r   r   <module>r      s    @ > I	*6; 6r6"nl 6"r>( >BX"#68I X"v8 z
.CJJvJJxKK(H-MMO
399 r   