U
    ڲg1                    @  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
 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% e&e'Z(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d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/ZKd0ZLd1ZMd2ZNd3ZOd4ZPd5ZQd6ZRd7ZSd8ZTd9ZUd:ZVd;ZWd<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMZXdNdO eXY D ZZe-d dPddPdQfdRe.d dPddPdQfdRe-d dPdSdPdQfdTe.d dPdSdPdQfdTe-ddPddPdQfdUe.ddPddPdQfdUe-ddPdSdPdQfdVe.ddPdSdPdQfdVe-d dPddWdQfdXe.d dPddWdQfdXe-d dPdSdWdQfdYe.d dPdSdWdQfdYe-ddPddWdQfdZe.ddPddWdQfdZe-ddPdSdWdQfd[e.ddPdSdWdQfd[e-d dPdd\dQfd]e.d dPdd\dQfd]e-d dPdSd\dQfd^e.d dPdSd\dQfd^e-ddPdd\dQfd_e.ddPdd\dQfd_e-ddPdSd\dQfd`e.ddPdSd\dQfd`e-d dPddadQfdbe.d dPddadQfdbe-d dPdSdadQfdce.d dPdSdadQfdce-ddPddadQfdde.ddPddadQfdde-ddWddadQfdde.ddWddadQfdde-ddPdSdadQfdee.ddPdSdadQfdee-ddPddfdQfdge-d dPddhdQfdie-ddPddhdQfdie.ddPddhdQfdje-ddPdSdhdQfdke-ddWddhdQfdle.ddWddhdQfdme-d dnddodQfdpe.d dnddodQfdqe-ddPddodQfdre-ddWddodQfdse.ddWddodQfdte-ddnddodQfdpe.ddnddodQfdqe-ddPddudWfdve.ddPddudWfdve-dSdPddwdQfdxe.dSdPddwdQfdxe-dSdPdSdwdQfdye.dSdPdSdwdQfdye-dSdPddzdQfd{e.dSdPddzdQfd{e-dSdPddzd|fd}e.dSdPddzd|fd}e-dSdPdd~dfde.dSdPdd~dfde-dSdPdddfde.dSdPdddfde-dSdPddzdPfde.dSdPddzdPfde-dSdPdd~dfde.dSdPdd~dfde-dSdPdddfde.dSdPdddfde-dSdPddzdWfd{e.dSdPddzdWfd{e-dSdPdd~dfde.dSdPdd~dfde-dSdPdddfde.dSdPdddfde-dSdPddzdfd{e.dSdPddzdfd{e-dSdPdddQfde.dSdPdddQfde-dSdPdddQfde.dSdPdddQfde-dSdPddd|fde.dSdPddd|fde-dSdPdddPfde.dSdPdddPfde-dSdPdddWfde.dSdPdddWfde-ddPddPdQfde.ddPddPdQfde-ddPdSdPdQfde.ddPdSdPdQfde-ddPddWdQfde.ddPddWdQfde-ddPdSdWdQfde.ddPdSdWdQfde-ddPdd\dQfde.ddPdd\dQfde-ddPdSd\dQfde.ddPdSd\dQfde-ddPddadQfde.ddPddadQfde-ddPddud|fde-ddPddudWfde.ddPddudWfde-ddPdSdadQfde.ddPdSdadQfde-ddPddzdQfde.ddPddzdQfde-ddPdd~d|fde.ddPdd~d|fde-ddPdddfde.ddPdddfde-ddPdddQfde-ddPddadQfdde.ddPddadQfdde-ddPddwdQfd}e.ddPddwdQfd}e-ddPddwdQfde.ddPddwdQfdivZ[e\dd e[D Z]ddddddgZ^e_ej`dd	se$dd dddddZadd Zbdd Zci Zdi Zedd ZfG dd deZgddĄ ZhddƄ ZiddȄ Zje	re
