
    hBF                     8    S SK r \ R                  rS SKrSSKJr	J
r
  SS/rSr\" S5      r\ R                  \ R                   \ R"                  " \ R$                  5      \ R&                  " \ R(                  \ R(                  \ R$                  S	9S
 5       5       5       5       r\ R                  \ R&                  " \ R(                  \ R$                  S9\ R&                  " \ R$                  \ R$                  S9S 5       5       5       r\ R                  \ R                   \ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9\ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9S 5       5       5       5       r\ R                  \ R                   \ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9\ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9S 5       5       5       5       r\ R                  \ R                   \ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9S 5       5       5       r\ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  \ R4                  S9\ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9\ R&                  " \ R$                  \ R$                  \ R$                  \ R4                  S9\ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9S 5       5       5       5       r\ R                  \ R                   \ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9\ R&                  " \ R(                  \ R(                  S9S 5       5       5       5       r\ R                  \ R                   \ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9\ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9S 5       5       5       5       r\ R                  \ R                   \ R"                  " \ R(                  5      \ R&                  " \ R$                  \ R(                  \ R(                  \ R(                  \ R(                  S9\ R&                  " \ R(                  \ R(                  S9S 5       5       5       5       5       r\ R                  \ R                   \ R"                  " \ R(                  5      \ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S9\ R&                  " \ R(                  \ R(                  \ R(                  \ R$                  S9S  5       5       5       5       5       r\ R                  \ R"                  " \ R4                  5      \ R&                  " \ R$                  \ R(                  \ R(                  \ R(                  \ R(                  S!9\ R&                  " \ R(                  \ R(                  S9S" 5       5       5       5       r \ R                  \ R                   \ R&                  " \ R$                  S#9\ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  \ R(                  S$9S% 5       5       5       5       r!\ R                  \ R&                  " \ R4                  \ R$                  S&9\ R&                  " \ R4                  S'9\ R&                  " \ R4                  S(9\ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  S)9\ R&                  " \ R(                  \ R(                  \ R(                  \ R(                  \ R(                  S*9S+ 5       5       5       5       5       5       r"\ R&                  " \ R$                  S,9\ R&                  " \ R4                  S-9\ R&                  " \ R4                  S(9S1S. j5       5       5       r#\ R&                  " \ R4                  \ R4                  \ R4                  S/9\ R&                  " \ R4                  S(9S1S0 j5       5       r$g! \\4 a
    S SKJ r    G	Nf = f)2    N)cython   )ErrorApproxNotFoundErrorcurve_to_quadraticcurves_to_quadraticd   NaNv1v2resultc                 `    XR                  5       -  R                  n[        U5      S:  a  SnU$ )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      O/var/www/fran/franai/venv/lib/python3.13/site-packages/fontTools/cu2qu/cu2qu.pydotr   %   s0     <<>!''F 6{UM    )zden)zrzic                 R    U R                   nU R                  n[        X!-  X1-  5      $ )aL  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28RX&&r   )abcd)_1_2_3_4c                 b    Un[        US5      U-   n[        X-   S5      U-   nX-   U-   U-   nXEXg4$ N      @)r   )r   r   r    r!   r"   r#   r$   r%   s           r   calc_cubic_pointsr)   P   sF     
B	a	%	)B	aeS	)B	.B	
QB2>r   )p0p1p2p3c                 D    X-
  S-  nX!-
  S-  U-
  nU nX6-
  U-
  U-
  nXuXF4$ r'    )r*   r+   r,   r-   r    r   r!   r   s           r   calc_cubic_parametersr0   ^   s=     
CA	C!A
A

QA:r   c           
         US:X  a  [        [        XX#5      5      $ US:X  a  [        [        XX#5      5      $ US:X  aL  [        XX#5      u  pV[        [        US   US   US   US   5      [        US   US   US   US   5      -   5      $ US:X  aL  [        XX#5      u  pV[        [        US   US   US   US   5      [        US   US   US   US   5      -   5      $ [        XX#U5      $ )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   , 	Av(899Av*22:;;Av#BB3 1qtQqT1Q48"1Q41qtQqT:;
 	
 	Av#BB3"1Q41qtQqT:$QqT1Q41qt<=
 	

 #22155r   )r*   r+   r,   r-   r:   )dtdelta_2delta_3i)a1b1c1d1c              #     #    [        XX#5      u  pVpxSU-  n	X-  n
X-  n[        U5       HX  nX-  nX-  nX[-  nSU-  U-  U-   U
-  nSU-  U-  U-   SU-  U-  -   U	-  nX]-  U-  Xn-  -   X}-  -   U-   n[        UUUU5      v   MZ     g 7f)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      'rr6JA!	
QBgGlG1XVw[!ebj1n'!ebj1nq1ut|+r1Vd]QX%.2BB// s   BB)midderiv3c                 p    U SX-   -  -   U-   S-  nX2-   U-
  U -
  S-  nX U-   S-  XE-
  U4XDU-   X#-   S-  U44$ )ad  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      se    * RW"e
+CglR5(F	2g_clC0	FlRWOR0 r   )mid1deriv1mid2deriv2c                     SU -  SU-  -   SU-  -   U-   S-  nUSU-  -   SU -  -
  S-  nU SU-  -   SU-  -   SU-  -   S-  nSU-  SU-  -
  U -
  S-  nU SU -  U-   S-  XE-
  U4XDU-   Xg-
  U4XfU-   USU-  -   S-  U44$ )	av  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	f}dmT2	f}rAF{c126 r   )tr*   r+   r,   r-   )_p1_p2c                 >    XU-
  S-  -   nXCU-
  S-  -   nXVU-
  U -  -   $ )aT  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      s5    0 R3
C
R3
C)q  r   )abcdphc                     X-
  nX2-
  nUS-  n [        X`U-
  5      [        Xe5      -  nX%U-  -   $ ! [         a*    X:X  a  X:X  d  X#:X  a  Us $ [        [        [        5      s $ f = f)aU  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`     sv    $ 
B	
B
RA	!q5MCJ& Av:  !
 6qvHsC  !s   0 A$A$#A$)	tolerancer*   r+   r,   r-   c                     [        U5      U::  a  [        U5      U::  a  gU SX-   -  -   U-   S-  n[        U5      U:  a  gX2-   U-
  U -
  S-  n[        X U-   S-  XV-
  XT5      =(       a    [        XUU-   X#-   S-  X45      $ )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    : 2w)B9 4 RW"e
+C
3x)glR5(F$
"WOS\3 W
#Cv3
VWr   )ra   )q1c0rB   c2c3c                    [        U S   U S   U S   U S   5      n[        R                  " UR                  5      (       a  gU S   nU S   nX2U-
  S-  -   nXBU-
  S-  -   n[	        SXPS   -
  X`S   -
  SU5      (       d  gX2U4$ )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zz"''	qB	qB	Bw5!	!B	Bw5!	!B$Q1Xr!H}aSS2:r   )r:   ra   )r?   )all_quadratic)re   rB   rf   rg   )q0rd   next_q1q2rC   c           	      f   US:X  a  [        X5      $ US:X  a  US:X  a  U $ [        U S   U S   U S   U S   U5      n[        U5      n[        SUS   US   US   US   5      nU S   nSnU S   U/n	[	        SUS-   5       H  n
Uu  ppUnUnX:  aE  [        U5      n[        XS-
  -  US   US   US   US   5      nU	R                  U5        UU-   S-  nOUnUnX~-
  n[        U5      U:  d.  [        UUUU-
  S-  -   U-
  UUU-
  S-  -   U-
  UU5      (       a  M    g	   U	R                  U S   5        U	$ )
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   : 	Av%e77Av-5($U1XuQxq58QOF fJ"	:a=*Q-A
1G 
qB	BAh F1a!e_# 5fJ*UZ]JqM:a=*UV-G MM'"w,#%BB Wr7Y&?"r'e$$r)"r'e$$r)'
 '
 9 : MM%(Mr   )max_err)r:   c                    U  Vs/ s H  n[        U6 PM     n n[        S[        S-   5       H<  n[        XX5      nUc  M  U Vs/ s H  ofR                  UR
                  4PM     sns  $    [        U 5      es  snf s  snf )a  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).
r   )r   rE   MAX_Nry   r   r   r   )curverz   rn   r[   r:   rw   ss          r   r   r     sz    0 #((%QWa[%E(1eai $UwF.45fVVQVV$f55	 ! e
$$ ) 6s   A7!A<)llast_ir?   c           
         U  VVs/ s H  o3 Vs/ s H  n[        U6 PM     snPM     n nn[        U5      [        U 5      :X  d   e[        U 5      nS/U-  nS=pxSn	 [        X   XU   U5      n
U
c  U	[        :X  a  OVU	S-  n	UnM*  XU'   US-   U-  nX:X  a:  U V
Vs/ s H*  o Vs/ s H  oR                  UR
                  4PM     snPM,     snn
$ Mv  [        U 5      es  snf s  snnf s  snf s  snn
f )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.
Nr   r   )r   lenry   r|   r   r   r   )curves
max_errorsrn   r}   r[   r   splinesr   r?   r:   rw   r~   s               r   r   r     s   N 9??uE*Eqw{E*F?z?c&k)))FAfqjGNF	A
$VYa=-P>EzFAF
UaK;ELMW6v6v!ffaff%v6WMM  f
%%+ +?& 7Ms-   	C"CC"	C-$!C(C-C"(C-)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      s4  $& ??  <  !6
7El &..V^^FMMJ K   , V]]3&--FMM2' 3 4 ' 6>>V^^v~~V~~&..V^^ W   ~~&..V^^ 6>>V^^v~~V W   ~~&..V^^"6  
"6J ~~~~~~~~jj 6>>V^^v~~V}}fmmV]]fjj ~~&..V^^0 W0  ~~&..V^^ 6>>&..9 :  . ~~~~~~~~	 	>>	>>	  4 mm~~~~~~~~ 6>>v~~6! 7    !$ 6>>V^^v~~V&..V^^v~~W X W    
: 

mm~~~~~~~~ 6>>&..9W :  W@ '~~~~~~~~~~ (  4 v}}5VZZ(~~&..V^^ ~~~~NN~~~~= )  6 =@ v}}%VZZ(% )  &%@ FJJ&**=VZZ(:& ) >:&K 	$ &%%&s   d dd