+
    	iy                         R t ^ RIt^ RIHt ^ RIHtHtHtHt ^ RI	H
t
 ^ RIHt ^RIHt  ! R R]4      tR	 tRR
 ltR tR tRR ltR tR tR tR# )z!Util functions for SVG rendering.N)suppress)cosradianssintan)urlparseparse_color)Matrixc                       ] tR t^tRtRtR# )
PointErrorz,Exception raised when parsing a point fails. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       Z/Users/agent/.openclaw/workspace/venv/lib/python3.14/site-packages/weasyprint/svg/utils.pyr   r      s    6r   r   c                    T ;'       g    RP                  RR4      p \        P                  ! RRV 4      p \        P                  ! RRV 4      p \        P                  ! RR	V 4      p V P                  4       # )
z1Give a canonical version of a given value string. Eez(?<!e)-z -z[ 
	,]+ z(\.[0-9-]+)(?=\.)z\1 )replaceresubstripstrings   &r   	normalizer!      s]    ll##C-FVVItV,FVVM3/FVV(&&9F<<>r   c                8   ^RI Hp V '       g   ^ # \        \        4      ;_uu_ 4        \	        V 4      uuRRR4       #   + '       g   i     M; i\        T 4      P                  R^4      ^ ,          p T P                  R4      '       d#   Tf   Q h\	        T RR 4      T,          ^d,          # T P                  R4      '       d   Tf   Q hT\	        T RR	 4      ,          # T P                  R4      '       d   Tf   Q hT\	        T RR
 4      ,          # T P                  R4      '       d#   Tf   Q hT\	        T RR
 4      ,          ^,          # TP                  4        F=  w  rET P                  T4      '       g   K  \	        T R\        T4      )  4      T,          u # 	  ^ # )z:Compute size from string, resolving units and percentages.)LENGTHS_TO_PIXELSNr   %rememex)
	css.unitsr#   r   
ValueErrorfloatr!   splitendswithitemslen)r    	font_sizepercentage_referencer#   unitcoefficients   &&&   r   sizer6      s`   -	*		V} 
			 v$$S!,Q/Fs#///VCR[!$883>>			$$$5---			$$$5---			$$$5--11.446??4  #d),-;; 7
 s	   >A	c           	         ^p\        V \        4      '       d=   V P                  4       p V P                  R4      '       d   ^dpV RR P                  4       p \	        ^\        ^ \        V 4      V,          4      4      # )z>Return opacity between 0 and 1 from str, number or percentage.r$   Nr(   )
