a
    h%L                    @  s  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	m
Z
mZ d dlmZ d dlmZmZ d dlmZmZmZmZmZ ddlmZmZmZ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)m*Z* ddlm+Z+ dZ,e,rddl&m-Z-m.Z. e/e0Z1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAd ZBd!ZCd"ZDd#ZEd$ZFd%ZGd&ZHd'ZId(ZJd)ZKd*ZLd+ZMd,ZNd-ZOd.ZPd/ZQd0ZRd1ZSd2ZTd3ZUd4ZVd5ZWd6ZXd7ZYd8ZZd9Z[d:Z\d;Z]d<Z^d=Z_d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOZ`dPdQ e`a D Zbe5d dRddRdSfdTe6d dRddRdSfdTe5d dRdUdRdSfdVe6d dRdUdRdSfdVe5ddRddRdSfdWe6ddRddRdSfdWe5ddRdUdRdSfdXe6ddRdUdRdSfdXe5d dRddYdSfdZe6d dRddYdSfdZe5d dRdUdYdSfd[e6d dRdUdYdSfd[e5ddRddYdSfd\e6ddRddYdSfd\e5ddRdUdYdSfd]e6ddRdUdYdSfd]e5d dRdd^dSfd_e6d dRdd^dSfd_e5d dRdUd^dSfd`e6d dRdUd^dSfd`e5ddRdd^dSfdae6ddRdd^dSfdae5ddRdUd^dSfdbe6ddRdUd^dSfdbe5d dRddcdSfdde6d dRddcdSfdde5d dRdUdcdSfdee6d dRdUdcdSfdee5ddRddcdSfdfe6ddRddcdSfdfe5ddYddcdSfdfe6ddYddcdSfdfe5ddRdUdcdSfdge6ddRdUdcdSfdge5ddRddhdSfdie5d dRddjdSfdke5ddRddjdSfdke6ddRddjdSfdle5ddRdUdjdSfdme5ddYddjdSfdne6ddYddjdSfdoe5d dpddqdSfdre6d dpddqdSfdse5ddRddqdSfdte5ddYddqdSfdue6ddYddqdSfdve5ddpddqdSfdre6ddpddqdSfdse5ddRddwdYfdxe6ddRddwdYfdxe5dUdRddydSfdze6dUdRddydSfdze5dUdRdUdydSfd{e6dUdRdUdydSfd{e5dUdRdd|dSfd}e6dUdRdd|dSfd}e5dUdRdd|d~fde6dUdRdd|d~fde5dUdRdddfde6dUdRdddfde5dUdRdddfde6dUdRdddfde5dUdRdd|dRfde6dUdRdd|dRfde5dUdRdddfde6dUdRdddfde5dUdRdddfde6dUdRdddfde5dUdRdd|dYfd}e6dUdRdd|dYfd}e5dUdRdddfde6dUdRdddfde5dUdRdddfde6dUdRdddfde5dUdRdd|dfd}e6dUdRdd|dfd}e5dUdRdddSfde6dUdRdddSfde5dUdRdddSfde6dUdRdddSfde5dUdRddd~fde6dUdRddd~fde5dUdRdddRfde6dUdRdddRfde5dUdRdddYfde6dUdRdddYfde5ddRddRdSfde6ddRddRdSfde5ddRdUdRdSfde6ddRdUdRdSfde5ddRddYdSfde6ddRddYdSfde5ddRdUdYdSfde6ddRdUdYdSfde5ddRdd^dSfde6ddRdd^dSfde5ddRdUd^dSfde6ddRdUd^dSfde5ddRddcdSfde6ddRddcdSfde5ddRddwd~fde5ddRddwdYfde6ddRddwdYfde5ddRdUdcdSfde6ddRdUdcdSfde5ddRdd|dSfde6ddRdd|dSfde5ddRddd~fde6ddRddd~fde5ddRdddfde6ddRdddfde5ddRdddSfde6ddRdddSfde5ddRddcdSfdfe6ddRddcdSfdfe5ddRddydSfde6ddRddydSfde5ddRddydSfde6ddRddydSfdiwZceddd ecD Zeg dZfegejhdd	se%dd dddddZiddddddZjdddddddÄZki Zli ZmdddƜddȄZnG dd deZoedepeqgef Zrdddd̜dd΄ZsdddМdd҄Ztddd՜ddׄZue,
rxeevef ZwneZwG ddʄ dewZxelex_lemex_me+a D ]F\ZyZzez{ddڡZze|exdez eley d  e|exdez emey  
q[l[m[y[zG ddބ dexZ}e}Z~G dd dejZde5dddRdfde5dddcdfde5dddwdUfde5dddcdfde5dddwdUfde5ddUdqdfde5dddjdfde5dddjdfde5dddqdfde5dUddydfde5dUdd|d fde5dUdd|dUfde5ddd|dfde5dddydfde5dddydfde6dddjdfdZdddddddZG dd dejZdddddddZeejeei eeje eeje eejddg eejd dS )    )annotationsN)IteratorMutableMapping)Fraction)NumberRational)IOAnyCallableNoReturncast   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8)	deprecate)StrOrBytesPath)DeferredErroris_pathTYPESF)BufferIntegralLike   s   IIs   MM      i  i  i  i  i
  i    i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  D  iE  iJ  iR  iS  i[  i  i  i  i  iI  is  ii  i  i  i  i  rawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzw	tiff_jpegjpegtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscantiff_deflateZtiff_sgilogZtiff_sgilog24lzmaZzstdZwebp)r                        i  i  i)  i  it  iu  im  iP  iQ  c                 C  s   i | ]\}}||qS  r2   ).0kvr2   r2   A/var/www/auris/lib/python3.9/site-packages/PIL/TiffImagePlugin.py
