U
    Q»{jDD  ã                   @   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m	Z	 ddl
mZ ddl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mZ ddlmZ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#G dd„ de"ƒZ$dd„ Z%G dd„ de"ƒZ&dd œd!d"„Z'G d#d$„ d$eƒZ(G d%d&„ d&ƒZ)d'S )(zGlyphSets returned by a TTFont.é    )ÚABCÚabstractmethod)ÚMapping)Úcontextmanager)ÚcopyÚdeepcopy)ÚSimpleNamespace)ÚVector)ÚotRoundÚfixedToFloat)ÚdeprecateFunction)Ú	TransformÚDecomposedTransform)ÚTransformPenÚTransformPointPen)ÚDecomposingRecordingPenÚlerpRecordingsÚreplayRecordingc                   @   sh   e Zd ZdZddœ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.
    T©ÚrecalcBoundsc                C   sä   || _ || _d| jkr,dd„ | jd jD ƒni | _|d k	r>|ni | _i | _|d k	rV|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   ©ÚaxisTag)Ú.0Zaxis© r   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/ttLib/ttGlyphSet.pyÚ
<dictcomp>   s      z(_TTGlyphSet.__init__.<locals>.<dictcomp>r   ZhmtxZvmtxÚmetrics©ÚVarStoreInstancerZHVARÚtable)r   Ú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   r   Ú__init__   s2    ÿý
  ÿ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)r3   r%   r6   r   r   r   ÚpushLocation5   s    
z_TTGlyphSet.pushLocationc              	   c   s4   z| j }|  j d7  _ |V  W 5 |  j d8  _ X d S )Né   )r(   )r3   r(   r   r   r   Ú	pushDepthH   s
    
z_TTGlyphSet.pushDepthc                 C   s
   || j kS r7   ©r+   ©r3   Ú	glyphNamer   r   r   Ú__contains__Q   s    z_TTGlyphSet.__contains__c                 C   s   t | j ¡ ƒS r7   )Úiterr+   Úkeys©r3   r   r   r   Ú__iter__T   s    z_TTGlyphSet.__iter__c                 C   s
   t | jƒS r7   )Úlenr+   rD   r   r   r   Ú__len__W   s    z_TTGlyphSet.__len__z#use 'glyphName in glyphSet' instead)Úcategoryc                 C   s
   || j kS r7   r>   r?   r   r   r   Úhas_keyZ   s    z_TTGlyphSet.has_keyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   r   Úboolr;   r=   rA   rE   rG   r   ÚDeprecationWarningrI   r   r   r   r   r      s   
 ÿr   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú_TTGlyphSetGlyfTc                    s0   |d | _ tƒ j||| j |d� | d¡| _d S )NZglyfr   Zgvar)Ú	glyfTableÚsuperr4   r.   Ú	gvarTable)r3   r"   r%   r   ©Ú	__class__r   r   r4   b   s    
z_TTGlyphSetGlyf.__init__c                 C   s   t | || jd�S )Nr   )Ú_TTGlyphGlyfr   r?   r   r   r   Ú__getitem__g   s    z_TTGlyphSetGlyf.__getitem__)T©rJ   rK   rL   r4   rW   Ú__classcell__r   r   rT   r   rP   a   s   rP   c                       s>   e Zd Z‡ fdd„Zdd„ Zdd„ Zeedœdd	„ƒZ‡  Z	S )
Ú_TTGlyphSetCFFc                    sJ   d|krdnd}t || j ¡ ƒd j| _tƒ  ||| j¡ |  |¡ d S )NZCFF2zCFF r   )ÚlistZcffÚvaluesZCharStringsÚcharStringsrR   r4   ÚsetLocation)r3   r"   r%   ZtableTagrT   r   r   r4   l   s    z_TTGlyphSetCFF.__init__c                 C   s
   t | |ƒS r7   )Ú_TTGlyphCFFr?   r   r   r   rW   r   s    z_TTGlyphSetCFF.__getitem__c                 C   sV   d | _ |rLddlm} t| jdd ƒ}|d k	rR||j| jd j|ƒ}|j| _ nd | _ d S )Nr   r   ÚvarStorer   )	Úblenderr1   r    r-   r]   Z
