o
    %e>                     @   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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   :lib/python3.10/site-packages/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 q|S )Nr   z([1|0])z[\s,]*c                 S   s   g | ]}t |qS r   r   )r   Z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   r1   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!   Hr   VhvC   r   )cZzz([achlmqstvz]))flagsN )	keysr#   splitr/   Ir'   lowerr1   r,   )attropsZop_keysresultr0   r(   itemr   r   r   normalise_svg_path#   st   
rQ   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_pathT   s
   88rT   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_anglea   s   $ rX   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   rX   )x1y1x2y2fAfSrxryphiZphi_radZsin_phiZcos_phiZtxZtyZx1dZy1drZrrZcxdZcydcxcytheta1Zdthetar   r   r   end_point_to_center_parametersm   sZ     
rg   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 )Nrh   r   r   rY   gUUUUUU?)absr   r
   r   r   r%   append)rd   re   r`   ra   	start_angextentZnfragZ
frag_angleZfrag_radZhalf_radZkappaZ
point_listrf   Z	start_radrS   s1r+   rR   Zs0r   r   r   bezier_arc_from_centre   sB   


rn   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   rg   rn   rj   )rZ   r[   r`   ra   rb   r^   r_   r\   r]   ZmxZtx2Zty2rd   re   rk   rl   bpr*   Zx3Zy3Zx4Zy4r   r   r   bezier_arc_from_end_points   s0   rp   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           )         sP  | dd}| dd}t jd%d d |||d| |sd S t|}| j}	g }
g }d}d }tdt|dD ]f}|||d  \}}|dv rZ|dkrZ| jd tkrZ|
	t| j |d	krk| j
|  |	d
d  }n)|dkrv| j|  n|dkrt|	dkr|dv 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  n|dkr| |	d
 |d  n|dkr| |	d
 |d  |	d  n|dkr| |	d
 |	d |d   n{|dkr%| j|  no|dkrl|\}}}}t|	dk s<|dvrI|	d
d  d \}}}}n
|	dd  \}}}}|||  |||  }}| |||||| n(|dkr|	d
d  \}}|\}}}}}}| || || || || || ||  n|dkr|\}}}}t|	dk s|dvr|	d
d  d \}}}}n
|	dd  \}}}}|||  |||  }}| |||| || || ||  n|dkr#|	d
d  \}}|\}}}}||f}t||f||f||f\\}}\}}\}}\}}| |||||| nq|dkr{|d ur2|\}}n|	d
d  \}}|	d
d  \}}|||  |||  }}||f}|\}}t||f||f||f\\}}\}}\}}\}}| |||||| n|dkr|	d
d  \}}|\}}}}|| || || || f\}}}}||f}t||f||f||f\\}}\}}\}}\}}| |||||| n|dkr'|d ur|\}}n|	d
d  \}}|	d
d  \}}|\}}|| || }}|||  |||  }}||f}t||f||f||f\\}}\}}\}}\}}| |||||| nm|dv r|\}}} }!}"}}|	d
d  \}}|d krJ||7 }||7 }t|d!ksXt|d!kr_| || n5t||||| |!|"||	}#|#D ]\}$}$}}}}}}| |||||| qmn|dv r|   ntd"| |d#vrd }|}q6| jd tkr|
	t| j |s|r|  }%|r|%d |%d  }&tdt|	dD ]}|&|	|  |	|< q|r|%d$ |%d  }&tdt|	dD ]}|&|	|  |	|< q|
r#| jd ur#t }'|'jt| j t|
D ]
}(|'j|(t q|'| _d | _d S d | _d S )&Nvswapr   hswap)points	operators
isClipPath	autoclosefillModerG   r9   )r    r   rU   r   rH   r"   r    )rD   rE   r   r!   r=   r>   r?   r@   rA   r;   r6   >   rC   rA   r<   r;   rC   r<   r5   r8   r7   r:   )r2   r4   r4   g|=zSuspicious self operator: %s)r5   r7   r8   r:      r   )popsuper__init__rQ   rs   r%   r&   rt   r   rj   ZmoveToZlineToZcurveTorT   ri   rp   Z	closePathloggerdebugZ	getBoundsZ	fillColorr   __dict__updatecopyZdeepcopyreversedinsert_SvgPath__closed_path))selfr<   ru   rv   rw   kwrq   rr   ZnormPathrs   Zunclosed_subpath_pointersZsubpath_startZlastopZlast_quadratic_cpr+   r(   ZnumsZstarting_pointZxnZynr\   r]   ZxpZypZx0Zy0ZxiyirZ   r[   r`   ra   rb   r^   r_   ro   _br    Zclosed_pathZpointer	__class__r   r   r|     s  
"
"
 
 


0
(




$









zSvgPath.__init__c                 C   s@   t  }| j |_|`| jrt }|| j || |S |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   rh   )"r   __all__r#   r   Zmathr   r   r   r   r   r   r	   r
   r   r   Zshapesr   r   r   r   r   r   r   r   r   r,   r1   rQ   rT   rX   rg   rn   rp   r   r   r   r   r   <module>   s    0,1

N'