U
    e+                    @  sr  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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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/ZEd0ZFd1ZGd2ZHd3ZId4ZJd5ZKd6ZLd7ZMd8ZNd9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJZOdKdL eOP D ZQe%d dMddMdNfdOe&d dMddMdNfdOe%d dMdPdMdNfdQe&d dMdPdMdNfdQe%ddMddMdNfdRe&ddMddMdNfdRe%ddMdPdMdNfdSe&ddMdPdMdNfdSe%d dMddTdNfdUe&d dMddTdNfdUe%d dMdPdTdNfdVe&d dMdPdTdNfdVe%ddMddTdNfdWe&ddMddTdNfdWe%ddMdPdTdNfdXe&ddMdPdTdNfdXe%d dMddYdNfdZe&d dMddYdNfdZe%d dMdPdYdNfd[e&d dMdPdYdNfd[e%ddMddYdNfd\e&ddMddYdNfd\e%ddMdPdYdNfd]e&ddMdPdYdNfd]e%d dMdd^dNfd_e&d dMdd^dNfd_e%d dMdPd^dNfd`e&d dMdPd^dNfd`e%ddMdd^dNfdae&ddMdd^dNfdae%ddTdd^dNfdae&ddTdd^dNfdae%ddMdPd^dNfdbe&ddMdPd^dNfdbe%ddMddcdNfdde%d dMddedNfdfe%ddMddedNfdfe&ddMddedNfdge%ddMdPdedNfdhe%ddTddedNfdie&ddTddedNfdje%d dkddldNfdme&d dkddldNfdne%ddMddldNfdoe%ddTddldNfdpe&ddTddldNfdqe%ddkddldNfdme&ddkddldNfdne%ddMddrdTfdse&ddMddrdTfdse%dPdMddtdNfdue&dPdMddtdNfdue%dPdMdPdtdNfdve&dPdMdPdtdNfdve%dPdMddwdNfdxe&dPdMddwdNfdxe%dPdMddwdyfdze&dPdMddwdyfdze%dPdMdd{d|fd}e&dPdMdd{d|fd}e%dPdMdd~dfde&dPdMdd~dfde%dPdMddwdMfde&dPdMddwdMfde%dPdMdd{dfde&dPdMdd{dfde%dPdMdd~dfde&dPdMdd~dfde%dPdMddwdTfdxe&dPdMddwdTfdxe%dPdMdd{dfde&dPdMdd{dfde%dPdMdd~dfde&dPdMdd~dfde%dPdMddwdfdxe&dPdMddwdfdxe%dPdMdddNfde&dPdMdddNfde%dPdMdddNfde&dPdMdddNfde%dPdMdddyfde&dPdMdddyfde%dPdMdddMfde&dPdMdddMfde%dPdMdddTfde&dPdMdddTfde%ddMddMdNfde&ddMddMdNfde%ddMdPdMdNfde&ddMdPdMdNfde%ddMddTdNfde&ddMddTdNfde%ddMdPdTdNfde&ddMdPdTdNfde%ddMddYdNfde&ddMddYdNfde%ddMdPdYdNfde&ddMdPdYdNfde%ddMdd^dNfde&ddMdd^dNfde%ddMddrdTfde&ddMddrdTfde%ddMdPd^dNfde&ddMdPd^dNfde%ddMddwdNfde&ddMddwdNfde%ddMdd{dyfde&ddMdd{dyfde%ddMdd~d|fde&ddMdd~d|fde%ddMdddNfde%ddMdd^dNfdae&ddMdd^dNfdae%ddMddtdNfde&ddMddtdNfde%ddMddtdNfde&ddMddtdNfdiuZReSdd eRD ZTddddddgZUdd ZVdd ZWdd ZXi ZYi ZZG dd deZ[G dd de
Z\eYe\_YeZe\_ZeP D ]B\Z]Z^e^_ddZ^e`e\de^ eYe] d  e`e\de^ eZe]  	q[Y[Z[][^G dd de\ZaeaZbG dd dejZcde%dddMdfde%ddd^dfde%dddrdPfde%ddd^dfde%dddrdPfde%ddPdldfde%dddedfde%ddPdedfde%dddldfde%dPddtdfde%dPddwd fde%dPddwdPfde%dddwdfde%dddtdfde%dddtdfde&ddPdldfde&dddedfde&ddPdedfde&dddldfd՜Zdddׄ ZeG ddل dكZfddۄ ZgehecjieceV ejecjiee ekecjieg elecjiddg emecjidޡ dS )    )annotationsN)MutableMapping)Fraction)NumberRational   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8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%   U/var/www/html/StaffProfile/newvenv/lib/python3.8/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s      r*   r   r%   )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)r$   )r-   zL;I)r-   zL;IR)r-   r-   )r-   zL;R)   )I;16zI;12)   )r/   r/   )I;16Br1   )r/   zI;16R)II;16S)r2   I;16BS)r   )    )FF;32F)r6   F;32BF)r2   zI;32N)r2   I;32S)r2   I;32BS)r$   r$   )LAr;   )r$   r$   r$   )RGBr<   )r<   zRGB;R)r$   r$   r$   r$   )RGBAr=   )r   )RGBXr>   )r$   r$   r$   r$   r$   r   r   )r>   ZRGBXX)r$   r$   r$   r$   r$   r$   )r   r   r   )r>   ZRGBXXX)r=   ZRGBa)r   r   )r=   ZRGBaX)r   r   r   )r=   ZRGBaXX)r   r   )r=   ZRGBAX)r   r   r   )r=   ZRGBAXX)i  )r0   r0   r0   )r<   zRGB;16L)r<   zRGB;16B)r0   r0   r0   r0   )r=   zRGBA;16L)r=   zRGBA;16B)r>   zRGBX;16L)r>   zRGBX;16B)r=   zRGBa;16L)r=   zRGBa;16Br   )PzP;1)r@   zP;1R)r@   zP;2)r@   zP;2R)r@   zP;4)r@   zP;4R)r@   r@   )PArA   )r@   zP;Rr!   )CMYKrB   )rB   ZCMYKX)rB   ZCMYKXX)rB   zCMYK;16Lr"   )r<   r>   r$   )LABrC   c                 c  s   | ]}t |d  V  qdS )r    N)len)r&   Zkey_tpr%   r%   r)   	<genexpr>
  s     rE      MM *   II* s   MM* s   II *s   MM +s   II+ c                 C  s   | d d t kS Nr    )PREFIXESprefixr%   r%   r)   _accept  s    rL   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%   r)   _limit_rational  s    rU   c                 C  sP   t | }|j|jf}t||k r.t| t|}t||krLt | } t| |}|S N)r   	numeratordenominatorminrU   rN   max)rQ   rR   Zmin_valfracrT   r%   r%   r)   _limit_signed_rational   s    
