U
    '1e>                     @   s   d Z dZddlZddl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dlmZmZmZmZmZmZmZmZmZ dd Zd	d
 Zdd Zdd Zdd ZdddZdddZdd Z G dd deeZ!dS )z.this code is derived from that used by svglib.)SvgPath    N)
acosceilcopysigncosdegreesfabshypotradianssinsqrt   )	Groupmmultrotate	translatetransformPointPathFILL_EVEN_ODD
_CLOSEPATHUserNodec                 C   sn   dd t d|D }g }tdt||D ]>}|dkrN| dkrN| dkrJdnd} || ||||  g q*|S )	a;  Split `value`, a list of numbers as a string, to a list of float numbers.

    Also optionally insert a `l` or `L` operation depending on the operation
    and the length of values.
    Example: with op='m' and value='10,20 30,40,' the returned value will be
             ['m', [10.0, 20.0], 'l', [30.0, 40.0]]
    c                 S   s   g | ]}|rt |qS  float).0seqr   r   >/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/svgpath.py
<listcomp>   s      z split_floats.<locals>.<listcomp>(-?\d*\.?\d*(?:[eE][+-]?\d+)?)r   >   mMr   lL)refindallrangelenextend)opZmin_numvalueZfloatsresir   r   r   split_floats   s    r,   c              	   C   s^   d}d}d |||||||gd }g }t|| D ] }|| dd | D g q8|S )Nr   z([1|0])z[\s,]*c                 S   s   g | ]}t |qS r   r   )r   numr   r   r   r       s     z$split_arc_values.<locals>.<listcomp>)joinr#   finditerstripr'   groups)r(   r)   Zfloat_reZflag_reZa_seq_rer*   r   r   r   r   split_arc_values   s"          r2   c                 C   s   ddddddddddddddddddddd}|  }g }tjd|  tjd	}d
}|D ]}| dkrjqX||kr|dkr||krd}n|dkr||krd}n|}|| dkr||g g qX| dkr|t|| n|t||| | |d }qX|S )a  Normalise SVG path.

    This basically introduces operator codes for multi-argument
    parameters. Also, it fixes sequences of consecutive M or m
    operators to MLLL... and mlll... operators. It adds an empty
    list as argument for Z and z only in order to make the resul-
    ting list easier to iterate over.

    E.g. "M 10 20, M 20 20, L 30 40, 40 40, Z"
      -> ['M', [10, 20], 'L', [20, 20], 'L', [30, 40], 'L', [40, 40], 'Z', []]
             r      r   )AaQqTtSsr    r"   r   r!   HVhvCcZzz([achlmqstvz]))flagsN r    r"   r   r!   r8   )	keysr#   splitr0   Ir'   lowerr2   r,   )attropsZop_keysresultr1   r(   itemr   r   r   normalise_svg_path#   sR                    
rR   c                 C   s   | }| d d|d | d    | d d|d | d    f}|d d|d | d    |d d|d | d    f}|}||||fS )zM
    Convert a quadratic Bezier curve through q0, q1, q2 to a cubic one.
    r   gUUUUUU?r   gUUUUUU?r   )Zq0Zq1Zq2c0c1c2c3r   r   r   convert_quadratic_to_cubic_pathT   s
    88rW   c                 C   s   t |  t |  }|dkrdS | d |d  | d |d   | }|dk rNd}n|dkrZd}| d |d  | d |d   }ttt||S )Nr   r   )r	   r   r   r   )urB   drD   r>   r   r   r   vector_anglea   s    $ r[   c	                 C   sb  t |}t |}|rft|}	t|	}
t|	}d| |  }d||  }|| |
|  }|
| ||  }nd| |  }d||  }|| ||  || ||   }|dkrt|}||9 }||9 }|| ||  || ||   }d| d }n|dkrd| d }d|  k rdk r"n nd}t|}||kr:| }|| | | }|| |  | }|r|| |
|  d| |   }|
| ||  d||   }n |d| |   }|d||   }td|| | || | f}t|| | || | f| | | | | | fd }|dkr2|dkr2|d8 }n|dkrN|dk rN|d7 }||||| | fS )z
    See http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes F.6.5
    note that we reduce phi to zero outside this routine
          ?r   r   g|۽)r   r   ih  )r   r
   r   r   r   r[   )x1y1x2y2fAfSrxryphiZphi_radZsin_phiZcos_phiZtxtyZx1dZy1drrrZcxdZcydcxcytheta1Zdthetar   r   r   end_point_to_center_parametersm   sZ      


rl   Z   c                 C   sH  t |dkrd}|}ntt |d }|| }|dkr:g S t|}|d }	t ddt|	  t|	 }
|dk rt|
 }
g }t|}|| }t|}t|}t|D ]}|}|}|||  }t|}t|}|| ||  |||  | |||
|    ||||
|    | |||
|    ||||
|    | ||  |||  f q|S )Nrm   r   r   r\   gUUUUUU?)absr   r
   r   r   r%   append)ri   rj   rc   rd   	start_angextentZnfragZ
