U
    eo                     @  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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 )    )annotationsN   )ExifTagsImage	ImageFileImageSequenceJpegImagePluginTiffImagePlugin)i16be)o32lec                 C  s   t | || d S N)r   _save)imfpfilename r   T/var/www/html/StaffProfile/newvenv/lib/python3.8/site-packages/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 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||| ||  qn||d || |d   qnq`t }
d|
d< t||
d< d}d}t|D ]P\}}|dkrZd}nd}|t	
d|||dd7 }|dkr||8 }||7 }qB||
d< || |dtd |
d  |dtj d S )Nappend_imagesF   s   z>HX   s   MPF sR                                                                                     extraexif   ZJPEGs   0100i         r   i   z<LLLHH  s   II*    )Zencoderinfogetis_animatedAttributeErrorr   	itertoolschainr   Iteratorstructpack
isinstancer   Exiftobyteslenr   appendtellsaver	   ZImageFileDirectory_v2	enumerateseekwriter   osSEEK_END)r   r   r   r   ZanimatedZ
mpf_offsetoffsetsZ
imSequenceZim_framer   ZifdZ	mpentriesZdata_offsetisizemptyper   r   r   	_save_all*   sV    





r6   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   r9   j   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mpentr;   r   r   
<listcomp>s   s    z1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r   r   r=   r   )r4   _initial_sizeZ_getmpmpinfoZn_frames_MpoImageFile__mpoffsetsr)   AssertionErrorr>   r   r   _fpr.   _MpoImageFile__frameoffsetreadonly)r<   mpheaderr   r;   r   r:   o   s    

zMpoImageFile._after_jpeg_openc                 C  s   | j | d S r   )rE   r.   )r<   posr   r   r   	load_seek   s    zMpoImageFile.load_seekc                 C  s.  |  |sd S | j| _| j| | _| j| jd  | jd}|sPd}t|| j| _	t
|dkrt
| jdd }t| j|| jd< |   | jd | d d }|dr|  tjj}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  r   r   	AttributeZMPTypezLarge Thumbnaili  i  Zjpeg)r   r    )Z_seek_checkrE   r   rC   rG   r.   read
ValueErrorrA   _sizei16r   
_safe_readr>   Z_reload_exifrB   
startswithZgetexifZget_ifdr   ZIFDr'   r4   modeZtilerF   )r<   framesegmentmsgnr5   r   r   r   r   r.      s0    

zMpoImageFile.seekc                 C  s   | j S r   )rF   r;   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.
        )r7   	__class__r:   )Zjpeg_instancerI   r   r   r   adopt   s    
zMpoImageFile.adopt)N)N)__name__
__module____qualname__formatformat_descriptionZ!_close_exclusive_fp_after_loadingr9   r:   rK   r.   r+   staticmethodr[   r   r   r   r   r7   e   s   
r7   z.mpoz	image/mpo)
__future__r   r!   r0   r$   rN   r   r   r   r   r   r	   _binaryr
   rR   r   r   r6   r8   r7   Zregister_saver_   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s    ;Y