U
    &^l                  A   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZddlmZm	Z	m
Z
 ddlmZmZmZmZ ddlmZ dd Zdd	 Zd
d Zdd Zdd Zddefddefddefddefddefddefddefddefd d!d"efd#d$efd%d&efd'd(efd)d*efd+d,efd-d.efd/d0d1d2d3d4d5d6d7d8d9d:efdd;efd<d=efd>d?efd@dAefdBdCefdDdEefdFdGefdHdIefdJdKefdLdMefdNdOefdPdQefdRdSefdTdUefdVdWefdXdYefdZd[efd\d]efd^d_efd`daefdbdcefdddedfdgdhdidjdkdldmdndodpdqddrefds?Zdtdu ZG dvdw dwe	j	Zdxdy Zdzd{ Zd|d} Zd~d~dddddZdZ d dddZ!dd Z"dd Z#dd Z$dd Z%dddZ&e'ej(e&e e)ej(e$ e*ej(ddddg e+ej(d dS )    N   )Image	ImageFileTiffImagePlugin)i8i16bei32beo8)presetsc                 C   s&   t | jdd }t| j| d S )N   )i16fpreadr   
_safe_read)selfmarkern r   7/tmp/pip-install-a1j0c_p1/Pillow/PIL/JpegImagePlugin.pySkip2   s    r   c                 C   s2  t | jdd }t| j|}d|d@  }|| j|< | j||f |dkr|d d dkrt |d | jd< }t	|d	| jd
< z$t
|d }t |dt |df}W n tk
r   Y n(X |dkr|| jd< || jd< || jd< n|dkr|d d dkrd| jkrl|| jd< nN|dkrH|d d dkrH|| jd< n$|dkrt|d d dkrt| j| n|dkr|d d dkrl|dd  }d}	i }
||	|	d  dkr|	d7 }	zt ||	}W n tjk
r   Y qY nX |	d7 }	t
||	 }d|	 | }	|	d@ r"|	d7 }	t||	}|	d7 }	||	|	|  }|dkrt|d d d  t |dd t|dd d  t |dd  d!}||
|< |	| }	|	d@ r|	d7 }	q|
| jd"< n|d#kr&|d d d$kr&t |d| jd%< zt
|d }W n tk
r   Y nX || jd&< nF|dkrl|d d d'krl|dd  | jd(< | j | d | jd)< d| jkr.d| jkr.z|  }|d* }|d+ }zt|d |d  }W n tk
r   |}Y nX |d,kr|d-9 }t|d. t|d. f| jd< W n( ttttfk
r,   d/| jd< Y nX d S )0Nr   zAPP%d        s   JFIF   Zjfif   Zjfif_version      
   r   dpi	jfif_unitjfif_density  s   Exif exif  s   FPXR Zflashpix      ICC_PROFILE      s   Photoshop 3.0 r   s   8BIMi  i   )ZXResolutionZDisplayedUnitsXZYResolutionZDisplayedUnitsY	photoshop  s   Adobeadobeadobe_transforms   MPF mpZmpoffseti(  i     gRQ@g      ?)H   r.   )r   r   r   r   r   appapplistappendinfodivmodr   	Exceptioniccliststructerrori32tellgetexiffloat	TypeErrorintKeyErrorSyntaxError
ValueErrorZeroDivisionError)r   r   r   sr/   versionr   r    blocksoffsetr(   codeZname_lensizedatar+   r"   Zresolution_unitZx_resolutionr   r   r   r   APP7   s    









"rI   c                 C   s@   t | jdd }t| j|}|| jd< | jd|f d S )Nr   COM)r   r   r   r   r   r/   r0   r1   )r   r   r   rB   r   r   r   rJ      s    
rJ   c           	   	   C   s  t | jdd }t| j|}t |dd  t |dd  f| _t|d | _| jdkrjtd| j t|d | _	| j	dkrd| _
n2| j	dkrd	| _
n | j	d
krd| _
ntd| j	 |dkrd | jd< | jd< | jrL| j  t| jd d t| jkr8g }| jD ]}||dd   qd|}nd }|| jd< d | _tdt|dD ]N}|||d  }| j|d t|d d t|d d@ t|d f q\d S )Nr   r-   r   r   r   zcannot handle %d-bit layersr   LRGBr   CMYKzcannot handle %d-layer images)        progressiveprogression   r'       icc_profile      r   )r   r   r   r   r   _sizer   bitsr?   layersmoder2   r5   sortlenr1   joinrangelayer)	r   r   r   rB   ZprofileprV   itr   r   r   SOF   s:    "






