a
    ׶aT                      @   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|
|| |  }|| qqt| S )N       r   )lenextendappendzip)coordsZrc1Zrd1Zrc2Zrd2Z
out_arraysjoutx1Zx2d1d2nZscalepairxd r   d/Users/vegardjervell/Documents/master/model/venv/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rd|||d f\}}}	}
|t||| ||	 | |	 ||
 | |
  || |  |D ]j}|| dkr|d |||f\}}}	}
|t||| ||	 | |	 ||
 | |
  || |  |}q||d kr|d |||d f\}}}	}
|t||| ||	 | |	 ||
 | |
  t | t |ksJ 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	   r6   Zinterpr   r5   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sn d}n||krx||krht|| |krvd}nt||krn^||kr||k r||kr|| |k ||k krd}n$||kr||| k ||k krd}|r||  qq|	|
 }}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maxr0   add)r   r   r6   forcedndZncldlcr   r   cr	   cjZdjZlcjZldjZncjZndjZc1c2r   r   forcer   r   r   _iup_contour_bound_forced_setb   sP    




.



  
rH   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 rt| ||
||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   r@   r6   Zlookbackr   costschainr   	best_costr	   costr   r   r   _iup_contour_optimize_dp   s&    
rN   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    rQ   c                    s$    ;   s| S  fdd| D S )Nc                    s   h | ]}|   qS r   r   )r   r   rP   r   r   r   	<setcomp>   r   z_rot_set.<locals>.<setcomp>r   )srP   r   r   rR   r   _rot_set   s    rU           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sJ t|t||}t|||}t||\}}t |d }|d ur| || }q|ksJ |ffddt	|D t| nt || ||\}}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   r/   )r   r3   r5   r   r   r7      r   z'iup_contour_optimize.<locals>.<genexpr>r   r   c                 3   s   | ]} |kV  qd S r   r   )r   r   )d0r   r   r7      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   rX   )best_solr   r   r   r     r   )
r   r9   rH   r>   rQ   rU   rN   r;   r?   r<   )r   r   r6   r   r@   rP   rK   rJ   r   rL   r"   rM   r   )rZ   rW   r   rY   r6   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sJ || |d }qd|S r'   )r+   r   r[   r   )	r   r   r,   r6   r   r
   r"   r%   r-   r   r   r   iup_delta_optimize   s    0 $

r\   )r   )rV   )rV   )
r   r&   r.   r:   rH   rN   rQ   rU   r[   r\   r   r   r   r   <module>   s   &"	
D%
H