r\   c                   @  sR  e Zd ZdZdZd4ddZedd Zedd	 Zd
d Z	dd Z
dd Zdd Z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d,Z$ed-Z%ed.Z&ed/Z'ed0Z(ed1Z)e*e+d2rNed2Z,d3S )5rO   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_denominator_valr   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   )	
isinstancerO   rW   r]   rX   r^   r_   r   float)selfvaluerX   r%   r%   r)   __init__C  s    


zIFDRational.__init__c                 C  s   | j S rV   )r]   rc   r%   r%   r)   rW   ]  s    zIFDRational.numeratorc                 C  s   | j S rV   )r^   rf   r%   r%   r)   rX   a  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   )rX   rW   r_   limit_denominator)rc   max_denominatorfr%   r%   r)   rP   e  s    
zIFDRational.limit_rationalc                 C  s   t t| jS rV   )strrb   r_   rf   r%   r%   r)   __repr__r  s    zIFDRational.__repr__c                 C  s
   | j  S rV   )r_   __hash__rf   r%   r%   r)   rl   u  s    zIFDRational.__hash__c                 C  s0   | j }t|tr|j }t|tr(t|}||kS rV   )r_   ra   rO   rb   )rc   otherrQ   r%   r%   r)   __eq__x  s    

zIFDRational.__eq__c                 C  s   | j | j| jgS rV   )r_   r]   r^   rf   r%   r%   r)   __getstate__  s    zIFDRational.__getstate__c                 C  s,   t | d |\}}}|| _|| _|| _d S )Nr   )rO   re   r_   r]   r^   )rc   stater_   r]   r^   r%   r%   r)   __setstate__  s
    
