a
    —Æàg7@  ã                   @   sV  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ZddlmZ	m
Z
 ddgZdZedƒZe je je  e j¡e je je jd	�d
d„ ƒƒƒƒZe je je je je je je jd�e je je je je jd�dd„ ƒƒƒƒZe je je je je je je jd�e je je je je jd�dd„ ƒƒƒƒZe je je je je je je jd�dd„ ƒƒƒZe je je je je je jd�e je je je je jd�e je je je je jd�e je je je je jd�dd„ ƒƒƒƒZe je je je je je je jd�e je je jd�dd„ ƒƒƒƒZe je je je je je je jd�e je je je je jd�dd„ ƒƒƒƒZe je je  e j¡e je je je je je jd �e je je jd!�d"d#„ ƒƒƒƒƒZe je je  e j¡e je je je je jd�e je je je je jd$�d%d&„ ƒƒƒƒƒZe je  e j¡e je je je je je jd'�e je je jd�d(d)„ ƒƒƒƒZe je je je jd*�e je je je je je jd+�d,d-„ ƒƒƒƒZ e je je je jd.�e je jd/�e je jd0�e je je je je jd1�e je je je je je jd2�d3d4„ ƒƒƒƒƒƒZ!e je jd5�e je jd6�e je jd0�d;d8d„ƒƒƒZ"e je je je jd9�e je jd0�d<d:d„ƒƒZ#dS )=é    N)Úcythoné   )ÚErrorÚApproxNotFoundErrorÚcurve_to_quadraticÚcurves_to_quadraticéd   ÚNaN©Zv1Zv2c                 C   s   | |  ¡  jS )zªReturn the dot product of two vectors.

    Args:
        v1 (complex): First vector.
        v2 (complex): Second vector.

    Returns:
        double: Dot product.
    )Ú	conjugateÚrealr
   © r   úN/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/cu2qu/cu2qu.pyÚdot%   s    r   )ÚaÚbÚcÚd)Ú_1Ú_2Ú_3Ú_4c                 C   s<   |}|d | }|| d | }| | | | }||||fS ©Nç      @r   )r   r   r   r   r   r   r   r   r   r   r   Úcalc_cubic_points6   s
    r   )Úp0Úp1Úp2Úp3c                 C   s<   ||  d }|| d | }| }|| | | }||||fS r   r   )r   r   r   r   r   r   r   r   r   r   r   Úcalc_cubic_parametersD   s
    r   c                 C   sø   |dkrt t| |||ƒƒS |dkr4t t| |||ƒƒS |dkrŽt| |||ƒ\}}t t|d |d |d |d ƒt|d |d |d |d ƒ ƒS |dkrèt| |||ƒ\}}t t|d |d |d |d ƒt|d |d |d |d ƒ ƒS t| ||||ƒS )a±  Split a cubic Bezier into n equal parts.

    Splits the curve into `n` equal parts by curve time.
    (t=0..1/n, t=1/n..2/n, ...)

    Args:
        p0 (complex): Start point of curve.
        p1 (complex): First handle of curve.
        p2 (complex): Second handle of curve.
        p3 (complex): End point of curve.

    Returns:
        An iterator yielding the control points (four complex values) of the
        subcurves.
    é   é   é   r   r   é   )ÚiterÚsplit_cubic_into_twoÚsplit_cubic_into_threeÚ_split_cubic_into_n_gen)r   r   r   r   Únr   r   r   r   r   Úsplit_cubic_into_n_iterR   s&    ÿÿÿÿr)   )r   r   r   r   r(   )ÚdtÚdelta_2Údelta_3Úi)Úa1Úb1Úc1Úd1c                 c   s¼   t | |||ƒ\}}}}d| }	|	|	 }