ekef Zlne
ZlG ddʄ delZmedem_deeem_ee%Y D ]F\ZnZoeopdd̡Zoeqemdeo eden d  eqemdeo eeen  
q[d[e[n[oG ddЄ demZrerZsG dd҄ dejZtde-dddPdfde-dddadfde-dddudSfde-dddadfde-dddudSfde-ddSdodfde-dddhdfde-ddSdhdfde-dddodfde-dSddwdfde-dSddzd fde-dSddzdSfde-dddzdfde-dddwdfde-dddwdfde.ddSdodfde.dddhdfde.ddSdhdfde.dddodfdZudd ZvG dd dZwdddddddZxeyetjzetea e{etjzev e|etjzex e}etjzddg e~etjzd dS )    )annotationsN)MutableMapping)Fraction)NumberRational)IOTYPE_CHECKINGAnyCallableNoReturn   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8)	deprecateTYPESFT   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  r,   ).0kvr,   r,   7/tmp/pip-unpacked-wheel-xela2va7/PIL/TiffImagePlugin.py
<dictcomp>   s      r1   r   r,   )1z1;Ir%   )r3   z1;IR)r3   r3   )r3   z1;R)r%   )LzL;2I)r4   zL;2IR)r4   zL;2)r4   zL;2R)r'   )r4   zL;4I)r4   zL;4IR)r4   zL;4)r4   zL;4R)r+   )r4   zL;I)r4   zL;IR)r4   r4   )r4   zL;R)   )I;16zI;12)   )r6   r6   )I;16Br8   )r6   zI;16R)II;16S)r9   I;16BS)r&   )    )FF;32F)r=   F;32BF)r9   zI;32N)r9   I;32S)r9   I;32BS)r+   r+   )LArB   )r+   r+   r+   )RGBrC   )rC   zRGB;R)r+   r+   r+   r+   )RGBArD   )r   )rC   RGBX)r+   r+   r+   r+   r+   r   r   )rC   ZRGBXX)r+   r+   r+   r+   r+   r+   )r   r   r   )rC   ZRGBXXX)rD   ZRGBa)r   r   )rD   ZRGBaX)r   r   r   )rD   ZRGBaXX)r%   r   )rD   ZRGBAX)r%   r   r   )rD   ZRGBAXX)i  )r7   r7   r7   )rC   zRGB;16L)rC   zRGB;16B)r7   r7   r7   r7   )rD   zRGBA;16L)rD   zRGBA;16B)rC   zRGBX;16L)rC   zRGBX;16B)rD   zRGBa;16L)rD   zRGBa;16Br&   )PzP;1)rG   zP;1R)rG   zP;2)rG   zP;2R)rG   zP;4)rG   zP;4R)rG   rG   )rG   ZPX)PArH   )rG   zP;Rr(   )CMYKrI   )rI   ZCMYKX)rI   ZCMYKXX)rI   zCMYK;16Lr)   r+   )LABrJ   c                 c  s   | ]}t |d  V  qdS )r'   N)len)r-   Zkey_tpr,   r,   r0   	<genexpr>  s     rL      MM *   II* s   MM* s   II *s   MM +s   II+ libtiff_support_custom_tagsz*Support for LibTIFF earlier than version 4r5   bytesbool)prefixreturnc                 C  s   | d d t kS Nr'   )PREFIXESrR   r,   r,   r0   _accept  s    rW   c                 C  s<   t | dk}t|rd|  n| |}|r8|d d d S |S )Nr   )absIFDRationallimit_rational)valmax_valinvn_dr,   r,   r0   _limit_rational!  s    r`   c                 C  sP   t | }|j|jf}t||k r.t| t|}t||krLt | } t| |}|S N)r   	numeratordenominatorminr`   rY   max)r\   r]   Zmin_valfracr_   r,   r,   r0   _limit_signed_rational'  s    
rg   c                   s    fdd}|S )Nc                   s   t | j | S ra   )getattr_valselfargsopr,   r0   delegate=  s    z_delegate.<locals>.delegater,   )rn   ro   r,   rm   r0   	_delegate<  s    rp   c                   @  s^  e Zd ZdZdZd8ddZedd Zedd	 Zd
d Z	ddddZ
ddddZdddddZdd Z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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*e+d6rZed6Z,d7S )9rZ   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_denominatorri   r   c                 C  s   t |tr&|j| _|j| _|j| _dS t |trB|j| _|j| _n|| _|| _|dkrbtd| _n |dkrvt|| _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   )	
isinstancerZ   rb   rq   rc   rr   ri   r   float)rk   valuerc   r,   r,   r0   __init__Q  s    


zIFDRational.__init__c                 C  s   | j S ra   )rq   rk   r,   r,   r0   rb   k  s    zIFDRational.numeratorc                 C  s   | j S ra   )rr   rx   r,   r,   r0   rc   o  s    zIFDRational.denominatorc                 C  s.   | j dkr| j| j fS | j|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rc   rb   ri   Zlimit_denominator)rk   Zmax_denominatorfr,   r,   r0   r[   s  s    
zIFDRational.limit_rationalstrrS   c                 C  s   t t| jS ra   )rz   ru   ri   rx   r,   r,   r0   __repr__  s    zIFDRational.__repr__intc                 C  s
   | j  S ra   )ri   __hash__rx   r,   r,   r0   r~     s    zIFDRational.__hash__objectrQ   )otherrS   c                 C  s0   | j }t|tr|j }t|tr(t|}||kS ra   )ri   rt   rZ   ru   )rk   r   r\   r,   r,   r0   __eq__  s    

zIFDRational.__eq__c                 C  s   | j | j| jgS ra   )ri   rq   rr   rx   r,   r,   r0   __getstate__  s    zIFDRational.__getstate__c                 C  s,   t | d |\}}}|| _|| _|| _d S )Nr   )rZ   rw   ri   rq   rr   )rk   stateri   rq   rr   r,   r,   r0   __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__rw   propertyrb   rc   r[   r|   r~   r   r   r   rp   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   r,   r,   r,   r0   rZ   C  sR   


rZ   c                   s    fdd}|S )Nc                   sB   ddl m} | jdr2| jdd  dd| < | ft < | S )Nr   r   load_r(   _ )r   r   r   
startswithreplace_load_dispatch)funcr   idxsizer,   r0   	decorator  s
    z#_register_loader.<locals>.decoratorr,   )r   r   r   r,   r   r0   _register_loader  s    r   c                   s    fdd}|S )Nc                   s   | t  < | S ra   )_write_dispatch)r   r   r,   r0   r     s    z#_register_writer.<locals>.decoratorr,   )r   r   r,   r   r0   _register_writer  s    r   c                   sZ   ddl m} | \} }|||< td  d fdd	ft|<  fddt|< d S )	Nr   r   =Tc                   s   |  t|    |S ra   )_unpackrK   rk   data
