a
    [Xh                     @   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   V/var/www/viveiro_mudafortebrasil/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dpiZtransparencyRGBA)1PIRGBr   Zoptimize_imagesZappZAPP14CMYK)JPEGZMPOr/   formatoptimizeZqualityPNG)rotate_pillow_imager1   id_cacheZ_jpeg_quality_dpiinfoconvertmodewidthheightr   ratior2   getattrgetinvert_colorsior   savegetvaluecache_image_data
image_data)selfpillow_imageimage_idrE   filenamecacheorientationoptionsZoriginal_pillow_imager'   r2   Zapp14
image_filer   r   r   __init__,   sJ    






zRasterImage.__init__c                 C   s   | j | | j| | jfS N)r;   r<   r=   )rF   
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<   r7   absZctmmaxZ	add_image	transformZdraw_x_object)rF   streamconcrete_widthconcrete_heightimage_renderinginterpolater=   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- )LazyLocalImager5   r7   	LazyImager6   )rF   datarI   slotkeyr   r   r   rD   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   r0   )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   ZDecodez
/DCTDecodeFilterz/FlateDecode   )Z	PredictorZColumnsDecodeParms   ZColors)r)   rf   AZstreamalpha)rc   )	rq   rj   rk   rs   rl   rm   rn   ro   rp   )extraZSMaskrW   )r;   r<   r
   openrA   r   rE   rb   rU   round	thumbnailrB   r1   r2   rD   rC   r:   r   warningpydyfZ
Dictionaryr@   ArrayZStreamZ
getchannelr9   _get_png_data)rF   r[   Z	dpi_ratior;   r<   rz   rM   Zcolor_spacerw   rG   alphapng_dataZ
alpha_datarW   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 )Nr3   )r1   rg      z!Is   IDAT    )
r   rB   seekreadstructunpackappendrA   SEEK_CURjoin)rG   rM   r   Zraw_chunk_lengthZchunk_lengthZ
chunk_typer   r   r   r~      s    


zRasterImage._get_png_data)Nr]   )r   r!   r"   r   rN   rR   r\   rD   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 )ra   c                    s"   t    || _|| _|||< d S rO   )superrN   _keyr6   )rF   rJ   rd   rb   	__class__r   r   rN      s    
zLazyImage.__init__c                 C   s   | j | j S rO   )r6   r   rF   r   r   r   rb      s    zLazyImage.datar   r!   r"   rN   propertyrb   __classcell__r   r   r   r   ra      s   ra   c                       s(   e Zd Z fddZedd Z  ZS )r`   c                    s   t    || _d S rO   )r   rN   	_filename)rF   rI   r   r   r   rN      s    
zLazyLocalImage.__init__c                 C   s   t | j S rO   )r   r   
read_bytesr   r   r   r   rb      s    zLazyLocalImage.datar   r   r   r   r   r`      s   r`   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SVGImagec                 C   s"   t ||| _|| _|| _|| _d S rO   )r   _svg	_base_url_url_fetcher_context)rF   treebase_urlurl_fetchercontextr   r   r   rN     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   rt   r   )r   rR   Zget_viewbox)rF   image_resolutionrQ   r;   r<   viewboxr=   r   r   r   rR   
  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)rF   rW   rX   rY   rZ   r   r   r   r   r\     s    
zSVGImage.drawN)r   r!   r"   rN   rR   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.Zredirected_urlfileNstringZfile_obj	mime_typezimage/svg+xmlr   F)usedforsecurityzFailed to load image at %r: %szError while loading image:r   )r   r   r?   schemer   pathr   r	   
fromstringr   	Exceptionr   r
   rx   r   r   r    r   encode	hexdigestr%   r   r   r   r   )rJ   r   rL   urlZforced_mime_typer   rK   result
parsed_urlrI   r   r   imageZsvg_exceptionsr   Zsvg_exceptionrG   Zraster_exceptionrH   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   Zexifr&   r   ZROTATE_)	r1   r8   r   Zexif_transposer>   r
   Z	TransposeZ	transposeZFLIP_LEFT_RIGHT)rG   rK   Zimage_formatangleZflipZrotationr   r   r   r4   a  s    

r4   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   Nrv   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   rv   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   rv   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   NZ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   Z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>  r   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	repeating)rF   color_stopsr   r   r   r   rN     s    zGradient.__init__c                 C   s   dS )N)NNNr   )rF   r   rQ   r   r   r   rR     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 )rt   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 )ZsrgbNrt   r   )tor   )r   r   r   r     s   )r   r   r   linearrt   rv   r   r   c                 3   s$   | ]\}}}  d |||V  qdS )r   NZcreate_interpolation_function)r   c0c1nrW   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_shadingrV   anyZset_alpha_stater5   rW   Zpaint_shading)rF   rW   rX   rY   Z_image_renderingscale_ytype_pointsr   Zalpha_couplesZcolor_couplesr   r   Za0Za1Zshading_typedomainextendr   ZboundsZsub_functionsfunctionZshadingZalpha_streamZalpha_shadingr   )r   r   rW   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)rF   r;   r<   r   r   r   r   &  s    zGradient.layoutN)r   r!   r"   rN   rR   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 rO   )r   rN   direction_type	direction)rF   r   r   r   r   r   r   rN   ?  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   Zcornerr   leftrv   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cosry   r   rT   r   r   r   insertr   r   r   r   r   next)rF   r;   r<   yxZfactor_xZfactor_yZdiagonalZdxZ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"   rN   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 rO   )r   rN   centershape	size_typesize)rF   r   r  r  r  r   r   r   r   rN     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   rv   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)rF   r;   r<   Zorigin_xcenter_xZorigin_ycenter_ysize_xsize_yr   r   r   r   r   r   r   Zprevious_colorZprevious_positionZintermediate_colorr   r   r   r   r  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   rt   c                    s"   g | ]}D ]}|  | qqS r   r   r  )full_repeatoriginal_positionsr   r   r     s   rv   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   r  r   r   r   B  s   )	copyrU   r  r  ceilr   intr   r   )rF   r;   r<   r   r   r   r   Zoriginal_colorsZgradient_lengthZmax_distanceZrepeat_afterrepeatZrepeat_beforeZpartial_repeatreverser=   r   r   Znew_positionsr   Z
next_colorZnext_positionZaverage_colorsZaverage_positionsZ
zero_colorr   )r  r  r   r   r    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.explicitZclosestZsideZcirclec                 S   s
   t j|  S rO   )r  r  )r   r   r   r   <lambda>b  r   z.RadialGradient._resolve_size.<locals>.<lambda>)rd   r   )r  r  r   rT   
startswithminrU   endswithr  r  r  sqrt)rF   r;   r<   r  r  r  r  r   r  r   r  ZpickZsize_xyZcorner_xZcorner_yr   r   r   r  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   )rF   r  r  r   r   r   r  e  s    
z!RadialGradient._handle_degenerateN)r   r!   r"   rN   r   r  r  r  r   r   r   r   r
    s
   ORr
  )NNr   )4r#   rA   r  r   hashlibr   r   	itertoolsr   r   pathlibr   urllib.parser   urllib.requestr   Z	xml.etreer	   r|   ZPILr
   r   r   Ztinycss2.color4r   r_   r   Zlayout.percentr   loggerr   svgr   urlsr   r   ZLOAD_TRUNCATED_IMAGES
ValueErrorr   r%   ZObjectra   r`   r   r   r4   r   r   r   r   r   r
  r   r   r   r   <module>   sH    C
#  
;-"c[