B ë˜Þ]ã@stddlmZmZmZddlmZdZdd„Zdd„Z Gdd „d ej ƒZ e  e j e ¡e e j d ¡e e j d ¡d S) é)ÚImageÚ ImageFileÚJpegImagePlugin)Úi16bez0.1cCs t |¡S)N)rÚ_accept)Úprefix©rú4/tmp/pip-build-ktz6qwqq/Pillow/PIL/MpoImagePlugin.pyrsrcCst |||¡S)N)rÚ_save)ZimÚfpÚfilenamerrr r !sr c@speZdZdZdZdZdd„Zddd„Zd d „Ze d d „ƒZ e d d„ƒZ dd„Z dd„Z dd„Zeddd„ƒZdS)Ú MpoImageFileZMPOzMPO (CIPA DC-007)FcCs$|j d¡tj |¡| ¡dS)Né)r ÚseekrÚ JpegImageFileÚ_openÚ_after_jpeg_open)Úselfrrr r0s  zMpoImageFile._openNcs’|dk r |nˆ ¡ˆ_ˆjdˆ_‡fdd„ˆjdDƒˆ_dˆjd<ˆjtˆjƒksZt‚ˆjd=ˆjˆ_ˆj  ˆjd¡dˆ_ dˆ_ dˆ_ dS)Ni°csg|]}|dˆjd‘qS)Z DataOffsetÚmpoffset)Úinfo)Ú.0Zmpent)rrr ú 9sz1MpoImageFile._after_jpeg_open..i°rrr) Z_getmpZmpinfoÚ_MpoImageFile__framecountÚ_MpoImageFile__mpoffsetsÚlenÚAssertionErrorrr Ú_MpoImageFile__fprÚ_MpoImageFile__frameÚoffsetÚreadonly)rÚmpheaderr)rr r5s  zMpoImageFile._after_jpeg_opencCs|j |¡dS)N)rr)rÚposrrr Ú load_seekGszMpoImageFile.load_seekcCs|jS)N)r)rrrr Ún_framesJszMpoImageFile.n_framescCs |jdkS)Nr)r)rrrr Ú is_animatedNszMpoImageFile.is_animatedcCsÖ| |¡sdS|j|_|j||_|j |jd¡t|j d¡ƒdkrœt|j d¡ƒd}t  |j|¡|j d<|  ¡}d|kr®d|kr®|d|df|_ nd|j kr®|j d=dd|j |j|jdffg|_||_dS) NéiáÿÚexifi i Zjpeg)rrÚ)Z _seek_checkrr rrrÚi16ÚreadrÚ _safe_readrZgetexifÚ_sizeÚsizeÚmodeZtiler)rÚframeÚnr&rrr rRs   zMpoImageFile.seekcCs|jS)N)r)rrrr ÚtellfszMpoImageFile.tellcCsBz4y|j|jkr|j ¡Wntk r0YnXWdd|_XdS)N)rr ÚcloseÚAttributeError)rrrr Ú _close__fpis   zMpoImageFile._close__fpcCst|_| |¡|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)Z jpeg_instancer rrr Úadoptrs  zMpoImageFile.adopt)N)N)Ú__name__Ú __module__Ú __qualname__ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingrrr"Úpropertyr#r$rr0r3Ú staticmethodr5rrrr r *s    r z.mpoz image/mpoN)r'rrrÚ_binaryrr(Ú __version__rr rr Z register_saver9Zregister_extensionZ register_mimerrrr Ús  `