U
    %duq                  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Zd dlZddl	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl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/d0efd1d2efd3d4d5d6d7d8d9d:d;d<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dddeefdfdgefdhdidjdkdldmdndodpdqdrdsdtduddvefdw?Zdxdy ZG dzd{ d{ejZ d|d} Z!d~d Z"ddddddd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)i16be)i32be)o8)o16be	deprecate)presetsc                 C   s&   t | jdd }t| j| d S )N   )i16fpreadr   
_safe_read)selfmarkern r   7/tmp/pip-unpacked-wheel-vp0hp2u_/PIL/JpegImagePlugin.pySkip8   s    r   c                 C   s  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 |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rD|| jd< | j | d | _n|dkrX|d d dkrX|| jd< n|dkr|d d dkr| j| n|dkr|d d dkrd}| jdi }	|||d  dkrDz|d7 }t ||}
|d7 }|| }|d| 7 }||d@ 7 }t||}|d7 }||||  }|
d kr^t|d!d" t |dt|dd" t |dd#}||	|
< ||7 }||d@ 7 }W n tjk
r   Y qDY nX qn|d$kr|d d d%krt |d| jd&< z|d' }W n tk
r   Y nX || jd(< nF|dkrD|d d d)krD|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 t|rt|d.kr|d/9 }||f| jd< W n* tttttfk
r   d0| jd< Y nX d S )1Nr   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 	photoshops   8BIMi  r   i   )ZXResolutionZDisplayedUnitsXZYResolutionZDisplayedUnitsY  s   Adobeadobe   adobe_transforms   MPF mpZmpoffseti(  i     gRQ@)H   r2   )r   r   r   r   r   appapplistappendinfodivmod	ExceptiontellZ_exif_offseticclist
setdefaulti32structerror
IndexErrorgetexiffloat	TypeErrormathisnan
ValueErrorKeyErrorSyntaxErrorZeroDivisionError)r   r   r   sr3   versionr!   r"   offsetr+   codeZname_lensizedatar/   r$   Zresolution_unitZx_resolutionr    r   r   r   APP=   s    








rO   c                 C   sJ   t | jdd }t| j|}|| jd< || jd< | jd|f d S )Nr   commentCOM)	r   r   r   r   r   r6   r3   r4   r5   )r   r   r   rI   r   r   r   rQ      s
    

rQ   c           
      C   s  t | jdd }t| j|}t |dt |df| _|d | _| jdkrbd| j d}t||d | _| jdkr~d	| _	n:| jdkrd
| _	n(| jdkrd| _	nd| j d}t||dkrd | j
d< | j
d< | jrD| j  | jd d t| jkr0g }| jD ]}||dd   q
d|}nd }|| j
d< g | _tdt|dD ]B}|||d  }	| j|	d |	d d |	d d@ |	d f qTd S )Nr   r1   r   r   r   zcannot handle z-bit layersr   LRGBr   CMYKz-layer images)        progressiveprogression   r*       icc_profiler%      r   )r   r   r   r   r   _sizebitsrG   layersmoder6   r:   sortlenr5   joinrangelayer)
r   r   r   rI   msgZprofilepr]   itr   r   r   SOF   s>    








rl   c                    s   t | jdd }t| j|}t|r|d }|d dkrBdnd}d|d  }t||k rjd}t|t|dkrzdnd|d|  tj	d	kr|dkr 
   fd