zIFDRational.__setstate__c                   s    fdd}|S )Nc                   s   t | j | S rV   )getattrr_   )rc   argsopr%   r)   delegate  s    z'IFDRational._delegate.<locals>.delegater%   )ru   rv   r%   rt   r)   	_delegate  s    zIFDRational._delegate__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__re   propertyrW   rX   rP   rk   rl   rn   ro   rq   rw   rx   ry   rz   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%   r)   rO   5  sT   


rO   c                   @  s  e Zd ZdZd^ddZedd Zedd Zed	d Zej	d
d Zdd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fej$d8d9fg	 ed:d:d_d<d=Z%ed:d>d? Z&ed@d:d`dAdBZ'ed@dCdD Z(edEdFdadGdHZ)edEdIdJ Z*edKd:dbdLdMZ+edKdNdO Z,edPdFdcdQdRZ-edPdSdT Z.dUdV Z/dWdX Z0dddZd[Z1d\d] Z2dS )e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``.

       II*     Nc                 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$   r-   r    F)rL   reprSyntaxError_prefixMM_endianII_bigtiffgrouptagtypereset_unpacknext_legacy_api)rc   ifhrK   r   msgr%   r%   r)   re     s"    

,zImageFileDirectory_v2.__init__c                 C  s   | j S rV   )r   rf   r%   r%   r)   <lambda>      zImageFileDirectory_v2.<lambda>c                 C  s   | j S rV   )_offsetrf   r%   r%   r)   r     r   c                 C  s   | j S rV   )r   rf   r%   r%   r)   r     r   c                 C  s   d}t |d S )Nz"Not allowing setting of legacy api)	Exception)rc   rd   r   r%   r%   r)   
legacy_api  s    z ImageFileDirectory_v2.legacy_apic                 C  s(   i | _ i | _i | _i | _d | _d | _d S rV   )_tags_v1_tags_v2_tagdatar   _nextr   rf   r%   r%   r)   r     s    zImageFileDirectory_v2.resetc                 C  s   t t| S rV   )rj   dictrf   r%   r%   r)   __str__%  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   name)r&   coderd   rf   r%   r)   r*   .  s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsrf   r%   rf   r)   named(  s    
zImageFileDirectory_v2.namedc                 C  s   t t| jt| jB S rV   )rD   setr   r   rf   r%   r%   r)   __len__3  s    zImageFileDirectory_v2.__len__c                 C  sf   || j kr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrbt|ttfsb|f}|S rV   )r   r   r   _load_dispatchr   ra   tuplebytes)rc   tagdatatypsizehandlerrQ   r%   r%   r)   __getitem__6  s    



z!ImageFileDirectory_v2.__getitem__c                 C  s   || j kp|| jkS rV   )r   r   rc   r   r%   r%   r)   __contains__A  s    z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S rV   )_setitemr   )rc   r   rd   r%   r%   r)   __setitem__D  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 rV   )ra   rO   r&   r(   r%   r%   r)   rE   R  s     z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s  s   | ]}|d kV  qdS r   Nr%   r   r%   r%   r)   rE   U  s     c                 s  s   | ]}t |tV  qd S rV   )ra   intr   r%   r%   r)   rE   X  s     c                 s  s&   | ]}d |  kodk n  V  qdS )r   r   Nr%   r   r%   r%   r)   rE   Y  s     c                 s  s&   | ]}d |  k odk n  V  qdS )i i   Nr%   r   r%   r%   r)   rE   [  s     c                 s  s   | ]}|d kV  qdS r   r%   r   r%   r%   r)   rE   `  s     c                 s  s   | ]}t |tV  qd S rV   )ra   rb   r   r%   r%   r)   rE   c  s     c                 s  s   | ]}t |tV  qd S rV   )ra   rj   r   r%   r%   r)   rE   e  s     c                 s  s   | ]}t |tV  qd S rV   )ra   r   r   r%   r%   r)   rE   g  s     c                 S  s&   g | ]}t |tr|d dn|qS )asciireplace)ra   rj   encoder   r%   r%   r)   
<listcomp>k  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r%   )ra   r   rb   r   r%   r%   r)   r   p  s     c                 3  s   | ]}  |V  qd S rV   )Zcvt_enumr&   rd   infor%   r)   rE   t  s     r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   rj   r   r   r   ra   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthrD   
ValueErrorwarningswarn)rc   r   rd   r   Z	basetypesvaluesis_ifddestr%   r   r)   r   G  sz    



