a
    èÝEb9F  ã                   @   sÒ  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mZ d dlmZ d d	lmZmZ d
ZdZe  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j(ej(f f Z)ee* dœd d!„Z+d.eeeee*e*f  e*e*f  ee* d#œd$d%„Z,ed&g d'¢ƒZ-G d(d)„ d)ƒZ.d/ee)e*ee) d+œd,d-„Z/dS )0é    N)ÚdefaultdictÚ
namedtuple)Úreduce)Úchain)Úlog2)ÚDefaultDictÚDictÚIterableÚListÚSequenceÚTuple)Ú	bit_countÚbit_indices)ÚTTFont)ÚotBaseÚotTablesZFONTTOOLS_GPOS_COMPACT_MODEÚ0zfontTools.otlLib.optimize.gpos)ÚfontÚmodeÚreturnc                 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Úlookup© r   ú^/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/otlLib/optimize/gpos.pyÚcompact   s    
r    )r   r   r   r   c                 C   s"   t | ||jƒ}||_t|ƒ|_d S ©N)Úcompact_pair_posr   ÚlenÚSubTableCount)r   r   r   Únew_subtablesr   r   r   r   ,   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>4   ó    z&compact_ext_lookup.<locals>.<listcomp>é   )	r"   r   r   ZExtensionPosÚFormatr&   Úappendr#   r$   )r   r   r   r%   Znew_ext_subtablesÚsubtabler(   r   r   r   r   2   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   )r,   r-   ÚextendÚcompact_class_pairs)r   r   r/   r%   r.   r   r   r   r"   @   s    

r"   )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k�r$|dv �r$t| |	t|ƒƒ}|D ]}| 	|||  ¡ ƒ¡ �qntdt› d|› �ƒ‚|S )	Nr   )ÚbuildPairPosClassesSubtableÚValue1ÚValue2r+   Z	123456789zBad ú=)ZfontTools.otlLib.builderr2   r   ÚlistZCoverageZglyphsZ	ClassDef1Z	classDefsÚgetr-   Z	ClassDef2ÚitemsÚ	enumerateZClass1RecordÚClass2RecordÚis_really_zeroÚgetattrÚtupleÚsortedr#   Ú,cluster_pairs_by_class2_coverage_custom_costÚintÚgetReverseGlyphMapÚ
ValueErrorÚGPOS_COMPACT_MODE_ENV_KEY)r   r   r.   r2   r/   Zclasses1ÚgZclasses2ÚiZ	all_pairsÚclass1ÚjÚclass2Zgrouped_pairsÚpairsr   r   r   r1   M   s4    

þ(
ÿÿ
r1   )rH   r   c                 C   s@   t | dd ƒ}t | dd ƒ}|d u s,| ¡ dko>|d u p>| ¡ dkS )Nr3   r4   r   )r<   ÚgetEffectiveFormat)rH   Úv1Úv2r   r   r   r;   p   s
    ÿr;   .)ÚglyphIDsc                 C   st   t | ƒ} | d }|gg}| dd … D ].}||d krN|d  |¡ | |g¡ |}q$|d  |¡ || d | d fS )Nr   r+   éÿÿÿÿ)r>   r-   )rM   ÚlastÚrangesZglyphIDr   r   r   Ú_getClassRanges~   s    rQ   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)rR   rS   ZcoverageZfirst_rangesZmin_glyph_idZmax_glyph_idZrange_countrE   ÚdataZ
glyphCountÚformat1_bytesÚformat2_bytesr   r   r   Ú_classDef_bytesŒ   s    r[   Ú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)re   rf   c                 C   s"   || _ || _d | _d | _d | _d S r!   rd   )Úselfre   rf   r   r   r   Ú__init__¼   s
    zCluster.__init__c                 C   s   | j d u rt| jƒ| _ | j S r!   )rg   r   rf   ©rj   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 r!   )re   r]   ©r'   rE   rl   r   r   Ú	<genexpr>Î   r*   z)Cluster.column_indices.<locals>.<genexpr>)rh   r   r@   Ú__or__rm   r   )rj   Zbitmaskr   rl   r   Úcolumn_indicesÉ   s    

