a
    Qh                     @   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rt }d|
d}| jd ur<| j|d< |j|fi | | }d }nFd| _|d u s~|
s~|jdkrt }|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rd}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 }}ntt| jj}tdt	| j | }tdt	| j| }|
||f t }|j||j| jd |j |j }}| | | _| jdv rd}n2| jdv rd}n"| jdkrd}ntd	| j d}td
d|||d|rd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|rd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   AZ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}|rt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|| }qd }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 zt ||b}t|d}|jdkrDt|j}	nd}	d|v rZ|d }
n|d  }
|pp|d }W d   n1 s0    Y  d}g }|dkrzt|
}t	||||}W n. t
y } z|| W Y d}~n
d}~0 0 |du rz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 )zNormalize 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 }qq|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< qt|	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rd	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sJ | 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rt| }ddd g |gfS || }|dksJ  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rt|}|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rddd g | jd gfS t|D ]\}}|dkr|
|d  ||d   }
} q>|dkr|
| }|
|d  }||d  }|dk sJ t||||g|dd|g}|g|
|d   }
dg||d   } q>qt|\}}}||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rd|
 }||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sJ d|  k rdk sn 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 qd 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   gHz>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[