U
    Å½„b‘o  ã                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	„ 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/d0efd1d2d3d4d5d6d7d8d9d: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dddeefdfdgdhdidjdkdldmdndodpdqdrdsddtefduœ?Zdvdw„ ZG dxdy„ dyejƒZdzd{„ Zd|d}„ Zd~d~ddd€d�d‚œZdƒZ d dd„d…œZ!d†d‡„ Z"dˆd‰„ Z#dŠd‹„ Z$dŒd�„ Z%d•dŽd�„Z&e
 'ej(e&e¡ e
 )ej(e$¡ e
 *ej(d�d‘d’d“g¡ e
 +ej(d”¡ dS )–é    Né   )ÚImageÚ	ImageFileÚTiffImagePlugin)Ú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-unpacked-wheel-_wxctax1/PIL/JpegImagePlugin.pyÚSkip6   s    r   c                 C   sø  t | j d¡ƒd }t | j|¡}d|d@  }|| j|< | j ||f¡ |dkrä|d d… dkrät |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< �nL|dk�r|d d… dk�rd| jk�r0|| jd< �n|dk�rD|d d… dk�rD|| jd< �nì|dk�rp|d d… dk�rp| j |¡ �nÀ|dk�rŽ|d d… dk�rŽd}| j di ¡}	|||d … dk�r0z´|d7 }t ||ƒ}
|d7 }|| }|d| 7 }||d@ 7 }t||ƒ}|d7 }|||| … }|
dk�rJt|d ƒd! t |dƒt|dƒd! t |dƒd"œ}||	|
< ||7 }||d@ 7 }W n tjk
�r†   Y �q0Y nX �qžn¢|d#k�rê|d d… d$k�rêt |dƒ| jd%< z|d& }W n tk
�rÜ   Y nX || jd'< nF|dk�r0|d d… d(k�r0|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 |¡�r¦t‚|d-k�r¸|d.9 }||f| jd< W n* t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 Ú	photoshops   8BIMií  r   i   )ZXResolutionZDisplayedUnitsXZYResolutionZDisplayedUnitsYéîÿ  s   AdobeÚadobeé   Úadobe_transforms   MPF ÚmpZmpoffseti(  i  é   gR¸…ëQ@)éH   r.   )r   r   r   r   r   ÚappÚapplistÚappendÚinfoÚdivmodÚ	ExceptionÚicclistÚ
setdefaultÚi32ÚstructÚerrorÚ
IndexErrorÚtellÚgetexifÚfloatÚ	TypeErrorÚmathÚisnanÚ
ValueErrorÚKeyErrorÚSyntaxErrorÚZeroDivisionError)r   r   r   Úsr/   Úversionr   r   Úoffsetr'   ÚcodeZname_lenÚsizeÚdatar+   r!   Zresolution_unitZx_resolutionr   r   r   r   ÚAPP;   s–    





ü

rK   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   r2   r/   r0   r1   )r   r   r   rE   r   r   r   rM   ³   s
    

rM   c           	      C   s”  t | j d¡ƒd }t | j|¡}t |dƒt |dƒf| _|d | _| jdkr^td| j› d�ƒ‚|d | _| jdkrzd	| _	n6| jdkrŒd
| _	n$| jdkržd| _	ntd| j› d�ƒ‚|dkrÌd | j
d< | j
d< | j�r<| j ¡  | jd d t| jƒk�r(g }| 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¡ �qLd S )Nr
   r-   r   r   r   zcannot handle z-bit layersr   ÚLÚRGBr   ÚCMYKz-layer images)éÂÿ  éÆÿ  éÊÿ  éÎÿ  ÚprogressiveÚprogressioné   r&   ó    Úicc_profileé   é   r   )r   r   r   r   r   Ú_sizeÚbitsrC   ÚlayersÚmoder2   r5   ÚsortÚlenr1   ÚjoinÚrangeÚlayer)	r   r   r   rE   ZprofileÚprY   ÚiÚtr   r   r   ÚSOF¾   s:    








