a
    èÝEb•'  ã                   @   sè   d dl m Z  d dl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 d dlmZ d dlmZ ddgZG dd„ dƒZG dd„ deeƒZG dd„ dee
eƒZdS )é    )Úarray)ÚAnyÚDictÚOptionalÚTuple)ÚMAX_F2DOT14ÚfloatToFixedToFloat)ÚLogMixin)ÚAbstractPointPen©ÚotRound)Ú
LoggingPenÚPenError)ÚTransformPenÚTransformPointPen)Ú	ttProgram)ÚGlyph)ÚGlyphComponent)ÚGlyphCoordinatesÚ
TTGlyphPenÚTTGlyphPointPenc                	   @   s¨   e Zd Zdeeeef  eddœdd„Zee	e
e
e
e
e
e
f dœdd„Zd	d
„ Zddœdd„Zdee	e
e
e
e
e
e
f ee eddœdd„Zdd„ Zdeedœdd„ZdS )Ú_TTGlyphBasePenTN)ÚglyphSetÚhandleOverflowingTransformsÚreturnc                 C   s   || _ || _|  ¡  dS )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   © r   úY/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/pens/ttGlyphPen.pyÚ__init__   s    z_TTGlyphBasePen.__init__)Ú	glyphNameÚtransformationc                 C   s&   |   | |¡}t| j| | jƒ|ƒ d S ©N)ÚtransformPenÚgetattrr   Ú
drawMethod)r   r    r!   Ztpenr   r   r   Ú
_decompose6   s    z_TTGlyphBasePen._decomposec                 C   s   t ‚dS )z6
        Check if the current path is closed.
        N©ÚNotImplementedError©r   r   r   r   Ú	_isClosed>   s    z_TTGlyphBasePen._isClosed©r   c                 C   s   g | _ g | _g | _g | _d S r"   )ÚpointsÚendPtsÚtypesÚ
componentsr)   r   r   r   r   D   s    z_TTGlyphBasePen.init)ÚbaseGlyphNamer!   Ú
identifierÚkwargsr   c                 K   s   | j  ||f¡ dS )z"
        Add a sub glyph.
        N)r/   Úappend)r   r0   r!   r1   r2   r   r   r   ÚaddComponentJ   s    
z_TTGlyphBasePen.addComponentc                 C   s  | j rtdd„ | jD ƒƒ}g }| jD ]æ\}}|| jvrL| j d|› d�¡ q$| js\| j rj|rj|  ||¡ q$tƒ }||_	dd„ |dd … D ƒ\|_
|_tdd„ |d d… D ƒƒ}|dkrú| j ràtd	d„ |D ƒƒràtd
d„ |D ƒƒ}|d d… |dd … f|_||_| |¡ q$|S )Nc                 s   s4   | ],\}}|d d… D ]}|dkp(|dk V  qqd S )Né   é   éþÿÿÿr   )Ú.0r    r!   Úsr   r   r   Ú	<genexpr>Z   s   þz3_TTGlyphBasePen._buildComponents.<locals>.<genexpr>z skipped non-existing component 'ú'c                 s   s   | ]}t |ƒV  qd S r"   r   ©r8   Úvr   r   r   r:   k   ó    r5   c                 s   s   | ]}t |d ƒV  qdS )é   N)r   r<   r   r   r   r:   n   s   )é   r   r   r@   c                 s   s&   | ]}t |  k od kn  V  qdS ©r6   N©r   ©r8   r9   r   r   r   r:   r   s   c                 s   s.   | ]&}t |  k rd kr"n nt n|V  qdS rA   rB   rC   r   r   r   r:   v   s   ÿr6   )r   Úanyr/   r   ÚlogÚwarningr,   r&   r   r    ÚxÚyÚtupleZ	transformÚflagsr3   )r   ÚcomponentFlagsZoverflowingr/   r    r!   Ú	componentr   r   r   Ú_buildComponentsV   s:    þ

ÿÿþz _TTGlyphBasePen._buildComponentsr5   )rK   r   c                 C   sŒ   |   ¡ stdƒ‚|  |¡}tƒ }t| jƒ|_|j ¡  | j|_	t
d| jƒ|_|  ¡  |rf||_d|_n"t|j	ƒ|_t ¡ |_|j d¡ |S )zW
        Returns a :py:class:`~._g_l_y_f.Glyph` object representing the glyph.
        zDidn't close last contour.ÚBéÿÿÿÿr>   )r*   r   rM   r   r   r,   ZcoordinatesZtoIntr-   ZendPtsOfContoursr   r.   rJ   r   r/   ZnumberOfContoursÚlenr   ZProgramÚprogramZfromBytecode)r   rK   r/   Úglyphr   r   r   rR      s     


z_TTGlyphBasePen.glyph)T)N)r5   )Ú__name__Ú
__module__Ú__qualname__r   r   Ústrr   Úboolr   r   Úfloatr&   r*   r   r4   rM   Úintr   rR   r   r   r   r   r      s*    ýü%ý
 üú)r   c                   @   s¶   e Zd ZdZdZeZeeef e	ddœdd„Z
