o
    
&zh!                     @   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r'| dv r'| dkr%d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   G/var/www/html/kangema/venv/lib/python3.10/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)opmin_numvaluefloatsresir   r   r   split_floats   s   r'   c              	   C   s^   d}d}d |||||||gd }g }t|| D ]}|| dd | D g q|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#   float_reflag_rea_seq_rer%   r   r   r   r   split_arc_values   s   r0   c                 C   sH  i ddddddddddd	dd
dddd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 ]Q}| dkrYqP||v r|dkrh||krhd}n|dkrs||krsd}n|}|| dkr||g g qP| dkr|t|| n|t||| | |d }qP|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', []]
    A   aQ   qT   tSsr   r   r   r   H   VhvC   r   )cZzz([achlmqstvz]))flagsN )	keysr   splitr+   Ir    lowerr0   r'   )attropsop_keysresultr,   r!   itemr   r   r   normalise_svg_path)   st   
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   )q0q1q2c0c1c2c3r   r   r   convert_quadratic_to_cubic_path[   s
   88rZ   c                 C   s   t |  t |  }|dkrdS | d |d  | d |d   | }|dk r'd}n|dkr-d}| d |d  | d |d   }ttt||S )Nr   r=   )r   r   r   r   )ur@   drC   r;   r   r   r   vector_anglej   s   $ r^   c	                 C   sX  t |}t |}|r3t|}	t|	}
t|	}d| |  }d||  }|| |
|  }|
| ||  }nd| |  }d||  }|| ||  || ||   }|dkrvt|}||9 }||9 }|| ||  || ||   }d| d }n
|dkrd| d }d|  k rdk rn nd}t|}||kr| }|| | | }|| |  | }|r|| |
|  d| |   }|
| ||  d||   }n|d| |   }|d||   }td|| | || | f}t|| | || | f| | | | | | fd }|dkr|dkr|d8 }n|dkr"|dk r"|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phiphi_radsin_phicos_phitxtyx1dy1drrrcxdcydcxcytheta1dthetar   r   r   end_point_to_center_parametersw   sZ     
rx   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 r:|
 }
g }t|}|| }t|}t|}t|D ]Q}|}|}|||  }t|}t|}|| ||  |||  | |||
|    ||||
|    | |||
|    ||||
|    | ||  |||  f qP|S )Nry   r=   r   r_   gUUUUUU?)absr   r	   r   r
   r   append)rt   ru   rf   rg   	start_angextentnfrag
frag_anglefrag_radhalf_radkappa
point_listrv   	start_radrW   s1r&   rV   s0r   r   r   bezier_arc_from_centre   sB   


r   c	              	   C   s   | |kr
||kr
g S |rvt t| t|  | }	t|	||f\}
}tdd|
|||||\}}}}}}t||||||}t t| |t|}	g }|D ])\} }}}}}}}|t|	| |ft|	||f t|	||f t|	||f  qJ|S t| |||||||\}}}}}}t||||||S )Nr   )r   r   r   r   rx   r   r{   )r`   ra   rf   rg   rh   rd   re   rb   rc   mxtx2ty2rt   ru   r|   r}   bpr%   x3y3x4y4r   r   r   bezier_arc_from_end_points   s0   r   )r   )r   ry   )__doc__r   mathr   r   r   r   r   r   r   r	   r
   r   reportlab.graphics.shapesr   r   r   r   r'   r0   rR   rZ   r^   rx   r   r   r   r   r   r   <module>   s    02

O(