rh   c                    sÎ   t | j d¡ƒd }t | j|¡}t|ƒrÊ|d }|d dkrBdnd}d|d  }t|ƒ|k rftdƒ‚t |dkrvd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   )Ú.0rf   ©rJ   r   r   Ú
<listcomp>  s     zDQT.<locals>.<listcomp>r   )r   r   r   r   r   ra   rC   ÚarrayÚsysÚ	byteorderZbyteswapÚzigzag_indexÚquantization)r   r   r   rE   ÚvZ	precisionZ	qt_lengthr   rn   r   ÚDQTî   s     rv   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Áÿ  rQ   iÃÿ  iÄÿ  iÅÿ  rR   iÇÿ  iÈÿ  iÉÿ  rS   iËÿ  iÌÿ  iÍÿ  rT   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-   s   ÿØÿr   )Úprefixr   r   r   Ú_acceptK  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   s>  | j  d¡}t|ƒstdƒ‚d}d | _| _g | _i | _i | _i | _	i | _
g | _g | _|d }|dkr€|| j  d¡ }t|ƒ}n| j  d¡}qV|tkrþt| \}}}|d k	r¶|| |ƒ |dkrð| j}| jdkrÒd	}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 fileó   ÿr   éÿ   r   rz   rP   úCMYK;IÚjpeg©r   r   Ú iÿÿ  i ÿ  zno marker found)r   r   r}   rC   r]   r^   rd   Z
huffman_dcZ
huffman_acrt   r/   r0   r5   r   ÚMARKERr_   rI   Útile)r   rE   rf   ÚnameÚdescriptionÚhandlerÚrawmoder   r   r   Ú_openY  sD    



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_bytesrE   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Š qœqŠ|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   rO   )rN   ÚYCbCrr…   )r   r   r
   r   r
   r-   )ra   r‡   ZdecoderconfigrI   r_   Úminr\   )r   r_   rI   ÚdÚeÚoÚaZscaleZoriginal_sizerE   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 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_callrA   ÚunlinkÚOSErrorr   ÚopenÚloadÚimr_   rI   r\   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._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.
        rx   ó    r   s   http://ns.adobe.com/xap/1.0/)r0   Ú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~   T  s   3%r~   c                 C   s   d| j krd S |  ¡  ¡ S )Nr!   )r2   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}z,t |¡}| |j¡ | 	|¡ t
|ƒ}W n, tk
rª } ztdƒ|‚W 5 d }~X Y nX z|d }W n, tk
rä } ztd	ƒ|‚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�rœd|d< ntdƒ‚ddddd d!d"d#œ}| |d$ d%¡|d$< ||d< |	 |¡ �q |	|d
< W n. tk
�r } ztd&ƒ|‚W 5 d }~X 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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))r2   rB   ÚioÚBytesIOr   r   ZImageFileDirectory_v2ÚseekÚnextr¥   Údictr4   rC   rc   r8   Úunpack_fromÚzipÚboolÚgetr1   )r   rJ   Úfile_contentsÚheadZ
endiannessr2   r,   r”   ZquantZ	mpentriesZrawmpentriesZentrynumZunpackedentryÚlabelsZmpentryZmpentryattrZ	mptypemapr   r   r   r¬   ÷  sl    



  ÿ
ú
ù	r¬   rN   rO   r‚   r‘   )Ú1rN   rO   ZRGBXrP   r‘   )@r   r   r   rZ   r&   r   r¼   é   r
   r   r   rW   r[   é   é   é*   r-   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t¡ | S )Nzpconvert_dict_qtables is deprecated and will be removed in Pillow 10(2023-07-01). Conversion is no longer needed.)ÚwarningsÚwarnÚDeprecationWarning©Úqtablesr   r   r   Úconvert_dict_qtables]  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
   )rŽ   r^   rd   Ú	samplingsrÊ   )r¦   Zsamplingr   r   r   Úget_samplingf  s    6r  c                 C   s´  | j dks| jdkrtdƒ‚zt| j }W n6 tk
