o
    “jK  ã                   @  sÆ   d dl mZ d dlZd dlZd dlmZmZm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d„Zddd„ZG dd„ dejƒZe	 eje¡ e	 eje¡ e	 ejd¡ e	 ejd¡ dS )é    )ÚannotationsN)ÚIOÚAnyÚcasté   )ÚImageÚ	ImageFileÚImageSequenceÚJpegImagePluginÚTiffImagePlugin)Úo32le)ÚDeferredErrorÚimúImage.ImageÚfpú	IO[bytes]Úfilenameústr | bytesÚreturnÚNonec                 C  s   t  | ||¡ d S ©N)r
   Ú_save)r   r   r   © r   ú\C:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\PIL/MpoImagePlugin.pyr   %   s   r   c              
   C  sè  | j  dg ¡}|st| ddƒst| ||ƒ d S d}g }| g|¢}tdd„ |D ƒƒ}|D ]l}t |¡D ]d}	|s}dd|  }
d	t d
d|
 ¡ d d|
  |	j d< |	j  d¡ }rnt	|t
jƒrf| ¡ }||	j d< |dt|ƒ 7 }t |	||¡ | | ¡ ¡ q2|	 | ¡}|	 |d¡ ||	_ | | ¡ |d  ¡ q2q+t ¡ }d|d< t|ƒ|d< d}d}t|ƒD ]%\}}|dkr¹d}nd}|t d|||dd¡7 }|dkrÏ||8 }||7 }q®||d< | |¡ | dtdƒ | d¡ ¡ | dtj¡ d S )NÚappend_imagesÚis_animatedFé   c                 s  s   � | ]	}t |d dƒV  qdS )Ún_framesr   N)Úgetattr)Ú.0Úseqr   r   r   Ú	<genexpr>2   s   € z_save_all.<locals>.<genexpr>éB   é   s   ÿâz>Hé   s   MPF ó    ÚextraÚexifé   ZJPEGéÿÿÿÿs   0100i °  é°  ó    r   i   z<LLLHHé°  s   II* é   )ÚencoderinfoÚgetr   r   Úsumr	   ÚIteratorÚstructÚpackÚ
isinstancer   ZExifÚtobytesÚlenr
   ÚappendÚtellZ_attach_default_encoderinfoÚsaver   ZImageFileDirectory_v2Ú	enumerateÚseekÚwriter   ÚosÚSEEK_END)r   r   r   r   Z
mpf_offsetÚoffsetsZim_sequencesÚtotalZim_sequenceZim_frameZ
ifd_lengthr'   r.   ZifdZ	mpentriesZdata_offsetÚiÚsizeZmptyper   r   r   Ú	_save_all)   sb   
ÿþýÿ

ê

rC   c                   @  s^   e Zd ZdZdZdZddd„Zdddd„Zddd„Zddd„Z	ddd„Z
e	dd dd„ƒZdS )!ÚMpoImageFileZMPOzMPO (CIPA DC-007)Fr   r   c                 C  s2   | j d usJ ‚| j  d¡ tj | ¡ |  ¡  d S )Nr   )r   r;   r
   ÚJpegImageFileÚ_openÚ_after_jpeg_open©Úselfr   r   r   rF   k   s   zMpoImageFile._openNÚmpheaderúdict[int, Any] | Nonec                   sÂ   |d ur|nˆ   ¡ ˆ _ˆ jd u rd}t|ƒ‚ˆ jd ˆ _‡ fdd„ˆ jd D ƒˆ _dˆ jd< ˆ jtˆ jƒks8J ‚ˆ jd= ˆ jdkˆ _ˆ jd usIJ ‚ˆ jˆ _	ˆ j	 
ˆ jd ¡ dˆ _dˆ _dˆ _d S )	Nz(Image appears to be a malformed MPO filer*   c                   s   g | ]}|d  ˆ j d  ‘qS )Z
DataOffsetÚmpoffset)Úinfo)r   ZmpentrH   r   r   Ú
<listcomp>w   s    ÿz1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r,   r   rL   r   )Z_getmpZmpinfoÚ
ValueErrorr   Ú_MpoImageFile__mpoffsetsr6   rM   r   r   Ú_fpr;   Ú_MpoImageFile__frameÚoffsetÚreadonly)rI   rJ   Úmsgr   rH   r   rG   q   s$   

ÿ

zMpoImageFile._after_jpeg_openÚposÚintc                 C  s$   t | jtƒr
| jj‚| j |¡ d S r   )r4   rQ   r   Úexr;   )rI   rV   r   r   r   Ú	load_seekˆ   s   zMpoImageFile.load_seekÚframec                 C  sà   |   |¡sd S t| jtƒr| jj‚| j| _| j| | _| j 	d¡}d| jv r*| jd= | j 
| jd ¡ | j d¡s?d}t|ƒ‚| j 
| j¡ tj | ¡ | j 	d¡|krX|  ¡  t dd| j | j| jd d ¡g| _|| _d S )Nr'   é   zNo data found for frameZjpeg)r   r   r   r)   )Z_seek_checkr4   rQ   r   rX   r   rP   rS   rM   r/   r;   ÚreadrO   r
   rE   rF   Z_reload_exifr   Z_TilerB   ZtilerR   )rI   rZ   Zoriginal_exifrU   r   r   r   r;   �   s(   

 ÿ
zMpoImageFile.seekc                 C  s   | j S r   )rR   rH   r   r   r   r8   §   s   zMpoImageFile.tellÚjpeg_instanceúJpegImagePlugin.JpegImageFilec                 C  s   t | _tt | ƒ}| |¡ |S )aC  
        Transform the instance of JpegImageFile into
        an instance of MpoImageFile.
        After the call, the JpegImageFile is extended
        to be an MpoImageFile.

        This is essentially useful when opening a JPEG
        file that reveals itself as an MPO, to avoid
        double call to _open.
        N)rD   Ú	__class__r   rG   )r]   rJ   Zmpo_instancer   r   r   Úadoptª   s   

zMpoImageFile.adopt)r   r   r   )rJ   rK   r   r   )rV   rW   r   r   )rZ   rW   r   r   )r   rW   )r]   r^   rJ   rK   r   rD   )Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingrF   rG   rY   r;   r8   Ústaticmethodr`   r   r   r   r   rD   f   s    



þrD   z.mpoz	image/mpo)r   r   r   r   r   r   r   r   )Ú
__future__r   r=   r2   Útypingr   r   r   Ú r   r   r	   r
   r   Ú_binaryr   Z_utilr   r   rC   rE   rD   Zregister_saverd   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   Ú<module>   s   

=`