U
    #vhq                      @   sX  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lmZmZmZ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 e	jZee	j_dd ZG dd de Z!e"dddZ#e#e	j$_%dd Z&e&e	j'_(dd Z)e)e	j_*G dd de Z+dd Z,dd Z-e-e	j_.e,e	j_/dd Z0e0e	j_1dd  Z2d!d" Z3e2e	j4_5e3e	j4_6dS )#    )noRoundotRound)	bit_count)Vector)otTables)supportScalarN)buildVarRegionListbuildSparseVarRegionListbuildSparseVarRegionbuildMultiVarStorebuildMultiVarData)batched)partial)defaultdict)heappushheappopc                 C   s   t t|  dd dS )Nc                 S   s   | d S Nr    )kvr   r   B/tmp/pip-unpacked-wheel-1ufboor8/fontTools/varLib/multiVarStore.py<lambda>       z!_getLocationKey.<locals>.<lambda>)key)tuplesorteditems)locr   r   r   _getLocationKey   s    r   c                   @   sP   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZedddZ	edddZ
dS )OnlineMultiVarStoreBuilderc                 C   sN   || _ i | _tg || _t| jg | _d | _d | _d | _i | _	i | _
d | _d S N)	_axisTags
_regionMapr	   _regionListr   _store_data_model	_supports_varDataIndices_varDataCaches_cache)selfZaxisTagsr   r   r   __init__   s    z#OnlineMultiVarStoreBuilder.__init__c                 C   s   |  |j || _d S r   )setSupportssupportsr%   )r*   modelr   r   r   setModel)   s    z#OnlineMultiVarStoreBuilder.setModelc                 C   s2   d | _ t|| _| jd s"| jd= d | _d | _d S r   )r%   listr&   r)   r$   )r*   r-   r   r   r   r,   -   s    

z&OnlineMultiVarStoreBuilder.setSupportsc                 C   s&   t | jj| j_t | jj| j_| jS r   )lenr"   RegionZRegionCountr#   MultiVarDataZMultiVarDataCountr*   r   r   r   finish5   s    z!OnlineMultiVarStoreBuilder.finishc           
      C   s$  | j }| j}| j}g }|D ]R}t|}||}|d krbt|| j}t|j }||< |j	| |	| qt
|}| j|}	|	d k	r|	| _| jj|	 | _| j| | _t| jjdkrd }	|	d kr t|g | _t| jj| _| jj	| j | j| j|< || jkri | j|< | j| | _d S )N  )r!   r"   r&   r   getr
   r    r1   r2   appendr   r'   _outerr#   r3   r$   r(   r)   Itemr   )
r*   Z	regionMapZ
regionListZregionsZregionIndicesregionr   idxZ	varRegionZ
varDataIdxr   r   r   _add_MultiVarData:   s8    


z,OnlineMultiVarStoreBuilder._add_MultiVarDataroundc                C   s,   | j j||d}|d}|| j|tdfS )Nr>   r   )r%   Z	getDeltaspopstoreDeltasr   )r*   Zmaster_valuesr?   deltasbaser   r   r   storeMasters]   s    
z'OnlineMultiVarStoreBuilder.storeMastersc                   s   t  fdd|D }t|s"tS t dd |D }| jsB|   | j|}|d k	rZ|S t| jj}|dkr|   | j	|t
dS | jj|t
d | jd> | }|| j|< |S )Nc                 3   s   | ]} |V  qd S r   r   .0dr>   r   r   	<genexpr>c   s     z9OnlineMultiVarStoreBuilder.storeDeltas.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S r   )r   rE   r   r   r   rH   h   s     r6   r>      )r   anyNO_VARIATION_INDEXr$   r=   r)   r7   r1   r:   rA   r   addItemr9   )r*   rB   r?   Zdeltas_tupleZvarIdxinnerr   r>   r   rA   b   s"    
z&OnlineMultiVarStoreBuilder.storeDeltasN)__name__
__module____qualname__r+   r/   r,   r5   r=   r?   rD   rA   r   r   r   r   r      s   #r   r>   c                   s\   t  fdd|D }t|| jks(tg }|D ]}|| q0| j| t| j| _d S )Nc                 3   s   | ]} |V  qd S r   r   rE   r>   r   r   rH   ~   s     z'MultiVarData_addItem.<locals>.<genexpr>)r   r1   ZVarRegionCountAssertionErrorextendr:   r8   Z	ItemCount)r*   rB   r?   valuesrG   r   r>   r   MultiVarData_addItem}   s    rT   c                    s    fdd| j D S )Nc                    s&   i | ]} |j  j|j|j|jfqS r   )Z	AxisIndexZaxisTagZ
StartCoordZ	PeakCoordZEndCoord)rF   reg	fvar_axesr   r   
<dictcomp>   s   
 z/SparseVarRegion_get_support.<locals>.<dictcomp>)ZSparseVarRegionAxis)r*   rW   r   rV   r   SparseVarRegion_get_support   s    