otVarStorer"   r#   ZinterpolateFromDeltas)r3   r%   r    r`   Ú	instancerr   r   r   r^   u   s     
 ÿ
z_TTGlyphSetCFF.setLocationr5   c              
   c   sB   |   |¡ t | ||¡� }z
|V  W 5 |   | j¡ X W 5 Q R X d S r7   )r^   r   r;   r%   )r3   r%   r6   Úvaluer   r   r   r;   …   s
    

z_TTGlyphSetCFF.pushLocation)
rJ   rK   rL   r4   rW   r^   r   rN   r;   rY   r   r   rT   r   rZ   k   s
   rZ   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú_TTGlyphSetVARCc                    s&   || _ tƒ  |||¡ |d j| _d S )NZVARC)ÚglyphSetrR   r4   r!   Ú	varcTable)r3   r"   r%   re   rT   r   r   r4   �   s    z_TTGlyphSetVARC.__init__c                 C   s&   | j }||jjkr| j| S t| |ƒS r7   )rf   ÚCoverageÚglyphsre   Ú_TTGlyphVARC)r3   r@   Úvarcr   r   r   rW   •   s    
z_TTGlyphSetVARC.__getitem__rX   r   r   rT   r   rd   �   s   rd   c                   @   s2   e Zd ZdZddœ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.
    Tr   c                C   sœ   || _ || _|| _|j| \| _| _|jd k	rB|j| \| _| _nd\| _| _|j	r˜|j
d k	r˜|j
jd krv|j |¡n|j
jj| }|  j|j| 7  _d S )N©NN)re   Únamer   r,   ÚwidthÚlsbr/   ÚheightÚtsbr%   r0   ZAdvWidthMapr"   Z
getGlyphIDÚmappingr2   )r3   re   r@   r   Zvaridxr   r   r   r4   ¦   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©r3   Ú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.pointPenrz   rx   )r3   rw   rz   r   r   r   Ú
drawPoints¿   s    z_TTGlyph.drawPointsN)rJ   rK   rL   rM   r4   r   rx   r{   r   r   r   r   rk   œ   s
   	
rk   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
rV   c              	   C   s@   |   ¡ \}}| j ¡ � }|r d}| || jj|¡ W 5 Q R X dS )rt   r   N)Ú_getGlyphAndOffsetre   r=   rx   rQ   ©r3   rw   ÚglyphÚoffsetr(   r   r   r   rx   É   s
    z_TTGlyphGlyf.drawc              	   C   s@   |   ¡ \}}| j ¡ � }|r d}| || jj|¡ W 5 Q R X dS )ry   r   N)r|   re   r=   r{   rQ   r}   r   r   r   r{   Õ   s
    z_TTGlyphGlyf.drawPointsc                 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   )	re   r%   rS   Ú_getGlyphInstancerQ   rm   Úhasattrro   r€   )r3   r~   r   r   r   r   r|   á   s
    
