o
    _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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)DeferredErrorimImage.Imagefp	IO[bytes]filenamestr | bytesreturnNonec                 C  s   t | || d S N)r
   _save)r   r   r    r   F/var/www/html/myenv/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 }| g|}tdd |D }|D ]l}t|D ]d}	|s}dd|  }
d	td
d|
  d d|
  |	j d< |	j d}t	|t
jrd| }||	j d< |rn|dt| 7 }t|	|| ||  q2|	| }|	|d ||	_ || |d   q2q+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   c                 s  s    | ]	}t |d dV  qdS )n_framesr   N)getattr).0seqr   r   r   	<genexpr>2   s    z_save_all.<locals>.<genexpr>B      s   z>H   s   MPF     extraexif   JPEGs   0100i         r   i   z<LLLHH  s   II*    )encoderinfogetr   r   sumr	   Iteratorstructpack
isinstancer   Exiftobyteslenr
   appendtell_attach_default_encoderinfosaver   ImageFileDirectory_v2	enumerateseekwriter   osSEEK_END)r   r   r   r   
mpf_offsetoffsetsim_sequencestotalim_sequenceim_frame
ifd_lengthr'   r/   ifd	mpentriesdata_offsetisizemptyper   r   r   	_save_all)   sd   




rP   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   r?   r
   JpegImageFile_open_after_jpeg_openselfr   r   r   rT   l   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)r   mpentrV   r   r   
<listcomp>w   s    z1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r-   r   r[   r   )_getmpmpinfo
ValueErrorr   _MpoImageFile__mpoffsetsr8   r\   r   r   _fpr?   _MpoImageFile__frameoffsetreadonly)rW   rX   msgr   rV   r   rU   q   s"   



zMpoImageFile._after_jpeg_openposintc                 C  s$   t | jtr
| jj| j| d S r   )r5   rc   r   exr?   )rW   rh   r   r   r   	load_seek   s   zMpoImageFile.load_seekframec                 C  s   |  |sd S t| jtr| jj| j| _| j| | _| j	d}d| jv r*| jd= | j
| jd  | jds?d}t|| j
| j tj|  | j	d|krX|   tdd| j | j| jd d g| _|| _d S )Nr'      zNo data found for framejpeg)r   r   r   r*   )_seek_checkr5   rc   r   rj   r   rb   re   r\   r0   r?   readra   r
   rS   rT   _reload_exifr   _TilerN   tilerd   )rW   rl   original_exifrg   r   r   r   r?      s(   

 
zMpoImageFile.seekc                 C  s   | j S r   )rd   rV   r   r   r   r:      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.
        )rQ   	__class__r   rU   )ru   rX   mpo_instancer   r   r   adopt   s   

zMpoImageFile.adopt)r   r   r   )rX   rY   r   r   )rh   ri   r   r   )rl   ri   r   r   )r   ri   )ru   rv   rX   rY   r   rQ   )__name__
__module____qualname__formatformat_description!_close_exclusive_fp_after_loadingrT   rU   rk   r?   r:   staticmethodry   r   r   r   r   rQ   g   s    



rQ   z.mpoz	image/mpo)r   r   r   r   r   r   r   r   )
__future__r   rA   r3   typingr   r   r    r   r   r	   r
   r   _binaryr   _utilr   r   rP   rS   rQ   register_saver}   register_save_allregister_extensionregister_mimer   r   r   r   <module>   s   

>^