
    rbiBF                        	 d dl Z n# eef$ r	 d dlm Z  Y nw xY w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 j        e j                   e j        e j        e j        e j        	          d
                                                 Ze j         e j        e j        e j                   e j        e j        e j                  d                                     Ze j        e j         e j        e j        e j        e j        e j                   e j        e j        e j        e j        e j                  d                                                 Ze j        e j         e j        e j        e j        e j        e j                   e j        e j        e j        e j        e j                  d                                                 Ze j        e j         e j        e j        e j        e j        e j                  d                                     Z e j        e j        e j        e j        e j        e j                   e j        e j        e j        e j        e j                   e j        e j        e j        e j        e j                   e j        e j        e j        e j        e j                  d                                                 Ze j        e j         e j        e j        e j        e j        e j                   e j        e j        e j                  d                                                 Ze j        e j         e j        e j        e j        e j        e j                   e j        e j        e j        e j        e j                  d                                                 Ze j        e j         e j        e j                   e j        e j        e j        e j        e j        e j                   e j        e j        e j                  d                                                             Ze j        e j         e j        e j                   e j        e j        e j        e j        e j                   e j        e j        e j        e j        e j                  d                                                              Ze j         e j        e j                   e j        e j        e j        e j        e j        e j        !           e j        e j        e j                  d"                                                 Z e j        e j         e j        e j        #           e j        e j        e j        e j        e j        e j        $          d%                                                 Z!e j         e j        e j        e j        &           e j        e j        '           e j        e j        (           e j        e j        e j        e j        e j        )           e j        e j        e j        e j        e j        e j        *          d+                                                                         Z" e j        e j        ,           e j        e j        -           e j        e j        (          d2d/                                    Z# e j        e j        e j        e j        0           e j        e j        (          d2d1                        Z$dS )3    N)cython   )ErrorApproxNotFoundErrorcurve_to_quadraticcurves_to_quadraticd   NaNv1v2resultc                 h    | |                                 z  j        }t          |          dk     rd}|S )zReturn the dot product of two vectors.

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

    Returns:
        double: Dot product.
    gV瞯<g        )	conjugaterealabsr   s      e/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/fontTools/cu2qu/cu2qu.pydotr   %   s6     2<<>>!'F 6{{UM    )zden)zrzic                 J    | j         }| j        }t          ||z  ||z            S )a`  Divide complex by real using Python's method (two separate divisions).

    This ensures bit-exact compatibility with Python's complex division,
    avoiding C's multiply-by-reciprocal optimization that can cause 1 ULP differences
    on some platforms/compilers (e.g. clang on macOS arm64).

    https://github.com/fonttools/fonttools/issues/3928
    )r   imagcomplex)r   r   r   r   s       r   _complex_div_by_realr   ?   s*     
B	
B28R#X&&&r   )abcd)_1_2_3_4c                 z    |}t          |d          |z   }t          ||z   d          |z   }| |z   |z   |z   }||||fS N      @)r   )r   r   r    r!   r"   r#   r$   r%   s           r   calc_cubic_pointsr)   P   sT     
B	a	%	%	)B	a!eS	)	)B	.B	
QQBr2r>r   )p0p1p2p3c                 N    || z
  dz  }||z
  dz  |z
  }| }||z
  |z
  |z
  }||||fS r'    )r*   r+   r,   r-   r    r   r!   r   s           r   calc_cubic_parametersr0   ^   sG     
