o
    h                     @   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              ?)transformPointrealimag)matrixptr r   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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rd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   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'   r   r   r   _parametrize'   sX   




zEllipticalArc._parametrizec                 c   sH   | j d u r|  sd S t| j| j| j}tt	t
| jtd  }t|D ]x}| j|| j |  }| j|d | j |  }dtd||   }t|sR d S t|}t|}t|}	t|}
t|||  |||  }|| j 7 }t|
|	}|| j 7 }|}|t||	 | |
 7 }t||}t||}t||}|||fV  q)d S )NgMbP?r   gUUUUUU?r*   )r$   r=   r   r+   r#   scaler   r   intr   r   r'   PI_OVER_TWOranger%   r   r   r   r   r-   r   )r(   r0   num_segmentsistart_theta	end_thetatsin_start_thetacos_start_thetasin_end_thetacos_end_thetar7   r"   r8   r   r   r   _decompose_to_cubic_curvesm   s:   







z(EllipticalArc._decompose_to_cubic_curvesc                 C   s>   |   D ]\}}}||j|jf|j|jf|j|jf qd S r   )rK   curveTor   r   )r(   penr7   r8   r"   r   r   r   draw   s   


zEllipticalArc.drawN)__name__
__module____qualname__r)   r=   rK   rN   r   r   r   r   r      s
    F'r   N)__doc__fontTools.misc.transformr   r   mathr   r   r   r   r   r	   r
   r   r   r   r.   r@   r   objectr   r   r   r   r   <module>   s    0