o
    ½ÙøiŽ  ã                   @   sv  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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%„ Z+G d&d'„ d'ƒZ,G d(d)„ d)e,ƒZ-G d*d+„ d+e,ƒZ.dS )-z+Fetch and decode images in various formats.é    N)Úmd5)ÚBytesIO)Úcycle)ÚPath)ÚElementTree)ÚImageÚ	ImageFileÚImageOps)Úparse_coloré   )ÚDEFAULT_OPTIONS©Ú
percentage)ÚLOGGER)ÚSVG)ÚURLFetchingErrorÚfetchTc                   @   s   e Zd ZdZdS )ÚImageLoadingErrorzpAn error occured when loading an image.

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

    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú^/home/develop/edictos_py/central_edictos/env/lib/python3.10/site-packages/weasyprint/images.pyr      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 ri n|| _|d  | _}	|d | _d|jv r6| d¡}n
|jdv r@| d¡}|j| _|j	| _	|j
| _
| j
dkrW| j	| j
 ntj| _|d  | _}
t|d	i ƒ d
¡}| jdkos|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 }n d| _|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ÚappÚAPP14ÚCMYK)ÚJPEGÚMPOr(   ©ÚformatÚoptimizeÚqualityÚPNG)Úrotate_pillow_imager+   ÚidÚ_cacheÚ_jpeg_qualityÚ_dpiÚinfoÚconvertÚmodeÚwidthÚheightÚmathÚinfÚratior,   ÚgetattrÚgetÚinvert_colorsÚior   ÚsaveÚgetvalueÚcache_image_dataÚ
image_data)ÚselfÚpillow_imageÚimage_idrC   ÚfilenameÚcacheÚorientationÚoptionsÚoriginal_pillow_imager   r,   Úapp14Ú
image_filer   r   r   Ú__init__#   sL   








€zRasterImage.__init__c                 C   s   | j | | j| | jfS ©N)r7   r8   r;   )rD   Ú
resolutionÚ	font_sizer   r   r   Úget_intrinsic_sizeW   s   zRasterImage.get_intrinsic_sizec                 C   sÆ   | j dks
| jdkrd S |d }|dk}d}| jrJd}t||jd d  | ƒ}	t||jd d  | ƒ}
t| j |	 | j|
 ƒ}|| jkrJ| j| }| | ||¡}| |dd| d|¡ | |¡ d S )Nr   Úimage_renderingÚautor   gÇqÇqŒ?)	r7   r8   r3   ÚabsÚctmÚmaxÚ	add_imageÚ	transformÚdraw_x_object)rD   ÚstreamÚconcrete_widthÚconcrete_heightÚstylerS   Úinterpolater;   Úpt_to_inÚwidth_inchesÚheight_inchesr   Ú
image_namer   r   r   ÚdrawZ   s"   

