a
    !f[                     @   s   d dl Z d dlZd dlZd dlZddlmZ ddlmZ dZdZ	dZ
dd	d
dddZdd Zdd ZG dd dejZG dd deZG dd dZd&ddZd'ddZdd ZG dd dZG d d! d!ZG d"d# d#eZG d$d% d%eZdS )(    N   )Image)is_pathi   i   Fzimage buffer overrun errorzdecoding errorzunknown errorzbad configurationzout of memory error)ic                 C   sP   zt j| }W n ty,   t| }Y n0 |s<d|  }|d7 }t|d S )Nzdecoder error z when reading image file)r   coreZgetcodecstatusAttributeErrorERRORSgetOSError)errormsg r   N/var/www/html/python-backend/venv/lib/python3.9/site-packages/PIL/ImageFile.pyraise_oserror@   s    
r   c                 C   s   | d S )N   r   )tr   r   r   	_tilesortK   s    r   c                       s^   e Zd ZdZd fdd	Zdd Z fddZd	d
 Zdd Zdd Z	dd Z
dd Z  ZS )	ImageFilez*Base class for image file format handlers.Nc                    s  t    d| _d | _d | _d| _d| _t| _t	|rPt
|d| _|| _d| _n|| _|| _d | _zzz|   W n: tttttjfy } zt||W Y d }~n
d }~0 0 | jr| jd dks| jd dkrd}t|W n& ty   | jr| j   Y n0 d S )Nr   r   r   rbTznot identified by this driver)super__init__
_min_framecustom_mimetypetilereadonlydecoderconfigMAXBLOCKdecodermaxblockr   openfpfilename_exclusive_fp_open
IndexError	TypeErrorKeyErrorEOFErrorstructr   SyntaxErrormodesizeBaseExceptionclose)selfr"   r#   vr   	__class__r   r   r   X   s@    
 "
zImageFile.__init__c                 C   s,   | j r| j S | jd ur(tj| j S d S N)r   formatr   MIMEr   upperr0   r   r   r   get_format_mimetype   s    
zImageFile.get_format_mimetypec                    s   g | _ t | d S r4   )r   r   __setstate__)r0   stater2   r   r   r:      s    zImageFile.__setstate__c                 C   s   | j r| j  d| _dS )zCheck file integrityN)r$   r"   r/   r8   r   r   r   verify   s    
zImageFile.verifyc                 C   s  | j du rd}t|tj| }| j s,|S d| _| joDt| j dk}|oTttd }d}z| j	}d}W n t
y   | jj}Y n0 z| j}d}W n t
y   | jj}Y n0 |r| j d \}}}	}
|dkrt|
dkr|
d | jkr|
d tjv rzddl}t| j(}|j| d|jd	| _W d   n1 sB0    Y  |	| jd |
d   | j krrttj| j| j||	|
| _d}| jrd| j_W n  t
ttfy   d| _Y n0 |   d
}| jsj| j jtd z
| j}W n t
y   d}Y n0 dd t !| j dd D | _ | j D ]8\}}}	}
||	 t"| j||
| j#}z |$| j| |j%r|&| j |'dd }n|}z|| j(}W nP t)t*j+fy } z0t,rW Y d}~qPnd}t||W Y d}~n
d}~0 0 |st,rqPndt| d}t||| }|'|\}}|dk r@qP||d }qW |-  n
|-  0 q.g | _ || _.| /  | j0r| j1r| j2  d| _| jst,s|dk rt3| tj| S )z"Load image data based on tile listNzcannot load this imager   pypy_version_infor   Fraw   )accessr   key    c                 S   s   g | ]\}}t |d  qS )r   )list).0_Ztilesr   r   r   
<listcomp>   s   z"ImageFile.load.<locals>.<listcomp>c                 S   s   | d | d | d fS )Nr   r   r?   r   )r   r   r   r   <lambda>   rC   z ImageFile.load.<locals>.<lambda>zimage file is truncatedzimage file is truncated (z bytes not processed))4r   r   r   loadmapr#   lenhasattrsys	load_readr
   r"   read	load_seekseekr,   Z	_MAPMODESmmapr!   filenoACCESS_READr-   r	   Z
