o
    Zh0hm                     @   s   d Z ddlmZmZmZmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZmZ dd
lmZ dZdd Zdd Zdd Z	dddZdd Zdd Zd ddZdd Zdd ZdS )!zDraw borders.    )ceilfloorpisqrttan   )boxes)replaced)
percentage)Matrix   )	get_colorstyled_color)stacked)toprightbottomleftc              	   C   s   |j d d dks|jdu rdS | \}}}}}}}}	t||d}
|
| j }
| |||||j d }t|||j|j d |j d |j d	 |j d
  dS )z5Set ``box`` mask border as alpha state on ``stream``.mask_border_sourcer   noneNefmask_border_modemask_border_slicemask_border_repeatmask_border_outsetmask_border_width)stylemask_border_imagerounded_border_boxr   ctmset_alpha_statedraw_border_image)streamboxxywhtltrbrblmatrixmask_stream r0   L/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/draw/border.pyset_mask_border   s   
r2   c                    s   j d dkr	dS t tjo j d dkp j d dk}|r j d rddd j d f}d	} jD ]t}|j d
 dkr>d	}q2|rCd}q2t| W  j d } j d } j d dkr_ j d }n	t j d  j}|j j d | d  }	|	|j	||j
f}
t| ||d|
| t|t j dd}t| |
||| W d   n1 sw   Y  q2 j d d dkrΈ jdurt |  j j d  j d  j d  j d  dS  fddtD }t|dhkrdS  fddtD  fddttD }t|dhdhfv }ttd k}d|v}|r!|r!|r!t|  |d d  dS ttt||}d!D ]K}|| \}}}}|dks>|s@q,t| ) t| |||  dd" |  d"d  t|  |t||| W d   n	1 sqw   Y  q,dS )#zADraw the box borders and column rules to a ``pdf.stream.Stream``.
visibilityvisibleNcolumn_widthautocolumn_countcolumn_rule_widthr   Tcolumn_spanallFcolumn_rule_style
column_gapnormal	font_sizer   r   column_rule_colorborder_image_sourcer   border_image_sliceborder_image_repeatborder_image_outsetborder_image_widthc                    s   g | ]}t  d | dqS )border__width)getattr.0sider%   r0   r1   
<listcomp>K   s    zdraw_border.<locals>.<listcomp>c                    s    g | ]}t  jd | dqS )rE   _color)r   r   rH   rK   r0   r1   rL   Q   s     c                    s,   g | ]\}}| j o jd | d qS )rE   _style)alphar   )rI   irJ   r%   colorsr0   r1   rL   R   s    soliddoubler   )r      r   r      )r   
isinstancer   BlockContainerBoxchildrenr   r
   width
position_x
position_yheightclip_border_segmentr   r   draw_rect_borderborder_imager#   SIDESset	enumeratelendraw_rounded_bordertuplezipr    )r$   r%   columnsborder_widths	skip_nextchild
rule_width
rule_stylegapr[   
border_boxcolorwidthsstylessimple_stylesingle_color
four_sidesvaluesindexrJ   rZ   r   r0   rQ   r1   draw_border   s   




rx   c           4         s    jd  jd \}}}	tj|||	dd    d\|dd }
|d }dd }||
d }||
d	 }||
d
 }||
d }|\}}  \}}}}}}}}  \}}}}}} }!}"|| }#|| }$|| |# }%|| |$ }&dd }'|'|d |$}(|'|d	 |%})|'|d
 |&}*|'|d |#}+||+8 }||(8 }||+|) 7 }||(|* 7 }dd },|,|d |$||}$|,|d	 |%||}%|,|d
 |&||}&|,|d |#||}#		d fdd	}-|-|||#|$dd||\}.}/|-|| |% ||%|$| d|| |-|| |% || |& |%|&| | ||\}0}1|-||| |& |#|&d| || || k  }2ri|-||# |||# |% |$|d| | ||d	 |-||# || |& ||# |% |&|| | | ||d	 || k  }3r|-|| |% ||$ |%||$ |& | ||| | |d	 |-|||$ |#||$ |& d||| | |d	 |r|2r|3r|-||# ||$ ||# |% ||$ |& ||| | | | |||.p|0|/p|1d dS dS dS dS )zHDraw ``image`` as a border image for ``box`` on ``stream`` as specified.image_resolutionr>   N)specified_widthspecified_heightdefault_widthdefault_heightrV   c                 S   s:   t | ttfrt| |S | jdksJ td| jd | S )N%d   )rW   intfloatminunitvalue)	dimension	intrinsicr0   r0   r1   compute_slice_dimension{   s   