ÿzRasterImage.drawÚsourcec                 C   s6   |rt |ƒS | j› d|› d| jpd› �}t| j||ƒS )Nú-Ú )ÚLazyLocalImager0   r3   Ú	LazyImager1   )rD   ÚdatarG   ÚslotÚkeyr   r   r   rB   n   s   zRasterImage.cache_image_datac                 C   s8  |dkr| j | j}}nBt t | jj¡¡}tdt	| j | ƒƒ}tdt	| j| ƒƒ}| 
||f¡ t ¡ }|j||j| jd� |j |j}}|  | ¡ ¡| _| jdv rVd}n| jdv r^d}n| jdkrfd}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 r´d|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   r*   )r#   r   z
/DeviceRGB)ÚLÚLAz/DeviceGrayr'   z/DeviceCMYKzUnknown image mode: %sz/XObjectz/Imageé   ÚtrueÚfalse)ÚTypeÚSubtypeÚWidthÚHeightÚ
ColorSpaceÚBitsPerComponentÚInterpolater(   )r   r   r   r   r   r   r   r   ÚDecodez
/DCTDecodeÚFilterz/FlateDecodeé   )Ú	PredictorÚColumnsÚDecodeParmsé   ÚColors)r   rn   ÚAéÿÿÿÿÚstreamalpha)rk   )	rz   rr   rs   r~   rt   ru   rv   rw   rx   )ÚextraÚSMaskr[   )r7   r8   r   Úopenr?   r   rC   rj   rW   ÚroundÚ	thumbnailr@   r+   r,   rB   rA   r6   r   ÚwarningÚpydyfÚ
Dictionaryr>   ÚArrayÚStreamÚ
getchannelr5   Ú_get_png_data)rD   r_   Ú	dpi_ratior7   r8   rˆ   rM   Úcolor_spacer„   rE   ÚalphaÚpng_dataÚ
alpha_datar[   r   r   r   Úget_x_objectu   s„   
ÿ



ù

ø




þ
ôÿzRasterImage.get_x_objectc                 C   s–   t ƒ }| j|dd� | d¡ g }| d¡}|rFt d|¡\}| d¡}|dkr1| | |¡¡ n| |tj¡ | dtj¡ | d¡}|sd 	|¡S )Nr.   )r+   ro   é   z!Is   IDATó    )
r   r@   ÚseekÚreadÚstructÚunpackÚappendr?   ÚSEEK_CURÚjoin)rE   rM   r“   Úraw_chunk_lengthÚchunk_lengthÚ
chunk_typer   r   r   r�   È   s   



ô
zRasterImage._get_png_data)Nre   )r   r   r   r   rN   rR   rd   rB   r•   Ústaticmethodr�   r   r   r   r   r   "   s    
ÿ4
Sr   c                       ó(   e Zd Z‡ fdd„Zedd„ ƒZ‡  ZS )ri   c                    s"   t ƒ  ¡  || _|| _|||< d S rO   )ÚsuperrN   Ú_keyr1   )rD   rH   rl   rj   ©Ú	__class__r   r   rN   æ   s   
zLazyImage.__init__c                 C   s   | j | j S rO   )r1   r¥   ©rD   r   r   r   rj   ì   s   zLazyImage.data©r   r   r   rN   Úpropertyrj   Ú__classcell__r   r   r¦   r   ri   å   s    ri   c                       r£   )rh   c                    s   t ƒ  ¡  || _d S rO   )r¤   rN   Ú	_filename)rD   rG   r¦   r   r   rN   ò   s   

zLazyLocalImage.__init__c                 C   s   t | jƒ ¡ S rO   )r   r¬   Ú
read_bytesr¨   r   r   r   rj   ö   s   zLazyLocalImage.datar©   r   r   r¦   r   rh   ñ   s    rh   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚSVGImagec                 C   s4   |r|j nd }t||||ƒ| _|| _|| _|| _d S rO   )Úfont_configr   Ú_svgÚ	_base_urlÚ_url_fetcherÚ_context)rD   ÚtreeÚbase_urlÚurl_fetcherÚcontextr¯   r   r   r   rN   ü   s
   
zSVGImage.__init__c                 C   sŒ   | j  |¡\}}d ||fv r6| j  ¡ }|r3|d r3|d r3|d |d  }|r,|| }n|r2|| }nd }n|r?|r?|| }nd}|||fS )Né   r   r   )r°   rR   Úget_viewbox)rD   Úimage_resolutionrQ   r7   r8   Úviewboxr;   r   r   r   rR     s   

€

zSVGImage.get_intrinsic_sizec              
   C   sb   z| j  |||| j| j¡ W d S  ty0 } zt d| j¡ tjd|d� W Y d }~d S d }~ww )NzFailed to render SVG image %sz Error while rendering SVG image:©Úexc_info)r°   rd   r±   r³   ÚBaseExceptionr   ÚerrorÚdebug)rD   r[   r\   r]   Ú_styleÚ	exceptionr   r   r   rd     s   

