U
    Q»{j£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"   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/otlLib/optimize/gpos.pyÚ_compression_level_from_env   s    

ü
r$   )ÚfontÚlevelr   c                 C   sh   |   d¡}|d kr| S |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   )	ÚgetÚtableZ
LookupListÚLookupZ
LookupTypeÚcompact_lookupÚSubTableZExtensionLookupTypeÚcompact_ext_lookup)r%   r&   ZgposÚlookupr"   r"   r#   Úcompact*   s    

r0   )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,   G   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>O   s     z&compact_ext_lookup.<locals>.<listcomp>r   )	r2   r-   r   ZExtensionPosÚFormatr5   Úappendr   r3   )r%   r&   r/   r4   Znew_ext_subtablesÚsubtabler7   r"   r"   r#   r.   M   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'   )r9   r:   ÚextendÚcompact_class_pairs)r%   r&   r<   r4   r;   r"   r"   r#   r2   [   s    

r2   )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	classDefsr)   r:   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>   h   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@   rA   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   r:   )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 r1   rj   )Úselfrk   rl   r"   r"   r#   Ú__init__Ð   s
    zCluster.__init__c                 C   s   | j d krt| jƒ| _ | j S r1   )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 r1   )rk   rc   ©r6   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 r1   ©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 r1   r}   )rM   rr   r"   r#   Ú<lambda>4  ó    z)Cluster.classDef1_bytes.<locals>.<lambda>)Úkeyc                    s   g | ]}|ˆ kr|‘qS r"   r"   rt   )Úbiggest_indexr"   r#   r8   6  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 r1   )ra   rk   rf   rw   rr   r"   r"   r#   r{   9  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"   ©r6   Úpairr"   r"   r#   ru   I  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   J  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"   )r6   rM   rP   )rN   rQ   r"   r#   ru   N  s   ÿúJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r   rD   )r6   )Ú
all_class2rQ   )rN   r#   r8   M  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 r1   r"   ©r6   Úname©Ú
name_to_idr"   r#   ru   Y  s     r�   ©rW   ©r6   Úclsr”   r"   r#   r8   X  s    c                    s"   g | ]}t ‡ fd d„|D ƒƒ‘qS )c                 3   s   | ]}ˆ | V  qd S r1   r"   r’   r”   r"   r#   ru   \  s     r�   r–   r—   r”   r"   r#   r8   [  s    r   r   r'   )rs   r   c                    s.   ˆ   | d ¡}|d k	r|S tˆ| ƒ}|ˆ | < |S r1   )r)   ri   )rs   Úcluster)Úcluster_cacherk   r"   r#   Úmake_clusterr  s    
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster)r™   Úotherr   c                    s   ˆ | j |j B ƒS r1   )rl   )r™   rœ   ©r›   r"   r#   Úmergez  s    z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                    s   g | ]}ˆ d |> ƒ‘qS )r   r"   rt   r�   r"   r#   r8   �  s     z        len(clusters) = c                 s   s   | ]}|j V  qd S r1   )r|   )r6   Ú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   Úupdater:   )"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œ   Z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   ?  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$   r0   r+   r,   r.   ZPairPosr2   r>   rE   ÚboolrF   ZValueRecordZPairsrW   ra   rb   ri   rJ   r"   r"   r"   r#   Ú<module>   st    

  þ  þÿÿ ýþúþ ýü