a
    ¥Q•hò]  ã                   @   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   úR/var/www/sistema_ama/venv/lib/python3.9/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)ÚselfÚ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   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!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)   r2   Údatar   r   r   Úfinish1   s    zOnlineVarStoreBuilder.finishé   c                 C   s,  | j }| j}| j}g }|D ]R}t|ƒ}| |¡}|d u rbt|| jƒ}	t|jƒ }||< |j 	|	¡ | 	|¡ qt
|ƒ}| j |¡}
|
d urÂ|
| _| jj|
 | _| j| | _t| jjƒ| dkrÂd }
|
d u �r(t|g dd�| _t| jjƒ| _| jj 	| j¡ | j| j|< || jv�ri | j|< | j| | _d S )Néÿÿ  Fr1   )r    r!   r%   r   Úgetr
   r   r3   r4   Úappendr   r&   Ú_outerr"   r6   r#   r'   r(   r8   r   )r)   Z	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   r   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sPJ ‚t|ƒ}| jsf|  ¡  | j |¡}|d u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   r   z5OnlineVarStoreBuilder.storeDeltas.<locals>.<listcomp>r=   r>   rI   é   )r3   r%   r   r#   rH   r(   r?   r8   rM   r   ÚaddItemrA   )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 u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   „   r   zDOnlineVarStoreBuilder.storeDeltasMany.<locals>.<listcomp>.<listcomp>r   rV   rI   r   r   rT   „   r   z9OnlineVarStoreBuilder.storeDeltasMany.<locals>.<listcomp>c                 s   s   | ]}t |ƒV  qd S r   )r   rV   r   r   r   Ú	<genexpr>…   r   z8OnlineVarStoreBuilder.storeDeltasMany.<locals>.<genexpr>r>   rI   r\   )r   r#   rH   r3   r(   r?   r8   rW   r   Ú	enumerater]   rA   )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sRJ ||fƒ‚t|ƒ}| j |¡ t| jƒ| _d S )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   rZ   rI   r   r   rT       r   z#VarData_addItem.<locals>.<listcomp>r=   )ÚVarRegionCountr3   r0   r8   r@   r9   )r)   rO   rJ   ZcountUsZ	countThemr   rI   r   ÚVarData_addItemŸ   s    rg   c                    s   ‡ fdd„t | jƒD ƒS )Nc                    s2   i | ]*\}}|j d krˆ | j|j|j |jf“qS rU   )Ú	PeakCoordÚaxisTagÚ
StartCoordÚEndCoord)rR   rb   Úreg©Ú	fvar_axesr   r   Ú
<dictcomp>±   s   
þz)VarRegion_get_support.<locals>.<dictcomp>)ra   ÚVarRegionAxis)r)   rn   r   rm   r   ÚVarRegion_get_support°   s    
þrq   c                 C   s
   t | jƒS r   )Úboolr6   ©r)   r   r   r   ÚVarStore___bool__»   s    rt   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 u s|jdksJ ‚|r&|jng | _|r8|jjng | _|  |¡ d S )Nr=   )rn   ÚFormatr6   Ú_varDataÚVarRegionListr4   Ú_regionsÚsetLocation)r)   Zvarstorern   Úlocationr   r   r   r+   Ã   s
    zVarStoreInstancer.__init__c                 C   s   t |ƒ| _|  ¡  d S r   )Údictr{   Ú_clearCaches)r)   r{   r   r   r   rz   Ê   s    
zVarStoreInstancer.setLocationc                 C   s
   i | _ d S r   )Ú_scalarsrs   r   r   r   r}   Î   s    zVarStoreInstancer._clearCachesc                 C   s@   | j  |¡}|d u r<| j|  | j¡}t| j|ƒ}|| j |< |S r   )r~   r?   ry   Úget_supportrn   r   r{   )r)   Ú	regionIdxÚscalarÚ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   Zrirs   r   r   rT   ç   r   z1VarStoreInstancer.__getitem__.<locals>.<listcomp>)ÚNO_VARIATION_INDEXrw   ÚVarRegionIndexr8   r‰   )r)   ÚvaridxÚmajorÚminorÚvarDatar†   rO   r   rs   r   Ú__getitem__â   s    zVarStoreInstancer.__getitem__c                    s*   ˆ j }‡ fdd„|| jD ƒ}ˆ  ||¡S )Nc                    s   g | ]}ˆ   |¡‘qS r   rŠ   r‹   rs   r   r   rT   í   r   z;VarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>)rw   r�   r‰   )r)   ZvarDataIndexrO   r‘   r†   r   rs   r   ÚinterpolateFromDeltasë   s    z'VarStoreInstancer.interpolateFromDeltasN)rc   rd   re   r+   rz   r}   rƒ   Ústaticmethodr‰   r’   r“   r   r   r   r   ru   Â   s   
	ru   TFr6   )r6   c                C   sš  t tƒ}|D ],}|tkrq|d? }|d@ }	||  |	¡ q~t| |ƒ}
