
'"VIe              @   @   sl  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l m Z d  d l m Z m Z m Z m	 Z	 d  d l
 m Z d  d l m Z e	 j Z e	 j Z e	 j Z e	 j Z d Z d d   Z d	 d
   Z d d   Z d d   Z d d   Z i? d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d  d! e f d" 6d# d$ e f d% 6d& d' e f d( 6d,d+ 6d, d- e f d. 6d/ d0 e f d1 6d2 d3 e f d4 6d5 d6 e f d7 6d8 d9 e f d: 6d; d< e f d= 6d> d? e f d@ 6d-dC 6d.dF 6d/dI 6d0dL 6d1dO 6d2dR 6d3dU 6d4dX 6d5d[ 6d6d^ 6d_ d` e f da 6d db e f dc 6dd de e f df 6dg dh e f di 6dj dk e f dl 6dm dn e f do 6dp dq e f dr 6ds dt e f du 6dv dw e f dx 6dy dz e f d{ 6d| d} e f d~ 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d d e f d 6d7d 6d8d 6d9d 6d:d 6d;d 6d<d 6d=d 6d>d 6d?d 6d@d 6dAd 6dBd 6dCd 6dDd 6d d e f d 6Z d d   Z Gd d   d e j  Z d d   Z d d   Z d d   Z i d d 6d d 6d d 6d d 6d d 6d d 6d d 6Z  dEZ! i d  dF6d dG6d dH6Z" dd  Z# dd   Z$ d!d"  Z% d#d$  Z& d d d%d& Z' e j( e j) e' e  e j* e j) e%  e j+ e j) d' e j+ e j) d( e j+ e j) d) e j+ e j) d* e j, e j) d+ d S(I      N)unpack_from)Image	ImageFileTiffImagePlugin_binary)presets)isStringTypez0.6c             C   s3   t  |  j j d   d } t j |  j |  d  S)N   )i16fpreadr   