þ€þzSVGImage.drawN)r   r   r   rN   rR   rd   r   r   r   r   r®   û   s    r®   ú
from-imagec                 C   s°  || v r| | S z¥t ||ƒ�}| ¡ }|p|j}	W d  ƒ n1 s"w   Y  d}
g }|	dkrUzt |¡}t||||ƒ}
W n tyT } z| |¡ W Y d}~nd}~ww |
du r¬z	t 	t
|ƒ¡}W n4 ty– } z(|	dkrst|d ‚zt |¡}t||||ƒ}
W n
 ty‹   t|‚w W Y d}~nd}~ww t| ¡ dd� ¡ }t||||j| ||ƒ}
W n$ ttfyÑ } zt d||¡ tjd|d� d}
W Y d}~nd}~ww |
| |< |
S )	z(Get an Image instance from an image URI.Nzimage/svg+xmlr   F)ÚusedforsecurityzFailed to load image at %r: %szError while loading image:r¼   )r   r™   Úcontent_typer   Ú
fromstringr®   Ú	Exceptionrœ   r   r†   r   r   r   ÚencodeÚ	hexdigestr   Úpathr   r   r¿   rÀ   )rH   r¶   rJ   ÚurlÚforced_mime_typer·   rI   ÚresponseÚ
bytestringÚ	mime_typeÚimageÚsvg_exceptionsr´   Úsvg_exceptionrE   Úraster_exceptionrF   rÂ   r   r   r   Úget_image_from_uri  s\   þ
€ÿ

þÿ€ùþ€€ýrÔ   c                 C   st   | j }|dkrd| jv rt | ¡} n#|dkr5|\}}|dkr,ttjd|› �ƒ}|  |¡} |r5|  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   ÚROTATE_)	r+   r4   r	   Úexif_transposer<   r   Ú	TransposeÚ	transposeÚFLIP_LEFT_RIGHT)rE   rI   Úimage_formatÚangleÚflipÚrotationr   r   r   r/   R  s    

€
ÿr/   c                    sü   ‡ ‡fdd„|D ƒ}‡ ‡fdd„|D ƒ}|d du rd|d< |d du r(ˆ|d< |d }t |ƒD ]\}}|durC||k rA|||< q0|}q0d}t |ƒD ](\}}|durr|| }|| ||  }	t|d |ƒD ]
}
||
|	  ||
< qe|}qJdd„ |D ƒ}||fS )	aª  Give color stops positions and hints 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©r^   Úvector_lengthr   r   Ú
<listcomp>y  ó    z'process_color_stops.<locals>.<listcomp>c                    s   g | ]
}t |ˆ ˆƒˆ ‘qS r   r   ©rà   Úhintrâ   r   r   rä   z  ó    r   Nr‚   r   c                 S   s6   g | ]}|d kr
d n|dkrdnt dt d|¡ƒ‘qS )r   r   l        g      à?)Úminr9   Úlogræ   r   r   r   rä   –  s    þý)Ú	enumerateÚrange)rã   Ú	positionsÚhintsr^   Úprevious_posÚirá   Ú
previous_iÚbaseÚ	incrementÚjr   râ   r   Úprocess_color_stopsj  s4   
€€ýrõ   c                    sP   | d | d ‰ }|ˆ  ‰ˆdkrd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   sl  t |ƒ}|dks
J ‚|t | ƒksJ ‚|d |d  }|dkr(tt|ƒƒ}|d }dd„ | D ƒ}dd„ | D ƒ}dd„ | D ƒ}dd„ | D ƒ}d } }	 }
}d	| }t|dd
… dƒD ]7\}}|||d   | }|d |fD ]"}||| | 7 }|	|| | 7 }	|
|| | 7 }
||| | 7 }qmqY|dkr™tdƒS td|| d › d|	| d › d|
| d › d|› 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í   Únb_stopsrù   Úpremul_rÚpremul_gÚpremul_br’   Úresult_rÚresult_gÚresult_bÚresult_aÚ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 rO   r   )rà   ÚcolorÚ_r   r   r   Ú	<genexpr>×  ó   € z$Gradient.__init__.<locals>.<genexpr>c                 s   s   � | ]\}}|V  qd S rO   r   )rà   r  rá   r   r   r   r  Ù  r  )Útupler  Ústop_positionsÚcolor_hintsÚ	repeating)rD   Úcolor_stopsr  r  r   r   r   rN   Ô  s
   