z2draw_border_image.<locals>.compute_slice_dimensionr   r   r   rU   c                 S   s(   | j d u r
| j| S | j dksJ | jS )Npx)r   r   )r   from_borderr0   r0   r1   compute_outset_dimension   s   

z3draw_border_image.<locals>.compute_outset_dimensionc                 S   sN   | dkr|S t | ttfr| | S | jdkr| jd | S | jdks$J | jS )Nr6   r~   r   r   )rW   r   r   r   r   )r   originalr   area_dimensionr0   r0   r1   compute_width_adjustment   s   
z3draw_border_image.<locals>.compute_width_adjustmentstretchc                    s  d||fv r
d}
nPd}|
s|r|r|| nd}
|dkr%t || |
 }n5|dkr>t|| |
 }||
 ||  |d  }n|dkrTtdt|| |
 }|||  }
nd}|| }
d||fv rdd}nPd}|sr|rp|rp|| nd}|	dkrt || | }n5|	dkrt|| | }|| ||  |d  }n|	dkrtdt|| | }|||  }nd}|| }d|
|fv r|
|fS |
 }| }||  }||  }t | |||     j| | | || | d j|
|d t	|D ]R}t	|D ]J}t: |||  }|||  }j||d ||
 || ||     
 jd  W d    n	1 sKw   Y  qqW d    |
|fS 1 sbw   Y  |
|fS )	Nr   r   repeatspaceroundr   )adimage_rendering)r   r   maxr   r   	rectangleclipend	transformrangedrawr   )r&   r'   rZ   r]   slice_xslice_yslice_widthslice_heightrepeat_xrepeat_yscale_xscale_yextra_dxn_repeats_xextra_dyn_repeats_yrendered_widthrendered_heightoffset_xoffset_yrP   jtranslate_xtranslate_yr%   imageintrinsic_heightintrinsic_widthr$   r0   r1   draw_border_image_region   s   


z3draw_border_image.<locals>.draw_border_image_region)r   )r   )r   r   r   r   )r   r   NN)get_intrinsic_sizer   r	   default_image_sizingborder_widthborder_heightr    rounded_padding_box)4r%   r$   r   border_sliceborder_repeatborder_outsetr   rZ   r]   ratioimage_sliceshould_fillr   	slice_topslice_rightslice_bottom
slice_leftr   r   r&   r'   r(   r)   r*   r+   r,   r-   r   pypwphptlptrpbrpblborder_left
border_topborder_rightborder_bottomr   
outset_topoutset_rightoutset_bottomoutset_leftr   r   
scale_left	scale_topscale_rightscale_bottomx_middley_middler0   r   r1   r#   n   s   


M



r#   Nc           3   	      s  |\}}}	}
|p	d\\}}\}}\}}\}}|pd|f \}}}}dd }dd }dkrN|||||\\}}}|| || |\\}}}|}d}d |nzd	kry|| || |\\}}}|| | | | \\}}}|}d}d
 ||	 nOdkr||| || \\}}}|| | | | \\}}}|}d}d ||
 n$dkr|||||\\}}}||| || \\}}}|}d}d |dv r||d
  || |d
  } }!| |d
  || |d
  }"}#|	| | }$|	}% ||	  | || |  ||	 | |  nRdv rk| | |d
  ||d
  } }!| | |d
  | |d
  }"}#|