map_bufferimpaletteZdirtyImportErrorload_preparesortr   Ztile_prefix	itertoolsgroupby_getdecoderr   setimagepulls_fdsetfddecoder    r&   r*   r   LOAD_TRUNCATED_IMAGEScleanupr   load_endr$   Z!_close_exclusive_fp_after_loadingr/   r   )r0   r   ZpixelZuse_mmapr   rO   rQ   Zdecoder_nameextentsoffsetargsrR   r"   Zerr_codeprefixdecoderbsenr   r   r   rI      s    

8"


 

zImageFile.loadc                 C   sP   | j r"| j j| jks"| j j| jkr6tj| j| j| _ | jdkrLtj|  d S )NP)rU   r,   r-   r   r	   newrI   r8   r   r   r   rX   $  s    "
zImageFile.load_preparec                 C   s   d S r4   r   r8   r   r   r   rc   ,  s    zImageFile.load_endc                 C   sF   || j k s.t| dr| jd u s:|| j| j  kr:d}t||  |kS )N	_n_framesz attempt to seek outside sequence)r   rL   ro   Zn_framesr)   tell)r0   framer   r   r   r   _seek_check8  s    	zImageFile._seek_check)NN)__name__
__module____qualname____doc__r   r9   r:   r<   rI   rX   rc   rr   __classcell__r   r   r2   r   r   U   s   0	 
r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StubImageFilez
    Base class for stub image loaders.

    A stub loader is an image loader that can identify files of a
    certain format, but relies on external code to load the file.
    c                 C   s   d}t |d S )Nz+StubImageFile subclass must implement _openNotImplementedErrorr0   r   r   r   r   r%   P  s    zStubImageFile._openc                 C   sT   |   }|d u r&d| j d}t||| }|d us<J |j| _|j| _| S )Nzcannot find loader for this z file)_loadr5   r   rI   r3   __dict__)r0   loaderr   imager   r   r   rI   T  s    