zGradient.__init__c                 C   s   dS )N)NNNr   )rD   rº   rQ   r   r   r   rR   ß  s   zGradient.get_intrinsic_sizec                    sZ  |   |||¡\}}}}‰‰|dkr&ˆ dd||¡ ˆ ˆd ¡ ˆ ¡  d S dd„ ˆD ƒ‰ ‡ ‡fdd„ttˆ ƒd ƒD ƒ}	‡‡fdd„ttˆƒd ƒD ƒ}
tˆ ƒD ],\}}|dkr}|dkrk|
|d  d |
|d  d< |tˆƒd k r}|
| d |
| d< qQt|	ƒD ]\}\}}}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 ƒƒ�r%ˆ 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ä   ì  ó    z!Gradient.draw.<locals>.<listcomp>c                    s&   g | ]}ˆ | ˆ |d   ˆ| g‘qS ©r   r   ©rà   rð   )Úalphasr  r   r   rä   í  s    ÿÿr   c                    sB   g | ]}ˆ|   d ¡dd… ˆ|d    d ¡dd… ˆ | g‘qS )ÚsrgbNr   r   )Útor!  )r  r  r   r   rä   ñ  s    4ÿÿ)r   r   r¸   Úlinearr   r‚   ©r   r   c                 3   s&   � | ]\}}}ˆ   d |||¡V  qdS ©r&  N©Úcreate_interpolation_function©rà   Úc0Úc1rç   ©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|¡V  qdS r'  r(  r*  r-  r   r   r    s
   € ÿ
ÿÚGrayr  z sh)ÚlayoutÚ	rectangleÚ	set_colorÚfillrì   rú   rë   r  Úcreate_stitching_functionÚadd_shadingrY   ÚanyÚset_alpha_stater0   r[   Úpaint_shading)rD   r[   r\   r]   r^   Úscale_yÚtype_Úpointsrí   Úalpha_couplesÚcolor_couplesrð   r’   Úa0Úa1rç   Úshading_typeÚdomainÚextendrÈ   ÚboundsÚsub_functionsÚfunctionÚshadingÚalpha_streamÚalpha_shadingr   )r"  r  r  r[   r   rd   â  st   ÿþþ€€
þÿÿÿ
þÿÿzGradient.drawc                 C   s   t ‚)a€  Get layout information about the gradient.

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

        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).

        )ÚNotImplementedError)rD   r7   r8   r^   r   r   r   r0     s   zGradient.layoutN)r   r   r   rN   rR   rd   r0  r   r   r   r   r  Ó  s
    >r  c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚLinearGradientc                    s    t ƒ  |||¡ |\| _| _d S rO   )r¤   rN   Údirection_typeÚ	direction)rD   r  rL  r  r  r¦   r   r   rN   :  s   zLinearGradient.__init__c                    sV  t | jƒdkrddd g | jd gg fS | jdkrC| j d¡\}}|dkr&dnd}|dkr.dnd}t ||¡}|| | }	|| | }