isinstancestrr   r/   minmaxr-   )valueratios   & r   alpha_valuer>   <   sd    E%>>#E#2J$$&Eq#au-.//r   c                    \         P                  ! RV4      pV'       d>   VP                  ^^4      w  rEWP                  4       R p. V P	                  WEV4      OVN5# \
        h)z(Pop first two size values from a string.z(.*?) (.*?)(?: |$)N)r   matchgroupendpointr   )svgr    r2   r@   xys   &&&   r   rC   rC   G   sY    HH)62E{{1a 		%41+4V44r   c                T   T;'       g    VP                  4       pV'       d   VR,          w  rgM1V P                  V8X  d   V P                  V4      w  rgRWg39   d   R# MR# V'       d	   W6,          M^pV'       d	   WG,          M^p	V'       d"   VP                  RR4      P	                  4       p
MRp
V
^ ,          pVR8X  d   RpRpMj\        V
4      ^8  d
   V
^,          MRpVR8X  d   \        W4      pM\        W4      pT;rVR,          P                  4       pVR	,          P                  4       pVP                  R
8X  d7   V P                  VP                  R4      VP                  RR4      V4      w  ppMz^ pVR8X  d   W6V,          ,
          ^,          pMVR8X  d   W6V,          ,
          p^ pVR8X  d   VWGV	,          ,
          ^,          ,          pMVR8X  d   VWGV	,          ,
          ,          pV'       d/   VV^ ,          V,          ,          pVV^,          V	,          ,          pWVV3# )z7Compute scale and translation needed to preserve ratio.:   NNNpreserveAspectRatioxMidYMidnoner:   slice:      N:   NNmarkerrefXrefY0midr;   )rM   rM       rU   )rK   )get_viewboxtreeget_intrinsic_sizegetr.   r1   r;   r:   lowertagrC   )rD   noder2   widthheightviewboxviewbox_widthviewbox_heightscale_xscale_yaspect_ratioalign
x_position
y_positionmeet_or_slicescale_valuetranslate_xtranslate_ys   &&&&&&            r   preserve_ratiorl   R   s   ++))+G(/%~	T	(+(>(>y(I%M22 3 '4e#!G)7f%QGxx 5zBHHJ OE

+.|+<q+@QdG#g/Kg/K''3Z%%'
2Y__&
xx8#&99HHVdhhvs3Y$@ [  7#::a?K5 '"99KFg%==BBK5 6W$<<<KwqzG++wqzG++[+55r   c                $   V '       du   V P                  R4      '       d^   V P                  R4      '       dG   V ^R p \        V 4      ^8  d2   R F+  pV ^ ,          V R,          u;8X  d
   V8X  g   K"  M K&  V ^R p  M	  \        T ;'       g    R4      # )u-   Parse a URL, possibly in a "url(…)" string.zurl()r   r(   )'")
startswithr/   r1   r   )urlquotes   & r   	parse_urlrt      sz    
s~~f%%#,,s*;*;!Bis8q=#q6SW---a)C $ CII2r   c                R    \        T ;'       g    R4      ;'       g    \        R4      # )z4Safely parse a color string and return a RGBA tuple.r   blackr   r   s   &r   colorrw      s     v||$<<G(<<r   c                   ^ ^ rT\        V4      P                  4       p\        V4      ^8X  d$   \        V^ ,          4      \        V^,          4      rT\	        WER7      p\
        P                  ! R\        V 4      4      pV EFH  w  rV
P                  R4       Uu. uF  p\        WV4      NK  	  ppV	R8X  d   \	        V!  V,          pKI  V	R8X  Ed   \        V4      ^8X  d#   \	        V^,          V^,          R7      V,          p\	        \        \        \        V^ ,          4      4      4      \        \        \        V^ ,          4      4      4      \        \        \        V^ ,          4      4      4      ) \        \        \        V^ ,          4      4      4      4      V,          p\        V4      ^8X  d(   \	        V^,          ) V^,          ) R7      V,          pEKX  EK[  V	P                  R4      '       d   \        V4      ^8X  d   VP                  ^ 4       V	R9   d>   \	        \        \        \        VP                  ^ 4      4      4      4      R7      V,          pV	R9   dA   \	        \        \        \        VP                  ^ 4      4      4      4      R7      V,          pEK  EK!  V	P                  R	4      '       dz   \        V4      ^8X  d   VP                  ^ 4       V	R9   d#   \	        VP                  ^ 4      R
7      V,          pV	R9   d&   \	        VP                  ^ 4      R7      V,          pEK  EK  V	P                  R4      '       g   EK  \        V4      ^8X  d   VP                  V^ ,          4       V	R9   d#   \	        VP                  ^ 4      R7      V,          pV	R9   g   EK&  \	        VP                  ^ 4      R7      V,          pEKK  	  \	        V) V) R7      V,          # u upi )z3Get a matrix corresponding to the transform string.)r   fz(\w+) ?\( ?(.*?) ?\)r   matrixrotateskew)c)b	translate)r   )ry   scale)a)d)skewXr|   )skewYr|   )
translateXr   )
translateYr   )scaleXr   )scaleYr   )r!   r.   r1   r6   r
   r   findallr   r   r-   r   rq   appendr   pop)transform_stringtransform_originr2   normalized_diagonalorigin_xorigin_ysize_stringsrz   transformationstransformation_typetransformationr<   valuess   &&&&         r   	transformr      s%    Ah-.446L
<A!,q/2Da4I(h+Fjj!8)DT:UVO/>+ (--c242 #672 	 4 (*V_v-F H,6{a&)vay9FBGE&),-.GE&),-.WU6!9-.//GE&),-.	0 39	9F
 6{a6!9*
;fD   ++F336{aa "&77'%

1"678:<BC"&77'%

1"678:<BC 8 !++K886{aa "&AA&**Q-069"&AA&**Q-069 B ++G446{afQi("&99&**Q-069"&99&**Q-069M 0?P XI(+f44O4s   O!)NN)N)r   r   
contextlibr   mathr   r   r   r   urllib.parser   tinycss2.color5r	   rz   r
   	Exceptionr   r!   r6   r>   rC   rl   rt   rw   r   r   r   r   <module>r      sS    ' 	  ' ' ! ' 7 7D056p	=
35r   