Ë
    £eh^.  ã                   ó"  — d dl m Z  d dlmZmZmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZmZ d dlmZmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlZddgZ  G d„ d«      Z! G d„ de!e«      Z" G d„ de!ee«      Z#y)é    )Úarray)ÚAnyÚCallableÚDictÚOptionalÚTuple)ÚMAX_F2DOT14ÚfloatToFixedToFloat)ÚLogMixin)ÚAbstractPointPen©ÚotRound)Ú
LoggingPenÚPenError)ÚTransformPenÚTransformPointPen)Ú	ttProgram)ÚflagOnCurveÚ	flagCubic)ÚGlyph)ÚGlyphComponent)ÚGlyphCoordinates)ÚdropImpliedOnCurvePointsNÚ
TTGlyphPenÚTTGlyphPointPenc                   óÒ   — e Zd Z	 ddeeeef      deddfd„Zdede	e
e
e
e
e
e
f   fd„Zd	„ Zdd
„Z	 ddede	e
e
e
e
e
e
f   dee   deddf
d„Zd„ Z	 	 dedœdededee
gef   defd„Zy)Ú_TTGlyphBasePenÚglyphSetÚhandleOverflowingTransformsÚreturnNc                 ó@   — || _         || _        | j                  «        y)a±  
        Construct a new pen.

        Args:
            glyphSet (Dict[str, Any]): A glyphset object, used to resolve components.
            handleOverflowingTransforms (bool): See below.

        If ``handleOverflowingTransforms`` is True, the components' transform values
        are checked that they don't overflow the limits of a F2Dot14 number:
        -2.0 <= v < +2.0. If any transform value exceeds these, the composite
        glyph is decomposed.

        An exception to this rule is done for values that are very close to +2.0
        (both for consistency with the -2.0 case, and for the relative frequency
        these occur in real fonts). When almost +2.0 values occur (and all other
        values are within the range -2.0 <= x <= +2.0), they are clamped to the
        maximum positive value that can still be encoded as an F2Dot14: i.e.
        1.99993896484375.

        If False, no check is done and all components are translated unmodified
        into the glyf table, followed by an inevitable ``struct.error`` once an
        attempt is made to compile them.

        If both contours and components are present in a glyph, the components
        are decomposed.
        N)r   r   Úinit)Úselfr   r   s      úW/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/fontTools/pens/ttGlyphPen.pyÚ__init__z_TTGlyphBasePen.__init__   s   € ð> !ˆŒØ+FˆÔ(Ø�	‰	�ó    Ú	glyphNameÚtransformationc                 óz   — | j                  | |«      } t        | j                  |   | j                  «      |«       y ©N)ÚtransformPenÚgetattrr   Ú
drawMethod)r#   r'   r(   Útpens       r$   Ú
_decomposez_TTGlyphBasePen._decompose9   s4   € ð
 × Ñ   ~Ó6ˆØ:Œ�—‘˜iÑ(¨$¯/©/Ó:¸4Õ@r&   c                 ó   — t         ‚)z6
        Check if the current path is closed.
        )ÚNotImplementedError©r#   s    r$   Ú	_isClosedz_TTGlyphBasePen._isClosedA   s
   € ô "Ð!r&   c                 ó<   — g | _         g | _        g | _        g | _        y r*   )ÚpointsÚendPtsÚtypesÚ
componentsr2   s    r$   r"   z_TTGlyphBasePen.initG   s   € ØˆŒØˆŒØˆŒ
Øˆ�r&   ÚbaseGlyphNameÚ
identifierÚkwargsc                 ó>   — | j                   j                  ||f«       y)z"
        Add a sub glyph.
        N)r8   Úappend)r#   r9   r(   r:   r;   s        r$   ÚaddComponentz_TTGlyphBasePen.addComponentM   s   € ð 	�‰×Ñ ¨~Ð>Õ?r&   c                 ón  — | j                   rt        d„ | j                  D «       «      }g }| j                  D ]û  \  }}|| j                  vr | j                  j                  d|› d�«       Œ4| j                  s| j                   rr| j                  ||«       Œat        «       }||_	        d„ |dd  D «       \  |_
        |_        t        d„ |d d D «       «      }|dk7  r?| j                   r$t        d„ |D «       «      rt        d	„ |D «       «      }|d d
 |d
