U
    »mœd‘X  ã                   @   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„Z&e&ej_'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ƒZ5d1d+d,„Z6e6ej_7d2d.d/„Z8e9d0k�rÔd d-l:Z:e;e:j<ƒd*k�r¼e: =e8ƒ ¡ d d-l>Z>e: =e> ?¡ j@¡ d-S )3é    )Ú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/home/sam/Atlas/atlas_env/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                   @   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 )ÚOnlineVarStoreBuilderc                 C   sN   || _ i | _tg |ƒ| _t| jg ƒ| _d | _d | _d | _i | _	i | _
i | _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   s2   d | _ t|ƒ| _| jd s"| jd= i | _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.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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)   Ú	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 )NrG   r   )r$   Z	getDeltasÚpopÚstoreDeltasr   )r)   Zmaster_valuesrH   ÚdeltasÚbaser   r   r   ÚstoreMasters\   s    
z"OnlineVarStoreBuilder.storeMastersc                   sÐ   ‡ fdd„|D ƒ}t |ƒt | jƒd kr:t|dd … ƒ}nt |ƒt | jƒksPt‚t|ƒ}| j |¡}|d k	rp|S | js~|  ¡  t | jjƒ}|dkr¤|  ¡  |  	|¡S | jj
|td� | jd> | }|| j|< |S )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   ©Ú.0ÚdrG   r   r   Ú
<listcomp>b   s     z5OnlineVarStoreBuilder.storeDeltas.<locals>.<listcomp>é   r<   rG   é   )r2   r%   r   ÚAssertionErrorr(   r=   r#   rF   r7   rJ   ÚaddItemr   r?   )r)   rK   rH   ÚvarIdxÚinnerr   rG   r   rJ   a   s$    

z!OnlineVarStoreBuilder.storeDeltasN)T)Ú__name__Ú
__module__Ú__qualname__r*   r.   r+   r;   rF   rH   rM   rJ   r   r   r   r   r      s   
#r   rG   c                   sz   ‡ fdd„|D ƒ}| j }t|ƒ}|d |kr>t|dd … ƒ}n||ksRt||fƒ‚t|ƒ}| j t|ƒ¡ t| jƒ| _d S )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   rN   rG   r   r   rQ   |   s     z#VarData_addItem.<locals>.<listcomp>rR   )ÚVarRegionCountr2   r   rT   r7   r>   r/   r8   )r)   rK   rH   ZcountUsZ	countThemr   rG   r   ÚVarData_addItem{   s    r\   c                    s   ‡ fdd„t | jƒD ƒS )Nc                    s2   i | ]*\}}|j d krˆ | j|j|j |jf“qS )r   )Z	PeakCoordZaxisTagZ
StartCoordZEndCoord)rO   ÚiÚreg©Ú	fvar_axesr   r   Ú
<dictcomp>�   s   
þ z)VarRegion_get_support.<locals>.<dictcomp>)Ú	enumerateZVarRegionAxis)r)   r`   r   r_   r   ÚVarRegion_get_supportŒ   s    
þrc   c                 C   s
   t | jƒS r   )Úboolr5   ©r)   r   r   r   ÚVarStore___bool__—   s    rf   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 )NrR   )	r`   ZFormatrT   r5   Ú_varDataÚVarRegionListr3   Ú_regionsÚsetLocation)r)   Zvarstorer`   Úlocationr   r   r   r*   Ÿ   s
    zVarStoreInstancer.__init__c                 C   s   t |ƒ| _|  ¡  d S r   )Údictrl   Ú_clearCaches)r)   rl   r   r   r   rk   ¦   s    
zVarStoreInstancer.setLocationc                 C   s
   i | _ d S r   )Ú_scalarsre   r   r   r   rn   ª   s    zVarStoreInstancer._clearCachesc                 C   s@   | j  |¡}|d kr<| j|  | j¡}t| j|ƒ}|| j |< |S r   )ro   r=   rj   Úget_supportr`   r   rl   )r)   Ú	regionIdxZscalarZsupportr   r   r   Ú