_safe_read)selfmarkern r   5/tmp/pip-build-fj3bmf4v/Pillow/PIL/JpegImagePlugin.pySkip7   s    r   c       	   
   C   s  t  |  j j d   d } t j |  j |  } d | d @} | |  j | <|  j j | | f  | d k r*| d  d  d k r*t  | d  |  j d <} t	 | d	  |  j d
 <y2 t
 | d  } t  | d  t  | d  f } Wn YqX| d k r| |  j d <n  | |  j d <| |  j d <nZ| d k r\| d  d  d k r\| |  j d <n(| d k r| d  d  d k r| |  j d <n | d k r| d  d  d k r|  j j |  n | d k r*| d  d  d k r*t  | d  |  j d <y t
 | d  } Wn YqX| |  j d <nZ | d k r| d  d  d k r| d d   |  j d <|  j j   | d |  j d  <n  d  S)!Nr	   zAPP%d   i     s   JFIF   Zjfif   Zjfif_version      
      dpi	jfif_unitjfif_densityi  s   Exif exifi  s   FPXR Zflashpix   s   ICC_PROFILE i  s   Adobeadobeadobe_transforms   MPF mpZmpoffset)r
   r   r   r   r   appapplistappendinfodivmodi8icclisttell)	r   r   r   sr$   versionr   r   r"   r   r   r   APP<   sB    """""""r.   c             C   sX   t  |  j j d   d } t j |  j |  } | |  j d <|  j j d | f  d  S)Nr	   COM)r
   r   r   r   r   r$   r%   r&   )r   r   r   r,   r   r   r   r/   |   s    r/   c       	      C   sU  t  |  j j d   d } t j |  j |  } t  | d d    t  | d d    f |  _ t | d  |  _ |  j d k r t d |  j   n  t | d  |  _	 |  j	 d k r d |  _
 nI |  j	 d k r d	 |  _
 n. |  j	 d
 k r d |  _
 n t d |  j	   | d k r6d |  j d <|  j d <n  |  j r|  j j   t |  j d d  t |  j  k rg  } x( |  j D] } | j | d d    qWd j |  } n d  } | |  j d <d  |  _ n  xz t d t |  d  D]` } | | | d  } |  j j | d t | d  d t | d  d @t | d  f  qWd  S)Nr	      r   r   r   zcannot handle %d-bit layersr   LRGBr   CMYKzcannot handle %d-layer images        progressiveprogression          icc_profile      r   )r4   r5   r6   r7   )r
   r   r   r   r   sizer)   bitsSyntaxErrorlayersmoder'   r*   sortlenr&   joinrangelayer)	r   r   r   r,   Zprofilepr=   itr   r   r   SOF   s:    /	&rM   c             C   s   t  |  j j d   d } t j |  j |  } x t |  r t |  d k  ra t d   n  t | d  } | d d k r t j d | d d   |  j	 | d @<| d d   } q4 d  Sq4 Wd  S)	Nr	   A   zbad quantization table markerr   r?   br   r   )
r
   r   r   r   r   rF   rB   r)   arrayquantization)r   r   r   r,   vr   r   r   DQT   s    	'rS   ZSOF0zBaseline DCTi  ZSOF1zExtended Sequential DCTi  ZSOF2zProgressive DCTi  ZSOF3zSpatial losslessi  ZDHTzDefine Huffman tablei  ZSOF5zDifferential sequential DCTi  ZSOF6zDifferential progressive DCTi  ZSOF7zDifferential spatiali  JPG	Extensioni  ZSOF9zExtended sequential DCT (AC)i  ZSOF10zProgressive DCT (AC)i  ZSOF11zSpatial lossless DCT (AC)i  ZDACz%Define arithmetic coding conditioningi  ZSOF13z Differential sequential DCT (AC)i  ZSOF14z!Differential progressive DCT (AC)i  ZSOF15zDifferential spatial (AC)i  RST0	Restart 0i  RST1	Restart 1i  RST2	Restart 2i  RST3	Restart 3i  RST4	Restart 4i  RST5	Restart 5i  RST6	Restart 6i  RST7	Restart 7i  SOIStart of imagei  EOIEnd of imagei  ZSOSzStart of scani  zDefine quantization tablei  ZDNLzDefine number of linesi  ZDRIzDefine restart intervali  ZDHPzDefine hierarchical progressioni  ZEXPzExpand reference componenti  ZAPP0zApplication segment 0i  ZAPP1zApplication segment 1i  ZAPP2zApplication segment 2i  ZAPP3zApplication segment 3i  ZAPP4zApplication segment 4i  ZAPP5zApplication segment 5i  ZAPP6zApplication segment 6i  ZAPP7zApplication segment 7i  ZAPP8zApplication segment 8i  ZAPP9zApplication segment 9i  ZAPP10zApplication segment 10i  ZAPP11zApplication segment 11i  ZAPP12zApplication segment 12i  ZAPP13zApplication segment 13i  ZAPP14zApplication segment 14i  ZAPP15zApplication segment 15i  JPG0Extension 0i  JPG1Extension 1i  JPG2Extension 2i  JPG3Extension 3i  JPG4Extension 4i  JPG5Extension 5i  JPG6Extension 6i  JPG7Extension 7i  JPG8Extension 8i  JPG9Extension 9i  JPG10Extension 10i  JPG11Extension 11i  JPG12Extension 12i  JPG13Extension 13i  Commenti  c             C   s   |  d d  d k S)Nr   r   s   r   )prefixr   r   r   _accept  s    r   c               @   sX   e  Z d  Z d Z d Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z	 d S)JpegImageFileJPEGzJPEG (ISO 10918)c             C   s  |  j  j d  } t |  d k r3 t d   n  d |  _ |  _ g  |  _ i  |  _ i  |  _ i  |  _	 i  |  _
 g  |  _ g  |  _ x)t |  } | d k r | |  j  j d  } t |  } n |  j  j d  } q | t k r}t | \ } } } | d  k	 r| |  |  n  | d k rh|  j } |  j d k r?d } n  d d |  j d | d	 f f g |  _ Pn  |  j  j d  } q | d k s| d
 k rd } q t d   q Wd  S)Nr      znot a JPEG filer   i  r3   zCMYK;Ijpeg i  s   zno marker found)r   r   )r   r   r)   rB   rA   rC   rI   Z
huffman_dcZ
huffman_acrQ   r$   r%   r*   r
   MARKERrD   r@   tile)r   r,   rK   namedescriptionhandlerrawmoder   r   r   _open  sB    										zJpegImageFile._openc       	      C   s  t  |  j  d k r d  S|  j d \ } } } } d } | d d k rl | d k rl | |  _ | d f } n  | rdt |  j d | d |  j d | d  } x* d d d	 d g D] } | | k r Pq q W| d | d | d	 | d | d | | d | d
 | d | d | | d f } |  j d | d | |  j d | d | f |  _ | } n  | | | | f g |  _ | d f |  _ |  S)Nr   r   r2   r1   YCbCrr   r   r   r	   r0   )r1   r   )rF   r   rD   maxr@   Zdecoderconfig)	r   rD   r@   deoaZscaler,   r   r   r   draftQ  s$    	-Z5	zJpegImageFile.draftc             C   s   d d  l  } d d  l } d d  l } | j   \ } } | j |  | j j |  j  rw | j d d | |  j g  n t	 d   z t
 j j |  |  _ Wd  y | j |  Wn t k
 r Yn XX|  j j |  _ |  j j |  _ g  |  _ d  S)Nr   Zdjpegz-outfilezInvalid Filename)
subprocesstempfileosmkstempclosepathexistsfilename
check_call
ValueErrorr   coreZopen_ppmimunlinkOSErrorrD   r@   r   )r   r   r   r   fr   r   r   r   
load_djpegk  s"    zJpegImageFile.load_djpegc             C   s
   t  |   S)N)_getexif)r   r   r   r   r     s    zJpegImageFile._getexifc             C   s
   t  |   S)N)_getmp)r   r   r   r   r     s    zJpegImageFile._getmpN)
__name__
__module____qualname__formatformat_descriptionr   r   r   r   r   r   r   r   r   r     s   2r   c                s/   d d     t    f d d   |  j   D  S)Nc          	   S   sE   y6 t  |   d k r5 t |   t i   k r5 |  d SWn Yn X|  S)Nr   r   )rF   type)valuer   r   r   _fixup  s    * z_fixup_dict.<locals>._fixupc                s(   g  |  ] \ } } |   |  f  q Sr   r   ).0krR   )r   r   r   
<listcomp>  s   	 z_fixup_dict.<locals>.<listcomp>)dictitems)Zsrc_dictr   )r   r   _fixup_dict  s    r   c             C   s?  y |  j  d } Wn t k
 r) d  SYn Xt j | d d    } | j d  } t j |  } | j |  t t	 |   } y | j
 | d  Wn t t f k
 r Yn0 Xt j |  } | j |  | j t	 |   y | j
 | d  Wn t t f k
 rYn- Xt j |  } | j |  t	 |  | d <| S)Nr   r>   r   ii  i%  )r'   KeyErrorioBytesIOr   r   ZImageFileDirectory_v1loadr   r   seek	TypeErrorupdate)r   datafileheadr'   r   r   r   r   r     s0    	r   c          "   C   s~  y |  j  d } Wn t k
 r) d  SYn Xt j |  } | j d  } | d  d  d k rd d n d } y, t j |  } | j |  t |  } Wn t	 d   Yn Xy | d } Wn t k
 r t	 d	   Yn Xg  } yw| d
 }	 x\t
 d |  D]K}
 t d j |  |	 |
 d  } d3 } t t | |   } i t | d d4 @ d 6t | d d5 @ d 6t | d d6 @ d 6| d d7 @d ?d 6| d d8 @d ?d 6| d d  @d! 6} | d d k rd" | d <n t	 d#   i d$ d 6d% d& 6d' d( 6d) d* 6d+ d, 6d- d. 6d/ d0 6} | j | d! d1  | d! <| | d <| j |  q W| | d
 <Wn t k
 ryt	 d2   Yn X| S)9Nr#   r   r   s   MM *><z)malformed MP Index (unreadable directory)i  z(malformed MP Index (no number of images)i  r   z{0}LLLHHr?   	AttributeSize
DataOffsetEntryNo1EntryNo2r      ZDependentParentImageFlag   ZDependentChildImageFlag   ZRepresentativeImageFlagr0      ZReservedr      ZImageDataFormati ZMPTyper   z!unsupported picture format in MPOZ	Undefinedz Large Thumbnail (VGA Equivalent)i  z$Large Thumbnail (Full HD Equivalent)i  zMulti-Frame Image (Panorama)i  zMulti-Frame Image: (Disparity)i  z Multi-Frame Image: (Multi-Angle)i  zBaseline MP Primary Imagei   Unknownz!malformed MP Index (bad MP Entry))z	AttributezSizer   r   r   l        i   @i    i   i   )r'   r   r   r   r   r   ZImageFileDirectory_v2r   r   rB   rH   r   r   zipboolgetr&   )r   r   file_contentsr   Z
endiannessr'   r#   ZquantZ	mpentriesZrawmpentriesZentrynumZunpackedentrylabelsZmpentryZmpentryattrZ	mptypemapr   r   r   r     sn    	"
 




r   r1   1r2   ZRGBAZRGBXzCMYK;Ir3   r   r   r   r>   r;   r   r      r	   r   r   r:   r?      r   *   r0   r   r          r   )   +   	         r   r   (   ,   5   r             '   -   4   6         !   &   .   3   7   <      "   %   /   2   8   ;   =   #   $   0   1   9   :   >   ?   c                sc     f d d   t  t     D   x7 t    D]) \ }   f d d   t D   | <q2 W  S)Nc                s&   g  |  ] } |   k r   |  q Sr   r   )r   key)qtablesr   r   r   -  s   	 z(convert_dict_qtables.<locals>.<listcomp>c                s   g  |  ] }   |  q Sr   r   )r   rK   )tabler   r   r   /  s   	 )rH   rF   	enumeratezigzag_index)r  idxr   )r  r  r   convert_dict_qtables,  s    %!r  c             C   st   t  |  d  s |  j d k r# d S|  j d d d  |  j d d d  |  j d d d  } t j | d	  S)
NrC   r   r   r   r0   r	   )r   r   r  )hasattrrC   rI   	samplingsr   )r   Zsamplingr   r   r   get_sampling3  s    Ar  c             C   sL  y t  |  j } Wn% t k
 r8 t d |  j   Yn X|  j } | j d d#  } | j d d  } | j d d$  } | j d  } | d k r d } d } d } n | t k r t | }	 d } |	 j d d%  } |	 j d	  } nq t | t  st	 d
   nS | t k r+t | j d d&  } n  t
 |  rY| t k rYt | j d	  } n  | d k rnd } nc | d k rd } nN | d k rd } n9 | d k r|  j d k rt	 d   n  t |   } n  d d   }
 | d k r|  j d k rt	 d   n  t |  d	 d   } n  |
 |  } d } | j d  } | rd } d } | | } g  } x1 | r| j | d  |   | | d   } qbWd } xk | D]` } t j d d | t |   } | d | d t |  t t |   | 7} | d 7} qWn  | d | k pd | k | j d d  d | k | j d d  | d | d | | | | j d d  f |  _ d } d | k sd | k sd | k r| d  k s| d k rd |  j d |  j d } q|  j d |  j d } n  t t j | t | j d d   d!  } t j |  | d" d' |  j d | f g |  d  S)(Nzcannot write mode %s as JPEGr   r   qualitysubsamplingr   r  keeprQ   zInvalid quality settingz4:4:4z4:2:2z4:1:1r	   r   z3Cannot use 'keep' when original image is not a JPEGc                s  |  d  k r |  St  |   r y d d   |  j   D   Wn t k
 rY t d   Yq X  f d d   t d t    d  D }  n  t |  t t t f  rt |  t  r t	 |   }  n t |  t  r t |   }  n  d t |   k  o d k  n st d   n  xy t
 |   D]k \ } } y. t |  d k rA  n  t j d	 |  } Wn t k
 rtt d   YqXt |  |  | <qW|  Sd  S)
