o
    %e!Q                     @   s   d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
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 Zdd Zdd Zdd ZdS )u?   Parse and draw definitions: gradients, patterns, masks, uses…    )cycle)ceilhypot   )Matrix   )is_valid_bounding_box)alpha_valuecolor	parse_urlsize	transformc                 C   s  ddl m}m} | |d|d|\}}dD ]}||jv r$|j|= qt|| j}t| j}	|	j	dkr;td}	|dd	 d
kpN|dd	 |	dd	 k}
|j
r|
r|j
| jv rc| j|j
  }n@z| j|j
 }W n
 tyx   Y dS w || j|j
< n#| }z| |}|||}W n
 ty   Y dS w || |j}|jdv rd|j_d|jv rd|jv r|jd |jd< |jd |jd< |j D ]\}}||vr||jvr||j|< q|t|f | jj||d dS )zDraw use tags.r   )NOT_INHERITED_ATTRIBUTESSVGxy)r   r   viewBoxmaskdata N   )r   r   r   )svgsymbolr   widthheightef)r   r   r   pointgetattribr   get_hrefurlschemefragment	use_cachecopytree	get_child	Exceptiongeturlurl_fetcherget_intrinsic_sizetag_etree_nodeitemsoverride_iteriterstreamr   )r   node	font_sizer   r   r   r   	attribute
parsed_urlsvg_urlsame_originr'   r"   bytestring_svguse_svgkeyvalue r=   F/var/www/html/venv/lib/python3.10/site-packages/weasyprint/svg/defs.pyuse   sV   








r?   c                 C   sH   || j v rt| || j | |||S || jv r"t| || j| |||S dS )zDraw given gradient or pattern.N)	gradientsdraw_gradientpatternsdraw_pattern)r   r3   namer4   opacitystroker=   r=   r>   draw_gradient_or_patternC   s   

rG   c           6         sT  g }g |D ]A}| t|r|d ndt|d|d t|dd| }t|dd}	|dk rBt|	dd	 |	d	 | f }	 |	 qsLd
S tdkrpd \}
}}}| j	|
|| |dkrn| jj
||d dS | |||}t|s}d
S |ddkr| j| j}}t }nd\}}|\}}}}t||||d}|dd}|dv r|d dkr|dd dd  |d dk r| d  d  n?|d |d kr|jdkr|dd n
|d|d d  dd  |d |d kr| |d d   d  d|jv r%t|d|| j}|| }|jdkrgd}t|dd||t|dd||}}t|dd||t|dd||}}t||||||||	\}}n`|jdksoJ d	}t|dd||t|d d||}}t|d!d|t||} t|d"|||t|d#|||}!}"t|d$d|t||}#t|||!|"|#||| |||\}}d%d& D   fd'd&tt d D }$fd(d&ttd D }%t D ]0\}&}|dkr|&dkr|%|&d  d |%|&d  d< |&td k r|%|& d |%|& d< qt|$D ]\}&\}'}(d|'|(fvrA|'|(fdkrA|'|( |%|& d< q%d)\})}*d|jv rh|j|)|*\})}*|j||\}+},|+|) |,|* }}| j|)|*|||||| jj }-|-|)|*|||d |d f|dv}.td d* }/|dd }0fd+d,|%D }1|/|0|1}2 |d-||.|2}3t!d.d,  D r"|)|*||}4|d |d f|dv}.td d* }/|dd }0fd/d,|$D }1|/|0|1}2|4 |d0||.|2}5d1|5j# d2g|4_$|3j# |-
d |-%j# | jj&d3|d | jj'|-j#|d dS )4Draw given gradient node.r   offsetr   zstop-opacityz
stop-colorblackNr   FrF   TgradientUnitsuserSpaceOnUse)r   r   )adr   r   spreadMethodpadrepeatreflectradialGradientgradientTransformlinearGradientr   x1y1x2z100%y2cxz50%cyrfxfyfrc                 S   s   g | ]}|d  qS )r   r=   ).0r
   r=   r=   r>   
<listcomp>   s    z!draw_gradient.<locals>.<listcomp>c                    s    g | ]} |  |d   fqS r   r=   rd   i)alphasr=   r>   re          c                    s2   g | ]} | d d  |d  d d dgqS )Nr   r   r=   rg   )colorsr=   r>   re      s    $r   r   r   r   c                 3   s&    | ]\}}}  |||V  qd S )Ncreate_interpolation_function)rd   c0c1n)domaingroupr=   r>   	<genexpr>   s
    
z draw_gradient.<locals>.<genexpr>RGBc                 s   s    | ]}|d kV  qdS )r   Nr=   )rd   alphar=   r=   r>   ru      s    c                 3   s(    | ]\}}  d |g|gdV  qdS )rm   r   Nrn   )rd   rp   rq   )rt   r=   r>   ru      s
    
Gray/z shPattern)(appendmaxr   r   r	   r
   tuplelenr2   set_color_rgb	set_alphacalculate_bounding_boxr   inner_widthinner_heightr   insertr-   r    r   normalized_diagonalspread_linear_gradientr   spread_radial_gradientrange	enumerateinverttransform_pointadd_patternctm	add_groupcreate_stitching_functionadd_shadinganyset_alpha_stateidshadingdraw_x_objectcolor_spaceset_color_special)6r   r3   gradientr4   rE   rF   	positionschildstop_opacity
stop_colorredgreenbluerw   bounding_boxr   r   matrixr   r   rO   rP   spreadtransform_matrixshading_typerZ   r[   r\   r]   coordsr^   r_   r`   ra   rb   rc   alpha_couplescolor_couplesrh   a0a1bx1by1bx2by2patternextendencodeboundssub_functionsfunctionr   alpha_streamalpha_shadingr=   )ri   rk   rs   rt   r>   rA   M   s  









