o
    _h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_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&   R/var/www/html/myenv/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 )NGPOS   	   r   )	gettable
LookupListLookup
LookupTypecompact_lookupSubTableExtensionLookupTypecompact_ext_lookup)r)   r*   gposlookupr&   r&   r'   compact+   s   

r9   r8   c                 C   s"   t | ||j}||_t||_d S N)compact_pair_posr4   r"   SubTableCount)r)   r*   r8   new_subtablesr&   r&   r'   r3   H   s   r3   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   )	r;   r4   r   ExtensionPosFormatr>   appendr"   r<   )r)   r*   r8   r=   new_ext_subtablessubtabler@   r&   r&   r'   r6   N   s   r6   	subtablesc                 C   sD   g }|D ]}|j dkr|| q|j dkr|t| || q|S )Nr   r,   )rC   rD   extendcompact_class_pairs)r)   r*   rG   r=   rF   r&   r&   r'   r;   \   s   

r;   rF   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.builderrJ   r   listCoverageglyphs	ClassDef1	classDefsr.   rD   	ClassDef2items	enumerateClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r)   r*   rF   rJ   rG   classes1gclasses2i	all_pairsclass1jclass2grouped_pairspairsr&   r&   r'   rI   i   s*   

&rI   re   c                 C   s@   t | dd }t | dd }|d u s| dko|d u p| dkS )NrK   rL   r   )rY   getEffectiveFormat)re   v1v2r&   r&   r'   rX      s
   rX   .glyphIDsc                 C   st   t | } | d }|gg}| dd  D ]}||d kr'|d | ||g |}q|d | || d | d fS )Nr   r   )r[   rD   )rk   lastrangesglyphIDr&   r&   r'   _getClassRanges   s   rp   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)rq   rr   coveragefirst_rangesmin_glyph_idmax_glyph_idrange_countra   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                   @   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 r:   )r   r   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 r:   )r   r   r?   ra   r   r&   r'   	<genexpr>   s    z)Cluster.column_indices.<locals>.<genexpr>)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   sN   d| j  d d d | j d | j d d | jj| jj t| j | j  S )Nrs   r,   )	coverage_bytesclassDef1_bytesclassDef2_bytesr   r   r   r"   r   r   r   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 )	Nrt   c                 3   s     | ]}t  jj| V  qd S r:   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   rs   )sumr   r[   r   from_iterableru   )r   r~   rn   merged_range_countrm   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 r:   r   )ra   r   r&   r'   <lambda>   s    z)Cluster.classDef1_bytes.<locals>.<lambda>)keyc                    s   g | ]}| kr|qS r&   r&   r   )biggest_indexr&   r'   rA   "      z+Cluster.classDef1_bytes.<locals>.<listcomp>)rv   r   r   r   r   r   r&   )r   r   r'   r     s   zCluster.classDef1_bytesc                 C   s   t | jj| jS r:   )r   r   r   r   r   r&   r&   r'   r   %  s   zCluster.classDef2_bytesN)__name__
__module____qualname__r   __annotations__r#   r   r   r   propertyr   r   r   r   r   r&   r&   r&   r'   r      s"   
 





r      rg   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   5      z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>c                 s   r   )r   Nr&   r   r&   r&   r'   r   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?   ra   re   )rc   rg   r&   r'   r   :  s
    
Jcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r   rU   )r?   )
all_class2rg   )rc   r'   rA   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 r:   r&   r?   name
name_to_idr&   r'   r   E  r   r   rp   r?   clsr   r&   r'   rA   D      c                    r   )c                 3   r   r:   r&   r   r   r&   r'   r   H  r   r   r   r   r   r&   r'   rA   G  r   r   r   r,   r   r   c                    s.     | d }|d ur|S t| }| | < |S r:   )r.   r   )r   cluster)cluster_cacher   r&   r'   make_cluster^  s   
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_clusterr   otherc                    s    | j |j B S r:   )r   )r   r   r   r&   r'   mergef  s   z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                    s   g | ]} d |> qS )r   r&   r   r   r&   r'   rA   m  r   z        len(clusters) = c                 s   s    | ]}|j V  qd S r:   )r   )r?   cr&   r&   r'   r     s    z            len(clusters) = 3dz    size_reduction=z5.2fz    max_new_subtables=r-   )r[   setr]   rT   rh   r   r   r#   r   ranger"   r   logdebugrU   r   r   r   dictr   updaterD   )"r)   rg   r   r   r   r   r   format1format2r   valuer   r   r   clusterscost_before_splittinglowest_cost_changebest_cluster_indexbest_other_indexbest_mergedra   r   rd   r   mergedcost_changecost_after_splittingsize_reductionmax_new_subtablespairs_by_class1valuespairs_groupspairs_grouprc   r&   )r   r   r   r   r   rg   r'   r\   +  s   	

	

	
9
r\   )F)r   ):loggingr   collectionsr   r   dataclassesr   	functoolsr   r   	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(   r9   r1   r3   r6   PairPosr;   rI   rW   boolrX   ValueRecordPairsrp   r   r   r   r\   r&   r&   r&   r'   <module>   s     




i