
    jkeR@                        	 d dl Z 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 j2                         e j&                  e j(                  e j(                  e j(                  e j(                         e j&                  e j$                  e j$                  e j$                  e j2                         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 j2                         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 j2                  e j$                  $       e j&                  e j2                  %       e j&                  e j2                  &       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 j2                  +       e j&                  e j2                  &      d/d,                     Z" e j&                  e j2                  e j2                  e j2                  -       e j&                  e j2                  &      d/d.              Z#y# eef$ r d dlm Z  dZY w xY w)0    N)cythonF   )ErrorApproxNotFoundErrorcurve_to_quadraticcurves_to_quadraticd   NaNv1v2c                 <    | |j                         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     7/usr/lib/python3/dist-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    9   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&   G   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(  rOt        | |||      \  }}t        t        |d   |d   |d   |d         t        |d   |d   |d   |d         z         S |dk(  rOt        | |||      \  }}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   U   s)   , 	Av(RR899Av*2r2r:;;Av#BB31 1qtQqT1Q48"1Q41qtQqT:;
 	
 	Av#BB31"1Q41qtQqT:$QqT1Q41qt<=
 	

 #2r2r155r   )r!   r"   r#   r$   r0   )dtdelta_2delta_3i)a1b1c1d1c              #   &  K   t        | |||      \  }}}}d|z  }	|	|	z  }
|	|
z  }t        |      D ]]  }||	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        ||||       _ y w)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6JAq!Q	
QB2gG7lG1X 0VBw[!ebj1n'!ebj1nq1ut|+r1Vd]QX%B.2BB//0s   BB)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  }|||z  z   S # t        $ r t        t        t              cY S w xY w)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      sl    $ 
QB	
QB
RA!1q5MC2J& rAv:  !sC  !s   5 AA)	tolerancer!   r"   r#   r$   c                     t        |      |k  rt        |      |k  ry| d||z   z  z   |z   dz  }t        |      |kD  ry||z   |z
  | z
  dz  }t        | | |z   dz  ||z
  ||      xr 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    : 2w)B9 4 R"W"e
+C
3x)2glR5(F$
R"WOS6\3	 W
#CvR3I
VWr   )rX   )q1c0r8   c2c3c                     t        | d   | d   | d   | d         }t        j                  |j                        ry| d   }| d   }|||z
  dz  z   }|||z
  dz  z   }t	        d|| d   z
  || d   z
  d|      sy|||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   E  s    0 
a%(E!HeAh	?Bzz"''	qB	qB	rBw5!	!B	rBw5!	!B$QU1XrE!H}aSr2:r   )r0   rX   )r5   )all_quadratic)r]   r8   r^   r_   )q0r\   next_q1q2r9   c           	      Z   |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  rFt        |      }t        |
|dz
  z  |d   |d   |d   |d         }|	j                  |       ||z   dz  }n|}|}||z
  }t        |      |kD  s(t        ||||z
  dz  z   |z
  |||z
  dz  z   |z
  ||      r y	 |	j                  | 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   i  s   : 	Av%eY77Av-5($U1XuQxq58QOF fJ"	:a=*Q-A
1G 
qB	BAh F1a!e_ #BB q5fJ*QUZ]JqM:a=*UV-G MM'"w,#%BB "Wr7Y&?"r'e$$r)"r'e$$r)'
 9: MM%(Mr   )max_err)r0   c                     | D cg c]
  }t        |  } }t        dt        dz         D ]:  }t        | |||      }||D cg c]  }|j                  |j
                  f c}c S  t        |       c c}w c c}w )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).
    r   )rU   r;   MAX_Nrr   r   rd   r   )curvers   rg   rQ   r0   rp   ss          r   r   r     s    0 #((QWa[(E(1eai  6$UAwF.45QVVQVV$55	6 e
$$ ) 6s   A1A6)llast_ir5   c           
         | D cg c]  }|D cg c]
  }t        |  c} } }}t        |      t        |       k(  sJ t        |       }dg|z  }dx}}d}		 t        | |   |	||   |      }
|
|	t        k(  r	 t        |       |	dz  }	|}4|
||<   |dz   |z  }||k(  r6|D 
cg c](  }
|
D cg c]  }|j                  |j
                  f c}* c}}
S |c c}w c c}}w c c}w c c}}
w )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   )rU   lenrr   ru   r   rd   r   )curves
max_errorsrg   rv   rQ   rx   splinesry   r5   r0   rp   rw   s               r   r   r     s   N 9??uE*qw{*?F?z?c&k)))FAfqjGNFQ	A
$VAY:a=-P>Ez f
%% FAF
UaK;ELM6v6!affaff%6MM  +?& 7Ms-   	CCC!	C#*C	C#CC#)T)$r   compiledCOMPILEDAttributeErrorImportErrorfontTools.miscrb   errorsr   
Cu2QuErrorr   __all__ru   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      s)  $H  <  !6
7El &..V^^4
& 5   
& 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(:& ) >:&M 	$ %H	s   c8 8d
d