a
    ¥Q•hãŠ  ã                   @   s–  d Z ddlZddlZddl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 ddlmZ dd	lmZ dd
lmZ ddlZddl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  ddl!m"Z"m#Z# de_$G dd„ de%ƒZ&G dd„ dƒZ'G dd„ dej(ƒZ)G dd„ dej(ƒZ*G dd„ dƒZ+d/dd „Z,d!d"„ Z-d#d$„ Z.d%d&„ Z/d'd(„ Z0G d)d*„ d*ƒZ1G d+d,„ d,e1ƒZ2G d-d.„ d.e1ƒZ3dS )0z+Fetch and decode images in various formats.é    N)Úmd5)ÚBytesIO)Úcycle)Úinf)ÚPath)Úurlparse)Úurl2pathname)ÚElementTree)ÚImageÚ	ImageFileÚImageOps)Úparse_coloré   )ÚDEFAULT_OPTIONS©Ú
percentage)ÚLOGGER)ÚSVG)ÚURLFetchingErrorÚfetchTc                   @   s   e Zd ZdZedd„ ƒZdS )ÚImageLoadingErrorzpAn error occured when loading an image.

    The image data is probably corrupted or in an invalid format.

    c                 C   s,   t |ƒj}t|ƒ}| |r&|› d|› �n|ƒS )Nz: )ÚtypeÚ__name__Ústr)ÚclsÚ	exceptionÚnameÚvalue© r   úJ/var/www/sistema_ama/venv/lib/python3.9/site-packages/weasyprint/images.pyÚfrom_exception$   s    
z ImageLoadingError.from_exceptionN)r   Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr    r   r   r   r   r      s   r   c                   @   sL   e Zd Zdddefdd„Zdd„ Zdd„ Zdd
d„Zdd„ Ze	dd„ ƒZ
dS )ÚRasterImageNÚnonec                 C   s´  |}t ||ƒ}||ur&|j|_d  }}|| _|d u r8i n|| _|d  | _}	|d | _d|jv rl| d¡}n|jdv r€| d¡}|j| _|j	| _	|j
| _
| j
dkr®| j	| j
 nt| _|d  | _}
t|d	i ƒ d
¡}| jdkoä|d u| _|jdv �r\d| _|d u �s|
�s|	d u�r¢t ¡ }d|
dœ}| jd u�r<| j|d< |j|fi |¤Ž | ¡ }d }nFd| _|d u �s~|
�s~|jdk�r¢t ¡ }|j|d|
d� | ¡ }d }|  ||¡| _d S )NÚjpeg_qualityÚdpiÚtransparencyÚRGBA)Ú1ÚPÚIÚRGBr   Úoptimize_imagesÚappZAPP14ÚCMYK)ÚJPEGZMPOr2   ©ÚformatÚoptimizeÚqualityÚPNG)Úrotate_pillow_imager4   ÚidÚ_cacheZ_jpeg_qualityÚ_dpiÚinfoÚconvertÚmodeÚwidthÚheightr   Úratior5   ÚgetattrÚgetÚinvert_colorsÚior   ÚsaveÚgetvalueÚcache_image_dataÚ
image_data)ÚselfÚpillow_imageÚimage_idrI   ÚfilenameÚcacheÚorientationÚoptionsZoriginal_pillow_imager'   r5   Zapp14Ú
image_filer   r   r   Ú__init__,   sJ    






