o
    6>gf                     @  s|  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ e
rFddlmZ d	Zd
ZdZ	 ddddddZ	 dEddZdFddZdGddZG d d deZG d!d" d"ejZG d#d$ d$ZG d%d& d&eZ G d'd( d(Z!dHdId1d2Z"	dJdKd7d8Z#dLd;d<Z$G d=d> d>Z%G d?d@ d@Z&G dAdB dBe&Z'G dCdD dDe&Z(dS )M    )annotationsN)IOTYPE_CHECKINGAny
NamedTuplecast   )Image)	deprecate)is_path)StrOrBytesPathi   i   Fzimage buffer overrun errorzdecoding errorzunknown errorzbad configurationzout of memory error)ierrorintencoderboolreturnOSErrorc                C  sh   zt j| }W n ty   t| }Y nw |s$|rdnd d|  }|d|r*dnd d7 }t|S )Nr   decoderz error z when writingreadingz image file)r	   coregetcodecstatusAttributeErrorERRORSgetr   )r   r   msg r    @/var/www/html/venv/lib/python3.10/site-packages/PIL/ImageFile.py_get_oserrorH   s   r"   c                 C  s   t dddd t| dd)Nraise_oserror   zIt is only useful for translating error codes returned by a codec's decode() method, which ImageFile already does automatically.)actionFr   )r
   r"   )r   r    r    r!   r#   S   s   r#   t_Tilec                 C  s   | d S )N   r    )r'   r    r    r!   	_tilesort]   s   r*   c                   @  s6   e Zd ZU ded< ded< dZded< dZd	ed
< dS )r(   str
codec_name tuple[int, int, int, int] | Noneextentsr   r   offsetNztuple[Any, ...] | str | Noneargs)__name__
__module____qualname____annotations__r/   r0   r    r    r    r!   r(   b   s
   
 c                      sz   e Zd ZdZ	d"d# fd	d
Zd$ddZd%ddZd& fddZd$ddZd'ddZ	d$ddZ
d$ddZd(d d!Z  ZS ))	ImageFilez*Base class for image file format handlers.NfpStrOrBytesPath | IO[bytes]filenamestr | bytes | Noner   Nonec                   s  t    d| _d | _g | _	 d| _d| _t| _t	|r,t
|d| _t|| _d| _nttt || _|d ur:|nd| _d| _z8z|   W n tttttjfy^ } zt||d }~ww | jrp| jd dksp| jd dkrvd}t|W d S  ty   | jr| j   w )	Nr   r   r    rbT Fznot identified by this driver)super__init__
_min_framecustom_mimetypetilereadonlydecoderconfigMAXBLOCKdecodermaxblockr   openr6   osfspathr8   _exclusive_fpr   r   bytes_open
IndexError	TypeErrorKeyErrorEOFErrorstructr   SyntaxErrormodesizeBaseExceptionclose)selfr6   r8   vr   	__class__r    r!   r>   q   sJ   

"	
zImageFile.__init__c                 C     d S Nr    rV   r    r    r!   rK         zImageFile._open
str | Nonec                 C  s,   | j r| j S | jd urtj| j S d S r[   )r@   formatr	   MIMEr   upperr\   r    r    r!   get_format_mimetype   s
   
zImageFile.get_format_mimetypestate	list[Any]c                   s   g | _ t | d S r[   )rA   r=   __setstate__)rV   rc   rX   r    r!   re      s   zImageFile.__setstate__c                 C  s   | j r| j  d| _dS )zCheck file integrityN)rI   r6   rU   r\   r    r    r!   verify   s   

