o
    Ñ­jÍa  ã                   @  sV  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mZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dZd	Zd
Z	 ddddddœZ	 d8dd„Zd9dd„Zd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d:d;d(d)„Zd<d=d,d-„Zd.d/„ ZG d0d1„ d1ƒZ G d2d3„ d3ƒZ!G d4d5„ d5e!ƒZ"G d6d7„ d7e!ƒZ#dS )>é    )ÚannotationsN)ÚIOÚAnyÚ
NamedTupleé   )ÚImage)Ú	deprecate)Úis_pathi   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   úJ/var/www/html/CropPilot/venv/lib/python3.10/site-packages/PIL/ImageFile.pyÚ_get_oserrorD   s   ÿr   c                 C  s   t dddd� t| dd�‚)NÚraise_oserroré   z€It 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    O   s   ýr    c                 C  s   | d S )Né   r   )Útr   r   r   Ú	_tilesortY   s   r&   c                   @  s.   e Zd ZU ded< ded< ded< ded< d	S )
Ú_TileÚstrÚ
codec_nameútuple[int, int, int, int]Úextentsr   Úoffsetztuple[Any, ...] | str | NoneÚargsN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r   r   r'   ^   s
   
 r'   c                      sf   e Zd ZdZd‡ fdd„	Zddd„Z‡ fd	d
„Zddd„Zdd„ Zddd„Z	d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	|ƒr)t
|dƒ| _|| _d| _n	|| _|| _d | _z8z|  ¡  W n tttttjfyP } zt|ƒ|‚d }~ww | jrb| jd dksb| jd dkrhd}t|ƒ‚W d S  tyz   | jry| j ¡  ‚ w )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   r5   m   sJ   
û
€ù"	þ
üzImageFile.__init__r   ú
str | Nonec                 C  s,   | j r| j S | jd urtj | j ¡ ¡S d S ©N)r7   Úformatr   ÚMIMEr   Úupper©rL   r   r   r   Úget_format_mimetype�   s
   
zImageFile.get_format_mimetypec                   s   g | _ tƒ  |¡ d S rQ   )r8   r4   Ú__setstate__)rL   ÚstaterN   r   r   rW   ¤   s   zImageFile.__setstate__ÚNonec                 C  s   | j r| j ¡  d| _dS )zCheck file integrityN)r@   r>   rK   rU   r   r   r   Úverify¨   s   

zImageFile.verifyc                 C  s¾  | j du rd}t|ƒ‚tj | ¡}| j s|S d| _| jo"t| j ƒdk}|o*ttdƒ }d}z| j	}d}W n t
yA   | jj}Y nw z| j}d}W n t
yV   | jj}Y nw |rç| j d \}}}	}
t|
tƒrl|
ddf}
|dkrçt|
ƒdkrç|
d | jkrç|
d tjv rçzSddl}t| jƒ�}|j| ¡ d|jd	�| _W d  ƒ n1 s¥w   Y  |	| jd |
d   | j ¡ krÀd
}t|ƒ‚tj | j| j||	|
¡| _d}| jrÖd| j_W n t
ttfyæ   d| _Y nw |  ¡  d}| j�s­| j jt d� z| j!}W n t
�y	   d}Y nw dd„ t" #| j dd„ ¡D ƒ| _ | j D ]�\}}}	}
||	ƒ t $| j||
| j%¡}zw| &| j|¡ |j'�rJ| (| j¡ | )d¡d }nW|}	 z|| j*ƒ}W n  t+t,j-f�yt } zt.�riW Y d}~n8d}t|ƒ|‚d}~ww |�sˆt.�r|n%dt|ƒ› d�}t|ƒ‚|| }| )|¡\}}|dk �r™n||d… }�qMW | /¡  �q| /¡  w g | _ || _0|  1¡  | j2�rÄ| j3�rÄ| j 4¡  d| _| j�sÙt.�sÙ|dk �rÙt5|dd�‚tj | ¡S )z"Load image data based on tile listNzcannot load this imager   Úpypy_version_infor   FÚrawé   )Úaccesszbuffer is not large enoughr   ©Úkeyó    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   r]   r   )r8   r   r   r   Ú<lambda>   s    z ImageFile.load.<locals>.<lambda>Tzimage file is truncatedzimage file is truncated (z bytes not processed)r#   )6r8   r   r   ÚloadÚmapr?   ÚlenÚhasattrÚsysÚ	load_readr   r>   ÚreadÚ	load_seekÚseekÚ
isinstancer(   rH   Ú	_MAPMODESÚmmapr=   ÚfilenoÚACCESS_READrI   r   Ú
map_bufferÚimÚpaletteÚdirtyÚImportErrorÚload_prepareÚsortr&   Útile_prefixÚ	itertoolsÚgroupbyÚ_getdecoderr:   ÚsetimageÚpulls_fdÚsetfdÚdecoder<   rB   rF   r   ÚLOAD_TRUNCATED_IMAGESÚcleanupr9   Úload_endr@   Ú!_close_exclusive_fp_after_loadingrK   r   )rL   r   ÚpixelÚuse_mmapr9   rn   rp   Údecoder_namer+   r,   r-   rs   r>   Úerr_codeÚprefixr   ÚbÚsÚeÚnr   r   r   rh   ±   sØ   
ÿÿ

