o
    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 ]r}g  ||< }|| || || || f\}}	}
}||	kr>t | }|
|kr5||
g|  n|dg|  q||	krL|	|}}	||
}
}||
 |	|  }| D ]!}|| }||krc|
}n||	krj|}n|
|| |  }|| qVqt| S )N       r   )lenextendappendzip)coordsZrc1Zrd1Zrc2Zrd2Z
out_arraysjoutZx1Zx2d1d2nZscaleZpairxd r   6/usr/lib/python3/dist-packages/fontTools/varLib/iup.pyiup_segment   s0   $

r   c              
   C   s  t | t |ks
J d | vr| S t | }dd t| D }|s$dg| S g }t|}t|}|dkrUd|||d f\}}}	}
|t||| ||	 | |	 ||
 | |
  || |  |D ]4}|| 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>.   s    ziup_contour.<locals>.<listcomp>)r   r   r   r   )r   	enumerateiternextr   r   r   )deltar   r   indicesr
   itstartZi1Zi2Zri1Zri2endr   r   r   iup_contour'   s2   
...$r!   c                 C   s   t ||krt||r|d d ndd ksJ t|}||d |d |d |d g }g }d}|D ]}|d7 }t| || ||| }|| |}q2|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s2J t fddt| |D S )Nr%   r   c                 3   s6    | ]\\}}\}}t t|| ||  kV  qd S r   abscomplex)r   r   ypq	tolerancer   r   	<genexpr>`   s   4 z%can_iup_in_between.<locals>.<genexpr>)listr   r   allr   )Zdeltasr   r   r	   r1   Zinterpr   r0   r   can_iup_in_betweenY   s
   0r5   r   c                 C   s  t | t |ks
J t }| d |d }}| d |d }}tt | d ddD ]}||}	}
| |d  ||d  }}dD ]}|
| }|	| }|| }|| }|| }|| }||krh||}}||}}n
||}}||}}d}||  kr~|krn nt||| |  krt||| ksn d}nD||kr||krt|| |krd}n1t||kr	 n)||kr||k r||kr|| |k ||k krd}n||kr||| k ||k krd}|r||  nq?|	|
}}q)|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maxr+   add)r   r   r1   forcedZndZncZldZlcr   r   cr	   ZcjZdjZlcjZldjZncjZndjZc1Zc2r   r   Zforcer   r   r   _iup_contour_bound_forced_setb   sZ   



*
r=   Nc                 C   s   t | }|du r
|}ddi}ddi}td|D ]M}||d  d }	|	||< |d ||< |d |v r2qt|d t|| ddD ]$}
||
 d }||	k r]t| ||
||r]| ||< }	|
||< |
|v rc n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   r7   r9   r5   )r   r   r;   r1   Zlookbackr   costschainr   	best_costr	   costr   r   r   _iup_contour_optimize_dp   s*   
rC   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    rF   c                    s$    ;   s| S  fdd| D S )Nc                    s   h | ]}|   qS r   r   )r   r   rE   r   r   r   	<setcomp>   s    z_rot_set.<locals>.<setcomp>r   )srE   r   r   rG   r   _rot_set   s   rJ           c                    s  t }tfddD rd g| S |dkrS d tfddD r3gd g|d   S t|}|r|d t| }|dksIJ t|t||}t|||}t||\}}t |d }|d urz| || }|d usm|ksJ |ffddt	|D t| S t || ||\}}d |d  }	t	|d d| d D ]7}
t |
}||
| krֈ||  || }||
| ks||
| kr||
 ||
|   }||	kr| }	q fd	dt	|D S )
Nc                 3   s     | ]}t t|  kV  qd S r   r*   )r   r.   r0   r   r   r2      s    z'iup_contour_optimize.<locals>.<genexpr>r   r   c                 3   s    | ]} |kV  qd S r   r   )r   r   )d0r   r   r2      s    c                    s    g | ]}|v r | nd qS r   r   r   r   )r   solutionr   r   r          z(iup_contour_optimize.<locals>.<listcomp>r%   c                    s    g | ]}| v r| nd qS r   r   rM   )best_solr   r   r   r     rO   )
r   r4   r=   r9   rF   rJ   rC   r6   r:   r7   )r   r   r1   r   r;   rE   r@   r?   r   rA   r   rB   r   )rP   rL   r   rN   r1   r   iup_contour_optimize   sT   




rQ   c           	      C   s   t ||krt||r|d d ndd ksJ t|}||d |d |d |d g }g }d}|D ])}t| ||d  |||d  |}t||| d ksRJ || |d }q2|S r"   )r&   r   rQ   r   )	r   r   r'   r1   r   r
   r   r    r(   r   r   r   iup_delta_optimize   s   0 $

rR   )r   )rK   )
r   r!   r)   r5   r=   rC   rF   rJ   rQ   rR   r   r   r   r   <module>   s    &"
	D%
H