legacy_apifmtr   r,   r0   <lambda>  s    z!_register_basic.<locals>.<lambda>c                   s   d  fdd|D S )N    c                 3  s   | ]}  |V  qd S ra   )_packr-   rv   )r   rk   r,   r0   rL     s     z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrk   values)r   rx   r0   r     s    )T)r   r   structcalcsizer   r   )Zidx_fmt_namer   r   namer,   r   r0   _register_basic  s    
r   c                   @  s8  e Zd ZU dZi Zded< i Zded< dhd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 Zd dd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd dd+d,d-Zd.d/ Zd0d1 Zd2d3 Zeeeejd4d5fejd6d7fejd8d9fej d:d;fej!d<d=fej"d>d?fej#d@dAfej$d6d7fej%dBdCfg	 e&dDdDdidFdGZ'e(dDdHdI Z)e&dJdDdjdKdLZ*e(dJdMdN Z+e&dOdPdkdQdRZ,e(dOdSdT Z-e&dUdDdldVdWZ.e(dUdXdY Z/e&dZdPdmd[d\Z0e(dZd]d^ Z1d_d` Z2dadb Z3dndddeZ4dfdg Z5dS )oImageFileDirectory_v2a  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, Callable[[ImageFileDirectory_v2, bytes, bool], Any]]r   zdict[int, Callable[..., Any]]r      II*     NrP   zbytes | None
int | NoneNone)ifhrR   grouprS   c                 C  s   t |s dt| d}t||dk	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 n| 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+   Qr+   r4   r'   F)rW   reprSyntaxError_prefixMM_endianII_bigtiffr   tagtyperesetr   next_legacy_api)rk   r   rR   r   msgr,   r,   r0   rw   *  s"    

,zImageFileDirectory_v2.__init__c                 C  s   | j S ra   )r   rx   r,   r,   r0   r   O  r   zImageFileDirectory_v2.<lambda>c                 C  s   | j S ra   )_offsetrx   r,   r,   r0   r   P  r   rQ   r{   c                 C  s   | j S ra   )r   rx   r,   r,   r0   r   R  s    z ImageFileDirectory_v2.legacy_apir   rv   rS   c                 C  s   d}t |d S )Nz"Not allowing setting of legacy api)	Exception)rk   rv   r   r,   r,   r0   r   V  s    c                 C  s(   i | _ i | _i | _i | _d | _d | _d S ra   )_tags_v1_tags_v2_tagdatar   _nextr   rx   r,   r,   r0   r   [  s    zImageFileDirectory_v2.resetrz   c                 C  s   t t| S ra   )rz   dictrx   r,   r,   r0   __str__c  s    zImageFileDirectory_v2.__str__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 r,   )r   lookupr   r   )r-   coderv   rx   r,   r0   r1   l  s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsrx   r,   rx   r0   namedf  s    
zImageFileDirectory_v2.namedr}   c                 C  s   t t| jt| jB S ra   )rK   setr   r   rx   r,   r,   r0   __len__q  s    zImageFileDirectory_v2.__len__c                 C  sf   || j kr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrbt|ttfsb|f}|S ra   )r   r   r   r   r   rt   tuplerP   )rk   tagr   typr   handlerr\   r,   r,   r0   __getitem__t  s    



z!ImageFileDirectory_v2.__getitem__c                 C  s   || j kp|| jkS ra   )r   r   rk   r   r,   r,   r0   __contains__  s    z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S ra   )_setitemr   )rk   r   rv   r,   r,   r0   __setitem__  s    z!ImageFileDirectory_v2.__setitem__c              
     s  t ttf}t|| j t||r(|gn|}|| jkrp jrN j| j|< n"tj	| j|< t
dd |D rt
dd |D rtjntj| j|< nt
dd |D rt
dd |D rtj| j|< nDt
dd |D rtj| j|< n$t
dd |D rtjntj| j|< ndt
dd |D r.tj| j|< nBt
d	d |D rPtj| j|< n t
d
d |D rptj| j|< | j| tj	krdd |D }n | j| tjkrdd |D }| j| tjkot|t}|st fdd|D }|r| jn| j}|s jdks@| j| tjks@ jd krt|dkr|s|rd| j| tjtjfkrd|f}z|\||< W n> tk
r   td| dt| d |d ||< Y nX n|||< d S )Nc                 s  s   | ]}t |tV  qd S ra   )rt   rZ   r-   r/   r,   r,   r0   rL     s     z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s  s   | ]}|d kV  qdS r   Nr,   r   r,   r,   r0   rL     s     c                 s  s   | ]}t |tV  qd S ra   )rt   r}   r   r,   r,   r0   rL     s     c                 s  s&   | ]}d |  kodk n  V  qdS )r   r   Nr,   r   r,   r,   r0   rL     s     c                 s  s&   | ]}d |  k odk n  V  qdS )i i   Nr,   r   r,   r,   r0   rL     s     c                 s  s   | ]}|d kV  qdS r   r,   r   r,   r,   r0   rL     s     c                 s  s   | ]}t |tV  qd S ra   )rt   ru   r   r,   r,   r0   rL     s     c                 s  s   | ]}t |tV  qd S ra   )rt   rz   r   r,   r,   r0   rL     s     c                 s  s   | ]}t |tV  qd S ra   )rt   rP   r   r,   r,   r0   rL     s     c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )rt   rz   encoder   r,   r,   r0   
<listcomp>  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r,   )rt   r}   ru   r   r,   r,   r0   r     s     c                 3  s   | ]}  |V  qd S ra   )Zcvt_enumr   infor,   r0   rL     s     r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   rP   rz   r   r   r   rt   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthrK   
ValueErrorwarningswarn)rk   r   rv   r   Z	basetypesr   is_ifddestr,   r   r0   r     sz    