zImageFile.verifyImage.core.PixelAccess | Nonec                 C  s  | j s| jdu rd}t|tj| }| j s|S d| _| jo%t| j dk}|o-tt	d }d}t| dr;| j
}d}n| jj}t| drJ| j}d}n| jj}|r| j d \}}}	}
t|
trc|
ddf}
|d	krt|
trt|
d
kr|
d | jkr|
d tjv rzSddl}t| j}|j| d|jd| _W d   n1 sw   Y  |	| jd |
d   | j krd}t|tj| j| j||	|
| _d}| jrd| j_W n tttfy   d| _Y nw |    d}| js| j j!t"d t#| dd}dd t$%| j dd D | _ | j D ]\}}}	}
||	 t&| j||
| j'}zw|(| j| |j)r:|*| j |+dd }nW|}	 z|| j,}W n  t-t.j/fyd } zt0rYW Y d}~n8d}t||d}~ww |sxt0rln%dt| d}t||| }|+|\}}|dk rn||d }q=W |1  q|1  w g | _ || _2| 3  | j4r| j5r| j6  d| _| jst0s|dk rt7|ddtj| S )z"Load image data based on tile listNzcannot load this imager   pypy_version_infor   	load_readF	load_seekraw   )accesszbuffer is not large enoughr   keytile_prefix    c                 S  s   g | ]
\}}t |d  qS )r   )list).0_tilesr    r    r!   
<listcomp>  s    
z"ImageFile.load.<locals>.<listcomp>c                 S  s   | d | d | d fS )Nr   r   rl   r    )rA   r    r    r!   <lambda>  s    z ImageFile.load.<locals>.<lambda>Tzimage file is truncatedzimage file is truncated (z bytes not processed)r&   )8rA   _imr   r	   loadmapr8   lenhasattrsysri   r6   readrj   seek
isinstancer+   tuplerR   	_MAPMODESmmaprF   filenoACCESS_READrS   r   
map_bufferimpalettedirtyr   ImportErrorload_preparesortr*   getattr	itertoolsgroupby_getdecoderrC   setimagepulls_fdsetfddecoderE   rL   rP   r   LOAD_TRUNCATED_IMAGEScleanuprB   load_endrI   !_close_exclusive_fp_after_loadingrU   r"   )rV   r   pixeluse_mmaprB   r~   r   decoder_namer.   r/   r0   r   r6   err_codeprefixr   bsenr    r    r!   ry      s   



 




zImageFile.loadc                 C  s<   | j d u rtj| j| j| _| jdkrtj|  d S d S )NP)rx   r	   r   newrR   rS   r   ry   r\   r    r    r!   r   C  s
   

zImageFile.load_preparec                 C  rZ   r[   r    r\   r    r    r!   r   K     zImageFile.load_endframer   r   c                 C  sJ   || j k st| dr| jd u s|t| d| j  krd}t||  |kS )N	_n_framesn_framesz attempt to seek outside sequence)r?   r|   r   r   rO   tell)rV   r   r   r    r    r!   _seek_checkW  s   

zImageFile._seek_checkr[   )r6   r7   r8   r9   r   r:   r   r:   )r   r^   )rc   rd   r   r:   r   rg   )r   r   r   r   )r1   r2   r3   __doc__r>   rK   rb   re   rf   ry   r   r   r   __classcell__r    r    rX   r!   r5   n   s    
2


	 


r5   c                   @  s&   e Zd ZdddZejddd	Zd
S )StubHandlerr   StubImageFiler   r:   c                 C  rZ   r[   r    rV   r   r    r    r!   rF   h  r]   zStubHandler.openImage.Imagec                 C  rZ   r[   r    r   r    r    r!   ry   k  r   zStubHandler.loadN)r   r   r   r:   )r   r   r   r   )r1   r2   r3   rF   abcabstractmethodry   r    r    r    r!   r   g  s    
r   c                   @  s.   e Zd ZdZdddZdddZdd
dZdS )r   z
    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.
    r   r:   c                 C     d}t |)Nz+StubImageFile subclass must implement _openNotImplementedErrorrV   r   r    r    r!   rK   x  s   zStubImageFile._openrg   c                 C  sT   |   }|d u rd| j d}t||| }|d usJ |j| _|j| _| S )Nzcannot find loader for this z file)_loadr_   r   ry   rY   __dict__)rV   loaderr   imager    r    r!   ry   |  s   
zStubImageFile.loadStubHandler | Nonec                 C  r   )z (Hook) Find actual image loader.z+StubImageFile subclass must implement _loadr   r   r    r    r!   r     s   zStubImageFile._loadNr   r   )r   r   )r1   r2   r3   r   rK   ry   r   r    r    r    r!   r   p  s
    

