U
    ^z~b!                     @   s   d 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 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dS )zG
This is a collection of utilities used by the ``svglib`` code module.
    N)
acosceilcopysigncosdegreesfabshypotradianssinsqrt)mmultrotate	translatetransformPointc                 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   I/home/ubuntu/graampay/app_env/lib/python3.8/site-packages/svglib/utils.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"          r+   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   )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   r2   )	keysr   splitr)   Ir    lowerr+   r%   )attrZopsZop_keysresultr*   r!   itemr   r   r   normalise_svg_path)   sR                    
rK   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c1Zc2Zc3r   r   r   convert_quadratic_to_cubic_path[   s
    88rN   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   )ur<   dr>   r8   r   r   r   vector_anglej   s    $ rR   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   rR   )x1y1x2y2fAfSrxryphiZphi_radZsin_phiZcos_phiZtxtyZx1dZy1drZrrZcxdZcydcxcytheta1Zdthetar   r   r   end_point_to_center_parametersw   sZ      


rb   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 )Nrc   r/   r   rS   gUUUUUU?)absr   r	   r   r
   r   append)r_   r`   rZ   r[   	start_angextentZnfragZ
frag_angleZfrag_radZhalf_radkappaZ
point_listra   Z	start_radrM   s1r$   rL   s0r   r   r   bezier_arc_from_centre   sB    


rk   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   rb   rk   re   )rT   rU   rZ   r[   r\   rX   rY   rV   rW   ZmxZtx2Zty2r_   r`   rf   rg   Zbpr#   Zx3Zy3Zx4Zy4r   r   r   bezier_arc_from_end_points   sL                  rl   )r   )r   rc   )__doc__r   mathr   r   r   r   r   r   r   r	   r
   r   Zreportlab.graphics.shapesr   r   r   r   r%   r+   rK   rN   rR   rb   rk   rl   r   r   r   r   <module>   s   02
O
(