o
    6>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Z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imImage.Imagefp	IO[bytes]filenamestr | bytesreturnNonec                 C  s   t | || d S N)r
   _save)r   r   r    r   E/var/www/html/venv/lib/python3.10/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 ]Z}t|D ]R}|sjdt	dd d d	 |j d
< |j d}t
|tjrQ| }||j d< |r[|dt| 7 }t||| ||  q)||d || |d   q)q"t }	d|	d< t||	d< d}
d}t|D ]%\}}|dkrd}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   s   z>HX   s   MPF sR                                                                                     extraexif   JPEGs   0100i         r   i   z<LLLHH  s   II*    )encoderinfogetgetattrr   	itertoolschainr	   Iteratorstructpack
isinstancer   Exiftobyteslenr
   appendtellsaver   ImageFileDirectory_v2	enumerateseekwriter   osSEEK_END)r   r   r   r   
mpf_offsetoffsets
imSequenceim_framer   ifd	mpentriesdata_offsetisizemptyper   r   r   	_save_all)   sN   


rE   c                   @  s^   e Zd ZdZdZdZdddZddddZdddZdddZ	dddZ
e	dd ddZdS )!MpoImageFileMPOzMPO (CIPA DC-007)Fr   r   c                 C  s$   | j d tj|  |   d S )Nr   )r   r7   r
   JpegImageFile_open_after_jpeg_openselfr   r   r   rI   d   s   zMpoImageFile._openNmpheaderdict[int, Any] | Nonec                   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s8J  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 )
DataOffsetmpoffset)info).0mpentrK   r   r   
<listcomp>o   s    z1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r$   r   rP   r   )_getmpmpinfo
ValueErrorn_frames_MpoImageFile__mpoffsetsr1   rQ   r   r   _fpr7   _MpoImageFile__frameoffsetreadonly)rL   rM   msgr   rK   r   rJ   i   s"   



zMpoImageFile._after_jpeg_openposintc                 C  s   | j | d S r   )rZ   r7   )rL   r_   r   r   r   	load_seek   s   zMpoImageFile.load_seekframec                 C  s   |  |sd S | j| _| j| | _| jd}d| jv r | jd= | j| jd  | jds5d}t	|| j| j t
j|  | jd|krN|   tdd| j | j| jd d g| _|| _d S )Nr      zNo data found for framejpeg)r   r   r   r!   )_seek_checkrZ   r   rY   r\   rQ   r'   r7   readrW   r
   rH   rI   _reload_exifr   _TilerC   tiler[   )rL   rb   original_exifr^   r   r   r   r7      s$   

 
zMpoImageFile.seekc                 C  s   | j S r   )r[   rK   r   r   r   r3      s   zMpoImageFile.telljpeg_instanceJpegImagePlugin.JpegImageFilec                 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.
        )rF   	__class__r   rJ   )rk   rM   mpo_instancer   r   r   adopt   s   

zMpoImageFile.adopt)r   r   r   )rM   rN   r   r   )r_   r`   r   r   )rb   r`   r   r   )r   r`   )rk   rl   rM   rN   r   rF   )__name__
__module____qualname__formatformat_description!_close_exclusive_fp_after_loadingrI   rJ   ra   r7   r3   staticmethodro   r   r   r   r   rF   _   s    



rF   z.mpoz	image/mpo)r   r   r   r   r   r   r   r   )
__future__r   r)   r9   r,   typingr   r   r    r   r   r	   r
   r   _binaryr   r   rE   rH   rF   register_savers   register_save_allregister_extensionregister_mimer   r   r   r   <module>   s   

6Z