
    ]Mh                         d Z ddlmZmZ ddlmZmZmZmZm	Z	m
Z
mZmZmZmZ de
z  Zde
z  Zd Z G d de          Zd	S )
zConvert SVG Path's elliptical arcs to Bezier curves.

The code is mostly adapted from Blink's SVGPathNormalizer::DecomposeArcToCubic
https://github.com/chromium/chromium/blob/93831f2/third_party/
blink/renderer/core/svg/svg_path_parser.cc#L169-L278
    )IdentityScale)
atan2ceilcosfabsisfinitepiradianssinsqrttan         ?c                 l    |                      |j        |j        f          }|d         |d         dz  z   S )Nr      y              ?)transformPointrealimag)matrixptrs      Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/svgLib/path/arc.py
_map_pointr      s5    rw011AQ4!A$)    c                   &    e Zd Zd Zd Zd Zd ZdS )EllipticalArcc                     || _         || _        || _        || _        || _        || _        || _        t          |          | _        d x| _	        x| _
        x| _        | _        d S N)current_pointrxryrotationlargesweeptarget_pointr   anglecenter_pointtheta1theta2	theta_arc)selfr    r!   r"   r#   r$   r%   r&   s           r   __init__zEllipticalArc.__init__   sk    * 

( X&&
 JNMMDKM$+r   c                    t          | j                  }t          | j                  }|r|sdS | j        | j        k    rdS | j        | j        z
  dz  }t          j        | j                   }t          ||          }||z  }||z  }|j	        |j	        z  }|j
        |j
        z  }	||z  |	|z  z   }
|
dk    r3|t          |
          z  }|t          |
          z  }||c| _        | _        t          d|z  d|z                                | j                   }t          || j                  }t          || j                  }||z
  }|j	        |j	        z  |j
        |j
        z  z   }t          d|z  dz
  d          }t          |          }| j        | j        k    r| }||z  }||z   dz  }|t!          |j
         |j	                  z  }||z  }||z  }t#          |j
        |j	                  }t#          |j
        |j	                  }||z
  }|dk     r| j        r|t$          z  }n|dk    r| j        s
|t$          z  }|| _        ||z   | _        || _        || _        dS )NFr   r         ?g        r   T)r   r!   r"   r&   r    r   rotater'   r   r   r   r   r   maxr%   r$   complexr   TWO_PIr)   r*   r+   r(   )r,   r!   r"   mid_point_distancepoint_transformtransformed_mid_point	square_rx	square_rysquare_xsquare_yradii_scalepoint1point2deltadscale_factor_squaredscale_factorr(   r)   r*   r+   s                        r   _parametrizezEllipticalArc._parametrize'   s    $']]$']] 	r 	5  2225"043DDK"/4:+66 *?<N O OG	G	(-0E0JJ(-0E0JJ *X	-AA??${###B${###B!2DGTWBB//66
{CCOT-?@@OT->??J#ej5:&=="1q54<55011:##(=L3.UZ888,,v{FK00v{FK00VO	q==TZ=II]]4:]Iy("(tr   c           	   #     K   | j         |                                 sd S t          j        | j                                      | j        | j                  }t          t          t          | j        t          dz   z                                }t          |          D ])}| j        || j        z  |z  z   }| j        |dz   | j        z  |z  z   }dt          d||z
  z            z  }t!          |          s d S t#          |          }t%          |          }t#          |          }	t%          |          }
t'          |||z  z
  |||z  z             }|| j         z  }t'          |
|	          }|| j         z  }|}|t'          ||	z  | |
z            z  }t)          ||          }t)          ||          }t)          ||          }|||fV  +d S )NgMbP?r   gUUUUUU?r/   )r(   rB   r   r0   r'   scaler!   r"   intr   r   r+   PI_OVER_TWOranger)   r   r	   r   r   r2   r   )r,   r5   num_segmentsistart_theta	end_thetatsin_start_thetacos_start_thetasin_end_thetacos_end_thetar<   r&   r=   s                 r   _decompose_to_cubic_curvesz(EllipticalArc._decompose_to_cubic_curvesm   s     $T->->-@-@$F"/$*55;;DGTWMM
 4T^{U7J%K L LMMNN|$$ 	/ 	/A+DN(:\(IIKq1u&>&MMI#di+&=>???AA;; !+..O!+..O	NNM	NNM!o"55!o"55 F d''F"=-@@LD--L!Fga-/!m1CDDDF88F88F%o|DDL&,.....7	/ 	/r   c                     |                                  D ]A\  }}}|                    |j        |j        f|j        |j        f|j        |j        f           Bd S r   )rQ   curveTor   r   )r,   penr<   r=   r&   s        r   drawzEllipticalArc.draw   so    ,0,K,K,M,M 	 	(FFLKKfk*fk*"L$56   	 	r   N)__name__
__module____qualname__r-   rB   rQ   rU    r   r   r   r      sX        N N N D D DL%/ %/ %/N    r   r   N)__doc__fontTools.misc.transformr   r   mathr   r   r   r   r	   r
   r   r   r   r   r3   rF   r   objectr   rY   r   r   <module>r^      s     5 4 4 4 4 4 4 4 N N N N N N N N N N N N N N N N N N N N N N N N 
RBh  D D D D DF D D D D Dr   