B
    Jd                 @   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   g      ?c             C   s&   |  |j|jf}|d |d d  S )Nr      y              ?)ZtransformPointrealimag)matrixptr r   K/var/www/html/venv/lib/python3.7/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 )NFg      ?r   g      ?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   sH  | j d kr|  sd S t| j| j| j}tt	t
| jtd  }xt|D ]}| j|| j |  }| j|d | j |  }dtd||   }t|sd S t|}t|}t|}	t|}
t|||  |||  }|| j 7 }t|
|	}|| j 7 }|}|t||	 | |
 7 }t||}t||}t||}|||fV  qRW d S )NgMbP?r   gUUUUUU?g      ?)r!   r0   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   r-   r   r   r   _decompose_to_cubic_curvesm   s4    






z(EllipticalArc._decompose_to_cubic_curvesc             C   sB   x<|   D ]0\}}}||j|jf|j|jf|j|jf q
W d S )N)r7   ZcurveTor   r   )r%   penr,   r-   r   r   r   r   draw   s
    

zEllipticalArc.drawN)__name__
__module____qualname__r&   r0   r7   r9   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*   r3   r   objectr   r   r   r   r   <module>   s   0