zImageFileDirectory_v2._setitemc                 C  s.   | j |d  | j|d  | j|d  d S rV   )r   popr   r   r   r%   r%   r)   __delitem__  s    z!ImageFileDirectory_v2.__delitem__c                 C  s   t t| jt| jB S rV   )iterr   r   r   rf   r%   r%   r)   __iter__  s    zImageFileDirectory_v2.__iter__c                 C  s   t | j| |S rV   )structunpackr   )rc   fmtr   r%   r%   r)   r     s    zImageFileDirectory_v2._unpackc                 G  s   t j| j| f| S rV   )r   packr   )rc   r   r   r%   r%   r)   _pack  s    zImageFileDirectory_v2._packc                   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   
startswithr   r   )funcr   idxr   r%   r)   	decorator  s
    z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr%   )r   r   r   r%   r   r)   _register_loader  s    z&ImageFileDirectory_v2._register_loaderc                   s    fdd}|S )Nc                   s   | t  < | S rV   )_write_dispatch)r   r   r%   r)   r     s    z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr%   )r   r   r%   r   r)   _register_writer  s    z&ImageFileDirectory_v2._register_writerc                   sX   ddl m} | \} }|||< td  d fdd	ft|<  fddt|< d S )	Nr   r   =Tc                   s   |  t|    |S rV   )r   rD   rc   r   r   r   r   r%   r)   r     s    z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                   s   d  fdd|D S )Nr   c                 3  s   | ]}  |V  qd S rV   )r   r   )r   rc   r%   r)   rE     s     zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrc   r   )r   rf   r)   r     s    )T)r   r   r   calcsizer   r   )Zidx_fmt_namer   r   r   r%   r   r)   _register_basic  s    
z%ImageFileDirectory_v2._register_basicHshortr-   longbzsigned bytehzsigned shortlzsigned longri   rb   ddoubler   Zlong8r   Tc                 C  s   |S rV   r%   r   r%   r%   r)   	load_byte  s    zImageFileDirectory_v2.load_bytec                 C  s*   t |trt|}t |tr&t|f}|S rV   )ra   rO   r   r   rc   r   r%   r%   r)   
write_byte  s
    


z ImageFileDirectory_v2.write_byter   c                 C  s"   | dr|d d }|ddS )N    rM   zlatin-1r   )endswithdecoder   r%   r%   r)   load_string  s    
z!ImageFileDirectory_v2.load_stringc                 C  s0   t |trt|}t |ts(|dd}|d S )Nr   r   r  )ra   r   rj   r   r   rc   rd   r%   r%   r)   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    r-   c                   s    r| |fS t | |S rV   rO   ar	  r   r%   r)   combine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S rV   r%   r&   numdenomr  r%   r)   rE     s     z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   r   rD   r   ziprc   r   r   valsr%   r  r   r)   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)r&  )r   rU   r&   r[   rf   r%   r)   rE     s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r  r  r%   rf   r)   write_rational  s    z$ImageFileDirectory_v2.write_rationalr#   c                 C  s   |S rV   r%   r   r%   r%   r)   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc                 C  s   t |trt|dd}|S )Nr   r   )ra   r   rj   r   r  r%   r%   r)   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 rV   r  r  r  r%   r)   r    s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S rV   r%   r  r  r%   r)   rE     s     z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   r   r"  r%   r$  r)   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   r\   r'  rf   r%   r)   rE     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r  r  r%   rf   r)   write_signed_rational  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. )readrD   OSError)rc   fpr   retr   r%   r%   r)   _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   HHL4sr.   unknownztag:  (
) - type: )z%s - unsupported type %sr    r-   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r/  z. Skipping tag 
 - value: r5   <table: %d bytes>)r   tellr   r   r   r4  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr
   
