o
    Z#a+o                     @   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i dddefdddefdddefdddefddd efd!d"d#efd$d%d&efd'd(d)efd*d+d,d-d.efd/d0d1efd2d3d4efd5d6d7efd8d9d:efd;d<d=efd>d?d@efdAdBi dCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWefdXddYefdZd[d\efd]d^d_efd`dadbefdcdddeefdfdgdhefdidjdkefi dldmdnefdodpdqefdrdsdtefdudvdwefdxdydzefd{d|d}efd~ddefdddefdddefdddefdddefdddefdddefdddefdddddddddddddddddddefdZdd ZG dd dejZdd Zdd 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(g dâ 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   5/usr/lib/python3/dist-packages/PIL/JpegImagePlugin.pySkip6   s   r   c                 C   s  t | jdd }t| j|}d|d@  }|| j|< | j||f |dkrr|d d dkrrt |d | jd< }t	|d	| jd
< z|d }t |dt |df}W n
 t
y\   Y n6w |dkrf|| jd< || jd< || jd< n |dkr|d d dkrd| jvr|| 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rB|d d dkrBd}| jdi }	|||d  dkrAzZ|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y6   Y nw |||d  dksnP|d#kro|d d d$krot |d| jd%< z|d& }W n
 tyh   Y n*w || jd'< n#|dkr|d d d(kr|dd  | jd)< | j | d | jd*< d| jvrd| jv rz@|  }|d+ }|d, }zt|d  |d  }W n ty   |}Y nw t|rt|d-kr|d.9 }||f| jd< W d S  tttttfy   d/| jd< Y d S w d S d S )0Nr
   zAPP%d        s   JFIF   jfif   jfif_version      
   r   dpi	jfif_unitjfif_density  s   Exif exif  s   FPXR flashpix      ICC_PROFILE      s   Photoshop 3.0 	photoshops   8BIMi  r   i   )XResolutionDisplayedUnitsXYResolutionDisplayedUnitsY  s   Adobeadobe   adobe_transforms   MPF mpmpoffseti(  i     gRQ@)H   r6   )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   sr7   versionr    r!   offsetr*   codename_lensizedatar2   r#   resolution_unitx_resolutionr   r   r   r   APP;   s   








rV   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:   r7   r8   r9   )r   r   r   rM   r   r   r   rX      s
   

rX   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r=d	| _	n| jdkrFd
| _	n| jdkrOd| _	n	td| j d|dv rfd | j
d< | j
d< | jr| j  | jd d t| jkrg }| jD ]}||dd   qd|}nd }|| j
d< g | _tdt|dD ] }|||d  }| j|d |d d |d d@ |d f qd S )Nr
   r5   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bitsrK   layersmoder:   r=   sortlenr9   joinrangelayer)	r   r   r   rM   profileprd   itr   r   r   SOF   s<   








.rt   c                    s   t | jdd }t| j|}t|rj|d }|d dkr!dnd}d|d  }t||k r3tdt|dkr;dnd|d|  tj	d	krP|dkrP 
   fd
dtD | j|d@ < ||d  }t|sd S d S )Nr
   r   rf   r   @   zbad quantization table markerBHlittlec                    s   g | ]} | qS r   r   ).0rr   rS   r   r   
