a
    Qh*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"   W/var/www/sistema_ama/venv/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 )NGPOS   	   r   )table
LookupListLookup
LookupTypecompact_lookupSubTableExtensionLookupTypecompact_ext_lookup)r%   r&   Zgposlookupr"   r"   r#   compact*   s    
r3   )r%   r&   r2   r   c                 C   s"   t | ||j}||_t||_d S N)compact_pair_posr/   r   SubTableCount)r%   r&   r2   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   )	r5   r/   r   ExtensionPosFormatr8   appendr   r6   )r%   r&   r2   r7   Znew_ext_subtablessubtabler:   r"   r"   r#   r1   G   s    r1   )r%   r&   	subtablesr   c                 C   sD   g }|D ]6}|j dkr"|| q|j dkr|t| || q|S )Nr   r(   )r>   r?   extendcompact_class_pairs)r%   r&   rA   r7   r@   r"   r"   r#   r5   U   s    

r5   )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)fontTools.otlLib.builderrD   r   listCoverageglyphs	ClassDef1	classDefsgetr?   	ClassDef2items	enumerateClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r%   r&   r@   rD   rA   classes1gclasses2iZ	all_pairsclass1jclass2Zgrouped_pairspairsr"   r"   r#   rC   b   s(    

(rC   )r_   r   c                 C   s@   t | dd }t | dd }|d u s,| dko>|d u p>| dkS )NrE   rF   r   )rT   getEffectiveFormat)r_   v1v2r"   r"   r#   rS   }   s
    rS   .)glyphIDsc                 C   st   t | } | d }|gg}| dd  D ].}||d krN|d | ||g |}q$|d | || d | d fS )Nr   r   )rV   r?   )rd   lastrangesglyphIDr"   r"   r#   _getClassRanges   s    ri   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)rj   rk   coverageZfirst_rangesZmin_glyph_idZmax_glyph_idZrange_countr\   data
glyphCountformat1_bytesformat2_bytesr"   r"   r#   _classDef_bytes   s    ru   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)r   r   c                 C   s"   || _ || _d | _d | _d | _d S r4   r~   )selfr   r   r"   r"   r#   __init__   s
    zCluster.__init__c                 C   s   | j d u rt| j| _ | j S r4   )r   r   r   r   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 r4   )r   rw   r9   r\   r   r"   r#   	<genexpr>   r<   z)Cluster.column_indices.<locals>.<genexpr>)r   r   r    __or__r   r   )r   Z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 rZd| j d d d | j d | j d d | jj| jj t| j | j	  | _ | j S )Nrl   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rn||d krn|d7 }|}qJd|d  }t||S )	Nrm   c                 3   s   | ]}t  jj| V  qd S r4   r   r   rx   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   ry   r   r   r"   r#   r     r<   r   r   rl   )sumr   rV   r   from_iterablern   )r   rs   rg   Zmerged_range_countrf   startendrt   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 r4   r   )r\   r   r"   r#   <lambda>.  r<   z)Cluster.classDef1_bytes.<locals>.<lambda>)keyc                    s   g | ]}| kr|qS r"   r"   r   )biggest_indexr"   r#   r;   0  r<   z+Cluster.classDef1_bytes.<locals>.<listcomp>)ro   r   ru   r   ry   r   r"   )r   r   r#   r   '  s    zCluster.classDef1_bytesc                 C   s   t | jj| jS r4   )ru   r   rz   r   r   r"   r"   r#   r   3  s    zCluster.classDef2_bytesN)__name__
__module____qualname__	__slots__rv   r    r   propertyr   r   r   r   r   r   r   r"   r"   r"   r#   r}      s    



!

r}      )r%   r`   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"   r9   pairr"   r"   r#   r   C  r<   z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>c                 s   s   | ]}|d  V  qdS )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"   )r9   r\   r_   )r]   r`   r"   r#   r   H  s   Jcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r   rP   )r9   )
all_class2r`   )r]   r#   r;   G  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 r4   r"   r9   name
name_to_idr"   r#   r   S  r<   r   ri   r9   clsr   r"   r#   r;   R  s   c                    s"   g | ]}t  fd d|D qS )c                 3   s   | ]} | V  qd S r4   r"   r   r   r"   r#   r   V  r<   r   r   r   r   r"   r#   r;   U  s   r   r   r(   )r   r   c                    s.     | d }|d ur|S t| }| | < |S r4   )rM   r}   )r   cluster)cluster_cacher   r"   r#   make_clusterl  s    
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster)r   otherr   c                    s    | j |j B S r4   )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 r4   )r   )r9   cr"   r"   r#   r     r<   z            len(clusters) = Z3dz    size_reduction=z5.2fz    max_new_subtables=r)   )rV   setrX   rO   ra   r   rv   r    r}   ranger   r   logdebugrP   r   r   r   dictr   updater?   )"r%   r`   r   rx   rw   ry   rz   Zformat1Zformat2r   valuer{   r|   r   clustersZcost_before_splittingZlowest_cost_changeZbest_cluster_indexZbest_other_indexZbest_mergedr\   r   r^   r   mergedZcost_changeZcost_after_splittingZsize_reductionZmax_new_subtablesZpairs_by_class1valuesZpairs_groupsZpairs_groupr]   r"   )r   r   r   r   r   r`   r#   rW   9  s    	

	

	

rW   )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$   r3   r,   r.   r1   PairPosr5   rC   rR   boolrS   ValueRecordZPairsri   ru   rv   r}   rW   r"   r"   r"   r#   <module>   s`    

  