g }tti}t|
ƒD �]\}}| |¡}|d u rxqZt|ƒ}| |¡ |j	}g }|dkrä|rät
t|ƒƒD ]4}	| |	|v 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   r6   r1   ÚCount)r   ÚsetrŒ   ÚaddÚgetattrra   r?   r3   r@   r8   Úranger   r9   r:   ÚsetattrÚprune_regions)r)   ÚvarIdxesr2   ÚretainFirstMapÚadvIdxesr6   Úusedr^   r�   r�   r‘   Z
newVarDataZ
varDataMapr;   Z
usedMinorsZnewMajorr   ZnewItemsZminorsZnewMinorr   r   r   ÚVarStore_subset_varidxesø   sP    



 ÿ
r    rx   )r6   rx   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   rb   ©rB   r   r   rT   R  r   z*VarStore_prune_regions.<locals>.<listcomp>N)	r–   r˜   Úupdater�   r4   r   r3   r@   r5   )	r)   r6   rx   ZusedRegionsr;   rC   rD   Z
newRegionsrb   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u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.ÚgetConvertersÚpostReadN)ÚtypeÚotÚDeviceÚ
isinstancer0   Ú_visitÚhasattrr¤   r˜   ÚnameÚ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 | ƒ|v 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_mapÚ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À   rs   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À   Úcolsrb   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Á   r3   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)rc   rd   re   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Æ   Ú	longWordsrÀ   rb   Úvr   r   r   rÖ   Í  s,    

z"_EncodingDict._row_characteristicsN)rc   rd   re   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u �sh|| du �rœ�qh|| ||  }}d\||< ||< |j|jB }t|ƒ}| |j¡ | |j¡ t|ƒD ]f\}}|du �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u�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 ur|‘qS r   r   )rR   Úencodingr   r   r   rT   …  r   z%VarStore_optimize.<locals>.<listcomp>r>   )#r3   rx   r4   rÓ   ra   r6   r�   r8   r0   r…   rJ   r   Úanyr×   r   r¯   r¿   rÉ   r™   rÒ   r   r   rÀ   rÈ   r   r@   Úsortr§   rf   rŒ   r5   r7   r9   r2   r›   )r)   Úuse_NO_VARIATION_INDEXÚquantizationÚnZzeroesZfront_mappingÚ	encodingsr�   r;   rE   r�   ÚitemrÆ   r€   rÜ   ÚtodoÚheaprb   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u�r>|j |¡ d|
v �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í   Ú	fontToolsrî   ÚfontTools.ttLibrï   ÚfontTools.ttLib.tables.otBaserð   ÚmainÚ__doc__Úadd_argumentÚintÚ
parse_argsrá   rô   rõ   ÚtableÚVarStoreÚcompiler3   Ú
getAllDataÚprintr2   Úremap_device_varidxesÚsave)Úargsrí   rî   rï   rð   ÚparserÚoptionsrá   rô   rõ   ÚfontÚgdefÚstoreÚwriterÚsizerë   r   r   r   r   °  s<    




r   Ú__main__)Tr=   )N)AÚfontTools.misc.roundToolsr   r   ZfontTools.misc.intToolsr   ÚfontTools.ttLib.tablesr   r§   ÚfontTools.varLib.modelsr   ZfontTools.varLib.builderr   r	   r
   r   Ú	functoolsr   Úcollectionsr   Úheapqr   r   rŒ   r  r   Úobjectr   rJ   rg   r6   r]   rq   Ú	VarRegionr   rt   Ú__bool__ru   r–   r    Úsubset_varidxesr£   r›   rª   r·   r¸   rú   Úcollect_device_varidxesrû   r¼   r¾   r
  r¿   r|   rÓ   rì   r2   r   rc   Úsysr3   ÚargvÚexitÚdoctestÚtestmodÚfailedr   r   r   r   Ú<module>   sb    9ûùA3(
 B
,