z_TTGlyphGlyf._getGlyphAndOffsetc                 C   sB  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�\}}}}|| _|| _|jd k�r>|| _|| _|S )Nr   )Ú	iup_delta)ÚGlyphCoordinates)ÚsupportScalarrl   r<   r   )ZfontTools.varLib.iuprƒ   ZfontTools.ttLib.tables._g_l_y_fr„   ZfontTools.varLib.modelsr…   re   rQ   rS   Ú
variationsrm   r,   r/   Z_getCoordinatesAndControlsr%   r#   Úcoordinatesr[   ÚrangerF   r   Ú_setCoordinatesr   ro   rq   r0   rn   rp   )r3   rƒ   r„   r…   re   rQ   r†   r,   r/   r‡   Ú_Z
origCoordsZendPtsÚvarZscalarÚdeltaÚcontrolr~   rn   ro   rp   rq   r   r   r   r�   ê   sV      ÿ  ÿ&ÿ   ÿz_TTGlyphGlyf._getGlyphInstanceN)rJ   rK   rL   rx   r{   r|   r�   r   r   r   r   rV   È   s   	rV   c                   @   s   e Zd Zdd„ ZdS )r_   c                 C   s   | j j| j  || j j¡ dS rs   )re   r]   rm   rx   ra   rv   r   r   r   rx     s    z_TTGlyphCFF.drawN)rJ   rK   rL   rx   r   r   r   r   r_     s   r_   c                 C   sô   | j dkrJ| j}|| j}| |d¡}| j}| j}||  koD|kS   S | j dkrt| j}	|	|| j d 7 }	|	dkS | j dkr¢| jD ]}
t	|
|||ƒs„ dS q„dS | j dkrÐ| jD ]}
t	|
|||ƒr² dS q²dS | j dkrìt	| j
|||ƒ S dS d S )	Nr<   r   é   é   FTé   é   )ZFormatZ	AxisIndexr   r.   ZFilterRangeMinValueZFilterRangeMaxValueZDefaultValueZVarIdxÚConditionTableÚ_evaluateConditionZconditionTable)Ú	conditionÚfvarAxesr%   rb   Z	axisIndexr   Z	axisValueZminValueZmaxValuerc   Zsubconditionr   r   r   r“     s:    







   ÿr“   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ri   c                    sJ  ddl m}m} | j}|j}|jj | j¡}|j	j
| }ddlm}	 ddlm}
 |jd j‰ |	|jˆ | jjƒ}|jD �]Î}|j|j@ r¨|jj|j }t|ˆ | jj|ƒs¨qti }|jdk	�r,|jj|j }t|jƒ}|j|krî|t ||j dƒ7 }t!|ƒt!|ƒk�st"t!|ƒt!|ƒfƒ‚‡ fdd	„t#||ƒD ƒ}|j$|k�rT||j$ }t%|ƒ}| &|¡ |j'}|j|j(@ }| jj )||¡�È | j )||¡�® | j|j*k}|�sÎz| +|j*|| jj,¡ W n t-k
�rÌ   d
}Y nX |�r0| .¡ }|j*| jk�rð| jn|j}||j* }|�rt/||ƒ}| 0|¡ nt1||ƒ}| 2|¡ W 5 Q R X W 5 Q R X qtdS )rt   r   )ÚVarComponentFlagsÚNO_VARIATION_INDEX)ÚMultiVarStoreInstancerr   r   Né   c                    s   i | ]\}}ˆ | j |“qS r   r   )r   ÚiÚv©r•   r   r   r   i  s     z&_TTGlyphVARC._draw.<locals>.<dictcomp>T)3ZfontTools.ttLib.tables.otTablesr–   r—   re   rf   rg   rh   Úindexrm   ZVarCompositeGlyphsZVarCompositeGlyphZfontTools.varLib.multiVarStorer˜   r1   r    r"   r#   ZMultiVarStorer%   Ú
componentsÚflagsZHAVE_CONDITIONZConditionListr’   ZconditionIndexr“   ZaxisIndicesIndexZAxisIndicesListZItemr	   Ú
axisValuesZaxisValuesVarIndexÚfi2flrF   ÚAssertionErrorÚzipZtransformVarIndexr   ZapplyTransformDeltasÚ	transformZRESET_UNSPECIFIED_AXESr;   r@   ZaddVarComponentr&   ÚAttributeErrorZtoTransformr   r{   r   rx   )r3   rw   Z
isPointPenr–   r—   re   rj   Úidxr~   r˜   r    rb   Úcompr”   r%   ZaxisIndicesr    Zdeltasr¤   r6   ZshouldDecomposeÚtZcompGlyphSetÚgZtPenr   rœ   r   Ú_drawA  s„      ÿ   ÿ

þ
ÿ

  ÿ

ÿ
ý