<dictcomp>       r7   r   r2   )1z1;Ir+   )r:   z1;IR)r:   r:   )r:   z1;R)r+   )LzL;2I)r;   zL;2IR)r;   zL;2)r;   zL;2R)r-   )r;   zL;4I)r;   zL;4IR)r;   zL;4)r;   zL;4R)r1   )r;   zL;I)r;   zL;IR)r;   r;   )r;   zL;R)   )I;16zI;12)   )r=   r=   )I;16Br?   )r=   zI;16R)IzI;16S)r@   zI;16BS)r,   )    )FF;32F)rB   zF;32BF)r@   zI;32N)r@   I;32S)r@   zI;32BS)r1   r1   )LArE   )r1   r1   r1   )RGBrF   )rF   zRGB;R)r1   r1   r1   r1   )RGBArG   )r   )rF   RGBX)r1   r1   r1   r1   r1   r   r   )rF   ZRGBXX)r1   r1   r1   r1   r1   r1   )r   r   r   )rF   ZRGBXXX)rG   ZRGBa)r   r   )rG   ZRGBaX)r   r   r   )rG   ZRGBaXX)r+   r   )rG   ZRGBAX)r+   r   r   )rG   ZRGBAXX)i  )r>   r>   r>   )rF   zRGB;16L)rF   zRGB;16B)r>   r>   r>   r>   )rG   zRGBA;16L)rG   zRGBA;16B)rF   zRGBX;16L)rF   zRGBX;16B)rG   zRGBa;16L)rG   zRGBa;16Br,   )PzP;1)rJ   zP;1R)rJ   zP;2)rJ   zP;2R)rJ   zP;4)rJ   zP;4R)rJ   rJ   )rJ   ZPX)PArK   )rJ   zP;Rr.   )CMYKrL   )rL   ZCMYKX)rL   ZCMYKXX)rL   zCMYK;16L)rL   zCMYK;16Br/   r1   )LABrM   c                 c  s   | ]}t |d  V  qdS )r-   N)len)r3   Zkey_tpr2   r2   r6   	<genexpr>  r8   rO   )s   MM *s   II* s   MM* s   II *s   MM +s   II+ libtiff_support_custom_tagsTz*Support for LibTIFF earlier than version 4r<   bytesbool)prefixreturnc                 C  s   |  ttS N)
startswithtuplePREFIXESrS   r2   r2   r6   _accept#  s    rZ   float | Fraction | IFDRationalintz!tuple[IntegralLike, IntegralLike])valmax_valrT   c                 C  s<   t | dk}t|rd|  n| |}|r8|d d d S |S )Nr   )absIFDRationallimit_rational)r]   r^   invn_dr2   r2   r6   _limit_rational'  s    re   ra   )r]   r^   min_valrT   c                 C  sp   t | }|j|jf}tdd |D |k r8t| t|}tdd |D }t||krlt|d |d  |}|S )Nc                 s  s   | ]}t |V  qd S rU   floatr3   ir2   r2   r6   rO   5  r8   z)_limit_signed_rational.<locals>.<genexpr>c                 s  s   | ]}t |V  qd S rU   rg   ri   r2   r2   r6   rO   8  r8   r   r   )r   	numeratordenominatorminre   r`   rW   max)r]   r^   rf   fracrd   Z	n_d_floatr2   r2   r6   _limit_signed_rational/  s    rp   strr	   )oprT   c                   s   dddd fdd}|S )Nra   ztuple[float, ...]zbool | float | Fraction)selfargsrT   c                   s   t | j | S rU   )getattr_valrs   rt   rr   r2   r6   delegateG  s    z_delegate.<locals>.delegater2   )rr   ry   r2   rx   r6   	_delegateF  s    rz   c                   @  s  e Zd ZdZdZd@dddddd	Zed
dddZeddddZdddddZ	ddddZ
ddddZdddddZdddd Zddd!d"d#Zed$Zed%Zed&Zed'Zed(Zed)Zed*Zed+Zed,Zed-Zed.Zed/Zed0Zed1Zed2Zed3Zed4Z ed5Z!ed6Z"ed7Z#ed8Z$ed9Z%ed:Z&ed;Z'ed<Z(ed=Z)e*e+d>red>Z,d?S )Ara   zImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )
_numerator_denominatorrv   r   r[   r\   None)valuerl   rT   c                 C  s   |  t |tr*|j| _|j| _|j| _dS t |trF|j| _|j| _ntrXt	t
|| _n|| _|| _|dkrxtd| _n@|dkrt|| _n,t||krtt||| _nt|| | _dS )z
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   nanr   )
isinstancera   rk   r{   rl   r|   rv   r   TYPE_CHECKINGr   r   rh   r\   )rs   r~   rl   r2   r2   r6   __init__]  s(    


zIFDRational.__init__r   rT   c                 C  s   | j S rU   )r{   rs   r2   r2   r6   rk     s    zIFDRational.numeratorc                 C  s   | j S rU   )r|   r   r2   r2   r6   rl     s    zIFDRational.denominatorztuple[IntegralLike, int])max_denominatorrT   c                 C  s>   | j dkr| j| j fS t| jts&J | j|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rl   rk   r   rv   r   Zlimit_denominator)rs   r   fr2   r2   r6   rb     s
    
zIFDRational.limit_rationalrq   c                 C  s   t t| jS rU   )rq   rh   rv   r   r2   r2   r6   __repr__  s    zIFDRational.__repr__c                 C  s
   | j  S rU   )rv   __hash__r   r2   r2   r6   r     s    zIFDRational.__hash__objectrR   )otherrT   c                 C  s0   | j }t|tr|j }t|tr(t|}||kS rU   )rv   r   ra   rh   )rs   r   r]   r2   r2   r6   __eq__  s    

zIFDRational.__eq__z%list[float | Fraction | IntegralLike]c                 C  s   | j | j| jgS rU   )rv   r{   r|   r   r2   r2   r6   __getstate__  s    zIFDRational.__getstate__)staterT   c                 C  s^   t | d |\}}}t|ttfs(J || _tr@tt|| _	n|| _	t|t
sTJ || _d S Nr   )ra   r   r   rh   r   rv   r   r   r   r{   r\   r|   )rs   r   rv   r{   r|   r2   r2   r6   __setstate__  s    
zIFDRational.__setstate____add____radd____sub____rsub____mul____rmul____truediv____rtruediv____floordiv____rfloordiv____mod____rmod____pow____rpow____pos____neg____abs__	__trunc____lt____gt____le____ge____bool____ceil__	__floor__	__round____int__N)r   )-__name__
__module____qualname____doc__	__slots__r   propertyrk   rl   rb   r   r   r   r   r   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   hasattrr   r   r2   r2   r2   r6   ra   O  sT    "ImageFileDirectory_v2z$Callable[[_LoaderFunc], _LoaderFunc])idxsizerT   c                   s   ddd fdd}|S )N_LoaderFuncfuncrT   c                   sB   ddl m} | jdr2| jdd  dd| < | ft < | S )Nr   r   load_r.   _ )r   r   r   rV   replace_load_dispatch)r   r   r   r   r2   r6   	decorator  s
    z#_register_loader.<locals>.decoratorr2   )r   r   r   r2   r   r6   _register_loader  s    r   z2Callable[[Callable[..., Any]], Callable[..., Any]])r   rT   c                   s   ddd fdd}|S )NzCallable[..., Any]r   c                   s   | t  < | S rU   )_write_dispatch)r   r   r2   r6   r     s    z#_register_writer.<locals>.decoratorr2   )r   r   r2   r   r6   _register_writer  s    r   ztuple[int, str, str]r}   )idx_fmt_namerT   c                   sj   ddl m} | \} }|||< td  dddddd	 fd
d}|ft|<  fddt|< d S )Nr   r   =Tr   rQ   rR   tuple[Any, ...])rs   data
legacy_apirT   c                   s   |  t|    |S rU   )_unpackrN   rs   r   r   fmtr   r2   r6   basic_handler  s    z&_register_basic.<locals>.basic_handlerc                   s   d  fdd|D S )Nr8   c                 3  s   | ]}  |V  qd S rU   )_packr3   r~   )r   rs   r2   r6   rO     r8   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrs   values)r   r   r6   <lambda>  s    z!_register_basic.<locals>.<lambda>)T)r   r   structcalcsizer   r   )r   r   r   namer   r2   r   r6   _register_basic  s    
 r   c                   @  s  e Zd ZU dZi Zded< i Zded< d~dd	d
