a
    èÝEbT   ã                   @   sb   d d„ Z dd„ Zdd„ Zdd„ Zdd	d
„Zi ddfdd„Zdd„ Zdd„ Zddd„Zddd„Z	dS )c                 C   sú   d d g}dD ]ä}g  ||< }|| || || || f\}}	}
}||	kr|t | ƒ}|
|krj| |
g| ¡ q| dg| ¡ q||	kr˜|	| }}	||
 }
}||
 |	|  }| D ]B}|| }||krÆ|
}n||	krÔ|}n|
|| |  }| |¡ q¬qt|Ž S )N©é    é   r   )ÚlenÚextendÚappendÚzip)ÚcoordsZrc1Zrd1Zrc2Zrd2Z
out_arraysÚjÚoutÚx1Zx2Úd1Úd2ÚnÚscaleÚpairÚxÚd© r   úT/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/varLib/iup.pyÚiup_segment   s.    $

r   c              
   C   sª  t | ƒt |ƒksJ ‚d | vr | S t | ƒ}dd„ t| ƒD ƒ}|sHdg| S g }t|ƒ}t|ƒ}|dkrªd|||d f\}}}	}
| t|||… ||	 | |	 ||
 | |
 ƒ¡ | | | ¡ |D ]j}|| dk�r|d |||f\}}}	}
| t|||… ||	 | |	 ||
 | |
 ƒ¡ | | | ¡ |}q¼||d k�r€|d |||d f\}}}	}
| t|||… ||	 | |	 ||
 | |
 ƒ¡ t | ƒt |ƒk�s¦J t | ƒt |ƒfƒ‚|S )Nc                 S   s   g | ]\}}|d ur|‘qS ©Nr   )Ú.0ÚiÚvr   r   r   Ú
<listcomp>.   ó    ziup_contour.<locals>.<listcomp>)r   r   r   éÿÿÿÿr   )r   Ú	enumerateÚiterÚnextr   r   r   )Údeltar   r   Úindicesr
   ÚitÚstartÚi1Úi2Zri1Zri2Úendr   r   r   Úiup_contour'   s2    
...&r'   c                 C   sž   t |ƒ|kr,t|ƒ|r"|d d ndd ks0J ‚t|ƒ}||d |d |d |d g }g }d}|D ]4}|d7 }t| ||… |||… ƒ}| |¡ |}qd|S ©Nr   r   r   é   é   é   )Úsortedr   r'   r   )r    r   Úendsr   r
   r#   r&   Úcontourr   r   r   Ú	iup_deltaI   s    0 