_safe_readrD   r   r   r   r   r   r   r1  rj   )rc   r2  Z	tag_countir   r   countr   tagnametypnamer   Z	unit_sizer   r   hereoffsetr%   r%   r)   load&  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  r.   r    zTag %s, Type: %s, Value: %sr   s   II*    s   MM *   )r   ifdr7  zsave: r8  r9  r:  r;  r0   r<  r   r  r   r-   r   z&multistrip support not yet implementedr   z%s %s %s %s %sr6  s       ) r   rD   r   sortedr   STRIPOFFSETSr   r?  rA  rB  r   r   r   ra   r   r   r   tobytesr   r   r   r   r   r   rj   r   r   r   appendljustNotImplementedErrorr   )rc   rJ  resultentriesZstripoffsetsr   rd   r   r   r   rL  r   Zifd_tagZ	ifd_valuer   rG  rH  r   rF  r%   r%   r)   rO  i  sj    


 


zImageFileDirectory_v2.tobytesc                 C  sN   |  dkr&|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r$   )r=  writer   r   rO  rD   )rc   r2  rJ  rS  r%   r%   r)   save  s    

zImageFileDirectory_v2.save)r   NN)T)T)T)T)T)r   )3r   r   r   r   re   r   rK   rJ  r   setterr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  listmapr   r   r   ZSIGNED_BYTEr   r   FLOATr   ZIFDZLONG8r  r  r  r  r%  r(  r)  r*  r,  r.  r4  rK  rO  rW  r%   r%   r%   r)   r     sz   <
 
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 Zdd Z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)superre   r   )rc   rs   kwargs	__class__r%   r)   re     s    zImageFileDirectory_v1.__init__c                 C  s   | j S rV   )r   rf   r%   r%   r)   r     r   zImageFileDirectory_v1.<lambda>c                 C  s   | j S rV   )r   rf   r%   r%   r)   r     r   r   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`

        rJ   )rK   r   r   r   )clsoriginalrL  r%   r%   r)   from_v2  s
    zImageFileDirectory_v1.from_v2c                 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`

        rJ   )r   rK   r   r   r   r   )rc   rL  r%   r%   r)   to_v2  s
    zImageFileDirectory_v1.to_v2c                 C  s   || j kp|| jkS rV   )r   r   r   r%   r%   r)   r     s    z"ImageFileDirectory_v1.__contains__c                 C  s   t t| jt| jB S rV   )rD   r   r   r   rf   r%   r%   r)   r     s    zImageFileDirectory_v1.__len__c                 C  s   t t| jt| jB S rV   )r   r   r   r   rf   r%   r%   r)   r     s    zImageFileDirectory_v1.__iter__c                 C  s   dD ]}|  ||| qd S N)FT)r   )rc   r   rd   r   r%   r%   r)   r     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 re  )r   r   r   r   r   ra   r   r   )rc   r   r   r   r   r   legacyrQ   r%   r%   r)   r     s    



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   re   r   tagsZtagdata__annotations__classmethodrc  rd  r   r   r   r   r   __classcell__r%   r%   r_  r)   r\    s   

r\  c                      s   e Zd ZdZdZdZd fdd	Zdd Zed	d
 Z	dd Z
dd Zdd Zdd Zdd Z fddZdd Zdd Zdd Z  ZS )TiffImageFileZTIFFz
Adobe TIFFFNc                   s   d | _ d | _t || d S rV   )tag_v2r   r]  re   )rc   r2  filenamer_  r%   r)   re   3  s    zTiffImageFile.__init__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   NrM   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )r2  r0  r   rl  rL  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesrA  rB  r   _seek)rc   r   r%   r%   r)   _open<  s    

zTiffImageFile._openc                 C  sP   | j d krJ|  }| t| j | j d kr@| |  d  q"| | | j S )Nr   )rr  r=  rs  rD   rq  rC  )rc   currentr%   r%   r)   n_framesW  s    


zTiffImageFile.n_framesc                 C  s<   |  |sdS | | t| j tj| j| j| _dS )z%Select a given frame as current imageN)	Z_seek_checkrs  r	   Z_decompression_bomb_checkr   corenewmodeim)rc   framer%   r%   r)   rC  a  s
    