ddddZedd Z	edd Z
eddddZejdddddZddddZddddZdddd Zd!dd"d#Zd!d$d%d&d'Zd(dd%d)d*Zd!d$dd+d,d-Zd!d$ddd.d/d0Zd!dd%d1d2Zd3dd4d5Zddd6d7d8d9Zdd$dd:d;d<Zeeeejd=d>fejd?d@fejdAdBfej dCdDfej!dEdFfej"dGdHfej#dIdJfej$d?d@fej%dKdLfg	 e&dMdMdddddOdPdQZ'e(dMdRddSdTdUZ)e&dVdMdddddOdWdXZ*e(dVdYdddZd[Z+e&d\d]dddd^dOd_d`Z,e(d\daddbdcddZ-e&dedMdddddOdfdgZ.e(dedRdddhdiZ/e&djd]dddd^dOdkdlZ0e(djdaddbdmdnZ1dod!ddpdqdrZ2doddsdtduZ3dddvdwZ4dd!ddydzd{Z5dod!dsd|d}Z6dS )r   a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v2()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        'Some Data'

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

    z"dict[int, tuple[int, _LoaderFunc]]r   zdict[int, Callable[..., Any]]r      II*     NrQ   zbytes | None
int | Noner}   )ifhrS   grouprT   c                 C  s   t |s dt| d}t||dur,|n
|dd | _| jtkrLd| _n| jtkr^d| _nd}t||d dk| _|| _i | _	| 
  | jr| d	|d
d d n| d|dd d | _d| _dS )a  Initialize an ImageFileDirectory.

        To construct an ImageFileDirectory from a real file, pass the 8-byte
        magic header to the constructor.  To only set the endianness, pass it
        as the 'prefix' keyword argument.

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr+   ><znot a TIFF IFD+   Qr1   r   r;   r-   F)rZ   reprSyntaxError_prefixMM_endianII_bigtiffr   tagtyperesetr   next_legacy_api)rs   r   rS   r   msgr2   r2   r6   r   H  s&    

zImageFileDirectory_v2.__init__c                 C  s   | j S rU   )r   r   r2   r2   r6   r   o  r8   zImageFileDirectory_v2.<lambda>c                 C  s   | j S rU   )_offsetr   r2   r2   r6   r   p  r8   rR   r   c                 C  s   | j S rU   )r   r   r2   r2   r6   r   r  s    z ImageFileDirectory_v2.legacy_apir   r~   rT   c                 C  s   d}t |d S )Nz"Not allowing setting of legacy api)	Exception)rs   r~   r   r2   r2   r6   r   v  s    c                 C  s(   i | _ i | _i | _i | _d | _d | _d S rU   )_tags_v1_tags_v2_tagdatar   _nextr   r   r2   r2   r6   r   {  s    zImageFileDirectory_v2.resetrq   c                 C  s   t t| S rU   )rq   dictr   r2   r2   r6   __str__  s    zImageFileDirectory_v2.__str__zdict[str, Any]c                   s    fdd   D S )z
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c                   s"   i | ]\}}t | jj|qS r2   )r   lookupr   r   )r3   coder~   r   r2   r6   r7     s   z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsr   r2   r   r6   named  s    
zImageFileDirectory_v2.namedr\   c                 C  s   t t| jt| jB S rU   )rN   setr   r   r   r2   r2   r6   __len__  s    zImageFileDirectory_v2.__len__r	   tagrT   c                 C  sf   || j vr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrbt|ttfsb|f}|S rU   )r   r   r   r   r   r   rW   rQ   )rs   r   r   typr   handlerr]   r2   r2   r6   __getitem__  s    



z!ImageFileDirectory_v2.__getitem__r   c                 C  s   || j v p|| jv S rU   )r   r   rs   r   r2   r2   r6   __contains__  s    z"ImageFileDirectory_v2.__contains__r   r~   rT   c                 C  s   |  ||| j d S rU   )_setitemr   )rs   r   r~   r2   r2   r6   __setitem__  s    z!ImageFileDirectory_v2.__setitem__)r   r~   r   rT   c              
     s6  t ttf}t|| j t||r(|gn|}|| jvr jrN j| j|< ntj	| j|< t
dd |D r|D ]*}t|tsJ |dk rptj| j|<  qqptj| j|< n<t
dd |D rd}d}d}	|D ]h}t|tsJ |rd|  krdk sn d}|r(d|  k r"d	k s(n d}|	r|dk rd}	q|rNtj| j|< n4|rbtj| j|< n |	rvtj| j|< ntj| j|< ndt
d
d |D rtj| j|< nBt
dd |D rtj| j|< n t
dd |D rtj| j|< | j| tj	kr
dd |D }n | j| tjkr*dd |D }| j| tjkoDt|t}
|
sbt fdd|D }|rn| jn| j}|
s* jdks| j| tjks jd u r*t|dkr*|s*|r| j| tjtjfv r|f}z|\||< W n< ty&   td| dt| d |d ||< Y n0 n|||< d S )Nc                 s  s   | ]}t |tV  qd S rU   )r   ra   r3   r5   r2   r2   r6   rO     r8   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>r   c                 s  s   | ]}t |tV  qd S rU   )r   r\   r  r2   r2   r6   rO     r8   Tr    Fi i   c                 s  s   | ]}t |tV  qd S rU   )r   rh   r  r2   r2   r6   rO     r8   c                 s  s   | ]}t |tV  qd S rU   )r   rq   r  r2   r2   r6   rO     r8   c                 s  s   | ]}t |tV  qd S rU   )r   rQ   r  r2   r2   r6   rO     r8   c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )r   rq   encoder  r2   r2   r6   
<listcomp>  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r2   )r   r\   rh   r  r2   r2   r6   r    r8   c                 3  s&   | ]}t |tr |n|V  qd S rU   )r   rq   Zcvt_enumr   infor2   r6   rO     s   r   zMetadata Warning, tag z had too many entries: z, expected 1)r   rQ   rq   r   r   r   r   r   type	UNDEFINEDallra   ZSIGNED_RATIONALZRATIONALr\   SHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   rW   r   r   lengthrN   
ValueErrorwarningswarn)rs   r   r~   r   Z	basetypesr   r5   shortZsigned_shortlongis_ifddestr2   r	  r6   r    s    
 