zRasterImage.__init__c                 C   s   | j | | j| | jfS ©N)r?   r@   rA   )rJ   Ú
resolutionÚ	font_sizer   r   r   Úget_intrinsic_size`   s    zRasterImage.get_intrinsic_sizec                 C   s¾   | j dks| jdkrd S |dk}d}| jrŒd}t||jd d  | ƒ}t||jd d  | ƒ}	t| j | | j|	 ƒ}
|
| jkrŒ| j|
 }| | ||¡}| |dd| d|¡ | |¡ d S )Nr   Úautor   gÇqÇqŒ?)	r?   r@   r;   ÚabsZctmÚmaxZ	add_imageÚ	transformZdraw_x_object)rJ   ÚstreamÚconcrete_widthÚconcrete_heightÚimage_renderingÚinterpolaterA   Zpt_to_inZwidth_inchesZheight_inchesr(   Z
image_namer   r   r   Údrawc   s     

ÿzRasterImage.drawÚsourcec                 C   s:   |rt |ƒS | j› d|› d| jp"d› �}t| j||ƒS d S )Nú-Ú )ÚLazyLocalImager9   r;   Ú	LazyImager:   )rJ   ÚdatarM   ÚslotÚkeyr   r   r   rH   v   s    zRasterImage.cache_image_datac                 C   s@  |dkr| j | j }}n„t t | jj¡¡}tdt	| j | ƒƒ}tdt	| j| ƒƒ}| 
||f¡ t ¡ }|j||j| jd� |j |j }}|  | ¡ ¡| _| jdv r¬d}n2| jdv r¼d}n"| jdkrÌd}nt d	| j¡ d}t d
d|||d|rödnddœ¡}| jdk�r:| j�r"t d¡|d< d|d< t | jg|¡S d|d< t d|dœ¡|d< | jdv �rnd|d d< | jdv �rt t | jj¡¡}	|	 d¡}
|	 | jd d… ¡}	|  |	¡}|  |
¡}| j|dd�}tj|gdd
dt d|dœ¡||dd|�rüdndd œ	d!�|d"< n|  t t | jj¡¡¡}t | j|d#d�g|¡S )$Nr   r3   )r.   r*   z
/DeviceRGB)ÚLÚLAz/DeviceGrayr1   z/DeviceCMYKzUnknown image mode: %sz/XObjectz/Imageé   ÚtrueÚfalse)ÚTypeÚSubtypeÚWidthÚHeightÚ
ColorSpaceÚBitsPerComponentÚInterpolater2   )r   r   r   r   r   r   r   r   ÚDecodez
/DCTDecodeÚFilterz/FlateDecodeé   )Ú	PredictorÚColumnsÚDecodeParmsé   ZColors)r*   rj   ÚAéÿÿÿÿZstreamalpha)rg   )	rv   rn   ro   rz   rp   rq   rr   rs   rt   )ÚextraÚSMaskr[   )r?   r@   r
   ÚopenrE   r   rI   rf   rY   ÚroundÚ	thumbnailrF   r4   r5   rH   rG   r>   r   ÚwarningÚpydyfZ
DictionaryrD   ÚArrayZStreamÚ
getchannelr=   Ú_get_png_data)rJ   r_   Z	dpi_ratior?   r@   r‚   rQ   Zcolor_spacer~   rK   ÚalphaÚpng_dataZ
alpha_datar[   r   r   r   Úget_x_object}   s„    
ÿ



ù
ø



þôÿzRasterImage.get_x_objectc                 C   s”   t ƒ }| j|dd� | d¡ g }| d¡}|rŠt d|¡\}| d¡}|dkrb| | |¡¡ n| |tj¡ | dtj¡ | d¡}q,d 	|¡S )Nr7   )r4   rk   é   z!Is   IDATó    )
r   rF   ÚseekÚreadÚstructÚunpackÚappendrE   ÚSEEK_CURÚjoin)rK   rQ   r‰   Zraw_chunk_lengthÚchunk_lengthZ
chunk_typer   r   r   r‡   Ð   s    


zRasterImage._get_png_data)Nra   )r   r!   r"   r   rR   rV   r`   rH   rŠ   Ústaticmethodr‡   r   r   r   r   r%   +   s   ÿ
4
Sr%   c                       s(   e Zd Z‡ fdd„Zedd„ ƒZ‡  ZS )re   c                    s"   t ƒ  ¡  || _|| _|||< d S rS   )ÚsuperrR   Ú_keyr:   )rJ   rN   rh   rf   ©Ú	__class__r   r   rR   î   s    
zLazyImage.__init__c                 C   s   | j | j S rS   )r:   r—   ©rJ   r   r   r   rf   ô   s    zLazyImage.data©r   r!   r"   rR   Úpropertyrf   Ú__classcell__r   r   r˜   r   re   í   s   re   c                       s(   e Zd Z‡ fdd„Zedd„ ƒZ‡  ZS )rd   c                    s   t ƒ  ¡  || _d S rS   )r–   rR   Ú	_filename)rJ   rM   r˜   r   r   rR   ú   s    
zLazyLocalImage.__init__c                 C   s   t | jƒ ¡ S rS   )r   rž   Ú
read_bytesrš   r   r   r   rf   þ   s    zLazyLocalImage.datar›   r   r   r˜   r   rd   ù   s   rd   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚSVGImagec                 C   s"   t ||ƒ| _|| _|| _|| _d S rS   )r   Ú_svgÚ	_base_urlÚ_url_fetcherÚ_context)rJ   ÚtreeÚbase_urlÚurl_fetcherÚcontextr   r   r   rR     s    zSVGImage.__init__c                 C   sŒ   | j  |¡\}}d ||fv rl| j  ¡ }|rf|d rf|d rf|d |d  }|rX|| }qj|rj|| }q‚d }n|r~|r~|| }nd}|||fS )Né   r{   r   )r¡   rV   Zget_viewbox)rJ   Úimage_resolutionrU   r?   r@   ÚviewboxrA   r   r   r   rV   
  s    



