o
    ‡®f×  ã                   @  s¶   d dl mZ d dlZd dlZd dlZd dlmZ ddlmZm	Z	m
Z
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é   )ÚImageÚImageSequenceÚJpegImagePluginÚTiffImagePlugin)Úo32leÚimúImage.ImageÚfpú	IO[bytes]Úfilenameústr | bytesÚreturnÚNonec                 C  s   t  | ||¡ d S ©N)r   Ú_save)r
   r   r   © r   úK/home/ubuntu/webapp/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é   ÚJPEGéÿÿÿÿs   0100i °  é°  ó    r   i   z<LLLHHé°  s   II* é   )ÚencoderinfoÚgetÚgetattrr   Ú	itertoolsÚchainr   ÚIteratorÚstructÚpackÚ
isinstancer   ÚExifÚtobytesÚlenr   ÚappendÚtellÚsaver   ÚImageFileDirectory_v2Ú	enumerateÚseekÚwriter	   ÚosÚSEEK_END)r
   r   r   r   Ú
mpf_offsetÚoffsetsÚ
imSequenceÚim_framer   ÚifdÚ	mpentriesÚdata_offsetÚiÚsizeÚmptyper   r   r   Ú	_save_all(   sN   ÿ
ï

rB   c                   @  sX   e Zd ZdZdZdZddd„Zdd	d
„Zddd„Zddd„Z	ddd„Z
eddd„ƒZdS )ÚMpoImageFileÚ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   rF   c   s   zMpoImageFile._openNc                   sž   |d ur|nˆ   ¡ ˆ _ˆ jd ˆ _‡ fdd„ˆ jd D ƒˆ _dˆ jd< ˆ jtˆ jƒks-J ‚ˆ jd= ˆ jdkˆ _ˆ jˆ _ˆ j 	ˆ jd ¡ dˆ _
dˆ _dˆ _d S )Nr   c                   s   g | ]}|d  ˆ j d  ‘qS )Ú
DataOffsetÚmpoffset)Úinfo)Ú.0ÚmpentrH   r   r   Ú
<listcomp>k   s    ÿz1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r!   r   rK   r   )Ú_getmpÚmpinfoÚn_framesÚ_MpoImageFile__mpoffsetsr.   rL   r   r   Ú_fpr4   Ú_MpoImageFile__frameÚoffsetÚreadonly)rI   Úmpheaderr   rH   r   rG   h   s   
ÿ

zMpoImageFile._after_jpeg_openÚposÚintc                 C  s   | j  |¡ d S r   )rT   r4   )rI   rY   r   r   r   Ú	load_seek{   s   zMpoImageFile.load_seekÚframec                 C  sÈ   |   |¡sd S | j| _| j| | _| j d¡}d| jv r | jd= | j | jd ¡ | j d¡s5d}t	|ƒ‚| j | j¡ t
j | ¡ | j d¡|krN|  ¡  dd| j | j| jd d fg| _|| _d S )Nr   é   zNo data found for frameÚjpeg)r   r   r   r   )Ú_seek_checkrT   r   rS   rV   rL   r$   r4   ÚreadÚ
ValueErrorr   rE   rF   Ú_reload_exifr@   ÚtilerU   )rI   r\   Úoriginal_exifÚmsgr   r   r   r4   ~   s"   

"
zMpoImageFile.seekc                 C  s   | j S r   )rU   rH   r   r   r   r0   ”   s   zMpoImageFile.tellc                 C  s   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.
        )rC   Ú	__class__rG   )Újpeg_instancerX   r   r   r   Úadopt—   s   
zMpoImageFile.adopt)r   r   r   )rY   rZ   r   r   )r\   rZ   r   r   )r   rZ   )Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionÚ!_close_exclusive_fp_after_loadingrF   rG   r[   r4   r0   Ústaticmethodrh   r   r   r   r   rC   ^   s    




rC   z.mpoz	image/mpo)r
   r   r   r   r   r   r   r   )Ú
__future__r   r&   r6   r)   Útypingr   Ú r   r   r   r   Ú_binaryr	   r   rB   rE   rC   Úregister_saverl   Úregister_save_allÚregister_extensionÚregister_mimer   r   r   r   Ú<module>   s   

6Q