zImageFileDirectory_v2._setitemc                 C  s.   | j |d  | j|d  | j|d  d S rU   )r   popr   r   r   r2   r2   r6   __delitem__  s    z!ImageFileDirectory_v2.__delitem__Iterator[int]c                 C  s   t t| jt| jB S rU   )iterr   r   r   r   r2   r2   r6   __iter__  s    zImageFileDirectory_v2.__iter__r   )r   r   rT   c                 C  s   t | j| |S rU   )r   unpackr   )rs   r   r   r2   r2   r6   r     s    zImageFileDirectory_v2._unpack)r   r   rT   c                 G  s   t j| j| g|R  S rU   )r   packr   )rs   r   r   r2   r2   r6   r     s    zImageFileDirectory_v2._packHr  r;   r  bzsigned bytehzsigned shortlzsigned longr   rh   ddoubler   Zlong8r   T)r   r   rT   c                 C  s   |S rU   r2   r   r2   r2   r6   	load_byte"  s    zImageFileDirectory_v2.load_bytezbytes | int | IFDRationalr   rT   c                 C  s*   t |trt|}t |tr&t|f}|S rU   )r   ra   r\   rQ   rs   r   r2   r2   r6   
write_byte&  s
    


z ImageFileDirectory_v2.write_byter+   c                 C  s"   | dr|d d }|ddS )N    r_   zlatin-1r   )endswithdecoder   r2   r2   r6   load_string.  s    
z!ImageFileDirectory_v2.load_stringzstr | bytes | intc                 C  s0   t |trt|}t |ts(|dd}|d S )Nr  r   r.  )r   r\   rq   rQ   r  rs   r~   r2   r2   r6   write_string4  s
    

z"ImageFileDirectory_v2.write_stringr.   r1   z)tuple[tuple[int, int] | IFDRational, ...]c                   s`   |  t|d  d|}ddddfdd t fdd	t|d d d
 |dd d
 D S )Nr-   r;   r\   tuple[int, int] | IFDRationalar%  rT   c                   s    r| |fS t | |S rU   ra   r6  r%  r   r2   r6   combineC  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S rU   r2   r3   numZdenomr:  r2   r6   rO   F  r8   z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r+   r   r   rN   rW   ziprs   r   r   valsr2   r:  r   r6   load_rational=  s    z#ImageFileDirectory_v2.load_rationalra   )r   rT   c                   s   d  fdd|D S )Nr8   c                 3  s&   | ]} j d gt|dR  V  qdS )Z2Ll    N)r   re   r3   ro   r   r2   r6   rO   J  s   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r2   r   r6   write_rationalH  s    z$ImageFileDirectory_v2.write_rationalr0   c                 C  s   |S rU   r2   r   r2   r2   r6   load_undefinedN  s    z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |trt|}t |tr,t|dd}|S )Nr  r   )r   ra   r\   rq   r  r2  r2   r2   r6   write_undefinedR  s
    

z%ImageFileDirectory_v2.write_undefined
   c                   s`   |  t|d  d|}ddddfdd t fdd	t|d d d
 |dd d
 D S )Nr-   r'  r\   r4  r5  c                   s    r| |fS t | |S rU   r7  r8  r9  r2   r6   r:  `  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S rU   r2   r;  r=  r2   r6   rO   c  r8   z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r+   r   r>  r@  r2   rB  r6   load_signed_rationalZ  s    z*ImageFileDirectory_v2.load_signed_rationalc                   s   d  fdd|D S )Nr8   c                 3  s(   | ] } j d gt|ddR  V  qdS )Z2lii   N)r   rp   rD  r   r2   r6   rO   g  s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r2   r   r6   write_signed_rationale  s    z+ImageFileDirectory_v2.write_signed_rational	IO[bytes])fpr   rT   c                 C  s8   | |}t||kr4d| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrN   OSError)rs   rL  r   retr   r2   r2   r6   _ensure_readl  s    
z"ImageFileDirectory_v2._ensure_read)rL  rT   c              
   C  s  |    | | _z8| jr0| d| |dn| d| |dd }t|D ]}| jrp| d| |dn| d| |d	\}}}}t|| j	j
}t|d
}	d| d| d|	 d| d	}
z| j| \}}W n$ ty   td|
| Y qPY n0 || }|| jrdndkrt| }| | jr4dnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 qP|st|
 qP|| j|< || j|< |
d7 }
|
|dkr d| dnt|7 }
t|
 qP| jr2| d| |dn| d| |d\| _W n6 ty }
 ztt|
 W Y d }
~
d S d }
~
0 0 d S )Nr   r1   r$  r+   r   HHQ8s   HHL4sr<   unknownztag:  (
) - type: )z%s - unsupported type %sr-   r;   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read rM  z. Skipping tag z
 - value: rA   <table:  bytes>)r   tellr   r   r   rQ  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readrN   r  r  r   r   r   r   rO  rq   )rs   rL  Z	tag_countrj   r   r   countr   tagnametypnamer   Z	unit_sizer   r   hereoffsetr2   r2   r6   loadv  sr    







"
zImageFileDirectory_v2.loadc                 C  sZ   | j | d| jrdnd }| jr4|| ddd7 }|| jrH| ddn
| d	d7 }|S )
Nr$  r   *   HHr1   r   r   r>   r;   )r   r   r   rs   r   r2   r2   r6   _get_ifh  s
    "zImageFileDirectory_v2._get_ifhr   )rg  rT   c              
     sp  |  | jrdndt| j}g }| jr*dnd}| jr8dnd} t|t| j| jrVdnd  | 7  d }t| j D ]\}}|tkrt|}| j| }	t	d||	t
| |	tjkot|t}
|
rt|  |d	}| j| }| D ]\}}|||< q| }n,t|tr|n|f}| j|	 | g|R  }t|| jj}|
rNd
n
t|	d}d| d| d| d|	 d	}|t|dkrdt| dnt|7 }t	| |
rd}n(|	tjtjtjfv rt|}nt|}t||kr|||	|||ddf qv|||	||  | |f  t|d d d 7  qv|d ur|| \}}	}}}|r| j|	 \}} fdd|| || j D }| j|	 | g|R  }n|  || !||d   }||	|||f||< |D ]N\}}	}}}t	d||	|t
|t
| ||  | jrdnd||	||7 }q||  |d7 }|D ].\}}	}}}||7 }t|d@ r<|d7 }q<|S )Nr   r$  r;   r1   r-   rS  r<   zTag %s, Type: %s, Value: %s)r   ifdrU  zsave: rV  rW  z) - value: r>   rY  rZ  r   r.  r8   r+   c                   s   g | ]}|  qS r2   r2   )r3   r]   rg  r2   r6   r    r8   z1ImageFileDirectory_v2.tobytes.<locals>.<listcomp>r   z%s %s %s %s %srR  rT  )"r   r   rN   r   sortedr   STRIPOFFSETSr   r_  r`  r   r   r  r   r   r   rl  tobytesrW   r   r   r   r   r   r]  rq   r  r  r  appendljustr   r   r   )rs   rg  resultentriesr   fmt_sizeZstripoffsetsr   r~   r   r  rm  r   Zifd_tagZ	ifd_valuer   rd  re  r   rc  r   r   r2   rn  r6   rq    sn    "


*