re   c                 C   s   t | jdd }t| j|}t|rt|dk r>tdt|d }|d dkrtd|dd | j	|d@ < |dd  }q"d S q"d S )	Nr   A   zbad quantization table markerr   rX   Br   r   )
r   r   r   r   r   r^   r?   r   arrayquantization)r   r   r   rB   vr   r   r   DQT   s    	rk   ZSOF0zBaseline DCTZSOF1zExtended Sequential DCTZSOF2zProgressive DCTZSOF3zSpatial losslessZDHTzDefine Huffman tableZSOF5zDifferential sequential DCTZSOF6zDifferential progressive DCTZSOF7zDifferential spatial)ZJPG	ExtensionNZSOF9zExtended sequential DCT (AC)ZSOF10zProgressive DCT (AC)ZSOF11zSpatial lossless DCT (AC)ZDACz%Define arithmetic coding conditioningZSOF13z Differential sequential DCT (AC)ZSOF14z!Differential progressive DCT (AC)ZSOF15zDifferential spatial (AC))ZRST0z	Restart 0N)ZRST1z	Restart 1N)ZRST2z	Restart 2N)ZRST3z	Restart 3N)ZRST4z	Restart 4N)ZRST5z	Restart 5N)ZRST6z	Restart 6N)ZRST7z	Restart 7N)ZSOIzStart of imageN)ZEOIzEnd of imageNZSOSzStart of scanzDefine quantization tableZDNLzDefine number of linesZDRIzDefine restart intervalZDHPzDefine hierarchical progressionZEXPzExpand reference componentZAPP0zApplication segment 0ZAPP1zApplication segment 1ZAPP2zApplication segment 2ZAPP3zApplication segment 3ZAPP4zApplication segment 4ZAPP5zApplication segment 5ZAPP6zApplication segment 6ZAPP7zApplication segment 7ZAPP8zApplication segment 8ZAPP9zApplication segment 9ZAPP10zApplication segment 10ZAPP11zApplication segment 11ZAPP12zApplication segment 12ZAPP13zApplication segment 13ZAPP14zApplication segment 14ZAPP15zApplication segment 15)ZJPG0zExtension 0N)ZJPG1zExtension 1N)ZJPG2zExtension 2N)ZJPG3zExtension 3N)ZJPG4zExtension 4N)ZJPG5zExtension 5N)ZJPG6zExtension 6N)ZJPG7zExtension 7N)ZJPG8zExtension 8N)ZJPG9zExtension 9N)ZJPG10zExtension 10N)ZJPG11zExtension 11N)ZJPG12zExtension 12N)ZJPG13zExtension 13NComment)?i  i  rN   i  i  i  rO   i  i  i  rP   i  i  i  rQ   i  i  i  i  i  i  i  i  i  i  i    i  i  i  i  i  r   r!   r#   i  i  i  i  i  i  i  i  i  i  r&   r)   i  i  i  i  i  i  i  i  i  i  i  i  i  i    i  c                 C   s   | dd dkS )Nr   r      r   )prefixr   r   r   _acceptH  s    rr   c                   @   sD   e Zd ZdZdZd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 d}t|dkr tdd | _| _g | _i | _i | _i | _	i | _
g | _g | _t|}|dkr|| j d }t|}n| j d}qV|tkrt| \}}}|d k	r|| | |dkr| j}| jdkrd}dd	| j d|d
ffg| _q:| j d}qV|dks|dkrd}qV|dkr0| j d}qVtdqVd S )Nr      znot a JPEG filer   rn   rM   CMYK;Ijpegr   r    i  rp   i   zno marker found)r   r   r   r?   rZ   r[   ra   Z
huffman_dcZ
huffman_acri   r/   r0   r5   r   MARKERr\   rG   tile)r   rB   rc   namedescriptionhandlerrawmoder   r   r   _openU  sB    



zJpegImageFile._openc                 C   s   | j |}|stjrdS |S )z
        internal: read more image data
        For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker
        so libjpeg can finish decoding
        s   )r   r   r   ZLOAD_TRUNCATED_IMAGES)r   
