U
    Q»{j^  ã                   @   sæ  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mZmZ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e%ƒ fddœdd„Z&e&ej_'dddœdd„Z(e(ej_)d d!„ Z*d"d#„ Z+d$d%„ Z,e,ej-_.e,ej/_.d&d'„ Z0d(d)„ Z1e1ej-_2e1ej/_2G d*d+„ d+eƒZ3G d,d-„ d-e4ƒZ5d5d/d0„Z6e6ej_7d6d2d3„Z8e9d4k�râd d1l:Z:e;e:j<ƒd.k�rÊe: =e8ƒ ¡ d d1l>Z>e: =e> ?¡ j@¡ d1S )7é    )ÚnoRoundÚotRound©Ú	bit_count)ÚotTables)ÚsupportScalar)ÚbuildVarRegionListÚbuildVarStoreÚbuildVarRegionÚbuildVarData)Úpartial)Údefaultdict)ÚheappushÚheappopc                 C   s   t t|  ¡ dd„ d�ƒS )Nc                 S   s   | d S ©Nr   © )Úkvr   r   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/varLib/varStore.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d	„Zddd„Zedœdd„Z	edœdd„Z
edœdd„Zedœdd„ZdS )ÚOnlineVarStoreBuilderc                 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OnlineVarStoreBuilder.__init__c                 C   s   |   |j¡ || _d S r   )ÚsetSupportsÚsupportsr$   )r)   Úmodelr   r   r   ÚsetModel%   s    zOnlineVarStoreBuilder.setModelc                 C   s8   d | _ t|ƒ| _| jr(| jd s(| jd= d | _d | _d S r   )r$   Úlistr%   r(   r#   )r)   r,   r   r   r   r+   )   s    
z!OnlineVarStoreBuilder.setSupportsTc                 C   sL   t | jjƒ| j_t | jjƒ| j_| jjD ]}t |jƒ|_|j	|d� q(| jS )N©Úoptimize)
Úlenr!   ÚRegionÚRegionCountr"   ÚVarDataÚVarDataCountÚItemÚ	ItemCountÚcalculateNumShorts)r)   r1   Údatar   r   r   Úfinish1   s    zOnlineVarStoreBuilder.finishé   c                 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rÂd }
|
d k�r(t|g dd�| _t| jjƒ| _| jj 	| j¡ | j| j|< || jk�ri | j|< | j| | _d S )Néÿÿ  Fr0   )r    r!   r%   r   Úgetr
   r   r2   r3   Úappendr   r&   Ú_outerr"   r5   r#   r'   r(   r7   r   )r)   Ú	num_itemsÚ	regionMapÚ
regionListÚregionsÚregionIndicesÚregionr   ÚidxZ	varRegionZ
varDataIdxr   r   r   Ú_add_VarData9   s8    


z"OnlineVarStoreBuilder._add_VarData©Úroundc                C   s,   | j j||d�}| d¡}|| j|td�fS )NrI   r   )r$   Ú	getDeltasÚpopÚstoreDeltasr   )r)   Úmaster_valuesrJ   ÚdeltasÚbaser   r   r   ÚstoreMasters\   s    
z"OnlineVarStoreBuilder.storeMastersc                   s4   ‡ ‡fdd„|D ƒ}dd„ |D ƒ}|ˆj |td�fS )Nc                    s   g | ]}ˆj j|ˆ d �‘qS )rI   )r$   rK   )Ú.0rN   ©rJ   r)   r   r   Ú
<listcomp>b   s   ÿz:OnlineVarStoreBuilder.storeMastersMany.<locals>.<listcomp>c                 S   s   g | ]}|  d ¡‘qS ©r   )rL   ©rR   rO   r   r   r   rT   f   s     rI   )ÚstoreDeltasManyr   )r)   Zmaster_values_listrJ   Údeltas_listZ	base_listr   rS   r   ÚstoreMastersManya   s
    þz&OnlineVarStoreBuilder.storeMastersManyc                   sÔ   ‡ fdd„|D ƒ}t |ƒt | jƒd kr:t|dd … ƒ}nt |ƒt | jƒksPt‚t|ƒ}| jsf|  ¡  | j |¡}|d k	r~|S t | jjƒ}|dkr¨|  ¡  | j	|t