n| jd	ksJJ ‚| j}t |¡}	t |¡ }
t	|	d
ƒt	|
d
ƒ}	}
t
| jƒ}t||	 ƒt||
 ƒ }t|| j| j|ƒ\‰ }| js¿ˆ d ˆ d kr¢ˆ  dˆ d d ¡ | d|d ¡ | dd¡ ˆ d ˆ d kr¿ˆ  ˆ d d ¡ | |d ¡ | d¡ tˆ ƒ\}}‰ | j�r}||krÜt|ˆ ƒ}ddd g |gg fS || }|dksæJ ‚‡ fdd„tt ˆ ƒd ƒD ƒ}tdg|¢R ƒ}t|ƒ}t|ƒ}tdg|d d d… ¢R ƒ}t|d d d… ƒ}t|d d d… ƒ}||k �rOt|ƒ}| t|ƒ¡ | t|ƒ¡ ˆ  ˆ d | ¡ ||| 7 }||k �s)|dk�r}t|ƒ}| dt|ƒ¡ | dt|ƒ¡ ˆ  dˆ d | ¡ ||| 8 }|dk�sT||	|  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ä   u  s    ÿÿz)LinearGradient.layout.<locals>.<listcomp>r¸   r%  )rú   r  rK  rL  Úsplitr9   ÚhypotÚsinÚcosr‡   r  rU   rõ   r  r  r  Úinsertrœ   rü   r  rì   r   Únext)rD   r7   r8   r^   ÚyÚxÚfactor_xÚfactor_yÚdiagonalÚdxÚdyrÜ   r  rã   rî   rø   rû   r  Ústop_lengthÚposition_stepsÚ
next_stepsÚnext_colorsÚ
next_hintsÚprevious_stepsÚprevious_colorsÚprevious_hintsÚstepÚstart_xÚstart_yr;  r   rR  r   r0  ?  s€   


ÿ


þ

û

ûþzLinearGradient.layout)r   r   r   rN   r0  r«   r   r   r¦   r   rJ  9  s    rJ  c                       s<   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Z‡  ZS )ÚRadialGradientc                    s,   t ƒ  |||¡ || _|| _|\| _| _d S rO   )r¤   rN   ÚcenterÚshapeÚ	size_typeÚsize)rD   r  rm  ro  rl  r  r  r¦   r   r   rN   œ  s   zRadialGradient.__init__c              	      sâ  t | jƒdkrddd g | jd gg fS | j\}}}}t|||ƒ}t|||ƒ}|dkr.|| }|dkr6|| }| j|  |||||¡Ž \}}	|	| }
t| jƒ}t|| j| j	|ƒ\}}| j
sš|d dkr}|d |d kr}| dd¡ | d|d ¡ | dd¡ |d |d krš| |d d ¡ | |d ¡ | d¡ |d dk �r,| j
rÁ|d |d  }|d|d  |   ‰ ‡ fdd	„|D ƒ}nk|d dkrÓddd g | jd gg fS t|ƒD ]T\}}|dkrî||d … ||d … }} n>|dk�r+|| }||d  }||d  }|dk �s
J ‚t||||g|dd|gƒ}|g||d … ¢}dg||d … ¢} nq×t|ƒ\}}}||k�rJ| j
�rJt||ƒ}ddd g |gg fS |||
 ||||
 |f}| j
�ri|  |||
||||¡\}}}}|
d
||||fS )Nr   r  r   ÚrightÚbottomrQ  r‚   c                    s   g | ]}|ˆ  ‘qS r   r   rß   ©Úoffsetr   r   rä   Ñ  r  z)RadialGradient.layout.<locals>.<listcomp>Úradial)rú   r  rl  r   Ú_handle_degenerateÚ_resolve_sizer  rõ   r  r  r  rW  rœ   rë   r  rü   Ú_repeat)rD   r7   r8   r^   Úorigin_xÚcenter_xÚorigin_yÚcenter_yÚsize_xÚsize_yr9  r  rí   rî   rã   rð   rá   r  Úprevious_colorÚprevious_positionÚintermediate_colorrø   rû   r;  r   rr  r   r0  ©  s|   ÿ
ÿ



þõ


þÿzRadialGradient.layoutc              	      sj  |  ¡ }|  ¡ }	ˆ  ¡ ‰|d |d  }
tt ||d  || |d  ¡t ||d  |d  | ¡t |d  || |d  ¡t |d  |d  | ¡ƒ}t ||d  |
 ¡}|dkrŽd| }||9 }g |¢d‘| d d… }‡fdd„t|ƒD ƒ‰g |d d… ¢|d |
|  ‘R }|d dkrš|ˆ||fS |d |
 }g |d d… ¢d‘|dd … ¢R }t|ƒ‰ ˆ rÔ||ˆ  7 }|dg|	¢ˆ  7 }‡ ‡fd	d„tˆ ƒD ƒˆ ‰|ˆ  }|dkrâ|ˆ||fS ˆd ˆd fd
