U
    M»{j×  ã                   @  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	d
dœdd„Zddd	d
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)Úo32lezImage.Imagez	IO[bytes]zstr | bytesÚNone)ÚimÚfpÚfilenameÚreturnc                 C  s   t  | ||¡ d S ©N)r   Ú_save)r   r   r   © r   úQ/var/www/html/bwave/python/venv/lib/python3.8/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 ]´}t |¡D ]¤}|sÔdt 	dd¡ d d	 |j d
< |j  d¡}t
|tjƒr¢| ¡ }||j d< |r¶|dt|ƒ 7 }t |||¡ | | ¡ ¡ qR| |d¡ | | ¡ |d  ¡ qRqDt ¡ }	d|	d< t|ƒ|	d< d}
d}t|ƒD ]P\}}|dk�r>d}nd}|
t 	d|||dd¡7 }
|dk�rl||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(   sL    ÿ



r4   c                   @  sl   e Zd ZdZdZdZddœdd„Zdd	d
„Zdddœdd„Zdddœdd„Z	ddœdd„Z
e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   r-   r   ÚJpegImageFileÚ_openÚ_after_jpeg_open©Úselfr   r   r   r7   c   s    zMpoImageFile._openNc                   sž   |d k	r|nˆ   ¡ ˆ _ˆ jd ˆ _‡ fdd„ˆ jd D ƒˆ _dˆ jd< ˆ jtˆ jƒksZt‚ˆ jd= ˆ jdkˆ _ˆ jˆ _	ˆ j	 
ˆ jd ¡ dˆ _dˆ _dˆ _d S )Nr   c                   s   g | ]}|d  ˆ j d  ‘qS )Z
DataOffsetÚmpoffset)Úinfo)Ú.0Zmpentr9   r   r   Ú
<listcomp>k   s    z1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r   r   r;   r   )Z_getmpZmpinfoZn_framesÚ_MpoImageFile__mpoffsetsr(   ÚAssertionErrorr<   r   r   Ú_fpr-   Ú_MpoImageFile__frameÚoffsetÚreadonly)r:   Úmpheaderr   r9   r   r8   h   s    
ÿ
zMpoImageFile._after_jpeg_openÚint)Úposr   c                 C  s   | j  |¡ d S r   )rA   r-   )r:   rG   r   r   r   Ú	load_seek{   s    zMpoImageFile.load_seek)Úframer   c                 C  sÈ   |   |¡sd S | j| _| j| | _| j d¡}d| jkr@| jd= | j | jd ¡ | j d¡sjd}t	|ƒ‚| j | j¡ t
j | ¡ | j d¡|krœ|  ¡  dd| j | j| jd d fg| _|| _d S )Nr   é   zNo data found for frameZjpeg)r   r   r   r   )Z_seek_checkrA   r   r?   rC   r<   r   r-   ÚreadÚ
ValueErrorr   r6   r7   Z_reload_exifr3   ZtilerB   )r:   rI   Zoriginal_exifÚmsgr   r   r   r-   ~   s"    

"zMpoImageFile.seekc                 C  s   | j S r   )rB   r9   r   r   r   r*   ”   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.
        )r5   Ú	__class__r8   )Zjpeg_instancerE   r   r   r   Úadopt—   s    
zMpoImageFile.adopt)N)N)Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingr7   r8   rH   r-   r*   ÚstaticmethodrO   r   r   r   r   r5   ^   s   
r5   z.mpoz	image/mpo)Ú
__future__r   r!   r/   r$   Útypingr   Ú r   r   r   r   Ú_binaryr	   r   r4   r6   r5   Zregister_saverS   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   Ú<module>   s   6Q