read_bytesrB   r   r   r   	load_read  s    
zJpegImageFile.load_readc                 C   sj  t | jdkrd S | jrd S | jd \}}}}d}| j}|d dkrZ|dkrZ|| _|df}|r"t| jd |d  | jd |d  }dD ]}	||	kr qq|d |d |d |d  |	 d |	 |d  |d |d  |	 d |	 |d  f}| jd |	 d |	 | jd |	 d |	 f| _|	}||||fg| _|df| _dd|d t| |d t| f}
| j|
fS )	Nr   r   rL   )rK   YCbCrry   )r   r   r   r   r   r-   )r^   r{   ZdecoderconfigrG   r\   minrY   r;   )r   r\   rG   deoaZscaleZoriginal_sizerB   Zboxr   r   r   draft  s4    &"".
$zJpegImageFile.draftc                 C   s   t  \}}t| tj| jr:tdd|| jg nt	dzt|}|  |j| _W 5 zt
| W n tk
r   Y nX X | jj| _| jj| _g | _d S )NZdjpeg-outfilezInvalid Filename)tempfilemkstemposclosepathexistsfilename
subprocess
check_callr@   unlinkOSErrorr   openloadimr\   rG   rY   r{   )r   fr   Z_imr   r   r   
load_djpeg  s     



zJpegImageFile.load_djpegc                 C   s   t | S N)_getexifr   r   r   r   r     s    zJpegImageFile._getexifc                 C   s   t | S r   )_getmpr   r   r   r   r     s    zJpegImageFile._getmpN)__name__
__module____qualname__formatformat_descriptionr   r   r   r   r   r   r   r   r   r   rs   P  s   2%rs   c                 C   s   t  }|| S r   )r   Exif_fixup_dict)Zsrc_dictr"   r   r   r   r     s    r   c                 C   s   d| j krd S t|  S )Nr"   )r2   dictr:   r   r   r   r   r     s    
r   c              	   C   s  z| j d }W n tk
r$   Y d S X t|}|d}|d d dkrNdnd}z,t|}||j |	| t
|}W n tk
r   tdY nX z|d }W n tk
r   td	Y nX g }z|d
 }	td|D ]}
