a
    Df3                     @   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 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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)SimpleNamespace)otRound)deprecateFunction)	Transform)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v r,dd | jd jD ni | _|d ur>|ni | _i | _|d urV|ni | _d| _g | _g | _	|| _
|d j| _t|ddd | _d | _|rddlm} t|d	d
d | _| jd ur|| jj|d j|| _d S )Nfvarc                 S   s   i | ]}|j d qS )r   )ZaxisTag).0Zaxis r   g/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/fontTools/ttLib/ttGlyphSet.py
<dictcomp>       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__   s.    
z_TTGlyphSet.__init__)resetc                 c   s   | j | j | j| j |r:| j | _| j | _n| j | _i | _| j| | j| z"d V  W | j 	 | _| j	 | _n| j 	 | _| j	 | _0 d S N)
r%   appendr!   r&   r"   r#   r   r    updatepop)r/   r!   r1   r   r   r   pushLocation4   s    z_TTGlyphSet.pushLocationc              	   c   sB   z,| j }|  j d7  _ |V  W |  j d8  _ n|  j d8  _ 0 d S )N   )r$   )r/   r$   r   r   r   	pushDepthG   s
    z_TTGlyphSet.pushDepthc                 C   s
   || j v S r2   r'   r/   	glyphNamer   r   r   __contains__P   s    z_TTGlyphSet.__contains__c                 C   s   t | j S r2   )iterr'   keysr/   r   r   r   __iter__S   s    z_TTGlyphSet.__iter__c                 C   s
   t | jS r2   )lenr'   r?   r   r   r   __len__V   s    z_TTGlyphSet.__len__z#use 'glyphName in glyphSet' instead)categoryc                 C   s
   || j v S r2   r9   r:   r   r   r   has_keyY   s    z_TTGlyphSet.has_keyN)__name__
__module____qualname____doc__r0   r   boolr6   r8   r<   r@   rB   r
   DeprecationWarningrD   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superr0   r*   	gvarTable)r/   r   r!   r   	__class__r   r   r0   a   s    