d  f|_        ||_        |j                  |«       Œý |S )Nc              3   óN   K  — | ]  \  }}|d d D ]  }|dkD  xs |dk  –— Œ Œ y ­w)Né   é   éþÿÿÿ© )Ú.0r'   r(   Úss       r$   ú	<genexpr>z3_TTGlyphBasePen._buildComponents.<locals>.<genexpr>]   sF   è ø€ ò á/�Y Ø'¨¨Ð+òð ð �A‘’˜˜R™“ðØñùs   ‚#%z skipped non-existing component 'ú'c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr*   r   ©rE   Úvs     r$   rG   z3_TTGlyphBasePen._buildComponents.<locals>.<genexpr>n   s   è ø€ Ò'O°q¬°¯
Ñ'Oùs   ‚rA   c              3   ó4   K  — | ]  }t        |d «      –— Œ y­w)é   N)r
   rJ   s     r$   rG   z3_TTGlyphBasePen._buildComponents.<locals>.<genexpr>q   s   è ø€ ò #Ø/0Ô# A r×*ñ#ùs   ‚)é   r   r   rN   c              3   óD   K  — | ]  }t         |cxk  xr d k  nc –— Œ y­w©rB   N©r	   ©rE   rF   s     r$   rG   z3_TTGlyphBasePen._buildComponents.<locals>.<genexpr>u   s"   è ø€ ò <Ø-.”K !Ö( q×(Ð(ñ<ùs   ‚ c              3   óP   K  — | ]  }t         |cxk  rd k  r	n nt         n|–— Œ  y­wrP   rQ   rR   s     r$   rG   z3_TTGlyphBasePen._buildComponents.<locals>.<genexpr>y   s)   è ø€ ò +àô (3°QÔ';¸!Õ';�ÀÓBñ+ùs   ‚$&rB   )r   Úanyr8   r   ÚlogÚwarningr5   r/   r   r'   ÚxÚyÚtupleÚ	transformÚflagsr=   )r#   ÚcomponentFlagsÚoverflowingr8   r'   r(   Ú	components          r$   Ú_buildComponentsz _TTGlyphBasePen._buildComponentsY   sX  € Ø×+Ò+ô ñ à37·?±?ôó ˆKð
 ˆ
Ø)-¯©ò 	)Ñ%ˆI�~Ø §¡Ñ-Ø—‘× Ñ Ð#CÀIÀ;ÈaÐ!PÔQØØ�{Š{˜t×?Ò?ÁKà—‘ 	¨>Ô:Øä&Ó(ˆIØ"+ˆIÔÙ'O¸NÈ1È2Ð<NÔ'OÑ$ˆIŒK˜œô #ñ #Ø4BÀ2ÀAÐ4Fô#ó ˆNð  Ò-Ø×3Ò3¼ñ <Ø2@ô<ô 9ô &+ñ +à!/ô+ó &�Nð (6°b°qÐ'9¸>È!È"Ð;MÐ&N�	Ô#Ø,ˆIŒOØ×Ñ˜iÕ(ð9	)ð: Ðr&   ©Úroundr\   ÚdropImpliedOnCurvesra   c                ó0  — | j                  «       st        d«      ‚| j                  |«      }t        «       }t	        | j
                  «      |_        | j                  |_        t        d| j                  «      |_        | j                  «        |r||_        d|_        |S t        |j                  «      |_        t!        j"                  «       |_        |j$                  j'                  d«       |rt)        |«       |j                  j+                  |¬«       |S )a  
        Returns a :py:class:`~._g_l_y_f.Glyph` object representing the glyph.

        Args:
            componentFlags: Flags to use for component glyphs. (default: 0x04)

            dropImpliedOnCurves: Whether to remove implied-oncurve points. (default: False)
        zDidn't close last contour.ÚBéÿÿÿÿr&   r`   )r3   r   r_   r   r   r5   Úcoordinatesr6   ÚendPtsOfContoursr   r7   r[   r"   r8   ÚnumberOfContoursÚlenr   ÚProgramÚprogramÚfromBytecoder   ÚtoInt)r#   r\   rb   ra   r8   Úglyphs         r$   rn   z_TTGlyphBasePen.glyph‚   sã   € ð �~‰~ÔÜÐ7Ó8Ð8Ø×*Ñ*¨>Ó:ˆ
