o
    h,                     @   s  d dl mZ d dlmZmZmZ d dlmZm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mZmZmZ d dlmZ d d	lZd d	lZed
ZG dd dZdd Zdd ZG dd deZG dd deZ G dd deZ!dd Z"dd Z#dd Z$dd Z%dd  Z&d!d" Z'z
d d#l(m)Z) e%Z*W n e+y   z
d d$l,m-Z- e&Z*W n e+y   e'Z*Y nw Y nw d%d& Z.d'd( Z/d)d* Z0d+Z1d,d- Z2d.d/ Z3e4 d0d1d2Z5d6d4d5Z6d	S )7    )LerpGlyphSet)AbstractPenBasePenDecomposingPen)AbstractPointPenSegmentToPointPen)RecordingPenDecomposingRecordingPen)	Transform)defaultdictdeque)sqrtcopysignatan2pi)EnumNzfontTools.varLib.interpolatablec                   @   sh   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZededededede	de
dedededediZdS )InterpolatableProblemnothingmissing	open_path
path_count
node_countnode_incompatibilitycontour_orderwrong_start_pointkinkunderweight
overweight                        	   
      N)__name__
__module____qualname__NOTHINGMISSING	OPEN_PATH
PATH_COUNT
NODE_COUNTNODE_INCOMPATIBILITYCONTOUR_ORDERWRONG_START_POINTKINKUNDERWEIGHT
OVERWEIGHTseverity r8   r8   z/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/varLib/interpolatableHelpers.pyr      s0    r   c                 C   s   t t|  dd ddS )zGSort problems by severity, then by glyph name, then by problem message.c                 S   s   t dd | d D  S )Nc                 s   s*    | ]}t j|d   |dd V  qdS )type	tolerancer   N)r   r7   get).0pr8   r8   r9   	<genexpr>2   s
    
z2sort_problems.<locals>.<lambda>.<locals>.<genexpr>r   )min)_r8   r8   r9   <lambda>1   s
    zsort_problems.<locals>.<lambda>T)keyreverse)dictsorteditems)problemsr8   r8   r9   sort_problems,   s   rI   c                 C   s   | | d | d|   S )z{Rotate list by k items forward.  Ie. item at position 0 will be
    at position k in returned list.  Negative k is allowed.Nr8   )lkr8   r8   r9   rot_list<   s   rL   c                   @   sN   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dS )PerContourPenNc                 C   s(   t | | || _|| _d | _g | _d S N)r   __init__	_glyphset_Pen_penvalue)selfPenglyphsetr8   r8   r9   rO   C   s
   
zPerContourPen.__init__c                 C   s   |    | j| d S rN   )_newItemrR   moveTo)rT   p0r8   r8   r9   _moveToJ   s   zPerContourPen._moveToc                 C   s   | j | d S rN   )rR   lineTo)rT   p1r8   r8   r9   _lineToN   s   zPerContourPen._lineToc                 C   s   | j || d S rN   )rR   qCurveTo)rT   r\   p2r8   r8   r9   _qCurveToOneQ   s   zPerContourPen._qCurveToOnec                 C   s   | j ||| d S rN   )rR   curveTo)rT   r\   r_   p3r8   r8   r9   _curveToOneT   s   zPerContourPen._curveToOnec                 C      | j   d | _ d S rN   )rR   	closePathrT   r8   r8   r9   
_closePathW      