|	|
 }t|ƒD ]€}||	 }|| }|| }d| | | |
 }d| | | d| |  |	 }|| | ||  ||  | }t||||ƒV  q6d S )Nr   r!   r    )r   Úranger   )r   r   r   r   r(   r   r   r   r   r*   r+   r,   r-   Út1Zt1_2r.   r/   r0   r1   r   r   r   r'   |   s      r'   )ÚmidÚderiv3c                 C   s\   | d||   | d }|| | |  d }| | | d || |f||| || d |ffS )aŒ  Split a cubic Bezier into two equal parts.

    Splits the curve into two equal parts at t = 0.5

    Args:
        p0 (complex): Start point of curve.
        p1 (complex): First handle of curve.
        p2 (complex): Second handle of curve.
        p3 (complex): End point of curve.

    Returns:
        tuple: Two cubic Beziers (each expressed as a tuple of four complex
        values).
    r!   ç      À?ç      à?r   )r   r   r   r   r4   r5   r   r   r   r%   š   s
    þr%   )Úmid1Úderiv1Úmid2Úderiv2c                 C   sº   d|  d|  d|  | d }|d|  d|   d }| d|  d|  d|  d }d| d|  |  d }| d|  | d || |f||| || |f||| |d|  d |ffS )	až  Split a cubic Bezier into three equal parts.

    Splits the curve into three equal parts at t = 1/3 and t = 2/3

    Args:
        p0 (complex): Start point of curve.
        p1 (complex): First handle of curve.
        p2 (complex): Second handle of curve.
        p3 (complex): End point of curve.

    Returns:
        tuple: Three cubic Beziers (each expressed as a tuple of four complex
        values).
    é   é   r#   gh/¡½„ö¢?r!   r"   r    r   r   )r   r   r   r   r8   r9   r:   r;   r   r   r   r&   ·   s      ýr&   )Útr   r   r   r   )Ú_p1Ú_p2c                 C   s0   ||| d  }||| d  }||| |   S )ax  Approximate a cubic Bezier using a quadratic one.

    Args:
        t (double): Position of control point.
        p0 (complex): Start point of curve.
        p1 (complex): First handle of curve.
        p2 (complex): Second handle of curve.
        p3 (complex): End point of curve.

    Returns:
        complex: Location of candidate control point on quadratic curve.
    g      ø?r   )r>   r   r   r   r   r?   r@   r   r   r   Úcubic_approx_controlß   s    rA   )ÚabÚcdÚpÚhc                 C   s^   ||  }|| }|d }zt || | ƒt ||ƒ }W n tyP   tttƒ Y S 0 |||  S )ay  Calculate the intersection of two lines.

    Args:
        a (complex): Start point of first line.
        b (complex): End point of first line.
        c (complex): Start point of second line.
        d (complex): End point of second line.

    Returns:
        complex: Location of intersection if one present, ``complex(NaN,NaN)``
        if no intersection was found.
    y              ð?)r   ÚZeroDivisionErrorÚcomplexÚNAN)r   r   r   r   rB   rC   rD   rE   r   r   r   Úcalc_intersectü   s    rI   )Ú	tolerancer   r   r   r   c                 C   s�   t |ƒ|krt |ƒ|krdS | d||   | d }t |ƒ|krDdS || | |  d }t| | | d || ||ƒoŽt||| || d ||ƒS )a�  Check if a cubic Bezier lies within a given distance of the origin.

    "Origin" means *the* origin (0,0), not the start of the curve. Note that no
    checks are made on the start and end positions of the curve; this function
    only checks the inside of the curve.

    Args:
        p0 (complex): Start point of curve.
        p1 (complex): First handle of curve.
        p2 (complex): Second handle of curve.
        p3 (complex): End point of curve.
        tolerance (double): Distance from origin.

    Returns:
        bool: True if the cubic Bezier ``p`` entirely lies within a distance
        ``tolerance`` of the origin, False otherwise.
    Tr!   r6   Fr7   )ÚabsÚcubic_farthest_fit_inside)r   r   r   r   rJ   r4   r5   r   r   r   rL     s    ÿþrL   )rJ   )Úq1Úc0r0   Úc2Úc3c                 C   sŒ   t | d | d | d | d ƒ}t |j¡r.dS | d }| d }||| d  }||| d  }td|| d  || d  d|ƒs‚dS |||fS )aã  Approximate a cubic Bezier with a single quadratic within a given tolerance.

    Args:
        cubic (sequence): Four complex numbers representing control points of
            the cubic Bezier curve.
        tolerance (double): Permitted deviation from the original curve.

    Returns:
        Three complex numbers representing control points of the quadratic
        curve if it fits within the given tolerance, or ``None`` if no suitable
        curve could be calculated.
    r   r   r    r!   NçUUUUUUå?)rI   ÚmathÚisnanÚimagrL   )ÚcubicrJ   rM   rN   rP   r0   rO   r   r   r   Úcubic_approx_quadraticB  s     rV   )r(   rJ   )r-   )Úall_quadratic)rN   r0   rO   rP   )Úq0rM   Únext_q1Úq2r1   c                 C   sd  |dkrt | |ƒS |dkr&|dkr&| S t| d | d | d | d |ƒ}t|ƒ}td|d |d |d |d ƒ}| d }d}| d |g}	td|d ƒD ]¼}