td||	|
d }d}t
t||}t|d d@ t|d d@ t|d d@ |d d@ d? |d d@ d? |d d@ d}|d dkrzd|d< ntdddddd d!d"d#}||d$ d%|d$< ||d< || q||d
< W n tk
r   td&Y nX |S )'Nr,   r   r   s   MM *><z)malformed MP Index (unreadable directory)  z(malformed MP Index (no number of images)i  r   z{}LLLHHrX   )	AttributeSizeZ
DataOffsetZEntryNo1ZEntryNo2r   l        i   @i    i      i      i )ZDependentParentImageFlagZDependentChildImageFlagZRepresentativeImageFlagZReservedImageDataFormatMPTyper   rt   z!unsupported picture format in MPOZ	Undefinedz Large Thumbnail (VGA Equivalent)z$Large Thumbnail (Full HD Equivalent)zMulti-Frame Image (Panorama)zMulti-Frame Image: (Disparity)z Multi-Frame Image: (Multi-Angle)zBaseline MP Primary Image)r   i  i  i  i  i  i   r   Unknownz!malformed MP Index (bad MP Entry))r2   r>   ioBytesIOr   r   ZImageFileDirectory_v2seeknextr   r   r4   r?   r`   r6   unpack_fromr   zipboolgetr1   )r   rH   file_contentsheadZ
endiannessr2   r,   ZquantZ	mpentriesZrawmpentriesZentrynumZunpackedentrylabelsZmpentryZmpentryattrZ	mptypemapr   r   r   r     sl    



  

	r   rK   rL   rv   r   )1rK   rL   ZRGBXrM   r   )@r   r   r   rW   r'   r   r      r   r   r   rT   rX         *   r-   r   r$            )   +   	         r      (   ,   5   r             '   -   4   6         !   &   .   3   7   <      "   %   /   2   8   ;   =   #   $   0   1   9   :   >   ?   r   ))r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   c                    sF    fddt t D  t D ]\}fddtD  |< q" S )Nc                    s   g | ]}| kr | qS r   r   ).0key)qtablesr   r   
<listcomp>P  s      z(convert_dict_qtables.<locals>.<listcomp>c                    s   g | ]} | qS r   r   )r   rc   )tabler   r   r   R  s     )r`   r^   	enumeratezigzag_index)r   idxr   )r   r   r   convert_dict_qtablesO  s    r   c                 C   sZ   t | dr| jdkrdS | jd dd | jd dd  | jd dd  }t|dS )Nr[   )r   r   r   r   r-   r   )hasattrr[   ra   	samplingsr   )r   Zsamplingr   r   r   get_samplingV  s    6r   c                 C   s~  zt | j }W n" tk
r0   td| j Y nX | j}dd |ddD }|dd}|dd	}|d
}|dkrd}d}d}nx|tkrt| }	d}|	dd	}|	d}nLt|tst	dn8|tkrt| dd	}t|t
r|tkrt| d}|dkrd}nV|dkrd}nF|dkr.d}n6|dkr>d}n&|dkrd| jdkr\t	dt| }dd }
|dkr| jdkrt	dt| dd }|
|}d}|d}|rFd}d}|| }g }|r||d |  ||d  }qd}|D ]N}tdd| t| }|d| d t| tt| | 7 }|d7 }q|dd p^|d!d }|d"d }|d#d}t|tjr| }|||d$d||d%d|d |d ||||f| _d}|s|r:| jd&krd'| jd  | jd  }nB|d(ks|dkr&d| jd  | jd  }n| jd | jd  }ttj|t|d) t|d }t| |d*d| j d|fg| d S )+Nzcannot write mode %s as JPEGc                 S   s   g | ]}t t|qS r   )r=   round)r   xr   r   r   r   m  s     z_save.<locals>.<listcomp>r   rx   qualityr   subsamplingr   r   Zkeepri   zInvalid quality settingz4:4:4z4:2:2r   z4:2:0r   z4:1:1rt   z3Cannot use 'keep' when original image is not a JPEGc              	      s(  | d kr| S t | trhzdd |  D  W n tk
rH   tdY n X  fddtdt dD } t | tttfr$t | trt	| } nt | trt| } dt|   k rdk sn tdt
| D ]T\}}z t|dkrttd	|}W n tk
r   tdY qX t|| |< q| S d S )
Nc                 S   s.   g | ]&}| d dd   D ]}t|qqS )#r   r   )splitr=   )r   linenumr   r   r   r     s    z3_save.<locals>.validate_qtables.<locals>.<listcomp>zInvalid quantization tablec                    s   g | ]} ||d   qS )@   r   )r   rB   linesr   r   r     s     r   r  r   z$None or too many quantization tablesrg   )
isinstancestr
splitlinesr@   r`   r^   tuplelistr   r   r   r<   rh   )r   r   r   r   r  r   validate_qtables  s4    




z_save.<locals>.validate_qtablesrU   rV   r'   ro   z>Hs   r%   rR   FrS   optimizer"   ZsmoothZ
streamtyperM   r   _   r   rw   )RAWMODEr\   r>   r   Zencoderinfor   r
   r  r=   r@   r  r   r   getattrr1   r6   packr^   r	   r   r   tobytesZencoderconfigrG   maxr   ZMAXBLOCK_save)r   r   r   r   r2   r   r   r   r   presetr	  extrarV   ZICC_OVERHEAD_LENZMAX_BYTES_IN_MARKERZMAX_DATA_BYTES_IN_MARKERmarkersrc   r   rG   rR   r
  r"   bufsizer   r   r   r  d  s    







 




 r  c                 C   sB   |   }tdd||g zt| W n tk
r<   Y nX d S )NZcjpegr   )_dumpr   r   r   r   r   )r   r   r   r   r   r   r   _save_cjpeg  s    r  c              	   C   st   t | |}z0| }|d dkr8ddlm} |||}W n4 ttfk
rR   Y n tk
rn   t	d Y nX |S )Nr   r   )MpoImageFilezTImage appears to be a malformed MPO file, it will be interpreted as a base JPEG file)
rs   r   ZMpoImagePluginr  Zadoptr<   
IndexErrorr?   warningswarn)r   r   r   Zmpheaderr  r   r   r   jpeg_factory  s    

r  z.jfifz.jpez.jpgz.jpegz
image/jpeg)NN),rh   r   r   r6   r   r   r  ry   r   r   r   _binaryr   r   r   r   r8   r	   ZJpegPresetsr
   r   rI   rJ   re   rk   rz   rr   rs   r   r   r   r  r   r   r   r   r  r  r  Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>"   s   z
0C J
 