zImageFileDirectory_v2.tobytesc                 C  sB   |  dkr||   |  }| |}|| |t| S r   )r[  writerl  rq  rN   )rs   rL  rg  rt  r2   r2   r6   save  s    

zImageFileDirectory_v2.save)r   NN)T)T)T)T)T)r   )7r   r   r   r   r   __annotations__r   r   r   rS   rg  r   setterr   r   r   r   r   r  r  r  r  r!  r   r   listmapr   r   r  r  ZSIGNED_BYTEr  r  FLOATr  ZIFDLONG8r   r*  r   r-  r1  r3  rC  rE  rF  rG  rI  rJ  rQ  rh  rl  rq  rx  r2   r2   r2   r6   r     s   
<   '^








 
 

CPr   r   r   Zwrite_c                      s   e Zd ZU dZdddd fddZedd Zed	d Zd
ed< e	dd dddZ
ddddZdddddZddddZddddZdddddd Zdddd!d"Z  ZS )#ImageFileDirectory_v1a  This class represents the **legacy** interface to a TIFF tag directory.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v1()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        ('Some Data',)

    Also contains a dictionary of tag types as read from the tiff image file,
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    r	   r}   )rt   kwargsrT   c                   s   t  j|i | d| _d S )NT)superr   r   )rs   rt   r  	__class__r2   r6   r   8  s    zImageFileDirectory_v1.__init__c                 C  s   | j S rU   )r   r   r2   r2   r6   r   <  r8   zImageFileDirectory_v1.<lambda>c                 C  s   | j S rU   )r   r   r2   r2   r6   r   =  r8   zdict[int, int]r   r   )originalrT   c                 C  s(   | |j d}|j|_|j|_|j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`

        rY   )rS   r   r   r   )clsr  rm  r2   r2   r6   from_v2C  s
    zImageFileDirectory_v1.from_v2r   c                 C  s4   t | jd}t| j|_t| j|_t| j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`

        rY   )r   rS   r   r   r   r   )rs   rm  r2   r2   r6   to_v2U  s
    zImageFileDirectory_v1.to_v2r   rR   r   c                 C  s   || j v p|| jv S rU   )r   r   r   r2   r2   r6   r  f  s    z"ImageFileDirectory_v1.__contains__r\   c                 C  s   t t| jt| jB S rU   )rN   r   r   r   r   r2   r2   r6   r   i  s    zImageFileDirectory_v1.__len__r  c                 C  s   t t| jt| jB S rU   )r   r   r   r   r   r2   r2   r6   r!  l  s    zImageFileDirectory_v1.__iter__r  c                 C  s   dD ]}|  ||| qd S N)FT)r  )rs   r   r~   r   r2   r2   r6   r  o  s    z!ImageFileDirectory_v1.__setitem__c                 C  sn   || j vrL| j| }| j| }| j| \}}dD ]}| ||| ||| q0| j | }t|ttfsj|f}|S r  )r   r   r   r   r  r   rW   rQ   )rs   r   r   r   r   r   legacyr]   r2   r2   r6   r   s  s    



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   r   r   tagsZtagdatary  classmethodr  r  r  r   r!  r  r   __classcell__r2   r2   r  r6   r  %  s   
r  c                      s   e Zd ZdZdZdZd&dddd fd	d
ZddddZeddddZ	dddddZ
dddddZddddZddddZdd fddZddddZddd d!Zddd"d#Zddd$d%Z  ZS )'TiffImageFileZTIFFz
Adobe TIFFFNStrOrBytesPath | IO[bytes]zstr | bytes | Noner}   )rL  filenamerT   c                   s   |  |  t  || d S rU   )r  r   )rs   rL  r  r  r2   r6   r     s    zTiffImageFile.__init__r   c                 C  s   | j d}|d dkr(|| j d7 }t|| _| jj | _| _d| _| j | _g | _	d| _
td td| j tdt| | d	 dS )
z#Open the first image in a TIFF filer1   r+   r   r_   Nz*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )rL  rN  r   tag_v2r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesr_  r`  r   _seekrk  r2   r2   r6   _open  s    

zTiffImageFile._openr\   c                 C  sb   | j }|d u rN|  }| t| j | j d u rD| |  d  q&| | | j d us\J | j S )Nr   )r  r[  r  rN   r  ra  )rs   Zcurrent_n_framescurrentr2   r2   r6   n_frames  s    

zTiffImageFile.n_frames)framerT   c                 C  sN   |  |sdS | | | jdurJ| jj| jksD| jj| jksD| jrJd| _dS )z%Select a given frame as current imageN)Z_seek_checkr  _imimr   
_tile_sizemodereadonly)rs   r  r2   r2   r6   ra    s    