zCluster.column_indicesc                 C   s   t | jƒd S )Nr+   )r#   rq   rl   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 )NrT   r   )
ri   Úcoverage_bytesÚclassDef1_bytesÚclassDef2_bytesre   ra   rb   r#   rm   rr   rl   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 )	NrU   c                 3   s   | ]}t ˆ jj| ƒV  qd S r!   ©r#   re   r^   rn   rl   r   r   ro     r*   z)Cluster.coverage_bytes.<locals>.<genexpr>r   c                 3   s   | ]}ˆ j j| d  V  qdS ©r   N)re   r_   rn   rl   r   r   ro     r*   r   r+   rT   )Úsumrm   r>   r   Úfrom_iterablerV   )rj   rY   rP   Zmerged_range_countrO   ÚstartÚendrZ   r   rl   r   rs   ù   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 r!   rw   )rE   rl   r   r   Ú<lambda>   r*   z)Cluster.classDef1_bytes.<locals>.<lambda>)Úkeyc                    s   g | ]}|ˆ kr|‘qS r   r   rn   )Úbiggest_indexr   r   r)   "  r*   z+Cluster.classDef1_bytes.<locals>.<listcomp>)rW   rm   r[   re   r_   rl   r   )r   rj   r   rt     s    ÿzCluster.classDef1_bytesc                 C   s   t | jj| jƒS r!   )r[   re   r`   rq   rl   r   r   r   ru   %  s    zCluster.classDef2_bytesN)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r\   r@   rk   Úpropertyrm   rq   rr   rv   rs   rt   ru   r   r   r   r   rc   ¯   s    



!

rc   é   )r   rI   Ú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 rx   r   ©r'   Úpairr   r   r   ro   5  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   ro   6  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   )r'   rE   rH   )rF   rI   r   r   ro   :  s   ÿúJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)ry   r9   )r'   )Ú
all_class2rI   )rF   r   r)   9  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 r!   r   ©r'   Úname©Ú
name_to_idr   r   ro   E  r*   r‰   ©rQ   ©r'   Úclsr�   r   r   r)   D  s   c                    s"   g | ]}t ‡ fd d„|D ƒƒ‘qS )c                 3   s   | ]}ˆ | V  qd S r!   r   r‹   r�   r   r   ro   H  r*   r‰   r�   r�   r�   r   r   r)   G  s   r   r+   r   )rm   r   c                    s.   ˆ   | d ¡}|d ur|S tˆ| ƒ}|ˆ | < |S r!   )r7   rc   )rm   Úcluster)Úcluster_cachere   r   r   Úmake_cluster^  s    
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster)r’   Úotherr   c                    s   ˆ | j |j B ƒS r!   )rf   )r’   r•   ©r”   r   r   Úmergef  s    z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                    s   g | ]}ˆ d |> ƒ‘qS )r+   r   rn   r–   r   r   r)   m  r*   z        len(clusters) = c                 s   s   | ]}|j V  qd S r!   )rv   )r'   Úcr   r   r   ro   �  r*   z            len(clusters) = Z3dz    size_reduction=z5.2fz    max_new_subtables=r   )r>   ÚsetrA   r8   rJ   r   r\   r@   rc   Úranger#   rv   ÚlogÚdebugr9   ry   r   r   Údictrm   Úupdater-   )"r   rI   r†   r^   r]   r_   r`   Zformat1Zformat2rˆ   Úvaluera   rb   r—   ZclustersZcost_before_splittingZlowest_cost_changeZbest_cluster_indexZbest_other_indexZbest_mergedrE   r’   rG   r•   ÚmergedZcost_changeZcost_after_splittingZsize_reductionZmax_new_subtablesZpairs_by_class1ÚvaluesZpairs_groupsZpairs_grouprF   r   )rŠ   r“   re   r”   rŽ   rI   r   r?   +  sš    û	
ÿ
ÿú	

	ÿ

r?   )F)r…   )0ÚloggingÚcollectionsr   r   Ú	functoolsr   Ú	itertoolsr   Úmathr   Útypingr   r   r	   r
   r   r   ZfontTools.misc.intToolsr   r   ZfontTools.ttLibr   ZfontTools.ttLib.tablesr   r   rC   ZGPOS_COMPACT_MODE_DEFAULTÚ	getLoggerr›   Ústrr    r   r   r   ZPairPosr"   r1   r:   Úboolr;   ZValueRecordZPairsr@   rQ   r[   r\   rc   r?   r   r   r   r   Ú<module>   sX    
þþ#ÿÿ ýþþ ýü