_getScalar­   s    
zVarStoreInstancer._getScalarc                 C   s.   d}t | |ƒD ]\}}|sq||| 7 }q|S )Nç        )Úzip)rK   ÚscalarsÚdeltarP   Úsr   r   r   ÚinterpolateFromDeltasAndScalarsµ   s    z1VarStoreInstancer.interpolateFromDeltasAndScalarsc                    sV   |d? |d@  }}|t krdS ˆ j}‡ fdd„|| jD ƒ}|| j| }ˆ  ||¡S )NrS   r<   rs   c                    s   g | ]}ˆ   |¡‘qS r   ©rr   ©rO   Úrire   r   r   rQ   Ã   s     z1VarStoreInstancer.__getitem__.<locals>.<listcomp>)ÚNO_VARIATION_INDEXrh   ÚVarRegionIndexr7   rx   )r)   ZvaridxÚmajorÚminorÚvarDataru   rK   r   re   r   Ú__getitem__¾   s    zVarStoreInstancer.__getitem__c                    s*   ˆ j }‡ fdd„|| jD ƒ}ˆ  ||¡S )Nc                    s   g | ]}ˆ   |¡‘qS r   ry   rz   re   r   r   rQ   É   s     z;VarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>)rh   r}   rx   )r)   ZvarDataIndexrK   r€   ru   r   re   r   ÚinterpolateFromDeltasÇ   s    z'VarStoreInstancer.interpolateFromDeltasN)rX   rY   rZ   r*   rk   rn   rr   Ústaticmethodrx   r�   r‚   r   r   r   r   rg   ž   s   
	rg   TFc                 C   s˜  i }|D ]H}|t krq|d? }|d@ }| |¡}	|	d krFtƒ  }	||< |	 |¡ q~| j}
g }t t i}t|
ƒD �]\}}| |¡}|d krŒqnt|ƒ}| |¡ |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ƒ|_|j|d� qn|| _t| jƒ| _|  ¡  |S )NrS   r<   r   r0   )r|   r=   ÚsetÚaddr5   rb   r2   r>   r7   Úranger   r8   r9   r6   Úprune_regions)r)   ZvarIdxesr1   ZretainFirstMapZadvIdxesÚusedrV   r~   r   rP   r€   Z
newVarDataZ
varDataMapr:   Z
usedMinorsZnewMajorr   ZnewItemsZminorsZnewMinorr   r   r   ÚVarStore_subset_varidxesÔ   sT    


 ÿ
r‰   c                    s’   t ƒ }| jD ]}| |j¡ q| j}|j}g }i ‰ t|ƒD ]}t|ƒˆ |< | || ¡ q:||_t|jƒ|_	| jD ]}‡ fdd„|jD ƒ|_qrdS )zRemove unused VarRegions.c                    s   g | ]}ˆ | ‘qS r   r   )rO   r]   ©r@   r   r   rQ   *  s     z*VarStore_prune_regions.<locals>.<listcomp>N)
r„   r5   Úupdater}   ri   r3   r   r2   r>   r4   )r)   ZusedRegionsr:   rA   rB   Z
newRegionsr]   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�   ÚgetattrÚnameZValueRecordÚ__dict__Úvalues)r)   ÚfuncÚthatÚconvr   r   r   r‘   0  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.é €  rS   N)ÚDeltaFormatr…   Ú	StartSizeÚEndSize)r)   rw   r   r   r   Ú_Device_recordVarIdxF  s    
rž   c                 C   s   t t|d�}t| |ƒ d S )N)rw   )r   rž   r‘   )r)   ZvaridxesZadderr   r   r   ÚObject_collect_device_varidxesL  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š   rS   r<   )Úidr…   r›   rœ   r�   )r)   ÚmappingÚdonerV   r   r   r   Ú_Device_mapVarIdxU  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                   @   st   e Zd Zdd„ Zdd„ Zdd„ Zdd„ ZeeƒZd	d
„ Z	ee	ƒ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*   j  s
    
