a
    èÝEbùA  ã                   @   sœ  d dl mZ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„ ZG d	d
„ d
eƒZedœ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„ Z(d d!„ Z)e)ej%_*e)ej'_*G d"d#„ d#eƒZ+G d$d%„ d%e,ƒZ-d&d'„ Z.e.ej_/d-d)d*„Z0e1d+k�r˜d d(l2Z2e3e2j4ƒd,k�r€e2 5e0ƒ ¡ d d(l6Z6e2 5e6 7¡ j8¡ d(S ).é    )ÚnoRoundÚotRound)ÚotTables)ÚsupportScalar)ÚbuildVarRegionListÚbuildVarStoreÚbuildVarRegionÚbuildVarData)Úpartial)Údefaultdictc                 C   s   t t|  ¡ dd„ d�ƒS )Nc                 S   s   | d S ©Nr   © )Úkvr   r   úY/home/ja/django-apps/lartica_env/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                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zd
d„ Z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%   r-   Údatar   r   r   Úfinish(   s    zOnlineVarStoreBuilder.finishc           
      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éÿÿ  Fr,   )r   r   r!   r   Úgetr   r   r.   r/   Úappendr   r"   Ú_outerr   r1   r   r#   r$   r3   r	   )
r%   Ú	regionMapÚ
regionListÚregionsÚregionIndicesÚregionr   ÚidxZ	varRegionZ
varDataIdxr   r   r   Ú_add_VarData0   s8    


z"OnlineVarStoreBuilder._add_VarDatac                 C   s,   | j j|td�}| d¡}|| j|td�fS )N©Úroundr   )r    Z	getDeltasrD   ÚpopÚstoreDeltasr   )r%   Zmaster_valuesÚdeltasÚbaser   r   r   ÚstoreMastersT   s    
z"OnlineVarStoreBuilder.storeMastersrC   c                   sÐ   ‡ fdd„|D ƒ}t |ƒt | jƒd kr:t|dd … ƒ}nt |ƒt | jƒksPJ ‚t|ƒ}| j |¡}|d u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ÚdrC   r   r   Ú
<listcomp>Z   r   z5OnlineVarStoreBuilder.storeDeltas.<locals>.<listcomp>é   r8   rC   é   )r.   r!   r   r$   r9   r   rB   r3   rF   ÚaddItemr   r;   )r%   rG   rD   ÚvarIdxÚinnerr   rC   r   rF   Y   s$    

z!OnlineVarStoreBuilder.storeDeltasN)T)Ú__name__Ú
__module__Ú__qualname__r&   r*   r'   r7   rB   rI   rD   rF   r   r   r   r   r      s   
$r   rC   c                   sz   ‡ fdd„|D ƒ}| j }t|ƒ}|d |kr>t|dd … ƒ}n||ksRJ ||fƒ‚t|ƒ}| j t|ƒ¡ t| jƒ| _d S )Nc                    s   g | ]}ˆ |ƒ‘qS r   r   rJ   rC   r   r   rM   s   r   z#VarData_addItem.<locals>.<listcomp>rN   )ÚVarRegionCountr.   r   r3   r:   r+   r4   )r%   rG   rD   ZcountUsZ	countThemr   rC   r   ÚVarData_addItemr   s    rW   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)rK   ÚiÚreg©Ú	fvar_axesr   r   Ú
<dictcomp>‚   s   
þz)VarRegion_get_support.<locals>.<dictcomp>)Ú	enumerateZVarRegionAxis)r%   r[   r   rZ   r   ÚVarRegion_get_support�   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 )ÚVarStoreInstancerc                 C   sL   || _ |d u s|jdksJ ‚|r&|jng | _|r8|jjng | _|  |¡ d S ©NrN   )r[   ZFormatr1   Ú_varDataÚVarRegionListr/   Ú_regionsÚsetLocation)r%   Zvarstorer[   Úlocationr   r   r   r&   Œ   s
    zVarStoreInstancer.__init__c                 C   s   t |ƒ| _|  ¡  d S r   )Údictre   Ú_clearCaches)r%   re   r   r   r   rd   “   s    
zVarStoreInstancer.setLocationc                 C   s
   i | _ d S r   )Ú_scalars©r%   r   r   r   rg   —   s    zVarStoreInstancer._clearCachesc                 C   s@   | j  |¡}|d u r<| j|  | j¡}t| j|ƒ}|| j |< |S r   )rh   r9   rc   Úget_supportr[   r   re   )r%   Ú	regionIdxZscalarZsupportr   r   r   Ú