ä“ˆÜ,¨T¯[©[Ó9ˆÔØ!%§¡ˆÔÜ˜C §¡Ó,ˆŒØ�	‰	Œáð  *ˆEÔØ%'ˆEÔ"ð ˆô &)¨×)?Ñ)?Ó%@ˆEÔ"Ü%×-Ñ-Ó/ˆEŒMØ�M‰M×&Ñ& sÔ+Ù"Ü(¨Ô/Ø×Ñ×#Ñ#¨%Ð#Ô0àˆr&   )T©r    Nr*   )rA   F)Ú__name__Ú
__module__Ú__qualname__r   r   Ústrr   Úboolr%   r   Úfloatr/   r3   r"   r>   r_   r   Úintr   r   rn   rD   r&   r$   r   r      s  „ ð -1ñ!à˜4  S ™>Ñ*ð!ð &*ð!ð 
ó	!ðFAàðAð ˜e U¨E°5¸%ÀÐFÑGóAò"óð %)ñ	
@àð
@ð ˜e U¨E°5¸%ÀÐFÑGð
@ð ˜S‘Mð	
@ð
 ð
@ð 
ó
@ò'ðV #Ø$)ð&ð
 )0ò&àð&ð "ð&ð
 ˜˜ ˜Ñ%ð&ð 
ô&r&   r   c            	       óÚ   ‡ — e Zd ZdZdZeZ	 	 	 ddeee	e
f      dededdfˆ fd„Zd	eeef   d
eddfd„Zdd„Zdefd„Zd	eeef   ddfd„Zd	eeef   ddfd„Zdd„Zdd„Zdd„Zdd„Zˆ xZS )r   a  
    Pen used for drawing to a TrueType glyph.

    This pen can be used to construct or modify glyphs in a TrueType format
    font. After using the pen to draw, use the ``.glyph()`` method to retrieve
    a :py:class:`~._g_l_y_f.Glyph` object representing the glyph.
    ÚdrawNr   r   ÚoutputImpliedClosingLiner    c                 ó4   •— t         ‰| �  ||«       || _        y r*   )Úsuperr%   ry   )r#   r   r   ry   Ú	__class__s       €r$   r%   zTTGlyphPen.__init__·   s   ø€ ô 	‰Ñ˜Ð#>Ô?Ø(@ˆÕ%r&   ÚptÚtpc                 óp   — | j                   j                  |«       | j                  j                  |«       y r*   )r5   r=   r7   )r#   r}   r~   s      r$   Ú	_addPointzTTGlyphPen._addPointÀ   s&   € Ø�‰×Ñ˜2ÔØ�
‰
×Ñ˜"Õr&   c                 ól   — | j                   j                  «        | j                  j                  «        y r*   )r5   Úpopr7   r2   s    r$   Ú	_popPointzTTGlyphPen._popPointÄ   s   € Ø�‰�‰ÔØ�
‰
�‰Õr&   c                 óŒ   — | j                    xs6 | j                  xr( | j                  d   t        | j                   «      dz
  k(  S )Nre   rN   )r5   r6   ri   r2   s    r$   r3   zTTGlyphPen._isClosedÈ   s<   € Ø—K‘K�ò 
