U
    »mœdƒ+  ã                   @   sä   d 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mZ ddlmZ dd	lmZ dd
lmZmZ G dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ ZdS )zGlyphSets returned by a TTFont.é    )ÚABCÚabstractmethod)ÚMapping)Úcontextmanager©Úcopy)ÚSimpleNamespace)ÚotRound)ÚdeprecateFunction)Ú	Transform)ÚTransformPenÚTransformPointPenc                   @   sb   e Zd ZdZdd„ Zeedœdd„ƒZedd„ ƒZd	d
„ Z	dd„ Z
dd„ Zeded�dd„ ƒZdS )Ú_TTGlyphSetzlGeneric dict-like GlyphSet class that pulls metrics from hmtx and
    glyph shape from TrueType or CFF.
    c                 C   sÞ   || _ d| j kr&dd„ | j d jD ƒni | _|d k	r8|ni | _i | _|d k	rP|ni | _d| _g | _g | _|| _	|d j
| _t| d¡dd ƒ| _d | _|rÚddlm} t| d	¡d
d ƒ| _| jd k	rÚ|| jj|d j|ƒ| _d S )NÚfvarc                 S   s   i | ]}|j d “qS )r   )ZaxisTag)Ú.0Zaxis© r   úS/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/ttLib/ttGlyphSet.pyÚ
<dictcomp>   s      z(_TTGlyphSet.__init__.<locals>.<dictcomp>r   ZhmtxZvmtxÚmetrics©ÚVarStoreInstancerZHVARÚtable)ÚfontÚaxesÚdefaultLocationNormalizedÚlocationÚrawLocationÚoriginalLocationÚdepthÚlocationStackÚrawLocationStackÚglyphsMappingr   ÚhMetricsÚgetattrÚgetÚvMetricsÚ	hvarTableÚfontTools.varLib.varStorer   ZVarStoreÚhvarInstancer)Úselfr   r   r!   r   r   r   r   Ú__init__   s0    ÿý
  ÿz_TTGlyphSet.__init__)Úresetc                 c   sŽ   | j  | j¡ | j | j¡ |r:| j ¡ | _| j ¡ | _n| j ¡ | _i | _| j |¡ | j |¡ z
d V  W 5 | j  	¡ | _| j 	¡ | _X d S ©N)
r   Úappendr   r    r   r   r   r   ÚupdateÚpop)r)   r   r+   r   r   r   ÚpushLocation/   s    
z_TTGlyphSet.pushLocationc              	   c   s4   z| j }|  j d7  _ |V  W 5 |  j d8  _ X d S )Né   )r   )r)   r   r   r   r   Ú	pushDepthB   s
    
z_TTGlyphSet.pushDepthc                 C   s
   || j kS r,   ©r!   ©r)   Ú	glyphNamer   r   r   Ú__contains__K   s    z_TTGlyphSet.__contains__c                 C   s   t | j ¡ ƒS r,   )Úiterr!   Úkeys©r)   r   r   r   Ú__iter__N   s    z_TTGlyphSet.__iter__c                 C   s
   t | jƒS r,   )Úlenr!   r9   r   r   r   Ú__len__Q   s    z_TTGlyphSet.__len__z#use 'glyphName in glyphSet' instead)Úcategoryc                 C   s
   || j kS r,   r3   r4   r   r   r   Úhas_keyT   s    z_TTGlyphSet.has_keyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r   Úboolr0   r2   r6   r:   r<   r
   ÚDeprecationWarningr>   r   r   r   r   r      s   
 ÿr   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú_TTGlyphSetGlyfc                    s,   |d | _ tƒ  ||| j ¡ | d¡| _d S )NZglyfZgvar)Ú	glyfTableÚsuperr*   r$   Ú	gvarTable)r)   r   r   ©Ú	__class__r   r   r*   \   s    
z_TTGlyphSetGlyf.__init__c                 C   s
   t | |ƒS r,   )Ú_TTGlyphGlyfr4   r   r   r   Ú__getitem__a   s    z_TTGlyphSetGlyf.__getitem__©r?   r@   rA   r*   rL   Ú__classcell__r   r   rI   r   rE   [   s   rE   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú_TTGlyphSetCFFc                    sˆ   d|krdnd}t || j ¡ ƒd j| _tƒ  ||| j¡ d | _|r„ddlm	} t
