U
    Q»{jˆ:  ã                   @   s6  zd dl Z W n$ eefk
r0   d dlm Z  Y nX e jZd dlmZmZm	Z	 d dl
mZmZ 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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)Úcython)Ú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 ]F}|| }||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   Znudge© r   úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/varLib/iup.pyÚiup_segment   s0    $

	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>g   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_contour[   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	   r   ÚyÚpÚq)r"   r   r&   r	   Ú	tolerancec                    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?   Úinterpr   rC   r    Úcan_iup_in_between©   s    ,þrG   )Ú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
   rO   r&   ÚldÚlcr   ÚcÚndÚncr	   rH   rI   rJ   rK   rL   rM   Úc1Úc2r   r   rN   r   r   r    Ú_iup_contour_bound_forced_setÊ   s\    "




 .


ÿþý
ÿþý
r\   )r&   r	   Ú	best_costZbest_jÚcostrO   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   rR   ÚMAX_LOOKBACKrQ   rS   rG   )r"   r   rO   r?   r_   r
   ÚcostsÚchainr&   r]   r	   r^   r   r   r    Ú_iup_contour_optimize_dp%  s(    
rd   )Ú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   )re   rf   r
   r   r   r    Ú	_rot_listZ  s
    rg   ©Úsrf   r
   c                    s$   ˆ ˆ; ‰ ˆ s| S ‡ ‡fdd„| D ƒS )Nc                    s   h | ]}|ˆ  ˆ ’qS r   r   )r%   r'   ©rf   r
   r   r    Ú	<setcomp>h  s     z_rot_set.<locals>.<setcomp>r   rh   r   rj   r    Ú_rot_setd  s    rl   ç        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   z  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   ro   )Úbest_solr"   r   r    r(   Ë  s     )r   rE   r\   rS   r*   rg   rl   rd   rP   rT   ÚremoverQ   )r"   r   r?   r
   rO   rf   rc   rb   r&   r]   r0   r^   r   )rq   rn   r"   rp   r?   r    Úiup_contour_optimizek  s\    

	




    ÿ
rs   )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*   rs   r   )	r"   r   r5   r?   r
   r   r0   r3   r:   r   r   r    Úiup_delta_optimizeÐ  s    0   ÿ

rt   )r   )rm   )rm   )'r   ÚAttributeErrorÚImportErrorZfontTools.miscÚcompiledZCOMPILEDÚtypingr   r   r   Únumbersr   r   Z_PointZ_DeltaZ_PointSegmentZ_DeltaSegmentZ_DeltaOrNoneZ_DeltaOrNoneSegmentZ
_Endpointsra   ZcfuncÚlocalsÚintÚdoubler!   r4   r;   ÚinlineZreturnsrG   rP   r\   rd   Úlistrg   rl   rs   rt   r   r   r   r    Ú<module>   sÖ   ÷    ÿ35  þù	ûø ÿ  þQùûû,
 ÿ  þi üû