zTiffImageFile.seekc                 C  s  t | jtr| jj| j| _t| j|kr
| js>d}t|t	
d|| j| j| j  | jdkrpd}t|| j| j | j| j t	
d| j  | j| j | jj| jv rd| _n
| jj| _| jdkr|d | _t| jdkr| jdk| _|  jd7  _q| j| j|  | j| j t| jv rn| jt }t |trbt|dkrb|d }|| jd< nd| jv r| jd= |   t| j | _| _|| _|   d S )	Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %sl            zUnable to seek to framezLoading tags, location: %sr   r   xmp)r   r  r   exrL  rN   r  r  EOFErrorr_  r`  r  r[  r  ra  rr  r  rh  r   r  is_animatedXMPrW   r
  Z_reload_exifr  r  r   rm  _setup)rs   r  r   r  r2   r2   r6   r    sT    




zTiffImageFile._seekc                 C  s   | j S )zReturn the current frame number)r  r   r2   r2   r6   r[    s    zTiffImageFile.tellzdict[int, dict[str, bytes]]c                 C  s   i }| j tjj}|r|drt|dd }t|d d d d }t	|d| d|  }|d| d| |  }d|i||< |td| | d d d }q|S )	a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        s   8BIMr-   r/   r   r+   rH  r   N)
r  r]  r   BaseZImageResourcesrV   i16mathceili32)rs   blocksr]   idnr   r   r2   r2   r6   get_photoshop_blocks  s    
$z"TiffImageFile.get_photoshop_blockszImage.core.PixelAccess | Nonec                   s   | j r| jr|  S t  S rU   )tileuse_load_libtiff_load_libtiffr  rh  r   r  r2   r6   rh    s    zTiffImageFile.loadc                 C  s:   | j d u r*t| j tj| j| j| _tj	|  d S rU   )
r  r   Z_decompression_bomb_checkr  corenewr  r  r   load_preparer   r2   r2   r6   r    s    
zTiffImageFile.load_preparec                 C  s`   | j s4d| _|  }tjD ]}||vr(q|| qtj| dd tj	j
| jv r\| jtj	j
= d S )NT)Zin_place)r  !_close_exclusive_fp_after_loadingZgetexifr   TAGS_V2_GROUPSget_ifdr   Zexif_transposer   r  Orientationr  )rs   exifkeyr2   r2   r6   load_end  s    
zTiffImageFile.load_endc              
   C  s$  t j |  |   t| jdks.d}t|| jd d }| jd d }z0t| jdo`| j }t| jdrx| j	  W n ty   d}Y n0 |rt
|tsJ t|}||d< t|}t | jd	|| j}z|| j| W n4 ty } zd
}t||W Y d}~n
d}~0 0 | jo&| j }t| jdrVtd || j \}	}
n||rtd |sx| jd t|dtj}|d\}	}
t||tj n*td | jd || j \}	}
g | _d| _|    |r| j!  d| _|
dk rd|
 }t|t j | S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r,   filenoflushFr+   libtiffzCouldn't set the imageNgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just readingzdecoder error )"r   rh  r  rN   r  rO  r   rL  r  r  r   rW   r{  Z_getdecoderr  Zdecoderconfigsetimager  r  Z_exclusive_fpr  r_  r`  r0  r  ra  oslseekSEEK_CURSEEK_SETrN  r  r  close)rs   r   Zextentsrt   rL  Z	args_listdecodereZclose_self_fpr  errposr2   r2   r6   r  0  s`    
 






zTiffImageFile._load_libtiffc                  C  s  d| j v rd}t|t| j td | _| j td| _| j td}| jdkrVd}| j t	d}t
d t
d| j t
d	| t
d
| j t
d| t
d| j t z| j t }| j t }W n4 ty } zd}t||W Y d}~n
d}~0 0 t|trt|ts(d}t|||f| _| j tjj}|dv rX||f| _n
||f| _t
d| j | j td}t|dkrt|t|  krdkrn nd}| j td}	| j td}
|dv rd}n|dkrd}nd}|t|
7 }t|	}| j t | jdkr*|dv r*dnd}|t!krRt
"d| d}t#|||k rj|	d| }	n||kr|dkr|	| }	t|	|krd}t#|| j j$||||	|
f}t
d| zt%| \| _&}W n> ty } z$t
d d}t#||W Y d}~n
d}~0 0 t
d| t
d | j' | j| j(d!< | j t)d}| j t*d}|r|r| j t+}|d"kr||f| j(d#< nX|dkr|d$ |d$ f| j(d#< n6|du r||f| j(d#< ||f| j(d%< n||f| j(d%< d } }}g | _,t-p| jd&k| _.| j.r|d"krJ|dd d |dd  }t
d| t%| \| _&}|dkrr| jd'krr| jdkrrd(}n,|d)krd*}n|/d+r|dd, d- }|| jd.| j j0f}| j,1t23d/dd||fd| nt4| j v st5| j v rXt4| j v r| j t4 }| j t6|}|}nJ| j t5 }| j t7}| j t8}t|trPt|ts\d0}t||}||kr||kr| jd"kr|d,d }|D ]}|| |kr|t9|	 d1 }nd}|}| jd"kr|| }|| }|t|df}| j,1t23| j||t|| |t|| |f|| ||7 }||krd||  }}||krd}|d7 }qnt
d2 d}t#|t:| j v r| j t: | j(d3< | j'd4v rd5d6 | j t; D }t<=d7d8>|| _?dS )9z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r&   r/   z*** Summary ***z- compression: %sz - photometric_interpretation: %sz- planar_configuration: %sz- fill_order: %sz- YCbCr subsampling: %szMissing dimensionsNzInvalid dimensions)r.   r/   r0   r1   z
- size: %sr9   r2   )r+   r/   r1   r,   r.   r-   )r+   r/   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %scompressionr+   dpigRQ@
resolutionr%   r'   rF   r=   I;16N)z;16Bz;16Lr_   NFr  zInvalid tile dimensionsr1   z- unsupported data organizationicc_profilerJ   rK   c                 S  s   g | ]}t |d  qS r"   r   )r3   r%  r2   r2   r6   r  ~  r8   z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr8   )@r  rO  COMPRESSION_INFOr]  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr_  r`  YCBCRSUBSAMPLING
IMAGEWIDTHIMAGELENGTHr^  	TypeErrorr   r\   r  r  r   r  r  _sizer   SAMPLEFORMATrN   rn   rm   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   rS   	OPEN_INFO_moder  r
  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r/  rg  rr  r   _Tilerp  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r%   r   palette) rs   r   photoZ	fillorderZxsizeZysizer  ZorientationZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr  rawmodeZxresZyresZresunitxyZlayerr6  offsetsr&  wZ	tilewidthrg  strideZtile_rawmodert   r  r2   r2   r6   r    s4   



 


2




 




$

 


