o
    l^Uf                      @   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    )Zkvr   r   >lib/python3.10/site-packages/fontTools/varLib/multiVarStore.py<lambda>   s    z!_getLocationKey.<locals>.<lambda>)key)tuplesorteditems)locr   r   r   _getLocationKey   s   r   c                   @   sR   e Zd Zdd Zdd Zdd Zd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(   Z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.setSupportsTc                 C   s&   t | jj| j_t | jj| j_| jS r   )lenr    RegionZRegionCountr!   MultiVarDataZMultiVarDataCount)r(   optimizer   r   r   finish5   s   z!OnlineMultiVarStoreBuilder.finishc           
      C   s$  | j }| j}| j}g }|D ])}t|}||}|d u r1t|| j}t|j }||< |j	| |	| qt
|}| j|}	|	d ur_|	| _| jj|	 | _| j| | _t| jjdkr_d }	|	d u rt|g | _t| jj| _| jj	| j | j| j|< || jvri | j|< | j| | _d S d S )N  )r   r    r$   r   getr
   r   r.   r/   appendr   r%   _outerr!   r0   r"   r&   r'   Itemr   )
r(   Z	regionMapZ
regionListZregionsZregionIndicesregionr   idxZ	varRegionZ
varDataIdxr   r   r   _add_MultiVarData:   s:   


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s!|   | j|}|d ur-|S t| jj}|dkrB|   | j	|t
dS | jj|t
d | jd> | }|| j|< |S )Nc                 3       | ]} |V  qd S r   r   .0dr;   r   r   	<genexpr>c       z9OnlineMultiVarStoreBuilder.storeDeltas.<locals>.<genexpr>c                 s   s    | ]}t |V  qd S r   )r   rC   r   r   r   rF   h   rG   r3   r;      )r   anyNO_VARIATION_INDEXr"   r:   r'   r4   r.   r7   r>   r   addItemr6   )r(   r?   r<   Zdeltas_tupleZvarIdxinnerr   r;   r   r>   b   s"   
z&OnlineMultiVarStoreBuilder.storeDeltasN)T)__name__
__module____qualname__r)   r,   r*   r2   r:   r<   rA   r>   r   r   r   r   r      s    
#r   r;   c                   s\   t  fdd|D }t|| jksJ g }|D ]}|| q| j| t| j| _d S )Nc                 3   rB   r   r   rC   r;   r   r   rF   ~   rG   z'MultiVarData_addItem.<locals>.<genexpr>)r   r.   ZVarRegionCountextendr7   r5   Z	ItemCount)r(   r?   r<   valuesrE   r   r;   r   MultiVarData_addItem}   s   rR   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)rD   Zreg	fvar_axesr   r   
<dictcomp>   s    z/SparseVarRegion_get_support.<locals>.<dictcomp>)ZSparseVarRegionAxis)r(   rT   r   rS   r   SparseVarRegion_get_support   s   
rV   c                 C   s
   t | jS r   )boolr0   r(   r   r   r   MultiVarStore___bool__      
rY   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 u s|jdksJ |r|jng | _|r|jjng | _| | d S )N   )rT   ZFormatr0   _varDataSparseVarRegionListr/   _regionssetLocation)r(   ZmultivarstorerT   locationr   r   r   r)      s   zMultiVarStoreInstancer.__init__c                 C   s   t || _|   d S r   )dictra   _clearCaches)r(   ra   r   r   r   r`      s   
z"MultiVarStoreInstancer.setLocationc                 C   s
   i | _ d S r   )_scalarsrX   r   r   r   rc      rZ   z#MultiVarStoreInstancer._clearCachesc                 C   s@   | j |}|d u r| j| | j}t| j|}|| j |< |S r   )rd   r4   r_   get_supportrT   r   ra   )r(   	regionIdxZscalarsupportr   r   r   
_getScalar   s   
z!MultiVarStoreInstancer._getScalarc                 C   s   | st g S t| t| dksJ t| t|ft| t| }t dg| }tt| ||D ]\}}|s8q1|t || 7 }q1|S r   )r   r.   zipr   )r?   scalarsmZdeltarE   sr   r   r   interpolateFromDeltasAndScalars   s   (z6MultiVarStoreInstancer.interpolateFromDeltasAndScalarsc                    sZ   |d? |d@ }}|t krtg S  j} fdd|| jD }|| j| } ||S )NrH   r3   c                       g | ]}  |qS r   rh   rD   ZrirX   r   r   
<listcomp>       z6MultiVarStoreInstancer.__getitem__.<locals>.<listcomp>)rJ   r   r]   VarRegionIndexr7   rm   )r(   ZvaridxmajorminorvarDatarj   r?   r   rX   r   __getitem__   s   z"MultiVarStoreInstancer.__getitem__c                    s*    j } fdd|| jD } ||S )Nc                    rn   r   ro   rp   rX   r   r   rq      rr   z@MultiVarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>)r]   rs   rm   )r(   ZvarDataIndexr?   rv   rj   r   rX   r   interpolateFromDeltas   s   z,MultiVarStoreInstancer.interpolateFromDeltasN)rM   rN   rO   r)   r`   rc   rh   staticmethodrm   rw   rx   r   r   r   r   r[      s    	
	r[   c                 C   s   t jj| |ddS )Nr0   )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 )Nr0   r^   )rz   ZVarRegionList)r{   r|   prune_regionsrX   r   r   r   MultiVarStore_prune_regions   s   r   c                 C   s>   g }| j | }|jD ]}| jj| }||}|| q
|S r   )r0   rs   r^   r/   re   r5   )r(   rt   ZfvarAxesr+   rv   rf   r8   rg   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      
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   r   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   rJ   ZMultiVarStorer   objectr   r<   rR   r0   rK   rV   ZSparseVarRegionre   rY   __bool__r[   r~   r   r   r}   r   Zget_supportsr   r   ZVARCZcollect_varidxesZremap_varidxesr   r   r   r   <module>   s@    a5