Ø�K‰KÒC˜DŸK™K¨™O¬s°4·;±;Ó/?À!Ñ/CÑCð	
r&   c                 ó0   — | j                  |t        «       y r*   )r€   r   ©r#   r}   s     r$   ÚlineTozTTGlyphPen.lineToÍ   s   € Ø�‰�rœ;Õ'r&   c                 óf   — | j                  «       st        d«      ‚| j                  |t        «       y )Nz+"move"-type point must begin a new contour.)r3   r   r€   r   r†   s     r$   ÚmoveTozTTGlyphPen.moveToÐ   s&   € Ø�~‰~ÔÜÐHÓIÐIØ�‰�rœ;Õ'r&   c                 ó    — t        |«      dz  dk(  sJ ‚|d d D ]  }| j                  |t        «       Œ |d   �| j                  |d   d«       y y )NrB   rN   re   )ri   r€   r   ©r#   r5   r}   s      r$   ÚcurveTozTTGlyphPen.curveToÕ   s^   € Ü�6‹{˜Q‰ !Ò#Ð#Ð#Ø˜˜"�+ò 	*ˆBØ�N‰N˜2œyÕ)ð	*ð �"‰:Ð!Ø�N‰N˜6 "™: qÕ)ð "r&   c                 ó’   — t        |«      dk\  sJ ‚|d d D ]  }| j                  |d«       Œ |d   �| j                  |d   d«       y y )NrN   re   r   )ri   r€   r‹   s      r$   ÚqCurveTozTTGlyphPen.qCurveToÞ   sZ   € Ü�6‹{˜aÒÐÐØ˜˜"�+ò 	"ˆBØ�N‰N˜2˜qÕ!ð	"ð �"‰:Ð!Ø�N‰N˜6 "™: qÕ)ð "r&   c                 ó˜  — t        | j                  «      dz
  }|dk(  s!| j                  r&|| j                  d   dz   k(  r| j                  «        y | j                  sTd}| j                  r| j                  d   dz   }| j                  |   | j                  |   k(  r| j                  «        |dz  }| j                  j                  |«       y )NrN   r   re   )ri   r5   r6   rƒ   ry   r=   )r#   ÚendPtÚstartPts      r$   Ú	closePathzTTGlyphPen.closePathç   s«   € Ü�D—K‘KÓ  1Ñ$ˆð �AŠ:˜$Ÿ+š+¨%°4·;±;¸r±?ÀQÑ3FÒ*FØ�N‰NÔØà×,Ò,àˆGØ�{Š{ØŸ+™+ b™/¨AÑ-�Ø�{‰{˜7Ñ# t§{¡{°5Ñ'9Ò9Ø—‘Ô Ø˜‘
�à�‰×Ñ˜5Õ!r&   c                 ó$   — | j                  «        y r*   )r’   r2   s    r$   ÚendPathzTTGlyphPen.endPathú   s   € à�‰Õr&   )NTFro   )rp   rq   rr   Ú__doc__r-   r   r+   r   r   rs   r   rt   r%   r   ru   rv   r€   rƒ   r3   r‡   r‰   rŒ   rŽ   r’   r”   Ú__classcell__©r|   s   @r$   r   r   «   sÜ   ø„ ñð €JØ€Lð .2Ø,0Ø).ñ	Aà˜4  S ™>Ñ*ðAð &*ðAð #'ð	Að
 