r` } ztd| j› d�ƒ|‚W 5 d }~X Y nX | j}dd„ | dd¡D ƒ}| d	d
¡}| dd
¡}| d¡}	|dkr¶d
}d}d}	n~|t	krât	| }
d
}|
 dd
¡}|
 d¡}	nRt
|tƒsötdƒ‚n>|t	k�rt	|  dd
¡}t
|	tƒ�r4|	t	k�r4t	|	  d¡}	|dk�rDd}nV|dk�rTd}nF|dk�rdd}n6|dk�rtd}n&|dk�rš| jdk�r’tdƒ‚t| ƒ}dd„ }|	dk�rÌ| jdk�rÀtdƒ‚t| dd ƒ}	||	ƒ}	d}| d¡}|�r|d}d}|| }g }|�r$| |d |… ¡ ||d … }�qüd}|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|�rp| jd(k�r.d)| jd  | jd  }nB|d*k�sB|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 )-Nr   z cannot write empty image as JPEGzcannot write mode z as JPEGc                 S   s   g | ]}t |ƒ‘qS r   )Úround)rm   Úxr   r   r   ro     s     z_save.<locals>.<listcomp>r   r„   Úqualityr  Úsubsamplingr  Zkeeprt   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                    s\  ˆd krˆS t ˆtƒrxzdd„ ˆ ¡ D ƒ‰ W n, tk
rX } ztdƒ|‚W 5 d }~X Y n X ‡ fdd„tdtˆ ƒdƒD ƒ‰t ˆtttfƒ�rXt ˆtƒr°‡fdd„ttˆƒƒD ƒ‰nt ˆtƒrÂtˆƒ‰dtˆƒ  k rÚdk sän td	ƒ‚t	ˆƒD ]f\}}z"t|ƒdk�rt
‚t d
|¡}W n. t
k
�rD } ztdƒ|‚W 5 d }~X Y qìX t|ƒˆ|< qìˆS d S )Nc                 S   s.   g | ]&}|  d d¡d   ¡ D ]}t|ƒ‘qqS )ú#r   r   )ÚsplitÚint)rm   ÚlineÚnumr   r   r   ro   ª  s    þz3_save.<locals>.validate_qtables.<locals>.<listcomp>zInvalid quantization tablec                    s   g | ]}ˆ ||d  … ‘qS )ri   r   )rm   rE   )Úlinesr   r   ro   ²  s     r   ri   c                    s   g | ]}|ˆ krˆ | ‘qS r   r   )rm   Úkeyr   r   r   ro   µ  s     r   z$None or too many quantization tablesrk   )Ú
isinstanceÚstrÚ
splitlinesrA   rc   ra   ÚtupleÚlistrÆ   Ú	enumerater>   rp   )r  r”   ÚidxÚtabler   )r  r  r   Úvalidate_qtables¥  s8    
þ



ÿ
z_save.<locals>.validate_qtablesrX   rY   r&   r{   z>Hs   ÿâr$   rU   FrV   Úoptimizer!   ZsmoothZ
streamtyperP   r   é_   r   rƒ   )ÚwidthÚheightrA   ÚRAWMODEr_   rB   r£   ZencoderinforÊ   r	   r  r  r  rµ   r  Úgetattrr1   r8   Úpackra   r   r   ZExifÚtobytesZencoderconfigrI   Úmaxr   ZMAXBLOCKÚ_save)r¦   r   rŸ   r‹   r”   r2   r   r  r	  r  Úpresetr  ÚextrarY   ZICC_OVERHEAD_LENZMAX_BYTES_IN_MARKERZMAX_DATA_BYTES_IN_MARKERÚmarkersrf   r   rI   rU   r  r!   Úbufsizer   r   r   r#  t  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adoptr>   r:   rC   rý   rþ   )r   rŸ   r¦   Zmpheaderr*  r   r   r   Újpeg_factory!  s    
ÿ
r+  z.jfifz.jpez.jpgz.jpegz
image/jpeg)NN),rp   rÂ   r?   r›   r8   r    rq   r™   rý   r…   r   r   r   Ú_binaryr   r   r   r7   r   ZJpegPresetsr	   r   rK   rM   rh   rv   r†   r}   r~   rª   r¬   r  rs   r  r  r  r#  r)  r+  Zregister_openrµ   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   Ú<module>"   sÚ   x0ÁC	 Jú
ý	 "
