U
    »mœd+H  ã                   @   s  d dl Z d dlZ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mZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZ e  e¡Zee› d� ZdZ e!ej"ƒZ#e$dœdd„Z%ee$edœdd„Z&ee$ej'ddœdd„Z(ee$ej'ddœdd„Z)ee$eej* eej* dœdd„Z+ee$ej*eej* dœdd„Z,ej-e.dœdd „Z/eeee!d!f ee!d!f f eej0ej0f f Z1ee$ d"œd#d$„Z2d6eeeee$e$f  e$e$f  ee$ d&œd'd(„Z3ed)d*d+d,d-d.d/gƒZ4G d0d1„ d1ƒZ5d7ee1e$ee1 d3œd4d5„Z6dS )8é    N)ÚdefaultdictÚ
namedtuple)Úreduce)Úchain)Úlog2)ÚDefaultDictÚDictÚIterableÚListÚSequenceÚTuple)ÚOPTIONS)Ú	bit_countÚbit_indices)ÚTTFont)ÚotBaseÚotTablesz:COMPRESSION_LEVELZFONTTOOLS_GPOS_COMPACT_MODE)Úreturnc                  C   sh   t } ttjkr4dd l}| dt› d�t¡ tjt } t| ƒdkrP| dkrPt| ƒS t	dt› d| › �ƒ‚d S )Nr   ú'z}' environment variable is deprecated. Please set the 'fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL' option in TTFont.cfg.é   Ú
0123456789zBad ú=)
ÚGPOS_COMPACT_MODE_DEFAULTÚGPOS_COMPACT_MODE_ENV_KEYÚosÚenvironÚwarningsÚwarnÚDeprecationWarningÚlenÚintÚ
ValueError)Z	env_levelr   © r"   úW/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/otlLib/optimize/gpos.pyÚ_compression_level_from_env   s    

ü
r$   )ÚfontÚlevelr   c                 C   sZ   | d }|j jjD ]B}|jdkr.t| ||ƒ q|jdkr|jd jdkrt| ||ƒ q| S )NZGPOSé   é	   r   )ÚtableZ
LookupListÚLookupZ
LookupTypeÚcompact_lookupÚSubTableZExtensionLookupTypeÚcompact_ext_lookup)r%   r&   ZgposÚlookupr"   r"   r#   Úcompact*   s    
r/   )r%   r&   r.   r   c                 C   s"   t | ||jƒ}||_t|ƒ|_d S ©N)Úcompact_pair_posr,   r   ÚSubTableCount)r%   r&   r.   Únew_subtablesr"   r"   r#   r+   A   s    r+   c                 C   sX   t | |dd„ |jD ƒƒ}g }|D ]"}t ¡ }d|_||_| |¡ q ||_t|ƒ|_d S )Nc                 S   s   g | ]
}|j ‘qS r"   )ÚExtSubTable)Ú.0Úext_subtabler"   r"   r#   Ú
<listcomp>I   s     z&compact_ext_lookup.<locals>.<listcomp>r   )	r1   r,   r   ZExtensionPosÚFormatr4   Úappendr   r2   )r%   r&   r.   r3   Znew_ext_subtablesÚsubtabler6   r"   r"   r#   r-   G   s      ÿr-   )r%   r&   Ú	subtablesr   c                 C   sD   g }|D ]6}|j dkr"| |¡ q|j dkr| t| ||ƒ¡ q|S )Nr   r'   )r8   r9   ÚextendÚcompact_class_pairs)r%   r&   r;   r3   r:   r"   r"   r#   r1   U   s    

r1   )r%   r&   r:   r   c              	   C   s  ddl m} g }ttƒ}|jjD ]}||jj |d¡  	|¡ q ttƒ}|j
j ¡ D ]\}}||  	|¡ qTi }	t|jƒD ]^\}}
t|
jƒD ]J\}}t|ƒržqŒt|dd ƒt|dd ƒf|	tt|| ƒƒtt|| ƒƒf< qŒqzt| |	|ƒ}|D ]}| 	|||  ¡ ƒ¡ qê|S )Nr   )ÚbuildPairPosClassesSubtableÚValue1ÚValue2)ZfontTools.otlLib.builderr>   r   ÚlistZCoverageZglyphsZ	ClassDef1Z	classDefsÚgetr9   Z	ClassDef2ÚitemsÚ	enumerateZClass1RecordÚClass2RecordÚis_really_zeroÚgetattrÚtupleÚsortedÚ,cluster_pairs_by_class2_coverage_custom_costÚgetReverseGlyphMap)r%   r&   r:   r>   r;   Zclasses1ÚgZclasses2ÚiZ	all_pairsÚclass1ÚjÚclass2Zgrouped_pairsÚpairsr"   r"   r#   r=   b   s(    