rA   c	           *         s8  ddl m}	m}
 |
 \}} | dv ro||kr%|	| }dddg |gfS || } fddtt d D }| d	kr]td
g| }t|}td
g|ddd  }t|ddd }n>| dkscJ td
g|ddd  d
g | }t|ddd | }td
g| d
g |ddd  }t||ddd  }|\}}}}|d
kr||| fn|| |f\}}|d
kr||| fn|| |f\}}|||\}}|||\}}||}}|| || } }!||k r||fn||f\}"}#||k r||fn||f\}$}%|"| |  |$| |!  t| |!d  }&|#| |  |%| |!  t| |!d  }'||'k rIt|}(|	t|  	 d |(  ||(| 7 }||'k s*||&krot|}(|
d
t|  
d
 d
 |(  ||(| 8 }||&ksN||| |  ||| |  }}||| |  ||| |  }}||||f}) ||)fS )zRepeat linear gradient.r   gradient_average_colornormalize_stop_positionsrS   r   solidNc                    s    g | ]} |d    |  qS rf   r=   rg   r   r=   r>   re      rj   z*spread_linear_gradient.<locals>.<listcomp>rT   r   rI   rU   )imagesr   r   r   r~   r   r   r   nextr{   r   )*r   r   rk   rZ   r[   r\   r]   r   r   r   r   firstlastaverage_colorstop_lengthposition_steps
next_stepsnext_colorsprevious_stepsprevious_colorsr   r   bwbhr   r   tx1ty1tx2ty2xbybxvyvxa1xa2ya1ya2
min_vector
max_vectorstepr   r=   r   r>   r      sf   


$$
&&



""
r   c           %         s  ddl m}m} |\}}||| |  ||| |  }}| dv r| } |j|	|
\}}ttt|t|| tt|t|| }|| }t	|| | }|dkrd| }| dkrj||9 }n| dkspJ g }t
|D ]}||dd|d rd	nd 7 }qvfd
dt
|D ||| 7 }|dkr||||||f}||fS || }d}t|  r| dkr||  7 }n| dksJ t
 D ]}||dd|| d rd	nd 7 }qˇ fddt
 D  |  }|dkr||||||f}||fS d d	 fdksJ d|  k rdk s J  J ddd	 }d| }| dkr7|ddd	 }t|ddD ]{\}}||krc|| d | } fdd| d D }|  nV||k r||  }||d   } |d   }!||| | g}"||||!g}#||"|#}$|$g||d  d  | } fdd|d  d D }|d   g|   nq=||||||f}||fS )zRepeat radial gradient.r   r   rS   r   r   rT   rU   NrI   c                    s   g | ]} D ]}|| qqS r=   r=   rd   rh   positionr   r=   r>   re   N  s
    z*spread_radial_gradient.<locals>.<listcomp>c                    s"   g | ]}D ]}|  | qqS r=   r=   r   )full_repeatoriginal_positionsr=   r>   re   h  s    