zTiffImageFile._setup)N)r   r   r   formatformat_descriptionr  r   r  r   r  ra  r  r[  r  rh  r  r  r  r  r  r2   r2   r  r6   r    s"    1`r  r:   r;   rE   rJ   rK   rD   r=   I;16LrC   rF   rH   rG   rL   YCbCrrM   r?   )r:   r;   rE   rJ   rK   r@   r=   r  rB   rF   rH   rG   rL   r  rM   r?   zImage.ImagerK  zstr | bytes)r  rL  r  rT   c           6      C  s	  zt | j \}}}}}}W n< tyV }	 z$d| j d}
t|
|	W Y d }	~	n
d }	~	0 0 | j}| j}t|d}|dr~d|_z|d }W n, ty   | j	d}t
|trd }Y n0 |d u rd}n|dkrd	}n|d
krd}tp|dk}d|t< | jd |t< | jd |t< d|v r$|d }n:d|v rZ|d }t
|tr^t }|| |}ni }tdt| t
|tr| }|D ]h}t
|tjr|tjv r||||< n||||< z|j| |j|< W n ty   Y n0 qi }t| dr
| j  }i |t!| di }t"t#fD ]}||v r&||= q&t| drt$t%t&t't(t)fD ]^}|| j*v rZ|t'kr| j*j| tj+tj,fvr||= n | j*| ||< | j*j| |j|< qZ|d| j	d}|r||t-< t.dft%dft&dft%dft&dft$dft/dft0dft1dft2dff
D ] \}}||v r|| ||< q|d}|rnd|t$< |d |t%< |d |t&< |dkr||t3< t4|dkrt4||t5< |d ur||t6< |dkr||t#< t7|vr||t7< n| jd v rh|t7 dkrh| jd!kr^| 8 }| }|d urht9|j:D ]:}t9|j;D ](}|||f d"krDdnd"|||f< q*q|} n
t<=| } | jd#v r| j>?d$d%}g }t4|d& }t9d&D ]>} |d'd( |||  || d   D 7 }|dgd)|  7 }q||t@< |t |t  }!}"t4||!|d  d* d+  }#tA|vr|rj|d,tB}$|#dkr:dntC|$|# |"}%|d	krntC|%d* d+ d+ |"}%n|"}%|%dkr|d}%|%|tA< |#dkrdn
|#|tA  }&|"|tA  d |tA  }'|&d-krtjD|jtE< |&f|'d  |#|" |&|'d   f |tE< tFt9d|&|' |&|tG< tH|d|tI< | jd.krPtJd/tKd0iL D ]\}}(|M||( q8tNtOtPtQg})|	r.d1|v r|d1 }*t
|*tr|*dk s|*d2krd3}
tR|
|d	krd4}
tR|
|*|tS< td5 td6tT|L  d}+t|d7rz|Ud |V }+W n tWjXy   Y n0 i },|)tYtKtEtGtZt[g7 })t3|d i}-t\]|L |L D ]\}}.|tj^vrt!tj_d8d9szqR|tjv rtj`|,|< nP||jv r|j| |,|< n4t
|.ttatbtfsȐqRntc|jd}/|/r|/|,|< ||-vrR||)vrRt
|.tbr|.ed:d;d< |-|< n"t
|.tfr2ta|.|-|< n|.|-|< qRt#|-v rjt4|-t# dkrj|-t# d |-t#< td=tT|-L  | jd>v rd?}t|-L }0|0g  |||+||0|,f}1th| jd@|1|}2|2i| j>dA| j  |2etjjkdd  \}3}4|+	s |l|4 |3rؐ	qq|3dk 	rrdB|3 dC}
t|
nD|)D ]}||= 	q2|m|}5tjn| |tjoddA| j |5||#dfg dD|v 	rtp| dD| d S )ENzcannot write mode z as TIFFrY   Zbig_tiffTr  r%   r&   r'   r)   r(   r   r   Ztiffinfor  zTiffinfo Keys: %sr   r  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r+   r9   )r:   r;   r:   r!   r  rF   r  r,   c                 S  s   g | ]}|d  qS r  r2   r  r2   r2   r6   r  7  r8   z_save.<locals>.<listcomp>r"   r0   r1   Z
strip_sizer    r  )r   r   )r   r!      r!   r  r!   qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  rP   Fr  r   r.  zConverted items: %s)r=   r?   r  r  r  rI   zencoder error z when writing image fileZ_debug_multipage)q	SAVE_INFOr  r^  rO  encoderinfoencoderconfigr   r]  r   r
  r   r\   WRITE_LIBTIFFr  r   r  r  rQ   r   ZExifrh  r_  r`  r{  r  r  r   r  r  r   r   r   r   ru   EXIFIFDr  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r  r  r  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  rN   r  r  r  copyr\  heightwidthr   invertr  Z
getpaletter  r  
STRIP_SIZErm   r  STRIPBYTECOUNTSrW   rp  COMPRESSION_INFO_REVr  r  REFERENCEBLACKWHITEr   
setdefaultr  r  r  TILEBYTECOUNTSr  JPEGQUALITYro  ra  r  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFD	itertoolschainZLIBTIFF_COREr  r~  rh   rq   r   r  r  ra   sortZ_getencoderr  r   ZMAXBLOCKrw  rx  _saver  setattr)6r  rL  r  r  rS   r  r  bitsextrar  r   r  r  rm  r  r  r
  r  r  Z
legacy_ifdZsupplied_tagsr   Ziccr   r  Zinverted_imZpxr  r  ZlutZcolormapcolorsrj   r  r&  r  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imagedefault_valueZ	blocklistr  r  typesZattsr~   r  r  r6  encodererrcoder   rg  r2   r2   r6   r#    s    



















*
&





 









r#  c                   @  s  e Zd Zg dZh dZdSdddddd	Zdd
ddZdd
ddZdd
ddZd d
ddZ	dddddZ
dd
ddZejfddddddZdd
ddZddd d!d"Zdd
d#d$Zd%dd&d'd(Zddd)d*d+Zddd)d,d-Zdd
d.d/Zdd
d0d1Zed2ddd3d4d5ZdTddddd7d8d9Zddd:d;d<Zddd:d=d>Zddd:d?d@ZddddAdBdCZddd:dDdEZddd:dFdGZdd
dHdIZ dd
dJdKZ!ddddLdMdNZ"dUdddddOdPdQZ#dRS )VAppendingTiffWriter)r   r   r   r+   r-   r1   r   r   r+   r-   r1   r-   r1   r-   r+   r-   r1   >   i   r$   i  i  i	  r#   Fr  rR   r}   )fnr  rT   c                 C  s   |  t |rR|| _d| _zt||r&dnd| _W qh tyN   t|d| _Y qh0 nttt || _d| _| j	 | _
|   d S )NTzw+bzr+bF)r   r   close_fpopenr   rO  r   r   rQ   r[  	beginningsetup)rs   r-  r  r2   r2   r6   r     s    zAppendingTiffWriter.__init__r   c                 C  s   | j | jtj d | _d| _| j d | _}d|v | _	|sHd| _
d S d| _
|tvrbd}t|| |trtdnd | j	r| j dtj |   |   d S )	Nr   r-      +TFzInvalid TIFF file headerr   r   )r   ra  r0  r  r  whereToWriteNewIFDOffsetoffsetOfNewPagerN  IIMMr   isFirstrX   RuntimeError	setEndianrV   r   r  skipIFDsgoToEnd)rs   iimmr   r2   r2   r6   r1    s"    
zAppendingTiffWriter.setupc                 C  s   | j r
d S | j| j | jd}|s,d S || jkrBd}t|| jrX| jdtj	 | 
| jrfdnd}|| j7 }| jd usJ | j| j | || jrdnd | j| |   d S )Nr-   z1IIMM of new page doesn't match IIMM of first pager1   )r6  r   ra  r4  rN  r5  r7  r   r  r  _readr3  _writefixIFD)rs   r;  r   
ifd_offsetr2   r2   r6   finalize  s$    

zAppendingTiffWriter.finalizec                 C  s   |    |   d S rU   )r@  r1  r   r2   r2   r6   newFrame6  s    zAppendingTiffWriter.newFramec                 C  s   | S rU   r2   r   r2   r2   r6   	__enter__;  s    zAppendingTiffWriter.__enter__r   )rt   rT   c                 G  s   | j r|   d S rU   )r.  r  rw   r2   r2   r6   __exit__>  s    zAppendingTiffWriter.__exit__r\   c                 C  s   | j  | j S rU   )r   r[  r4  r   r2   r2   r6   r[  B  s    zAppendingTiffWriter.tell)rg  whencerT   c                 C  s*   |t jkr|| j7 }| j|| |  S )z
        :param offset: Distance to seek.
        :param whence: Whether the distance is relative to the start,
                       end or current position.
        :returns: The resulting position, relative to the start.
        )r  r  r4  r   ra  r[  )rs   rg  rD  r2   r2   r6   ra  E  s    