| | }$|
}% ||
  | | ||  | ||
 |  |dv r|dkrw|nd| |s|rx|| |!}&||"|#}'|$|& |' }%t|% }(|r|r|%|(|(d
   n
|%|(|(d
  d  t|&d
   })t|'d
   }*t|$ }+ fdd},|,|)|+||||||&\}+}-|,|*|+| ||	 ||
 |||'d }+|$dkrwtd|+d
D ]x}.|.|-7 }.dv r7t|| |.  || }/t|| |.d   ||	 | }0|dk r/|nd }1|1| }2n2dv rit|| |.  || }1t|| |.d   ||
 | }2|dkrb|nd }/|/| }0|/|1|0|/ |2|1  qnj	dd 
  |%t|% t|% d d
   pdtdt|% d
D ]U}.dkr||.  || qd	kr͈||	 | ||.  | qdkr||.  ||
 | | qdkr|||.  | qj	dd 
  dS )zClip one segment of box border.

    The strategy is to remove the zones not needed because of the style or the
    side before painting.

    )r   r   r   r   r   rV   c                 S   s8   t | t |krt |t |kr| |fdfS ||fdfS )a  Get the point use for border transition.

        The extra boolean returned is ``True`` if the point is in the padding
        box (ie. the padding box is rounded).

        This point is not specified. We must be sure to be inside the rounded
        padding box, and in the zone defined in the "transition zone" allowed
        by the specification. We chose the corner of the transition zone. It's
        easy to get and gives quite good results, but it seems to be different
        from what other browsers do.

        TF)abs)x1y1x2y2r0   r0   r1   transition_pointI  s   *
z-clip_border_segment.<locals>.transition_pointc              	   S   sH   | | | |  }t d | |  dd|d  dtdd|d       S )a7  Return the length of the half of one ellipsis corner.

        Inspired by [Ramanujan, S., "Modular Equations and Approximations to
        pi" Quart. J. Pure. Appl. Math., vol. 45 (1913-1914), pp. 350-372],
        wonderfully explained by Dr Rob.

        https://mathforum.org/dr.math/faq/formulas/

           r   rU   r   
   rV   )r   r   )r   br&   r0   r0   r1   corner_half_lengthZ  s   
&z/clip_border_segment.<locals>.corner_half_lengthr   r   r   r   r   rU   r   r   r   r   r   )dotteddashedr         ?c                    s  | s|d dfS t d| dD ]}|d7 }d  | ||  |  d t }	|dkr,tntd  | |d |  |  d t  t d }
dv rz|| |  || || d t|
   || || d t|	   n.dv r| ||  || || t|
   || || t|	   |
 t d kr|	|
 d  | |d |  |  d t |	  }|d7 } ||fS qd t d |
 |
|	   }||fS )Nr   r   r   r   rV   r   r   )r   r   r   r   move_toline_tor   )dasheslinewayr&   r'   r   r   chlrP   angle1angle2offsetangledashmain_offsetrJ   r$   r0   r1   	draw_dots  sf   
z&clip_border_segment.<locals>.draw_dotsr   gư>Teven_oddN)r   r   r   r   r   r   r   r   r   r   r   )3r$   r   rZ   rJ   ro   ri   radiibbxbbybbwbbhtlhtlvtrhtrvbrhbrvblhblvbtr,   bbr-   r   r   px1py1rounded1px2py2rounded2r   a1b1a2b2line_lengthlengthchl1chl2dash_lengthdashes1dashes2r   r   r   rP   r   r   r   r   r0   r   r1   r^   =  s    


 
 "


#

"

"