z_TTGlyphSetGlyf.__init__c                 C   s   t | || jdS )Nr   )_TTGlyphGlyfr   r:   r   r   r   __getitem__f   s    z_TTGlyphSetGlyf.__getitem__)TrE   rF   rG   r0   rR   __classcell__r   r   rO   r   rK   `   s   rK   c                       s$   e Zd Z fddZdd Z  ZS )_TTGlyphSetCFFc                    s   d|v rdnd}t || j d j| _t ||| j d | _|rddlm	} t
| jdd }|d ur||j|d j|}|j| _d S )NZCFF2zCFF r   r   varStorer   )listZcffvaluesZCharStringscharStringsrM   r0   blenderr-   r   r)   Z
otVarStorer   ZinterpolateFromDeltas)r/   r   r!   ZtableTagr   rV   Z	instancerrO   r   r   r0   k   s    z_TTGlyphSetCFF.__init__c                 C   s
   t | |S r2   )_TTGlyphCFFr:   r   r   r   rR   z   s    z_TTGlyphSetCFF.__getitem__rS   r   r   rO   r   rU   j   s   rU   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 urB|j| \| _| _nd\| _| _|j	r|j
d ur|j
jd u rv|j|n|j
jj| }|  j|j| 7  _d S )NNN)glyphSetnamer   r(   widthlsbr+   heighttsbr!   r,   ZAdvWidthMapr   Z
getGlyphIDmappingr.   )r/   r^   r;   r   Zvaridxr   r   r   r0      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.pointPenrl   rj   )r/   ri   rl   r   r   r   
drawPoints   s    z_TTGlyph.drawPointsN)rE   rF   rG   rH   r0   r   rj   rm   r   r   r   r   r\   ~   s
   	
r\   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )rQ   c                 C   sz   |   \}}| j P}|r d}| rF| ||d W d   dS ||| jj| W d   n1 sl0    Y  dS )rf   r   FN)_getGlyphAndOffsetr^   r8   isVarComposite_drawVarCompositerj   rL   r/   ri   glyphoffsetr$   r   r   r   rj      s    z_TTGlyphGlyf.drawc                 C   sz   |   \}}| j P}|r d}| rF| ||d W d   dS ||| jj| W d   n1 sl0    Y  dS )rk   r   TN)rn   r^   r8   ro   rp   rm   rL   rq   r   r   r   rm      s    z_TTGlyphGlyf.drawPointsc           	   
   C   s   ddl m}m} |jD ]}| j|j|j|j@  z|	|j
|j| jj W nZ ty   |j }|rt||}| j|j
 | nt||}| j|j
 | Y n0 W d    q1 s0    Y  qd S )Nr   )VarComponentFlagsVAR_COMPONENT_TRANSFORM_MAPPING)fontTools.ttLib.tables._g_l_y_frt   ru   
componentsr^   r6   r!   flagsZRESET_UNSPECIFIED_AXESZaddVarComponentr;   Z	transformr"   AttributeErrorZtoTransformr   rm   r   rj   )	r/   rr   ri   Z
isPointPenrt   ru   comptZtPenr   r   r   rp      s     



z_TTGlyphGlyf._drawVarCompositec                 C   sN   | j jr| j jd ur|  }n| j j| j }t|drB| j|j nd}||fS )NxMinr   )	r^   r!   rN   _getGlyphInstancerL   r_   hasattrra   r|   )r/   rr   rs   r   r   r   rn      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}|sqj|j}d |v r|d u r|| j
||\}}|d dkr|d nttt|d }||||}|	||| 7 }	qjt|| j
 }t||	|| jd\}}}}|| _|| _|jd u r>|| _|| _|S )Nr   )	iup_delta)GlyphCoordinates)supportScalarr]   r7   r   )ZfontTools.varLib.iupr   rv   r   ZfontTools.varLib.modelsr   r^   rL   rN   
variationsr_   r(   r+   Z_getCoordinatesAndControlsr!   r   coordinatesrW   rangerA   r   _setCoordinatesr   ra   rc   r,   r`   rb   )r/   r   r   r   r^   rL   r   r(   r+   r   _Z
origCoordsZendPtsvarZscalardeltacontrolrr   r`   ra   rb   rc   r   r   r   r}      sH    &
z_TTGlyphGlyf._getGlyphInstanceN)rE   rF   rG   rj   rm   rp   rn   r}   r   r   r   r   rQ      s
   	rQ   c                   @   s   e Zd Zdd ZdS )r[   c                 C   s   | j j| j || j j dS re   )r^   rY   r_   rj   rZ   rh   r   r   r   rj     s    z_TTGlyphCFF.drawN)rE   rF   rG   rj   r   r   r   r   r[     s   r[   Tr   c                C   sz  t |dksJ |d d }|d d }|d d }|d d }tdD ]
}|d= qH|  rt |t | jksrJ dd	 | jD | _t|| jD ]\}	}
t|
d
r|	\|
_|
_qnx|  rdd	 | jD | _| jD ]}
|
	|}q|rJ n>| j
dkrt |dks*J nt |t | jks$J || _|r:| | t|| }t|| }t| j| }t|| j }||||fS )N   r   r7   c                 S   s   g | ]}t |qS r   r   r   rz   r   r   r   
<listcomp>+  r   z#_setCoordinates.<locals>.<listcomp>xc                 S   s   g | ]}t |qS r   r   r   r   r   r   r   0  r   )rA   r   ZisCompositerw   zipr~   r   yro   ZsetCoordinatesZnumberOfContoursr   r   r	   r|   ZyMax)rr   ZcoordrL   r   Z	leftSideXZ
rightSideXZtopSideYZbottomSideYr   prz   ZhorizontalAdvanceWidthZverticalAdvanceWidthZleftSideBearingZtopSideBearingr   r   r   r     sB    



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 r2   )	glyphset1	glyphset2factor)r/   r   r   r   r   r   r   r0   R  s    zLerpGlyphSet.__init__c                 C   s*   || j v r|| jv rt|| S t|d S r2   )r   r   	LerpGlyphKeyErrorr/   	glyphnamer   r   r   rR   W  s    
zLerpGlyphSet.__getitem__c                 C   s   || j v o|| jv S r2   )r   r   r   r   r   r   r<   \  s    zLerpGlyphSet.__contains__c                 C   s"   t | j}t | j}t||S r2   )setr   r   r=   intersectionr/   Zset1Zset2r   r   r   r@   _  s    

zLerpGlyphSet.__iter__c                 C   s"   t | j}t | j}t||S r2   )r   r   r   rA   r   r   r   r   r   rB   d  s    

zLerpGlyphSet.__len__N)r   )	rE   rF   rG   rH   r0   rR   r<   r@   rB   r   r   r   r   r   I  s   
r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   || _ || _d S r2   )glyphsetr   )r/   r   r   r   r   r   r0   k  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 r2   )
r   r   r   r   rj   r   r   r   r   value)r/   ri   Z
recording1Z
recording2r   r   r   r   rj   o  s    zLerpGlyph.drawN)rE   rF   rG   r0   rj   r   r   r   r   r   j  s   r   N)!rH   abcr   r   collections.abcr   
contextlibr   r   typesr   ZfontTools.misc.fixedToolsr	   ZfontTools.misc.loggingToolsr
   ZfontTools.misc.transformr   ZfontTools.pens.transformPenr   r   ZfontTools.pens.recordingPenr   r   r   r   rK   rU   r\   rQ   r[   r   r   r   r   r   r   r   <module>   s&   M
,l+!