U
    Qtc                     @   s   d dl Z d dlZd dl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 Z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 )    N   )Image	ImageFileImageSequenceJpegImagePluginTiffImagePlugin)i16be)o32lec                 C   s   t | || d S N)r   _save)imfpfilename r   6/tmp/pip-unpacked-wheel-h5vj885l/PIL/MpoImagePlugin.pyr   !   s    r   c              
   C   s  | j dg }|sJz
| j}W n tk
r4   d}Y nX |sJt| || d S g }t| g|D ]v}t|D ]f}|sdt	
dd d d | j d< t||| ||  qj||d	 || |d
   qjq\t }t||d< d}	d}
t|D ]N\}}|dkrd}nd}|	t	
d|||
dd7 }	|dkr>|
d8 }
|
|7 }
q|	|d< |d |dtd |d  |dtj d S )Nappend_imagesFs   z>HL   s   MPF sF                                                                         extraZJPEG      r   i   z<LLLHH     s   II*    )Zencoderinfogetis_animatedAttributeErrorr   	itertoolschainr   Iteratorstructpackr   appendtellsaver   ZImageFileDirectory_v2len	enumerateseekwriter	   tobytesosSEEK_END)r   r   r   r   ZanimatedoffsetsZ
imSequenceZim_frameZifdZ	mpentriesZdata_offsetisizemptyper   r   r   	_save_all%   sF    





r0   c                   @   sP   e Zd ZdZdZdZdd ZdddZd	d
 Zdd Z	dd Z
edddZdS )MpoImageFileZMPOzMPO (CIPA DC-007)Fc                 C   s$   | j d tj|  |   d S )Nr   )r   r'   r   JpegImageFile_open_after_jpeg_openselfr   r   r   r3   ]   s    zMpoImageFile._openNc                    s    j  _|d k	r|n   _ jd  _ fdd jd D  _d jd<  jt jksbt 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mpentr5   r   r   
<listcomp>f   s    z1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r   r   r7   r   )r.   _initial_sizeZ_getmpmpinfoZn_frames_MpoImageFile__mpoffsetsr%   AssertionErrorr8   r   r   _fpr'   _MpoImageFile__frameoffsetreadonly)r6   mpheaderr   r5   r   r4   b   s    

zMpoImageFile._after_jpeg_openc                 C   s   | j | d S r
   )r?   r'   )r6   posr   r   r   	load_seekv   s    zMpoImageFile.load_seekc                 C   s$  |  |sd S | j| _| j| | _| j| jd  | jd}|sLtd| j| _	t
|dkrt
| jdd }t| j|| jd< |   | jd | d d }|dr|  d	}d
|krd|kr|d
 |d f| _	nd| jkr| jd= |   dd| j | j| jdffg| _|| _d S )N   zNo data found for framei  exifr   	AttributeZMPTypezLarge Thumbnailii  i  i  Zjpeg)r   r    )Z_seek_checkr?   r   r=   rA   r'   read
ValueErrorr;   _sizei16r   
_safe_readr8   Z_reload_exifr<   
startswithZgetexifZget_ifdr.   modeZtiler@   )r6   framesegmentnr/   rG   r   r   r   r'   y   s.    


zMpoImageFile.seekc                 C   s   | j S r
   )r@   r5   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.
        )r1   	__class__r4   )Zjpeg_instancerC   r   r   r   adopt   s    
zMpoImageFile.adopt)N)N)__name__
__module____qualname__formatformat_descriptionZ!_close_exclusive_fp_after_loadingr3   r4   rE   r'   r#   staticmethodrU   r   r   r   r   r1   W   s   
r1   z.mpoz	image/mpo)r   r*   r    rI   r   r   r   r   r   _binaryr   rM   r	   r   r0   r2   r1   Zregister_saverY   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s   2Y