þ(r=   )rP   r   c                 C   s@   t | dd ƒ}t | dd ƒ}|d ks,| ¡ dko>|d kp>| ¡ dkS )Nr?   r@   r   )rG   ÚgetEffectiveFormat)rP   Zv1Zv2r"   r"   r#   rF   }   s
    ÿrF   .)ÚglyphIDsc                 C   st   t | ƒ} | d }|gg}| dd … D ].}||d krN|d  |¡ | |g¡ |}q$|d  |¡ || d | d fS )Nr   r   éÿÿÿÿ)rI   r9   )rS   ÚlastÚrangesZglyphIDr"   r"   r#   Ú_getClassRanges‹   s    rW   F)Ú
class_dataÚ	class_idsc                 C   s–   |sdS | |d  \}}}t |ƒ}|dd … D ]8}| | }|t |d ƒ7 }t||d ƒ}t||d ƒ}q.|| d }	d|	d  }
d|d  }t|
|ƒS )Nr   r   r'   é   é   )r   ÚminÚmax)rX   rY   ZcoverageZfirst_rangesZmin_glyph_idZmax_glyph_idZrange_countrM   ÚdataZ
glyphCountÚformat1_bytesÚformat2_bytesr"   r"   r#   Ú_classDef_bytes™   s    ra   ÚClusteringContextÚlinesÚ
all_class1Úall_class1_dataÚall_class2_dataÚvalueFormat1_bytesÚvalueFormat2_bytesc                   @   st   e Zd ZdZeedœdd„Zedd„ ƒZedd„ ƒZ	ed	d
„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdS )ÚCluster©ÚctxÚindices_bitmaskÚ_indicesÚ_column_indicesÚ_cost)rk   rl   c                 C   s"   || _ || _d | _d | _d | _d S r0   rj   )Úselfrk   rl   r"   r"   r#   Ú__init__É   s
    zCluster.__init__c                 C   s   | j d krt| jƒ| _ | j S r0   )rm   r   rl   ©rp   r"   r"   r#   ÚindicesÐ   s    
zCluster.indicesc                    s6   ˆ j d kr0ttj‡ fdd„ˆ jD ƒƒ}t|ƒˆ _ ˆ j S )Nc                 3   s   | ]}ˆ j j| V  qd S r0   )rk   rc   ©r5   rM   rr   r"   r#   Ú	<genexpr>Û   s     z)Cluster.column_indices.<locals>.<genexpr>)rn   r   r    Ú__or__rs   r   )rp   Zbitmaskr"   rr   r#   Úcolumn_indicesÖ   s    

zCluster.column_indicesc                 C   s   t | jƒd S )Nr   )r   rw   rr   r"   r"   r#   Úwidthß   s    zCluster.widthc                 C   s`   | j d krZd| j d d d | j d | j d d | jj| jj t| jƒ | j	  | _ | j S )NrZ   r'   )
ro   Úcoverage_bytesÚclassDef1_bytesÚclassDef2_bytesrk   rg   rh   r   rs   rx   rr   r"   r"   r#   Úcostä   s8    
ù	÷õóòðïíëÿþéþzCluster.costc                    sŠ   dt ‡ fdd„ˆ jD ƒƒd  }tt ‡ fdd„ˆ jD ƒ¡ƒ}d}d }|D ](\}}|d k	rn||d krn|d7 }|}qJd|d  }t||ƒS )	Nr[   c                 3   s   | ]}t ˆ jj| ƒV  qd S r0   ©r   rk   rd   rt   rr   r"   r#   ru     s     z)Cluster.coverage_bytes.<locals>.<genexpr>r'   c                 3   s   | ]}ˆ j j| d  V  qdS ©r   N)rk   re   rt   rr   r"   r#   ru     s     r   r   rZ   )Úsumrs   rI   r   Úfrom_iterabler\   )rp   r_   rV   Zmerged_range_countrU   ÚstartÚendr`   r"   rr   r#   ry     s$    þüÿûüzCluster.coverage_bytesc                    s4   t ˆj‡fdd„d�‰ tˆjj‡ fdd„ˆjD ƒƒS )Nc                    s   t ˆ jj|  ƒS r0   r}   )rM   rr   r"   r#   Ú<lambda>-  ó    z)Cluster.classDef1_bytes.<locals>.<lambda>)Úkeyc                    s   g | ]}|ˆ kr|‘qS r"   r"   rt   )Úbiggest_indexr"   r#   r7   /  s      z+Cluster.classDef1_bytes.<locals>.<listcomp>)r]   rs   ra   rk   re   rr   r"   )r†   rp   r#   rz   &  s
     ÿzCluster.classDef1_bytesc                 C   s   t | jj| jƒS r0   )ra   rk   rf   rw   rr   r"   r"   r#   r{   2  s    zCluster.classDef2_bytesN)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__rb   r    rq   Úpropertyrs   rw   rx   r|   ry   rz   r{   r"   r"   r"   r#   ri   ¼   s    



!

