a
    ¥Q•h*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$„Z2d1eeeee$e$f  e$e$f  ee$ d&œd'd(„Z3ed)g d*¢ƒZ4G d+d,„ d,ƒZ5d2ee1e$ee1 d.œd/d0„Z6dS )3é    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v r4dd l}| dt› d�t¡ tjt } t| ƒdkrP| dv 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/var/www/sistema_ama/venv/lib/python3.9/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 )NÚGPOSé   é	   r   )ÚtableÚ
LookupListÚLookupÚ
LookupTypeÚcompact_lookupÚSubTableÚExtensionLookupTypeÚcompact_ext_lookup)r%   r&   ZgposÚlookupr"   r"   r#   Úcompact*   s    
r3   )r%   r&   r2   r   c                 C   s"   t | ||jƒ}||_t|ƒ|_d S ©N)Úcompact_pair_posr/   r   ÚSubTableCount)r%   r&   r2   Ú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   ó    z&compact_ext_lookup.<locals>.<listcomp>r   )	r5   r/   r   ÚExtensionPosÚFormatr8   Úappendr   r6   )r%   r&   r2   r7   Znew_ext_subtablesÚsubtabler:   r"   r"   r#   r1   G   s    ÿr1   )r%   r&   Ú	subtablesr   c                 C   sD   g }|D ]6}|j dkr"| |¡ q|j dkr| t| ||ƒ¡ q|S )Nr   r(   )r>   r?   ÚextendÚcompact_class_pairs)r%   r&   rA   r7   r@   r"   r"   r#   r5   U   s    

r5   )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)ÚfontTools.otlLib.builderrD   r   ÚlistÚCoverageÚglyphsÚ	ClassDef1Ú	classDefsÚgetr?   Ú	ClassDef2ÚitemsÚ	enumerateÚClass1RecordÚClass2RecordÚis_really_zeroÚgetattrÚtupleÚsortedÚ,cluster_pairs_by_class2_coverage_custom_costÚgetReverseGlyphMap)r%   r&   r@   rD   rA   Úclasses1ÚgÚclasses2ÚiZ	all_pairsÚclass1ÚjÚclass2Zgrouped_pairsÚpairsr"   r"   r#   rC   b   s(    

þ(rC   )r_   r   c                 C   s@   t | dd ƒ}t | dd ƒ}|d u s,| ¡ dko>|d u p>| ¡ dkS )NrE   rF   r   )rT   ÚgetEffectiveFormat)r_   Úv1Úv2r"   r"   r#   rS   }   s
    ÿrS   .)ÚglyphIDsc                 C   st   t | ƒ} | d }|gg}| dd … D ].}||d krN|d  |¡ | |g¡ |}q$|d  |¡ || d | d fS )Nr   r   éÿÿÿÿ)rV   r?   )rd   ÚlastÚrangesÚglyphIDr"   r"   r#   Ú_getClassRangesŒ   s    ri   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)rj   rk   ÚcoverageZfirst_rangesZmin_glyph_idZmax_glyph_idZrange_countr\   ÚdataÚ
glyphCountÚformat1_bytesÚformat2_bytesr"   r"   r#   Ú_classDef_bytesš   s    ru   Ú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)r   r€   c                 C   s"   || _ || _d | _d | _d | _d S r4   r~   )Úselfr   r€   r"   r"   r#   Ú__init__Ê   s
    zCluster.__init__c                 C   s   | j d u rt| jƒ| _ | j S r4   )r�   r   r€   ©r„   r"   r"   r#   ÚindicesÑ   s    
zCluster.indicesc                    s6   ˆ j d u r0ttj‡ fdd„ˆ jD ƒƒ}t|ƒˆ _ ˆ j S )Nc                 3   s   | ]}ˆ j j| V  qd S r4   )r   rw   ©r9   r\   r†   r"   r#   Ú	<genexpr>Ü   r<   z)Cluster.column_indices.<locals>.<genexpr>)r‚   r   r    Ú__or__r‡   r   )r„   Zbitmaskr"   r†   r#   Úcolumn_indices×   s    