dtD | j|d@ < ||d  }q"d S )Nr   r   r^   r   @   zbad quantization table markerBHlittlec                    s   g | ]} | qS r   r   ).0rj   rN   r   r   
<listcomp>  s     zDQT.<locals>.<listcomp>r   )r   r   r   r   r   rd   rG   arraysys	byteorderZbyteswapzigzag_indexquantization)r   r   r   rI   vZ	precisionZ	qt_lengthrh   r   rr   r   DQT   s     rz   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 0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  rU   i  i  i  rV   i  i  i  rW   i  i  i  rX   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 )Nr1   s   r   )prefixr   r   r   _acceptQ  s    r   c                   @   sL   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d ZdS )JpegImageFileJPEGzJPEG (ISO 10918)c                 C   sH  | j d}t|s d}t|d}d | _| _g | _i | _i | _i | _	i | _
g | _g | _|d }|dkr|| j d }t|}n| j d}qZ|tkrt| \}}}|d k	r|| | |dkr| j}| jdkrd	}d
d| j d|dffg| _qD| j d}qZ|dks|dkrd}qZ|dkr6| j d}qZd}t|qZd S )Nr1   znot a JPEG file   r      r   r~   rT   CMYK;Ijpegr   r    i  i   zno marker found)r   r   r   rG   r`   ra   rg   Z
huffman_dcZ
huffman_acrx   r3   r4   r:   r   MARKERrb   rM   tile)r   rI   rh   rj   namedescriptionhandlerrawmoder   r   r   _open_  sH    




zJpegImageFile._openc                 C   s.   | j |}|s*tjr*t| ds*d| _dS |S )z
        internal: read more image data
        For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker
        so libjpeg can finish decoding
        _endedTs   )r   r   r   ZLOAD_TRUNCATED_IMAGEShasattrr   )r   
read_bytesrI   r   r   r   	load_read  s
    zJpegImageFile.load_readc                 C   sb  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 | |d | f}
| j|
fS )	Nr   r   rS   )rR   YCbCrr   )r   r   r   r   r   r1   )rd   r   ZdecoderconfigrM   rb   minr_   )r   rb   rM   deoaZscaleZoriginal_sizerI   Zboxr   r   r   draft  s4    &"".
zJpegImageFile.draftc                 C   s   t  \}}t| tj| jr:tdd|| jg nd}t	|z*t|}|  |j| _W 5 Q R X 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_callrE   unlinkOSErrorr   openloadimrb   rM   r_   r   )r   fr   rh   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._getmpc                 C   sB   | j D ]6\}}|dkr|dd\}}|dkr| |  S qi S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        r|       r   s   http://ns.adobe.com/xap/1.0/)r4   rsplitZ_getxmp)r   segmentcontentr   Zxmp_tagsr   r   r   getxmp  s    zJpegImageFile.getxmpN)__name__
__module____qualname__formatformat_descriptionr   r   r   r   r   r   r   r   r   r   r   r   Z  s   5%r   c                 C   s   d| j krd S |   S )Nr$   )r6   r@   Z_get_merged_dictr   r   r   r   r     s    
r   c              
   C   s0  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 n0 tk
r } zd}t||W 5 d }~X Y nX z|d }	W n0 tk
r } zd	}t||W 5 d }~X 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rd|d< nd}t|ddddd d!d"d#}||d$ d%|d$< ||d< |
| q|
|d
< W n2 tk
r* } zd&}t||W 5 d }~X Y nX |S )'Nr0   r   r   s   MM *><z)malformed MP Index (unreadable directory)  z(malformed MP Index (no number of images)i  r   ZLLLHHr^   )	AttributeSizeZ
DataOffsetZEntryNo1ZEntryNo2r   l        i   @i    i      i      i )ZDependentParentImageFlagZDependentChildImageFlagZRepresentativeImageFlagZReservedImageDataFormatMPTyper   r   z!unsupported picture format in MPO	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))r6   rF   ioBytesIOr   r   ZImageFileDirectory_v2seeknextr   dictr8   rG   rf   r=   unpack_fromzipboolgetr5   )r   rN   file_contentsheadZ
endiannessr6   r0   r   rh   ZquantZ	mpentriesZrawmpentriesZentrynumZunpackedentrylabelsZmpentryZmpentryattrZ	mptypemapr   r   r   r      st    



  

	r   rR   rS   r   r   )1rR   rS   ZRGBXrT   r   )@r   r   r   r%   r*   r   r      r   r   r   r[   r^         *   r1   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                 C   s   t dddd | S )Nconvert_dict_qtablesr   zConversion is no longer needed)actionr
   qtablesr   r   r   r  j  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 )Nra   )r   r   r   r   r1   r   )r   ra   rg   	samplingsr   )r   Zsamplingr   r   r   get_samplingo  s    6r  c                 C   s  | j dks| jdkr d}t|zt| j }W n: tk
rh } zd| j d}t||W 5 d }~X Y nX | j}dd |ddD }|d	d
}|dd
}	|d}
|dkrd
}d}	d}
n|t	krt	| }d
}|dd
}	|d}
nXt
|tsd}t|n>|	t	krt	|	 dd
}	t
|
trB|
t	krBt	|
 d}
|	dkrRd}	nZ|	dkrbd}	nJ|	dkrrd}	n:|	dkrd}	n*|	dkr| jdkrd}t|t| }	dd }|
dkr| jdkrd}t|t| dd }
||
}
|dd}|d}|rd}d}|| }g }|rB||d |  ||d  }qd}|D ]J}td| t| }|d| d  t| tt| | 7 }|d7 }qJ|d!| jd!}|d"d#p|d$d#}|d%d#}|d&d}t
|tjr| }|||d'd||d(d|d |d |	|
|||f| _d}|s8|r| jd)kr^d*| jd  | jd  }nB|d+ksr|d
krd| 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 ).Nr   z cannot write empty image as JPEGzcannot write mode z as JPEGc                 S   s   g | ]}t |qS r   )round)rq   xr   r   r   rs     s     z_save.<locals>.<listcomp>r    r   qualityr  subsamplingr  Zkeeprx   zInvalid quality settingz4:4:4z4:2:2r   z4:2:0r   z4:1:1r   z3Cannot use 'keep' when original image is not a JPEGc                    sh  d krS t tr|zdd  D  W n0 tk
r\ } zd}t||W 5 d }~X Y n X  fddtdt dD t tttfrdt trfddttD nt trtdt  k rdk sn d	}t|t	D ]j\}}z"t|dkrt
td
|}W n2 t
k
rP } zd}t||W 5 d }~X Y qX t||< qS d S )Nc                 S   s.   g | ]&}| d dd   D ]}t|qqS )#r   r   )splitint)rq   linenumr   r   r   rs     s    z3_save.<locals>.validate_qtables.<locals>.<listcomp>zInvalid quantization tablec                    s   g | ]} ||d   qS )rm   r   )rq   rI   )linesr   r   rs     s     r   rm   c                    s   g | ]}| kr | qS r   r   )rq   keyr  r   r   rs     s     r   z$None or too many quantization tablesro   )
isinstancestr
splitlinesrE   rf   rd   tuplelistr   	enumeraterB   rt   )r  r   rh   idxtabler   )r  r  r   validate_qtables  s>    





z_save.<locals>.validate_qtablesextrar\   r]   r*   r   s   r(   rP   rY   FrZ   optimizer$   ZsmoothZ
streamtyperT   r   _   r   r   )widthheightrE   RAWMODErb   rF   r   Zencoderinfor   r   r  r  r  r   r  getattrr5   o16rd   r   r6   r   ZExiftobytesZencoderconfigrM   maxr   ZMAXBLOCK_save)r   r   r   rh   r   r   r6   r    r
  r  r  presetr  r  r]   ZICC_OVERHEAD_LENZMAX_BYTES_IN_MARKERZMAX_DATA_BYTES_IN_MARKERmarkersrj   r   rM   rP   rY   r  r$   bufsizer   r   r   r&  }  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)
r   r   ZMpoImagePluginr,  ZadoptrB   r?   rG   warningswarn)r   r   r   Zmpheaderr,  r   r   r   jpeg_factory5  s    

r/  z.jfifz.jpez.jpgz.jpegz
image/jpeg)NN)0rt   r   rC   r   r=   r   ru   r   r-  r   r   r   r   _binaryr   r   r   r<   r   r	   r#  Z
_deprecater   ZJpegPresetsr   r   rO   rQ   rl   rz   r   r   r   r   r   r!  rw   r  r  r  r&  r+  r/  Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>"   s   y2C	 !N
 -
