U
    »mœd:  ã                   @   sz  zd dl Z e jZW n( eefk
r:   d dlm Z  dZY nX d dlmZmZm	Z	 d dl
mZmZ zd dl Z e jZW n( eefk
rš   d dlm Z  dZY nX eeef Zeeef Zee Zee Ze	edf Zee Zee ZdZe je je je je je je je je je je jd�	eeeeedœd	d
„ƒƒZeeedœdd„Zeeeedœdd„Ze je je je je je je je je je jd�e  e¡eeeeedœdd„ƒƒƒƒZe je je je je je je je jed�d)eeeedœdd„ƒZ e je je je je je jee jd�eƒ d dfeeeedœdd„ƒZ!e"edœdd„Z#eeed œd!d"„Z$d*eeeedœd$d%„Z%d+eeeeed&œd'd(„Z&dS ),é    N)ÚcythonF)ÚSequenceÚTupleÚUnion)ÚIntegralÚRealé   )	ÚjÚnÚx1Úx2Úd1Úd2ÚscaleÚxÚd)ÚcoordsÚrc1Úrd1Úrc2Úrd2c                 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 )z¨Given two reference coordinates `rc1` & `rc2` and their respective
    delta vectors `rd1` & `rd2`, returns interpolated deltas for the set of
    coordinates `coords`.N©r   é   r   )ÚlenÚextendÚappendÚzip)r   r   r   r   r   Z
out_arraysr	   Úoutr   r   r   r   r
   r   Úpairr   r   © r   úM/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/varLib/iup.pyÚiup_segment)   s.    $

r!   )Údeltasr   Úreturnc              
   C   sª  t | ƒt |ƒkst‚d| k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¦tt | ƒt |ƒfƒ‚|S )z‘For the contour given in `coords`, interpolate any missing
    delta values in delta vector `deltas`.

    Returns fully filled-out delta vector.Nc                 S   s   g | ]\}}|d k	r|‘qS ©Nr   )Ú.0ÚiÚvr   r   r    Ú
<listcomp>m   s      ziup_contour.<locals>.<listcomp>)r   r   r   éÿÿÿÿr   )r   ÚAssertionErrorÚ	enumerateÚiterÚnextr   r!   r   )r"   r   r
   Úindicesr   ÚitÚstartÚi1Úi2Zri1Zri2Úendr   r   r    Úiup_contoura   sb    

    ÿÿ
    ÿÿ
    ÿÿ&r4   )r"   r   Úendsr#   c                 C   sž   t |ƒ|kr,t|ƒ|r"|d d ndd ks0t‚t|ƒ}||d |d |d |d g }g }d}|D ]4}|d7 }t| ||… |||… ƒ}| |¡ |}qd|S )zØFor the outline given in `coords`, with contour endpoints given
    in sorted increasing order in `ends`, interpolate any missing
    delta values in delta vector `deltas`.

    Returns fully filled-out delta vector.r)   r   r   é   é   é   )Úsortedr   r*   r4   r   )r"   r   r5   r
   r   r0   r3   Úcontourr   r   r    Ú	iup_delta•   s    	0 
r;   )r&   r	   Ú	tolerancer   ÚyÚpÚq)r"   r   r&   r	   r<   c                    sh   || dkst ‚t||d |… || | | || | | ƒ}| |d |… } t‡ fdd„t| |ƒD ƒƒS )z°Return true if the deltas for points at `i` and `j` (`i < j`) can be
    successfully used to interpolate deltas for points in between them within
    provided error tolerance.r8   r   c                 3   s4   | ],\\}}\}}t t|| || ƒƒˆ kV  qd S r$   ©ÚabsÚcomplex)r%   r   r=   r>   r?   ©r<   r   r    Ú	<genexpr>Ê   s   ÿz%can_iup_in_between.<locals>.<genexpr>)r*   r!   Úallr   )r"   r   r&   r	   r<   Zinterpr   rC   r    Úcan_iup_in_between¯   s    ,þrF   )ÚcjÚdjÚlcjÚldjÚncjÚndjÚforceÚforced)r"   r   r<   r#   c                 C   s  t | ƒt |ƒkst‚t | ƒ}tƒ }tt | ƒd ddƒD �]à}| |d  ||d   }}| | ||  }}	| || d  ||| d   }
}dD �]†}|	| }|| }|| }|| }|| }|
| }||krâ|| }}|| }}n|| }}|| }}d}||k�r*t|| ƒ|k�rt|ƒ|k�rd}nÚ||  k�rB|k�rzn n4t||ƒ| |  k�rrt||ƒ| k�sn d}nŠ||k�r||k �rÊt|ƒ|k�rt|| ƒ|k�r|| |k ||k k�rd}n:t|ƒ|k�rt|| ƒ|k�r||| k ||k k�rd}|rŽ| |¡  q6qŽq6|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 `deltas`.
    r   r)   r   FT)r   r*   ÚsetÚrangerA   ÚminÚmaxÚadd)r"   r   r<   r
   rN   r&   ÚldÚlcr   ÚcÚndÚncr	   rG   rH   rI   rJ   rK   rL   Úc1Úc2r   r   rM   r   r   r    Ú_iup_contour_bound_forced_setÐ   s\    "




 .


