o
    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rd d1l:Z:e;e:j<d.kre:=e8  d d1l>Z>e:=e>? j@ d1S 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   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/varLib/varStore.py<lambda>   s    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   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 ])}t|}||}|d u r1t|| j}	t|j }||< |j	|	 |	| qt
|}| j|}
|
d ura|
| _| jj|
 | _| j| | _t| jj| dkrad }
|
d u rt|g dd| _t| jj| _| jj	| j | j| j|< || jvri | j|< | j| | _d S 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   idx	varRegion
varDataIdxr   r   r   _add_VarData9   s:   


z"OnlineVarStoreBuilder._add_VarDataroundc                C   s,   | j j||d}|d}|| j|tdfS )NrK   r   )r#   	getDeltaspopstoreDeltasr   )r(   master_valuesrL   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 )rK   )r#   rM   ).0rP   rL   r(   r   r   
<listcomp>b   s    z:OnlineVarStoreBuilder.storeMastersMany.<locals>.<listcomp>c                 S   s   g | ]}| d qS r   )rN   rT   rQ   r   r   r   rV   f       rK   )storeDeltasManyr   )r(   master_values_listrL   deltas_list	base_listr   rU   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s(J t|}| js3|   | j|}|d ur?|S t | jj}|dkrT|   | j|t	dS | jj
|t	d | jd> | }|| j|< |S )Nc                       g | ]} |qS r   r   rT   drK   r   r   rV   j       z5OnlineVarStoreBuilder.storeDeltas.<locals>.<listcomp>r<   r=   rK      )r2   r$   r   r"   rJ   r'   r>   r7   rO   r   addItemr@   )r(   rQ   rL   varIdxinnerr   rK   r   rO   i   s$   
z!OnlineVarStoreBuilder.storeDeltasc                   s    fdd|D }t dd |D }| js| t| | j|}|d ur(|S t| jj}|t| dkrD| t| | j|tdS t	|D ]\}}| jj
|td | jd> | | }|| j|< qH| jd> | }|| j|< |S )Nc                    s   g | ]} fd d|D qS )c                    r_   r   r   r`   rK   r   r   rV      rb   zDOnlineVarStoreBuilder.storeDeltasMany.<locals>.<listcomp>.<listcomp>r   rX   rK   r   r   rV      s    z9OnlineVarStoreBuilder.storeDeltasMany.<locals>.<listcomp>c                 s   s    | ]}t |V  qd S r   )r   rX   r   r   r   	<genexpr>   s    z8OnlineVarStoreBuilder.storeDeltasMany.<locals>.<genexpr>r=   rK   rc   )r   r"   rJ   r2   r'   r>   r7   rZ   r   	enumeraterd   r@   )r(   r\   rL   re   rf   irQ   r   rK   r   rZ      s$   
z%OnlineVarStoreBuilder.storeDeltasManyN)T)r<   )__name__
__module____qualname__r*   r.   r+   r;   rJ   rL   rS   r^   rO   rZ   r   r   r   r   r      s    

#r   rK   c                   sv    fdd|D }| j }t|}|d |krt|dd  }n||ks)J ||ft|}| j| t| j| _d S )Nc                    r_   r   r   r`   rK   r   r   rV      rb   z#VarData_addItem.<locals>.<listcomp>r<   )VarRegionCountr2   r/   r7   r?   r8   )r(   rQ   rL   countUs	countThemr   rK   r   VarData_addItem   s   rp   c                    s    fddt | jD S )Nc                    s2   i | ]\}}|j d kr | j|j|j |jfqS rW   )	PeakCoordaxisTag
StartCoordEndCoord)rT   ri   reg	fvar_axesr   r   
<dictcomp>   s
    
z)VarRegion_get_support.<locals>.<dictcomp>)rh   VarRegionAxis)r(   rw   r   rv   r   VarRegion_get_support   s   
rz   c                 C   s
   t | jS r   )boolr5   r(   r   r   r   VarStore___bool__      
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 | _|r|jjng | _| | d S )Nr<   )rw   Formatr5   _varDataVarRegionListr3   _regionssetLocation)r(   varstorerw   locationr   r   r   r*      s
   zVarStoreInstancer.__init__c                 C   s   t || _|   d S r   )dictr   _clearCaches)r(   r   r   r   r   r      s   
zVarStoreInstancer.setLocationc                 C   s
   i | _ d S r   )_scalarsr|   r   r   r   r      r~   zVarStoreInstancer._clearCachesc                 C   s@   | j |}|d u r| j| | j}t| j|}|| j |< |S r   )r   r>   r   get_supportrw   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)rQ   scalarsdeltara   sr   r   r   interpolateFromDeltasAndScalars   s   z1VarStoreInstancer.interpolateFromDeltasAndScalarsc                    sV   |d? |d@ }}|t krdS  j} fdd|| jD }|| j| } ||S )Nrc   r=   r   c                       g | ]}  |qS r   r   rT   rir|   r   r   rV      rY   z1VarStoreInstancer.__getitem__.<locals>.<listcomp>)NO_VARIATION_INDEXr   VarRegionIndexr7   r   )r(   varidxmajorminorvarDatar   rQ   r   r|   r   __getitem__   s   zVarStoreInstancer.__getitem__c                    s*    j } fdd|| jD } ||S )Nc                    r   r   r   r   r|   r   r   rV      rY   z;VarStoreInstancer.interpolateFromDeltas.<locals>.<listcomp>)r   r   r   )r(   varDataIndexrQ   r   r   r   r|   r   interpolateFromDeltas   s   z'VarStoreInstancer.interpolateFromDeltasN)rj   rk   rl   r*   r   r   r   staticmethodr   r   r   r   r   r   r   r      s    
	r   TFr5   )r5   c                C   s  t t}|D ]}|tkrq|d? }|d@ }	|| |	 q~t| |}