zSVGImage.get_intrinsic_sizec              
   C   sf   z | j  |||| j| j| j¡ W n@ ty` } z(t d| j¡ tjd|d� W Y d }~n
d }~0 0 d S )NzFailed to render SVG image %sz Error while rendering SVG image:©Úexc_info)	r¡   r`   r¢   r£   r¤   ÚBaseExceptionr   ÚerrorÚdebug)rJ   r[   r\   r]   r^   r   r   r   r   r`     s    
þzSVGImage.drawN)r   r!   r"   rR   rV   r`   r   r   r   r   r      s   r    ú
from-imagec                 C   s  || v r| | S �zœt ||ƒ�b}t| d¡ƒ}|jdkrDt|jƒ}	nd}	d|v rZ|d }
n|d  ¡ }
|pp|d }W d  ƒ n1 s†0    Y  d}g }|dkrìzt |
¡}t	||||ƒ}W n. t
yê } z| |¡ W Y d}~n
d}~0 0 |du �r¬zt t|
ƒ¡}W nz t
�y‚ } z`|dk�r2t |d ¡‚zt |
¡}t	||||ƒ}W n t
�yl   t |¡‚Y n0 W Y d}~n2d}~0 0 t| ¡ d	d
� ¡ }t|||
|	| ||ƒ}W nJ ttf�yø } z,t d||¡ tjd|d� d}W Y d}~n
d}~0 0 || |< |S )z(Get an Image instance from an image URI.Úredirected_urlÚfileNÚstringÚfile_objÚ	mime_typezimage/svg+xmlr   F)ÚusedforsecurityzFailed to load image at %r: %szError while loading image:r¬   )r   r   rC   Úschemer   ÚpathrŽ   r	   Ú
fromstringr    Ú	Exceptionr‘   r
   r€   r   r   r    r   ÚencodeÚ	hexdigestr%   r   r   r¯   r°   )rN   r§   rP   ÚurlÚforced_mime_typer¨   rO   ÚresultÚ
parsed_urlrM   r´   r¶   ÚimageZsvg_exceptionsr¥   Zsvg_exceptionrK   Zraster_exceptionrL   r   r   r   r   Úget_image_from_uri&  sT    

*
 


&
þrÃ   c                 C   st   | j }|dkr$d| jv rjt | ¡} nF|dkrj|\}}|dkrXttjd|› �ƒ}|  |¡} |rj|  tjj¡} || _ | S )z{Return a copy of a Pillow image with modified orientation.

    If orientation is not changed, return the same image.

    r±   Úexifr&   r   ZROTATE_)	r4   r<   r   Zexif_transposerB   r
   Ú	TransposeÚ	transposeÚFLIP_LEFT_RIGHT)rK   rO   Úimage_formatÚangleÚflipÚrotationr   r   r   r8   a  s    

ÿr8   c           	         sÔ   ‡ fdd„|D ƒ}|d du r&d|d< |d du r:ˆ |d< |d }t |ƒD ]&\}}|durJ||k rl|||< qJ|}qJd}t |ƒD ]P\}}|dur~|| }|| ||  }t|d |ƒD ]}|||  ||< q´|}q~|S )a   Give color stops positions on the gradient vector.

    ``vector_length`` is the distance between the starting point and ending
    point of the vector gradient.

    ``positions`` is a list of ``None``, or ``Dimension`` in px or %. 0 is the
    starting point, 1 the ending point.

    See https://drafts.csswg.org/css-images-3/#color-stop-syntax.

    Return processed color stops, as a list of floats in px.

    c                    s   g | ]}t |ˆ ƒ‘qS r   r   ©Ú.0Úposition©Úvector_lengthr   r   Ú
<listcomp>ˆ  rŒ   z'process_color_stops.<locals>.<listcomp>r   Nr}   r   )Ú	enumerateÚrange)	rÐ   Ú	positionsZprevious_posÚirÎ   Z
previous_iÚbaseÚ	incrementÚjr   rÏ   r   Úprocess_color_stopsy  s(    
rÙ   c                    sP   | d | d  ‰ }|ˆ  ‰ˆdkr2dgt | ƒ } n‡ ‡fdd„| D ƒ} ˆ || fS )zòNormalize stop positions between 0 and 1.

    Return ``(first, last, positions)``.

    first: original position of the first position.
    last: original position of the last position.
    positions: list of positions between 0 and 1.

    r   r}   c                    s   g | ]}|ˆ  ˆ ‘qS r   r   )rÍ   Úpos©ÚfirstÚtotal_lengthr   r   rÑ   µ  rŒ   z,normalize_stop_positions.<locals>.<listcomp>)Úlen)rÔ   Úlastr   rÛ   r   Únormalize_stop_positions¦  s    
rà   c              
   C   sr  t |ƒ}|dksJ ‚|t | ƒks$J ‚|d |d  }|dkrPtt|ƒƒ}|d }dd„ | D ƒ}dd„ | D ƒ}dd„ | D ƒ}dd„ | D ƒ}d } }	 }
}d	| }t|dd
… dƒD ]n\}}|||d   | }|d |fD ]D}||| | 7 }|	|| | 7 }	|
|| | 7 }
||| | 7 }qÚq²|dk�r4tdƒS td|| d › d|	| d › d|
| d › d|› d�	ƒS d
S )zG
    https://drafts.csswg.org/css-images-3/#gradient-average-color
    r   r}   r   c                 S   s   g | ]\}}}}|| ‘qS r   r   ©rÍ   ÚrÚgÚbÚar   r   r   rÑ   Å  rŒ   z*gradient_average_color.<locals>.<listcomp>c                 S   s   g | ]\}}}}|| ‘qS r   r   rá   r   r   r   rÑ   Æ  rŒ   c                 S   s   g | ]\}}}}|| ‘qS r   r   rá   r   r   r   rÑ   Ç  rŒ   c                 S   s   g | ]\}}}}|‘qS r   r   rá   r   r   r   rÑ   È  rŒ   r©   NÚtransparentzrgb(éÿ   ú ú/ú))rÞ   ÚlistrÓ   rÒ   r   )ÚcolorsrÔ   Znb_stopsrÝ   Zpremul_rZpremul_gZpremul_brˆ   Zresult_rZresult_gZresult_bZresult_aZtotal_weightrÕ   rÎ   ÚweightrØ   r   r   r   Úgradient_average_color¹  s:    

ÿÿÿrî   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚGradientc                 C   s:   |sJ ‚t dd„ |D ƒƒ| _t dd„ |D ƒƒ| _|| _d S )Nc                 s   s   | ]\}}|V  qd S rS   r   )rÍ   ÚcolorÚ_r   r   r   Ú	<genexpr>ß  rŒ   z$Gradient.__init__.<locals>.<genexpr>c                 s   s   | ]\}}|V  qd S rS   r   )rÍ   rñ   rÎ   r   r   r   rò   á  rŒ   )Útuplerì   Ústop_positionsÚ	repeating)rJ   Úcolor_stopsrõ   r   r   r   rR   Ü  s    zGradient.__init__c                 C   s   dS )N)NNNr   )rJ   rª   rU   r   r   r   rV   å  s    zGradient.get_intrinsic_sizec                    sT  |   ||¡\}}}}‰|dkrHˆ dd||¡ ˆ ˆd ¡ ˆ ¡  d S dd„ ˆD ƒ‰ ‡ fdd„ttˆ ƒd ƒD ƒ}	‡fdd„ttˆƒd ƒD ƒ}
tˆ ƒD ]X\}}|dkrš|dkrÎ|
|d  d |
|d  d< |tˆƒd k rš|
| d |
| d< qšt|	ƒD ]4\}\}}d||fvrü||fdkrü|| |
| d	< qü|d
k�r@d	nd}|d |d f}| j }tˆƒd d }|dd… }‡fdd„|
D ƒ}ˆ ||||¡}ˆ 	|d||||¡}ˆj
|d� tdd„ ˆ D ƒƒ�rDˆ dd||¡}|d
k�rìd	nd}‡fdd„|	D ƒ}ˆ ||||¡}| 	|d||||¡}|j
|d� d|j› d�g|_ˆ |j¡ d S )NÚsolidr   c                 S   s   g | ]}|d  ‘qS )r{   r   )rÍ   rð   r   r   r   rÑ   ò  rŒ   z!Gradient.draw.<locals>.<listcomp>c                    s    g | ]}ˆ | ˆ |d   f‘qS ©r   r   ©rÍ   rÕ   )Úalphasr   r   rÑ   ó  s   ÿr   c                    s>   g | ]6}ˆ |   d ¡dd… ˆ |d    d ¡dd… dg‘qS )ÚsrgbNr{   r   )Útorù   )rì   r   r   rÑ   ÷  s   ÿ)r   r   r©   Úlinearr{   r}   ©r   r   c                 3   s$   | ]\}}}ˆ   d |||¡V  qdS )rþ   N©Zcreate_interpolation_function)rÍ   Úc0Úc1Ún©r[   r   r   rò     s   ÿz Gradient.draw.<locals>.<genexpr>r.   )Údc                 s   s   | ]}|d kV  qdS )r   Nr   )rÍ   rˆ   r   r   r   rò     rŒ   c                 3   s&   | ]\}}ˆ   d |f|fd¡V  qdS )rþ   r   Nrÿ   )rÍ   r   r  r  r   r   rò     s   ÿZGrayré   z sh)ÚlayoutZ	rectangleZ	set_colorÚfillrÓ   rÞ   rÒ   rõ   Zcreate_stitching_functionZadd_shadingrZ   ÚanyZset_alpha_stater9   r[   Zpaint_shading)rJ   r[   r\   r]   Z_image_renderingÚscale_yÚtype_ÚpointsrÔ   Zalpha_couplesZcolor_couplesrÕ   rˆ   Úa0Úa1Zshading_typeÚdomainÚextendr¼   ÚboundsZsub_functionsÚfunctionÚshadingZalpha_streamZalpha_shadingr   )rú   rì   r[   r   r`   è  sp    ÿ
þ
þ
þÿÿÿ
þÿÿzGradient.drawc                 C   s   t ‚dS )a]  Get layout information about the gradient.

        width, height: Gradient box. Top-left is at coordinates (0, 0).

        Returns (scale_y, type_, points, positions, colors).

        scale_y: vertical scale of the gradient. float, used for ellipses
                 radial gradients. 1 otherwise.
        type_: gradient type.
        points: coordinates of useful points, depending on type_:
            'solid': None.
            'linear': (x0, y0, x1, y1)
                      coordinates of the starting and ending points.
            'radial': (cx0, cy0, radius0, cx1, cy1, radius1)
                      coordinates of the starting end ending circles
        positions: positions of the color stops. list of floats in between 0
                   and 1 (0 at the starting point, 1 at the ending point).
        colors: list of (r, g, b, a).

        N)ÚNotImplementedError)rJ   r?   r@   r   r   r   r  &  s    zGradient.layoutN)r   r!   r"   rR   rV   r`   r  r   r   r   r   rï   Û  s   	>rï   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚLinearGradientc                 C   s   t  | ||¡ |\| _| _d S rS   )rï   rR   Údirection_typeÚ	direction)rJ   rö   r  rõ   r   r   r   rR   ?  s    zLinearGradient.__init__c                    sö  t | jƒdkr$ddd g | jd gfS | jdkr„| j d¡\}}|dkrJdnd}|dkrZdnd}t ||¡}|| | }|| | }	n*| jd	ks’J ‚| j}
