U
    #vhDD                     @   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 | _|rd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   >/tmp/pip-unpacked-wheel-1ufboor8/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}|sqj|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 qdS | j dkr| jD ]}
t	|
|||r dS qdS | j dkrt	| 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|sqti }|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}|sz|+|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|  rt |t | jksrtdd	 | jD | _t|| jD ]\}	}
t|
d
r|	\|
_|
_qn8| j	dkrt |dkstnt |t | j
kst|| _
|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&!