rm   )startc                    s   g | ]}|  d  qS rf   r=   rd   r   r   r=   r>   re     s    
c                    s   g | ]}|d    qS rf   r=   r   r   r=   r>   re     s    )r   r   r   r&   r   r   r   r|   absr   r   intr   )%r   r   rk   ra   rb   rc   r^   r_   r`   r   r   r   r   r   r   r   original_colorstwthmax_distancegradient_lengthrepeat_afterrT   rh   r   repeat_beforepartial_repeatreverseratior   new_positionsr
   
next_colornext_positionaverage_colorsaverage_positions
zero_colorr=   )r   r   r   r>   r   /  s   "
(
 



 






r   c              	   C   s  ddl m} d|j_| |||}t|sdS |d |d }}	t||	d}
|ddkrBt|d	d|d}t|d
d|d}nD|d |d }}t|j	
d	d|d| }t|j	
d
d|d| }d|vr||j	d	< ||j	d
< |ddkrd| d| d|j	d< |dks|dkrdS d|j	v rt|d|| j}||
 }
|
| jj }
| jdd|||||
}|| |dd||}||| |||| j| j| j ||j | jjd|d | jj|j|d dS )rH   r   )rz   r   Fr   r   patternUnitsrN   r   r   r   r   1r   patternContentUnitsobjectBoundingBoxzscale(z, )r   patternTransformrz   rL   T)r   rz   r.   r-   r   r   r   r   r   r    popr   inner_diagonalr2   r   r   r   r   drawbase_urlr+   contextr   r   r   r   )r   r3   r   r4   rE   rF   rz   r   r   r   r   pattern_widthpattern_heightr   r   r   stream_patternrt   r=   r=   r>   rC     sT   





rC   c                 C   s   |D ]s}|j dkrX|ddkr>| ||}t|r9|\}}}}t|dd|d| }	t|dd|d| }
nd }	}
n| |dd|dd|\}	}
| jj|	|
d q|j d	kru|d
d}|dd	 dd}| j
| qdS )z+Apply filters defined in given filter node.feOffsetprimitiveUnitsr   dxr   r   dyr   feBlendmodenormal- r   N)r-   r   r   r   r   r   r2   r   replacetitleset_blend_mode)r   r3   filter_noder4   r   r   _r   r   r   r  r  r=   r=   r>   apply_filters  s&   


r  c                 C   sJ  d|j _|ddkr| j| j}}n| |d|d|\}}t|dd|||jd< t|dd|||jd< t|dd	|||jd< t|dd	|||jd< |ddkr|d|d}}|d|d}}	| d
| d
| d
|	 |jd< n	d\}}||}}	| j}
| j	||||	| _| 
|| |
| _dS )zApply given mask node.g	maskUnitsrN   r   r   r   z-10%r   z120%r  r   rl   N)r.   r-   r   r   r   r   r   r    r2   r   	draw_node)r   r3   r   r4   	width_ref
height_refr   r   r   r   
svg_streamr=   r=   r>   
paint_mask  s0   

"

r  c                 C   s"   d|j v r|| j|j d < dS dS )zStore a clip path definition.r   N)r    paths)r   r3   r4   r=   r=   r>   	clip_path  s   
r  N)__doc__	itertoolsr   mathr   r   r   r   r   r   utilsr	   r
   r   r   r   r?   rG   rA   r   r   rC   r  r  r  r=   r=   r=   r>   <module>   s     8
 In3