U
    »mœd³  ã                   @   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 )zùConvert 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   úR/home/sam/Atlas/atlas_env/lib/python3.8/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 k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 )Ngü©ñÒMbP?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_curvesl   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