_getScalarš   s    
zVarStoreInstancer._getScalarc                 C   s.   d}t | |ƒD ]\}}|sq||| 7 }q|S )Ng        )Úzip)rG   ÚscalarsÚdeltarL   Úsr   r   r   ÚinterpolateFromDeltasAndScalars¢   s
    z1VarStoreInstancer.interpolateFromDeltasAndScalarsc                    sJ   |d? |d@  }}ˆ j }‡ fdd„|| jD ƒ}|| j| }ˆ  ||¡S )NrO   r8   c                    s   g | ]}ˆ   |¡‘qS r   ©rl   ©rK   Úriri   r   r   rM   ­   r   z1VarStoreInstancer.__getitem__.<locals>.<listcomp>)ra   ÚVarRegionIndexr3   rq   )r%   ZvaridxÚmajorÚminorÚvarDatarn   rG   r   ri   r   Ú__getitem__ª   s
    zVarStoreInstancer.__getitem__c                    s*   ˆ j }‡ fdd„|| jD ƒ}ˆ  ||¡S )Nc                    s   g | ]}ˆ   |¡‘qS r   rr   rs   ri   r   r   rM   ³   r   z;VarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>)ra   ru   rq   )r%   ZvarDataIndexrG   rx   rn   r   ri   r   ÚinterpolateFromDeltas±   s
    
ÿz'VarStoreInstancer.interpolateFromDeltasN)rS   rT   rU   r&   rd   rg   rl   Ústaticmethodrq   ry   rz   r   r   r   r   r_   Š   s   
r_   TFc                 C   sŠ  i }|D ]>}|d? }|d@ }|  |¡}	|	d u r<tƒ  }	||< |	 |¡ q~| j}
g }i }t|
ƒD �]\}}|  |¡}|d u r~q`t|ƒ}| |¡ |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ƒ|_
|j|d� q`|| _t| jƒ| _|  ¡  |S )NrO   r8   r   r,   )r9   ÚsetÚaddr1   r]   r.   r:   r3   Úranger   r4   r5   r2   Úprune_regions)r%   ZvarIdxesr-   ZretainFirstMapZadvIdxesÚusedrQ   rv   rw   rL   rx   Z
newVarDataZ
varDataMapr6   Z
usedMinorsZnewMajorr   ZnewItemsZminorsZnewMinorr   r   r   ÚVarStore_subset_varidxes¾   sL    


(
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   )rK   rX   ©r<   r   r   rM     r   z*VarStore_prune_regions.<locals>.<listcomp>N)
r|   r1   Úupdateru   rb   r/   r   r.   r:   r0   )r%   ZusedRegionsr6   r=   r>   Z
newRegionsrX   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 )znRecurse 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‰     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.é €  rO   N)ÚDeltaFormatr}   Ú	StartSizeÚEndSize)r%   rp   r   r   r   Ú_Device_recordVarIdx'  s    
r–   c                 C   s   t t|d�}t| |ƒ d S )N)rp   )r
   r–   r‰   )r%   ZvaridxesZadderr   r   r   ÚObject_collect_device_varidxes,  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’   rO   r8   )Úidr}   r“   r”   r•   )r%   ÚmappingÚdonerQ   r   r   r   Ú_Device_mapVarIdx3  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                   @   s€   e Zd Zdd„ Zdd„ Zdd„ Zdd„ ZeeƒZed	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   s*   || _ |  |¡| _|  |¡| _tƒ | _d S r   )ÚcharsÚ	_popcountÚwidthÚ_characteristic_overheadÚoverheadr|   r   ©r%   rž   r   r   r   r&   G  s    z_Encoding.__init__c                 C   s   | j  |¡ d S r   )r   r}   )r%   Úrowr   r   r   r:   M  s    z_Encoding.appendc                 C   s   | j  |¡ d S r   )r   rƒ   )r%   Úlstr   r   r   ÚextendP  s    z_Encoding.extendc                 C   s$   t | jƒ}td| jd | | j ƒS )zxMaximum number of bytes that can be added to characteristic
		while still being beneficial to merge it into another one.r   rN   ©r.   r   Úmaxr¢   r    ©r%   Úcountr   r   r   Úget_roomS  s    
z_Encoding.get_roomc                 C   s$   t | jƒ}td| j|| jd   ƒS )zKMaximum possible byte gain from merging this into another
		characteristic.r   rN   r§   r©   r   r   r   ÚgainZ  s    
z_Encoding.gainc                 C   s   | j | jfS r   )r    rž   ri   r   r   r   Úsort_keya  s    z_Encoding.sort_keyc                 C   s
   t | jƒS r   )r.   r   ri   r   r   r   Ú__len__d  s    z_Encoding.__len__c                 C   s   || j  @  S r   )rž   r£   r   r   r   Ú
can_encodeg  s    z_Encoding.can_encodec                 C   s   |   | j|j @ ¡S r   )rŸ   rž   )r%   Úotherr   r   r   Ú__sub__j  s    z_Encoding.__sub__c                 C   s   t | ƒ d¡S )NÚ1)Úbinrª   )Únr   r   r   rŸ   m  s    z_Encoding._popcountc                 C   s&   d}| r"| d@ r|d7 }| dL } q|S )zIReturns overhead in bytes of encoding this characteristic
		as a VarData.é   é   é   é   r   )rž   Úcr   r   r   r¡   s  s    