õAð˜E %¨ ,Ñ/ð °Sð ¸Tó óð
˜4ó 
ð
(˜˜u e˜|Ñ,ð (°ó (ð(˜˜u e˜|Ñ,ð (°ó (ó
*ó*ó"÷&r&   c                   ó¦   ‡ — e Zd ZdZdZeZdˆ fd„Zdefd„Z	dde
e   deddfd	„Zdd
„Z	 	 	 	 ddeeef   de
e   dede
e   de
e   deddfd„Zˆ xZS )r   a  
    Point pen used for drawing to a TrueType glyph.

    This pen can be used to construct or modify glyphs in a TrueType format
    font. After using the pen to draw, use the ``.glyph()`` method to retrieve
    a :py:class:`~._g_l_y_f.Glyph` object representing the glyph.
    Ú
drawPointsr    Nc                 ó0   •— t         ‰| �  «        d | _        y r*   )r{   r"   Ú_currentContourStartIndex)r#   r|   s    €r$   r"   zTTGlyphPointPen.init  s   ø€ Ü‰‰ŒØ)-ˆÕ&r&   c                 ó   — | j                   d u S r*   )r›   r2   s    r$   r3   zTTGlyphPointPen._isClosed  s   € Ø×-Ñ-°Ð5Ð5r&   r:   r;   c                 ón   — | j                  «       st        d«      ‚t        | j                  «      | _        y)z'
        Start a new sub path.
        zDidn't close previous contour.N)r3   r   ri   r5   r›   )r#   r:   r;   s      r$   Ú	beginPathzTTGlyphPointPen.beginPath  s+   € ð �~‰~ÔÜÐ;Ó<Ð<Ü),¨T¯[©[Ó)9ˆÕ&r&   c                 ó  — | j                  «       rt        d«      ‚| j                  t        | j                  «      k(  rd| _        y| j
                  r| j
                  d   dz   nd}| j
                  j                  t        | j                  «      dz
  «       d| _        | j                  }t        |t        |«      «      D ]K  }||   dk(  sŒ|dz
  }||k  rt        |«      dz
  }||   dk(  rt        ||<   |dz  }||   dk(  rŒt        ||<   ŒM y)z+
        End the current sub path.
        zContour is already closed.Nre   rN   r   Úcurve)r3   r   r›   ri   r5   r6   r=   r7   Úranger   r   )r#   ÚcontourStartr[   ÚiÚjs        r$   r”   zTTGlyphPointPen.endPath  s  € ð
 �>‰>ÔÜÐ7Ó8Ð8Ø×)Ñ)¬S°·±Ó-=Ò=à-1ˆDÔ*Øà.2¯kªk�t—{‘{ 2‘¨Ò*¸qˆØ�‰×Ñœ3˜tŸ{™{Ó+¨aÑ/Ô0Ø)-ˆÔ&ð —
‘
ˆÜ�|¤S¨£ZÓ0ò 	'ˆAØ�Q‰x˜7Ó"Ø˜‘E�Ø�|Ò#Ü˜E›
 Q™�AØ˜A‘h !’mÜ(�E˜!‘HØ˜‘F�Að ˜A‘h !“mô '��a’ñ	'r&   r}   ÚsegmentTypeÚsmoothÚnamec                 ó–  — | j                  «       rt        d«      ‚|€| j                  j                  d«       nu|dv r | j                  j                  t        «       nQ|dk(  r | j                  j                  t        «       n,|dk(  r| j                  j                  d«       nt        |«      ‚| j                  j                  |«       y)z6
        Add a point to the current sub path.
        z&Can't add a point to a closed contour.Nr   )ÚlineÚmoveÚqcurver    )r3   r   r7   r=   r   ÚAssertionErrorr5   )r#   r}   r¥   r¦   r§   r:   r;   s          r$   ÚaddPointzTTGlyphPointPen.addPoint6  sž   € ð �>‰>ÔÜÐCÓDÐDØÐØ�J‰J×Ñ˜aÕ ØÐ,Ñ,Ø�J‰J×ÑœkÕ*Ø˜HÒ$Ø�J‰J×ÑœkÕ*Ø˜GÒ#Ø�J‰J×Ñ˜gÕ&ä  Ó-Ð-à�‰×Ñ˜2Õr&   ro   r*   )NFNN)rp   rq   rr   r•   r-   r   r+   r"   rt   r3   r   rs   r   rž   r”   r   ru   r­   r–   r—   s   @r$   r   r   ÿ   s´   ø„ ñð €JØ$€Lõ.ð6˜4ó 6ñ: H¨S¡Mð :ÀCð :ÈDó :ó'ð> &*ØØ"Ø$(ñà�%˜�,Ñðð ˜c‘]ðð ð	ð
 �s‰mðð ˜S‘Mðð ðð 
÷r&   )$r   Útypingr   r   r   r   r   ÚfontTools.misc.fixedToolsr	   r
   ÚfontTools.misc.loggingToolsr   ÚfontTools.pens.pointPenr   ÚfontTools.misc.roundToolsr   ÚfontTools.pens.basePenr   r   ÚfontTools.pens.transformPenr   r   ÚfontTools.ttLib.tablesr   ÚfontTools.ttLib.tables._g_l_y_fr   r   r   r   r   r   ÚmathÚ__all__r   r   r   rD   r&   r$   ú<module>r¹      ss   ðÝ ß 7Õ 7ß FÝ 0Ý 4Ý -ß 7ß GÝ ,ß BÝ 1Ý :Ý <Ý DÛ ð Ð*Ð
+€÷Sñ SôlQ� *ô QôhP�o xÐ1Aõ Pr&   