zImageFileDirectory_v2._setitem)r   rS   c                 C  s.   | j |d  | j|d  | j|d  d S ra   )r   popr   r   r   r,   r,   r0   __delitem__  s    z!ImageFileDirectory_v2.__delitem__c                 C  s   t t| jt| jB S ra   )iterr   r   r   rx   r,   r,   r0   __iter__  s    zImageFileDirectory_v2.__iter__c                 C  s   t | j| |S ra   )r   unpackr   )rk   r   r   r,   r,   r0   r     s    zImageFileDirectory_v2._unpackc                 G  s   t j| j| f| S ra   )r   packr   )rk   r   r   r,   r,   r0   r     s    zImageFileDirectory_v2._packHshortr4   longbzsigned bytehzsigned shortlzsigned longry   ru   ddoubler   Zlong8r   Tc                 C  s   |S ra   r,   r   r,   r,   r0   	load_byte  s    zImageFileDirectory_v2.load_bytec                 C  s*   t |trt|}t |tr&t|f}|S ra   )rt   rZ   r}   rP   rk   r   r,   r,   r0   
write_byte  s
    


z ImageFileDirectory_v2.write_byter%   c                 C  s"   | dr|d d }|ddS )N    rX   zlatin-1r   )endswithdecoder   r,   r,   r0   load_string   s    
z!ImageFileDirectory_v2.load_stringc                 C  s0   t |trt|}t |ts(|dd}|d S )Nr   r   r  )rt   r}   rz   rP   r   rk   rv   r,   r,   r0   write_string  s
    

z"ImageFileDirectory_v2.write_stringr(   r+   c                   sV   |  t|d  d|}fdd t fddt|d d d |dd d D S )	Nr'   r4   c                   s    r| |fS t | |S ra   rZ   ar  r   r,   r0   combine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S ra   r,   r-   numZdenomr)  r,   r0   rL     s     z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r%   r   r   rK   r   ziprk   r   r   valsr,   r)  r   r0   load_rational  s    z#ImageFileDirectory_v2.load_rationalc                   s   d  fdd|D S )Nr   c                 3  s"   | ]} j dt|d V  qdS )2Ll    N)r3  )r   r`   r-   rf   rx   r,   r0   rL     s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r,   rx   r0   write_rational  s    z$ImageFileDirectory_v2.write_rationalr*   c                 C  s   |S ra   r,   r   r,   r,   r0   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |trt|}t |tr,t|dd}|S )Nr   r   )rt   rZ   r}   rz   r   r#  r,   r,   r0   write_undefined"  s
    

z%ImageFileDirectory_v2.write_undefined
   c                   sV   |  t|d  d|}fdd t fddt|d d d |dd d D S )	Nr'   r  c                   s    r| |fS t | |S ra   r%  r&  r(  r,   r0   r)  .  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S ra   r,   r*  r,  r,   r0   rL   1  s     z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r%   r   r-  r/  r,   r1  r0   load_signed_rational*  s    z*ImageFileDirectory_v2.load_signed_rationalc                   s   d  fdd|D S )Nr   c                 3  s$   | ]} j dt|dd V  qdS )2lii   N)r:  )r   rg   r4  rx   r,   r0   rL   5  s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r,   rx   r0   write_signed_rational3  s    z+ImageFileDirectory_v2.write_signed_rationalc                 C  s8   | |}t||kr4d| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrK   OSError)rk   fpr   retr   r,   r,   r0   _ensure_read:  s    
z"ImageFileDirectory_v2._ensure_readc              
   C  s  |    | | _z2| 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k
r   td|
| Y qPY nX || }|| jrdndkrv| }| | jr6dnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 qP|st|
 qP|| j|< || j|< |
d|dkrd| nt| 7 }
t|
 qP| jr,| d| |dn| d| |d\| _W n8 tk
r~ }
 ztt|
 W Y d S d }
~
X Y nX d S )Nr   r+   r  r%   r   ZHHQ8s   HHL4sr5   unknownztag:  (
) - type: )z%s - unsupported type %sr'   r4   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r<  z. Skipping tag 
 - value: r<   <table: %d bytes>)r   tellr   r   r   rA  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readrK   r
  r  r   r   r   r   r>  rz   )rk   r?  Z	tag_countir   r   countr   tagnametypnamer   Z	unit_sizer   r   hereoffsetr,   r,   r0   loadD  sh    








zImageFileDirectory_v2.loadr   c              
   C  s  |  dt| j}g }|t| t| jd  d }d }t| j D ]\}}|tkr`t|}| j|}t	d||t
| |tjkot|t}|r| jdkrd}	nd}	t|	|d}
| j| }| D ]\}}||
|< q|
|}n(t|tr|n|f}| j| | f| }t|| jj}|r*d	n
t|d
}d| d| d| d| d	}|dt|dkrrdt| nt| 7 }t	| |rd}n(|tjtjtjfkrt|}nt|}t|dkr|||||dddf qF|||||  d||f |t|d d d 7 }qF|d k	rz|| \}}}}}|rLd}t||  d| d|d | }|||||f||< |D ]B\}}}}}t	d|||t
|t
| ||  d||||7 }q~|d7 }|D ].\}}}}}||7 }t|d@ r|d7 }q|S )Nr  r5   r'   zTag %s, Type: %s, Value: %sr   s   II*    s   MM *   )r   ifdrD  zsave: rE  rF  rG  rH  r7   rI  r   r  r   r4   r%   z&multistrip support not yet implementedr   z%s %s %s %s %srC  s       ) r   rK   r   sortedr   STRIPOFFSETSr   rL  rN  rO  r   r   r  rt   r   r   r   tobytesr   r   r   r   r   r   rz   r  r  r   appendljustNotImplementedErrorr   )rk   rW  resultentriesZstripoffsetsr   rv   r   r  r   rY  r   Zifd_tagZ	ifd_valuer   rT  rU  r   rS  r,   r,   r0   r\    sj    


 