r/   c                    s€   || dksJ ‚t t||d |… || | | || | | ƒƒ}| |d |… } t| ƒt|ƒksdJ ‚t‡ fdd„t| |ƒD ƒƒS )Nr+   r   c                 3   s4   | ],\\}}\}}t t|| || ƒƒˆ kV  qd S r   ©ÚabsÚcomplex)r   r   ÚyÚpÚq©Ú	tolerancer   r   Ú	<genexpr>`   r   z%can_iup_in_between.<locals>.<genexpr>)Úlistr   r   Úallr   )Zdeltasr   r   r	   r7   Zinterpr   r6   r   Úcan_iup_in_betweenY   s
    0r;   r   c                 C   sü  t | ƒt |ƒksJ ‚tƒ }| d |d  }}| d |d  }}tt | ƒd ddƒD �]¢}|| }	}
| |d  ||d   }}dD �]h}|
| }|	| }|| }|| }|| }|| }||krÔ|| }}|| }}n|| }}|| }}d}||  k�r|k�r<n n4t||ƒ| |  k�r4t||ƒ| k�sÖn d}nš||k�rx||k�rht|| ƒ|k�rvd}nt|ƒ|k�rÖn^||k�rÖ||k �r²||k�rÖ|| |k ||k k�rÖd}n$||k�rÖ||| k ||k k�rÖd}|r€| |¡  �qìq€|	|
 }}qR|S )a–  The forced set is a conservative set of points on the contour that must be encoded
	explicitly (ie. cannot be interpolated).  Calculating this set allows for significantly
	speeding up the dynamic-programming, as well as resolve circularity in DP.

	The set is precise; that is, if an index is in the returned set, then there is no way
	that IUP can generate delta for that point, given coords and delta.
	r   r   r   r   FT)r   ÚsetÚrangeÚminÚmaxr1   Úadd)r    r   r7   ÚforcedÚndÚncÚldÚlcr   r   Úcr	   ÚcjZdjZlcjZldjZncjZndjÚc1Úc2r   r   Úforcer   r   r   Ú_iup_contour_bound_forced_setb   sP    




.



  
rK   Nc                 C   sÒ   t | ƒ}|du r|}ddi}ddi}td|ƒD ]š}||d  d }	|	||< |d ||< |d |v rdq.t|d t|| dƒdƒD ]H}
||
 d }||	k rºt| ||
||ƒrº| ||< }	|
||< |
|v r~ q.q~q.||fS )aÇ  Straightforward Dynamic-Programming.  For each index i, find least-costly encoding of
	points 0 to i where i is explicitly encoded.  We find this by considering all previous
	explicit points j and check whether interpolation can fill points between j and i.

	Note that solution always encodes last point explicitly.  Higher-level is responsible
	for removing that restriction.

	As major speedup, we stop looking further whenever we see a "forced" point.Nr   r   r   r+   éþÿÿÿ)r   r=   r?   r;   )r    r   rA   r7   Zlookbackr   ÚcostsÚchainr   Ú	best_costr	   Úcostr   r   r   Ú_iup_contour_optimize_dp¦   s&    
rQ   c                 C   s8   t | ƒ}||; }|s| S | || d… | d|| …  S )zxRotate list by k items forward.  Ie. item at position 0 will be
	at position k in returned list.  Negative k is allowed.N)r   )ÚlÚkr   r   r   r   Ú	_rot_listË   s    rT   c                    s$   ˆ ˆ; ‰ ˆ s| S ‡ ‡fdd„| D ƒS )Nc                    s   h | ]}|ˆ  ˆ ’qS r   r   )r   r   ©rS   r   r   r   Ú	<setcomp>Ö   r   z_rot_set.<locals>.<setcomp>r   )ÚsrS   r   r   rU   r   Ú_rot_setÓ   s    rX   ç        c                    sø  t ˆƒ}t‡fdd„ˆD ƒƒr(d g| S |dkr4ˆS ˆd ‰t‡fdd„ˆD ƒƒrfˆgd g|d   S tˆ|ˆƒ}|�r,|d t|ƒ }|dks”J ‚tˆ|ƒ‰t||ƒ}t|||ƒ}tˆ||ˆƒ\}}tƒ ‰|d }|d urðˆ |¡ || }qÔ|ˆk�sJ |ˆfƒ‚‡‡fdd„t	|ƒD ƒ‰tˆ| ƒ‰nÈtˆˆ || |ˆ|ƒ\}}d |d  ‰ }	t	|d d| d ƒD ]n}
tƒ ‰|
}||
| k�r¢ˆ || ¡ || }�qz||
| k�rl||
 ||
|   }||	k�rlˆ| ‰ }	�ql‡ ‡fd	d„t	|ƒD ƒ‰ˆS )
Nc                 3   s   | ]}t t|Ž ƒˆ kV  qd S r   r0   )r   r4   r6   r   r   r8   Þ   r   z'iup_contour_optimize.<locals>.<genexpr>r   r   c                 3   s   | ]}ˆ |kV  qd S r   r   )r   r   )Úd0r   r   r8   ç   r   c                    s    g | ]}|ˆv rˆ | nd ‘qS r   r   ©r   r   )r    Úsolutionr   r   r     r   z(iup_contour_optimize.<locals>.<listcomp>r+   c                    s    g | ]}|ˆ v rˆ| nd ‘qS r   r   r[   )Úbest_solr    r   r   r     r   )
r   r:   rK   r?   rT   rX   rQ   r<   r@   r=   )r    r   r7   r   rA   rS   rN   rM   r   rO   r#   rP   r   )r]   rZ   r    r\   r7   r   Úiup_contour_optimizeØ   sL    





r^   c           	      C   s¼   t |ƒ|kr,t|ƒ|r"|d d ndd ks0J ‚t|ƒ}||d |d |d |d g }g }d}|D ]R}t| ||d … |||d … |ƒ}t|ƒ|| d ks¤J ‚| |¡ |d }qd|S r(   )r,   r   r^   r   )	r    r   r-   r7   r   r
   r#   r&   r.   r   r   r   Úiup_delta_optimize   s    0 $

r_   )r   )rY   )rY   )
r   r'   r/   r;   rK   rQ   rT   rX   r^   r_   r   r   r   r   Ú<module>   s   &"	
D%
H