d�S | jj|t
d� | jd> | }|| j|< |S )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   ©rR   ÚdrI   r   r   rT   j   s     z5OnlineVarStoreBuilder.storeDeltas.<locals>.<listcomp>r<   r=   rI   é   )r2   r%   r   ÚAssertionErrorr#   rH   r(   r>   r7   rM   r   ÚaddItemr@   )r)   rO   rJ   ÚvarIdxÚinnerr   rI   r   rM   i   s$    
z!OnlineVarStoreBuilder.storeDeltasc                   sâ   ‡ fdd„|D ƒ}t dd„ |D ƒƒ}| js8|  t|ƒ¡ | j |¡}|d k	rP|S t| jjƒ}|t|ƒ dkrˆ|  t|ƒ¡ | j|td�S t	|ƒD ]4\}}| jj
|td� | jd> | | }|| j|< q�| jd> | }|| j|< |S )Nc                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    s   g | ]}ˆ |ƒ‘qS r   r   rZ   rI   r   r   rT   „   s     zDOnlineVarStoreBuilder.storeDeltasMany.<locals>.<listcomp>.<listcomp>r   rV   rI   r   r   rT   „   s     z9OnlineVarStoreBuilder.storeDeltasMany.<locals>.<listcomp>c                 s   s   | ]}t |ƒV  qd S r   )r   rV   r   r   r   Ú	<genexpr>…   s     z8OnlineVarStoreBuilder.storeDeltasMany.<locals>.<genexpr>r=   rI   r\   )r   r#   rH   r2   r(   r>   r7   rW   r   Ú	enumerater^   r@   )r)   rX   rJ   r_   r`   ÚirO   r   rI   r   rW   ƒ   s$    
z%OnlineVarStoreBuilder.storeDeltasManyN)T)r<   )Ú__name__Ú
__module__Ú__qualname__r*   r.   r+   r;   rH   rJ   rQ   rY   rM   rW   r   r   r   r   r      s   

#r   rI   c                   sv   ‡ fdd„|D ƒ}| j }t|ƒ}|d |kr>t|dd … ƒ}n||ksRt||fƒ‚t|ƒ}| j |¡ t| jƒ| _d S )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   rZ   rI   r   r   rT       s     z#VarData_addItem.<locals>.<listcomp>r<   )ÚVarRegionCountr2   r/   r]   r7   r?   r8   )r)   rO   rJ   ZcountUsZ	countThemr   rI   r   ÚVarData_addItemŸ   s    rh   c                    s   ‡ fdd„t | jƒD ƒS )Nc                    s2   i | ]*\}}|j d krˆ | j|j|j |jf“qS rU   )Z	PeakCoordZaxisTagZ
StartCoordZEndCoord)rR   rc   Úreg©Ú	fvar_axesr   r   Ú
<dictcomp>±   s   
þ z)VarRegion_get_support.<locals>.<dictcomp>)rb   ZVarRegionAxis)r)   rk   r   rj   r   ÚVarRegion_get_support°   s    
þrm   c                 C   s
   t | jƒS r   )Úboolr5   ©r)   r   r   r   ÚVarStore___bool__»   s    rp   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 )ÚVarStoreInstancerc                 C   sL   || _ |d ks|jdkst‚|r&|jng | _|r8|jjng | _|  |¡ d S )Nr<   )	rk   ZFormatr]   r5   Ú_varDataÚVarRegionListr3   Ú_regionsÚsetLocation)r)   Zvarstorerk   Úlocationr   r   r   r*   Ã   s
    zVarStoreInstancer.__init__c                 C   s   t |ƒ| _|  ¡  d S r   )Údictrv   Ú_clearCaches)r)   rv   r   r   r   ru   Ê   s    
zVarStoreInstancer.setLocationc                 C   s
   i | _ d S r   )Ú_scalarsro   r   r   r   rx   Î   s    zVarStoreInstancer._clearCachesc                 C   s@   | j  |¡}|d kr<| j|  | j¡}t| j|ƒ}|| j |< |S r   )ry   r>   rt   Úget_supportrk   r   rv   )r)   Ú	regionIdxZscalarZsupportr   r   r   Ú
