Ë
    £ehÉ0  ã                   ó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       úY/var/www/skyplay_api_hub/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   ó   € Ø�
‰
×Ñ˜8 b UÐ+Õ,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   € Ø�
‰
×Ñ˜9 fÐ-Õ.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   € Ø�
‰
×Ñ˜9 b¨"Ð-Õ.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¸>Ð+JÈFÐ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�<Ñ Ø�
‰
×ÑØ °ÀÐ IÈ6ÐRõ	
r   c                 óR   — | j                   D ]  \  }}} t        ||«      |i |¤Ž Œ y r   )r   r   )r   ÚpointPenr   ÚargsrH   s        r   r:   zRecordingPointPen.replayÉ   s2   € Ø&*§j¡jò 	9Ñ"ˆH�d˜FØ'ŒG�H˜hÓ'¨Ð8°Ó8ñ	9r   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ò 
Ñ"‰ˆˆe‘l�s˜EØ�#Š:ÝÂÁSÐIÓJÐJØ�.Ò ÜÐ<Ó=Ð=ô +.¨e°UÓ*;÷ñ á&‘H�R˜™h˜r 2ð �r˜B‘w &Ñ(Ñ(¨"°°R±¸6Ñ/AÑ*AÒBðˆHó ð �HˆoÓñ
ùõù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"˜n¨lô 6"ôr>Ð(ô >ôBX"Ð#6Ð8Iô X"óvð8 ˆzÒÙ
‹.€CØ‡J�JˆvÔØ‡J�JˆxÔØ‡K�K�˜( HÔ-Ø‡M�M„OÝá
ˆ3�9‰9Õð r   