t |
¡}t |
¡ }	t	|d
ƒt	|	d
ƒ }}	t
| jƒ}t|| ƒt||	 ƒ }t|| jƒ‰ | j�sbˆ d ˆ d k�r0ˆ  dˆ d d ¡ | d|d ¡ ˆ d ˆ d k�rbˆ  ˆ d d ¡ | |d ¡ tˆ ƒ\}}‰ | j�rœ||k�rœt|ˆ ƒ}ddd g |gfS || }|dk�s²J ‚‡ fdd„tt ˆ ƒd ƒD ƒ}tdg|¢R ƒ}t|ƒ}tdg|d d d… ¢R ƒ}t|d d d… ƒ}||k �rVt|ƒ}| t|ƒ¡ ˆ  ˆ d | ¡ ||| 7 }�q|dk�rœt|ƒ}| dt|ƒ¡ ˆ  dˆ d | ¡ ||| 8 }�qV|||  d }||	|  d }|||  ||	|  |||  ||	|  f}dd|ˆ |fS )Nr   r÷   r   Úcornerrñ   Úleftr}   ÚtoprÉ   é	   éþÿÿÿc                    s    g | ]}ˆ |d   ˆ |  ‘qS rø   r   rù   ©rÔ   r   r   rÑ   w  s   ÿz)LinearGradient.layout.<locals>.<listcomp>r©   rý   )rÞ   rì   r  r  ÚsplitÚmathÚhypotÚsinÚcosr�   rë   rX   rÙ   rô   rõ   Úinsertr‘   rà   rî   rÓ   r   Únext)rJ   r?   r@   ÚyÚxÚfactor_xÚfactor_yZdiagonalÚdxÚdyrÉ   rì   rÐ   rÜ   rß   rð   Zstop_lengthZposition_stepsZ
next_stepsZnext_colorsZprevious_stepsZprevious_colorsÚstepZstart_xZstart_yr
  r   r  r   r  D  sl    