z_Encoding.__init__c                 C   s   | j  |¡ d S r   )r   r…   )r)   Úrowr   r   r   r>   q  s    z_Encoding.appendc                 C   s   | j  |¡ d S r   )r   r‹   )r)   Úlstr   r   r   Úextendt  s    z_Encoding.extendc                 C   s$   t | jƒ}td| jd | | j ƒS )z~Maximum number of bytes that can be added to characteristic
        while still being beneficial to merge it into another one.r   rR   )r2   r   Úmaxr«   r§   ©r)   Úcountr   r   r   Úget_roomw  s    
z_Encoding.get_roomc                 C   s   t | jƒ}td| j| ƒS )zQMaximum possible byte gain from merging this into another
        characteristic.r   )r2   r   r¯   r«   r°   r   r   r   Úget_gain  s    
z_Encoding.get_gainc                 C   s   | j | jfS r   )Úgainr¦   re   r   r   r   Úgain_sort_key‡  s    z_Encoding.gain_sort_keyc                 C   s   | j | jfS r   )r§   r¦   re   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   rR   é   é   r   )r¦   Úcolsr]   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)rX   rY   rZ   r*   r>   r®   r²   ÚpropertyÚroomr³   r´   rµ   r¶   rƒ   rª   r¨   r¿   r   r   r   r   r¥   i  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   rR   i€ÿÿÿé   r¸   i €ÿÿiÿ  Tr»   é   é   r   )r¬   Z	longWordsr¦   r]   Úvr   r   r   rÅ   ¸  s,    

z"_EncodingDict._row_characteristicsN)rX   rY   rZ   rÄ   rÆ   rƒ   rÅ   r   r   r   r   rÂ   ¯  s   rÂ   rR   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 | _t|ƒD ]f\}}t ¡ }| j |¡ t|ƒ|_t |jƒ|_t|jƒ|_t|jƒD ]\}
}|d> |
 ||< �qÞ�q–tti}| ¡ D ]$\}}|dk	�r(|| nt||< �q|  ¡  t | jjƒ| j_ t | jƒ| _!| jD ]}t |jƒ|_"| #¡  �q^|S )	z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   rR   NrS   r   )NNc                 S   s   g | ]}|d k	r|‘qS r   r   )rO   Úencodingr   r   r   rQ   h  s      z%VarStore_optimize.<locals>.<listcomp>)$r2   ri   r3   rÂ   rb   r5   r}   r7   r/   rt   rH   r   ÚanyrÆ   r   r–   r¥   rµ   r†   r¿   r   r   r¦   r®   r   r>   Úsortr¶   r�   r[   r|   r‡   r4   r6   r8   r1   )r)   Zuse_NO_VARIATION_INDEXÚquantizationÚnZzeroesZfront_mappingÚ	encodingsr~   r:   rC   r   Úitemr¬   rq   rÊ   ÚtodoÚheapr]   rË   Újr½   Zcombining_gainÚ_r¾   Zcombined_encodingÚkÚencZback_mappingÚ
varidx_mapr   r   r   ÚVarStore_optimize×  s’    D
ÿ







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--quantizationrR   )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__)TrR   )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   rH   r\   r5   rU   rc   Z	VarRegionrp   rf   Ú__bool__rg   r„   r‰   Zsubset_varidxesrŒ   r‡   r‘   rž   rŸ   rç   Zcollect_device_varidxesrè   r£   r¤   ró   r¥   rm   rÂ   rÙ   r1   rê   rX   Úsysr2   ÚargvÚexitÚdoctestÚtestmodÚfailedr   r   r   r   Ú<module>   s\   c7  ÿ
=F(
 3
,