zStubImageFile.loadc                 C   s   d}t |dS )z (Hook) Find actual image loader.z+StubImageFile subclass must implement _loadNry   r{   r   r   r   r|   `  s    zStubImageFile._loadN)rs   rt   ru   rv   r%   rI   r|   r   r   r   r   rx   H  s   rx   c                   @   sP   e Zd ZdZdZdZdZdZdZdZ	dd Z
dd Zdd	 Zd
d Zdd ZdS )Parserzj
    Incremental image parser.  This class implements the standard
    feed/close consumer interface.
    Nr   c                 C   s   | j du sJ ddS )z
        (Consumer) Reset the parser.  Note that you can only call this
        method immediately after you've created a parser; parser
        instances cannot be reused.
        Nzcannot reuse parsers)datar8   r   r   r   resets  s    zParser.resetc                 C   s  | j r
dS | jdu r|| _n| j| | _| jr| jdkrztt| j| j}| j|d | _| j| | _| jdksv| jszdS | j| j\}}|dk rd| _d| _ |dk rd| _t| ndS | j|d | _n| jrڐnz<t	
| j}t|}W d   n1 s
0    Y  W n ty*   Y n0 t|dp@t|d}|sXt|jdkr`d| _nv|  |jd \}}}	}
g |_t|j||
|j| _| j|j| |	| _| jt| jkr| j| jd | _d| _|| _dS )z
        (Consumer) Feed data to the parser.

        :param data: A string buffer.
        :exception OSError: If the parser failed to parse the image file.
        Nr   r   rP   rN   )finishedr   rh   re   minrK   r`   r   r   ioBytesIOr   r!   r   rL   r   rX   r\   r,   r   r]   rU   )r0   r   skiprl   rk   r"   rU   flagdoar   r   r   feed{  sR    	


.zParser.feedc                 C   s   | S r4   r   r8   r   r   r   	__enter__  s    zParser.__enter__c                 G   s   |    d S r4   )r/   r0   rf   r   r   r   __exit__  s    zParser.__exit__c              	   C   s   | j r.| d d | _| _ | js.d}t|| js@d}t|| jrt| j8}zt	|| _W | j
  n| j
  0 W d   n1 s0    Y  | jS )a  
        (Consumer) Close the stream.

        :returns: An image object.
        :exception OSError: If the parser failed to parse the image file either
                            because it cannot be identified or cannot be
                            decoded.
        rC   Nzimage was incompletezcannot parse this image)rh   r   r   r   r   r   r   r   r   r!   rI   )r0   r   r"   r   r   r   r/     s    

6zParser.close)rs   rt   ru   rv   incrementalr   r   rh   re   r   r   r   r   r   r/   r   r   r   r   r   f  s   Mr   c              
   C   s   |    t| dsd| _|jtd tt|| jd d }z$| }|	  t
| |||| W n< ttjfy } zt
| |||d| W Y d}~n
d}~0 0 t|dr|	  dS )zHelper to save image based on tile list

    :param im: Image object.
    :param fp: File object.
    :param tile: Tile list.
    :param bufsize: Optional buffer size
    encoderconfigr   rA   r      Nflush)rI   rL   r   rY   r   maxr   r-   rS   r   _encode_tiler
   r   UnsupportedOperation)rU   r"   r   bufsizefhexcr   r   r   _save  s    	
(
r   c              	   C   s   |D ]\}}}}	|dkr"| | t| j||	| j}
z|
| j| |
jrd|
| |
	 d }n:|r|

|dd  \}}|| |rhqqhn|
||}|dk rd| d}t||W |
  q|
  0 qd S )Nr   r   zencoder error z when writing image file)rQ   r   Z_getencoderr,   r   r]   rU   	pushes_fdr_   encode_to_pyfdencodewriteencode_to_filer   rb   )rU   r"   r   r   r   r   rk   ri   r   r   encodererrcoder   r   r   r   r   r     s&    


r   c                 C   s   |dkrdS |t kr:| |}t||k r6d}t||S g }|}|dkrx| t|t }|s`qx|| |t|8 }qBtdd |D |k rd}t|d|S )a  
    Reads large blocks in a safe way.  Unlike fp.read(n), this function
    doesn't trust the user.  If the requested size is larger than
    SAFEBLOCK, the file is read block by block.

    :param fp: File handle.  Must implement a <b>read</b> method.
    :param size: Number of bytes to read.
    :returns: A string containing <i>size</i> bytes of data.

    Raises an OSError if the file is truncated and the read cannot be completed

    r   rC   zTruncated File Readc                 s   s   | ]}t |V  qd S r4   )rK   )rE   r   r   r   r   	<genexpr>E  rC   z_safe_read.<locals>.<genexpr>)	SAFEBLOCKrO   rK   r   r   appendsumjoin)r"   r-   r   r   Zremaining_sizeblockr   r   r   
_safe_read(  s(    

r   c                   @   s   e Zd Zdd Zdd ZdS )PyCodecStatec                 C   s   d| _ d| _d| _d| _d S )Nr   )xsizeysizexoffyoffr8   r   r   r   r   L  s    zPyCodecState.__init__c                 C   s    | j | j| j | j | j| j fS r4   )r   r   r   r   r8   r   r   r   rd   R  s    zPyCodecState.extentsN)rs   rt   ru   r   rd   r   r   r   r   r   K  s   r   c                   @   s6   e Zd Zdd Zdd Zdd Zdd Zdd
dZd	S )PyCodecc                 G   s(   d | _ t | _d | _|| _| | d S r4   )rU   r   r;   fdr,   init)r0   r,   rf   r   r   r   r   W  s
    zPyCodec.__init__c                 C   s
   || _ dS )z
        Override to perform codec specific initialization

        :param args: Array of args items from the tile entry
        :returns: None
        N)rf   r   r   r   r   r   ^  s    zPyCodec.initc                 C   s   dS )zT
        Override to perform codec specific cleanup

        :returns: None
        Nr   r8   r   r   r   rb   g  s    zPyCodec.cleanupc                 C   s
   || _ dS )z
        Called from ImageFile to set the Python file-like object

        :param fd: A Python file-like object
        :returns: None
        N)r   )r0   r   r   r   r   r_   o  s    zPyCodec.setfdNc                 C   s   || _ |r|\}}}}nd\}}}}|dkrJ|dkrJ| j j\| j_| j_n(|| j_|| j_|| | j_|| | j_| jjdks| jjdkrd}t|| jj| jj | j jd ks| jj| jj | j jd krd}t|dS )z
        Called from ImageFile to set the core output image for the codec

        :param im: A core image object
        :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle
            for this tile
        :returns: None
        )r   r   r   r   r   zSize cannot be negativer   z Tile cannot extend outside imageN)rU   r-   r;   r   r   r   r   
