B
    0uf+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$Z2d6eeeee$e$f  e$e$f  ee$ d&d'd(Z3ed)d*d+d,d-d.d/gZ4G d0d1 d1Z5d7ee1e$ee1 d3d4d5Z6dS )8    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kr4dd l}|dt dt tjt } t| dkrP| dk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"   `/home/ankuromar296_gmail_com/myenv/lib/python3.7/site-packages/fontTools/otlLib/optimize/gpos.py_compression_level_from_env   s    


r$   )fontlevelr   c             C   s^   | d }xP|j jjD ]B}|jdkr0t| || q|jdkr|jd jdkrt| || qW | S )NZGPOS   	   r   )tableZ
LookupListLookupZ
LookupTypecompact_lookupSubTableZExtensionLookupTypecompact_ext_lookup)r%   r&   Zgposlookupr"   r"   r#   compact*   s    
r/   )r%   r&   r.   r   c             C   s"   t | ||j}||_t||_d S )N)compact_pair_posr,   r   SubTableCount)r%   r&   r.   new_subtablesr"   r"   r#   r+   A   s    r+   c             C   s\   t | |dd |jD }g }x*|D ]"}t }d|_||_|| q"W ||_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   )	r0   r,   r   ZExtensionPosFormatr3   appendr   r1   )r%   r&   r.   r2   Znew_ext_subtablessubtabler5   r"   r"   r#   r-   G   s    
r-   )r%   r&   	subtablesr   c             C   sH   g }x>|D ]6}|j dkr$|| q
|j dkr
|t| || q
W |S )Nr   r'   )r7   r8   extendcompact_class_pairs)r%   r&   r:   r2   r9   r"   r"   r#   r0   U   s    


r0   )r%   r&   r9   r   c          	   C   s  ddl m} g }tt}x*|jjD ]}||jj|d 	| q"W tt}x&|j
j D ]\}}|| 	| qZW i }	xpt|jD ]b\}}
xXt|
jD ]J\}}t|rqt|dd t|dd f|	tt|| tt|| f< qW qW t| |	|}x |D ]}|	|||   qW |S )Nr   )buildPairPosClassesSubtableValue1Value2)ZfontTools.otlLib.builderr=   r   listZCoverageZglyphsZ	ClassDef1Z	classDefsgetr8   Z	ClassDef2items	enumerateZClass1RecordClass2Recordis_really_zerogetattrtuplesorted,cluster_pairs_by_class2_coverage_custom_costgetReverseGlyphMap)r%   r&   r9   r=   r:   Zclasses1gZclasses2iZ	all_pairsclass1jclass2Zgrouped_pairspairsr"   r"   r#   r<   b   s&    
6
r<   )rO   r   c             C   s@   t | dd }t | dd }|d ks,| dko>|d kp>| dkS )Nr>   r?   r   )rF   getEffectiveFormat)rO   Zv1Zv2r"   r"   r#   rE   }   s    rE   .)glyphIDsc             C   sx   t | } | d }|gg}x>| dd  D ].}||d krP|d | ||g |}q&W |d | || d | d fS )Nr   r   )rH   r8   )rR   lastrangesZglyphIDr"   r"   r#   _getClassRanges   s    rV   F)
class_data	class_idsc             C   s   |sdS | |d  \}}}t |}xH|dd  D ]8}| | }|t |d 7 }t||d }t||d }q0W || d }	d|	d  }
d|d  }t|
|S )Nr   r   r'         )r   minmax)rW   rX   ZcoverageZfirst_rangesZmin_glyph_idZmax_glyph_idZrange_countrL   dataZ
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               @   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)ri   rj   c             C   s"   || _ || _d | _d | _d | _d S )N)ri   rj   rk   rl   rm   )selfri   rj   r"   r"   r#   __init__   s
    zCluster.__init__c             C   s   | j d krt| j| _ | j S )N)rk   r   rj   )rn   r"   r"   r#   indices   s    
zCluster.indicesc                s6    j d kr0ttj fdd jD }t| _  j S )Nc             3   s   | ]} j j| V  qd S )N)ri   rb   )r4   rL   )rn   r"   r#   	<genexpr>   s    z)Cluster.column_indices.<locals>.<genexpr>)rl   r   r    __or__rp   r   )rn   Zbitmaskr"   )rn   r#   column_indices   s    