zTiffImageFile.seekc                 C  s6  | j | _| j  t| j|kr| js2d}t|td|| j	| j| j  | 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 | _| _|| _	|   d S )Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %szLoading tags, location: %sr   r   )rp  r2  r=  rD   rq  rn  EOFErrorrA  rB  ro  rC  rP  rl  rK  r   rr  is_animatedZ_reload_exifr\  rc  r   rL  _setup)rc   r{  r   r%   r%   r)   rs  l  s>    



zTiffImageFile._seekc                 C  s   | j S )zReturn the current frame number)ro  rf   r%   r%   r)   r=    s    zTiffImageFile.tellc                 C  s   t | jkr| | jt  S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        )XMPrl  Z_getxmprf   r%   r%   r)   getxmp  s    zTiffImageFile.getxmpc                 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   r+  r   )	rl  r?  r   BaseZImageResourcesi16mathceili32)rc   blocksrQ   idnr   r   r%   r%   r)   get_photoshop_blocks  s    $z"TiffImageFile.get_photoshop_blocksc                   s   | j r| jr|  S t  S rV   )tileuse_load_libtiff_load_libtiffr]  rK  rf   r_  r%   r)   rK    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_loadingr2  r=  Zgetexifr   TAGS_V2_GROUPSget_ifdr   Zexif_transposer   r  ZOrientationrl  )rc   exifkeyr%   r%   r)   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	   rK  Zload_preparerD   r  r1  rY  r   r2  r  r  Z_getdecoderry  r   Zdecoderconfigsetimagerz  r   Z_exclusive_fpr}  rA  rB  r  r  rC  r0  readonlyr  close)
rc   r   Zextentsrs   r2  decodereZclose_self_fpr  errr%   r%   r)   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: %sr+   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   r/   I;16Nz;16Bz;16Nz;16Lr   r<   Fr  r$   z- unsupported data organizationicc_profiler@   rA   c                 S  s   g | ]}t |d  qS r   r   )r&   r	  r%   r%   r)   r     s     z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   )8rl  r1  COMPRESSION_INFOr?  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERrA  rB  r   YCBCRSUBSAMPLINGr   
IMAGEWIDTHIMAGELENGTH_sizer   SAMPLEFORMATrD   rZ   rY   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   rK   	OPEN_INFO_moder@  ry  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   rJ  rP  rN  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r   r  palette)rc   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ylayerr  offsetsr
  wrJ  strideZtile_rawmoder  r%   r%   r)   r~  &  s   



2


 








 


zTiffImageFile._setup)NN)r   r   r   formatformat_descriptionr  re   rt  r   rv  rC  rs  r=  r  r  rK  r  r  r~  rj  r%   r%   r_  r)   rk  .  s    	
	)	Urk  r,   r-   r;   r@   rA   r9   r/   r3   r7   r<   r>   r=   rB   YCbCrrC   r:   r1   r4   r8   )r,   r-   r;   r@   rA   r2   r/   r3   r6   r<   r>   r=   rB   r  rC   r:   r1   r4   r8   c           4      C  sB	  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 qvt| dr2tt t!t"t#t$fD ]2}|| j%kr| j%| ||< | j%j| |j|< q|d| jd}|rT||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t*dft+dff
D ] \}}||kr|| ||< q|d}|rd|t< |d |t < |d
 |t!< |dkr||t,< t-|d
krt-||t.< |d k	r$||t/< |d
kr6||t0< t1|krJ||t1< n| jdkr|t1 dkr| jdkr| 2 }| }t3|j4D ]:}t3|j5D ](}|||f dkrdnd|||f< qq|} n
t67| } | jd krP| j89d!d"}g }t-|d# }t3d#D ]>}|d$d% ||| ||d
   D 7 }|dgd&|  7 }q||t:< |t |t  }}t-|||d  d' d(  } t;|kr|r|d)t<}!| dkrd
nt=|!|  |}"|dkrt=|"d' d( d( |}"n|}"|"dkrd
}"|"|t;< | dkr d
n
| |t;  }#||t;  d
 |t;  }$|#d*kr:tj>|jt?< |#f|$d
  | | |#|$d
   f |t?< t@t3d|#|$ |#|tA< tB|d