bCA	bC!A
A
Q
QAaA:r   c           
         |dk    rt          t          | |||                    S |dk    rt          t          | |||                    S |dk    rwt          | |||          \  }}t          t          |d         |d         |d         |d                   t          |d         |d         |d         |d                   z             S |dk    rwt          | |||          \  }}t          t          |d         |d         |d         |d                   t          |d         |d         |d         |d                   z             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   s          r   split_cubic_into_n_iterr;   l   s\   , 	Avv(RR88999Avv*2r2r::;;;Avv#BB331 1qtQqT1Q488"1Q41qtQqT::;
 
 	
 	Avv#BB331"1Q41qtQqT::$QqT1Q41qt<<=
 
 	

 #2r2r1555r   )r*   r+   r,   r-   r:   )dtdelta_2delta_3i)a1b1c1d1c              #   8  K   t          | |||          \  }}}}d|z  }	|	|	z  }
|	|
z  }t          |          D ]a}||	z  }||z  }||z  }d|z  |z  |z   |
z  }d|z  |z  |z   d|z  |z  z   |	z  }||z  |z  ||z  z   ||z  z   |z   }t          ||||          V  bd S )Nr   r3   r2   )r0   ranger)   )r*   r+   r,   r-   r:   r   r   r    r!   r<   r=   r>   r?   t1t1_2r@   rA   rB   rC   s                      r   r9   r9      s       'r2r266JAq!Q	
QB2gG7lG1XX 0 0VBw[!ebj1n'!ebj1nq1ut|+r1Vd]QX%B.2BB//////0 0r   )midderiv3c                 |    | d||z   z  z   |z   dz  }||z   |z
  | z
  dz  }| | |z   dz  ||z
  |f|||z   ||z   dz  |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).
    r3         ?      ?r/   )r*   r+   r,   r-   rH   rI   s         r   r7   r7      sq    * R"W"e
+C2glR5(F	b2g_cFlC0	cFlR"WOR0 r   )mid1deriv1mid2deriv2c                     d| z  d|z  z   d|z  z   |z   dz  }|d|z  z   d| z  z
  dz  }| d|z  z   d|z  z   d|z  z   dz  }d|z  d|z  z
  | z
  dz  }| d| z  |z   dz  ||z
  |f|||z   ||z
  |f|||z   |d|z  z   dz  |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).
          r5   gh/?r3   r4   r2   r(   r/   )r*   r+   r,   r-   rM   rN   rO   rP   s           r   r8   r8      s    : FR"Wq2v%*v6D1r6kAF"v.FRK"r'!AF*v6D"fq2vo"v.F	a"frkS $-6	tf}dVmT2	tf}rAF{c126 r   )tr*   r+   r,   r-   )_p1_p2c                 D    |||z
  dz  z   }|||z
  dz  z   }|||z
  | z  z   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/   )rT   r*   r+   r,   r-   rU   rV   s          r   cubic_approx_controlrX      s;    0 R3
C
R3
C#)q  r   )abcdphc                     || z
  }||z
  }|dz  }	 t          || |z
            t          ||          z  }n@# t          $ r3 ||k    r| |k    s||k    r|cY S t          t          t                    cY S w xY w|||z  z   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   ZeroDivisionErrorr   NAN)r   r   r    r!   rY   rZ   r[   r\   s           r   calc_intersectr`     s    $ 
QB	
QB
RA	!1q5MMC2JJ& ! ! !
 66qAvvaHHHsC     ! rAv:s   $6 A3A32A3)	tolerancer*   r+   r,   r-   c                 *   t          |          |k    rt          |          |k    rdS | d||z   z  z   |z   dz  }t          |          |k    rdS ||z   |z
  | z
  dz  }t          | | |z   dz  ||z
  ||          ot          |||z   ||z   dz  ||          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.
    Tr3   rK   FrL   )r   cubic_farthest_fit_inside)r*   r+   r,   r-   ra   rH   rI   s          r   rc   rc   8  s    : 2ww)B9 4 4t R"W"e