Nc             S   s?   g  |  ]5 } | j  d  d  d j    D] } t |   q& q S)#r   r   )splitint)r   linenumr   r   r   r   r  s   	 z3_save.<locals>.validate_qtables.<locals>.<listcomp>zInvalid quantization tablec                s$   g  |  ] }   | | d    q S)@   r   )r   r,   )linesr   r   r   w  s   	 r   r  r   z$None or too many quantization tablesrO   )r   
splitlinesr   rH   rF   
isinstancetuplelistr   r  r  rP   r   )r  r
  r  r   )r  r   validate_qtablesm  s0    ."z_save.<locals>.validate_qtablesr<   r=   r;   i  z>Hs   s   ICC_PROFILE r8   r9   ZsmoothoptimizeZ
streamtyper   _   r   r   )r   r   r  r  r  )r   r   )RAWMODErD   r   IOErrorZencoderinfor   r   r  r  r   r   r   r  getattrr&   structpackrF   o8Zencoderconfigr@   r   r   ZMAXBLOCK_save)r   r   r   r   r'   r   r  r  r  presetr  extrar=   ZICC_OVERHEAD_LENZMAX_BYTES_IN_MARKERZMAX_DATA_BYTES_IN_MARKERmarkersrK   r   r@   bufsizer   r   r   r'  A  s    		
			
	 -	$+r'  c             C   sg   d d  l  } d d  l } |  j   } | j d d | | g  y | j |  Wn t k
 rb Yn Xd  S)Nr   Zcjpegz-outfile)r   r   _dumpr   r   r   )r   r   r   r   r   r   r   r   r   _save_cjpeg  s    r-  c             C   s   t  |  |  } yB | j   } | d d k rP d d l m } | |  |  } n  Wn6 t t f k
 rk Yn t k
 r t j d  Yn X| S)Ni  r   )MpoImageFilezTImage appears to be a malformed MPO file, it will be interpreted as a base JPEG file)	r   r   ZMpoImagePluginr.  r   