zImageFileDirectory_v2.tobytesc                 C  sN   |  dkr&|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r+   )rJ  writer   r   r\  rK   )rk   r?  rW  r`  r,   r,   r0   save  s    

zImageFileDirectory_v2.save)r   NN)T)T)T)T)T)r   )6r   r   r   r   r   __annotations__r   rw   r   rR   rW  r   setterr   r   r   r   r   r   r   r   r  r  r   r   listmapr   r   r  r  ZSIGNED_BYTEr  r  FLOATr  ZIFDZLONG8r   r  r   r  r"  r$  r2  r5  r6  r7  r9  r;  rA  rX  r\  rd  r,   r,   r,   r0   r     s   
<   %P














C
Mr   r   r   r   Zwrite_c                      s   e Zd ZU dZ fddZedd Zedd Zded< e	d	d
 Z
ddddZdd ZddddZdd Zdd Z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
    c                   s   t  j|| d| _d S )NT)superrw   r   )rk   rl   kwargs	__class__r,   r0   rw     s    zImageFileDirectory_v1.__init__c                 C  s   | j S ra   )r   rx   r,   r,   r0   r      r   zImageFileDirectory_v1.<lambda>c                 C  s   | j S ra   )r   rx   r,   r,   r0   r     r   zdict[int, int]r   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`

        rV   )rR   r   r   r   )clsoriginalrY  r,   r,   r0   from_v2  s
    zImageFileDirectory_v1.from_v2r   r{   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`

        rV   )r   rR   r   r   r   r   )rk   rY  r,   r,   r0   to_v2  s
    zImageFileDirectory_v1.to_v2c                 C  s   || j kp|| jkS ra   )r   r   r   r,   r,   r0   r   *  s    z"ImageFileDirectory_v1.__contains__r}   c                 C  s   t t| jt| jB S ra   )rK   r   r   r   rx   r,   r,   r0   r   -  s    zImageFileDirectory_v1.__len__c                 C  s   t t| jt| jB S ra   )r  r   r   r   rx   r,   r,   r0   r  0  s    zImageFileDirectory_v1.__iter__c                 C  s   dD ]}|  ||| qd S N)FT)r   )rk   r   rv   r   r,   r,   r0   r   3  s    z!ImageFileDirectory_v1.__setitem__c                 C  sn   || j krL| j| }| j| }| j| \}}dD ]}| ||| ||| q0| j | }t|ttfsj|f}|S rs  )r   r   r   r   r   rt   r   rP   )rk   r   r   r   r   r   legacyr\   r,   r,   r0   r   7  s    



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   rw   r   tagsZtagdatare  classmethodrq  rr  r   r   r  r   r   __classcell__r,   r,   rm  r0   rj    s   

rj  c                      s   e Zd ZdZdZdZd fdd	Zddd	d
Zedd Z	dddddZ
dddddZddddZdd Z fddZddddZdd Zdd Z  ZS ) TiffImageFileZTIFFz
Adobe TIFFFNc                   s   d | _ d | _t || d S ra   )tag_v2r   rk  rw   )rk   r?  filenamerm  r,   r0   rw   Q  s    zTiffImageFile.__init__r   r{   c                 C  s   | j d}|d dkr(|| j d7 }t|| _d| _| 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 filer+   r%   r   NrX   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )r?  r=  r   ry  rY  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesrN  rO  r   _seek)rk   r   r,   r,   r0   _openZ  s    

zTiffImageFile._openc                 C  sP   | j d krJ|  }| t| j | j d kr@| |  d  q"| | | j S )Nr   )r  rJ  r  rK   r~  rP  )rk   currentr,   r,   r0   n_framesu  s    


zTiffImageFile.n_framesr}   )framerS   c                 C  s<   |  |sdS | | t| j tj| j| j| _dS )z%Select a given frame as current imageN)	Z_seek_checkr  r   Z_decompression_bomb_checkr   corenewmodeim)rk   r  r,   r,   r0   rP    s
    

zTiffImageFile.seekc                 C  s~  | j | _| j  t| j|kr| js2d}t|td|| j	| j| j  | jdkrdd}t
|| j| j | j| j td| j  | j| j | jj| jk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kr<| jt | jd< nd| jkrP| 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?  rJ  rK   r~  r{  EOFErrorrN  rO  r|  r	  rP  r]  ry  rX  r   r  is_animatedXMPr   Z_reload_exifrj  rq  r   rY  _setup)rk   r  r   r,   r,   r0   r    sL    




zTiffImageFile._seekc                 C  s   | j S )zReturn the current frame number)r|  rx   r,   r,   r0   rJ    s    zTiffImageFile.tellc                 C  s   i }| j tjj}|r|dd dk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.
        Nr'   s   8BIMr)   r   r%   r8  r   )	ry  rL  r   BaseZImageResourcesi16mathceili32)rk   blocksr\   idnr   r   r,   r,   r0   get_photoshop_blocks  s    $z"TiffImageFile.get_photoshop_blocksc                   s   | j r| jr|  S t  S ra   )tileuse_load_libtiff_load_libtiffrk  rX  rx   rm  r,   r0   rX    s    zTiffImageFile.loadc                 C  sj   | j s>d| _| j  |  }tjD ]}||kr2q$|| q$tj	| dd t
jj| jkrf| jt
jj= d S )NT)Zin_place)r  !_close_exclusive_fp_after_loadingr?  rJ  Zgetexifr   TAGS_V2_GROUPSget_ifdr   Zexif_transposer   r  ZOrientationry  )rk   exifkeyr,   r,   r0   load_end  s    

zTiffImageFile.load_endc           
   
   C  s  t j |  |   t| jdks.d}t|| jd d }t| jd d }z0t| jdod| j	 }t| jdr|| j
  W n tk
r   d}Y nX |r||d< t | jd	t|| j}z|| j| W n0 tk
r } zd
}t||W 5 d}~X Y nX | jo| j }t| jdr>td || j \}}	n\|rptd |s`| jd |d\}}	n*td | jd || j \}}	g | _d| _|   |r| j  d| _|	dk rt|	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 reading)r   rX  Zload_preparerK   r  r>  rg  r   r?  r  r  Z_getdecoderr  r   Zdecoderconfigsetimager  r	  Z_exclusive_fpr  rN  rO  r!  r  rP  r=  readonlyr  close)
rk   r   Zextentsrl   r?  decodereZclose_self_fpr  errr,   r,   r0   r    s^    
   