ÿ ÿ€
ÿ
ÿ
ÿþÿ
€úÿÿ
ç€
zImageFile.loadc                 C  sT   | j r| j j| jks| j j| jkrtj | j| j¡| _ | jdkr(tj | ¡ d S d S )NÚP)rw   rH   rI   r   r   Únewrh   rU   r   r   r   r{   <  s
   "
ÿzImageFile.load_preparec                 C  ó   d S rQ   r   rU   r   r   r   r‡   D  ó   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)r6   rk   r–   Ún_framesrE   Útell)rL   Úframer   r   r   r   Ú_seek_checkP  s   
ü
zImageFile._seek_check)NN)r   rP   ©r   rY   )r.   r/   r0   Ú__doc__r5   rV   rW   rZ   rh   r{   r‡   rš   Ú__classcell__r   r   rN   r   r2   j   s    
0
	 

r2   c                   @  s&   e Zd Zddd„Zejddd	„ƒZd
S )ÚStubHandlerrw   ÚStubImageFiler   rY   c                 C  r”   rQ   r   ©rL   rw   r   r   r   r=   a  ó   zStubHandler.openúImage.Imagec                 C  r”   rQ   r   r    r   r   r   rh   d  r•   zStubHandler.loadN)rw   rŸ   r   rY   )rw   rŸ   r   r¢   )r.   r/   r0   r=   ÚabcÚabstractmethodrh   r   r   r   r   rž   `  s    
rž   c                   @  s,   e Zd ZdZddd„Z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   rY   c                 C  ó   d}t |ƒ‚)Nz+StubImageFile subclass must implement _open©ÚNotImplementedError©rL   r   r   r   r   rA   q  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)Ú_loadrR   r   rh   rO   Ú__dict__)rL   Úloaderr   Úimager   r   r   rh   u  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.   r/   r0   rœ   rA   rh   r©   r   r   r   r   rŸ   i  s
    
rŸ   c                   @  s^   e Zd ZU dZdZdZded< dZdZdZ	dZ
ddd	„Zd
d„ Zdd„ Zddd„Zdd„ ZdS )ÚParserzj
    Incremental image parser.  This class implements the standard
    feed/close consumer interface.
    NzImage.Image | Noner¬   r   r   rY   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)ÚdatarU   r   r   r   Úreset”  s   zParser.resetc                 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 s…w   Y  W n
 ty•   Y dS w t|dƒpŸt|dƒ}|s©t|jƒdkr­d| _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#   ro   rm   )Úfinishedr¯   r   r,   Úminrj   r„   r¬   r   ÚioÚBytesIOr   r=   r   rk   r8   r{   r€   rH   r:   r�   rw   )rL   r¯   Úskipr‘   r�   r>   rw   ÚflagÚdÚoÚar   r   r   Úfeedœ  sX   	

ÿ€ÿ
zParser.feedc                 C  s   | S rQ   r   rU   r   r   r   Ú	__enter__è  r¡   zParser.__enter__r-   Úobjectc                 G  s   |   ¡  d S rQ   )rK   ©rL   r-   r   r   r   Ú__exit__ë  s   zParser.__exit__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.
        ra   Nzimage was incompletezcannot parse this image)r   rº   r¯   r±   r   r¬   r³   r´   r   r=   rh   )rL   r   r>   r   r   r   rK   î  s$   


üûzParser.closer›   )r-   r¼   r   rY   )r.   r/   r0   rœ   Úincrementalr¬   r1   r¯   r   r,   r±   r°   rº   r»   r¾   rK   r   r   r   r   r®   ‡  s   
 
L
r®   rY   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 )z«Helper 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   r_   r   é   NÚflush)rh   rk   rÀ   r|   r&   Úmaxr;   rI   rt   rÂ   Ú_encode_tiler   r³   ÚUnsupportedOperation)rw   r>   r8   ÚbufsizeÚfhÚexcr   r   r   Ú_save  s    	
€ÿ
ÿrÉ   r8   úlist[_Tile]c              	   C  sÐ   |D ]c\}}}}	|dkr|  |¡ t | j||	| j¡}
zE|
 | j|¡ |
jr2|
 |¡ |
 	¡ d }n|rJ	 |
 
|¡dd … \}}| |¡ |rHnq5n|
 ||¡}|dk r[t|dd�|‚W |
 ¡  q|
 ¡  w d S )Nr   r   Tr#   )rp   r   Ú_getencoderrH   rÀ   r�   rw   Ú	pushes_fdrƒ   Úencode_to_pyfdÚencodeÚwriteÚencode_to_filer   r†   )rw   r>   r8   rÆ   rÇ   rÈ   Úencoder_namer+   r,   r-   r   Úerrcoder¯   r   r   r   rÄ   ,  s.   


üÿérÄ   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   ra   zTruncated File Readc                 s  s   � | ]}t |ƒV  qd S rQ   )rj   )rc   r·   r   r   r   Ú	<genexpr>d  s   € z_safe_read.<locals>.<genexpr>)Ú	SAFEBLOCKrn   rj   r   r²   ÚappendÚsumÚjoin)r>   rI   r¯   r   Úremaining_sizeÚblockr   r   r   Ú
_safe_readG  s*   

û
rÚ   c                   @  s    e Zd Zd	dd„Zd
dd„ZdS )ÚPyCodecStater   rY   c                 C  s   d| _ d| _d| _d| _d S )Nr   )ÚxsizeÚysizeÚxoffÚyoffrU   r   r   r   r5   k  s   
zPyCodecState.__init__r*   c                 C  s    | j | j| j | j | j| j fS rQ   )rÞ   rß   rÜ   rÝ   rU   r   r   r   r+   q  s    zPyCodecState.extentsNr›   )r   r*   )r.   r/   r0   r5   r+   r   r   r   r   rÛ   j  s    
rÛ   c                   @  sD   e Zd ZU ded< dd„ Zdd„ Zdd	d
„Zdd„ Zdddd„ZdS )ÚPyCodeczIO[bytes] | NoneÚfdc                 G  s(   d | _ tƒ | _d | _|| _|  |¡ d S rQ   )rw   rÛ   rX   rá   rH   Úinit)rL   rH   r-   r   r   r   r5   x  s
   zPyCodec.__init__c                 C  ó
   || _ dS )z˜
        Override to perform codec specific initialization

        :param args: Array of args items from the tile entry
        :returns: None
        N)r-   r½   r   r   r   râ     ó   
zPyCodec.initr   rY   c                 C  s   dS )zT
        Override to perform codec specific cleanup

        :returns: None
        Nr   rU   r   r   r   r†   ˆ  s   zPyCodec.cleanupc                 C  rã   )z�
        Called from ImageFile to set the Python file-like object

        :param fd: A Python file-like object
        :returns: None
        N)rá   )rL   rá   r   r   r   rƒ   �  rä   zPyCodec.setfdNr+   ú tuple[int, int, int, int] | Nonec                 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)rw   rI   rX   rÜ   rÝ   rÞ   rß   Ú
ValueError)rL   rw   r+   Úx0Úy0Úx1Úy1r   r   r   r   r�   ™  s$   ýzPyCodec.setimager›   rQ   )r+   rå   r   rY   )	r.   r/   r0   r1   r5   râ   r†   rƒ   r�   r   r   r   r   rà   u  s   
 
		rà   c                   @  s8   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 rQ   )Ú	_pulls_fdrU   r   r   r   r‚   É  ó   zPyDecoder.pulls_fdÚbufferÚbytesú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¦   )rL   rï   r   r   r   r   r„   Í  ó   	zPyDecoder.decodeNr¯   rY   c                 C  sz   |s| j }t | j d|¡}| jdusJ ‚| | j| j ¡ ¡ | |¡}|d dkr/d}t|ƒ‚|d dkr;d}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\   Nr   znot enough image datar   zcannot decode image data)	rH   r   r€   rw   r�   rX   r+   r„   ræ   )rL   r¯   Úrawmoder·   r�   r   r   r   r   Ú
set_as_rawÙ  s   

þzPyDecoder.set_as_raw©r   r   )rï   rð   r   rñ   rQ   )r¯   rð   r   rY   )	r.   r/   r0   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„ 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ì   rQ   )Ú
_pushes_fdrU   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¦   )rL   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Ï   )rL   Úbytes_consumedrÒ   r¯   r   r   r   rÍ     s   zPyEncoder.encode_to_pyfdc                 C  sB   d}|dkr|   |¡\}}}|dkr| ||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Î   rÏ   )rL   rÇ   rÆ   rÒ   ÚstatusÚbufr   r   r   rÐ     s   	ýzPyEncoder.encode_to_fileNrö   )rÆ   r   r   rú   )r   rñ   )
r.   r/   r0   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›   rQ   )r8   rÊ   )$Ú
__future__r   r£   r³   r~   rF   rl   Útypingr   r   r   Ú r   Ú
_deprecater   Ú_utilr	   r;   rÔ   r…   r   r   r    r&   r'   r2   rž   rŸ   r®   rÉ   rÄ   rÚ   rÛ   rà   rë   rø   r   r   r   r   Ú<module>   sL   û


 w	 
#J3