<listcomp>      zDQT.<locals>.<listcomp>r   )r   r   r   r   r   rl   rK   arraysys	byteorderbyteswapzigzag_indexquantization)r   r   r   rM   v	precision	qt_lengthr   rz   r   DQT   s    r   i  SOF0zBaseline DCTi  SOF1zExtended Sequential DCTr\   SOF2zProgressive DCTi  SOF3zSpatial losslessi  DHTzDefine Huffman tablei  SOF5zDifferential sequential DCTr]   SOF6zDifferential progressive DCTi  SOF7zDifferential spatiali  )JPG	ExtensionNi  SOF9zExtended sequential DCT (AC)r^   SOF10zProgressive DCT (AC)i  SOF11zSpatial lossless DCT (AC)i  DACz%Define arithmetic coding conditioningi  SOF13z Differential sequential DCT (AC)r_   SOF14z!Differential progressive DCT (AC)i  SOF15zDifferential spatial (AC)i  )RST0z	Restart 0Ni  )RST1z	Restart 1Ni  )RST2z	Restart 2Ni  )RST3z	Restart 3Ni  )RST4z	Restart 4Ni  )RST5z	Restart 5Ni  )RST6z	Restart 6Ni  )RST7z	Restart 7Ni  )SOIzStart of imageNi  )EOIzEnd of imageN  SOSzStart of scani  zDefine quantization tablei  DNLzDefine number of linesi  DRIzDefine restart intervali  DHPzDefine hierarchical progressioni  EXPzExpand reference componentr   APP0zApplication segment 0r"   APP1zApplication segment 1r$   APP2zApplication segment 2i  APP3zApplication segment 3i  APP4zApplication segment 4i  APP5zApplication segment 5i  APP6zApplication segment 6i  APP7zApplication segment 7i  APP8zApplication segment 8i  APP9zApplication segment 9i  APP10zApplication segment 10i  APP11zApplication segment 11i  APP12zApplication segment 12r(   APP13zApplication segment 13r/   APP14zApplication segment 14i  APP15zApplication segment 15i  )JPG0zExtension 0Ni  )JPG1zExtension 1Ni  )JPG2zExtension 2N)JPG3zExtension 3N)JPG4zExtension 4N)JPG5zExtension 5N)JPG6zExtension 6N)JPG7zExtension 7N)JPG8zExtension 8N)JPG9zExtension 9N)JPG10zExtension 10N)JPG11zExtension 11N)JPG12zExtension 12N)JPG13zExtension 13NComment)i  i  i  i  i  i  i  i  i  i    i  c                 C   s   | dd dkS )Nr   r5   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   s6  | j d}t|stdd}d | _| _g | _i | _i | _i | _	i | _
g | _g | _	 |d }|dkrA|| j d }t|}n| j d}q+|tv rt| \}}}|d ur\|| | |dkry| j}| jd	krjd
}dd| j d|dffg| _d S | j d}n|dks|dkrd}n|dkr| j d}ntdq,)Nr5   znot a JPEG file   r   T   r   r   r[   CMYK;Ijpegr   r    i  i   zno marker found)r   r   r   rK   rh   ri   ro   
huffman_dc
huffman_acr   r7   r8   r=   r   MARKERrj   rR   tile)r   rM   rr   namedescriptionhandlerrawmoder   r   r   _openY  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   LOAD_TRUNCATED_IMAGEShasattrr   )r   
read_bytesrM   r   r   r   	load_read  s
   zJpegImageFile.load_readc                 C   s`  t | jdkr	d S | jrd S | jd \}}}}d}| j}|d dkr-|dv r-|| _|df}|rt| jd |d  | jd |d  }dD ]}	||	krL nqD|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   rZ   )rY   YCbCrr   )r   r   r
   r   r
   r5   )rl   r   decoderconfigrR   rj   minrg   )r   rj   rR   deoascaleoriginal_sizerM   boxr   r   r   draft  s6   &"".

zJpegImageFile.draftc                 C   s   t  \}}t| tj| jrtdd|| jg nt	dz/t
|}|  |j| _W d    n1 s:w   Y  W zt| W n tyP   Y nw zt| W w  tya   Y w w | jj| _| jj| _g | _d S )Ndjpeg-outfilezInvalid Filename)tempfilemkstemposclosepathexistsfilename
subprocess
check_callrI   r   openloadimunlinkOSErrorrj   rR   rg   r   )r   fr   _imr   r   r   
load_djpeg  s0   




zJpegImageFile.load_djpegc                 C      t | S N)_getexifr   r   r   r   r        zJpegImageFile._getexifc                 C   r   r   )_getmpr  r   r   r   r    r  zJpegImageFile._getmpc                 C   sB   | j D ]\}}|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/)r8   rsplit_getxmp)r   segmentcontentr   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 vrd S |   S )Nr#   )r:   rD   _get_merged_dictr  r   r   r   r     s   
r   c              
   C   s  z| j d }W n
 ty   Y d S w t|}|d}|d d dkr&dnd}zt|}||j |	| t
|}W n tyO } ztd|d }~ww z|d }W n tyg } ztd	|d }~ww g }	z|d
 }
td|D ]n}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tdddddd d!d"d#}||d$ d%|d$< ||d< |	| qt|	|d
< W |S  ty } ztd&|d }~ww )'Nr3   r   r   s   MM *><z)malformed MP Index (unreadable directory)  z(malformed MP Index (no number of images)i  r   LLLHHrf   )	AttributeSize
DataOffsetEntryNo1EntryNo2r  l        i   @i    i      i      i )DependentParentImageFlagDependentChildImageFlagRepresentativeImageFlag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:   rJ   ioBytesIOr   r   ImageFileDirectory_v2seeknextr   dictr<   rK   rn   r@   unpack_fromzipboolgetr9   )r   rS   file_contentshead
endiannessr:   r3   r   quant	mpentriesrawmpentriesentrynumunpackedentrylabelsmpentrympentryattr	mptypemapr   r   r   r    sv   







	

r  rY   rZ   r   r   )1rY   rZ   RGBXr[   r   )@r   r   r   re   r)   r   r     r
   r   r   rb   rf         *   r5   r   r&            )   +   	   r1      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
   ro  c                 C   sZ   t | dr
| jdv rdS | jd dd | jd dd  | jd dd  }t|dS )Nri   )r   r   r   r   r5   r
   )r   ri   ro   	samplingsr-  )r   samplingr   r   r   get_samplinge  s   6rs  c                 C   sr  zt | j }W n ty } z
td| j d|d }~ww | j}dd |ddD }|dd}|d	d}|d
}	|dkrHd}d}d}	n;|tv r^t| }
d}|
d	d}|
d}	n%t|tsgt	d|tv rst| d	d}t|	t
r|	tv rt|	 d}	|dkrd}n&|dkrd}n|dkrd}n|dkrd}n|dkr| jdkrt	dt| }dd }|	dkr| jdkrt	dt| dd }	||	}	d}|d}|rd}d}|| }g }|r||d |  ||d  }|sd}|D ]&}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rA| }|||d%d||d&d|d |d ||	||f| _d}|sc|r| jd'krvd(| jd  | jd  }n!|d)ks|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 ),Nzcannot write mode z as JPEGc                 S   s   g | ]}t |qS r   )round)ry   xr   r   r   r{   |  r|   z_save.<locals>.<listcomp>r   r   qualityrp  subsamplingrn  keepr   zInvalid quality settingz4:4:4r   z4:2:2r   z4:2:0r
   z4:1:1r   z3Cannot use 'keep' when original image is not a JPEGc                    sH  d u rS t tr7zdd  D  W n ty' } ztd|d }~ww  fddtdt dD t tttfrt trRfddttD n	t tr[tdt  k rjdk sotd	 td	t	D ],\}}zt|dkrt
td
|}W n t
y } ztd|d }~ww t||< qsS d S )Nc                 S   s.   g | ]}| d dd   D ]}t|qqS )#r   r   )splitint)ry   linenumr   r   r   r{     s    z3_save.<locals>.validate_qtables.<locals>.<listcomp>zInvalid quantization tablec                    s   g | ]
} ||d   qS )ru   r   )ry   rM   )linesr   r   r{     s    r   ru   c                    s   g | ]
}| v r | qS r   r   )ry   keyrm  r   r   r{     s    r   z$None or too many quantization tablesrw   )
isinstancestr
splitlinesrI   rn   rl   tuplelistr)  	enumeraterF   r}   )rn  r   idxtabler   )r~  rn  r   validate_qtables  sF   







z_save.<locals>.validate_qtablesrc   rd   r)   r   z>Hs   r'   r`   Fra   optimizer#   smooth
streamtyper[   r   _   r   r   )RAWMODErj   rJ   r   encoderinfor-  r	   r  r{  rI   r  r  rs  getattrr9   r@   packrl   r   r   ExiftobytesencoderconfigrR   maxr   MAXBLOCK_save)r   r   r   r   r   r:   r   rv  rw  rn  presetr  extrard   ICC_OVERHEAD_LENMAX_BYTES_IN_MARKERMAX_DATA_BYTES_IN_MARKERmarkersrr   r   rR   r`   r  r#   bufsizer   r   r   r  s  s   


"





 $r  c                 C   s@   |   }tdd||g zt| W d S  ty   Y d S w )Ncjpegr   )_dumpr   r   r   r   r   )r   r   r   r   r   r   r   _save_cjpeg  s   r  c              	   C   sx   t | |}z| }|d dkrddlm} |||}W |S W |S  ttfy-   Y |S  ty;   t	d Y |S w )Nr  r   )MpoImageFilezTImage appears to be a malformed MPO file, it will be interpreted as a base JPEG file)
r   r  MpoImagePluginr  adoptrF   rB   rK   rj  rk  )r   r   r   mpheaderr  r   r   r   jpeg_factory  s$   
	r  )z.jfifz.jpez.jpgz.jpegz
image/jpeg)NN),r}   r$  rG   r   r@   r   r~   r   rj  r   r   r   r   _binaryr   r   r   r?   r   JpegPresetsr	   r   rV   rX   rt   r   r   r   r   r   r  r  r   rq  ro  rs  r  r  r  register_openr  register_saveregister_extensionsregister_mimer   r   r   r   <module>   sD  !x0







	













 
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
01234C	 J
	  
