o
    iE                  
   @   sF  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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&de'fddZ(dede'defddZ)dede'dej*ddfddZ+dede'dej*ddfddZ,dede'deej- deej- fddZ.dede'dej-deej- fddZ/d ej0de1fd!d"Z2eeee$d#f ee$d#f f eej3ej3f f Z4d$ee' fd%d&Z5	'd5d(eeeee'e'f  e'e'f  d)ee' fd*d+Z6ed,g d-Z7eG d.d/ d/Z8	0d6ded1e4d2e'dee4 fd3d4Z9dS )7    N)defaultdict
namedtuple)	dataclass)cached_property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   sd   t } ttjv rdd l}|dt dt tjt } t| dkr(| dv r(t| S t	dt d|  )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$   m/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/fontTools/otlLib/optimize/gpos.py_compression_level_from_env   s   


r&   fontlevelc                 C   sh   |  d}|d u r| S |jjjD ]!}|jdkrt| || q|jdkr1|jd jdkr1t| || 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   

r2   r1   c                 C   s"   t | ||j}||_t||_d S N)compact_pair_posr/   r!   SubTableCount)r'   r(   r1   new_subtablesr$   r$   r%   r.   H   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>P   s    z&compact_ext_lookup.<locals>.<listcomp>r   )	r4   r/   r   ZExtensionPosFormatr7   appendr!   r5   )r'   r(   r1   r6   Znew_ext_subtablessubtabler9   r$   r$   r%   r0   N   s   r0   	subtablesc                 C   sD   g }|D ]}|j dkr|| q|j dkr|t| || q|S )Nr   r)   )r;   r<   extendcompact_class_pairs)r'   r(   r>   r6   r=   r$   r$   r%   r4   \   s   

r4   r=   c              	   C   s  ddl m} g }tt}|jjD ]}||jj|d 	| qtt}|j
j D ]\}}|| 	| q*i }	t|jD ]/\}}
t|
jD ]%\}}t|rOqFt|dd t|dd f|	tt|| tt|| f< qFq=t| |	|}|D ]}|	|||   qu|S )Nr   )buildPairPosClassesSubtableValue1Value2)ZfontTools.otlLib.builderrA   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=   rA   r>   Zclasses1gZclasses2iZ	all_pairsclass1jclass2Zgrouped_pairspairsr$   r$   r%   r@   i   s*   

&r@   rR   c                 C   s@   t | dd }t | dd }|d u s| dko|d u p| dkS )NrB   rC   r   )rI   getEffectiveFormat)rR   Zv1Zv2r$   r$   r%   rH      s
   rH   .glyphIDsc                 C   st   t | } | d }|gg}| dd  D ]}||d kr'|d | ||g |}q|d | || d | d fS )Nr   r   )rK   r<   )rU   lastrangesZglyphIDr$   r$   r%   _getClassRanges   s   rY   F
class_data	class_idsc                 C   s   |sdS | |d  \}}}t |}|dd  D ]}| | }|t |d 7 }t||d }t||d }q|| d }	d|	d  }
d|d  }t|
|S )Nr   r   r)         )r!   minmax)rZ   r[   ZcoverageZfirst_rangesZmin_glyph_idZmax_glyph_idZrange_countrO   dataZ
glyphCountformat1_bytesformat2_bytesr$   r$   r%   _classDef_bytes   s   
rc   ClusteringContext)lines
all_class1all_class1_dataall_class2_datavalueFormat1_bytesvalueFormat2_bytesc                   @   sr   e Zd ZU eed< eed< 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_bitmaskc                 C   s
   t | jS r3   )r   rm   selfr$   r$   r%   indices   s   
