a
    çÝEbSR  ã                   @   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„ ZG dd„ dƒZG dd„ dƒZdS )!é    Né   )ÚImage)ÚisPathi   i   Fzimage buffer overrun errorzdecoding errorzunknown errorzbad configurationzout of memory error)éÿÿÿÿéþÿÿÿéýÿÿÿiøÿÿÿi÷ÿÿÿc                 C   sL   zt j | ¡}W n ty,   t | ¡}Y n0 |s<d| › �}t|d ƒ‚d S )Nzdecoder error z when reading image file)r   ÚcoreZgetcodecstatusÚAttributeErrorÚERRORSÚgetÚOSError)ÚerrorÚmessage© r   úM/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/PIL/ImageFile.pyÚraise_oserror<   s    
r   c                 C   s   | d S )Né   r   )Útr   r   r   Ú	_tilesortF   s    r   c                       sR   e Zd ZdZd‡ fdd„	Z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 | _zhz|  ¡  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rÈtdƒ‚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"   Úv©Ú	__class__r   r   r   S   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©r/   r   r   r   Úget_format_mimetype‚   s    
zImageFile.get_format_mimetypec                 C   s   | j r| j ¡  d| _dS )zCheck file integrityN)r#   r!   r.   r7   r   r   r   Úverifyˆ   s    
zImageFile.verifyc                 C   s˜  | j du rtdƒ‚tj | ¡}| j s(|S d| _| jo@t| j ƒdk}|oPt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�ršt|	ƒdk�rš|	d | jk�rš|	d tjv �ršz~ddl}
t| jƒ�(}|
j| ¡ d|
jd	�| _W d  ƒ n1 �s>0    Y  tj | j| j|||	¡| _d}| j�rvd| j_W n  t
ttf�y˜   d| _Y n0 |  ¡  d
}| j�s8| j jtd� z
| j}W n t
�yÞ   d}Y n0 dd„ t  !| j dd„ ¡D ƒ| _ | j D �]0\}}}}	t "| j||	| j#¡}�z ||ƒ | $| j|¡ |j%�rd| &| j¡ | 'd¡\}}nº|}z|| j(ƒ}W nL t)t*j+f�yÂ } z,t,�r¤W Y d}~�qn
tdƒ|‚W Y d}~n
d}~0 0 |�sêt,�rÖ�qntdt|ƒ› d�ƒ‚|| }| '|¡\}}|dk �r�q||d… }�qhW | -¡  n
| -¡  0 �qg | _ || _.|  /¡  | j0�rf| j1�rf| j 2¡  d| _| j�sŒt,�sŒ|dk �rŒt3|ƒ 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>Ú   r@   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   Z
map_bufferr,   Ú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   )r/   ZpixelZuse_mmapr   rL   rN   Zdecoder_nameÚextentsÚoffsetÚargsrO   r!   Zerr_codeÚprefixÚdecoderÚstatusÚbÚsÚeÚnr   r   r   rF   ‘   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)rR   r+   r,   r   r   ÚnewrF   r7   r   r   r   rU     s    "
zImageFile.load_preparec                 C   s   d S r3   r   r7   r   r   r   r`     s    zImageFile.load_endc                 C   sB   || j k s.t| dƒr| jd u s6|| j| j  kr6tdƒ‚|  ¡ |kS )NÚ	_n_framesz attempt to seek outside sequence)r   rI   rm   Zn_framesr(   Útell)r/   Úframer   r   r   Ú_seek_check(  s    ÿûûú	zImageFile._seek_check)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r8   r9   rF   rU   r`   rp   Ú__classcell__r   r   r1   r   r   P   s   /	 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   t dƒ‚d S )Nz+StubImageFile subclass must implement _open©ÚNotImplementedErrorr7   r   r   r   r$   ?  s    zStubImageFile._openc                 C   sL   |   ¡ }|d u r"td| j› d�ƒ‚| | ¡}|d us8J ‚|j| _|j| _d S )Nzcannot find loader for this z file)Ú_loadr   r4   rF   r2   Ú__dict__)r/   ÚloaderÚimager   r   r   rF   B  s    
zStubImageFile.loadc                 C   s   t dƒ‚dS )z (Hook) Find actual image loader.z+StubImageFile subclass must implement _loadNrw   r7   r   r   r   ry   L  s    zStubImageFile._loadN)rq   rr   rs   rt   r$   rF   ry   r   r   r   r   rv   7  s   
rv   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)Údatar7   r   r   r   Úreset^  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 r¼d| _d| _ |dk r¸d| _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 n²0 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   rM   rK   )Úfinishedr~   re   rb   ÚminrH   r]   r|   r   ÚioÚBytesIOr   r    r   rI   r   rU   rY   r+   r   rZ   rR   )r/   r~   Úskiprj   ri   r!   rR   ÚflagÚdÚoÚar   r   r   Úfeedf  sR    	