zTiffImageFile._load_libtiffc              
   C  s  d| j k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 t| j t}t| j t}||f| _t
d| j | j td}t|dkr2t|t|  kr*dkr2n nd}| j td}| j td}|dkr^d}	n|dkrnd}	nd}	|	t|7 }	t|}
| j t| jdkr|dkrdnd}|tkrt
d| d}t|||
k r|d| }n||
kr|
dkr|| }t||krd}t|| j j|||||f}t
d| zt| \| _}W n< t k
r } zt
d d}t||W 5 d}~X Y nX t
d| t
d| j! | j| j"d< | j t#d}| j t$d}|rZ|rZ| j t%}|dkr||f| j"d < nX|dkr$|d! |d! f| j"d < n6|dkrL||f| j"d < ||f| j"d"< n||f| j"d"< d } }}g | _&t'pz| jd#k| _(| j(rX|dkr|dd d |dd  }t
d| t| \| _}|d$krd%}d&|kr|)d&d'}d(|kr |)d(d'}|dkr&| jd)kr&| jdkr&d*}|| jd+| j j*f}| j&+d,dd||fd|f nXt,| j kspt-| j krt,| j kr| j t, }| j t.|}| jd }n"| j t- }| j t/}| j t0}|D ]}|| |kr|t1| d- }nd}|}| jdkr|| }||	 }|t|df}| j&+| j||t|| |t|| |f||f || }|| jd krd||  }}|| jd krd }}|d7 }qnt
d. d}t|t2| j kr| j t2 | j"d/< | j!d0kr d1d2 | j t3 D }t45d3d46|| _7dS )5z-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
- size: %sr2   r,   )r%   r)   r+   r&   r(   r'   )r%   r)   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %scompressionr%   dpigRQ@
resolutionr   r6   I;16Nz;16Bz;16Nz;16Lr!   rC   Fr  r+   z- unsupported data organizationicc_profilerG   rH   c                 S  s   g | ]}t |d  qS r   r   )r-   r  r,   r,   r0   r     s     z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   )8ry  r>  COMPRESSION_INFOrL  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERrN  rO  r   YCBCRSUBSAMPLINGr}   
IMAGEWIDTHIMAGELENGTH_sizer   SAMPLEFORMATrK   re   rd   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   rR   	OPEN_INFO_moderM  r  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   rW  r]  r[  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r   r   palette)rk   r   photoZ	fillorderZxsizeZysizeZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr  rawmoder  ZxresZyresZresunitxyZlayerr'  offsetsr  wrW  strideZtile_rawmoder  r,   r,   r0   r  B  s   



2


 








 


zTiffImageFile._setup)NN)r   r   r   formatformat_descriptionr  rw   r  r   r  rP  r  rJ  r  rX  r  r  r  rw  r,   r,   rm  r0   rx  L  s   	
	0Urx  r3   r4   rB   rG   rH   r@   r6   r:   r>   rC   rE   rD   rI   YCbCrrJ   rA   r8   r;   r?   )r3   r4   rB   rG   rH   r9   r6   r:   r=   rC   rE   rD   rI   r  rJ   rA   r8   r;   r?   c           5      C  s	  zt | j \}}}}}}W n: tk
rT }	 zd| j d}
t|
|	W 5 d }	~	X Y nX t|d}| j}| j}z|d }W n. tk
r   | jd}t	|t
rd }Y nX |d krd}n|dkrd}n|dkrd	}tp|dk}d
|t< | jd |t< | jd
 |t< d|kr|d }n:d|krJ|d }t	|trNt }|| |}ni }tdt| t	|trr| }|D ]j}t	|tjr|tjkr||||< n||||< z|j| |j|< W n tk
r   Y nX qvi }t| dr| j }|t | di }t!t"fD ]}||kr||= qt| drt#t$t%t&t't(fD ]^}|| j)krH|t&kr| j)j| tj*tj+fkr||= n | j)| ||< | j)j| |j|< qH|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t/dft0dft1dff
D ] \}}||kr
|| ||< q
|d}|r\d|t#< |d |t$< |d
 |t%< |dkr||t2< t3|d
krt3||t4< |d k	r||t5< |d
kr||t"< t6|kr||t6< n| jdkrL|t6 dkrL| jdkrB| 7 }| }t8|j9D ]:}t8|j:D ](}|||f d kr(dnd |||f< qq |} n
t;<| } | jd!kr| j=>d"d#}g }t3|d$ }t8d$D ]>} |d%d& |||  || d
   D 7 }|dgd'|  7 }q~||t?< |t |t  }!}"t3||!|d  d( d)  }#t@|krh|rN|d*tA}$|#dkrd
