
     h!                         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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                     d t          j        d|          D             }g }t          dt          |          |          D ]8}|dk    r| dv r
| dk    rdnd} |                    | ||||z            g           9|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                 0    g | ]}|t          |          S  float).0seqs     H/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/svglib/utils.py
<listcomp>z split_floats.<locals>.<listcomp>   s$    ```S\_`eCjj```    (-?\d*\.?\d*(?:[eE][+-]?\d+)?)r   >   Mmr   lL)refindallrangelenextend)opmin_numvaluefloatsresis         r   split_floatsr+      s     a`BJ/PRW$X$X```F
C1c&kk7++ 0 0q55R:%%c		sB

BqW}-.////Jr   c           	      
   d}d}d                     |||||||g          dz   }g }t          j        ||                                          D ]5}|                    | d |                                D             g           6|S )Nr   z([1|0])z[\s,]*c                 ,    g | ]}t          |          S r   r   )r   nums     r   r   z$split_arc_values.<locals>.<listcomp>%   s    <<<s<<<r   )joinr    finditerstripr$   groups)r%   r'   float_reflag_rea_seq_rer)   r   s          r   split_arc_valuesr6      s    0HG~~(Hgw(  	H C{8U[[]]33 ? ?

B<<szz||<<<=>>>>Jr   c                    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k    r||v rD|dk    r	||k    rd}n|dk    r	||k    rd}n|}||         dk    r|                    |g g           c|                                dk    r$|                    t          ||                     n*|                    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    splitr1   Ir$   lowerr6   r+   )attropsop_keysresultr2   r%   items          r   normalise_svg_pathrY   )   s   QQQQQ #Q(+Q03Q 	Q Q Q !$Q ),Q 14Q 	Q	 Q	 Q	 &'QQ	  C hhjjG FX&

BDAAAF	B  ::<<27?? s{{trzz2w!||r2h'''xxzzS  .r4889999l2s2w==>>>BBMr   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?rD   gUUUUUU?r   )q0q1q2c0c1c2c3s          r   convert_quadratic_to_cubic_pathrb   [   s     
B
Q%%2a52a5=)
)2a55BqEBqEM3J+J	KB
Q%%2a52a5=)
)2a55BqEBqEM3J+J	KB	Br2r>r   c                 @   t          |  t          | z  }|dk    rdS | d         |d         z  | d         |d         z  z   |z  }|dk     rd}n|dk    rd}| d         |d         z  | d         |d         z  z
  }t          t          t          |          |                    S )Nr   rD   )r	   r   r   r   )urG   drJ   rB   s        r   vector_anglerg   j   s    q	E1IAAvvq	
1!qtad{	"a'A2vv	
Q	!qtadQqTk!A8DGGQ''(((r   c	                    t          |          }t          |          }|rTt          |          }	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k    r9t	          |          }||z  }||z  }||z  ||z  z  ||z  ||z  z  z   }d|z  dz
  }n|dk    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k    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
          ?rD   r   g|۽)rD   r   ih  )r   r
   r   r   r   rg   )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1uu!WW
b
b#Ib!C#Ib$99EAI	
aEAI~~~~A~~~~~QA	RxxBr6C<2
CFSL/B
C  #s]Ws]*SBG_<s]Ws]*SBG_<3"r'?"3"r'?" &C#I#3cCi25E"FGGF
)r	C#I+,$*	cTCZ2-.  	F 
Qww6A::#	qVaZZ#r2rF7VG++r   Z   c                    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	          |          }|                    | ||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 )Nr   rD   r   ri   gUUUUUU?)absr   r
   r   r   r"   append)r~   r   rp   rq   	start_angextentnfrag
frag_anglefrag_radhalf_radkappa
point_listr   	start_radr_   s1r*   r^   s0s                      r   bezier_arc_from_centrer      s   
6{{b

S[[2%&&e^
Q	z""H#~HS]]*+c(mm;<<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,( 	) 	) 	) 	) r   c	           
         | |k    r||k    rg S |rt          t          |           t          |  |                     }	t          |	||f          \  }
}t	          dd|
|||||          \  }}}}}}t          ||||||          }t          t          | |          t          |                    }	g }|D ]i\  } }}}}}}}|                    t          |	| |f          t          |	||f          z   t          |	||f          z   t          |	||f          z              j|S t	          | |||||||          \  }}}}}}t          ||||||          S )Nr   )r   r   r   r   r   r   r   )rj   rk   rp   rq   rr   rn   ro   rl   rm   mxtx2ty2r~   r   r   r   bpr)   x3y3x4y4s                         r   bezier_arc_from_end_pointsr      s   
bR2XX 	
 I 63$<<B3!4!455!"r2h//S,Jq#sBB-
 -
)BB	6 $BBIvFF9R$$fSkk22.0 	 	*BBBBJJrB8,,~b2r(/K/KKrB8,,-/=b2r(/K/KL    
,JBBB-
 -
)BB	6 &b"b"iHHHr   )r   )r   r   )__doc__r    mathr   r   r   r   r   r   r	   r
   r   r   reportlab.graphics.shapesr   r   r   r   r+   r6   rY   rb   rg   r   r   r   r   r   r   <module>r      s    
			 T T T T T T T T T T T T T T T T T T T T T T T T N N N N N N N N N N N N  "
 
 
/ / /d  
) 
) 
)L, L, L, L,^% % % %PI I I I Ir   