a
    w=ic+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"   o/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/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 )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       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'   )r9   r:   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|rqt|dd t|dd f|	tt|| tt|| f< qqzt| |	|}|D ]}|	|||   q|S )Nr   )buildPairPosClassesSubtableValue1Value2)ZfontTools.otlLib.builderr?   r   listZCoverageZglyphsZ	ClassDef1Z	classDefsgetr:   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>   )rQ   r   c                 C   s@   t | dd }t | dd }|d u s,| dko>|d u p>| dkS )Nr@   rA   r   )rH   getEffectiveFormat)rQ   v1v2r"   r"   r#   rG   }   s
    rG   .)glyphIDsc                 C   st   t | } | d }|gg}| dd  D ].}||d krN|d | ||g |}q$|d | || d | d fS )Nr   r   )rJ   r:   )rV   lastrangesZglyphIDr"   r"   r#   _getClassRanges   s    rZ   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)r[   r\   ZcoverageZfirst_rangesZmin_glyph_idZmax_glyph_idZrange_countrN   dataZ
glyphCountformat1_bytesformat2_bytesr"   r"   r#   _classDef_bytes   s    rd   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)rn   ro   c                 C   s"   || _ || _d | _d | _d | _d S r0   rm   )selfrn   ro   r"   r"   r#   __init__   s
    zCluster.__init__c                 C   s   | j d u rt| j| _ | j S r0   )rp   r   ro   rs   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 r0   )rn   rf   r5   rN   ru   r"   r#   	<genexpr>   r8   z)Cluster.column_indices.<locals>.<genexpr>)rq   r   r    __or__rv   r   )rs   Zbitmaskr"   ru   r#   column_indices   s    

zCluster.column_indicesc                 C   s   t | jd S )Nr   )r   rz   ru   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 )Nr]   r'   )
rr   coverage_bytesclassDef1_bytesclassDef2_bytesrn   rj   rk   r   rv   r{   ru   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 )	Nr^   c                 3   s   | ]}t  jj| V  qd S r0   r   rn   rg   rw   ru   r"   r#   rx     r8   z)Cluster.coverage_bytes.<locals>.<genexpr>r'   c                 3   s   | ]} j j| d  V  qdS r   N)rn   rh   rw   ru   r"   r#   rx     r8   r   r   r]   )sumrv   rJ   r   from_iterabler_   )rs   rb   rY   Zmerged_range_countrX   startendrc   r"   ru   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 r0   r   )rN   ru   r"   r#   <lambda>-  r8   z)Cluster.classDef1_bytes.<locals>.<lambda>)keyc                    s   g | ]}| kr|qS r"   r"   rw   )biggest_indexr"   r#   r7   /  r8   z+Cluster.classDef1_bytes.<locals>.<listcomp>)r`   rv   rd   rn   rh   ru   r"   )r   rs   r#   r}   &  s    zCluster.classDef1_bytesc                 C   s   t | jj| jS r0   )rd   rn   ri   rz   ru   r"   r"   r#   r~   2  s    zCluster.classDef2_bytesN)__name__
__module____qualname__	__slots__re   r    rt   propertyrv   rz   r{   r   r|   r}   r~   r"   r"   r"   r#   rl      s    



!

rl      )r%   rR   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 }qt|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rd }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rtdd |D }d	||  }td	|  | }tdt
|dd|dd|  |dkrt
|}t
||d	 krq||= |||< qftt} D ]\}	}|||	d  |	< qg }|D ]:}t } |jD ]}|| }!| ||!  q||  q|S )Nc                 s   s   | ]}|d  V  qdS r   r"   r5   pairr"   r"   r#   rx   B  r8   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>c                 s   s   | ]}|d  V  qdS )r   Nr"   r   r"   r"   r#   rx   C  r8   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"   )r5   rN   rQ   )rO   rR   r"   r#   rx   G  s   Jcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r   rE   )r5   )
all_class2rR   )rO   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#   rx   R  r8   r   rZ   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#   rx   U  r8   r   r   r   r   r"   r#   r7   T  s   r   r   r'   )rv   r   c                    s.     | d }|d ur|S t| }| | < |S r0   )rC   rl   )rv   cluster)cluster_cachern   r"   r#   make_clusterk  s    
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster)r   otherr   c                    s    | j |j B S r0   )ro   )r   r   r   r"   r#   merges  s    z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                    s   g | ]} d |> qS )r   r"   rw   r   r"   r#   r7   z  r8   z        len(clusters) = c                 s   s   | ]}|j V  qd S r0   )r   )r5   cr"   r"   r#   rx     r8   z            len(clusters) = Z3dz    size_reduction=z5.2fz    max_new_subtables=r(   )rJ   setrL   rD   rS   r   re   r    rl   ranger   r   logdebugrE   r   r   r   dictrv   updater:   )"r%   rR   r   rg   rf   rh   ri   Zformat1Zformat2r   valuerj   rk   r   ZclustersZcost_before_splittingZlowest_cost_changeZbest_cluster_indexZbest_other_indexZbest_mergedrN   r   rP   r   mergedZcost_changeZcost_after_splittingZsize_reductionZmax_new_subtablesZpairs_by_class1valuesZpairs_groupsZpairs_grouprO   r"   )r   r   rn   r   r   rR   r#   rK   8  s    	

	

	

rK   )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>   rF   boolrG   ZValueRecordZPairsrZ   rd   re   rl   rK   r"   r"   r"   r#   <module>   s`    

  