o
    1Î®cñ  ã                   @   sª   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 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 )é    Né   )ÚImageÚ	ImageFileÚImageSequenceÚJpegImagePluginÚTiffImagePlugin)Úi16be)Úo32lec                 C   s   t  | ||¡ d S ©N)r   Ú_save)ÚimÚfpÚfilename© r   ú9/tmp/pip-target-vg8gfxp4/lib/python/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 g }t | g|¡D ];}t |¡D ]3}|sVdt	 
dd¡ d d | j d< t |||¡ | | ¡ ¡ q4| |d	¡ | | ¡ |d
  ¡ q4q-t ¡ }t|ƒ|d< d}	d}
t|ƒD ]%\}}|dkr†d}nd}|	t	 
d|||
dd¡7 }	|dkrœ|
d8 }
|
|7 }
q{|	|d< | d¡ | dtdƒ | d¡ ¡ | dtj¡ d S )NÚappend_imagesFs   ÿâz>HéL   s   MPF sF                                                                         ÚextraÚJPEGéÿÿÿÿé°  ó    r   i   z<LLLHHé   é°  s   II* é   )ÚencoderinfoÚgetÚis_animatedÚAttributeErrorr   Ú	itertoolsÚchainr   ÚIteratorÚstructÚpackr   ÚappendÚtellÚsaver   ÚImageFileDirectory_v2ÚlenÚ	enumerateÚseekÚwriter	   ÚtobytesÚosÚSEEK_END)r   r   r   r   ÚanimatedÚoffsetsÚ
imSequenceÚim_frameÚifdÚ	mpentriesÚdata_offsetÚiÚsizeÚmptyper   r   r   Ú	_save_all%   sJ   
ÿÿö

r9   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   r*   r   ÚJpegImageFileÚ_openÚ_after_jpeg_open©Úselfr   r   r   r=   ]   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Úmpentr?   r   r   Ú
<listcomp>f   s    ÿz1MpoImageFile._after_jpeg_open.<locals>.<listcomp>r   r   rB   r   )r7   Ú_initial_sizeÚ_getmpÚmpinfoÚn_framesÚ_MpoImageFile__mpoffsetsr(   rC   r   r   Ú_fpr*   Ú_MpoImageFile__frameÚoffsetÚreadonly)r@   Úmpheaderr   r?   r   r>   b   s   
ÿ

zMpoImageFile._after_jpeg_openc                 C   s   | j  |¡ d S r
   )rL   r*   )r@   Úposr   r   r   Ú	load_seekv   s   zMpoImageFile.load_seekc                 C   s$  |   |¡sd S | j| _| j| | _| j | jd ¡ | j d¡}|s&tdƒ‚| j| _	t
|ƒdkrqt
| j d¡ƒd }t | j|¡| jd< |  ¡  | jd | d d }| d¡rp|  ¡  d	¡}d
|v rpd|v rp|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áÿ  Úexifr   Ú	AttributeÚMPTypezLarge Thumbnailii‡  i   i   Újpeg)r   r   Ú )Ú_seek_checkrL   r   rK   rN   r*   ÚreadÚ
ValueErrorrG   Ú_sizeÚi16r   Ú
_safe_readrC   Ú_reload_exifrI   Ú
startswithÚgetexifÚget_ifdr7   ÚmodeÚtilerM   )r@   ÚframeÚsegmentÚnr8   rT   r   r   r   r*   y   s0   

€

zMpoImageFile.seekc                 C   s   | j S r
   )rM   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.
        )r:   Ú	__class__r>   )Újpeg_instancerP   r   r   r   Úadopt˜   s   
zMpoImageFile.adoptr
   )Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionÚ!_close_exclusive_fp_after_loadingr=   r>   rR   r*   r%   Ústaticmethodrj   r   r   r   r   r:   W   s    
r:   z.mpoz	image/mpo)r   r-   r"   rX   r   r   r   r   r   Ú_binaryr   r]   r	   r   r9   r<   r:   Úregister_savern   Úregister_save_allÚregister_extensionÚregister_mimer   r   r   r   Ú<module>   s   2Y