a
    —Æàgˆ:  ã                   @   s4  zd dl Z W n" eefy.   d dlm Z  Y n0 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   úM/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/varLib/iup.pyÚiup_segment   s0    $

	r!   )Údeltasr   Úreturnc              
   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 )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 ur|‘qS ©Nr   )Ú.0ÚiÚvr   r   r    Ú
<listcomp>g   ó    ziup_contour.<locals>.<listcomp>)r   r   r   éÿÿÿÿr   )r   Ú	enumerateÚiterÚnextr   r!   r   )r"   r   r
   Úindicesr   ÚitÚstartÚi1Úi2Zri1Zri2Úendr   r   r    Úiup_contour[   sJ    
"ÿÿ"ÿÿ"ÿÿ&r4   )r"   r   Úendsr#   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 )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   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J ‚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!   Ú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J ‚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   ÚsetÚrangerA   ÚminÚmaxÚadd)r"   r   r?   r
   rN   r&   ZldÚlcr   ÚcZndZncr	   rG   rH   rI   rJ   rK   rL   Zc1Úc2r   r   rM   r   r   r    Ú_iup_contour_bound_forced_setÊ   s\    "




 .


ÿþý
ÿþý
rW   )r&   r	   Ú	best_costZbest_jÚcostrN   r?   )r"   r   r?   Úlookbackc                 C   sÜ   t | ƒ}|du r|}t|tƒ}ddi}ddi}td|ƒD ]š}||d  d }	|	||< |d ||< |d |v rnq8t|d t|| dƒdƒD ]H}
||
 d }||	k rÄt| ||
||ƒrÄ| ||< }	|
||< |
|v 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?   rZ   r
   ÚcostsÚchainr&   rX   r	   rY   r   r   r    Ú_iup_contour_optimize_dp%  s(    
r_   )Ú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   )r`   ra   r
   r   r   r    Ú	_rot_listZ  s
    rb   ©Úsra   r
   c                    s$   ˆ ˆ; ‰ ˆ s| S ‡ ‡fdd„| D ƒS )Nc                    s   h | ]}|ˆ  ˆ ’qS r   r   )r%   r'   ©ra   r
   r   r    Ú	<setcomp>h  r)   z_rot_set.<locals>.<setcomp>r   rc   r   re   r    Ú_rot_setd  s    rg   ç        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”J ‚tˆ|ƒ‰t||ƒ}t|||ƒ}tˆ||ˆƒ\}}tƒ ‰|d }|durðˆ |¡ || }qÔˆ 	d¡ |ˆk�sJ |ˆ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üJ |ˆ 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  r)   z'iup_contour_optimize.<locals>.<genexpr>Nr   r   c                 3   s   | ]}ˆ |kV  qd S r$   r   )r%   r   )Úd0r   r    rD   ƒ  r)   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>c                    s    g | ]}|ˆ v rˆ| nd ‘qS r$   r   rj   )Úbest_solr"   r   r    r(   Ë  r)   )r   rE   rW   rR   rb   rg   r_   rO   rS   ÚremoverP   )r"   r   r?   r
   rN   ra   r^   r]   r&   rX   r0   rY   r   )rl   ri   r"   rk   r?   r    Úiup_contour_optimizek  sT    

	




ÿ
rn   )r"   r   r5   r?   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 )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   rn   r   )	r"   r   r5   r?   r
   r   r0   r3   r:   r   r   r    Úiup_delta_optimizeÐ  s    0 ÿ

ro   )r   )rh   )rh   )'r   ÚAttributeErrorÚImportErrorZfontTools.miscZcompiledZCOMPILEDÚtypingr   r   r   Znumbersr   r   Z_PointZ_DeltaZ_PointSegmentZ_DeltaSegmentZ_DeltaOrNoneZ_DeltaOrNoneSegmentZ
_Endpointsr\   ZcfuncÚlocalsÚintÚdoubler!   r4   r;   ÚinlineÚreturnsrF   rO   rW   r_   Úlistrb   rg   rn   ro   r   r   r   r    Ú<module>   sÂ   ÷
ÿ35þù	ûø ÿþQùûû,
 ÿþi üû