zPerContourPen._closePathc                 C   rd   rN   )rR   endPathrf   r8   r8   r9   _endPath[   rh   zPerContourPen._endPathc                 C   s   |    | _}| j| d S rN   )rQ   rR   rS   append)rT   penr8   r8   r9   rW   _   s   zPerContourPen._newItemrN   )r)   r*   r+   rO   rZ   r]   r`   rc   rg   rj   rW   r8   r8   r8   r9   rM   B   s    
rM   c                   @   s   e Zd Zdd ZdS )PerContourOrComponentPenc                 C   s   |    | jd || d S )N)rW   rS   addComponent)rT   	glyphNametransformationr8   r8   r9   ro   e   s   z%PerContourOrComponentPen.addComponentN)r)   r*   r+   ro   r8   r8   r8   r9   rm   d   s    rm   c                   @   s2   e Zd Zdd ZdddZdddZdd	d
ZdS )SimpleRecordingPointPenc                 C   s
   g | _ d S rN   )rS   rf   r8   r8   r9   rO   k   s   
z SimpleRecordingPointPen.__init__Nc                 K      d S rN   r8   )rT   
identifierkwargsr8   r8   r9   	beginPathn      z!SimpleRecordingPointPen.beginPathreturnc                 C   rs   rN   r8   rf   r8   r8   r9   ri   q   rw   zSimpleRecordingPointPen.endPathc                 C   s    | j ||d u r
dndf d S )NFT)rS   rk   )rT   ptsegmentTyper8   r8   r9   addPointt   s    z SimpleRecordingPointPen.addPointrN   )rx   N)r)   r*   r+   rO   rv   ri   r{   r8   r8   r8   r9   rr   j   s
    

rr   c                 C   s0   d}t | |D ]\}}|| }||| 7 }q|S Nr   )zipv0v1sx0x1dr8   r8   r9   vdiff_hypot2x   s
   r   c                 C   s@   d}t | |D ]\}}|| }||j|j |j|j  7 }q|S r|   )r}   realimagr~   r8   r8   r9   vdiff_hypot2_complex   s
   r   c                    s   t  fddt|D S )Nc                 3   s     | ]\}} | | V  qd S rN   r8   )r=   ijGr8   r9   r?      s    z matching_cost.<locals>.<genexpr>)sum	enumerate)r   matchingr8   r   r9   matching_cost   s   r   c                 C   sP   t | }t| \}}|tt|k sJ tdd |D }t|t| |fS )Nc                 s   s    | ]}t |V  qd S rN   )int)r=   er8   r8   r9   r?      s    z<min_cost_perfect_bipartite_matching_scipy.<locals>.<genexpr>)lenlinear_sum_assignmentlistrangeallr   )r   nrowscolsr8   r8   r9   )min_cost_perfect_bipartite_matching_scipy   s
   r   c                 C   s>   t | }d g| }t | D ]\}}|||< q|t| |fS rN   )r   Munkrescomputer   )r   r   r   rowcolr8   r8   r9   +min_cost_perfect_bipartite_matching_munkres   s
   

r   c                 C   sn   t | }|dkrtdtt|}tt|}t| |}|D ]}t| |}||k r2t||}}q ||fS )Nr#   z4Install Python module 'munkres' or 'scipy >= 0.17.0')r   	Exception	itertoolspermutationsr   r   nextr   )r   r   r   best	best_costr>   costr8   r8   r9   .min_cost_perfect_bipartite_matching_bruteforce   s   

r   )r   )r   c                 C   s<   t t| j}t|| j| j| j| jd | jd | j| fS )Nr   )	r   absarear   meanXmeanYstddevXstddevYcorrelation)statssizer8   r8   r9   contour_vector_from_stats   s   
r   c                    sV   t | }tt|}fdd| D  t \}}t fddt|D }|||fS )Nc                    s   g | ]  fd dD qS )c                    s   g | ]}t  |qS r8   )r   )r=   r   r   r8   r9   
<listcomp>   s    z3matching_for_vectors.<locals>.<listcomp>.<listcomp>r8   r=   )m1r   r9   r      s    z(matching_for_vectors.<locals>.<listcomp>c                 3   s    | ]	} | | V  qd S rN   r8   )r=   r   )costsr8   r9   r?          z'matching_for_vectors.<locals>.<genexpr>)r   r   r   #min_cost_perfect_bipartite_matchingr   )m0r   r   identity_matchingr   r   identity_costr8   )r   r   r9   matching_for_vectors   s   
r   c                 C   s&   d}t | D ]
\}}|d> |B }q|S )Nr   r   )reversed)pointsbitsry   br8   r8   r9   points_characteristic_bits   s   r   r!   c           
      C   s  g }| s|S dd | D } t | }tdksJ | | d td   t | tk r9| | d td   t | tk s(t|D ]I}| | }|| | |d  }|| }||d  | |d  }|| }|||  |j|j |j|j  }	ttt	|	|	}	||	d  q=|S )Nc                 S   s   g | ]\}}t | qS r8   )complex)r=   ry   rA   r8   r8   r9   r      s    z)points_complex_vector.<locals>.<listcomp>r!   r   r    r   )
r   $_NUM_ITEMS_PER_POINTS_COMPLEX_VECTORextendr   rk   r   r   r   r   r   )
r   vectorr   r   rY   r\   d0r_   d1crossr8   r8   r9   points_complex_vector   s.   
r   c                 C   s   t | }t| }|r| d d d } t | }n|}t| }t|| dks&J t|| }d|> d }t|D ](}	|||	 > |@ ||	? B }
|
|kr^|t||	 | |rY|d |	 n|	|f q6d S )Nrn   r   r   )r   r   r   r   rk   rL   )r   isomorphismsrD   reference_bitsr   r   r   multmaskr   r   r8   r8   r9   add_isomorphisms  s$   
$r   discrete_axesc                   sV  d gt tt| d  }t tt| }r'fddtD }|r/tdt|| ntd zddlm} fddttD }t	  D ]	} 
|  qMt   fd	dD }	tttd
D ]2\}
}fddt |	|
 D }fddt |	| D }||krqnt|	|
 |	| ||
 |< qn||dd}| \}}tt	}t||D ]\}}|| | || | qd gt }g }t	 }t|}|r| }
||
 ||
 t||
 D ]}||vr|
||< || q|st|t|ksJ dW n
 ty   Y nw td| td| ||fS )Nr   c                    s.   g | ]\}}t  fd d| D r|qS )c                 3   s$    | ]\}}| vr|d kV  qdS r   Nr8   r=   rK   vr   r8   r9   r?   0  s   " 4find_parents_and_order.<locals>.<listcomp>.<genexpr>)r   rG   )r=   r   rJ   r   r8   r9   r   -  s    z*find_parents_and_order.<locals>.<listcomp>zFound %s base masters: %szNo base master location foundr   )minimum_spanning_treec                    s   g | ]	}d gt   qS )r   )r   )r=   rA   )	locationsr8   r9   r   ;  s    c                    s"   g | ] t  fd dD qS )c                 3   s    | ]	}  |d V  qdS r   )r<   )r=   rK   rJ   r8   r9   r?   @  r   r   )tupler   )axesr   r9   r   @  s   " r   c                       i | ]\}}| v r||qS r8   r8   r   r   r8   r9   
<dictcomp>B      z*find_parents_and_order.<locals>.<dictcomp>c                    r   r8   r8   r   r   r8   r9   r   E  r   T)	overwritez.Not all masters are reachable; report an issuezParents: %sz	Order: %s)r   r   r   r   logginginfowarningscipy.sparse.csgraphr   setupdatekeysrF   r   combinationsr}   r   nonzeror   addr   popleftrk   ImportErrorlog)	glyphsetsr   r   parentsorderbasesr   graphrJ   vectorsr   r   i_discrete_locationj_discrete_locationtreer   r   r   r   visitedqueuer8   )r   r   r   r9   find_parents_and_order(  st   







r   Fc           
      C   s   | j }| j}| j}|| d d ||  d }|| d | }|| d | }|dkr2t|| |n	||k r:td nd}t }	|dk rEd}|rg|	| j | j }	|		| }	|	
dt| dt| }	|	S |	
t|t|}	|		|}	|	| j| j}	|	S )Ng      ?r   r   r   )	varianceX
covariance	varianceYr   r   r
   	translater   r   rotatescaler   )
r   inversear   cdeltalambda1lambda2thetatransr8   r8   r9   transform_from_statsl  s&   *	
r  )F)7fontTools.ttLib.ttGlyphSetr   fontTools.pens.basePenr   r   r   fontTools.pens.pointPenr   r   fontTools.pens.recordingPenr   r	   fontTools.misc.transformr
   collectionsr   r   mathr   r   r   r   enumr   r   r   	getLoggerr   r   rI   rL   rM   rm   rr   r   r   r   r   r   r   scipy.optimizer   r   r   munkresr   r   r   r   r   r   r   r   r   r  r8   r8   r8   r9   <module>   sZ    
"

$D