.zParser.feedc                 C   s   | S r3   r   r7   r   r   r   Ú	__enter__¶  s    zParser.__enter__c                 G   s   |   ¡  d S r3   )r.   ©r/   rc   r   r   r   Ú__exit__¹  s    zParser.__exit__c              	   C   s˜   | j r*|  d¡ d | _| _ | js*tdƒ‚| js8tdƒ‚| jr’t | j¡�8}zt 	|¡| _W | j 
¡  n| j 
¡  0 W d  ƒ n1 sˆ0    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.
        r@   Nzimage was incompletezcannot parse this image)re   r‰   r~   r€   r   r|   r‚   rƒ   r   r    rF   )r/   r!   r   r   r   r.   ¼  s    

6zParser.close)rq   rr   rs   rt   Úincrementalr|   r~   re   rb   r€   r   r‰   rŠ   rŒ   r.   r   r   r   r   r}   Q  s   Pr}   c              
   C   sÖ  |   ¡  t| dƒsd| _|jtd� tt|| jd d ƒ}z| ¡ }| 	¡  W nÖ t
tjf�y$ } z¶|D ]¤\}}}}	t | j||	| j¡}|dkrœ| |¡ | | j|¡ |jrÈ| |¡ | ¡ \}
}n"| |¡\}
}}| |¡ |rÈqêqÈ|dk �rtd|› d�ƒ|‚| ¡  qjW Y d}~n¢d}~0 0 |D ]’\}}}}	t | j||	| j¡}|dk�r^| |¡ | | j|¡ |j�rŒ| |¡ | ¡ \}
}n| ||¡}|dk �r²td|› d�ƒ‚| ¡  �q*t|d	ƒ�rÒ| 	¡  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   é   zencoder error z when writing image fileNÚflush)rF   rI   rŽ   rV   r   Úmaxr   r,   rP   r�   r	   r‚   ÚUnsupportedOperationr   Z_getencoderr+   rN   rZ   rR   Z	pushes_fdr\   Zencode_to_pyfdÚencodeÚwriter   r_   Zencode_to_file)rR   r!   r   ÚbufsizeÚfhÚexcri   rg   r‡   rˆ   Úlrh   r†   r   r   r   Ú_saveÜ  sL    	




 



r™   c                 C   sœ   |dkrdS |t kr6|  |¡}t|ƒ|k r2tdƒ‚|S g }|}|dkrt|  t|t ƒ¡}|s\qt| |¡ |t|ƒ8 }q>tdd„ |D ƒƒ|k r’tdƒ‚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   r@   zTruncated File Readc                 s   s   | ]}t |ƒV  qd S r3   )rH   )rB   r†   r   r   r   Ú	<genexpr>3  r@   z_safe_read.<locals>.<genexpr>)Ú	SAFEBLOCKrL   rH   r   r�   ÚappendÚsumÚjoin)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Úyoffr7   r   r   r   r   9  s    zPyCodecState.__init__c                 C   s    | j | j| j | j | j| j fS r3   )r¤   r¥   r¢   r£   r7   r   r   r   ra   ?  s    zPyCodecState.extentsN)rq   rr   rs   r   ra   r   r   r   r   r¡   8  s   r¡   c                   @   s\   e Zd ZdZdZdd„ Zdd„ Zedd„ ƒZd	d
„ Z	dd„ Z
dd„ Zd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 Decoder in Python<file-decoders-py>`
    Fc                 G   s(   d | _ tƒ | _d | _|| _|  |¡ d S r3   )rR   r¡   ÚstateÚfdr+   Úinit)r/   r+   rc   r   r   r   r   M  s
    zPyDecoder.__init__c                 C   s
   || _ dS )zš
        Override to perform decoder specific initialization

        :param args: Array of args items from the tile entry
        :returns: None
        N)rc   r‹   r   r   r   r©   T  s    zPyDecoder.initc                 C   s   | j S r3   )Ú	_pulls_fdr7   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 <0 for the bytes consumed.
            Err codes are from :data:`.ImageFile.ERRORS`.
        Nrw   )r/   Úbufferr   r   r   r]   a  s    	zPyDecoder.decodec                 C   s   dS )zV
        Override to perform decoder specific cleanup

        :returns: None
        Nr   r7   r   r   r   r_   l  s    zPyDecoder.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¨   )r/   r¨   r   r   r   r\   t  s    zPyDecoder.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r’tdƒ‚| jj| jj | j jd ksÊ| jj| jj | j jd krÒtdƒ‚dS )zú
        Called from ImageFile to set the core output image for the decoder

        :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)rR   r,   r§   r¢   r£   r¤   r¥   Ú
ValueError)r/   rR   ra   Zx0Zy0Úx1Úy1r   r   r   rZ   }  s"    ÿþzPyDecoder.setimagec                 C   sd   |s
| j }t | j d|¡}| | j| j ¡ ¡ | |¡}|d dkrLtdƒ‚|d dkr`tdƒ‚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   rY   rZ   rR   r§   ra   r]   r¬   )r/   r~   Úrawmoder†   rh   r   r   r   Ú
set_as_raw   s    

zPyDecoder.set_as_raw)N)N)rq   rr   rs   rt   rª   r   r©   Úpropertyr[   r]   r_   r\   rZ   r°   r   r   r   r   r¦   C  s   	
	
#r¦   )r   )r‚   rW   r)   rJ   Ú r   Z_utilr   r   r›   r^   r
   r   r   r   rv   r}   r™   r    r¡   r¦   r   r   r   r   Ú<module>   s2   û

 h 
;!