rY   c                 C   s
   t | jS r   )boolr3   r4   r   r   r   MultiVarStore___bool__   s    r[   c                   @   sL   e Zd Zi fddZdd Zdd Zdd Zed	d
 Zdd Z	dd Z
dS )MultiVarStoreInstancerc                 C   sL   || _ |d ks|jdkst|r&|jng | _|r8|jjng | _| | d S )N   )	rW   ZFormatrQ   r3   _varDataSparseVarRegionListr2   _regionssetLocation)r*   ZmultivarstorerW   locationr   r   r   r+      s    zMultiVarStoreInstancer.__init__c                 C   s   t || _|   d S r   )dictrb   _clearCaches)r*   rb   r   r   r   ra      s    
z"MultiVarStoreInstancer.setLocationc                 C   s
   i | _ d S r   )_scalarsr4   r   r   r   rd      s    z#MultiVarStoreInstancer._clearCachesc                 C   s@   | j |}|d kr<| j| | j}t| j|}|| j |< |S r   )re   r7   r`   get_supportrW   r   rb   )r*   	regionIdxZscalarsupportr   r   r   
_getScalar   s    
z!MultiVarStoreInstancer._getScalarc                 C   s   | st g S t| t| dks4tt| t|ft| t| }t dg| }tt| ||D ]\}}|spqb|t || 7 }qb|S r   )r   r1   rQ   zipr   )rB   scalarsmdeltarG   sr   r   r   interpolateFromDeltasAndScalars   s    (z6MultiVarStoreInstancer.interpolateFromDeltasAndScalarsc                    sZ   |d? |d@  }}|t kr"tg S  j} fdd|| jD }|| j| } ||S )NrI   r6   c                    s   g | ]}  |qS r   ri   rF   rir4   r   r   
<listcomp>   s     z6MultiVarStoreInstancer.__getitem__.<locals>.<listcomp>)rK   r   r^   VarRegionIndexr:   ro   )r*   ZvaridxmajorminorvarDatark   rB   r   r4   r   __getitem__   s    z"MultiVarStoreInstancer.__getitem__c                    s*    j } fdd|| jD } ||S )Nc                    s   g | ]}  |qS r   rp   rq   r4   r   r   rs      s     z@MultiVarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>)r^   rt   ro   )r*   ZvarDataIndexrB   rw   rk   r   r4   r   interpolateFromDeltas   s    z,MultiVarStoreInstancer.interpolateFromDeltasN)rN   rO   rP   r+   ra   rd   ri   staticmethodro   rx   ry   r   r   r   r   r\      s   	
	r\   c                 C   s   t jj| |ddS )Nr3   )VarData)otVarStoresubset_varidxes)r*   ZvarIdxesr   r   r   MultiVarStore_subset_varidxes   s    r   c                 C   s   t jj| dddS )Nr3   r_   )r{   ZVarRegionList)r|   r}   prune_regionsr4   r   r   r   MultiVarStore_prune_regions   s
      r   c                 C   s>   g }| j | }|jD ]$}| jj| }||}|| q|S r   )r3   rt   r_   r2   rf   r8   )r*   ru   ZfvarAxesr-   rw   rg   r;   rh   r   r   r   MultiVarStore_get_supports   s    


r   c                 C   s6   | j jD ](}|jD ]}||j ||j qqd S r   )VarCompositeGlyphsVarCompositeGlyph
componentsaddaxisValuesVarIndextransformVarIndex)r*   Zvaridxesglyph	componentr   r   r   VARC_collect_varidxes   s    
r   c                 C   s6   | j jD ](}|jD ]}||j |_||j |_qqd S r   )r   r   r   r   r   )r*   Zvaridxes_mapr   r   r   r   r   VARC_remap_varidxes   s    
r   )7ZfontTools.misc.roundToolsr   r   ZfontTools.misc.intToolsr   ZfontTools.misc.vectorr   ZfontTools.ttLib.tablesr   r|   ZfontTools.varLib.modelsr   ZfontTools.varLib.varStoreZ	fontToolsZfontTools.varLib.builderr   r	   r
   r   r   ZfontTools.misc.iterToolsr   	functoolsr   collectionsr   heapqr   r   rK   ZMultiVarStorer   objectr   r?   rT   r3   rL   rY   ZSparseVarRegionrf   r[   __bool__r\   r   r   r   r~   r   Zget_supportsr   r   ZVARCZcollect_varidxesZremap_varidxesr   r   r   r   <module>   s>   a5
