o
    vh>                     @   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   X/var/www/html/hyperkenya/venv/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)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   r7   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#   splitr2   Ir'   lowerr7   r.   )attropsop_keysresultr3   r(   itemr   r   r   normalise_svg_path#   st   
rX   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_pathT   s
   88r`   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   )urF   drI   rB   r   r   r   vector_anglea   s   $ rd   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   rd   )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_parametersm   sZ     
r~   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 )Nr   r   r   re   gUUUUUU?)absr   r
   r   r   r%   append)rz   r{   rl   rm   	start_angextentnfrag
frag_anglefrag_radhalf_radkappa
point_listr|   	start_radr]   s1r-   r\   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   r~   r   r   )rf   rg   rl   rm   rn   rj   rk   rh   ri   mxtx2ty2rz   r{   r   r   bpr,   x3y3x4y4r   r   r   bezier_arc_from_end_points   s0   r   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fillModerM   r?   )r    r   ra   r   rN   r"   r    )rJ   rK   r   r!   rC   rD   rE   rF   rG   rA   r<   >   rG   rA   rI   rB   rI   rB   r;   r>   r=   r@   )r8   r:   r:   g|=zSuspicious self operator: %s)r;   r=   r>   r@      r   )popsuper__init__rX   r   r%   r&   r   r   r   moveTolineTocurveTor`   r   r   	closePathloggerdebug	getBounds	fillColorr   __dict__updatecopydeepcopyreversedinsert_SvgPath__closed_path))selfrB   r   r   r   kwr   r   normPathr   unclosed_subpath_pointerssubpath_startlastoplast_quadratic_cpr-   r(   numsstarting_pointxnynrh   ri   xpypx0y0xiyirf   rg   rl   rm   rn   rj   rk   r   _br    closed_path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   r   )"r   __all__r#   r   mathr   r   r   r   r   r   r	   r
   r   r   shapesr   r   r   r   r   r   r   r   r   r.   r7   rX   r`   rd   r~   r   r   r   r   r   r   r   <module>   s    0,1

N'