_getScalarÑ   s    
zVarStoreInstancer._getScalarc                 C   s.   d}t | |ƒD ]\}}|sq||| 7 }q|S )Nç        )Úzip)rO   ÚscalarsÚdeltar[   Úsr   r   r   ÚinterpolateFromDeltasAndScalarsÙ   s    z1VarStoreInstancer.interpolateFromDeltasAndScalarsc                    sV   |d? |d@  }}|t krdS ˆ j}‡ fdd„|| jD ƒ}|| j| }ˆ  ||¡S )Nr\   r=   r}   c                    s   g | ]}ˆ   |¡‘qS r   ©r|   ©rR   Úriro   r   r   rT   ç   s     z1VarStoreInstancer.__getitem__.<locals>.<listcomp>)ÚNO_VARIATION_INDEXrr   ÚVarRegionIndexr7   r‚   )r)   ZvaridxÚmajorÚminorÚvarDatar   rO   r   ro   r   Ú__getitem__â   s    zVarStoreInstancer.__getitem__c                    s*   ˆ j }‡ fdd„|| jD ƒ}ˆ  ||¡S )Nc                    s   g | ]}ˆ   |¡‘qS r   rƒ   r„   ro   r   r   rT   í   s     z;VarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>)rr   r‡   r‚   )r)   ZvarDataIndexrO   rŠ   r   r   ro   r   ÚinterpolateFromDeltasë   s    z'VarStoreInstancer.interpolateFromDeltasN)rd   re   rf   r*   ru   rx   r|   Ústaticmethodr‚   r‹   rŒ   r   r   r   r   rq   Â   s   
	rq   TFr5   )r5   c                C   sš  t tƒ}|D ],}|tkrq|d? }|d@ }	||  |	¡ q~t| |ƒ}
g }tti}t|
ƒD �]\}}| |¡}|d krxqZt|ƒ}| |¡ |j	}g }|dkrä|rät
t|ƒƒD ]4}	| |	|krÄ||	 ndgt||	 ƒ ¡ |	||	< q¬nb|dk�rt|ƒt|| ƒ }nt|ƒ}|D ]4}	t|ƒ}| ||	 ¡ |d> | ||d> |	 < �q||_	t|j	ƒ|_|dkrZ|j|d� qZt| ||ƒ t| |d t|ƒƒ |  ¡  |S )Nr\   r=   r   r5   r0   ZCount)r   Úsetr†   ÚaddÚgetattrrb   r>   r2   r?   r7   Úranger   r8   r9   ÚsetattrÚprune_regions)r)   ZvarIdxesr1   ZretainFirstMapZadvIdxesr5   Úusedr_   rˆ   r‰   rŠ   Z
newVarDataZ
varDataMapr:   Z
usedMinorsZnewMajorr   ZnewItemsZminorsZnewMinorr   r   r   ÚVarStore_subset_varidxesø   sP    



 ÿ
r•   rs   )r5   rs   c          	         sž   t ƒ }t| |ƒD ]}| |j¡ qt| |ƒ}|j}g }i ‰ t|ƒD ]}t|ƒˆ |< | || ¡ qB||_t|jƒ|_t| |ƒD ]}‡ fdd„|jD ƒ|_q~dS )zRemove unused VarRegions.c                    s   g | ]}ˆ | ‘qS r   r   )rR   rc   ©rB   r   r   rT   R  s     z*VarStore_prune_regions.<locals>.<listcomp>N)	rŽ   r�   Úupdater‡   r3   r   r2   r?   r4   )	r)   r5   rs   ZusedRegionsr:   rC   rD   Z
newRegionsrc   r   r–   r   ÚVarStore_prune_regions<  s    
r˜   c                 C   s¦   t | ƒtjkr|| ƒ nŠt| tƒr8| D ]}t||ƒ q&njt| dƒr|t| dƒs||  ¡ D ]$}t| |j	dƒ}|dk	rTt||ƒ qTn&t| tj
ƒr¢| j ¡ D ]}t||ƒ q’dS )zqRecurse down from self, if type of an object is ot.Device,
    call func() on it.  Works on otData-style classes.ÚgetConvertersZpostReadN)ÚtypeÚotZDeviceÚ
isinstancer/   Ú_visitÚhasattrr™   r�   ÚnameZValueRecordÚ__dict__Úvalues)r)   ÚfuncÚthatÚconvr   r   r   r�   X  s    