g }tti}t|
D ]\}}||}|d u r;q-t|}|| |j	}g }|dkrq|rqt
t|D ]}	||	|v ra||	 ndgt||	   |	||	< qUn/|dkrt|t||  }nt|}|D ]}	t|}|||	  |d> | ||d> |	 < q||_	t|j	|_|dkr|j|d q-t| || t| |d t| |   |S )Nrc   r=   r   r5   r0   Count)r   setr   addgetattrrh   r>   r2   r?   r7   ranger   r8   r9   setattrprune_regions)r(   varIdxesr1   retainFirstMapadvIdxesr5   usedre   r   r   r   
newVarData
varDataMapr:   
usedMinorsnewMajorr   newItemsminorsnewMinorr   r   r   VarStore_subset_varidxes   sT   



 
r   r   )r5   r   c          	         s   t  }t| |D ]}||j qt| |}|j}g }i  t|D ]}t| |< |||  q!||_t|j|_t| |D ]} fdd|jD |_q?dS )zRemove unused VarRegions.c                    s   g | ]} | qS r   r   )rT   ri   rB   r   r   rV   R  rb   z*VarStore_prune_regions.<locals>.<listcomp>N)	r   r   updater   r3   r   r2   r?   r4   )	r(   r5   r   usedRegionsr:   rC   rD   
newRegionsri   r   r   r   VarStore_prune_regions<  s   
r   c                 C   s   t | tjkr||  dS t| tr| D ]}t|| qdS t| drAt| dsA|  D ]}t| |j	d}|dur>t|| q,dS t| tj
rT| j D ]	}t|| qLdS 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
isinstancer/   _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 dS )z6Add VarIdx in this Device table (if any) to the set s.   rc   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(   varidxesadderr   r   r   Object_collect_device_varidxest  s   r   c                 C   sX   t | |v rdS |t |  | jdkr*|| jd> | j  }|d? | _|d@ | _dS dS )z9Map VarIdx in this Device table (if any) through mapping.Nr   rc   r=   )idr   r   r   r   )r(   mappingdonere   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(   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      | j | d S r   )r   r   )r(   rowr   r   r   r?        z_Encoding.appendc                 C   r   r   )r   r   )r(   lstr   r   r   extend  r   z_Encoding.extendc                 C   s   | j | jfS r   )r   r   r|   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   s4   d}d}| r| d@ r||O }| dL } |dK }| s|S )Nr   r<         r   )r   colsri   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_charscombined_widthcombined_columnscombined_overheadcombined_gainr   r   r   gain_from_merging  s   
z_Encoding.gain_from_mergingN)rj   rk   rl   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 ],}|r||7 }d|  krdks!n ||d 7 }d|  kr+dks0n d	} n|d
K }q|r]d}d}| D ]}|rG||d 7 }d|  krQdksXn ||d 7 }|d
K }q=|S )z+Returns encoding characteristics for a row.Fr   r<   i   r   i i  Tr         r   )r   	longWordsr   ri   vr   r   r   r     s,   

z"_EncodingDict._row_characteristicsN)rj   rk   rl   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 ]d\}}|j}	t|jD ]W\}
}t|}|dkr@t	|	|D ]\}}||  |7  < q2nt	|	|D ]\}}||  t
|| | 7  < qEt|}|rkt|skd||d> |
 < q!|| |||d> |
 < q!qt| tjd}~g }t|D ]&\}}t|d t |D ]}|| }||}|dkrt|| ||f qq|r*t|\}}}|| du s|| du rq|| || }}d\||< ||< |j|jB }t|}||j ||j t|D ]/\}}|du rq|j|kr||j d||< q||}|dkr"t|| |t |f q|| |sdd |D }i }|jtjd g | _|D ]I}t|j}|rt | j}t }| j| t||_t |j|_|dd	 |d	d |_}t|jD ]\}
}|d> |
 ||< qv|sIq?tti}| D ]\}}|dur|| nt||< qt | jj| j_t | j| _| jD ]}t |j|_ |!  q| "  |S )
z@Optimize storage. Returns mapping from old VarIdxes to new ones.r   r<   Nrc   r   )NNc                 S   s   g | ]}|d ur|qS r   r   )rT   encodingr   r   r   rV     s    z%VarStore_optimize.<locals>.<listcomp>r=   )#r2   r   r3   r   rh   r5   r   r7   r/   r   rL   r   anyr   r   r   r   r   r   r   r   r   r   r   r   r?   sortr   rm   r   r4   r6   r8   r1   r   )r(   use_NO_VARIATION_INDEXquantizationnzeroesfront_mapping	encodingsr   r:   rE   r   itemr   r   r   todoheapri   r   jr   combining_gain_r   combined_encodingkenc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 r|
d j| |
|	 dS 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compiler2   
getAllDataprintr1   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<   r   )AfontTools.misc.roundToolsr   r   fontTools.misc.intToolsr   fontTools.ttLib.tablesr   r   fontTools.varLib.modelsr   fontTools.varLib.builderr   r	   r
   r   	functoolsr   collectionsr   heapqr   r   r   r+  r   objectr   rL   rp   r5   rd   rz   	VarRegionr   r}   __bool__r   r   r   subset_varidxesr   r   r   r   r   r  collect_device_varidxesr   r   r   r/  r   r   r   r  r1   r%  rj   sysr2   argvexitdoctesttestmodfailedr   r   r   r   <module>   sf     9A3
( B
,