o
    %e*H                  
   @   s2  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#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j-de.fd d!Z/eeee!d"f ee!d"f f eej0ej0f f Z1d#ee$ fd$d%Z2	&d4d'eeeee$e$f  e$e$f  d(ee$ fd)d*Z3ed+g d,Z4G d-d. d.Z5	/d5ded0e1d1e$dee1 fd2d3Z6dS )6    N)defaultdict
namedtuple)reduce)chain)log2)DefaultDictDictIterableListSequenceTuple)OPTIONS)	bit_countbit_indices)TTFont)otBaseotTablesz:COMPRESSION_LEVEL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)	env_levelr    r$   Q/var/www/html/venv/lib/python3.10/site-packages/fontTools/otlLib/optimize/gpos.py_compression_level_from_env   s   


r&   fontlevelc                 C   sZ   | d }|j jjD ]!}|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(   gposlookupr$   r$   r%   compact*   s   
r6   r5   c                 C   s"   t | ||j}||_t||_d S N)compact_pair_posr1   r    SubTableCount)r'   r(   r5   new_subtablesr$   r$   r%   r0   A   s   r0   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   s    z&compact_ext_lookup.<locals>.<listcomp>r   )	r8   r1   r   ExtensionPosFormatr;   appendr    r9   )r'   r(   r5   r:   new_ext_subtablessubtabler=   r$   r$   r%   r3   G   s   r3   	subtablesc                 C   sD   g }|D ]}|j dkr|| q|j dkr|t| || q|S )Nr   r*   )r@   rA   extendcompact_class_pairs)r'   r(   rD   r:   rC   r$   r$   r%   r8   U   s   

r8   rC   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)fontTools.otlLib.builderrG   r   listCoverageglyphs	ClassDef1	classDefsgetrA   	ClassDef2items	enumerateClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r'   r(   rC   rG   rD   classes1gclasses2i	all_pairsclass1jclass2grouped_pairspairsr$   r$   r%   rF   b   s*   

&rF   rc   c                 C   s@   t | dd }t | dd }|d u s| dko|d u p| dkS )NrH   rI   r   )rW   getEffectiveFormat)rc   v1v2r$   r$   r%   rV   }   s
   rV   .glyphIDsc                 C   st   t | } | d }|gg}| dd  D ]}||d kr'|d | ||g |}q|d | || d | d fS )Nr   r   )rY   rA   )ri   lastrangesglyphIDr$   r$   r%   _getClassRanges   s   rn   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)ro   rp   coveragefirst_rangesmin_glyph_idmax_glyph_idrange_countr_   data
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                   @   sv   e Zd ZdZdedef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_costr   r   c                 C   s"   || _ || _d | _d | _d | _d S r7   r   )selfr   r   r$   r$   r%   __init__   s
   
zCluster.__init__c                 C   s   | j d u rt| j| _ | j S r7   )r   r   r   r   r$   r$   r%   indices   s   
zCluster.indicesc                    s6    j d u rttj fdd jD }t| _  j S )Nc                 3   s    | ]	} j j| V  qd S r7   )r   r   r<   r_   r   r$   r%   	<genexpr>   s    z)Cluster.column_indices.<locals>.<genexpr>)r   r   r!   __or__r   r   )r   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 r-d| j d d d | j d | j d d | jj| jj t| j | j	  | _ | j S )Nrq   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r7||d kr7|d7 }|}q%d|d  }t||S )	Nrr   c                 3   s     | ]}t  jj| V  qd S r7   r    r   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   r   r   r   r$   r%   r     r   r   r   rq   )sumr   rY   r   from_iterablers   )r   r|   rl   merged_range_countrk   startendr}   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 r7   r   )r_   r   r$   r%   <lambda>.  s    z)Cluster.classDef1_bytes.<locals>.<lambda>)keyc                    s   g | ]}| kr|qS r$   r$   r   )biggest_indexr$   r%   r>   0      z+Cluster.classDef1_bytes.<locals>.<listcomp>)rt   r   r~   r   r   r   r$   )r   r   r%   r   '  s   zCluster.classDef1_bytesc                 C   s   t | jj| jS r7   )r~   r   r   r   r   r$   r$   r%   r   3  s   zCluster.classDef2_bytesN)__name__
__module____qualname__	__slots__r   r!   r   propertyr   r   r   r   r   r   r   r$   r$   r$   r%   r      s"    



!

r      re   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$   r<   pairr$   r$   r%   r   C      z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>c                 s   r   )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$   )r<   r_   rc   )ra   re   r$   r%   r   H  s
    
Jcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r   rS   )r<   )
all_class2re   )ra   r%   r>   G  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 r7   r$   r<   name
name_to_idr$   r%   r   S  r   r   rn   r<   clsr   r$   r%   r>   R      c                    r   )c                 3   r   r7   r$   r   r   r$   r%   r   V  r   r   r   r   r   r$   r%   r>   U  r   r   r   r*   r   r   c                    s.     | d }|d ur|S t| }| | < |S r7   )rP   r   )r   cluster)cluster_cacher   r$   r%   make_clusterl  s   
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_clusterr   otherc                    s    | j |j B S r7   )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 r7   )r   )r<   cr$   r$   r%   r     s    z            len(clusters) = 3dz    size_reduction=z5.2fz    max_new_subtables=r+   )rY   setr[   rR   rf   r   r   r!   r   ranger    r   logdebugrS   r   r   r   dictr   updaterA   )"r'   re   r   r   r   r   r   format1format2r   valuer   r   r   clusterscost_before_splittinglowest_cost_changebest_cluster_indexbest_other_indexbest_mergedr_   r   rb   r   mergedcost_changecost_after_splittingsize_reductionmax_new_subtablespairs_by_class1valuespairs_groupspairs_groupra   r$   )r   r   r   r   r   re   r%   rZ   9  s   	

	

	
9
rZ   )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&   r6   r.   r0   r3   PairPosr8   rF   rU   boolrV   ValueRecordPairsrn   r~   r   r   rZ   r$   r$   r$   r%   <module>   s     