zCluster.column_indicesc             C   s   t | jd S )Nr   )r   rs   )rn   r"   r"   r#   width   s    zCluster.widthc             C   s`   | j d krZd| j d d d | j d | j d d | jj| jj t| j | j	  | _ | j S )NrY   r'   )
rm   coverage_bytesclassDef1_bytesclassDef2_bytesri   rf   rg   r   rp   rt   )rn   r"   r"   r#   cost   s    
,$zCluster.costc                s   dt  fdd jD d  }tt fdd jD }d}d }x0|D ](\}}|d k	rp||d krp|d7 }|}qLW d|d  }t||S )	NrZ   c             3   s   | ]}t  jj| V  qd S )N)r   ri   rc   )r4   rL   )rn   r"   r#   rq     s    z)Cluster.coverage_bytes.<locals>.<genexpr>r'   c             3   s   | ]} j j| d  V  qdS )r   N)ri   rd   )r4   rL   )rn   r"   r#   rq     s    r   r   rY   )sumrp   rH   r   from_iterabler[   )rn   r^   rU   Zmerged_range_countrT   startendr_   r"   )rn   r#   ru     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 )N)r   ri   rc   )rL   )rn   r"   r#   <lambda>-      z)Cluster.classDef1_bytes.<locals>.<lambda>)keyc                s   g | ]}| kr|qS r"   r"   )r4   rL   )biggest_indexr"   r#   r6   /  s    z+Cluster.classDef1_bytes.<locals>.<listcomp>)r\   rp   r`   ri   rd   )rn   r"   )r   rn   r#   rv   &  s    zCluster.classDef1_bytesc             C   s   t | jj| jS )N)r`   ri   re   rs   )rn   r"   r"   r#   rw   2  s    zCluster.classDef2_bytesN)__name__
__module____qualname__	__slots__ra   r    ro   propertyrp   rs   rt   rx   ru   rv   rw   r"   r"   r"   r#   rh      s   	" rh      )r%   rP   compressionr   c       "         s`  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}xL D ]@\}	}
||
d r|
d  ndO }||
d	 r|
d	  ndO }qW t|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
|  xrt
|d	krd }d }d }d }xt|D ]v\}}xjt||d	 d  D ]R\}}|||}|j|j |j }|d ks||k r|}|}|d	 | }|}qW qW |d k	st|d k	s,t|d k	s:t|d k	sHt|dkrtdd |D }d	||  }td	|  | }tdt
|dd|dd|  |dkrt
|}t
||d	 krP ||= |||< qnW tt}x& D ]\}	}|||	d  |	< qW g }xF|D ]>}t } x&|jD ]}|| }!| ||!  q,W ||  qW |S )Nc             s   s   | ]}|d  V  qdS )r   Nr"   )r4   pairr"   r"   r#   rq   B  s    z?cluster_pairs_by_class2_coverage_custom_cost.<locals>.<genexpr>c             s   s   | ]}|d  V  qdS )r   Nr"   )r4   r   r"   r"   r#   rq   C  s    c                s(   g | ]  t  fd dtD qS )c             3   s*   | ]"\}} |fkrd |> ndV  qdS )r   r   Nr"   )r4   rL   rO   )rM   rP   r"   r#   rq   H  s   zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)ry   rC   )r4   )
all_class2rP   )rM   r#   r6   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 )Nr"   )r4   name)
name_to_idr"   r#   rq   R  s    zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)rV   )r4   cls)r   r"   r#   r6   R  s    c                s"   g | ]}t  fd d|D qS )c             3   s   | ]} | V  qd S )Nr"   )r4   r   )r   r"   r#   rq   U  s    zJcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)rV   )r4   r   )r   r"   r#   r6   U  s    r   r   r'   )rp   r   c                s.     | d }|d k	r|S t| }| | < |S )N)rA   rh   )rp   cluster)cluster_cacheri   r"   r#   make_clusterk  s    
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster)r   otherr   c                s    | j |j B S )N)rj   )r   r   )r   r"   r#   merges  s    z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                s   g | ]} d |> qS )r   r"   )r4   rL   )r   r"   r#   r6   z  s    z        len(clusters) = c             s   s   | ]}|j V  qd S )N)rx   )r4   cr"   r"   r#   rq     s    z            len(clusters) = Z3dz    size_reduction=z5.2fz    max_new_subtables=r(   )rH   setrJ   rB   rQ   r   ra   r    rh   ranger   rx   logdebugrC   AssertionErrorry   r   r   dictrp   updater8   )"r%   rP   r   rc   rb   rd   re   Zformat1Zformat2r   valuerf   rg   r   ZclustersZcost_before_splittingZlowest_cost_changeZbest_cluster_indexZbest_other_indexZbest_mergedrL   r   rN   r   mergedZcost_changeZcost_after_splittingZsize_reductionZmax_new_subtablesZpairs_by_class1valuesZpairs_groupsZpairs_grouprM   r"   )r   r   ri   r   r   rP   r#   rI   8  s     

	 

rI   )F)r   )7loggingr   collectionsr   r   	functoolsr   	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$   r/   r*   r+   r-   ZPairPosr0   r<   rD   boolrE   ZValueRecordZPairsrV   r`   ra   rh   rI   r"   r"   r"   r#   <module>   sN    

0