zAppendingTiffWriter.seekc                 C  s^   | j dtj | j  }d|d  }d|  k r:dk rNn n| j t| | j  | _d S )Nr   r>   )r   ra  r  SEEK_ENDr[  rw  rQ   r4  )rs   r  Z	pad_bytesr2   r2   r6   r:  R  s    
zAppendingTiffWriter.goToEndrq   )endianrT   c                 C  sB   || _ | j  d| _| j  d| _| j  d| jr6dnd | _d S )Nr;   r$  rj  r   )rF  ZlongFmtZshortFmtr   	tagFormat)rs   rF  r2   r2   r6   r8  \  s    zAppendingTiffWriter.setEndianc                 C  s|   |  | jrdnd}|dkr8| j | jr.dnd | _qx| j| |  | jrRdnd}| j|| jrjdnd tj q d S )Nr1   r-   r   r+   rS  r<   )r<  r   r   r[  r3  ra  r  r  )rs   r?  num_tagsr2   r2   r6   r9  b  s    zAppendingTiffWriter.skipIFDsr   r+  c                C  s   | j |S rU   )r   rw  r,  r2   r2   r6   rw  o  s    zAppendingTiffWriter.write)
field_sizerT   c                 C  s6   zdddd| W S  t y0   d}t|Y n0 d S )Nr$  r;   r   )r+   r-   r1   zoffset is not supported)r^  r7  )rs   rI  r   r2   r2   r6   _fmtr  s
    zAppendingTiffWriter._fmtc                 C  s&   t | j| | | j|\}|S rU   )r   r"  rF  rJ  r   rN  )rs   rI  r~   r2   r2   r6   r<  y  s    zAppendingTiffWriter._readc                 C  s
   |  dS Nr+   r<  r   r2   r2   r6   	readShort  s    zAppendingTiffWriter.readShortc                 C  s
   |  dS Nr-   rL  r   r2   r2   r6   readLong  s    zAppendingTiffWriter.readLongr   )bytes_writtenexpectedrT   c                 C  s,   | d ur(| |kr(d|  d| }t |d S )Nzwrote only z bytes but wanted )r7  )rP  rQ  r   r2   r2   r6   _verify_bytes_written  s    z)AppendingTiffWriter._verify_bytes_writtenr   )r~   rI  new_field_sizerT   c                 C  sJ   | j | tj |s|}| j t| j| | |}| 	|| d S rU   )
r   ra  r  r  rw  r   r#  rF  rJ  rR  )rs   r~   rI  rS  rP  r2   r2   r6   _rewriteLast  s    z AppendingTiffWriter._rewriteLastr   c                 C  s   |  |dd d S )Nr+   r-   rT  r2  r2   r2   r6   rewriteLastShortToLong  s    z*AppendingTiffWriter.rewriteLastShortToLongc                 C  s   |  |dS rK  rU  r2  r2   r2   r6   rewriteLastShort  s    z$AppendingTiffWriter.rewriteLastShortc                 C  s   |  |dS rN  rU  r2  r2   r2   r6   rewriteLastLong  s    z#AppendingTiffWriter.rewriteLastLong)r~   rI  rT   c                 C  s0   | j t| j| | |}| || d S rU   )r   rw  r   r#  rF  rJ  rR  )rs   r~   rI  rP  r2   r2   r6   r=    s    zAppendingTiffWriter._writec                 C  s   |  |d d S rK  r=  r2  r2   r2   r6   
writeShort  s    zAppendingTiffWriter.writeShortc                 C  s   |  |d d S rN  rY  r2  r2   r2   r6   	writeLong  s    zAppendingTiffWriter.writeLongc                 C  s   |    | jr| j  d S rU   )r@  r.  r   r  r   r2   r2   r6   r    s    zAppendingTiffWriter.closec              
   C  s.  |  | jrdnd}t|D ]
}t| j| j| jr:dnd\}}}| j| }|| }| jrddnd}||k}	|	s|  || j	 }
| 
|
| || jv r| j }tdt|j|t|d||| |	r| || | j||  n$| j|
 | || | j| q|	r| j|tj qd S )Nr1   r+   r<   r-   z;fixIFD: %s (%d) - type: %s (%d) - type size: %d - count: %drU  )r<  r   r\  r   r"  rG  r   rN  
fieldSizesr4  rT  Tagsr[  r_  r`  r   r   r   r   r]  _fixOffsetsra  r  r  )rs   rH  rj   r   Z
field_typerc  rI  Z
total_sizerv  is_localrg  Zcur_posr2   r2   r6   r>    s>    





zAppendingTiffWriter.fixIFD)rc  rI  rT   c                 C  s   t |D ]}| |}|| j7 }d}| jr@|dv r@|dkr@d}n|dkrT|dkrTd}|r|dkrld	}t|| ||| | d d }| j|tj	 | 
| | jd| tj	 q| || qd S )
Nr   )r+   r-   l        r1   r+   r    r-   r   znot implemented)r\  r<  r4  r   r7  rT  r   ra  r  r  rZ  )rs   rc  rI  rj   rg  rS  r   rewindr2   r2   r6   r^    s$    


zAppendingTiffWriter._fixOffsets)rc  isShortisLongrT   c                 C  s$   |r
d}n|rd}nd}|  ||S )Nr+   r-   r   )r^  )rs   rc  ra  rb  rI  r2   r2   r6   
fixOffsets  s    zAppendingTiffWriter.fixOffsetsN)F)r   )FF)$r   r   r   r\  r]  r   r1  r@  rA  rB  rC  r[  r  r  ra  r:  r8  r9  rw  rJ  r<  rM  rO  staticmethodrR  rT  rV  rW  rX  r=  rZ  r[  r  r>  r^  rc  r2   r2   r2   r6   r,    sB   	
 ) r,  c           
   	   C  s   t | jdg }t| ds,|s,t| ||S |  }zt|}| g| D ]d}|| }t|dshd|_t	|dd}t
|D ]*}	||	 |  t||| |  q|||_qJW d    n1 s0    Y  W | | n| | 0 d S )Nappend_imagesr  r  r2   r   )r{  r  r]  r   r#  r[  r,  Z_attach_default_encoderinfor  ru   r\  ra  rh  rA  )
r  rL  r  re  Zcur_idxtfZimsr  Znfrr   r2   r2   r6   	_save_all	  s$    




(rg  z.tifz.tiffz
image/tiff)
__future__r   r  r   loggingr  r  r   r  collections.abcr   r   Z	fractionsr   Znumbersr   r   typingr   r	   r
   r   r    r   r   r   r   r   r   _binaryr   r  r   r  r   Z
_deprecater   _typingr   Z_utilr   r   r   r   r   r   	getLoggerr   r_  r  r  r  r   r   r  r  r  r  r  r  r  r  rp  r  r  r  r  r  r  r  r  r  r  r  Z	PREDICTORr  r  r  r  r  r  r  r  Z
JPEGTABLESr  r  r  r	  r
  r  r  r  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r   r  r  rn   r  rX   ru   r  rZ   re   rp   r   r   rz   ra   rQ   rR   r   r   r   r   r\   Z
_IFDv2Baser   r   r   r   r$  r  ZImageFileDirectoryr  r  r#  BytesIOr,  rg  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer2   r2   r2   r6   <module>)   s&   
~	
	     \      8  .