
    Owg!                         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 Zd Zd Zd Zd	 Zdd
ZddZd Zy)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                     t        j                  d|      D cg c]  }|st        |       }}g }t        dt	        |      |      D ]-  }|dkD  r| dv r	| dk(  rdnd} |j                  | ||||z    g       / |S c c}w )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]]
    (-?\d*\.?\d*(?:[eE][+-]?\d+)?)r   >   Mmr   lL)refindallfloatrangelenextend)opmin_numvalueseqfloatsresis          C/var/www/horilla/myenv/lib/python3.12/site-packages/svglib/utils.pysplit_floatsr%      s     %'JJ/PRW$X`S\_eCj`F`
C1c&k7+ 0q5R:%c	sB

BqW-./0 J as
   A:A:c           
         d}d}dj                  |||||||g      dz   }g }t        j                  ||j                               D ]:  }|j	                  | |j                         D cg c]  }t        |       c}g       < |S c c}w )Nr   z([1|0])z[\s,]*)joinr   finditerstripr   groupsr   )r   r   float_reflag_rea_seq_rer"   r    nums           r$   split_arc_valuesr/      s    0HG~~(Hgw( 	H C{{8U[[]3 ?

Bszz|<s<=>?J =s   'Bc                 b   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}|j                         }g }t        j                  d| j                         t        j                        }d}|D ]  }|j                         dk(  r||v r9|dk(  r||k(  rd}n|dk(  r||k(  rd}n|}||   dk(  s@|j                  |g g       T|j                         dk(  r|j                  t        ||             n|j                  t        |||   |             |d   } |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   lowerr/   r%   )attropsop_keysresultr*   r   items          r$   normalise_svg_pathrR   )   s   QQQQQ #Q(+Q03Q 	Q Q Q !$Q ),Q 14Q 	Q	 Q	 Q	 &'QQ	C hhjG FXX&

BDDAF	B ::<27? s{trz2w!|r2h'xxzS .r489l2s2w=>B'* M    c                     | }| d   d|d   | d   z
  z  z   | d   d|d   | d   z
  z  z   f}|d   d|d   | d   z
  z  z   |d   d|d   | d   z
  z  z   f}|}||||fS )zM
    Convert a quadratic Bezier curve through q0, q1, q2 to a cubic one.
    r   gUUUUUU?r=   gUUUUUU? )q0q1q2c0c1c2c3s          r$   convert_quadratic_to_cubic_pathr]   [   s     
B
Q%%2a52a5=)
)2a55BqEBqEM3J+J	KB
Q%%2a52a5=)
)2a55BqEBqEM3J+J	KB	Br2r>rS   c                     t        |  t        | z  }|dk(  ry| d   |d   z  | d   |d   z  z   |z  }|dk  rd}n|dkD  rd}| d   |d   z  | d   |d   z  z
  }t        t        t        |      |            S )Nr   r=   )r	   r   r   r   )ur@   drC   r;   s        r$   vector_anglerb   j   s    q	E1IAAv	
1!qtad{	"a'A2v	
Q	!qtadQqTk!A8DGQ'((rS   c	                 t   t        |      }t        |      }|rHt        |      }	t        |	      }
t        |	      }d| |z
  z  }d||z
  z  }||z  |
|z  z
  }|
|z  ||z  z   }nd| |z
  z  }d||z
  z  }||z  ||z  z  ||z  ||z  z  z   }|dkD  r5t	        |      }||z  }||z  }||z  ||z  z  ||z  ||z  z  z   }d|z  dz
  }n|dk7  rd|z  dz
  }d|cxk  rdk  rn nd}t	        |      }||k(  r| }||z  |z  |z  }||z  |z   |z  }|r)|z  
|z  z
  d| |z   z  z   }|
|z  ||z  z   d||z   z  z   }n|d| |z   z  z   }|d||z   z  z   }t        d||z
  |z  ||z
  |z  f      }t        ||z
  |z  ||z
  |z  f| |z
  |z  | |z
  |z  f      dz  }|dk(  r|dkD  r|dz  }n|dk(  r
|dk  r|dz  }||||| | 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   rb   )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dthetas                           r$   end_point_to_center_parametersr}   w   s   
 
bB	bB #,g,g,BG_BG_lWr\)lWr\)R"WoR"Wo, 	c	R"Wc	R"W 55A1u!W
b
b#Ib!C#Ib$99EAI	
aEAI~A~QA	RxBr6C<2
CFSL/B
C s]Ws]*SBG_<s]Ws]*SBG_<3"r'?"3"r'?" &C#I#3cCi25E"FGF
)r	C#I+,$*	cTCZ2-. 	F 
Qw6A:#	qVaZ#r2rF7VG++rS   c                 d   t        |      dk  rd}|}nt        t        |      dz        }||z  }|dk(  rg S t        |      }|dz  }	t        ddt        |	      z
  z  t	        |	      z        }
|dk  r|
 }
g }t        |      }||z   }t        |      }t	        |      }t        |      D ]  }|}|}|||z  z   }t        |      }t	        |      }|j                  | ||z  z   |||z  z
  | |||
|z  z
  z  z   ||||
|z  z   z  z
  | |||
|z  z   z  z   ||||
|z  z
  z  z
  | ||z  z   |||z  z
  f        |S )NZ   r=   r   rd   gUUUUUU?)absr   r
   r   r   r   append)ry   rz   rk   rl   	start_angextentnfrag
frag_anglefrag_radhalf_radkappa
point_listr{   	start_radrZ   s1r#   rY   s0s                      r$   bezier_arc_from_centrer      s   
6{b
S[2%&e^
Q	z"H#~HS]*+c(m;<EA~JYF!I	VB	VB5\ )Q\)[[2R<rBw,rR%"*_55rR%"*_55rR%"*_55rR%"*_55rBw,rBw,( 	)) rS   c	           
      "   | |k(  r||k(  rg S |rt        t        |       t        |  |             }	t        |	||f      \  }
}t	        dd|
|||||      \  }}}}}}t        ||||||      }t        t        | |      t        |            }	g }|D ]U  \  } }}}}}}}|j                  t        |	| |f      t        |	||f      z   t        |	||f      z   t        |	||f      z          W |S t	        | |||||||      \  }}}}}}t        ||||||      S )Nr   )r   r   r   r   r}   r   r   )re   rf   rk   rl   rm   ri   rj   rg   rh   mxtx2ty2ry   rz   r   r   bpr"   x3y3x4y4s                         r$   bezier_arc_from_end_pointsr      s]   
bR2X 	
 63$<B3!45!"r2h/S,Jq#sBB-
)BB	6 $BBIvF9R$fSk2.0 	*BBBBJJrB8,~b2r(/KKrB8,-/=b2r(/KL	
 
,JBBB-
)BB	6 &b"b"iHHrS   )r   )r   r   )__doc__r   mathr   r   r   r   r   r   r	   r
   r   r   reportlab.graphics.shapesr   r   r   r   r%   r/   rR   r]   rb   r}   r   r   rU   rS   r$   <module>r      sK    
 T T T N N"
/d
)L,^%PIrS   