IndexErrorrB   warningswarn)r   r   r   Zmpheaderr.  r   r   r   jpeg_factory  s    r2  z.jfifz.jpez.jpgz.jpegz
image/jpeg)rT   z	ExtensionN)rV   rW   N)rX   rY   N)rZ   r[   N)r\   r]   N)r^   r_   N)r`   ra   N)rb   rc   N)rd   re   N)rf   rg   N)rh   ri   N)rj   rk   N)rl   rm   N)rn   ro   N)rp   rq   N)rr   rs   N)rt   ru   N)rv   rw   N)rx   ry   N)rz   r{   N)r|   r}   N)r~   r   N)r   r   N)r   r   N)r   r   N)@r   r   r   r>   r;   r   r   r   r	   r   r   r:   r?   r   r   r   r0   r   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  )r   r   r   r   r   r   )r	   r   r   r   r   r   )r	   r	   r   r   r   r   )-rP   r$  r   r0  r   ZPILr   r   r   r   ZPIL.JpegPresetsr   Z	PIL._utilr   r)   r&  Zi16ber
   Zi32beZi32__version__r   r.   r/   rM   rS   r   r   r   r   r   r   r!  r	  r  r  r  r'  r-  r2  Zregister_openr   Zregister_saveZregister_extensionZregister_mimer   r   r   r   <module>#   s   "				@
0s-L
       

