a
    ¥Q•hÇ2  ã                   @   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 |r–|j dkr–t|  | d¡¡ƒr–|  | 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"   úT/var/www/sistema_ama/venv/lib/python3.9/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   sH   t }g }t| dd¡ƒ}|r>t| ||ƒ\}}}| ||f¡ qt||ƒS )zBounding box for polyline node.ÚpointsÚ )r   r   r   r   ÚappendÚextend_bounding_box)r   r   r   r$   r9   Z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 rz|› d� dd¡\}}|dv �rât| ||ƒ\}}	}| dd¡\}
}tt	|
ƒƒ}
|d |dd…  ¡  }}|d	  
¡ sø||d  |dd…  ¡  }}qÌ|d |dd…  ¡  }}|d	  
¡ �sB||d  |dd…  ¡  }}�qtt|ƒƒtt|ƒƒ }}t| ||ƒ\}}}|d
k�rˆ||7 }||7 }t||||	|
||||ƒ	}|\}}}}|| }|| }||f||ff}t||ƒ}|}|}�n|dv �r„t| ||ƒ\}}}t| ||ƒ\}}}t| ||ƒ\}}}|dk�r\||7 }||7 }||7 }||7 }||7 }||7 }t|||f||f||ffƒ}|}|}�n||dv �rà|› d� dd¡\}}|  |d|¡\}}|dk�rÈ||7 }t|||ffƒ}|}�n |dv �r0t| ||ƒ\}}}|dv �r||7 }||7 }t|||ffƒ}|}|}nÐ|dv �r¨t| ||ƒ\}}}t| ||ƒ\}}}|dv �rˆ||7 }||7 }||7 }||7 }t|||f||ffƒ}|}|}nX|dv �r |› d� dd¡\}}|  d||¡\}}|dk�rì||7 }t|||ffƒ}|}| ¡ }qB|S )zBounding box for path node.Údr:   ú r   ÚMr   ZaANéÿÿÿÿÚaÚcCÚcZhHÚhZlLmMtTZlmtZqQsSÚqsZvVÚv)r   r   Úreplacer   r   ÚstripÚsplitr   r   ÚfloatÚisdigitÚboolÚintÚ_bounding_box_elliptical_arcr<   )r   r   r   Z	path_dataÚletterr$   Z
previous_xZ
previous_yr/   r0   ÚrotationÚlargeÚsweepr%   r&   Zarc_bounding_boxr2   r3   r'   r(   r4   r5   r9   Ú_r"   r"   r#   Úbounding_box_pathD   s¼    
 "
ÿ


ÿ


ÿ



ÿ


ÿ
rU   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    rW   c                 C   sZ   t }|D ]L}|  ||¡}t|ƒr|\}}}}	|| ||	  }
}t|||f|
|ffƒ}q|S )zBounding box for g node.)r   Úcalculate_bounding_boxr   r<   )r   r   r   r$   ÚchildZchild_bounding_boxÚminxÚminyr'   r(   ÚmaxxÚmaxyr"   r"   r#   Úbounding_box_gÔ   s    ÿr^   c                 C   s6   ddl m} || ||ƒ }du r$tS t| ||dƒS dS )zBounding box for use node.r   )Úget_use_treeNT)Údefsr_   r   r$   )r   r   r   r_   Útreer"   r"   r#   Úbounding_box_useá   s    rb   c	                 C   sH  t |ƒt |ƒ }}d||fv rFt|| ƒ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 �rb|| }|
d |	d |d   }|dk �rPt|| ƒt||ƒt ||  ƒt || ƒfS t|ƒ}|| }n<||k�rpdndt|ƒ }|| |
 | }| | |	 | }|t|ƒ |t|ƒ  | | d  }|t|ƒ |t|ƒ  || d  }|dtfv �rD|| }td| ƒ}|| }td|ƒ}|| }t| dƒ}|| }t|dƒ}�n¨|td dt d fv �r®|| }td| ƒ}|| }td|ƒ}|| }t| dƒ}|| }t|dƒ}�n>t|t|ƒ | ƒ }tt|t|ƒ | ƒ }||t|ƒ t|ƒ  |t|ƒ t|ƒ  }||t|ƒ t|ƒ  |t|ƒ t|ƒ  }||k�rR|| }}|| }}||t|ƒ t|ƒ  |t|ƒ t|ƒ  }t|| || ƒ}||t|ƒ t|ƒ  |t|ƒ t|ƒ  }t|| || ƒ}t|t|ƒ|  ƒ}t|t|ƒ|  ƒt }||t|ƒ t|ƒ  |t|ƒ t|ƒ  }||t|ƒ t|ƒ  |t|ƒ t|ƒ  }||k�rp|| }}|| }}||t|ƒ t|ƒ  |t|ƒ t|ƒ  }t|| || ƒ}||t|ƒ t|ƒ  |t|ƒ t|ƒ  }t|| || ƒ}t|| | | ƒ}t|| || ƒ}|�s || }}d}||k�r<|| }}d}|�sV||k�sp||k �sp|�rz||k�sz||k �szt|| ƒ}|�s”||k�s®||k �s®|�r¸||k�s¸||k �s¸t	|| ƒ}|�sÒ||k�sì||k �sì|�rö||k�sö||k �söt||ƒ}|�s||k�s*||k �s*|�r4||k�s4||k �s4t	||ƒ}|||| || fS )z/Bounding box of an elliptical arc in path node.r   r   rA   r   r   FT)
Úabsr6   r   r	   r
   r   r   r   r   r7   )r2   r3   r/   r0   ÚphirR   rS   r%   r&   Zx1primeZy1primeZradicantZcxprimeZcyprimeÚratioÚfactorr+   r,   rZ   Ztminxr\   Ztmaxxr[   Ztminyr]   ZtmaxyZtmp_yZtmp_xÚangle1Úangle2Z	other_arcr"   r"   r#   rO   ë   sÌ    ((*.ÿ$

(
$$

,,


,,,,


,,


ÿÿÿ
ÿÿÿ
ÿÿÿ
ÿÿÿ
rO   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   rZ   r[   r'   r(   r\   r]   Zx_listZ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   rp   r   Úutilsr   r   r   r$   r*   r.   r1   r8   r=   rU   rW   r^   rb   rO   r<   r   r   r"   r"   r"   r#   Ú<module>   s@   0	 
dó