
    ]Mh7@                        	 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        	          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        %          d/d,                                    Z" e j        e j        e j        e j        -           e j        e j        %          d/d.                        Z#dS )0    N)cython   )ErrorApproxNotFoundErrorcurve_to_quadraticcurves_to_quadraticd   NaNv1v2c                 :    | |                                 z  j        S )zReturn the dot product of two vectors.

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

    Returns:
        double: Dot product.
    )	conjugaterealr   s     U/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/cu2qu/cu2qu.pydotr   %   s     %%    )abcd)_1_2_3_4c                 N    |}|dz  |z   }||z   dz  |z   }| |z   |z   |z   }||||fS N      @ )r   r   r   r   r   r   r   r   s           r   calc_cubic_pointsr    6   sG     
B
c'QB
a%3	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   r   s           r   calc_cubic_parametersr&   D   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_iterr1   R   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$   r0   )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   r)   r(   )r&   ranger    )r!   r"   r#   r$   r0   r   r   r   r   r2   r3   r4   r5   t1t1_2r6   r7   r8   r9   s                      r   r/   r/   |   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).
    r)         ?      ?r   )r!   r"   r#   r$   r>   r?   s         r   r-   r-      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).
          r+   gh/?r)   r*   r(   r   r   )r!   r"   r#   r$   rC   rD   rE   rF   s           r   r.   r.      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   )rJ   r!   r"   r#   r$   rK   rL   s          r   cubic_approx_controlrN      s;    0 R3
C
R3
C#)q  r   )abcdphc                     || z
  }||z
  }|dz  }	 t          || |z
            t          ||          z  }n*# t          $ r 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   ZeroDivisionErrorcomplexNAN)r   r   r   r   rO   rP   rQ   rR   s           r   calc_intersectrW      s    $ 
QB	
QB
RA!1q5MMC2JJ& ! ! !sC     !rAv:s   $6 $AA)	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.
    Tr)   rA   FrB   )abscubic_farthest_fit_inside)r!   r"   r#   r$   rX   r>   r?   s          r   r[   r[     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   )rX   )q1c0r8   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   r(   r)   NUUUUUU?)rW   mathisnanimagr[   )cubicrX   r\   r]   r_   r8   r^   s          r   cubic_approx_quadraticrf   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   )r0   rX   )r5   )all_quadratic)r]   r8   r^   r_   )q0r\   next_q1q2r9   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   r(   Fr   r)   y                rB   ra   N)rf   r1   nextrN   r;   appendrZ   r[   )re   r0   rX   rg   cubics
next_cubicri   rj   r9   spliner5   r]   r8   r^   r_   rh   r\   d0s                     r   cubic_approx_splinerr   f  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)r0   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   rU   .0rQ   s     r   
<listcomp>z&curve_to_quadratic.<locals>.<listcomp>  s    (((QWa[(((r   r   Nc                 *    g | ]}|j         |j        fS r   r   rd   rx   ss     r   ry   z&curve_to_quadratic.<locals>.<listcomp>  s!    555QVQV$555r   )r;   MAX_Nrr   r   )curvers   rg   r0   rp   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_ir5   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   rv   rw   s     r   ry   z2curves_to_quadratic.<locals>.<listcomp>.<listcomp>  s    ***qw{***r   r   )rx   r   s     r   ry   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   ry   z2curves_to_quadratic.<locals>.<listcomp>.<listcomp>  s!    666!afaf%666r   r   )rx   rp   s     r   ry   z'curves_to_quadratic.<locals>.<listcomp>  s'    MMM666v666MMMr   )lenrr   r~   r   )	curves
max_errorsrg   r   splinesr   r5   r0   rp   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COMPILEDrb   errorsr   
Cu2QuErrorr   __all__r~   floatrV   cfuncinlinereturnsdoublelocalsrU   r   r    r&   r1   intr/   r-   r.   rN   rW   r[   rf   rr   r   r   r   r   r   <module>r      s4  $&MMMM$ & & &%%%%%%%%& ?  < < < < < < < <  !6
7eEll &.V^444
& 
& 54   
& 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    