zCluster.column_indicesc                 C   s   t | jƒd S )Nr   )r   r‹   r†   r"   r"   r#   Úwidthà   s    zCluster.widthc                 C   s`   | j d u rZd| j d d d | j d | j d d | jj| jj t| jƒ | j	  | _ | j S )Nrl   r(   )
rƒ   Úcoverage_bytesÚclassDef1_bytesÚclassDef2_bytesr   r{   r|   r   r‡   rŒ   r†   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 urn||d krn|d7 }|}qJd|d  }t||ƒS )	Nrm   c                 3   s   | ]}t ˆ jj| ƒV  qd S r4   ©r   r   rx   rˆ   r†   r"   r#   r‰     r<   z)Cluster.coverage_bytes.<locals>.<genexpr>r(   c                 3   s   | ]}ˆ j j| d  V  qdS ©r   N)r   ry   rˆ   r†   r"   r#   r‰     r<   r   r   rl   )Úsumr‡   rV   r   Úfrom_iterablern   )r„   rs   rg   Zmerged_range_countrf   ÚstartÚendrt   r"   r†   r#   r�     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 r4   r‘   )r\   r†   r"   r#   Ú<lambda>.  r<   z)Cluster.classDef1_bytes.<locals>.<lambda>)Úkeyc                    s   g | ]}|ˆ kr|‘qS r"   r"   rˆ   )Úbiggest_indexr"   r#   r;   0  r<   z+Cluster.classDef1_bytes.<locals>.<listcomp>)ro   r‡   ru   r   ry   r†   r"   )r™   r„   r#   rŽ   '  s    ÿzCluster.classDef1_bytesc                 C   s   t | jj| jƒS r4   )ru   r   rz   r‹   r†   r"   r"   r#   r�   3  s    zCluster.classDef2_bytesN)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__rv   r    r…   Úpropertyr‡   r‹   rŒ   r�   r�   rŽ   r�   r"   r"   r"   r#   r}   ½   s    



!

r}   é   )r%   r`   Ú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 u �sà||k �r¨|}|}|d	 | }|}�q¨�qŒ|d u�sJ ‚|d u�sJ ‚|d u�s*J ‚|d u�s8J ‚|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"   ©r9   Úpairr"   r"   r#   r‰   C  r<   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>c                 s   s   | ]}|d  V  qdS )r   Nr"   r¡   r"   r"   r#   r‰   D  r<   c                    s(   g | ] ‰ t ‡ ‡fd d„tˆƒD ƒƒ‘qS )c                 3   s*   | ]"\}}ˆ |fˆv rd |> ndV  qdS )r   r   Nr"   )r9   r\   r_   )r]   r`   r"   r#   r‰   H  s   ÿúJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r“   rP   )r9   )Ú
all_class2r`   )r]   r#   r;   G  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 r4   r"   ©r9   Úname©Ú
name_to_idr"   r#   r‰   S  r<   r£   ©ri   ©r9   Úclsr§   r"   r#   r;   R  s   c                    s"   g | ]}t ‡ fd d„|D ƒƒ‘qS )c                 3   s   | ]}ˆ | V  qd S r4   r"   r¥   r§   r"   r#   r‰   V  r<   r£   r©   rª   r§   r"   r#   r;   U  s   r   r   r(   )r‡   r   c                    s.   ˆ   | d ¡}|d ur|S tˆ| ƒ}|ˆ | < |S r4   )rM   r}   )r‡   Úcluster)Úcluster_cacher   r"   r#   Úmake_clusterl  s    
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster)r¬   Úotherr   c                    s   ˆ | j |j B ƒS r4   )r€   )r¬   r¯   ©r®   r"   r#   Úmerget  s    z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                    s   g | ]}ˆ d |> ƒ‘qS )r   r"   rˆ   r°   r"   r#   r;   {  r<   z        len(clusters) = c                 s   s   | ]}|j V  qd S r4   )r�   )r9   Úcr"   r"   r#   r‰   �  r<   z            len(clusters) = Z3dz    size_reduction=z5.2fz    max_new_subtables=r)   )rV   ÚsetrX   rO   ra   r   rv   r    r}   Úranger   r�   ÚlogÚdebugrP   r“   r   r   Údictr‡   Úupdater?   )"r%   r`   r    rx   rw   ry   rz   Zformat1Zformat2r¢   Úvaluer{   r|   r±   ÚclustersZcost_before_splittingZlowest_cost_changeZbest_cluster_indexZbest_other_indexZbest_mergedr\   r¬   r^   r¯   ÚmergedZcost_changeZcost_after_splittingZsize_reductionZmax_new_subtablesZpairs_by_class1ÚvaluesZpairs_groupsZpairs_groupr]   r"   )r¤   r­   r   r®   r¨   r`   r#   rW   9  sš    û	
ÿ
ÿú	

	ÿ

rW   )F)rŸ   )7Úloggingr   Úcollectionsr   r   Ú	functoolsr   Ú	itertoolsr   Úmathr   Útypingr   r   r	   r
   r   r   ÚfontTools.configr   ÚfontTools.misc.intToolsr   r   ÚfontTools.ttLibr   ÚfontTools.ttLib.tablesr   r   Ú	getLoggerrš   rµ   ÚCOMPRESSION_LEVELr   ÚstrÚdefaultr   r    r$   r3   r,   r.   r1   ÚPairPosr5   rC   rR   ÚboolrS   ÚValueRecordZPairsri   ru   rv   r}   rW   r"   r"   r"   r#   Ú<module>   s`    

þþÿÿ ýþþ ýü