U
    ڲgt                  A   @  sB  d dl m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
Z
d dlmZmZ ddl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ddddZdd ZddddddZddddddZdddd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d0d1efd2d3efd4d5efd6d7efd8d9d:d;d<d=d>d?d@dAdBdCefddDefdEdFefdGdHefdIdJefdKdLefdMdNefdOdPefdQdRefdSdTefdUdVefdWdXefdYdZefd[d\efd]d^efd_d`efdadbefdcddefdedfefdgdhefdidjefdkdlefdmdndodpdqdrdsdtdudvdwdxdydzdd{efd|?Z d}d~dddZ!G dd dejZ"ddddZ#dd Z$dddddddZ%dZ&d dddZ'dd Z(dddddddZ)dddddddZ*dddZ+e,e"j-e+e! e.e"j-e) e/e"j-ddddg e0e"j-d dS )    )annotationsN)IOAny   )Image	ImageFile)i16be)i32be)o8)o16be)presetsJpegImageFileintNone)selfmarkerreturnc                 C  s&   t | jdd }t| j| d S )N   )i16fpreadr   
_safe_read)r   r   n r   7/tmp/pip-unpacked-wheel-xela2va7/PIL/JpegImagePlugin.pySkip:   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rJ|d d dkrJd| jkr(| jd  |dd  7  < n|| jd< | j | d | _nL|dkr|d d dkr|ddd | jd< n|dkr|d d dkr|| 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rz|d7 }t ||}
|d7 }|| }|d| 7 }||d@ 7 }t||}|d7 }||||  }|
d$krt|d%d& t |dt|dd& t |dd'}||	|
< ||7 }||d@ 7 }W n tjk
r   Y qY nX qn|d(krP|d d d)krPt |d| jd*< z|d+ }W n tk
rB   Y nX || jd,< nF|dkr|d d d-kr|dd  | jd.< | j | d | jd/< d S )0Nr   zAPP%d        s   JFIF   Zjfif   Zjfif_version      
   r   dpi	jfif_unitjfif_density     s   Exif  exif   s   http://ns.adobe.com/xap/1.0/     xmp  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mpoffset)r   r   r   r   r   appapplistappendinfodivmod	ExceptiontellZ_exif_offsetspliticclist
setdefaulti32structerror
IndexError)r   r   r   sr8   versionr%   r&   offsetr2   codeZname_lensizedatar6   r   r   r   APP?   s~    






rL   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   r;   r8   r9   r:   )r   r   r   rF   r   r   r   rN      s
    

rN   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r0| j  | jd d t| jkrdd | jD }d|}nd }|| j
d< g | _tdt|dD ]B}|||d  }| j|d |d d |d d@ |d f q@d S )Nr      r   r   r"   zcannot handle z-bit layersr   LRGBr   CMYKz-layer images)        progressiveprogression   c                 S  s   g | ]}|d d qS )r1   Nr   ).0pr   r   r   
<listcomp>   s     zSOF.<locals>.<listcomp>    icc_profiler(      r   )r   r   r   r   r   _sizebitsSyntaxErrorlayers_moder;   r@   sortlenjoinrangelayerr:   )	r   r   r   rF   msgZprofiler^   itr   r   r   SOF   s:    







rm   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   )rZ   rk   rK   r   r   r\      s     zDQT.<locals>.<listcomp>r   )r   r   r   r   r   rf   rb   arraysys	byteorderZbyteswapzigzag_indexquantization)r   r   r   rF   vZ	precisionZ	qt_lengthrj   r   rr   r   DQT   s     ry   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  rS   i  i  i  rT   i  i  i  rU   i  i  i  rV   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  r0   r3   i  i  i  i  i  i  i  i  i  i  i  i  i  i    i  bytesbool)prefixr   c                 C  s   | d d dkS )NrO   s   r   )r   r   r   r   _accept>  s    r   c                   @  sp   e Zd ZdZdZdd Zddddd	Zd
dddddZddddZddddZ	ddddZ
dd ZdS )r   JPEGzJPEG (ISO 10918)c                 C  sF  | 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| _q:| j d}qZ|dkrd}qZ|dkr,| j d}qZd}t|qZ|   d S )NrO   znot a JPEG file   r      r   r}   rR   CMYK;Ijpegr   r    >   r     i   zno marker found)r   r   r   rb   ra   rc   ri   Z
huffman_dcZ
huffman_acrw   r8   r9   r@   r   MARKERmoderJ   tile_read_dpi_from_exif)r   rF   rj   rk   namedescriptionhandlerrawmoder   r   r   _openK  sJ    






zJpegImageFile._openr   r   )
read_bytesr   c                 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   r   rF   r   r   r   	load_read  s
    zJpegImageFile.load_readz
str | Noneztuple[int, int] | Nonez0tuple[str, tuple[int, int, float, float]] | None)r   rJ   r   c                 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   rQ   )rP   YCbCrr   )r"   r   r   r   r   rO   )rf   r   ZdecoderconfigrJ   rd   minr`   r   )r   r   rJ   deoaZscaleZoriginal_sizerF   Zboxr   r   r   draft  s4    &"".
zJpegImageFile.draftr   r   c                 C  s   t  \}}t| tj| jr:tdd|| jg n0zt	| W n t
k
r\   Y nX 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_callunlinkOSError
ValueErrorr   openloadimr   rd   rJ   r`   r   )r   fr   rj   Z_imr   r   r   
load_djpeg  s*    


zJpegImageFile.load_djpegdict[str, Any] | Nonec                 C  s   t | S N)_getexifr   r   r   r   r     s    zJpegImageFile._getexifc                 C  s   d| j ksd| j krd S z|  }|d }|d }zt|d |d  }W n tk
rb   |}Y nX t|rzd}t||dkr|d	9 }||f| j d< W n, tjt	t
tttfk
r   d
| j d< Y nX d S )Nr$   r)   i(  i  r   r   zDPI is not a numberrO   gRQ@)H   r   )r;   getexiffloat	TypeErrormathisnanr   rC   rD   KeyErrorrb   ZeroDivisionError)r   r)   Zresolution_unitZx_resolutionr$   rj   r   r   r   r     s2    

z!JpegImageFile._read_dpi_from_exifc                 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   r   r   G  s   5&r   r   c                 C  s   d| j krd S |   S )Nr)   )r;   r   Z_get_merged_dictr   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}ddlm} z,||}||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
r6 } zd(}	t|	|W 5 d }~X Y nX |S ))Nr7   r"   r   s   MM *><r   )TiffImagePluginz)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))r;   r   ioBytesIOr   r   r   ZImageFileDirectory_v2seeknextr   dictr=   rb   rh   rC   unpack_fromzipr   getr:   )r   rK   file_contentsheadZ
endiannessr   r;   r7   r   rj   ZquantZ	mpentriesZrawmpentriesZentrynumZunpackedentrylabelsZmpentryZmpentryattrZ	mptypemapr   r   r   r     sv    



  

	r   rP   rQ   r   r   )1rP   rQ   ZRGBXrR   r   )@r   r   r   r(   r1   r   r      r   r   r!   rY   r_      r*   *   rO   r"   r.            )   +   	   r5      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  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 )Nrc   )r   r   r   r   rO   r   )r   rc   ri   	samplingsr   )r   Zsamplingr   r   r   get_samplingk  s    6r  zImage.Imagez	IO[bytes]zstr | bytes)r   r   r   r   c                 C  sF  | 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}|d}|rd}|| }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| }t||krd'}t||||d(d||d)d#|d*d|d |d |	|d+d|d,d|
|||f| _d}|sp|r| jd-krd.| jd  | jd  }nB|d/ks|d
krd| jd  | jd  }n| jd | jd  }|r|t|d0 7 }|r"|t|d 7 }nt|t|d0 t|d }t| |d1d| j d|fg| d S )2Nr   z cannot write empty image as JPEGzcannot write mode z as JPEGc                 S  s   g | ]}t |qS r   )round)rZ   xr   r   r   r\     s     z_save.<locals>.<listcomp>r$   r   qualityr	  subsamplingqtablesZkeeprw   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                   sp  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rlt trfddttD nt trtdt  k rdk sn d	}t|t	D ]r\}}z*t|dkrd}t
|td
|}W n2 t
k
rX } 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   )r?   r   )rZ   linenumr   r   r   r\     s    z3_save.<locals>.validate_qtables.<locals>.<listcomp>zInvalid quantization tablec                   s   g | ]} ||d   qS )rn   r   )rZ   rF   )linesr   r   r\     s     r   rn   c                   s   g | ]}| kr | qS r   r   )rZ   key)r  r   r   r\     s     r   z$None or too many quantization tablesrp   )
isinstancestr
splitlinesr   rh   rf   tuplelistr   	enumerater   rs   )r  r   rj   idxtabler   )r  r  r   validate_qtables  s@    





z_save.<locals>.validate_qtablesextrar]   r~   r^   r1   s   r/   rM   rW   FrX   optimizer)   zEXIF data is too longZsmoothZkeep_rgbZ
streamtypeZrestart_marker_blocksZrestart_marker_rowsrR   r   _   r   r   )widthheightr   RAWMODEr   r   r   Zencoderinfor   r   r  r   r  r   r  getattrr:   o16rf   r
   r;   r   ZExiftobytesZencoderconfigrJ   maxr   _save)r   r   r   rj   r   r   r;   r$   r  r  r  presetr  r  ZMAX_BYTES_IN_MARKERr^   ZICC_OVERHEAD_LENZMAX_DATA_BYTES_IN_MARKERmarkersrk   r   rJ   rM   rW   r   r)   bufsizer   r   r   r)  y  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_cjpeg0  s    r.  c              	   C  s   t | |}zZ| }|d dkrb|jD ]"\}}|dkr&d|kr&|  W S q&ddlm} |||}W n4 ttfk
r|   Y n tk
r   t	
d Y nX |S )Nr   r   r{   s    hdrgm:Version=")MpoImageFilezTImage appears to be a malformed MPO file, it will be interpreted as a base JPEG file)r   r   r9   ZMpoImagePluginr/  Zadoptr   rE   rb   warningswarn)r   r   r   Zmpheadersegmentcontentr/  r   r   r   jpeg_factory<  s     

r4  z.jfifz.jpez.jpgz.jpegz
image/jpeg)NN)1
__future__r   rs   r   r   r   rC   r   rt   r   r0  typingr   r   r   r   r   _binaryr   r   r	   rB   r
   r   r&  ZJpegPresetsr   r   rL   rN   rm   ry   r   r   r   r   r   r$  rv   r
  r  r)  r.  r4  Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>"   s   f0C	 3P
 8