| jdd ƒ}|d k	r„||j|d j|ƒ}|j| _d S )NZCFF2zCFF r   r   ÚvarStorer   )ÚlistZcffÚvaluesZCharStringsÚcharStringsrG   r*   Úblenderr'   r   r#   Z
otVarStorer   ZinterpolateFromDeltas)r)   r   r   ZtableTagr   rP   Z	instancerrI   r   r   r*   f   s      ÿz_TTGlyphSetCFF.__init__c                 C   s
   t | |ƒS r,   )Ú_TTGlyphCFFr4   r   r   r   rL   u   s    z_TTGlyphSetCFF.__getitem__rM   r   r   rI   r   rO   e   s   rO   c                   @   s,   e Zd ZdZdd„ Zedd„ ƒZdd„ ZdS )	Ú_TTGlyphaS  Glyph object that supports the Pen protocol, meaning that it has
    .draw() and .drawPoints() methods that take a pen object as their only
    argument. Additionally there are 'width' and 'lsb' attributes, read from
    the 'hmtx' table.

    If the font contains a 'vmtx' table, there will also be 'height' and 'tsb'
    attributes.
    c                 C   s–   || _ || _|j| \| _| _|jd k	r<|j| \| _| _nd\| _| _|jr’|j	d k	r’|j	j
d krp|j |¡n|j	j
j| }|  j|j| 7  _d S )N©NN)ÚglyphSetÚnamer"   ÚwidthÚlsbr%   ÚheightÚtsbr   r&   ZAdvWidthMapr   Z
getGlyphIDÚmappingr(   )r)   rX   r5   Zvaridxr   r   r   r*   „   s    

ÿýz_TTGlyph.__init__c                 C   s   t ‚dS ©údDraw the glyph onto ``pen``. See fontTools.pens.basePen for details
        how that works.
        N)ÚNotImplementedError©r)   Úpenr   r   r   Údraw•   s    z_TTGlyph.drawc                 C   s   ddl m} |  ||ƒ¡ dS )úeDraw the glyph onto ``pen``. See fontTools.pens.pointPen for details
        how that works.
        r   )ÚSegmentToPointPenN)ZfontTools.pens.pointPenrf   rd   )r)   rc   rf   r   r   r   Ú
drawPointsœ   s    z_TTGlyph.drawPointsN)r?   r@   rA   rB   r*   r   rd   rg   r   r   r   r   rV   y   s
   	
