a
    ׶a9F                     @   s  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mZ d dlmZ d d	lmZmZ d
ZdZe 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j(ej(f f Z)ee* dd d!Z+d.eeeee*e*f  e*e*f  ee* d#d$d%Z,ed&g d'Z-G d(d) d)Z.d/ee)e*ee) d+d,d-Z/dS )0    N)defaultdict
namedtuple)reduce)chain)log2)DefaultDictDictIterableListSequenceTuple)	bit_countbit_indices)TTFont)otBaseotTablesZFONTTOOLS_GPOS_COMPACT_MODE0zfontTools.otlLib.optimize.gpos)fontmodereturnc                 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 )NZGPOS   	   r   )tableZ
LookupListLookupZ
LookupTypecompact_lookupSubTableZExtensionLookupTypecompact_ext_lookup)r   r   Zgposlookup r   n/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/fontTools/otlLib/optimize/gpos.pycompact   s    
r    )r   r   r   r   c                 C   s"   t | ||j}||_t||_d S N)compact_pair_posr   lenSubTableCount)r   r   r   new_subtablesr   r   r   r   ,   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>4       z&compact_ext_lookup.<locals>.<listcomp>   )	r"   r   r   ZExtensionPosFormatr&   appendr#   r$   )r   r   r   r%   Znew_ext_subtablessubtabler(   r   r   r   r   2   s    r   )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/   r%   r.   r   r   r   r"   @   s    

r"   )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kr$|dv r$t| |	t|}|D ]}|	|||   qntdt d| |S )	Nr   )buildPairPosClassesSubtableValue1Value2r+   Z	123456789zBad =)ZfontTools.otlLib.builderr2   r   listZCoverageZglyphsZ	ClassDef1Z	classDefsgetr-   Z	ClassDef2items	enumerateZClass1RecordClass2Recordis_really_zerogetattrtuplesortedr#   ,cluster_pairs_by_class2_coverage_custom_costintgetReverseGlyphMap
ValueErrorGPOS_COMPACT_MODE_ENV_KEY)r   r   r.   r2   r/   Zclasses1gZclasses2iZ	all_pairsclass1jclass2Zgrouped_pairspairsr   r   r   r1   M   s4    

(

r1   )rH   r   c                 C   s@   t | dd }t | dd }|d u s,| dko>|d u p>| dkS )Nr3   r4   r   )r<   getEffectiveFormat)rH   v1v2r   r   r   r;   p   s
    r;   .)glyphIDsc                 C   st   t | } | d }|gg}| dd  D ].}||d krN|d | ||g |}q$|d | || d | d fS )Nr   r+   )r>   r-   )rM   lastrangesZglyphIDr   r   r   _getClassRanges~   s    rQ   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)rR   rS   ZcoverageZfirst_rangesZmin_glyph_idZmax_glyph_idZrange_countrE   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)re   rf   c                 C   s"   || _ || _d | _d | _d | _d S r!   rd   )selfre   rf   r   r   r   __init__   s
    zCluster.__init__c                 C   s   | j d u rt| j| _ | j S r!   )rg   r   rf   rj   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 r!   )re   r]   r'   rE   rl   r   r   	<genexpr>   r*   z)Cluster.column_indices.<locals>.<genexpr>)rh   r   r@   __or__rm   r   )rj   Zbitmaskr   rl   r   column_indices   s    

zCluster.column_indicesc                 C   s   t | jd S )Nr+   )r#   rq   rl   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 )NrT   r   )
ri   coverage_bytesclassDef1_bytesclassDef2_bytesre   ra   rb   r#   rm   rr   rl   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 )	NrU   c                 3   s   | ]}t  jj| V  qd S r!   r#   re   r^   rn   rl   r   r   ro     r*   z)Cluster.coverage_bytes.<locals>.<genexpr>r   c                 3   s   | ]} j j| d  V  qdS r   N)re   r_   rn   rl   r   r   ro     r*   r   r+   rT   )sumrm   r>   r   from_iterablerV   )rj   rY   rP   Zmerged_range_countrO   startendrZ   r   rl   r   rs      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!   rw   )rE   rl   r   r   <lambda>   r*   z)Cluster.classDef1_bytes.<locals>.<lambda>)keyc                    s   g | ]}| kr|qS r   r   rn   )biggest_indexr   r   r)   "  r*   z+Cluster.classDef1_bytes.<locals>.<listcomp>)rW   rm   r[   re   r_   rl   r   )r   rj   r   rt     s    zCluster.classDef1_bytesc                 C   s   t | jj| jS r!   )r[   re   r`   rq   rl   r   r   r   ru   %  s    zCluster.classDef2_bytesN)__name__
__module____qualname__	__slots__r\   r@   rk   propertyrm   rq   rr   rv   rs   rt   ru   r   r   r   r   rc      s    



!

rc      )r   rI   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 rx   r   r'   pairr   r   r   ro   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   ro   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'   rE   rH   )rF   rI   r   r   ro   :  s   Jcluster_pairs_by_class2_coverage_custom_cost.<locals>.<listcomp>.<genexpr>)ry   r9   )r'   )
all_class2rI   )rF   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 r!   r   r'   name
name_to_idr   r   ro   E  r*   r   rQ   r'   clsr   r   r   r)   D  s   c                    s"   g | ]}t  fd d|D qS )c                 3   s   | ]} | V  qd S r!   r   r   r   r   r   ro   H  r*   r   r   r   r   r   r   r)   G  s   r   r+   r   )rm   r   c                    s.     | d }|d ur|S t| }| | < |S r!   )r7   rc   )rm   cluster)cluster_cachere   r   r   make_cluster^  s    
zBcluster_pairs_by_class2_coverage_custom_cost.<locals>.make_cluster)r   otherr   c                    s    | j |j B S r!   )rf   )r   r   r   r   r   mergef  s    z;cluster_pairs_by_class2_coverage_custom_cost.<locals>.mergec                    s   g | ]} d |> qS )r+   r   rn   r   r   r   r)   m  r*   z        len(clusters) = c                 s   s   | ]}|j V  qd S r!   )rv   )r'   cr   r   r   ro     r*   z            len(clusters) = Z3dz    size_reduction=z5.2fz    max_new_subtables=r   )r>   setrA   r8   rJ   r   r\   r@   rc   ranger#   rv   logdebugr9   ry   r   r   dictrm   updater-   )"r   rI   r   r^   r]   r_   r`   Zformat1Zformat2r   valuera   rb   r   ZclustersZcost_before_splittingZlowest_cost_changeZbest_cluster_indexZbest_other_indexZbest_mergedrE   r   rG   r   mergedZcost_changeZcost_after_splittingZsize_reductionZmax_new_subtablesZpairs_by_class1valuesZpairs_groupsZpairs_grouprF   r   )r   r   re   r   r   rI   r   r?   +  s    	

	

	

r?   )F)r   )0loggingcollectionsr   r   	functoolsr   	itertoolsr   mathr   typingr   r   r	   r
   r   r   ZfontTools.misc.intToolsr   r   ZfontTools.ttLibr   ZfontTools.ttLib.tablesr   r   rC   ZGPOS_COMPACT_MODE_DEFAULT	getLoggerr   strr    r   r   r   ZPairPosr"   r1   r:   boolr;   ZValueRecordZPairsr@   rQ   r[   r\   rc   r?   r   r   r   r   <module>   sX    
#  