
    Mcg0                     n   d Z ddlmZmZ ddlmZmZ g dZd Z G d de      Z	 G d d	ee	      Z
 G d
 de      Z G d dee      ZddZedk(  re e	       Zej!                  d       ej#                  d       ej%                  ddd       ej'                          ddlmZ  eej*                         yy)z:Pen recording operations that can be accessed or replayed.    )AbstractPenDecomposingPen)AbstractPointPenDecomposingPointPen)replayRecordingRecordingPenDecomposingRecordingPenDecomposingRecordingPointPenRecordingPointPenlerpRecordingsc                 6    | D ]  \  }} t        ||      |   y)a2  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       V/var/www/html/bid-api/venv/lib/python3.12/site-packages/fontTools/pens/recordingPen.pyr   r      s$     ((X) (    c                   P    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZeZy)r   aP  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                     g | _         y Nvalueselfs    r   __init__zRecordingPen.__init__5   	    
r   c                 @    | j                   j                  d|ff       y )NmoveTor   append)r   p0s     r   r   zRecordingPen.moveTo8       

8bU+,r   c                 @    | j                   j                  d|ff       y )NlineTor    )r   p1s     r   r%   zRecordingPen.lineTo;   r#   r   c                 >    | j                   j                  d|f       y )NqCurveTor    r   pointss     r   r(   zRecordingPen.qCurveTo>   s    

:v./r   c                 >    | j                   j                  d|f       y )NcurveTor    r)   s     r   r,   zRecordingPen.curveToA   s    

9f-.r   c                 :    | j                   j                  d       y )N)	closePath r    r   s    r   r.   zRecordingPen.closePathD   s    

+,r   c                 :    | j                   j                  d       y )N)endPathr/   r    r   s    r   r1   zRecordingPen.endPathG   s    

/*r   c                 B    | j                   j                  d||ff       y )NaddComponentr    )r   	glyphNametransformations      r   r3   zRecordingPen.addComponentJ   s    

>I~+FGHr   c                 D    | j                   j                  d|||ff       y )NaddVarComponentr    )r   r4   r5   locations       r   r7   zRecordingPen.addVarComponentM   s!    

,y.(.STUr   c                 0    t        | j                  |       y r   )r   r   )r   r   s     r   replayzRecordingPen.replayP   s    

C(r   N)__name__
__module____qualname____doc__r   r   r%   r(   r,   r.   r1   r3   r7   r:   drawr/   r   r   r   r      sB    .--0/-+IV) Dr   r   c                       e Zd ZdZdZy)r	   aa	  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', ())]
    FNr;   r<   r=   r>   skipMissingComponentsr/   r   r   r	   r	   V   s    2j "r   r	   c                   J    e Zd ZdZd Zd
dZd Z	 ddZd
dZ	 d
dZ	d	 Z
e
Zy)r   a  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                     g | _         y r   r   r   s    r   r   zRecordingPointPen.__init__   r   r   Nc                 N    |||d<   | j                   j                  dd|f       y )N
identifier	beginPathr/   r    )r   rF   kwargss      r   rG   zRecordingPointPen.beginPath   s+    !#-F< 

;F34r   c                 @    | j                   j                  ddi f       y )Nr1   r/   r    r   s    r   r1   zRecordingPointPen.endPath   s    

9b"-.r   c                 V    |||d<   | j                   j                  d||||f|f       y )NrF   addPointr    )r   ptsegmentTypesmoothnamerF   rH   s          r   rK   zRecordingPointPen.addPoint   s6     !#-F< 

:K'FOPr   c                 R    |||d<   | j                   j                  d||f|f       y )NrF   r3   r    )r   baseGlyphNamer5   rF   rH   s        r   r3   zRecordingPointPen.addComponent   s0    !#-F< 

>M>+JFSTr   c                 T    |||d<   | j                   j                  d|||f|f       y )NrF   r7   r    )r   rQ   r5   r8   rF   rH   s         r   r7   z!RecordingPointPen.addVarComponent   s7     !#-F< 

 I6R	
r   c                 R    | j                   D ]  \  }}} t        ||      |i |  y r   )r   r   )r   pointPenr   argsrH   s        r   r:   zRecordingPointPen.replay   s-    &*jj"HdF'GHh'88 '1r   r   )NFNN)r;   r<   r=   r>   r   rG   r1   rK   r3   r7   r:   
drawPointsr/   r   r   r   r      sA    25
/ IMQU CG
9 Jr   r   c                       e Zd ZdZdZy)r
   a  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', (), {})]}
    FNrA   r/   r   r   r
   r
      s    Tn "r   r
   c              #     K   t        |       t        |      k7  r"t        dt        |       t        |      fz        t        | |      D ]s  \  \  }}\  }}||k7  rt        d|d|      |dk(  rt        d      t        ||      D 	
cg c]!  \  \  }}\  }	}
||	|z
  |z  z   ||
|z
  |z  z   f# }}	}}}
||f u yc c}
}	}}w w)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, r3   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
 	
 '**j&A"elsE#:SIJJ. <== +.eU*;*;&HRhr2 rBw&(("R6/A*AB*;   Ho 'Bs   B	C&B?1C__main__)r   r   )r   d   )2   K   )<   rj   )rj      )pprintN)g      ?)r>   fontTools.pens.basePenr   r   fontTools.pens.pointPenr   r   __all__r   r   r	   r   r
   r   r;   r   r   r%   r,   r.   rn   r   r/   r   r   <module>rr      s    @ > I	*6; 6r6"nl 6"r>( >BX"#68I X"v8 z
.CJJvJJxKK(H-MMO
399 r   