zCluster.indicesc                    s$   t tj fdd jD }t|S )Nc                 3   s    | ]	} j j| V  qd S r3   )rl   re   r8   rO   rn   r$   r%   	<genexpr>   s    z)Cluster.column_indices.<locals>.<genexpr>)r   r"   __or__rp   r   )ro   Zbitmaskr$   rn   r%   column_indices   s   zCluster.column_indicesc                 C   s   t | jd S )Nr   )r!   rt   rn   r$   r$   r%   width   s   zCluster.widthc                 C   sN   d| j  d d d | j d | j d d | jj| jj t| j | j  S )Nr\   r)   )	coverage_bytesclassDef1_bytesclassDef2_bytesrl   ri   rj   r!   rp   ru   rn   r$   r$   r%   cost   s4   	zCluster.costc                    s   dt  fdd jD d  }tt fdd jD }d}d }|D ]\}}|d ur7||d kr7|d7 }|}q%d|d  }t||S )	Nr]   c                 3   s     | ]}t  jj| V  qd S r3   r!   rl   rf   rq   rn   r$   r%   rr         z)Cluster.coverage_bytes.<locals>.<genexpr>r)   c                 3   s     | ]} j j| d  V  qdS r   N)rl   rg   rq   rn   r$   r%   rr     r{   r   r   r\   )sumrp   rK   r   from_iterabler^   )ro   ra   rX   Zmerged_range_countrW   startendrb   r$   rn   r%   rv      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 r3   rz   )rO   rn   r$   r%   <lambda>   s    z)Cluster.classDef1_bytes.<locals>.<lambda>)keyc                    s   g | ]}| kr|qS r$   r$   rq   )biggest_indexr$   r%   r:   "      z+Cluster.classDef1_bytes.<locals>.<listcomp>)r_   rp   rc   rl   rg   rn   r$   )r   ro   r%   rw     s   zCluster.classDef1_bytesc                 C   s   t | jj| jS r3   )rc   rl   rh   rt   rn   r$   r$   r%   rx   %  s   zCluster.classDef2_bytesN)__name__
__module____qualname__rd   __annotations__r"   r   rp   rt   propertyru   ry   rv   rw   rx   r$   r$   r$   r%   rk      s"   
 





rk      rS   compressionc           "         sH  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 rR|
d  ndO }||
d	 r`|
d	  ndO }qCt|d
 }t|d
 }t||||||i dtdtffdddtdtdtffdd}fddt	t
|D }d	t
|> d	 j}tdt
|  t
|d	krjd }d }d }d }t|D ]5\}}t||d	 d  D ]&\}}|||}|j|j |j }|d u s||k r|}|}|d	 | }|}qq|d usJ |d usJ |d usJ |d usJ |dkr]tdd |D }d	||  }td	|  | }tdt
|dd|dd|  |dkrSt
|}t
||d	 kr]n||= |||< t
|d	kstt} D ]\}	}|||	d  |	< qrg }|D ]}t } |jD ]}|| }!| ||!  q||  q|S )Nc                 s       | ]}|d  V  qdS r|   r$   r8   pairr$   r$   r%   rr   5      z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>c                 s   r   )r   Nr$   r   r$   r$   r%   rr   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$   )r8   rO   rR   )rP   rS   r$   r%   rr   :  s
    
Jcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r}   rF   )r8   )
all_class2rS   )rP   r%   r:   9  s    z@cluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>c                    "   g | ]}t  fd d|D qS )c                 3       | ]} | V  qd S r3   r$   r8   name
name_to_idr$   r%   rr   E  r   r   rY   r8   clsr   r$   r%   r:   D      c                    r   )c                 3   r   r3   r$   r   r   r$   r%   rr   H  r   r   r   r   r   r$   r%   r:   G  r   r   r   r)   rp   r   c                    s.     | d }|d ur|S t| }| | < |S r3   )r+   rk   )rp   cluster)cluster_cacherl   r$   r%   make_cluster^  s   
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_clusterr   otherc                    s    | j |j B S r3   )rm   )r   r   r   r$   r%   mergef  s   z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                    s   g | ]} d |> qS )r   r$   rq   r   r$   r%   r:   m  r   z        len(clusters) = c                 s   s    | ]}|j V  qd S r3   )ry   )r8   cr$   r$   r%   rr     s    z            len(clusters) = Z3dz    size_reduction=z5.2fz    max_new_subtables=r*   )rK   setrM   rE   rT   r   rd   r"   rk   ranger!   ry   logdebugrF   r}   r   r   dictrp   updater<   )"r'   rS   r   rf   re   rg   rh   Zformat1Zformat2r   valueri   rj   r   ZclustersZcost_before_splittingZlowest_cost_changeZbest_cluster_indexZbest_other_indexZbest_mergedrO   r   rQ   r   mergedZcost_changeZcost_after_splittingZsize_reductionZmax_new_subtablesZpairs_by_class1valuesZpairs_groupsZpairs_grouprP   r$   )r   r   rl   r   r   rS   r%   rL   +  s   	

	

	
9
rL   )F)r   ):loggingr   collectionsr   r   dataclassesr   	functoolsr   r   	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&   r2   r-   r.   r0   ZPairPosr4   r@   rG   boolrH   ZValueRecordZPairsrY   rc   rd   rk   rL   r$   r$   r$   r%   <module>   s     




i