|tC< | jd+krtDd,tEd-iF D ]\}%}&|G|%|& qtHtItJtKg}'|rd.|kr,|d. }(t	|(t
r|(dk s|(d/krd0}
tL|
|dkr$d1}
tL|
|(|tM< td2 td3tN|F  d})t|d4rz|Od tPQ|R })W n tSjTk
r   Y nX i }*|'tEt?tAtUtVg7 }'t,|d i}+i },t| d5r| jW },tX| di |,}-t0|-kr|-t0= tYZ|F |-F D ]\}%}&|%tj[krxtXtj\d6d7s(q |%|jkrD|j|% |*|%< n4t	|&t
t]t^tfs^q nt_|%j`}.|.rx|.|*|%< |%|+kr |%|'kr t	|&t^r|&ad8d9d: |+|%< n"t	|&tbrt]|&|+|%< n|&|+|%< q t0|+kr t-|+t0 d
kr |+t0 d |+t0< td;tN|+F  | jd<kr$d=}t|+F }/|/c  |||)||/|*f}0td| jd>|0|}	|	e| j8d?| j  |	ad@d
d  \}1}2|)s|f|2 |1rnqqn|)rztPg|) W n tk
r   Y nX |1dk 	r.dA|1 dB}
t|
n@|'D ]}%||%= q|h|}3tij| |dd?| j |3|| d
ffg dC|k	r>|| _kd S )DNzcannot write mode z as TIFFrJ   r  r   r   r   r   r   r   r   Ztiffinfor  zTiffinfo Keys: %srl  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r   r+   )r,   r-   r,      r  r<   r  r   c                 S  s   g | ]}|d  qS r  r%   r   r%   r%   r)   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  r   Zlibtiff_support_custom_tagsFr   r   r  zConverted items: %s)r1   r/   r  r  r?   i @  zencoder error z when writing image file_debug_multipage)l	SAVE_INFOry  r@  r1  r   encoderinfoencoderconfigr   r?  ra   r   WRITE_LIBTIFFr  r   r  r  r   r	   ZExifrK  rA  rB  rY  r\  rd  r   r  r  r   r   r   r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  rl  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  rD   r  r  r  r  copyr>  heightwidthr   invertrz  Z
getpaletter  r  
STRIP_SIZErY   r   STRIPBYTECOUNTSr   rN  COMPRESSION_INFO_REVr  r  REFERENCEBLACKWHITEr   
setdefaultr  r  r  TILEBYTECOUNTSr   JPEGQUALITYrM  rC  osdupr  ioUnsupportedOperationTRANSFERFUNCTIONSUBIFDr   rr   	itertoolschainZLIBTIFF_CORErw  rb   rj   r   r   r   rO   sortZ_getencoderr  rV  r  rW  r
   _saver  )4rz  r2  rm  r  rK   r  r  bitsextrar  r   rL  r  r  r  r  r   r  r  Ziccr   r  Zinverted_imZpxr  r  ZlutZcolormapcolorsrE  r  r
  r  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imager   rd   Z	blocklistr  rp  typesZattsZ
legacy_ifdZsupplied_tagsr   rg  r  errcoder   rJ  r%   r%   r)   r  '  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d:ddZdd Zdd Zdd Zdd Z	dd Z
dd ZejfddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd;d7d8Zd9S )<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 )Nr0  FTzw+bzr+b)	r   ri   close_fpr   openr1  r=  	beginningsetup)rc   fnrx  r%   r%   r)   re   m  s    
zAppendingTiffWriter.__init__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    TFrG   r   rF   r   zInvalid TIFF file header)ri   rC  r  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager0  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rc   iimmr   r%   r%   r)   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  ri   rC  r  r0  r  r  readLongr  	writeLongfixIFD)rc   r
  r   
ifd_offsetr%   r%   r)   finalize  s    


zAppendingTiffWriter.finalizec                 C  s   |    |   d S rV   )r  r  rf   r%   r%   r)   newFrame  s    zAppendingTiffWriter.newFramec                 C  s   | S rV   r%   rf   r%   r%   r)   	__enter__  s    zAppendingTiffWriter.__enter__c                 C  s   | j r|   dS )NF)r  r  )rc   exc_type	exc_value	tracebackr%   r%   r)   __exit__  s    zAppendingTiffWriter.__exit__c                 C  s   | j  | j S rV   )ri   r=  r  rf   r%   r%   r)   r=    s    zAppendingTiffWriter.tellc                 C  s*   |t jkr|| j7 }| j|| |  S rV   )r  r  r  ri   rC  r=  )rc   rJ  whencer%   r%   r)   rC    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   r0   )ri   rC  r  SEEK_ENDr=  rV  r   r  )rc   posZ	pad_bytesr%   r%   r)   r	    s    
zAppendingTiffWriter.goToEndc                 C  s.   || _ | j d | _| j d | _| j d | _d S )Nr-   r  ZHHL)endianlongFmtshortFmt	tagFormat)rc   r  r%   r%   r)   r    s    zAppendingTiffWriter.setEndianc                 C  sP   |   }|dkr"| j d | _qL| j| |  }| j|d tj q d S )Nr   r    r.   )r  ri   r=  r  rC  	readShortr  SEEK_CUR)rc   r  num_tagsr%   r%   r)   r    s    zAppendingTiffWriter.skipIFDsc                 C  s   | j |S rV   )ri   rV  r  r%   r%   r)   rV    s    zAppendingTiffWriter.writec                 C  s   t | j| jd\}|S )Nr   )r   r   r  ri   r0  r  r%   r%   r)   r    s    zAppendingTiffWriter.readShortc                 C  s   t | j| jd\}|S rH   )r   r   r  ri   r0  r  r%   r%   r)   r    s    zAppendingTiffWriter.readLongc                 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	ri   rC  r  r  rV  r   r   r  r  rc   rd   Zbytes_writtenr   r%   r%   r)   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)	ri   rC  r  r  rV  r   r   r  r  r$  r%   r%   r)   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%   r)   rewriteLastLong  s
    z#AppendingTiffWriter.rewriteLastLongc                 C  s>   | j t| j|}|d k	r:|dkr:d| d}t|d S )Nr   r!  r&  )ri   rV  r   r   r  r  r$  r%   r%   r)   
writeShort  s    zAppendingTiffWriter.writeShortc                 C  s>   | j t| j|}|d k	r:|dkr:d| d}t|d S )Nr    r!  r"  )ri   rV  r   r   r  r  r$  r%   r%   r)   r    s    zAppendingTiffWriter.writeLongc                 C  s   |    | j  d S rV   )r  ri   r  rf   r%   r%   r)   r  	  s    zAppendingTiffWriter.closec                 C  s   |   }t|D ]}t| j| jd\}}}| j| }|| }|dk}|sj|  }	|	| j	7 }	| 
|	 || 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  r>  r   r   r  ri   r0  
fieldSizesr  r  r)  Tagsr=  
fixOffsetsrC  r  r  )rc   r  rE  r   Z
field_typerF  Z
field_size
total_sizeis_localrJ  Zcur_posr%   r%   r)   r    s:    




    
zAppendingTiffWriter.fixIFDc                 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  r>  r  r  r  r%  ri   rC  r  r  r*  r   r   r'  r)  )rc   rF  r+  r,  r   rE  rJ  r%   r%   r)   r/  0  s"    

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   r-  r.  re   r  r  r  r  r  r=  r  r  rC  r	  r  r  rV  r  r  r%  r'  r)  r*  r  r  r  r/  r%   r%   r%   r)   r  O  s^   	

#r  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_imagesrv  r   )r  r  r  rY  r?  r   r  r=  rC  r  rv  r>  rK  r  )rz  r2  rm  r  r  r2  Zcur_idxtfZimsZnfrr   r%   r%   r)   	_save_allJ  s(    



r4  z.tifz.tiffz
image/tiff)n
__future__r   r  r  loggingr  r  r   r   collections.abcr   	fractionsr   numbersr   r    r   r	   r
   r   r   r   _binaryr   r  r   r  r   r   	getLoggerr   rA  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  rN  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  ZEXIFIFDr  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r   r  r  rZ   r  rI   rL   rU   r\   r   r   rO   r   r   r   r   setattrr\  ZImageFileDirectoryrk  r  r  r  r4  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer%   r%   r%   r)   <module>)   s   
                                                                                                                     |
     \   f  * |