frag_angleZfrag_radZhalf_radkappaZ
point_listrk   Z	start_radrT   s1r+   rS   s0r   r   r   bezier_arc_from_centre   sB    


ru   c	              	   C   s$  | |kr||krg S |rt t| t|  | }	t|	||f\}
}tdd|
|||||\}}}}}}t||||||}t t| |t|}	g }|D ]R\} }}}}}}}|t|	| |ft|	||f t|	||f t|	||f  q|S t| |||||||\}}}}}}t||||||S d S )Nr   )r   r   r   r   rl   ru   ro   )r]   r^   rc   rd   re   ra   rb   r_   r`   ZmxZtx2Zty2ri   rj   rp   rq   bpr*   Zx3Zy3Zx4Zy4r   r   r   bezier_arc_from_end_points   sL                  rw   c                       s0   e Zd ZdZddef fdd	Zdd Z  ZS )r   zPath, from an svg path stringr   Nc           )         s\  | dd}| dd}t jf d d |||d| |s>d S t|}| j}	g }
g }d}d }tdt|dD ]}|||d  \}}|dkr|dkr| jd tkr|
	t| j |d	kr| j
|  |	d
d  }n`|dkr| j|  nJ|dkrjt|	dkrP|dkr|}n|	d
d  }|d |d  |d |d   }}| 
|| n
| j
|  |	d
d  }n|dkr|	d
 |d  |	d |d   }}| || n|dkr| |d |	d  nn|dkr| |	d
 |d  nL|dkr| |	d
 |d  |	d  n"|dkr>| |	d
 |	d |d   n|dkrV| j|  n|dkr|\}}}}t|	dk s|dkr|	d
d  d \}}}}n|	dd  \}}}}|||  |||   }}| |||||| nR|dkr>|	d
d  \}}|\}}}}}}| || || || || || ||  n|dkr|\}}}}t|	dk sl|dkr|	d
d  d \}}}}n|	dd  \}}}}|||  |||   }}| |||| || || ||  nZ|dkrR|	d
d  \}}|\}}}}||f}t||f||f||f\\}}\}}\}}\}}| |||||| n|dkr|d k	rp|\}}n|	d
d  \}}|	d
d  \}}|||  |||   }}||f}|\}}t||f||f||f\\}}\}}\}}\}}| |||||| n4|dkr|	d
d  \}}|\}}}}|| || || || f\}}}}||f}t||f||f||f\\}}\}}\}}\}}| |||||| n|dkr\|d k	r|\}}n|	d
d  \}}|	d
d  \}}|\}}|| ||  }}|||  |||   }}||f}t||f||f||f\\}}\}}\}}\}}| |||||| n|dkr|\}}} }!}"}}|	d
d  \}}|d kr||7 }||7 }t|d!kst|d!kr| || nHt||||| |!|"||	}#|#D ]*\}$}$}}}}}}| |||||| qn |dkr*|   ntd"| |d#krDd }|}ql| jd tkrj|
	t| j |sv|r|  }%|r|%d |%d  }&tdt|	dD ]}|&|	|  |	|< q|r|%d$ |%d  }&tdt|	dD ]}|&|	|  |	|< q|
rR| jd k	rRt }'|'jt| j t|
D ]}(|'j|(t q.|'| _d | _nd | _d S )%Nvswapr   hswap)points	operators
isClipPath	autoclosefillModerH   r5   )r   r    rX   r    rI   r"   r   )rE   rF   r   r!   r?   r@   rA   rB   rC   r=   r4   >   rC   r=   r>   rD   rD   r>   r9   r;   r:   r<   )r7   r8   r8   g|=zSuspicious self operator: %s)r9   r:   r;   r<      )popsuper__init__rR   rz   r%   r&   r{   r   ro   ZmoveToZlineToZcurveTorW   rn   rw   Z	closePathloggerdebugZ	getBoundsZ	fillColorr   __dict__updatecopydeepcopyreversedinsert_SvgPath__closed_path))selfr>   r|   r}   r~   kwrx   ry   ZnormPathrz   Zunclosed_subpath_pointersZsubpath_startZlastopZlast_quadratic_cpr+   r(   numsstarting_pointZxnZynr_   r`   ZxpZypZx0Zy0xiyir]   r^   rc   rd   re   ra   rb   rv   _br   Zclosed_pathpointer	__class__r   r   r     s     


"

"


 
 


0
(




$







zSvgPath.__init__c                 C   sD   t  }| j |_|`| jr<t }|| j || |S |S d S )N)r   r   r   r   r   add)r   pgr   r   r   provideNode  s    
zSvgPath.provideNode)__name__
__module____qualname____doc__r   r   r   __classcell__r   r   r   r   r     s    7r   )r   )r   rm   )"r   __all__r#   r   mathr   r   r   r   r   r   r	   r
   r   r   Zshapesr   r   r   r   r   r   r   r   r   r,   r2   rR   rW   r[   rl   ru   rw   r   r   r   r   r   <module>   s   0,1
N
'