o
    à’Ojô>  ã                   @   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   ú`/var/www/html/pharmsmart-cdr-gen/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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�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r²t|	ƒ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�r›d }|}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'