a
    w=icD                     @   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 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! Z+d"d# Z,e,ej(_-e,ej*_-G d$d% d%eZ.G d&d' d'e/Z0d/d(d)Z1e1ej_2d0d+d,Z3e4d-krd d*l5Z5e6e5j7d.kre58e3  d d*l9Z9e58e9: j; d*S )1    )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   j/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/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rd }	|	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_VarData4   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   storeMastersX   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>^   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   ]   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   w   r   z#VarData_addItem.<locals>.<listcomp>rN   )VarRegionCountr.   r   r3   r:   r+   r4   )r%   rG   rD   ZcountUsZ	countThemr   rC   r   VarData_addItemv   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                 C   s
   t | jS r   )boolr1   r%   r   r   r   VarStore___bool__   s    ra   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   )dictrh   _clearCaches)r%   rh   r   r   r   rg      s    
zVarStoreInstancer.setLocationc                 C   s
   i | _ d S r   )_scalarsr`   r   r   r   rj      s    zVarStoreInstancer._clearCachesc                 C   s@   | j |}|d u r<| j| | j}t| j|}|| j |< |S r   )rk   r9   rf   get_supportr[   r   rh   )r%   	regionIdxZscalarsupportr   r   r   
_getScalar   s    
zVarStoreInstancer._getScalarc                 C   s.   d}t | |D ]\}}|sq||| 7 }q|S )N        )zip)rG   scalarsdeltarL   sr   r   r   interpolateFromDeltasAndScalars   s
    z1VarStoreInstancer.interpolateFromDeltasAndScalarsc                    sV   |d? |d@  }}|t krdS  j} fdd|| jD }|| j| } ||S )NrO   r8   rp   c                    s   g | ]}  |qS r   ro   rK   rir`   r   r   rM      r   z1VarStoreInstancer.__getitem__.<locals>.<listcomp>)NO_VARIATION_INDEXrd   VarRegionIndexr3   ru   )r%   ZvaridxmajorminorvarDatarr   rG   r   r`   r   __getitem__   s    zVarStoreInstancer.__getitem__c                    s*    j } fdd|| jD } ||S )Nc                    s   g | ]}  |qS r   rv   rw   r`   r   r   rM      r   z;VarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>)rd   rz   ru   )r%   ZvarDataIndexrG   r}   rr   r   r`   r   interpolateFromDeltas   s
    
z'VarStoreInstancer.interpolateFromDeltasN)rS   rT   rU   r&   rg   rj   ro   staticmethodru   r~   r   r   r   r   r   rb      s   
rb   TFc                 C   s  i }|D ]H}|t krq|d? }|d@ }||}	|	d u rFt  }	||< |	| q~| j}
g }t t i}t|
D ]\}}||}|d u rqnt|}|| |j}g }|dkr|rt	t|D ]4}|||v r|| ndgt||   |||< qnb|dkrt
|t
||  }nt
|}|D ]4}t|}|||  |d> | ||d> | < q$||_t|j|_|j|d qn|| _t| j| _|   |S )NrO   r8   r   r,   )ry   r9   setaddr1   r]   r.   r:   r3   ranger   r4   r5   r2   prune_regions)r%   ZvarIdxesr-   ZretainFirstMapZadvIdxesusedrQ   r{   r|   rL   r}   Z
newVarDataZ
varDataMapr6   Z
usedMinorsZnewMajorr   ZnewItemsZminorsZnewMinorr   r   r   VarStore_subset_varidxes   sP    


(
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   updaterz   re   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||  nt| 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|| qd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%   rt   r   r   r   _Device_recordVarIdx3  s    
r   c                 C   s   t t|d}t| | d S )N)rt   )r
   r   r   )r%   ZvaridxesZadderr   r   r   Object_collect_device_varidxes8  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_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_varidxesI  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&   S  s    z_Encoding.__init__c                 C   s   | j | d S r   )r   r   )r%   rowr   r   r   r:   Y  s    z_Encoding.appendc                 C   s   | j | d S r   )r   r   )r%   lstr   r   r   extend\  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_room_  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   gainf  s    
z_Encoding.gainc                 C   s   | j | jfS r   )r   r   r`   r   r   r   sort_keym  s    z_Encoding.sort_keyc                 C   s
   t | jS r   )r.   r   r`   r   r   r   __len__p  s    z_Encoding.__len__c                 C   s   || j  @  S r   )r   r   r   r   r   
can_encodes  s    z_Encoding.can_encodec                 C   s   |  | j|j @ S r   )r   r   )r%   otherr   r   r   __sub__v  s    z_Encoding.__sub__c                 C   s   t | dS )N1)binr   )nr   r   r   r   y  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    
z"_Encoding._characteristic_overheadc                 C   sT   d | _ t| jd | j| j d D ],}|| D ]}|| jr. qHq.d }|| _ q"d S rc   )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   Q  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|rd}d}| D ]>}|r||d 7 }d|  krdksn ||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   s  t | jj}dg| }i }t }t| jD ]\}}|j}t|jD ]t\}	}
t|}t	||
D ]\}}||  |7  < q\t
|}|rt|sd||d> |	 < qB|| |||d> |	 < qBq*t| tjdd}tt}g }|D ]&}|js||j | q|| q|jtjd |D ]}|| q|r| }d}d}t|D ]\}}|j|jB }t|}t|}|j
 |j | ||j t |  ||j t |  }|jdu rdn|j
 |jj|j t |  }|jdu rdn|j
 |jj|j t |  }|| }||krH|}|| }qH|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qt%t%i}| D ]$\}}|durR|| nt%||< q8| &  t | jj| j_'t | j| _(| jD ]}t |j|_)|*  q|S )z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   NrO   T)r   reverser   )+r.   re   r/   r   r]   r1   rz   r3   r+   rq   r   anyr   r   r   r   r   r   r   r   r:   sortr   r   rE   r   r   r   r   r   r   r   sumr   r   r   rV   ry   r   r0   r2   r4   r-   ) r%   Zuse_NO_VARIATION_INDEXr   ZzeroesZfront_mapping	encodingsr{   r6   r?   r|   itemr   rm   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   ZfontZgdefstorewritersizer   r   r   r   r   ?  s8    



r   __main__rN   )T)N)<ZfontTools.misc.roundToolsr   r   ZfontTools.ttLib.tablesr   r   ZfontTools.varLib.modelsr   ZfontTools.varLib.builderr   r   r   r	   	functoolsr
   collectionsr   ry   r   r   objectr   rD   rW   r1   rP   r^   Z	VarRegionrl   ra   __bool__rb   r   r   Zsubset_varidxesr   r   r   r   r   r   Zcollect_device_varidxesr   r   r   r   r   ri   r   r   r-   r   rS   sysr.   argvexitdoctesttestmodfailedr   r   r   r   <module>   sP   d59
D)
~
*