|\}}}}|}|}|
|k rüt|ƒ}t|
|d  |d |d |d |d ƒ}|	 |¡ || d }n|}|}|| }t|ƒ|k�sJt|||| d  | ||| d  | ||ƒs” d	S q”|	 | d ¡ |	S )
a'  Approximate a cubic Bezier curve with a spline of n quadratics.

    Args:
        cubic (sequence): Four complex numbers representing control points of
            the cubic Bezier curve.
        n (int): Number of quadratic Bezier curves in the spline.
        tolerance (double): Permitted deviation from the original curve.

    Returns:
        A list of ``n+2`` complex numbers, representing control points of the
        quadratic spline if it fits within the given tolerance, or ``None`` if
        no suitable spline could be calculated.
    r   r    Fr   r!   y                r7   rQ   N)rV   r)   ÚnextrA   r2   ÚappendrK   rL   )rU   r(   rJ   rW   ZcubicsZ
next_cubicrY   rZ   r1   Úspliner-   rN   r0   rO   rP   rX   rM   Zd0r   r   r   Úcubic_approx_splinef  sH    
 ÿ"ÿ
ûr^   )Úmax_err)r(   Tc                 C   sV   dd„ | D ƒ} t dtd ƒD ],}t| |||ƒ}|durdd„ |D ƒ  S qt| ƒ‚dS )a5  Approximate a cubic Bezier curve with a spline of n quadratics.

    Args:
        cubic (sequence): Four 2D tuples representing control points of
            the cubic Bezier curve.
        max_err (double): Permitted deviation from the original curve.
        all_quadratic (bool): If True (default) returned value is a
            quadratic spline. If False, it's either a single quadratic
            curve or a single cubic curve.

    Returns:
        If all_quadratic is True: A list of 2D tuples, representing
        control points of the quadratic spline if it fits within the
        given tolerance, or ``None`` if no suitable spline could be
        calculated.

        If all_quadratic is False: Either a quadratic curve (if length
        of output is 3), or a cubic curve (if length of output is 4).
    c                 S   s   g | ]}t |Ž ‘qS r   ©rG   ©Ú.0rD   r   r   r   Ú
<listcomp>Ì  ó    z&curve_to_quadratic.<locals>.<listcomp>r   Nc                 S   s   g | ]}|j |jf‘qS r   ©r   rT   ©rb   Úsr   r   r   rc   Ò  rd   )r2   ÚMAX_Nr^   r   )Úcurver_   rW   r(   r]   r   r   r   r   ´  s    )ÚlÚlast_ir-   c           	      C   s®   dd„ | D ƒ} t |ƒt | ƒks"J ‚t | ƒ}dg| }d }}d}t| | ||| |ƒ}|du rv|tkrhq¢|d7 }|}q@|||< |d | }||kr@dd„ |D ƒS q@t| ƒ‚dS )a  Return quadratic Bezier splines approximating the input cubic Beziers.

    Args:
        curves: A sequence of *n* curves, each curve being a sequence of four
            2D tuples.
        max_errors: A sequence of *n* floats representing the maximum permissible
            deviation from each of the cubic Bezier curves.
        all_quadratic (bool): If True (default) returned values are a
            quadratic spline. If False, they are either a single quadratic
            curve or a single cubic curve.

    Example::

        >>> curves_to_quadratic( [
        ...   [ (50,50), (100,100), (150,100), (200,50) ],
        ...   [ (75,50), (120,100), (150,75),  (200,60) ]
        ... ], [1,1] )
        [[(50.0, 50.0), (75.0, 75.0), (125.0, 91.66666666666666), (175.0, 75.0), (200.0, 50.0)], [(75.0, 50.0), (97.5, 75.0), (135.41666666666666, 82.08333333333333), (175.0, 67.5), (200.0, 60.0)]]

    The returned splines have "implied oncurve points" suitable for use in
    TrueType ``glif`` outlines - i.e. in the first spline returned above,
    the first quadratic segment runs from (50,50) to
    ( (75 + 125)/2 , (120 + 91.666..)/2 ) = (100, 83.333...).

    Returns:
        If all_quadratic is True, a list of splines, each spline being a list
        of 2D tuples.

        If all_quadratic is False, a list of curves, each curve being a quadratic
        (length 3), or cubic (length 4).

    Raises:
        fontTools.cu2qu.Errors.ApproxNotFoundError: if no suitable approximation
        can be found for all curves with the given parameters.
    c                 S   s   g | ]}d d„ |D ƒ‘qS )c                 S   s   g | ]}t |Ž ‘qS r   r`   ra   r   r   r   rc   þ  rd   ú2curves_to_quadratic.<locals>.<listcomp>.<listcomp>r   )rb   ri   r   r   r   rc   þ  rd   z'curves_to_quadratic.<locals>.<listcomp>Nr   r   c                 S   s   g | ]}d d„ |D ƒ‘qS )c                 S   s   g | ]}|j |jf‘qS r   re   rf   r   r   r   rc     rd   rl   r   )rb   r]   r   r   r   rc     rd   )Úlenr^   rh   r   )	ZcurvesZ
max_errorsrW   rj   Zsplinesrk   r-   r(   r]   r   r   r   r   ×  s$    '
)T)T)$r   ÚAttributeErrorÚImportErrorZfontTools.miscZcompiledZCOMPILEDrR   Úerrorsr   Z
Cu2QuErrorr   Ú__all__rh   ÚfloatrH   ZcfuncÚinlineÚreturnsÚdoubleÚlocalsrG   r   r   r   r)   Úintr'   r%   r&   rA   rI   rL   rV   r^   r   r   r   r   r   r   Ú<module>   s
  
ÿÿÿ%ûÿÿÿüü
û

û ûÿû@ 