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   X/home/www/facesmatcher.com/frenv_anti/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   ZJPEGs   0100i         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)   sd   




rC   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 )!MpoImageFileZ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   rF   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 )Z
DataOffsetmpoffset)info)r   ZmpentrH   r   r   
<listcomp>w   s    z1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r,   r   rL   r   )Z_getmpZmpinfo
ValueErrorr   _MpoImageFile__mpoffsetsr6   rM   r   r   _fpr;   _MpoImageFile__frameoffsetreadonly)rI   rJ   msgr   rH   r   rG   q   s"   



zMpoImageFile._after_jpeg_openposintc                 C  s$   t | jtr
| jj| j| d S r   )r4   rQ   r   exr;   )rI   rV   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 frameZjpeg)r   r   r   r)   )Z_seek_checkr4   rQ   r   rX   r   rP   rS   rM   r/   r;   readrO   r
   rE   rF   Z_reload_exifr   Z_TilerB   ZtilerR   )rI   rZ   Zoriginal_exifrU   r   r   r   r;      s(   

 
zMpoImageFile.seekc                 C  s   | j S r   )rR   rH   r   r   r   r8      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.
        )rD   	__class__r   rG   )r]   rJ   Zmpo_instancer   r   r   adopt   s   

zMpoImageFile.adopt)r   r   r   )rJ   rK   r   r   )rV   rW   r   r   )rZ   rW   r   r   )r   rW   )r]   r^   rJ   rK   r   rD   )__name__
__module____qualname__formatformat_descriptionZ!_close_exclusive_fp_after_loadingrF   rG   rY   r;   r8   staticmethodr`   r   r   r   r   rD   g   s    



rD   z.mpoz	image/mpo)r   r   r   r   r   r   r   r   )
__future__r   r=   r2   typingr   r   r    r   r   r	   r
   r   _binaryr   Z_utilr   r   rC   rE   rD   Zregister_saverd   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   <module>   s   

>^