ri   é   )r%   rQ   Úcompressionr   c           "         sD  ˆs
ˆgS t tdd„ ˆD ƒƒƒ}t tdd„ ˆD ƒƒƒ‰ ‡ ‡fdd„|D ƒ}|  ¡ ‰‡fdd„|D ƒ}‡fdd„ˆ D ƒ}d}d}ˆ ¡ D ]@\}	}
||
d r¤|
d  ¡ ndO }||
d	 rÀ|
d	  ¡ ndO }q†t|ƒd
 }t|ƒd
 }t||||||ƒ‰i ‰ttdœ‡‡fdd„‰tttdœ‡fdd„}‡fdd„t	t
|ƒƒD ƒ}ˆd	t
|ƒ> d	 ƒj}t dt
|ƒ› �¡ t
|ƒd	k�rÐd }d }d }d }t|ƒD ]r\}}t||d	 d … ƒD ]R\}}|||ƒ}|j|j |j }|d k�sà||k �r¨|}|}|d	 | }|}�q¨�qŒ|d k	�st‚|d k	�st‚|d k	�s*t‚|d k	�s8t‚|dk�r¾tdd„ |D ƒƒ}d	||  }td	| ƒ | }t dt
|ƒd›d|d›d|› �¡ |dk�r¨t
|ƒ}t
|ƒ|d	 k�r¾�qÐ||= |||< �qfttƒ}ˆ ¡ D ]\}	}|||	d  |	< �qàg }|D ]:}tƒ } |jD ]}|| }!|  ||! ¡ �q| | ¡ �q|S )Nc                 s   s   | ]}|d  V  qdS r~   r"   ©r5   Úpairr"   r"   r#   ru   B  s     z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>c                 s   s   | ]}|d  V  qdS )r   Nr"   rŽ   r"   r"   r#   ru   C  s     c                    s(   g | ] ‰ t ‡ ‡fd d„tˆƒD ƒƒ‘qS )c                 3   s*   | ]"\}}ˆ |fˆkrd |> ndV  qdS )r   r   Nr"   )r5   rM   rP   )rN   rQ   r"   r#   ru   G  s   ÿúJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r   rD   )r5   )Ú
all_class2rQ   )rN   r#   r7   F  s   üþz@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>c                    s"   g | ]}t ‡ fd d„|D ƒƒ‘qS )c                 3   s   | ]}ˆ | V  qd S r0   r"   ©r5   Úname©Ú
name_to_idr"   r#   ru   R  s     r�   ©rW   ©r5   Úclsr”   r"   r#   r7   Q  s    c                    s"   g | ]}t ‡ fd d„|D ƒƒ‘qS )c                 3   s   | ]}ˆ | V  qd S r0   r"   r’   r”   r"   r#   ru   U  s     r�   r–   r—   r”   r"   r#   r7   T  s    r   r   r'   )rs   r   c                    s.   ˆ   | d ¡}|d k	r|S tˆ| ƒ}|ˆ | < |S r0   )rB   ri   )rs   Úcluster)Úcluster_cacherk   r"   r#   Úmake_clusterk  s    
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster)r™   Úotherr   c                    s   ˆ | j |j B ƒS r0   )rl   )r™   rœ   ©r›   r"   r#   Úmerges  s    z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                    s   g | ]}ˆ d |> ƒ‘qS )r   r"   rt   r�   r"   r#   r7   z  s     z        len(clusters) = c                 s   s   | ]}|j V  qd S r0   )r|   )r5   Úcr"   r"   r#   ru   œ  s     z            len(clusters) = Z3dz    size_reduction=z5.2fz    max_new_subtables=r(   )rI   ÚsetrK   rC   rR   r   rb   r    ri   Úranger   r|   ÚlogÚdebugrD   ÚAssertionErrorr   r   r   Údictrs   Úupdater9   )"r%   rQ   r�   rd   rc   re   rf   Zformat1Zformat2r�   Úvaluerg   rh   rž   ZclustersZcost_before_splittingZlowest_cost_changeZbest_cluster_indexZbest_other_indexZbest_mergedrM   r™   rO   rœ   ÚmergedZcost_changeZcost_after_splittingZsize_reductionZmax_new_subtablesZpairs_by_class1ÚvaluesZpairs_groupsZpairs_grouprN   r"   )r‘   rš   rk   r›   r•   rQ   r#   rJ   8  sš    û	
ÿ
ÿú	

	ÿ

rJ   )F)rŒ   )7Úloggingr   Úcollectionsr   r   Ú	functoolsr   Ú	itertoolsr   Úmathr   Útypingr   r   r	   r
   r   r   ZfontTools.configr   ZfontTools.misc.intToolsr   r   ZfontTools.ttLibr   ZfontTools.ttLib.tablesr   r   Ú	getLoggerr‡   r¢   ZCOMPRESSION_LEVELr   ÚstrÚdefaultr   r    r$   r/   r*   r+   r-   ZPairPosr1   r=   rE   ÚboolrF   ZValueRecordZPairsrW   ra   rb   ri   rJ   r"   r"   r"   r#   Ú<module>   st    

  þ  þÿÿ ýþúþ ýü