ÿþý
ÿþý
r[   )r&   r	   Ú	best_costZbest_jÚcostrN   r<   )r"   r   r<   Úlookbackc                 C   sÜ   t | ƒ}|dkr|}t|tƒ}ddi}ddi}td|ƒD ]š}||d  d }	|	||< |d ||< |d |krnq8t|d t|| dƒdƒD ]H}
||
 d }||	k rÄt| ||
||ƒrÄ| ||< }	|
||< |
|krˆ q8qˆq8||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   r8   éþÿÿÿ)r   rQ   ÚMAX_LOOKBACKrP   rR   rF   )r"   r   rN   r<   r^   r
   ÚcostsÚchainr&   r\   r	   r]   r   r   r    Ú_iup_contour_optimize_dp+  s(    
rc   )ÚlÚkc                 C   s8   t | ƒ}||; }|s| 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.N)r   )rd   re   r
   r   r   r    Ú	_rot_list`  s
    rf   ©Úsre   r
   c                    s$   ˆ ˆ; ‰ ˆ s| S ‡ ‡fdd„| D ƒS )Nc                    s   h | ]}|ˆ  ˆ ’qS r   r   )r%   r'   ©re   r
   r   r    Ú	<setcomp>n  s     z_rot_set.<locals>.<setcomp>r   rg   r   ri   r    Ú_rot_setj  s    rk   ç        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ˆ|ˆƒ}|�r6|d t|ƒ }|dks”t‚tˆ|ƒ‰t||ƒ}t|||ƒ}tˆ||ˆƒ\}}tƒ ‰|d }|dk	rðˆ 	|¡ || }qÔˆ 
d¡ |ˆk�st|ˆfƒ‚‡‡fdd	„t|ƒD ƒ‰tˆ| ƒ‰nÞtˆˆ || |ˆ|ƒ\}}d|d  ‰ }	t|d t |ƒd ƒD ]n}
tƒ ‰|
}||
| k�r¬ˆ 	|| ¡ || }�q„||
| k�rv||
 ||
|   }||	k�rvˆ| ‰ }	�qv|ˆ k�süt|ˆ fƒ‚‡ ‡fd
d	„t|ƒD ƒ‰ˆS )zÎFor contour with coordinates `coords`, optimize a set of delta
    values `deltas` within error `tolerance`.

    Returns delta vector that has most number of None items instead of
    the input delta.
    c                 3   s   | ]}t t|Ž ƒˆ kV  qd S r$   r@   )r%   r>   rC   r   r    rD   €  s     z'iup_contour_optimize.<locals>.<genexpr>Nr   r   c                 3   s   | ]}ˆ |kV  qd S r$   r   )r%   r   )Úd0r   r    rD   ‰  s     r)   c                    s    g | ]}|ˆkrˆ | nd ‘qS r$   r   ©r%   r&   )r"   Úsolutionr   r    r(   ³  s     z(iup_contour_optimize.<locals>.<listcomp>c                    s    g | ]}|ˆ krˆ| nd ‘qS r$   r   rn   )Úbest_solr"   r   r    r(   Ñ  s     )r   rE   r[   rR   r*   rf   rk   rc   rO   rS   ÚremoverP   )r"   r   r<   r
   rN   re   rb   ra   r&   r\   r0   r]   r   )rp   rm   r"   ro   r<   r    Úiup_contour_optimizeq  s\    

	




    ÿ
rr   )r"   r   r5   r<   r#   c           	      C   s¼   t |ƒ|kr,t|ƒ|r"|d d ndd ks0t‚t|ƒ}||d |d |d |d g }g }d}|D ]R}t| ||d … |||d … |ƒ}t|ƒ|| d ks¤t‚| |¡ |d }qd|S )a  For the outline given in `coords`, with contour endpoints given
    in sorted increasing order in `ends`, optimize a set of delta
    values `deltas` within error `tolerance`.

    Returns delta vector that has most number of None items instead of
    the input delta.
    r)   r   r   r6   r7   r8   )r9   r   r*   rr   r   )	r"   r   r5   r<   r
   r   r0   r3   r:   r   r   r    Úiup_delta_optimizeÖ  s    0   ÿ

rs   )r   )rl   )rl   )'r   ÚcompiledZCOMPILEDÚAttributeErrorÚImportErrorZfontTools.miscÚtypingr   r   r   Únumbersr   r   Z_PointZ_DeltaZ_PointSegmentZ_DeltaSegmentZ_DeltaOrNoneZ_DeltaOrNoneSegmentZ
_Endpointsr`   ZcfuncÚlocalsÚintÚdoubler!   r4   r;   ÚinlineZreturnsrF   rO   r[   rc   Úlistrf   rk   rr   rs   r   r   r   r    Ú<module>   sæ   



÷    ÿ,5  þù	ûø ÿ  þQùûû,
 ÿ  þi üû