r�   c                 C   s$   | j dkr | | jd> | j ¡ dS )z6Add VarIdx in this Device table (if any) to the set s.é €  r\   N)ÚDeltaFormatr�   Ú	StartSizeÚEndSize)r)   r�   r   r   r   Ú_Device_recordVarIdxn  s    
r©   c                 C   s   t t|d�}t| |ƒ d S )N)r�   )r   r©   r�   )r)   ZvaridxesZadderr   r   r   ÚObject_collect_device_varidxest  s    rª   c                 C   sT   t | ƒ|krdS | t | ƒ¡ | jdkrP|| jd> | j  }|d? | _|d@ | _dS )z9Map VarIdx in this Device table (if any) through mapping.Nr¥   r\   r=   )Úidr�   r¦   r§   r¨   )r)   ÚmappingÚdoner_   r   r   r   Ú_Device_mapVarIdx}  s    

r®   c                 C   s   t t|tƒ d�}t| |ƒ d S )N)r¬   r­   )r   r®   rŽ   r�   )r)   Zvaridxes_mapZmapperr   r   r   ÚObject_remap_device_varidxesˆ  s    r¯   c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	dd„ Z
dS )Ú	_Encodingc                 C   s6   || _ t|ƒ| _|  |¡| _|  | j¡| _tƒ | _d S r   )	Úcharsr   ÚwidthÚ_columnsÚcolumnsÚ_characteristic_overheadÚoverheadrŽ   r   )r)   r±   r   r   r   r*   ’  s
    
z_Encoding.__init__c                 C   s   | j  |¡ d S r   )r   r�   )r)   Úrowr   r   r   r?   ™  s    z_Encoding.appendc                 C   s   | j  |¡ d S r   )r   r—   )r)   Úlstr   r   r   Úextendœ  s    z_Encoding.extendc                 C   s   | j | jfS r   )r²   r±   ro   r   r   r   Úwidth_sort_keyŸ  s    z_Encoding.width_sort_keyc                 C   s   d}|t | ƒd 7 }|S )zOReturns overhead in bytes of encoding this characteristic
        as a VarData.é
   é   r   )r´   Úcr   r   r   rµ   ¢  s    z"_Encoding._characteristic_overheadc                 C   s2   d}d}| r.| d@ r||O }| dL } |dK }q|S )Nr   r<   é   é   r   )r±   Úcolsrc   r   r   r   r³   ª  s    
z_Encoding._columnsc                 C   sh   |j | j B }t|ƒ}| j|jB }t |¡}| j
 |j | || j t| jƒ  ||j t|jƒ  }|S r   )	r±   r   r´   r°   rµ   r¶   r²   r2   r   )r)   Úother_encodingÚcombined_charsZcombined_widthZcombined_columnsZcombined_overheadZcombined_gainr   r   r   Úgain_from_mergingµ  s    
ÿþýüÿz_Encoding.gain_from_mergingN)rd   re   rf   r*   r?   r¹   rº   r�   rµ   r³   rÃ   r   r   r   r   r°   ‘  s   