ksîJ ‚d|  k rùdk süJ ‚ J ‚ˆd d d… }d| }t|dd�D ]¥\}}||k�rF|| d … | }g |	| d … ¢d‘|¢}‡ fdd„ˆ| d … D ƒ}|ˆ ‰|ˆ||f  S ||k �r±||  }||d   }ˆ|d   }||||g}||||g}t||ƒ}|g||d  d … ¢|¢}dg|	|d  d … ¢d‘|¢}‡ fdd„ˆ|d  d … D ƒ}|d ˆ  g|¢ˆ¢R ‰|ˆ||f  S �qd S )Né   r¸   r   r   r‚   c                    s   g | ]}ˆ D ]}|| ‘qqS r   r   ©rà   rð   rá   rR  r   r   rä     s
    ÿÿz*RadialGradient._repeat.<locals>.<listcomp>r   c                    s"   g | ]}ˆD ]}|ˆ  | ‘qqS r   r   r‚  )Úfull_repeatÚoriginal_positionsr   r   rä   #  s    þ
ÿÿr&  )Ústartc                    s   g | ]}|ˆ  d  ‘qS r   r   rß   ©rƒ  r   r   rä   :  s    
ÿÿc                    s   g | ]}|d  ˆ  ‘qS r   r   rß   r†  r   r   rä   K  s    ÿ)	ÚcopyrW   r9   rT  Úceilrì   Úintrë   r  )rD   r7   r8   r9  r;  rí   r  rî   Úoriginal_colorsÚoriginal_hintsÚgradient_lengthÚmax_distanceÚrepeat_afterÚrepeatÚrepeat_beforeÚpartial_repeatÚreverser;   rð   rá   Únew_positionsr  Ú
next_colorÚnext_positionÚaverage_colorsÚaverage_positionsÚ
zero_colorr   )rƒ  r„  rí   r   rw  û  s€   ü
ÿ""ÿþ

þ


 
þðõzRadialGradient._repeatc                 C   s6  | j dkr| j\}}t|||ƒ}t|||ƒ}||fS t|ƒ}t|| ƒ}	t|ƒ}
t|| ƒ}| j d¡r6tnt}| j d¡rX| jdkrN|||	|
|ƒ}||fS |||	ƒ||
|ƒfS | jdkrx|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 rO   )r9   rT  )r  r   r   r   Ú<lambda>k  s   
 z.RadialGradient._resolve_size.<locals>.<lambda>)rl   r¸   )rn  ro  r   rU   Ú
startswithré   rW   Úendswithrm  r9   rT  Úsqrt)rD   r7   r8   ry  r{  r^   r|  r}  rN  rp  rO  rq  ÚpickÚsize_xyÚcorner_xÚcorner_yr   r   r   rv  Q  s2   



ÿ
þzRadialGradient._resolve_sizec                 C   sX   ||  kr
dkrn nd }}||fS |dkr d}d}||fS |dkr(d}d}||fS )ztHandle degenerate radial gradients.

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

        r   gH¯¼šò×z>g    ÐcAr   )rD   r|  r}  r   r   r   ru  n  s   úýz!RadialGradient._handle_degenerate)	r   r   r   rN   r0  rw  rv  ru  r«   r   r   r¦   r   rk  ›  s    RVrk  )NNrÃ   )/r   r?   r9   rš   Úhashlibr   r   Ú	itertoolsr   Úpathlibr   Ú	xml.etreer   rŠ   ÚPILr   r   r	   Útinycss2.color5r
   rg   r   Úlayout.percentr   Úloggerr   Úsvgr   Úurlsr   r   ÚLOAD_TRUNCATED_IMAGESÚ
ValueErrorr   r   ÚObjectri   rh   r®   rÔ   r/   rõ   rü   r  r  rJ  rk  r   r   r   r   Ú<module>   sD     D
$
ÿ34"fb