o
    ™h	  ã                   @  sÎ   d dl m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
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   úE/var/www/html/venv/lib/python3.10/site-packages/PIL/MpoImagePlugin.pyr   &   s   r   c              
   C  s²  | j  dg ¡}|st| ddƒst| ||ƒ d S d}g }t | g|¡D ]Z}t |¡D ]R}|sjdt 	dd¡ d d	 |j d
< |j  d¡}t
|tjƒrQ| ¡ }||j d< |r[|dt|ƒ 7 }t |||¡ | | ¡ ¡ q)| |d¡ | | ¡ |d  ¡ q)q"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é   s   ÿâz>HéX   s   MPF sR                                                                                     ÚextraÚexifé   ZJPEGéÿÿÿÿs   0100i °  é°  ó    r   i   z<LLLHHé°  s   II* é   )ZencoderinfoÚgetÚgetattrr   Ú	itertoolsÚchainr	   ÚIteratorÚstructÚpackÚ
isinstancer   ZExifÚtobytesÚlenr
   ÚappendÚtellÚsaver   ZImageFileDirectory_v2Ú	enumerateÚseekÚwriter   ÚosÚSEEK_END)r   r   r   r   Z
mpf_offsetÚoffsetsZ
imSequenceZim_framer   ZifdZ	mpentriesZdata_offsetÚiÚsizeZmptyper   r   r   Ú	_save_all*   sN   ÿ
ï

r;   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  s$   | j  d¡ tj | ¡ |  ¡  d S )Nr   )r   r4   r
   ÚJpegImageFileÚ_openÚ_after_jpeg_open©Úselfr   r   r   r>   e   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ˆ _	ˆ 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)Ú.0Zmpentr@   r   r   Ú
<listcomp>p   s    ÿz1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r$   r   rD   r   )Z_getmpZmpinfoÚ
ValueErrorZn_framesÚ_MpoImageFile__mpoffsetsr/   rE   r   r   Ú_fpr4   Ú_MpoImageFile__frameÚoffsetÚreadonly)rA   rB   Úmsgr   r@   r   r?   j   s"   

ÿ

zMpoImageFile._after_jpeg_openÚposÚintc                 C  s$   t | jtƒr
| jj‚| j |¡ d S r   )r-   rJ   r   Úexr4   )rA   rO   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_checkr-   rJ   r   rQ   r   rI   rL   rE   r&   r4   ÚreadrH   r
   r=   r>   Z_reload_exifr   Z_Tiler:   ZtilerK   )rA   rS   Zoriginal_exifrN   r   r   r   r4   …   s(   

 ÿ
zMpoImageFile.seekc                 C  s   | j S r   )rK   r@   r   r   r   r1   Ÿ   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.
        )r<   Ú	__class__r   r?   )rV   rB   Zmpo_instancer   r   r   Úadopt¢   s   

zMpoImageFile.adopt)r   r   r   )rB   rC   r   r   )rO   rP   r   r   )rS   rP   r   r   )r   rP   )rV   rW   rB   rC   r   r<   )Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingr>   r?   rR   r4   r1   ÚstaticmethodrY   r   r   r   r   r<   `   s    



þr<   z.mpoz	image/mpo)r   r   r   r   r   r   r   r   )Ú
__future__r   r(   r6   r+   Útypingr   r   r   Ú r   r   r	   r
   r   Ú_binaryr   Z_utilr   r   r;   r=   r<   Zregister_saver]   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   Ú<module>   s   

6^