z_TTGlyphVARC._drawc                 C   s   |   |d¡ d S )NF©rª   rv   r   r   r   rx   �  s    z_TTGlyphVARC.drawc                 C   s   |   |d¡ d S )NTr«   rv   r   r   r   r{   ’  s    z_TTGlyphVARC.drawPointsN)rJ   rK   rL   rª   rx   r{   r   r   r   r   ri   @  s   Nri   Tr   c                C   s8  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�n8| j	dkrÎt |ƒdksêt‚nt |ƒt | j
ƒksät‚|| _
|rø|  |¡ t|| ƒ}t|| ƒ}t| j| ƒ}t|| j ƒ}||||fS )Nr�   éüÿÿÿr   éýÿÿÿéþÿÿÿr<   éÿÿÿÿc                 S   s   g | ]}t |ƒ‘qS r   )r   )r   r§   r   r   r   Ú
<listcomp>£  s     z#_setCoordinates.<locals>.<listcomp>Úx)rF   r¢   rˆ   ZisCompositerž   r£   r‚   r±   ÚyZnumberOfContoursr‡   r   r
   r€   ZyMax)r~   ZcoordrQ   r   Z	leftSideXZ
rightSideXZtopSideYZbottomSideYrŠ   Úpr§   ZhorizontalAdvanceWidthZverticalAdvanceWidthZleftSideBearingZtopSideBearingr   r   r   r‰   –  s8    


ür‰   c                   @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚLerpGlyphSeta+  A glyphset that interpolates between two other glyphsets.

    Factor is typically between 0 and 1. 0 means the first glyphset,
    1 means the second glyphset, and 0.5 means the average of the
    two glyphsets. Other values are possible, and can be useful to
    extrapolate. Defaults to 0.5.
    ç      à?c                 C   s   || _ || _|| _d S r7   )Ú	glyphset1Ú	glyphset2Úfactor)r3   r¶   r·   r¸   r   r   r   r4   Å  s    zLerpGlyphSet.__init__c                 C   s*   || j kr|| jkrt|| ƒS t|ƒ‚d S r7   )r¶   r·   Ú	LerpGlyphÚKeyError©r3   Ú	glyphnamer   r   r   rW   Ê  s    
zLerpGlyphSet.__getitem__c                 C   s   || j ko|| jkS r7   )r¶   r·   r»   r   r   r   rA   Ï  s    zLerpGlyphSet.__contains__c                 C   s"   t | jƒ}t | jƒ}t| |¡ƒS r7   )Úsetr¶   r·   rB   Úintersection©r3   Zset1Zset2r   r   r   rE   Ò  s    

zLerpGlyphSet.__iter__c                 C   s"   t | jƒ}t | jƒ}t| |¡ƒS r7   )r½   r¶   r·   rF   r¾   r¿   r   r   r   rG   ×  s    

zLerpGlyphSet.__len__N)rµ   )	rJ   rK   rL   rM   r4   rW   rA   rE   rG   r   r   r   r   r´   ¼  s   
r´   c                   @   s   e Zd Zdd„ Zdd„ ZdS )r¹   c                 C   s   || _ || _d S r7   )Úglyphsetr¼   )r3   r¼   rÀ   r   r   r   r4   Þ  s    zLerpGlyph.__init__c                 C   sb   t | jjƒ}| jj| j  |¡ t | jjƒ}| jj| j  |¡ | jj}tt|j	|j	|ƒ|ƒ d S r7   )
r   rÀ   r¶   r¼   rx   r·   r¸   r   r   rc   )r3   rw   Z
recording1Z
recording2r¸   r   r   r   rx   â  s    zLerpGlyph.drawN)rJ   rK   rL   r4   rx   r   r   r   r   r¹   Ý  s   r¹   N)*rM   Úabcr   r   Úcollections.abcr   Ú
contextlibr   r   r   Útypesr   ZfontTools.misc.vectorr	   ZfontTools.misc.fixedToolsr
   r   r¡   ZfontTools.misc.loggingToolsr   ZfontTools.misc.transformr   r   ZfontTools.pens.transformPenr   r   ZfontTools.pens.recordingPenr   r   r   r   rP   rZ   rd   rk   rV   r_   r“   ri   r‰   r´   r¹   r   r   r   r   Ú<module>   s.   M
$,M#V&!