o
    Zh0h2                     @   s   d 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 ddlmZmZ eeddf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d Zdd Zdd Zdd Zeeeeeeeeeeeeed Zd!S )"z%Calculate bounding boxes of SVG tags.    )
atanatan2cosinfisinfpiradianssinsqrttan   )PATH_LETTERS)	normalizepointc                 C   s   |j tvrtS t|j  | ||}t|stS |rK|j dkrKt| |drK| |dd|}|d |d  |d |d  |d | |d | f}|S )	zBounding box for any node.gstrokezstroke-width1pxr      r      )tagBOUNDING_BOX_METHODSEMPTY_BOUNDING_BOXis_valid_bounding_boxany	get_paintgetlength)svgnode	font_sizer   boxstroke_width r"   Q/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/svg/bounding_box.pybounding_box   s   
"r$   c                 C   sH   |  |d|d|\}}|  |d|d|\}}||||fS )zBounding box for rect node.xywidthheightr   r   )r   r   r   r%   r&   r'   r(   r"   r"   r#   bounding_box_rect   s
   r*   c                 C   sL   |  |d|d|\}}| |d|}|| || d| d| fS )zBounding box for circle node.cxcyrr   )r   r   r   )r   r   r   r+   r,   r-   r"   r"   r#   bounding_box_circle"   s   r.   c                 C   sX   |  |d|d|\}}|  |d|d|\}}|| || d| d| fS )zBounding box for ellipse node.rxryr+   r,   r   r)   )r   r   r   r/   r0   r+   r,   r"   r"   r#   bounding_box_ellipse)   s   r1   c                 C   s|   |  |d|d|\}}|  |d|d|\}}t||t||}}t||| t||| }	}
|||	|
fS )zBounding box for line node.x1y1x2y2)r   r   minmax)r   r   r   r2   r3   r4   r5   r%   r&   r'   r(   r"   r"   r#   bounding_box_line0   s
   r8   c                 C   sJ   t }g }t|dd}|r t| ||\}}}|||f |st||S )zBounding box for polyline node.points )r   r   r   r   appendextend_bounding_box)r   r   r   r$   r9   normalized_pointsr%   r&   r"   r"   r#   bounding_box_polyline9   s   
r>   c              
   C   s  | dd}tD ]}||d| d}qt|}t}d}d}d}|r
| }|ddd tv r=| ddd\}}|dv rt| ||\}}	}|dd\}
}tt	|
}
|d |dd  }}|d	 
 s||d  |dd  }}|d	 
 rk|d |dd  }}|d	 
 s||d  |dd  }}|d	 
 rtt|tt|}}t| ||\}}}|d
kr||7 }||7 }t||||	|
||||	}|\}}}}|| }|| }||f||ff}t||}|}|}n|dv rGt| ||\}}}t| ||\}}}t| ||\}}}|dkr4||7 }||7 }||7 }||7 }||7 }||7 }t|||f||f||ff}|}|}n|dv rt| ddd\}}| |d|\}}|dkri||7 }t|||ff}|}n|dv rt| ||\}}}|dv r||7 }||7 }t|||ff}|}|}nh|dv rt| ||\}}}t| ||\}}}|dv r||7 }||7 }||7 }||7 }t|||f||ff}|}|}n,|dv r| ddd\}}| d||\}}|dkr||7 }t|||ff}|}| }|s$|S )zBounding box for path node.dr:    r   Mr   aANacCchHhlLmMtTlmtqQsSqsvVv)r   r   replacer   r   stripsplitr   r   floatisdigitboolint_bounding_box_elliptical_arcr<   )r   r   r   	path_dataletterr$   
previous_x
previous_yr/   r0   rotationlargesweepr%   r&   arc_bounding_boxr2   r3   r'   r(   r4   r5   r9   _r"   r"   r#   bounding_box_pathD   s   












{r`   c                 C   s
   | dS )zBounding box for text node.text_bounding_box)r   )r   r   r   r"   r"   r#   bounding_box_text   s   
rb   c                 C   sZ   t }|D ]&}| ||}t|r*|\}}}}	|| ||	 }
}t|||f|
|ff}q|S )zBounding box for g node.)r   calculate_bounding_boxr   r<   )r   r   r   r$   childchild_bounding_boxminxminyr'   r(   maxxmaxyr"   r"   r#   bounding_box_g   s   rj   c                 C   s2   ddl m} || || }du rtS t| ||dS )zBounding box for use node.r   )get_use_treeNT)defsrk   r   r$   )r   r   r   rk   treer"   r"   r#   bounding_box_use   s   rn   c	                 C   sB  t |t |}}d||fv r#t|| t||t ||  t || fS t|| |  d t|||  d  }	t| | |  d t|||  d  }
|d |d  |d |
d   |d |	d   }||d |
d  |d |	d    }d }}|dk r|| }|
d |	d |d   }|dk rt|| t||t ||  t || fS t|}|| }n||krdndt| }|| |
 | }| | |	 | }|t| |t|  | | d  }|t| |t|  || d  }|dtfv r|| }td| }|| }td|}|| }t| d}|| }t|d}nT|td dt d fv rT|| }td| }|| }td|}|| }t| d}|| }t|d}nt|t| |  }tt|t| |  }||t| t|  |t| t|  }||t| t|  |t| t|  }||kr||}}||}}||t| t|  |t| t|  }t|| || }||t| t|  |t| t|  }t|| || }t|t||  }t|t||  t }||t| t|  |t| t|  }||t| t|  |t| t|  }||kr5||}}||}}||t| t|  |t| t|  }t|| || }||t| t|  |t| t|  }t|| || }t|| | | }t|| || }|s||}}d}||kr||}}d}|s||ks||k s|r||ks||k st|| }|s||ks||k s|r||ks||k st	|| }|s||ks||k s|r||ks||k st||}|s||ks||k s|r||ks||k st	||}|||| || fS )z/Bounding box of an elliptical arc in path node.r   r   rC   r   r   FT)
absr6   r   r	   r
   r   r   r   r   r7   )r2   r3   r/   r0   phir\   r]   r%   r&   x1primey1primeradicantcxprimecyprimeratiofactorr+   r,   rf   tminxrh   tmaxxrg   tminyri   tmaxytmp_ytmp_xangle1angle2	other_arcr"   r"   r#   rV      s   ((*.$(
$$

,,


,,,,


,,






rV   c           
      C   s   | \}}}}t |rt n|| t |rt n|| }}t| \}}	t|g|R  t|g|	R  t|g|R  t|g|	R  f\}}}}|||| || fS )z.Extend a bounding box to include given points.)r   r   zipr6   r7   )
r$   r9   rf   rg   r'   r(   rh   ri   x_listy_listr"   r"   r#   r<   O  s   r<   c                 C   s   | ot | d | d   S )u=   Check that a bounding box doesn’t have infinite boundaries.r   r   )r   )r$   r"   r"   r#   r   \  s   r   )rectcircleellipselinepolylinepolygonpathr   usemarkertexttspantextPathN) __doc__mathr   r   r   r   r   r   r   r	   r
   r   r   r   utilsr   r   r   r$   r*   r.   r1   r8   r>   r`   rb   rj   rn   rV   r<   r   r   r"   r"   r"   r#   <module>   sB    0	 
d
