a
    ý<ã`´  ã                   @   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)ZmatrixÚptÚr© r   ú8lib/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Úpoint2Z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 )Ngü©ñÒMbP?r   gUUUUUUõ?r(   )r"   r1   r   r)   r!   Z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    r/   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   )r7   ZcurveTor   r   )r&   Zpenr.   r/   r    r   r   r   Údraw”   s    


ýzEllipticalArc.drawN)Ú__name__Ú
__module__Ú__qualname__r'   r1   r7   r8   r   r   r   r   r      s   F'r   N)Ú__doc__ZfontTools.misc.transformr   r   Zmathr   r   r   r   r   r	   r
   r   r   r   r,   r3   r   Úobjectr   r   r   r   r   Ú<module>   s   0