U
    
3g                     @  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   6/tmp/pip-unpacked-wheel-tbvhwjp8/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 ]}|sd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>HX   s   MPF sR                                                                                     extraexif   ZJPEGs   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