a
    ZXhE                     @   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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j0e1dd d!Z2eeee$d"f ee$d"f f eej3ej3f f Z4ee' d#d$d%Z5d2eeeee'e'f  e'e'f  ee' d'd(d)Z6ed*g d+Z7eG d,d- d-Z8d3ee4e'ee4 d/d0d1Z9dS )4    N)defaultdict
namedtuple)	dataclass)cached_property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$   c/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/fontTools/otlLib/optimize/gpos.py_compression_level_from_env   s    


r&   )fontlevelr   c                 C   sh   |  d}|d u r| S |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   )	gettableZ
LookupListLookupZ
LookupTypecompact_lookupSubTableZExtensionLookupTypecompact_ext_lookup)r'   r(   Zgposlookupr$   r$   r%   compact+   s    

r2   )r'   r(   r1   r   c                 C   s"   t | ||j}||_t||_d S N)compact_pair_posr/   r!   SubTableCount)r'   r(   r1   new_subtablesr$   r$   r%   r.   H   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>P       z&compact_ext_lookup.<locals>.<listcomp>r   )	r4   r/   r   ZExtensionPosFormatr7   appendr!   r5   )r'   r(   r1   r6   Znew_ext_subtablessubtabler9   r$   r$   r%   r0   N   s    r0   )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(   r?   r6   r>   r$   r$   r%   r4   \   s    

r4   )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.builderrB   r   listZCoverageZglyphsZ	ClassDef1Z	classDefsr+   r=   Z	ClassDef2items	enumerateZClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r'   r(   r>   rB   r?   Zclasses1gZclasses2iZ	all_pairsclass1jclass2Zgrouped_pairspairsr$   r$   r%   rA   i   s(    

(rA   )rS   r   c                 C   s@   t | dd }t | dd }|d u s,| dko>|d u p>| dkS )NrC   rD   r   )rJ   getEffectiveFormat)rS   Zv1Zv2r$   r$   r%   rI      s
    rI   .)glyphIDsc                 C   st   t | } | d }|gg}| dd  D ].}||d krN|d | ||g |}q$|d | || d | d fS )Nr   r   )rL   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_countrP   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                   @   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 r3   )r   rn   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 r3   )rm   rf   r8   rP   ro   r$   r%   	<genexpr>   r;   z)Cluster.column_indices.<locals>.<genexpr>)r   r"   __or__rq   r   )rp   Zbitmaskr$   ro   r%   column_indices   s    zCluster.column_indicesc                 C   s   t | jd S )Nr   )r!   ru   ro   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 )Nr]   r)   )	coverage_bytesclassDef1_bytesclassDef2_bytesrm   rj   rk   r!   rq   rv   ro   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rn||d krn|d7 }|}qJd|d  }t||S )	Nr^   c                 3   s   | ]}t  jj| V  qd S r3   r!   rm   rg   rr   ro   r$   r%   rs     r;   z)Cluster.coverage_bytes.<locals>.<genexpr>r)   c                 3   s   | ]} j j| d  V  qdS r   N)rm   rh   rr   ro   r$   r%   rs     r;   r   r   r]   )sumrq   rL   r   from_iterabler_   )rp   rb   rY   Zmerged_range_countrX   startendrc   r$   ro   r%   rw      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 r3   r{   )rP   ro   r$   r%   <lambda>   r;   z)Cluster.classDef1_bytes.<locals>.<lambda>)keyc                    s   g | ]}| kr|qS r$   r$   rr   )biggest_indexr$   r%   r:   "  r;   z+Cluster.classDef1_bytes.<locals>.<listcomp>)r`   rq   rd   rm   rh   ro   r$   )r   rp   r%   rx     s    zCluster.classDef1_bytesc                 C   s   t | jj| jS r3   )rd   rm   ri   ru   ro   r$   r$   r%   ry   %  s    zCluster.classDef2_bytesN)__name__
__module____qualname__re   __annotations__r"   r   rq   ru   propertyrv   rz   rw   rx   ry   r$   r$   r$   r%   rl      s    






rl      )r'   rT   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$   r8   pairr$   r$   r%   rs   5  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%   rs   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$   )r8   rP   rS   )rQ   rT   r$   r%   rs   :  s   Jcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)r}   rG   )r8   )
all_class2rT   )rQ   r%   r:   9  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 r3   r$   r8   name
name_to_idr$   r%   rs   E  r;   r   rZ   r8   clsr   r$   r%   r:   D  s   c                    s"   g | ]}t  fd d|D qS )c                 3   s   | ]} | V  qd S r3   r$   r   r   r$   r%   rs   H  r;   r   r   r   r   r$   r%   r:   G  s   r   r   r)   )rq   r   c                    s.     | d }|d ur|S t| }| | < |S r3   )r+   rl   )rq   cluster)cluster_cacherm   r$   r%   make_cluster^  s    
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster)r   otherr   c                    s    | j |j B S r3   )rn   )r   r   r   r$   r%   mergef  s    z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                    s   g | ]} d |> qS )r   r$   rr   r   r$   r%   r:   m  r;   z        len(clusters) = c                 s   s   | ]}|j V  qd S r3   )rz   )r8   cr$   r$   r%   rs     r;   z            len(clusters) = Z3dz    size_reduction=z5.2fz    max_new_subtables=r*   )rL   setrN   rF   rU   r   re   r"   rl   ranger!   rz   logdebugrG   r}   r   r   dictrq   updater=   )"r'   rT   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_mergedrP   r   rR   r   mergedZcost_changeZcost_after_splittingZsize_reductionZmax_new_subtablesZpairs_by_class1valuesZpairs_groupsZpairs_grouprQ   r$   )r   r   rm   r   r   rT   r%   rM   +  s    	

	

	

rM   )F)r   ):loggingr   collectionsr   r   Zdataclassesr   	functoolsr   r   	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&   r2   r-   r.   r0   ZPairPosr4   rA   rH   boolrI   ZValueRecordZPairsrZ   rd   re   rl   rM   r$   r$   r$   r%   <module>   sd    

 i 