ddœdd	„Zedœd
d„Zeeef ddœdd„Zeeef ddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zd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.
    ZdrawN)ÚptÚonCurver   c                 C   s   | j  |¡ | j |¡ d S r"   )r,   r3   r.   )r   rZ   r[   r   r   r   Ú	_addPoint§   s    zTTGlyphPen._addPointr+   c                 C   s   | j  ¡  | j ¡  d S r"   )r,   Úpopr.   r)   r   r   r   Ú	_popPoint«   s    
zTTGlyphPen._popPointc                 C   s&   | j  p$| jo$| jd t| j ƒd kS )NrO   r@   )r,   r-   rP   r)   r   r   r   r*   ¯   s    ÿzTTGlyphPen._isClosed)rZ   r   c                 C   s   |   |d¡ d S )Nr@   )r\   ©r   rZ   r   r   r   ÚlineTo´   s    zTTGlyphPen.lineToc                 C   s    |   ¡ stdƒ‚|  |d¡ d S )Nz+"move"-type point must begin a new contour.r@   )r*   r   r\   r_   r   r   r   ÚmoveTo·   s    zTTGlyphPen.moveToc                 G   s   t ‚d S r"   r'   )r   r,   r   r   r   ÚcurveTo¼   s    zTTGlyphPen.curveToc                 G   sN   t |ƒdksJ ‚|d d… D ]}|  |d¡ q|d d urJ|  |d d¡ d S )Nr@   rO   r   )rP   r\   )r   r,   rZ   r   r   r   ÚqCurveTo¿   s
    zTTGlyphPen.qCurveToc                 C   s†   t | jƒd }|dks.| jr:|| jd d kr:|  ¡  d S d}| jrR| jd d }| j| | j| krv|  ¡  |d8 }| j |¡ d S )Nr@   r   rO   )rP   r,   r-   r^   r3   )r   ZendPtZstartPtr   r   r   Ú	closePathÈ   s     zTTGlyphPen.closePathc                 C   s   |   ¡  d S r"   )rd   r)   r   r   r   ÚendPathÚ   s    zTTGlyphPen.endPath)rS   rT   rU   Ú__doc__r%   r   r#   r   rX   rY   r\   r^   rW   r*   r`   ra   rb   rc   rd   re   r   r   r   r   r   ›   s   	c                	       s’   e Zd ZdZdZeZddœ‡ fdd„Zedœdd„Z	de
e edd	œd
d„Zddœdd„Zdeeef e
e ee
e e
e eddœdd„Z‡  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.
    Z
drawPointsNr+   c                    s   t ƒ  ¡  d | _d S r"   )Úsuperr   Ú_currentContourStartIndexr)   ©Ú	__class__r   r   r   ë   s    
zTTGlyphPointPen.initc                 C   s
   | j d u S r"   )rh   r)   r   r   r   r*   ï   s    zTTGlyphPointPen._isClosed)r1   r2   r   c                 K   s    |   ¡ stdƒ‚t| jƒ| _dS )z'
        Start a new sub path.
        zDidn't close previous contour.N)r*   r   rP   r,   rh   )r   r1   r2   r   r   r   Ú	beginPathò   s    zTTGlyphPointPen.beginPathc                 C   sH   |   ¡ rtdƒ‚| jt| jƒkr(tdƒ‚| j t| jƒd ¡ d| _dS )z+
        End the current sub path.
        zContour is already closed.zTried to end an empty contour.r@   N)r*   r   rh   rP   r,   r-   r3   r)   r   r   r   re   ú   s    zTTGlyphPointPen.endPathF)rZ   ÚsegmentTypeÚsmoothÚnamer1   r2   r   c                 K   sf   |   ¡ rtdƒ‚|du r&| j d¡ n0|dv r<| j d¡ n|dkrNtdƒ‚nt|ƒ‚| j |¡ dS )z6
        Add a point to the current sub path.
        z&Can't add a point to a closed contour.Nr   )ZqcurveÚlineÚmover@   Zcurvezcubic curves are not supported)r*   r   r.   r3   r(   ÚAssertionErrorr,   )r   rZ   rl   rm   rn   r1   r2   r   r   r   ÚaddPoint  s    
zTTGlyphPointPen.addPoint)N)NFNN)rS   rT   rU   rf   r%   r   r#   r   rW   r*   r   rV   r   rk   re   r   rX   rr   Ú__classcell__r   r   ri   r   r   ß   s(       ú
øN)r   Útypingr   r   r   r   ZfontTools.misc.fixedToolsr   r   ZfontTools.misc.loggingToolsr	   ZfontTools.pens.pointPenr
   ZfontTools.misc.roundToolsr   ZfontTools.pens.basePenr   r   ZfontTools.pens.transformPenr   r   ZfontTools.ttLib.tablesr   ZfontTools.ttLib.tables._g_l_y_fr   r   r   Ú__all__r   r   r   r   r   r   r   Ú<module>   s     
D