þ

þzLinearGradient.layoutN)r   r!   r"   rR   r  r   r   r   r   r  >  s   r  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚRadialGradientc                 C   s*   t  | ||¡ || _|| _|\| _| _d S rS   )rï   rR   ÚcenterÚshapeÚ	size_typeÚsize)rJ   rö   r,  r.  r+  rõ   r   r   r   rR   š  s    zRadialGradient.__init__c                    sÀ  t | jƒdkr$ddd g | jd gfS | j\}}}}t||ƒ}t||ƒ}|dkrV|| }|dkrf|| }| j|  ||||¡Ž \}}|| }	t| jƒ}
t|| jƒ}| j	�s|d dkrÞ|d |d krÞ| 
dd¡ |
 
d|
d ¡ |d |d k�r| |d d ¡ |
 |
d ¡ |d dk �r>| j	�r`|d |d  }|d|d  |   ‰ ‡ fdd	„|D ƒ}nÞ|d dk�r„ddd g | jd gfS t|ƒD ]°\}}|dk�r¾|
|d … ||d …  }
} �q>|dk�rŒ|
| }|
|d  }||d  }|dk �söJ ‚t||||g|dd|gƒ}|g|
|d …  }
dg||d …  } �q>�qŒt|ƒ\}}}||k�rx| j	�rxt|
|ƒ}ddd g |gfS |||	 ||||	 |f}| j	�r²|  |||	|||
¡\}}}
|	d
|||
fS )Nr   r÷   r   ÚrightÚbottomr  r}   c                    s   g | ]}|ˆ  ‘qS r   r   rÌ   ©Úoffsetr   r   rÑ   Ì  rŒ   z)RadialGradient.layout.<locals>.<listcomp>Zradial)rÞ   rì   r+  r   Ú_handle_degenerateÚ_resolve_sizerë   rÙ   rô   rõ   r!  r‘   rÒ   rî   rà   Ú_repeat)rJ   r?   r@   Úorigin_xÚcenter_xÚorigin_yÚcenter_yÚsize_xÚsize_yr  rì   rÔ   rÐ   rÕ   rÎ   rð   Zprevious_colorZprevious_positionZintermediate_colorrÜ   rß   r
  r   r1  r   r  §  sr    

ÿ




þ



þÿ
zRadialGradient.layoutc              	      sø  |  ¡ }ˆ  ¡ ‰|d |d  }tt ||d  || |d  ¡t ||d  |d  | ¡t |d  || |d  ¡t |d  |d  | ¡ƒ}	t |	|d  | ¡}
|
dkrød|
 }||9 }‡fdd„t|ƒD ƒ‰|d d… |d ||
  f }|d dk�r|ˆ|fS |d | }|d d… d |dd …  }t|ƒ‰ ˆ �rn||ˆ  7 }‡ ‡fd	d„tˆ ƒD ƒˆ ‰|ˆ  }|dk�rŠ|ˆ|fS ˆd ˆd
 fdk�s¤J ‚d|  k �r¼dk �sÂn J ‚ˆd d d
… }d| }t|dd�D �]\}}||k�r<|| d … | }‡ fdd„ˆ| d … D ƒ}|ˆ ‰|ˆ|f  S ||k �rä||  }||d   }ˆ|d   }||||g}||||g}t||ƒ}|g||d  d …  | }‡ fdd„ˆ|d  d … D ƒ}|d ˆ  g|¢ˆ¢R ‰|ˆ|f  S �qäd S )Né   r©   r   r   c                    s   g | ]}ˆ D ]}|| ‘qqS r   r   ©rÍ   rÕ   rÎ   r  r   r   rÑ     s   z*RadialGradient._repeat.<locals>.<listcomp>)r   r{   c                    s"   g | ]}ˆD ]}|ˆ  | ‘qqS r   r   r=  )Úfull_repeatÚoriginal_positionsr   r   rÑ     s   ÿr}   rþ   )Ústartc                    s   g | ]}|ˆ  d  ‘qS rø   r   rÌ   ©r>  r   r   rÑ   1  s   ÿc                    s   g | ]}|d  ˆ  ‘qS rø   r   rÌ   rA  r   r   rÑ   B  s   )	ÚcopyrY   r  r  ÚceilrÓ   ÚintrÒ   rî   )rJ   r?   r@   r  r
  rÔ   rì   Zoriginal_colorsZgradient_lengthZmax_distanceZrepeat_afterÚrepeatZrepeat_beforeZpartial_repeatÚreverserA   rÕ   rÎ   Únew_positionsrð   Z
next_colorZnext_positionZaverage_colorsZaverage_positionsZ
zero_colorr   )r>  r?  rÔ   r   r5  ö  sv    ü
ÿ
ÿþ



þ

ÿ
þzRadialGradient._repeatc                 C   s2  | j dkr0| j\}}t||ƒ}t||ƒ}||fS t|ƒ}t|| ƒ}t|ƒ}	t|| ƒ}
| j d¡rhtnt}| j d¡r¬| jdkr˜||||	|
ƒ}||fS |||ƒ||	|
ƒfS | jdkrì|t	 
||	¡t	 
||
¡t	 
||	¡t	 
||
¡ƒ}||fS |||	f||
f||	f||
fdd„ d�\}}|t	 d¡ |t	 d¡ fS )	z+Resolve circle size of the radial gradient.ÚexplicitÚclosestÚsideÚcirclec                 S   s
   t j| Ž S rS   )r  r  )rå   r   r   r   Ú<lambda>b  rŒ   z.RadialGradient._resolve_size.<locals>.<lambda>)rh   r©   )r-  r.  r   rX   Ú
startswithÚminrY   Úendswithr,  r  r  Úsqrt)rJ   r?   r@   r7  r9  r:  r;  r  r/  r  r0  ZpickZsize_xyZcorner_xZcorner_yr   r   r   r4  H  s2    





ÿþ
zRadialGradient._resolve_sizec                 C   sL   ||  krdkr"n n
d }}n"|dkr4d}d}n|dkrDd}d}||fS )ztHandle degenerate radial gradients.

        See https://drafts.csswg.org/css-images-3/#degenerate-radials

        r   gH¯¼šò×z>g    ÐcAr   )rJ   r:  r;  r   r   r   r3  e  s    
z!RadialGradient._handle_degenerateN)r   r!   r"   rR   r  r5  r4  r3  r   r   r   r   r*  ™  s
   ORr*  )NNr±   )4r#   rE   r  r�   Úhashlibr   r   Ú	itertoolsr   r   Úpathlibr   Úurllib.parser   Úurllib.requestr   Ú	xml.etreer	   r„   ÚPILr
   r   r   Útinycss2.color4r   rc   r   Zlayout.percentr   Úloggerr   Úsvgr   Úurlsr   r   ZLOAD_TRUNCATED_IMAGESÚ
ValueErrorr   r%   ZObjectre   rd   r    rÃ   r8   rÙ   rà   rî   rï   r  r*  r   r   r   r   Ú<module>   sH    C
#  ÿ
;-"c[