r   c                   @  st   e Zd ZU dZdZdZded< dZded< dZded< d	Z	d	Z
dddZdddZdddZdddZdddZdS )Parserzj
    Incremental image parser.  This class implements the standard
    feed/close consumer interface.
    NzImage.Image | Noner   zbytes | Nonedataz,Image.core.ImagingDecoder | PyDecoder | Noner   r   r   r:   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)r   r\   r    r    r!   reset  s   zParser.resetrJ   c                 C  s  | j rdS | jdu r|| _n| j| | _| jri| jdkr=tt| j| j}| j|d | _| j| | _| jdks;| js=dS | j| j\}}|dk r_d| _d| _ |dk r]d| _t|dddS | j|d | _dS | jrndS zt	
| j}t|}W d   n1 sw   Y  W n
 ty   Y dS w t|dpt|d}|st|jdkrd| _n:|  |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   Fr&   rj   ri   )finishedr   r   r/   minr{   r   r   r"   ioBytesIOr	   rF   r   r|   rA   r   r   rR   rC   r   r   )rV   r   skipr   r   r6   r   flagdoar    r    r!   feed  sX   	


zParser.feedc                 C  s   | S r[   r    r\   r    r    r!   	__enter__  r]   zParser.__enter__r0   objectc                 G  s   |    d S r[   )rU   rV   r0   r    r    r!   __exit__  s   zParser.__exit__r   c              	   C  s   | j r| d d | _| _ | jsd}t|| js d}t|| jrOt| j}zt	|| _W | j
  n| j
  w W d   | jS 1 sJw   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.
        rq   Nzimage was incompletezcannot parse this image)r   r   r   r   r   r   r   r   r	   rF   ry   )rV   r   r6   r    r    r!   rU     s$   


zParser.closer   )r   rJ   r   r:   )r   r   )r0   r   r   r:   )r   r   )r1   r2   r3   r   incrementalr   r4   r   r   r/   r   r   r   r   r   rU   r    r    r    r!   r     s   
 


L
r   r   r   r6   	IO[bytes]rA   list[_Tile]bufsizer:   c              
   C  s   |    t| dsd| _|jtd tt|| jd d }z| }|	  t
| |||| W n ttjfyM } zt
| |||d| W Y d}~nd}~ww t|drY|	  dS 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    rn   r      Nflush)ry   r|   r   r   r*   maxrD   rS   r   r   _encode_tiler   r   UnsupportedOperation)r   r6   rA   r   fhexcr    r    r!   _save  s    	

r   r   
int | Noner   BaseException | Nonec              	   C  s   |D ]i\}}}}	|dkr| | t| j||	| j}
zK|
| j| |
jr2|
| |
	 d }n$|rJ	 |

|dd  \}}|| |rHnq5n|d usPJ |
||}|dk rat|dd|W |
  q|
  w d S )Nr   r   Tr&   )r   r	   _getencoderrR   r   r   r   	pushes_fdr   encode_to_pyfdencodewriteencode_to_filer"   r   )r   r6   rA   r   r   r   encoder_namer.   r/   r0   r   errcoder   r    r    r!   r   3  s0   


r   rS   rJ   c                 C  s   |dkrdS |t kr| |}t||k rd}t||S g }|}|dkr?| t|t }|s0n|| |t|8 }|dks%tdd |D |k rPd}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   rq   zTruncated File Readc                 s  s    | ]}t |V  qd S r[   )r{   )rs   blockr    r    r!   	<genexpr>s  s    z_safe_read.<locals>.<genexpr>)	SAFEBLOCKr~   r{   r   r   appendsumjoin)r6   rS   r   r   blocksremaining_sizer   r    r    r!   
_safe_readV  s*   


r   c                   @  s    e Zd Zd	ddZd
ddZdS )PyCodecStater   r:   c                 C  s   d| _ d| _d| _d| _d S )Nr   )xsizeysizexoffyoffr\   r    r    r!   r>   z  s   
zPyCodecState.__init__tuple[int, int, int, int]c                 C  s    | j | j| j | j | j| j fS r[   )r   r   r   r   r\   r    r    r!   r.     s    zPyCodecState.extentsNr   )r   r   )r1   r2   r3   r>   r.   r    r    r    r!   r   y  s    
r   c                   @  sL   e Zd ZU ded< dd	d
ZdddZdddZdddZ	ddddZdS ) PyCodeczIO[bytes] | NonefdrR   r+   r0   r   r   r:   c                 G  s(   d | _ t | _d | _|| _| | d S r[   )r   r   rc   r   rR   init)rV   rR   r0   r    r    r!   r>     s
   zPyCodec.__init__tuple[Any, ...]c                 C  
   || _ dS )z
        Override to perform codec specific initialization

        :param args: Tuple of arg items from the tile entry
        :returns: None
        N)r0   r   r    r    r!   r        
