U
    Dvf^.                     @   s  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 dZ!G dd de!eZ"G dd de!eeZ#dS )    )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                	   @   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deeee
gef 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!   =/tmp/pip-unpacked-wheel-qlge9rch/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"   
_decompose9   s    z_TTGlyphBasePen._decomposec                 C   s   t dS )z6
        Check if the current path is closed.
        N)NotImplementedErrorr    r!   r!   r"   	_isClosedA   s    z_TTGlyphBasePen._isClosedr   c                 C   s   g | _ g | _g | _g | _d S r&   )pointsendPtstypes
componentsr,   r!   r!   r"   r   G   s    z_TTGlyphBasePen.init)baseGlyphNamer%   
identifierkwargsr   c                 K   s   | j ||f dS )z"
        Add a sub glyph.
        N)r2   append)r    r3   r%   r4   r5   r!   r!   r"   addComponentM   s    
z_TTGlyphBasePen.addComponentc                 C   s  | j rtdd | jD }g }| jD ]\}}|| jk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 rtd	d |D rt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>]   s    z3_TTGlyphBasePen._buildComponents.<locals>.<genexpr>z skipped non-existing component ''c                 s   s   | ]}t |V  qd S r&   r   r;   vr!   r!   r"   r=   n   s     r8   c                 s   s   | ]}t |d V  qdS )   N)r	   r?   r!   r!   r"   r=   q   s    )   r   r   rB   c                 s   s&   | ]}t |  k od kn  V  qdS r9   Nr   r;   r<   r!   r!   r"   r=   u   s    c                 s   s.   | ]&}t |  k rd kr"n nt n|V  qdS rC   rD   rE   r!   r!   r"   r=   y   s   r9   )r   anyr2   r   logwarningr/   r*   r   r$   xytupleZ	transformflagsr6   )r    componentFlagsZoverflowingr2   r$   r%   	componentr!   r!   r"   _buildComponentsY   s:    

z _TTGlyphBasePen._buildComponentsr8   Fround)rM   dropImpliedOnCurvesrQ   r   c                C   s   |   std| |}t }t| j|_| j|_t	d| j
|_|   |r\||_d|_n<t|j|_t |_|jd |rt| |jj|d |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    rP   )r-   r   rO   r   r   r/   Zcoordinatesr0   ZendPtsOfContoursr   r1   rL   r   r2   ZnumberOfContourslenr   ZProgramprogramZfromBytecoder   ZtoInt)r    rM   rR   rQ   r2   glyphr!   r!   r"   rX      s$    

z_TTGlyphBasePen.glyph)T)N)r8   F)__name__
__module____qualname__r   r   strr   boolr#   r   floatr*   r-   r   r7   rO   r   intr   r   rX   r!   r!   r!   r"   r      s<    %
 +  r   c                       s   e Zd ZdZdZeZdeee	e
f  eedd fdd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  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.
    ZdrawNTF)r   r   outputImpliedClosingLiner   c                    s   t  || || _d S r&   )superr#   r`   )r    r   r   r`   	__class__r!   r"   r#      s    zTTGlyphPen.__init__)pttpr   c                 C   s   | j | | j| d S r&   )r/   r6   r1   )r    rd   re   r!   r!   r"   	_addPoint   s    zTTGlyphPen._addPointr.   c                 C   s   | j   | j  d S r&   )r/   popr1   r,   r!   r!   r"   	_popPoint   s    
zTTGlyphPen._popPointc                 C   s&   | j  p$| jo$| jd t| j d kS )NrT   rB   )r/   r0   rV   r,   r!   r!   r"   r-      s    zTTGlyphPen._isClosed)rd   r   c                 C   s   |  |t d S r&   )rf   r   r    rd   r!   r!   r"   lineTo   s    zTTGlyphPen.lineToc                 C   s    |   std| |t d S )Nz+"move"-type point must begin a new contour.)r-   r   rf   r   ri   r!   r!   r"   moveTo   s    zTTGlyphPen.moveToc                 G   sR   t |d dkst|d d D ]}| |t q |d d k	rN| |d d d S )Nr9   rB   rT   )rV   AssertionErrorrf   r   r    r/   rd   r!   r!   r"   curveTo   s
    zTTGlyphPen.curveToc                 G   sN   t |dkst|d d D ]}| |d q|d d k	rJ| |d d d S )NrB   rT   r   )rV   rl   rf   rm   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 | js|d}| jrX| jd d }| j| | j| kr||   |d8 }| j| d S )NrB   r   rT   )rV   r/   r0   rh   r`   r6   )r    ZendPtZstartPtr!   r!   r"   	closePath   s     zTTGlyphPen.closePathc                 C   s   |    d S r&   )rp   r,   r!   r!   r"   endPath   s    zTTGlyphPen.endPath)NTF)rY   rZ   r[   __doc__r)   r   r'   r   r   r\   r   r]   r#   r   r^   r_   rf   rh   r-   rj   rk   rn   ro   rp   rq   __classcell__r!   r!   rb   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&   )ra   r   _currentContourStartIndexr,   rb   r!   r"   r     s    
zTTGlyphPointPen.initc                 C   s
   | j d kS r&   )rt   r,   r!   r!   r"   r-     s    zTTGlyphPointPen._isClosed)r4   r5   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   rV   r/   rt   )r    r4   r5   r!   r!   r"   	beginPath  s    zTTGlyphPointPen.beginPathc                 C   s   |   rtd| jt| jkr*d| _dS | jr>| jd d nd}| jt| jd  d| _| j}t|t|D ]R}|| dkrr|d }||k rt|d }|| dkrt	||< |d8 }qt
||< qrdS )z+
        End the current sub path.
        zContour is already closed.NrT   rB   r   curve)r-   r   rt   rV   r/   r0   r6   r1   ranger   r   )r    ZcontourStartrL   ijr!   r!   r"   rq     s$    
zTTGlyphPointPen.endPathF)rd   segmentTypesmoothnamer4   r5   r   c                 K   s   |   rtd|dkr&| jd nJ|dkr<| jt n4|dkrR| jt n|dkrh| j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   )linemoveZqcurverv   )r-   r   r1   r6   r   rl   r/   )r    rd   rz   r{   r|   r4   r5   r!   r!   r"   addPoint6  s    zTTGlyphPointPen.addPoint)N)NFNN)rY   rZ   r[   rr   r)   r   r'   r   r]   r-   r   r\   r   ru   rq   r   r^   r   rs   r!   r!   rb   r"   r      s(       
)$r   typingr   r   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   r   r   r   math__all__r   r   r   r!   r!   r!   r"   <module>   s&    T