o
    >eo                     @  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m	Z	m
Z
mZ ddlmZ ddlmZ dd Z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   )ExifTagsImage	ImageFileImageSequenceJpegImagePluginTiffImagePlugin)i16be)o32lec                 C  s   t | || d S N)r   _save)imfpfilename r   S/var/www/html/humari/django-venv/lib/python3.10/site-packages/PIL/MpoImagePlugin.pyr   &   s   r   c              
   C  s  | j dg }|s$z| j}W n ty   d}Y nw |s$t| || d S d}g }t| g|D ]Z}t|D ]R}|swdt	
dd d d |j d	< |j d
}	t|	tjr^|	 }	|	|j d
< |	rh|dt|	 7 }t||| ||  q6||d || |d   q6q/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_imagesF   s   z>HX   s   MPF sR                                                                                     extraexif   JPEGs   0100i         r   i   z<LLLHH  s   II*    )encoderinfogetis_animatedAttributeErrorr   	itertoolschainr   Iteratorstructpack
isinstancer   Exiftobyteslenr   appendtellsaver	   ImageFileDirectory_v2	enumerateseekwriter   osSEEK_END)r   r   r   r   animated
mpf_offsetoffsets
imSequenceim_framer   ifd	mpentriesdata_offsetisizemptyper   r   r   	_save_all*   sZ   



r@   c                   @  sP   e Zd ZdZdZdZdd ZdddZd	d
 Zdd Z	dd Z
edddZdS )MpoImageFileMPOzMPO (CIPA DC-007)Fc                 C  s$   | j d tj|  |   d S )Nr   )r   r1   r   JpegImageFile_open_after_jpeg_openselfr   r   r   rD   j   s   zMpoImageFile._openNc                   s    j  _|d ur
|n   _ jd  _ fdd jd D  _d jd<  jt jks1J  jd=  jdk _ j	 _
 j
 jd  d _d _d _d S )Nr   c                   s   g | ]}|d   j d  qS )
DataOffsetmpoffset)info).0mpentrF   r   r   
<listcomp>s   s    z1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r   r   rI   r   )r>   _initial_size_getmpmpinfon_frames_MpoImageFile__mpoffsetsr+   rJ   r!   r   _fpr1   _MpoImageFile__frameoffsetreadonly)rG   mpheaderr   rF   r   rE   o   s   


zMpoImageFile._after_jpeg_openc                 C  s   | j | d S r   )rS   r1   )rG   posr   r   r   	load_seek   s   zMpoImageFile.load_seekc                 C  s,  |  |sd S | j| _| j| | _| j| jd  | jd}|s(d}t|| j| _	t
|dkrut
| jdd }t| j|| jd< |   | jd | d d }|drt|  tjj}d	|v rtd
|v rt|d	 |d
 f| _	nd| jv r| jd= |   dd| j | j| jdffg| _|| _d S )N   zNo data found for framei  r   r   	AttributeMPTypezLarge Thumbnaili  i  jpeg)r   r    )_seek_checkrS   r   rR   rU   r1   read
ValueErrorrN   _sizei16r   
_safe_readrJ   _reload_exifrP   
startswithgetexifget_ifdr   IFDr)   r>   modetilerT   )rG   framesegmentmsgnr?   r   r   r   r   r1      s2   



zMpoImageFile.seekc                 C  s   | j S r   )rT   rF   r   r   r   r-      s   zMpoImageFile.tellc                 C  s   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__rE   )jpeg_instancerW   r   r   r   adopt   s   
zMpoImageFile.adoptr   )__name__
__module____qualname__formatformat_description!_close_exclusive_fp_after_loadingrD   rE   rY   r1   r-   staticmethodrr   r   r   r   r   rA   e   s    
rA   z.mpoz	image/mpo)
__future__r   r#   r3   r&   r^   r   r   r   r   r   r	   _binaryr
   rc   r   r   r@   rC   rA   register_saverv   register_save_allregister_extensionregister_mimer   r   r   r   <module>   s    ;Y