ntB|$|# |"}%|dkrRtB|%d( d) d) |"}%n|"}%|%dkr`d
}%|%|t@< |#dkrvd
n
|#|t@  }&|"|t@  d
 |t@  }'|&d+krtjC|jtD< |&f|'d
  |#|" |&|'d
   f |tD< tEt8d|&|' |&|tF< tG|d
|tH< | jd,kr4tId-tJd.iK D ]\}}(|L||( qtMtNtOtPg})|	r,d/|kr|d/ }*t	|*t
rx|*dk sx|*d0krd1}
tQ|
|dkrd2}
tQ|
|*|tR< td3 td4tS|K  d}+t|d5rz|Td tUV|W }+W n tXjYk
r   Y nX i },|)tZtJtDtFt[t\g7 })t2|d i}-t]^|K |K D ]\}}(|tj_krt tj`d6d7sfq>||jkr|j| |,|< n4t	|(t
tatbtfsq>ntc|jd}.|.r|.|,|< ||-kr>||)kr>t	|(tbr|(ed8d9d: |-|< n"t	|(tfrta|(|-|< n|(|-|< q>t"|-kr>t3|-t" d
kr>|-t" d |-t"< td;tS|-K  | jd<krbd=}t|-K }/|/g  |||+||/|,f}0th| jd>|0|}1|1i| j=d?| j  |1ed@d
d  \}2}3|+s|j|3 |2rqq|+	rztUk|+ W n tk
	r
   Y nX |2dk 	rldA|2 dB}
t|
n@|)D ]}||= 	q0|l|}4tmn| |dd?| j |4||#d
ffg dC|k	r||| _od S )DNzcannot write mode z as TIFFrV   r  r   r    r!   r#   r"   r   r   Ztiffinfor  zTiffinfo Keys: %sr   ry  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r%   r2   )r3   r4   r3   r   r  rC   r  r&   c                 S  s   g | ]}|d  qS r  r,   r   r,   r,   r0   r     s     z_save.<locals>.<listcomp>r   r*   r+   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  rO   Fr   r   r  zConverted items: %s)r8   r6   r  r  rF   i @  zencoder error z when writing image file_debug_multipage)p	SAVE_INFOr  rM  r>  r   encoderinfoencoderconfigr   rL  rt   r}   WRITE_LIBTIFFr  r   r  r  rP   r   ZExifrX  rN  rO  rg  rj  rr  r   r  r  r   r   r   r   rh   EXIFIFDr  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  ry  r  r   r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  rK   r  r  r  copyrK  heightwidthr   invertr  Z
getpaletter  r  
STRIP_SIZErd   r  STRIPBYTECOUNTSr   r[  COMPRESSION_INFO_REVr  r  REFERENCEBLACKWHITEr   
setdefaultr  r  r  TILEBYTECOUNTSr	  JPEGQUALITYrZ  rP  osdupr  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFD	itertoolschainZLIBTIFF_COREr  ru   rz   r   r   r   rZ   sortZ_getencoderr  rc  r  rd  r   _saver  )5r  r?  rz  r  rR   r  r  bitsextrar  r   rY  r  r  r  r  r   r  r  Z
legacy_ifdZsupplied_tagsr   Ziccr   r  Zinverted_imZpxr  r  ZlutZcolormapcolorsrR  r  r  r  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imagerv   Z	blocklistr  r}  typesZattsr   ru  r'  encodererrcoder   rW  r,   r,   r0   r  C  s   

















*
&




  
 








  
r  c                   @  s  e Zd ZdddddddddddddddddgZdddd	d
dhZdGd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!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/d0Zddd1d2Zddd3d4d5Zddd3d6d7Zddd3d8d9Zddd3d:d;Zddd3d<d=Zddd>d?Zddd@dAZdHddBdBddCdDdEZdFS )IAppendingTiffWriterr   r   r%   r'   r+   r   i   r   i  i  i	  Fc                 C  sv   t |dr|| _d| _nF|| _d| _zt||r2dnd| _W n  tk
r\   t|d| _Y nX | j | _|   d S )Nr=  FTzw+bzr+b)	r   ry   close_fpr   openr>  rJ  	beginningsetup)rk   fnr  r,   r,   r0   rw     s    
zAppendingTiffWriter.__init__r   r{   c                 C  s   | j | jtj d | _d| _| j d | _}|s>d| _	d S d| _	|dkrX| 
d n |dkrl| 
d nd	}t||   |   d S )
Nr   r'   TFrN   r   rM   r   zInvalid TIFF file header)ry   rP  r  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager=  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rk   iimmr   r,   r,   r0   r    s     zAppendingTiffWriter.setupc                 C  s   | j r
d S | j| j | jd}|s,d S || jkrBd}t||  }|| j7 }| j| j | 	| | j| | 
  d S )Nr'   z1IIMM of new page doesn't match IIMM of first page)r  ry   rP  r  r=  r  r  readLongr  	writeLongfixIFD)rk   r  r   
ifd_offsetr,   r,   r0   finalize  s    


zAppendingTiffWriter.finalizec                 C  s   |    |   d S ra   )r  r  rx   r,   r,   r0   newFrame  s    zAppendingTiffWriter.newFramec                 C  s   | S ra   r,   rx   r,   r,   r0   	__enter__  s    zAppendingTiffWriter.__enter__r   )rl   rS   c                 G  s   | j r|   d S ra   )r
  r  rj   r,   r,   r0   __exit__  s    zAppendingTiffWriter.__exit__r}   c                 C  s   | j  | j S ra   )ry   rJ  r  rx   r,   r,   r0   rJ    s    zAppendingTiffWriter.tellc                 C  s*   |t jkr|| j7 }| j|| |  S ra   )r  r  r  ry   rP  rJ  )rk   rW  whencer,   r,   r0   rP    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   r7   )ry   rP  r  SEEK_ENDrJ  rc  rP   r  )rk   posZ	pad_bytesr,   r,   r0   r    s    
zAppendingTiffWriter.goToEndrz   )endianrS   c                 C  s4   || _ | j  d| _| j  d| _| j  d| _d S )Nr4   r  ZHHL)r$  longFmtshortFmt	tagFormat)rk   r$  r,   r,   r0   r    s    zAppendingTiffWriter.setEndianc                 C  sP   |   }|dkr"| j d | _qL| j| |  }| j|d tj q d S )Nr   r'   r5   )r  ry   rJ  r  rP  	readShortr  SEEK_CUR)rk   r  num_tagsr,   r,   r0   r    s    zAppendingTiffWriter.skipIFDsrP   r   )r   rS   c                 C  s   | j |S ra   )ry   rc  r  r,   r,   r0   rc    s    zAppendingTiffWriter.writec                 C  s   t | j| jd\}|S )Nr%   )r   r  r&  ry   r=  r#  r,   r,   r0   r(    s    zAppendingTiffWriter.readShortc                 C  s   t | j| jd\}|S rT   )r   r  r%  ry   r=  r#  r,   r,   r0   r    s    zAppendingTiffWriter.readLongr   c                 C  sN   | j dtj | j t| j|}|d k	rJ|dkrJd| d}t|d S )Nr'   wrote only  bytes but wanted 4	ry   rP  r  r)  rc  r   r  r%  r  rk   rv   Zbytes_writtenr   r,   r,   r0   rewriteLastShortToLong  s
    z*AppendingTiffWriter.rewriteLastShortToLongc                 C  sN   | j dtj | j t| j|}|d k	rJ|dkrJd| d}t|d S )Nr+  r%   r,   bytes but wanted 2)	ry   rP  r  r)  rc  r   r  r&  r  r/  r,   r,   r0   rewriteLastShort  s
    z$AppendingTiffWriter.rewriteLastShortc                 C  sN   | j dtj | j t| j|}|d k	rJ|dkrJd| d}t|d S )Nr'   r,  r-  r.  r/  r,   r,   r0   rewriteLastLong  s
    z#AppendingTiffWriter.rewriteLastLongc                 C  s>   | j t| j|}|d k	r:|dkr:d| d}t|d S )Nr%   r,  r1  )ry   rc  r   r  r&  r  r/  r,   r,   r0   
writeShort$  s    zAppendingTiffWriter.writeShortc                 C  s>   | j t| j|}|d k	r:|dkr:d| d}t|d S )Nr'   r,  r-  )ry   rc  r   r  r%  r  r/  r,   r,   r0   r  *  s    zAppendingTiffWriter.writeLongc                 C  s   |    | j  d S ra   )r  ry   r  rx   r,   r,   r0   r  0  s    zAppendingTiffWriter.closec                 C  s   |   }t|D ]}t| j| jd\}}}| j| }|| }|dk}|sf|  | j	 }	| 
|	 || jkr| j }
|r| j||dk|dkd | j|
d  n0| j|	 | j||dk|dkd | j|
 d  }	}
q|r| jdtj qd S )Nr+   r'   r%   )isShortisLong)r(  rK  r   r  r'  ry   r=  
fieldSizesr  r  r4  TagsrJ  
fixOffsetsrP  r  r)  )rk   r*  rR  r   Z
field_typerS  Z
field_sizeZ
total_sizeis_localrW  Zcur_posr,   r,   r0   r  4  s8    



    
zAppendingTiffWriter.fixIFDrQ   )rS  r6  r7  rS   c                 C  s   |s|sd}t |t|D ]}|r,|  n|  }|| j7 }|r|dkr|dkr^d}t || | | jdtj	 | 
tj | jdtj	 q|r| | q| | qd S )Nz offset is neither short nor longr   r   znot implementedir+   )r  rK  r(  r  r  r0  ry   rP  r  r)  r5  r   r  r2  r4  )rk   rS  r6  r7  r   rR  rW  r,   r,   r0   r:  W  s"    

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   r8  r9  rw   r  r  r  r  r   rJ  r  r  rP  r  r  r  rc  r(  r  r0  r2  r4  r5  r  r  r  r:  r,   r,   r,   r0   r	  w  sb   	

$   r	  zImage.Imagez	IO[bytes]zstr | bytesr   )r  r?  rz  rS   c              	   C  s   | j  }| j}t|dg }t| ds:|s:t| ||S |  }z~t	|l}| g| D ]Z}||_ ||_t|dsxd}	n|j
}	t|	D ]*}
||
 |  t||| |  qqXW 5 Q R X W 5 | | X d S )Nappend_imagesr  r   )r  r  r  rg  rL  r   r  rJ  rP  r	  r  rK  rX  r  )r  r?  rz  r  r  r<  Zcur_idxtfZimsZnfrr   r,   r,   r0   	_save_alls  s(    



r>  z.tifz.tiffz
image/tiff)
__future__r   r  r  loggingr  r  r   r
  collections.abcr   Z	fractionsr   Znumbersr   r   typingr   r   r	   r
   r    r   r   r   r   r   r   _binaryr   r  r   r  r   Z
_deprecater   r   	getLoggerr   rN  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  r  r[  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  re   r  rU   rh   r  rW   r`   rg   r   r   rp   rZ   r   r   r   r}   Z
_IFDv2Baser   r   r   r   setattrrj  ZImageFileDirectoryrx  r  r  r	  r>  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer,   r,   r,   r0   <module>)   s   
                                                                                                                      }	
|   x\   d  6 }