z"_Encoding._characteristic_overheadc                 C   sT   d | _ t| jd | j| j d ƒD ],}|| D ]}| | j¡r. qHq.d }|| _ q"d S r`   )Úbest_new_encodingr~   r    Úroomr¯   rž   )r%   Údone_by_widthZ	new_widthZnew_encodingr   r   r   Ú _find_yourself_best_new_encoding~  s     z*_Encoding._find_yourself_best_new_encodingN)rS   rT   rU   r&   r:   r¦   r«   Úpropertyr»   r¬   r­   r®   r¯   r±   r{   rŸ   r¡   r½   r   r   r   r   r�   E  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   rN   i€ÿÿÿé   r·   i €ÿÿiÿ  Tr¸   é   é   r   )r¤   Z	longWordsrž   rX   Úvr   r   r   rÂ   “  s,    

z"_EncodingDict._row_characteristicsN)rS   rT   rU   rÁ   rÃ   r{   rÂ   r   r   r   r   r¿   ‰  s   r¿   c                 C   sv  t | jjƒ}dg| }i }tƒ }t| jƒD ]p\}}|j}t|jƒD ]V\}}	t|ƒ}
t	||	ƒD ]\}}|
|  |7  < q\t
|
ƒ}
| |
¡ |
||d> | < qBq*t| ¡ tjdd�}ttƒ}g }|D ]&}|jsÜ||j  |¡ qÀ| |¡ qÀ|jtjd� |D ]}| |¡ qú|�rr| ¡ }d}d}t|ƒD ]Ú\}}|j|jB }t |¡}t |¡}|j
 |j | ||j t |ƒ  ||j t |ƒ  }|jdu �r–dn|j
 |jj|j t |ƒ  }|jdu �rÄdn|j
 |jj|j t |ƒ  }|| }||k�r(|}|| }�q(|du �r ||j  |¡ nN|| }|j|jB }t|ƒ}| |j¡ | |j¡ | |¡ ||= | |¡ �q
i }t| ¡ g ƒ}|jtj d� g | _t|ƒD ]f\}}t! ¡ }| j |¡ t"|ƒ|_t |jƒ|_#t|jƒ|_t|jƒD ]\}}	|d> | ||	< �qè�q i }| ¡ D ]\}}|| ||< �q|  $¡  t | jjƒ| j_%t | jƒ| _&| jD ]}t |jƒ|_'| (¡  �qV|S )z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   rO   T)r   Úreverser   N))r.   rb   r/   r¿   r]   r1   ru   r3   r+   rm   r   rÃ   r   rŽ   r�   r®   r   r¬   r    r:   Úsortr«   r½   rE   rž   rŸ   r¡   r¢   rº   r¦   r   Úsumr­   r‡   r~   rV   r   r0   r2   r4   r-   )r%   r´   ZzeroesZfront_mappingÚ	encodingsrv   r6   r?   rw   Úitemr¤   rk   rÇ   r¼   ÚtodoÚencodingZbest_idxZ	best_gainrX   Zother_encodingZcombined_charsZcombined_widthZcombined_overheadZcombined_gainZ	this_gainZ
other_gainZseparate_gainZcombined_encodingZback_mappingÚ
varidx_mapÚkr   r   r   ÚVarStore_optimize²  s®    



ÿþýüÿÿÿÿÿ




rÑ   Nc                 C   s&  ddl m} ddlm} ddlm} ddlm} |dtj	d�}| 
d¡ |j
d	d
d� | | ¡}|dd� |j}|j}||ƒ}	|	d }
|
jj}|ƒ }| ||	¡ t| ¡ ƒ}td| ƒ | ¡ }|
j |¡ d|	v rä|	d j |¡ |ƒ }| ||	¡ t| ¡ ƒ}td| ƒ |du�r"|	 |¡ dS )z&Optimize a font's GDEF variation storer   )ÚArgumentParser)ÚconfigLogger)ÚTTFont)ÚOTTableWriterzvarLib.varStore)ÚprogÚdescriptionÚfontfileÚoutfileú?)ÚnargsÚINFO)ÚlevelÚGDEFzBefore: %7d bytesÚGPOSzAfter:  %7d bytesN)ÚargparserÒ   Z	fontToolsrÓ   ZfontTools.ttLibrÔ   ZfontTools.ttLib.tables.otBaserÕ   ÚmainÚ__doc__Úadd_argumentÚ
parse_argsrØ   rÙ   ÚtableÚVarStoreÚcompiler.   Z
getAllDataÚprintr-   Úremap_device_varidxesÚsave)ÚargsrÒ   rÓ   rÔ   rÕ   ÚparserÚoptionsrØ   rÙ   ÚfontZgdefÚstoreÚwriterÚsizerÏ   r   r   r   rá   /  s8    



rá   Ú__main__rN   )N)9ZfontTools.misc.roundToolsr   r   ZfontTools.ttLib.tablesr   r‡   ZfontTools.varLib.modelsr   ZfontTools.varLib.builderr   r   r   r	   Ú	functoolsr
   Úcollectionsr   r   Úobjectr   rD   rW   r1   rP   r^   Z	VarRegionrj   r_   r|   r�   ræ   Zsubset_varidxesr„   r   r‰   r–   r—   rÞ   Zcollect_device_varidxesrß   r›   rœ   ré   r�   rf   r¿   rÑ   r-   rá   rS   Úsysr.   ÚargvÚexitÚdoctestÚtestmodÚfailedr   r   r   r   Ú<module>   sH   d47
D)z
*