zPyCodec.initc                 C  s   dS )zT
        Override to perform codec specific cleanup

        :returns: None
        Nr    r\   r    r    r!   r     s   zPyCodec.cleanupr   c                 C  r   )z
        Called from ImageFile to set the Python file-like object

        :param fd: A Python file-like object
        :returns: None
        N)r   )rV   r   r    r    r!   r     r   zPyCodec.setfdNr   Image.core.ImagingCorer.   r-   c                 C  s   || _ |r|\}}}}nd\}}}}|dkr%|dkr%| j j\| j_| j_n|| j_|| j_|| | j_|| | j_| jjdksE| jjdkrKd}t|| jj| jj | j jd ksg| jj| jj | j jd krmd}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)r   rS   rc   r   r   r   r   
ValueError)rV   r   r.   x0y0x1y1r   r    r    r!   r     s$   zPyCodec.setimage)rR   r+   r0   r   r   r:   )r0   r   r   r:   r   )r   r   r   r:   r[   )r   r   r.   r-   r   r:   )	r1   r2   r3   r4   r>   r   r   r   r   r    r    r    r!   r     s   
 


	
r   c                   @  s:   e Zd ZdZdZedddZdd
dZ	d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>`
    Fr   r   c                 C     | j S r[   )	_pulls_fdr\   r    r    r!   r        zPyDecoder.pulls_fdbuffer$bytes | Image.SupportsArrayInterfacetuple[int, int]c                 C     d}t |)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`.
        zunavailable in base decoderr   )rV   r  r   r    r    r!   r        	zPyDecoder.decodeNr    r   rJ   rawmoder^   extrar   r:   c                 C  s|   |s| j }t| j d||}| jdusJ || j| j  ||}|d dkr0d}t||d dkr<d}t|dS )aS  
        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
        :param extra: Extra arguments for the decoder.
        :returns: None
        rk   Nr   znot enough image datar   zcannot decode image data)	rR   r	   r   r   r   rc   r.   r   r   )rV   r   r	  r
  r   r   r   r    r    r!   
set_as_raw  s   
zPyDecoder.set_as_rawr   r   )r  r  r   r  )Nr    )r   rJ   r	  r^   r
  r   r   r:   )	r1   r2   r3   r   r  propertyr   r   r  r    r    r    r!   r     s    
r   c                   @  s@   e Zd ZdZdZedddZdd
dZdddZd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>`
    Fr   r   c                 C  r  r[   )
_pushes_fdr\   r    r    r!   r     r  zPyEncoder.pushes_fdr   r   tuple[int, int, bytes]c                 C  r  )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`.
        zunavailable in base encoderr   )rV   r   r   r    r    r!   r     r  zPyEncoder.encoder  c                 C  s@   | j sdS | d\}}}|r| jdusJ | 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   N)r   r   r   r   )rV   bytes_consumedr   r   r    r    r!   r   "  s   zPyEncoder.encode_to_pyfdr   c                 C  sD   d}|dkr |  |\}}}|dkrt|||d  |dks|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   rG   r   )rV   r   r   r   statusbufr    r    r!   r   2  s   	zPyEncoder.encode_to_fileNr  )r   r   r   r  )r   r  )r   r   r   r   r   r   )
r1   r2   r3   r   r  r  r   r   r   r   r    r    r    r!   r    s    

r  )r   r   r   r   r   r   )r   r   r   r   )r'   r(   r   r   )r   )
r   r   r6   r   rA   r   r   r   r   r:   r[   )r   r   r6   r   rA   r   r   r   r   r   r   r   r   r:   )r6   r   rS   r   r   rJ   ))
__future__r   r   r   r   rG   rP   r}   typingr   r   r   r   r   r<   r	   
_deprecater
   _utilr   _typingr   rD   r   r   r   r"   r#   r*   r(   r5   r   r   r   r   r   r   r   r   r   r  r    r    r    r!   <module>   sT   



 z	 
"
##N6