rV   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )rK   c              	   C   sd   |   ¡ \}}| j ¡ �D}|r d}| ¡ rD|  ||d¡ W 5 Q R £ dS | || jj|¡ W 5 Q R X dS )r`   r   FN)Ú_getGlyphAndOffsetrX   r2   ÚisVarCompositeÚ_drawVarCompositerd   rF   ©r)   rc   ÚglyphÚoffsetr   r   r   r   rd   ¦   s    z_TTGlyphGlyf.drawc              	   C   sd   |   ¡ \}}| j ¡ �D}|r d}| ¡ rD|  ||d¡ W 5 Q R £ dS | || jj|¡ W 5 Q R X dS )re   r   TN)rh   rX   r2   ri   rj   rg   rF   rk   r   r   r   rg   ·   s    z_TTGlyphGlyf.drawPointsc           	   
   C   s¼   ddl m}m} |jD ] }| j |j|j|j@ ¡�~ z| 	|j
|j| jj¡ W n\ tk
rª   |j ¡ }|rŠt||ƒ}| j|j
  |¡ nt||ƒ}| j|j
  |¡ Y nX W 5 Q R X qd S )Nr   )ÚVarComponentFlagsÚVAR_COMPONENT_TRANSFORM_MAPPING)ÚfontTools.ttLib.tables._g_l_y_frn   ro   Ú
componentsrX   r0   r   ÚflagsZRESET_UNSPECIFIED_AXESZaddVarComponentr5   Z	transformr   ÚAttributeErrorZtoTransformr   rg   r   rd   )	r)   rl   rc   Z
isPointPenrn   ro   ÚcompÚtZtPenr   r   r   rj   È   s&    
 
ÿ  ÿ


z_TTGlyphGlyf._drawVarCompositec                 C   sN   | j jr| j jd k	r|  ¡ }n| j j| j }t|dƒrB| j|j nd}||fS )NÚxMinr   )	rX   r   rH   Ú_getGlyphInstancerF   rY   Úhasattrr[   rv   )r)   rl   rm   r   r   r   rh   á   s
    
z_TTGlyphGlyf._getGlyphAndOffsetc                 C   s<  ddl m} ddlm} ddlm} | j}|j}|jj	| j
 }|j}|j}| | j
||¡\}	}
d\}}|D ]†}||j|jƒ}|s‚qj|j}d |krà|d krÔ| | j
||¡\}}|d dkrÀ|d nttt|d ƒƒƒ}||||ƒ}|	||ƒ| 7 }	qjt|| j
 ƒ}t||	|ƒ\}}}}|| _|| _|jd k�r8|| _|| _|S )Nr   )Ú	iup_delta)ÚGlyphCoordinates)ÚsupportScalarrW   r1   )ZfontTools.varLib.iupry   rp   rz   ZfontTools.varLib.modelsr{   rX   rF   rH   Ú
variationsrY   r"   r%   Z_getCoordinatesAndControlsr   r   ÚcoordinatesrQ   Úranger;   r   Ú_setCoordinatesr[   r]   r&   rZ   r\   )r)   ry   rz   r{   rX   rF   r|   r"   r%   r}   Ú_Z
origCoordsZendPtsÚvarZscalarÚdeltaÚcontrolrl   rZ   r[   r\   r]   r   r   r   rw   ê   sL      ÿ  ÿ&ÿz_TTGlyphGlyf._getGlyphInstanceN)r?   r@   rA   rd   rg   rj   rh   rw   r   r   r   r   rK   ¥   s
   	rK   c                   @   s   e Zd Zdd„ ZdS )rU   c                 C   s   | j j| j  || j j¡ dS r_   )rX   rS   rY   rd   rT   rb   r   r   r   rd     s    z_TTGlyphCFF.drawN)r?   r@   rA   rd   r   r   r   r   rU     s   rU   c                 C   st  t |ƒdkst‚|d d }|d d }|d d }|d d }tdƒD ]
}|d= qH|  ¡ r²t |ƒt | jƒksrt‚dd	„ | jD ƒ| _t|| jƒD ]\}}	t|	d
ƒr�|\|	_|	_q�nx|  	¡ rìdd	„ | jD ƒ| _| jD ]}	|	 
|¡}qÒ|rêt‚n>| jdk�rt |ƒdk�s*t‚nt |ƒt | jƒk�s$t‚|| _|  |¡ t|| ƒ}
t|| ƒ}t| j| ƒ}t|| j ƒ}|
|||fS )Né   éüÿÿÿr   éýÿÿÿéþÿÿÿr1   éÿÿÿÿc                 S   s   g | ]}t |ƒ‘qS r   r   ©r   rt   r   r   r   Ú
<listcomp>(  s     z#_setCoordinates.<locals>.<listcomp>Úxc                 S   s   g | ]}t |ƒ‘qS r   r   r‰   r   r   r   rŠ   -  s     )r;   ÚAssertionErrorr~   ZisCompositerq   Úziprx   r‹   Úyri   ZsetCoordinatesZnumberOfContoursr}   ZrecalcBoundsr	   rv   ZyMax)rl   ZcoordrF   Z	leftSideXZ
rightSideXZtopSideYZbottomSideYr€   Úprt   ZhorizontalAdvanceWidthZverticalAdvanceWidthZleftSideBearingZtopSideBearingr   r   r   r     s@    



ür   N)rB   Úabcr   r   Úcollections.abcr   Ú
contextlibr   r   Útypesr   ZfontTools.misc.fixedToolsr	   ZfontTools.misc.loggingToolsr
   ZfontTools.misc.transformr   ZfontTools.pens.transformPenr   r   r   rE   rO   rV   rK   rU   r   r   r   r   r   Ú<module>   s    M
,n