o
    hH                  
   @   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$   r/var/www/html/construction_image-detection-poc/venv/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   

r7   r6   c                 C   s"   t | ||j}||_t||_d S N)compact_pair_posr2   r    SubTableCount)r'   r(   r6   new_subtablesr$   r$   r%   r1   G   s   r1   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>O   s    z&compact_ext_lookup.<locals>.<listcomp>r   )	r9   r2   r   ExtensionPosFormatr<   appendr    r:   )r'   r(   r6   r;   new_ext_subtablessubtabler>   r$   r$   r%   r4   M   s   r4   	subtablesc                 C   sD   g }|D ]}|j dkr|| q|j dkr|t| || q|S )Nr   r*   )rA   rB   extendcompact_class_pairs)r'   r(   rE   r;   rD   r$   r$   r%   r9   [   s   

r9   rD   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.builderrH   r   listCoverageglyphs	ClassDef1	classDefsr,   rB   	ClassDef2items	enumerateClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r'   r(   rD   rH   rE   classes1gclasses2i	all_pairsclass1jclass2grouped_pairspairsr$   r$   r%   rG   h   s*   

&rG   rc   c                 C   s@   t | dd }t | dd }|d u s| dko|d u p| dkS )NrI   rJ   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   rB   )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 r8   r   )selfr   r   r$   r$   r%   __init__   s
   
zCluster.__init__c                 C   s   | j d u rt| j| _ | j S r8   )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 r8   )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 r8   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 r8   r   )r_   r   r$   r%   <lambda>4  s    z)Cluster.classDef1_bytes.<locals>.<lambda>)keyc                    s   g | ]}| kr|qS r$   r$   r   )biggest_indexr$   r%   r?   6      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 r8   )r~   r   r   r   r   r$   r$   r%   r   9  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   I      z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>c                 s   r   )r   Nr$   r   r$   r$   r%   r   J  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   N  s
    
Jcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r   rS   )r=   )
all_class2re   )ra   r%   r?   M  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 r8   r$   r=   name
name_to_idr$   r%   r   Y  r   r   rn   r=   clsr   r$   r%   r?   X      c                    r   )c                 3   r   r8   r$   r   r   r$   r%   r   \  r   r   r   r   r   r$   r%   r?   [  r   r   r   r*   r   r   c                    s.     | d }|d ur|S t| }| | < |S r8   )r,   r   )r   cluster)cluster_cacher   r$   r%   make_clusterr  s   
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_clusterr   otherc                    s    | j |j B S r8   )r   )r   r   r   r$   r%   mergez  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 r8   )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   updaterB   )"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   ?  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&   r7   r/   r1   r4   PairPosr9   rG   rU   boolrV   ValueRecordPairsrn   r~   r   r   rZ   r$   r$   r$   r%   <module>   s     




