a
    AgL                     @  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 ddl	m
Z
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Anycast   )Image	ImageFile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/lab.imftr.de/x/nb_venv/lib/python3.9/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 ]}|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    



r7   c                   @  s~   e Zd ZdZdZdZddddZdd	d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	d 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   r0   r
   JpegImageFile_open_after_jpeg_openselfr   r   r   r:   d   s    zMpoImageFile._openNzdict[int, Any] | None)mpheaderr   c                   s   |d ur|n    _ jd u r,d}t| jd  _ fdd jd D  _d jd<  jt jkspJ  jd=  jdk _ j _	 j	
 jd  d _d _d _d S )	Nz(Image appears to be a malformed MPO filer   c                   s   g | ]}|d   j d  qS )Z
DataOffsetmpoffset)info).0Zmpentr<   r   r   
<listcomp>o   s   z1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r    r   r?   r   )Z_getmpZmpinfo
ValueErrorZn_frames_MpoImageFile__mpoffsetsr+   r@   r   r   _fpr0   _MpoImageFile__frameoffsetreadonly)r=   r>   msgr   r<   r   r;   i   s"    


zMpoImageFile._after_jpeg_openint)posr   c                 C  s   | j | d S r   )rE   r0   )r=   rK   r   r   r   	load_seek   s    zMpoImageFile.load_seek)framer   c                 C  s   |  |sd S | j| _| j| | _| jd}d| jv r@| jd= | j| jd  | jdsjd}t	|| j| j t
j|  | jd|kr|   tdd| j | j| jd d g| _|| _d S )Nr      zNo data found for frameZjpeg)r   r   r   r   )Z_seek_checkrE   r   rD   rG   r@   r"   r0   readrC   r
   r9   r:   Z_reload_exifr   Z_Tiler6   ZtilerF   )r=   rM   Zoriginal_exifrI   r   r   r   r0      s$    

 zMpoImageFile.seekc                 C  s   | j S r   )rF   r<   r   r   r   r-      s    zMpoImageFile.tellzJpegImagePlugin.JpegImageFile)jpeg_instancer>   r   c                 C  s   t | _t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.
        )r8   	__class__r   r;   )rP   r>   Zmpo_instancer   r   r   adopt   s    

zMpoImageFile.adopt)N)N)__name__
__module____qualname__formatformat_descriptionZ!_close_exclusive_fp_after_loadingr:   r;   rL   r0   r-   staticmethodrR   r   r   r   r   r8   _   s    r8   z.mpoz	image/mpo)
__future__r   r$   r2   r'   typingr   r   r    r   r   r	   r
   r   _binaryr   r   r7   r9   r8   Zregister_saverV   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s   6Z