r°   c                   @   s(   e Zd Zdd„ Zdd„ Zedd„ ƒZdS )Ú_EncodingDictc                 C   s   t |ƒ }| |< |S r   )r°   )r)   r±   Úrr   r   r   Ú__missing__Å  s    z_EncodingDict.__missing__c                 C   s   |   |¡}| |  |¡ d S r   )Ú_row_characteristicsr?   )r)   r·   r±   r   r   r   Úadd_rowÉ  s    
z_EncodingDict.add_rowc                 C   s¾   d}d}d}| D ]X}|r ||7 }d|  kr4dksBn ||d 7 }d|  krVdks`n d	} qj|d
K }q|rºd}d}| D ]>}|rŽ||d 7 }d|  kr¢dks°n ||d 7 }|d
K }qz|S )z+Returns encoding characteristics for a row.Fr   r<   i€ÿÿÿé   r¼   i €ÿÿiÿ  Tr¿   é   é   r   )r·   Z	longWordsr±   rc   Úvr   r   r   rÇ   Í  s,    

z"_EncodingDict._row_characteristicsN)rd   re   rf   rÆ   rÈ   r�   rÇ   r   r   r   r   rÄ   Ä  s   rÄ   r<   c              	   C   s¤  t | jjƒ}dg| }i }tƒ }t| jƒD ]È\}}|j}	t|jƒD ]®\}
}t|ƒ}|dkr€t	|	|ƒD ]\}}||  |7  < qdn0t	|	|ƒD ]$\}}||  t
|| ƒ| 7  < qŠt|ƒ}|rÖt|ƒsÖd||d> |
 < qB| |¡ |||d> |
 < qBq*t| ¡ tjd�}~g }t|ƒD ]R\}}t|d t |ƒƒD ]4}|| }| |¡}|dk�r.t|| ||fƒ �q.�q|�rht|ƒ\}}}|| dk�sh|| dk�rœ�qh|| ||  }}d\||< ||< |j|jB }t|ƒ}| |j¡ | |j¡ t|ƒD ]f\}}|dk�r�qò|j|k�r,| |j¡ d||< �qò| |¡}|dk�ròt|| |t |ƒfƒ �qò| |¡ �qhdd„ |D ƒ}i }|jtjd� g | _|D ]�}t|jƒ}|�r’t | jƒ}t ¡ }| j |¡ t|ƒ|_t |jƒ|_|dd	… |d	d…  |_}t|jƒD ]\}
}|d> |
 ||< �q �q �q’tti}| ¡ D ]$\}}|dk	�rN|| nt||< �q4t | jjƒ| j_t | jƒ| _| jD ]}t |jƒ|_ | !¡  �q||  "¡  |S )
z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   r<   Nr\   r   )NNc                 S   s   g | ]}|d k	r|‘qS r   r   )rR   Úencodingr   r   r   rT   …  s      z%VarStore_optimize.<locals>.<listcomp>r=   )#r2   rs   r3   rÄ   rb   r5   r‡   r7   r/   r~   rJ   r   ÚanyrÈ   r   r¡   r°   rº   r‘   rÃ   r   r   r±   r¹   r   r?   Úsortr›   rg   r†   r4   r6   r8   r1   r“   )r)   Zuse_NO_VARIATION_INDEXÚquantizationÚnZzeroesZfront_mappingÚ	encodingsrˆ   r:   rE   r‰   Úitemr·   r{   rÌ   ÚtodoÚheaprc   rÍ   ÚjrÁ   Zcombining_gainÚ_rÂ   Zcombined_encodingÚkÚencZback_mappingr   Ú
varidx_mapr   r   r   ÚVarStore_optimizeì  s˜    L
ÿ









rÛ   Nc                 C   sB  ddl m} ddlm} ddlm} ddlm} |dtj	d�}|j
dtd	d
� | 
d¡ |j
ddd� | | ¡}|dd� |j}|j}|j}	||ƒ}
|
d }|jj}|ƒ }| ||
¡ t| ¡ ƒ}td| ƒ |j|d�}|ƒ }| ||
¡ t| ¡ ƒ}td| ƒ |	dk	�r>|j |¡ d|
k�r4|
d j |¡ |
 |	¡ dS )z&Optimize a font's GDEF variation storer   )ÚArgumentParser)ÚconfigLogger)ÚTTFont)ÚOTTableWriterzvarLib.varStore)ÚprogÚdescriptionz--quantizationr<   )rš   ÚdefaultÚfontfileÚoutfileú?)ÚnargsÚINFO)ÚlevelÚGDEFzBefore: %7d bytes)rÐ   zAfter:  %7d bytesNÚGPOS)ÚargparserÜ   Z	fontToolsrÝ   ZfontTools.ttLibrÞ   ZfontTools.ttLib.tables.otBaserß   ÚmainÚ__doc__Úadd_argumentÚintÚ
parse_argsrÐ   rã   rä   ÚtableÚVarStoreÚcompiler2   Z
getAllDataÚprintr1   Úremap_device_varidxesÚsave)ÚargsrÜ   rÝ   rÞ   rß   ÚparserÚoptionsrÐ   rã   rä   ZfontZgdefÚstoreÚwriterÚsizerÚ   r   r   r   rì   °  s<    




rì   Ú__main__)Tr<   )N)AZfontTools.misc.roundToolsr   r   ZfontTools.misc.intToolsr   ZfontTools.ttLib.tablesr   r›   ZfontTools.varLib.modelsr   ZfontTools.varLib.builderr   r	   r
   r   Ú	functoolsr   Úcollectionsr   Úheapqr   r   r†   rò   r   Úobjectr   rJ   rh   r5   r^   rm   Z	VarRegionrz   rp   Ú__bool__rq   rŽ   r•   Zsubset_varidxesr˜   r“   r�   r©   rª   ré   Zcollect_device_varidxesrê   r®   r¯   rõ   r°   rw   rÄ   rÛ   r1   rì   rd   Úsysr2   ÚargvÚexitÚdoctestÚtestmodZfailedr   r   r   r   Ú<module>   sb    9ûùA3(
 B
,