r^   c                 C   s   |dv r>|  |d  t| |  t| |d | jdd |  |d  t| |d t| |  | jdd d S |  | t| |  |dkr^t| |d t| |d	 t| |  | jdd d S )
Nridgegroover   r   Tr   r   rT   gUUUUUU?gUUUUUU?)	set_colorrounded_boxr   rounded_box_ratiofillr    )r$   r%   r   rp   r0   r0   r1   re     s"   
re   c                 C   s  |\}}}}|\}	}
}}|dv r}|  |d  | j|  | ||d  ||	d  |||
 d  ||	| d   | jdd | ||d  ||	d  |||
 d  ||	| d   | || ||	 || |
 ||	 |  |  |d  | jdd d S |  | | j|  |dkr| ||d  ||	d  |||
 d  ||	| d   | ||d d  ||	d d  |||
 d d  ||	| d d   | || ||	 || |
 ||	 |  | jdd d S )	Nr  r   r   Tr   r   rT   rU   )r  r   r  )r$   r%   rq   r   rp   r   r   r   r   r  r,   r  r-   r0   r0   r1   r_   	  s>   
(

$(r_   c	              
   C   sp  ||ks
||ks
J t |  |dvr| j|dd |dkr)| d| g| n|dkr4| |g| |dkr| |d  ||krm| ||d  | | ||d  | | ||d  | | ||d  | n4||kr| |||d   | |||d   | |||d   | |||d   n|dv r"| |d	  | j|d
 dd ||kr| ||d  | | ||d  | n||kr| |||d   | |||d   |   | j|d dd ||kr| ||d  | | ||d  | n||kr!| |||d   | |||d   n|dkr||ks.J d}	d| }
| ||d	|
  || d|
  |   | 	  || }| || ||k r| | | 
||
d	  ||	|
  |d|
 d	  ||	|
  |d	|
  | |d	|
 7 }|	d9 }	||k s[n| | | || | || |   W d    d S 1 sw   Y  d S )Nr  T)stroker      r   rT   rU   r   r   rV   r   wavyg      ?r   )r   r  set_dashset_line_widthr   r   r   r   r   r   curve_to)r$   r   r   r   r   	thicknessr   rp   r   upradiusr&   r0   r0   r1   	draw_line'  s   



 



	
$r)  c           	      C   s  |j d }|j d }t|j d}|j d }|j d dkrw|rw|jrw| | | | | | | d|  d|  | d|  d|  f}tD ]-}t|  t	| |||| t
| |d|f |t||| W d    n1 sqw   Y  qI|jD ]}t|tjrt| | qzd S )	Noutline_widthoutline_offsetoutline_coloroutline_styler3   r4   r   rV   )r   r   rO   border_box_xborder_box_yr   r   ra   r   r^   r_   r   rY   rW   r   Boxdraw_outline)	r$   r%   rZ   r   rp   r   outline_boxrJ   rk   r0   r0   r1   r1  j  s0   






r1  c              
   C   s  |\}}}}}}}}	t dd ||||	fD r!| |||| dS d}
| ||d  | | || |d  | | || |d |
  ||| ||d |
  || ||d   | || || |d   | || || |d |
  || |d |
  || || |d  ||  | ||	d  ||  | ||	d |
  || ||| |	d |
  ||| |	d   | |||d   | |||d |
  ||d |
  |||d  | dS )zDraw the path of the border radius box.

    ``widths`` is a tuple of the inner widths (top, right, bottom, left) from
    the border box. Radii are adjusted from these values. Default is (0, 0, 0,
    0).

    c                 s   s    | ]}d |v V  qdS )r   Nr0   )rI   cornerr0   r0   r1   	<genexpr>  s    zrounded_box.<locals>.<genexpr>Ng?r   r   )r:   r   r   r   r%  )r$   r   r&   r'   r(   r)   r*   r+   r,   r-   rr0   r0   r1   r    s.   8>8,r  )NN)r   )__doc__mathr   r   r   r   r   formatting_structurer   layoutr	   layout.percentr
   r.   r   rp   r   r   stackr   ra   r2   rx   r#   r^   re   r_   r)  r1  r  r0   r0   r0   r1   <module>   s*    Q Q
 9
C