+C
3xx)u2glR5(F$
R"WOS6\3	  W
#CvR3I
V
VWr   )ra   )q1c0rB   c2c3c                 0   t          | d         | d         | d         | d                   }t          j        |j                  rdS | d         }| d         }|||z
  dz  z   }|||z
  dz  z   }t	          d|| d         z
  || d         z
  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   r2   r3   NUUUUUU?)r`   mathisnanr   rc   )cubicra   rd   re   rg   rB   rf   s          r   cubic_approx_quadraticrm   b  s    0 
a%(E!HeAh	?	?Bz"' t	qB	qB	rBw5!	!B	rBw5!	!B$QU1XrE!H}aSS tr2:r   )r:   ra   )r?   )all_quadratic)re   rB   rf   rg   )q0rd   next_q1q2rC   c           	         |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z             D ]}
|\  }}}}|}|}|
|k     r^t          |          }t          |
|dz
  z  |d         |d         |d         |d                   }|	                    |           ||z   dz  }n|}|}||z
  }t          |          |k    s+t          ||||z
  dz  z   |z
  |||z
  dz  z   |z
  ||          s d	S |	                    | 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   r2   Fr   r3   y                rL   ri   N)rm   r;   nextrX   rE   appendr   rc   )rl   r:   ra   rn   cubics
next_cubicrp   rq   rC   spliner?   re   rB   rf   rg   ro   rd   d0s                     r   cubic_approx_splinery     s   : 	Avv%eY777Avv-5(($U1XuQxq58QOOF fJ"	:a=*Q-A
1 G 
qB	BAh F1a!e__  #BB q55fJ*QUZ]JqM:a=*UV- G MM'"""w,#%BBB "Wr77Y&?"r'e$$r)"r'e$$r)'
 '
 44  MM%(Mr   )max_err)r:   Tc                     d | D             } t          dt          dz             D ]$}t          | |||          }|d |D             c S %t          |           )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                      g | ]}t          | S r/   r   .0r[   s     r   
<listcomp>z&curve_to_quadratic.<locals>.<listcomp>  s    (((QWa[(((r   r   Nc                 *    g | ]}|j         |j        fS r/   r   r   r   ss     r   r   z&curve_to_quadratic.<locals>.<listcomp>  s!    555QVQV$555r   )rE   MAX_Nry   r   )curverz   rn   r:   rw   s        r   r   r     s|    0 )(%(((E1eai   6 6$UAwFF55f555555  e
$
$$r   )llast_ir?   c                 \   d | D             } t          |          t          |           k    sJ t          |           }dg|z  }dx}}d}	 t          | |         |||         |          }||t          k    rn(|dz  }|}5|||<   |dz   |z  }||k    rd |D             S Tt          |           )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                 &    g | ]}d  |D             S )c                      g | ]}t          | S r/   r}   r~   s     r   r   z2curves_to_quadratic.<locals>.<listcomp>.<listcomp>  s    ***qw{***r   r/   )r   r   s     r   r   z'curves_to_quadratic.<locals>.<listcomp>  s'    ???u**E***???r   Nr   r   Tc                 &    g | ]}d  |D             S )c                 *    g | ]}|j         |j        fS r/   r   r   s     r   r   z2curves_to_quadratic.<locals>.<listcomp>.<listcomp>1  s!    666!afaf%666r   r/   )r   rw   s     r   r   z'curves_to_quadratic.<locals>.<listcomp>1  s'    MMM666v666MMMr   )lenry   r   r   )	curves
max_errorsrn   r   splinesr   r?   r:   rw   s	            r   r   r     s    N @????Fz??c&kk))))FAfqjGNFQ	AN$VAY:a=-PP>EzzFAF
UaK;;MMWMMMMN f
%
%%r   )T)%r   AttributeErrorImportErrorfontTools.misccompiledCOMPILEDrj   errorsr   
Cu2QuErrorr   __all__r   floatr_   cfuncinlinereturnsdoublelocalsr   r   r   r)   r0   r;   intr9   r7   r8   rX   r`   rc   rm   ry   r   r   r/   r   r   <module>r      s  $&MMMM$ & & &%%%%%%%%& ?  < < < < < < < <  !6
7eEll &.V^FMJJJ  KJ   , V]333&-FM222' ' 32 43 ' 6>V^v~VVV~&.V^     WV   ~&.V^   6>V^v~VVV  WV    ~&.V^  "6 "6   
"6J ~~~~j   6>V^v~VVV}fmV]fj   ~&.V^  0 0   WV 0  ~&.V^   6>&.999  :9   . ~~~~	   	>	>	       4 m~~~~   6>v~666! ! 76     !$ 6>V^v~VVV&.V^v~WWW  XW WV    
: 
m~~~~   6>&.999W W :9   W@ '''~~~~~     ('  4 v}555VZ(((~&.V^   ~~N~~  = =   )(  65 =@ v}%%%VZ(((% % % )(  &%%@ FJ&*===VZ(((:& :& :& )( >=:& :& :&s    