ValueError)r0   rU   rd   Zx0Zy0x1y1r   r   r   r   r]   x  s&    zPyCodec.setimage)N)rs   rt   ru   r   r   rb   r_   r]   r   r   r   r   r   V  s
   		r   c                   @   s2   e Zd ZdZdZedd Zdd Zd
dd	ZdS )	PyDecoderz
    Python implementation of a format decoder. Override this class and
    add the decoding logic in the :meth:`decode` method.

    See :ref:`Writing Your Own File Codec in Python<file-codecs-py>`
    Fc                 C   s   | j S r4   )	_pulls_fdr8   r   r   r   r^     s    zPyDecoder.pulls_fdc                 C   s
   t  dS )a=  
        Override to perform the decoding process.

        :param buffer: A bytes object with the data to be decoded.
        :returns: A tuple of ``(bytes consumed, errcode)``.
            If finished with decoding return -1 for the bytes consumed.
            Err codes are from :data:`.ImageFile.ERRORS`.
        Nry   )r0   bufferr   r   r   r`     s    	zPyDecoder.decodeNc                 C   sl   |s
| j }t| j d|}|| j| j  ||}|d dkrPd}t||d dkrhd}t|dS )a  
        Convenience method to set the internal image from a stream of raw data

        :param data: Bytes to be set
        :param rawmode: The rawmode to be used for the decoder.
            If not specified, it will default to the mode of the image
        :returns: None
        r>   r   znot enough image datar   zcannot decode image dataN)	r,   r   r\   r]   rU   r;   rd   r`   r   )r0   r   rawmoder   rj   r   r   r   r   
set_as_raw  s    

zPyDecoder.set_as_raw)N)	rs   rt   ru   rv   r   propertyr^   r`   r   r   r   r   r   r     s   
r   c                   @   s8   e Zd ZdZdZedd Zdd Zdd Zd	d
 Z	dS )	PyEncoderz
    Python implementation of a format encoder. Override this class and
    add the decoding logic in the :meth:`encode` method.

    See :ref:`Writing Your Own File Codec in Python<file-codecs-py>`
    Fc                 C   s   | j S r4   )
_pushes_fdr8   r   r   r   r     s    zPyEncoder.pushes_fdc                 C   s
   t  dS )a   
        Override to perform the encoding process.

        :param bufsize: Buffer size.
        :returns: A tuple of ``(bytes encoded, errcode, bytes)``.
            If finished with encoding return 1 for the error code.
            Err codes are from :data:`.ImageFile.ERRORS`.
        Nry   )r0   r   r   r   r   r     s    	zPyEncoder.encodec                 C   s2   | j s
dS | d\}}}|r*| j| ||fS )z
        If ``pushes_fd`` is ``True``, then this method will be used,
        and ``encode()`` will only be called once.

        :returns: A tuple of ``(bytes consumed, errcode)``.
            Err codes are from :data:`.ImageFile.ERRORS`.
        )r   r   r   )r   r   r   r   )r0   Zbytes_consumedr   r   r   r   r   r     s    zPyEncoder.encode_to_pyfdc                 C   s<   d}|dkr8|  |\}}}|dkr|||d  q|S )z
        :param fh: File handle.
        :param bufsize: Buffer size.

        :returns: If finished successfully, return 0.
            Otherwise, return an error code. Err codes are from
            :data:`.ImageFile.ERRORS`.
        r   N)r   r   )r0   r   r   r   statusbufr   r   r   r     s    	zPyEncoder.encode_to_fileN)
rs   rt   ru   rv   r   r   r   r   r   r   r   r   r   r   r     s   
r   )r   )N)r   rZ   r*   rM    r   Z_utilr   r   r   ra   r   r   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s8   
 t 

#H1