a
    hB                     @  s   d dl m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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)o32le)DeferredErrorzImage.Imagez	IO[bytes]zstr | bytesNone)imfpfilenamereturnc                 C  s   t | || d S N)r
   _save)r   r   r    r   @/var/www/auris/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 }| g|}tdd |D }|D ]}t|D ]}	|sdd|  }
d	td
d|
  d d|
  |	j d< |	j d}t	|t
jr| }||	j d< |r|dt| 7 }t|	|| ||  qd|	| }|	|d ||	_ || |d   qdqVt }d|d< t||d< d}d}t|D ]P\}}|dkrtd}nd}|td|||dd7 }|dkr||8 }||7 }q\||d< || |dtd |d  |dtj d S )Nappend_imagesis_animatedF   c                 s  s   | ]}t |d dV  qdS )n_framesr   N)getattr).0seqr   r   r   	<genexpr>2       z_save_all.<locals>.<genexpr>B      s   z>H   s   MPF     extraexif   ZJPEGs   0100i     r   r   i   z<LLLHH  s   II*    )encoderinfogetr   r   sumr	   Iteratorstructpack
isinstancer   ZExiftobyteslenr
   appendtellZ_attach_default_encoderinfosaver   ZImageFileDirectory_v2	enumerateseekwriter   osSEEK_END)r   r   r   r   Z
mpf_offsetoffsetsZim_sequencestotalZim_sequenceZim_frameZ
ifd_lengthr%   r+   ZifdZ	mpentriesZdata_offsetisizeZmptyper   r   r   	_save_all)   sb    





r@   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   r8   r
   JpegImageFile_open_after_jpeg_openselfr   r   r   rC   l   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)r   ZmpentrE   r   r   
<listcomp>w   s   z1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r)   r   rH   r   )Z_getmpZmpinfo
ValueErrorr   _MpoImageFile__mpoffsetsr3   rI   r   r   _fpr8   _MpoImageFile__frameoffsetreadonly)rF   rG   msgr   rE   r   rD   q   s"    


zMpoImageFile._after_jpeg_openint)posr   c                 C  s$   t | jtr| jj| j| d S r   )r1   rM   r   exr8   )rF   rS   r   r   r   	load_seek   s    zMpoImageFile.load_seek)framer   c                 C  s   |  |sd S t| jtr"| jj| j| _| j| | _| j	d}d| jv rT| jd= | j
| jd  | jds~d}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_checkr1   rM   r   rT   r   rL   rO   rI   r,   r8   readrK   r
   rB   rC   Z_reload_exifr   Z_Tiler?   ZtilerN   )rF   rV   Zoriginal_exifrQ   r   r   r   r8      s(    

 zMpoImageFile.seekc                 C  s   | j S r   )rN   rE   r   r   r   r5      s    zMpoImageFile.tellzJpegImagePlugin.JpegImageFile)jpeg_instancerG   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.
        )rA   	__class__r   rD   )rY   rG   Zmpo_instancer   r   r   adopt   s    

zMpoImageFile.adopt)N)N)__name__
__module____qualname__formatformat_descriptionZ!_close_exclusive_fp_after_loadingrC   rD   rU   r8   r5   staticmethodr[   r   r   r   r   rA   g   s    rA   z.mpoz	image/mpo)
__future__r   r:   r/   typingr   r   r    r   r   r	   r
   r   _binaryr   Z_utilr   r   r@   rB   rA   Zregister_saver_   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s   >^