a
    w=ic                     @   sp   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de
 Zdd ZG d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                 C   s&   |  |j|jf}|d |d d  S )Nr      y              ?)ZtransformPointrealimag)matrixptr r   j/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/fontTools/svgLib/path/arc.py
_map_point   s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
EllipticalArcc                 C   sP   || _ || _|| _|| _|| _|| _|| _t|| _d  | _	 | _
 | _| _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!   r   r   r   __init__   s    
zEllipticalArc.__init__c                 C   s  t | j}t | j}|r|s dS | j| jkr0dS | j| j d }t| j }t||}|| }|| }|j	|j	 }|j
|j
 }	|| |	|  }
|
dkr|t|
9 }|t|
9 }|| | _| _td| d| | j }t|| j}t|| j}|| }|j	|j	 |j
|j
  }td| d d}t|}| j| jkr@| }||9 }|| d }|t|j
 |j	7 }||8 }||8 }t|j
|j	}t|j
|j	}|| }|dk r| jr|t7 }n|dkr| js|t8 }|| _|| | _|| _|| _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   Zmid_point_distancepoint_transformZtransformed_mid_pointZ	square_rxZ	square_ryZsquare_xZsquare_yZradii_scalepoint1point2deltadZscale_factor_squaredZscale_factorr#   r$   r%   r&   r   r   r   _parametrize'   sX    




zEllipticalArc._parametrizec                 c   sF  | j d u r|  sd S t| j| j| j}tt	t
| jtd  }t|D ]}| j|| j |  }| j|d | j |  }dtd||   }t|s d S t|}t|}t|}	t|}
t|||  |||  }|| j 7 }t|
|	}|| j 7 }|}|t||	 | |
 7 }t||}t||}t||}|||fV  qPd S )NgMbP?r   gUUUUUU?r)   )r#   r3   r   r*   r"   scaler   r   intr   r   r&   PI_OVER_TWOranger$   r   r   r   r   r,   r   )r'   r.   Znum_segmentsiZstart_thetaZ	end_thetatZsin_start_thetaZcos_start_thetaZsin_end_thetaZcos_end_thetar/   r!   r0   r   r   r   _decompose_to_cubic_curvesm   s6    







z(EllipticalArc._decompose_to_cubic_curvesc                 C   s>   |   D ]0\}}}||j|jf|j|jf|j|jf qd S r   )r:   ZcurveTor   r   )r'   penr/   r0   r!   r   r   r   draw   s    


zEllipticalArc.drawN)__name__
__module____qualname__r(   r3   r:   r<   r   r   r   r   r      s   F'r   N)__doc__ZfontTools.misc.transformr   r   mathr   r   r   r   r   r	   r
   r   r   r   r-   r6   r   objectr   r   r   r   r   <module>   s   0