o
    ]oio  ã                   @  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   úZ/var/www/html/kuke-dev/django-kuke/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r«d}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>HéX   s   MPF sR                                                                                     ÚextraÚexifé   ZJPEGéÿÿÿÿs   0100i °  é°  ó    r   i   z<LLLHHé°  s   II* é   )ZencoderinfoÚgetÚis_animatedÚAttributeErrorr   Ú	itertoolsÚchainr   ÚIteratorÚstructÚpackÚ
isinstancer   ÚExifÚtobytesÚlenr   ÚappendÚtellÚsaver	   ZImageFileDirectory_v2Ú	enumerateÚseekÚwriter   ÚosÚSEEK_END)r   r   r   r   ZanimatedZ
mpf_offsetÚoffsetsZ
imSequenceZim_framer   ZifdZ	mpentriesZdata_offsetÚiÚsizeÚmptyper   r   r   Ú	_save_all*   sZ   
ÿÿ
ï

r6   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 )ÚMpoImageFileZMPOzMPO (CIPA DC-007)Fc                 C  s$   | j  d¡ tj | ¡ |  ¡  d S )Nr   )r   r.   r   ÚJpegImageFileÚ_openÚ_after_jpeg_open©Úselfr   r   r   r9   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 )Z
DataOffsetÚmpoffset)Úinfo)Ú.0Zmpentr;   r   r   Ú
<listcomp>s   s    ÿz1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r   r   r=   r   )r4   Ú_initial_sizeZ_getmpÚmpinfoZn_framesÚ_MpoImageFile__mpoffsetsr)   r>   r   r   Ú_fpr.   Ú_MpoImageFile__frameÚoffsetÚreadonly)r<   Úmpheaderr   r;   r   r:   o   s   
ÿ

zMpoImageFile._after_jpeg_openc                 C  s   | j  |¡ d S r   )rD   r.   )r<   Ú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   Ú	AttributeZMPTypezLarge Thumbnaili   i   Zjpeg)r   r   Ú )Z_seek_checkrD   r   rC   rF   r.   ÚreadÚ
ValueErrorrA   Ú_sizeÚi16r   Ú
_safe_readr>   Z_reload_exifrB   Ú
startswithZgetexifZget_ifdr   ZIFDr'   r4   ÚmodeZtilerE   )r<   ÚframeÚsegmentÚmsgÚnr5   r   r   r   r   r.   †   s2   

€

zMpoImageFile.seekc                 C  s   | j S r   )rE   r;   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.
        )r7   Ú	__class__r:   )Zjpeg_instancerH   r   r   r   Úadopt¦   s   
zMpoImageFile.adoptr   )Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingr9   r:   rJ   r.   r+   ÚstaticmethodrZ   r   r   r   r   r7   e   s    
r7   z.mpoz	image/mpo)Ú
__future__r   r!   r0   r$   rM   r   r   r   r   r   r	   Ú_binaryr
   rQ   r   r   r6   r8   r7   Zregister_saver^   Zregister_save_allZregister_extensionZregister_mimer   r   r   r   Ú<module>   s    ;Y