a
    ~'f-                    @  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 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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/ZHd0ZId1ZJd2ZKd3ZLd4ZMd5ZNd6ZOd7ZPd8ZQd9ZRd:ZSd;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLZTdMdN eTU D ZVe)d dOddOdPfdQe*d dOddOdPfdQe)d dOdRdOdPfdSe*d dOdRdOdPfdSe)ddOddOdPfdTe*ddOddOdPfdTe)ddOdRdOdPfdUe*ddOdRdOdPfdUe)d dOddVdPfdWe*d dOddVdPfdWe)d dOdRdVdPfdXe*d dOdRdVdPfdXe)ddOddVdPfdYe*ddOddVdPfdYe)ddOdRdVdPfdZe*ddOdRdVdPfdZe)d dOdd[dPfd\e*d dOdd[dPfd\e)d dOdRd[dPfd]e*d dOdRd[dPfd]e)ddOdd[dPfd^e*ddOdd[dPfd^e)ddOdRd[dPfd_e*ddOdRd[dPfd_e)d dOdd`dPfdae*d dOdd`dPfdae)d dOdRd`dPfdbe*d dOdRd`dPfdbe)ddOdd`dPfdce*ddOdd`dPfdce)ddVdd`dPfdce*ddVdd`dPfdce)ddOdRd`dPfdde*ddOdRd`dPfdde)ddOddedPfdfe)d dOddgdPfdhe)ddOddgdPfdhe*ddOddgdPfdie)ddOdRdgdPfdje)ddVddgdPfdke*ddVddgdPfdle)d dmddndPfdoe*d dmddndPfdpe)ddOddndPfdqe)ddVddndPfdre*ddVddndPfdse)ddmddndPfdoe*ddmddndPfdpe)ddOddtdVfdue*ddOddtdVfdue)dRdOddvdPfdwe*dRdOddvdPfdwe)dRdOdRdvdPfdxe*dRdOdRdvdPfdxe)dRdOddydPfdze*dRdOddydPfdze)dRdOddyd{fd|e*dRdOddyd{fd|e)dRdOdd}d~fde*dRdOdd}d~fde)dRdOdddfde*dRdOdddfde)dRdOddydOfde*dRdOddydOfde)dRdOdd}dfde*dRdOdd}dfde)dRdOdddfde*dRdOdddfde)dRdOddydVfdze*dRdOddydVfdze)dRdOdd}dfde*dRdOdd}dfde)dRdOdddfde*dRdOdddfde)dRdOddydfdze*dRdOddydfdze)dRdOdddPfde*dRdOdddPfde)dRdOdddPfde*dRdOdddPfde)dRdOddd{fde*dRdOddd{fde)dRdOdddOfde*dRdOdddOfde)dRdOdddVfde*dRdOdddVfde)ddOddOdPfde*ddOddOdPfde)ddOdRdOdPfde*ddOdRdOdPfde)ddOddVdPfde*ddOddVdPfde)ddOdRdVdPfde*ddOdRdVdPfde)ddOdd[dPfde*ddOdd[dPfde)ddOdRd[dPfde*ddOdRd[dPfde)ddOdd`dPfde*ddOdd`dPfde)ddOddtdVfde*ddOddtdVfde)ddOdRd`dPfde*ddOdRd`dPfde)ddOddydPfde*ddOddydPfde)ddOdd}d{fde*ddOdd}d{fde)ddOddd~fde*ddOddd~fde)ddOdddPfde)ddOdd`dPfdce*ddOdd`dPfdce)ddOddvdPfde*ddOddvdPfde)ddOddvdPfde*ddOddvdPfdiuZWeXdd eWD ZYg dZZdd Z[dd Z\dd Z]i Z^i Z_dd Z`G dd deZadd Zbdd Zcdd Zde	re
eeef Zfne
ZfG dd defZge^eg_^e_eg__e!U D ]B\ZhZieijddZiekegdei e^eh d  ekegdei e_eh  	q[^[_[h[iG ddĄ degZlelZmG ddƄ dejZnde)dddOdfde)ddd`dfde)dddtdRfde)ddd`dfde)dddtdRfde)ddRdndfde)dddgdfde)ddRdgdfde)dddndfde)dRddvdfde)dRddyd fde)dRddydRfde)dddydfde)dddvdfde)dddvdfde*ddRdndfde*dddgdfde*ddRdgdfde*dddndfdڜZodd܄ ZpG ddބ dރZqdd Zresenjtene[ euenjtep evenjter ewenjtddg exenjtd dS )    )annotationsN)MutableMapping)Fraction)NumberRational)TYPE_CHECKINGAnyCallable   )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)   a/var/www/staging/api/virtual_environments/venv/lib/python3.9/site-packages/PIL/TiffImagePlugin.py
<dictcomp>       r.   r
   r)   )1z1;Ir"   )r1   z1;IR)r1   r1   )r1   z1;R)r"   )LzL;2I)r2   zL;2IR)r2   zL;2)r2   zL;2R)r$   )r2   zL;4I)r2   zL;4IR)r2   zL;4)r2   zL;4R)r(   )r2   zL;I)r2   zL;IR)r2   r2   )r2   zL;R)   )I;16zI;12)   )r4   r4   )I;16Br6   )r4   zI;16R)II;16S)r7   I;16BS)r#   )    )FF;32F)r;   F;32BF)r7   zI;32N)r7   I;32S)r7   I;32BS)r(   r(   )LAr@   )r(   r(   r(   )RGBrA   )rA   zRGB;R)r(   r(   r(   r(   )RGBArB   )r   )RGBXrC   )r(   r(   r(   r(   r(   r   r   )rC   ZRGBXX)r(   r(   r(   r(   r(   r(   )r   r   r   )rC   ZRGBXXX)rB   ZRGBa)r
   r   )rB   ZRGBaX)r
   r   r   )rB   ZRGBaXX)r"   r   )rB   ZRGBAX)r"   r   r   )rB   ZRGBAXX)i  )r5   r5   r5   )rA   zRGB;16L)rA   zRGB;16B)r5   r5   r5   r5   )rB   zRGBA;16L)rB   zRGBA;16B)rC   zRGBX;16L)rC   zRGBX;16B)rB   zRGBa;16L)rB   zRGBa;16Br#   )PzP;1)rE   zP;1R)rE   zP;2)rE   zP;2R)rE   zP;4)rE   zP;4R)rE   rE   )PArF   )rE   zP;Rr%   )CMYKrG   )rG   ZCMYKX)rG   ZCMYKXX)rG   zCMYK;16Lr&   )rA   rC   r(   )LABrH   c                 c  s   | ]}t |d  V  qdS )r$   N)len)r*   Zkey_tpr)   r)   r-   	<genexpr>  r/   rJ   )   MM *   II* s   MM* s   II *s   MM +s   II+ c                 C  s   | d d t v S Nr$   )PREFIXESprefixr)   r)   r-   _accept  s    rQ   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    rZ   c                 C  sP   t | }|j|jf}t||k r.t| t|}t||krLt | } t| |}|S N)r   	numeratordenominatorminrZ   rS   max)rV   rW   Zmin_valfracrY   r)   r)   r-   _limit_signed_rational"  s    
ra   c                   s    fdd}|S )Nc                   s   t | j | S r[   )getattr_val)selfargsopr)   r-   delegate8  s    z_delegate.<locals>.delegater)   )rg   rh   r)   rf   r-   	_delegate7  s    ri   c                   @  sJ  e Zd ZdZdZd2d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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d.Z(ed/Z)e*e+d0rFed0Z,d1S )3rT   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_denominatorrc   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
   )	
isinstancerT   r\   rj   r]   rk   rc   r   float)rd   valuer]   r)   r)   r-   __init__L  s    


zIFDRational.__init__c                 C  s   | j S r[   )rj   rd   r)   r)   r-   r\   f  s    zIFDRational.numeratorc                 C  s   | j S r[   )rk   rq   r)   r)   r-   r]   j  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   )r]   r\   rc   limit_denominator)rd   max_denominatorfr)   r)   r-   rU   n  s    
zIFDRational.limit_rationalc                 C  s   t t| jS r[   )strrn   rc   rq   r)   r)   r-   __repr__{  s    zIFDRational.__repr__c                 C  s
   | j  S r[   )rc   __hash__rq   r)   r)   r-   rw   ~  s    zIFDRational.__hash__c                 C  s0   | j }t|tr|j }t|tr(t|}||kS r[   )rc   rm   rT   rn   )rd   otherrV   r)   r)   r-   __eq__  s    

zIFDRational.__eq__c                 C  s   | j | j| jgS r[   )rc   rj   rk   rq   r)   r)   r-   __getstate__  s    zIFDRational.__getstate__c                 C  s,   t | d |\}}}|| _|| _|| _d S )Nr   )rT   rp   rc   rj   rk   )rd   staterc   rj   rk   r)   r)   r-   __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__rp   propertyr\   r]   rU   rv   rw   ry   rz   r|   ri   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)   r-   rT   >  sR   


rT   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)   r-   	decorator  s
    z#_register_loader.<locals>.decoratorr)   )r   r   r   r)   r   r-   _register_loader  s    r   c                   s    fdd}|S )Nc                   s   | t  < | S r[   )_write_dispatch)r   r   r)   r-   r     s    z#_register_writer.<locals>.decoratorr)   )r   r   r)   r   r-   _register_writer  s    r   c                   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 r[   )_unpackrI   rd   data
legacy_apifmtr   r)   r-   <lambda>  s    z!_register_basic.<locals>.<lambda>c                   s   d  fdd|D S )Nr/   c                 3  s   | ]}  |V  qd S r[   )_packr*   ro   )r   rd   r)   r-   rJ     r/   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrd   values)r   rq   r-   r     s    )T)r   r   structcalcsizer   r   )Zidx_fmt_namer   r   namer)   r   r-   _register_basic  s    
r   c                   @  s  e Zd ZU dZi Zded< i Zded< d\dd	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eeeejd(d)f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$d*d+fej%d6d7fg	 e&d8d8d]d:d;Z'e(d8d<d= Z)e&d>d8d^d?d@Z*e(d>dAdB Z+e&dCdDd_dEdFZ,e(dCdGdH Z-e&dId8d`dJdKZ.e(dIdLdM Z/e&dNdDdadOdPZ0e(dNdQdR Z1dSdT Z2dUdV Z3dbdXdYZ4dZd[ Z5dS )c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*     Nc                 C  s   t |s dt| d}t||dur,|n
|dd | _| jtkrLd| _n| jtkr^d| _nd}t||d dk| _|| _i | _	| 
  | jr| d	|d
d 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(   r2   r$   F)rQ   reprSyntaxError_prefixMM_endianII_bigtiffgrouptagtyperesetr   next_legacy_api)rd   ifhrP   r   msgr)   r)   r-   rp   %  s"    

,zImageFileDirectory_v2.__init__c                 C  s   | j S r[   )r   rq   r)   r)   r-   r   E  r/   zImageFileDirectory_v2.<lambda>c                 C  s   | j S r[   )_offsetrq   r)   r)   r-   r   F  r/   c                 C  s   | j S r[   )r   rq   r)   r)   r-   r   H  s    z ImageFileDirectory_v2.legacy_apic                 C  s   d}t |d S )Nz"Not allowing setting of legacy api)	Exception)rd   ro   r   r)   r)   r-   r   L  s    c                 C  s(   i | _ i | _i | _i | _d | _d | _d S r[   )_tags_v1_tags_v2_tagdatar   _nextr   rq   r)   r)   r-   r   Q  s    zImageFileDirectory_v2.resetc                 C  s   t t| S r[   )ru   dictrq   r)   r)   r-   __str__Y  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*   codero   rq   r)   r-   r.   b  s   z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsrq   r)   rq   r-   named\  s    
zImageFileDirectory_v2.namedc                 C  s   t t| jt| jB S r[   )rI   setr   r   rq   r)   r)   r-   __len__g  s    zImageFileDirectory_v2.__len__c                 C  sf   || j vr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrbt|ttfsb|f}|S r[   )r   r   r   r   r   rm   tuplebytes)rd   tagr   typr   handlerrV   r)   r)   r-   __getitem__j  s    



z!ImageFileDirectory_v2.__getitem__c                 C  s   || j v p|| jv S r[   )r   r   rd   r   r)   r)   r-   __contains__u  s    z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S r[   )_setitemr   )rd   r   ro   r)   r)   r-   __setitem__x  s    z!ImageFileDirectory_v2.__setitem__c              
     s  t ttf}t|| j t||r(|gn|}|| jv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 u rt|dkr|s|rd| j| tjtjfv rd|f}z|\||< W n< ty   td| dt| d |d ||< Y n0 n|||< d S )Nc                 s  s   | ]}t |tV  qd S r[   )rm   rT   r*   r,   r)   r)   r-   rJ     r/   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s  s   | ]}|d kV  qdS r   Nr)   r   r)   r)   r-   rJ     r/   c                 s  s   | ]}t |tV  qd S r[   )rm   intr   r)   r)   r-   rJ     r/   c                 s  s&   | ]}d |  kodk n  V  qdS )r   r   Nr)   r   r)   r)   r-   rJ     r/   c                 s  s&   | ]}d |  k odk n  V  qdS )i i   Nr)   r   r)   r)   r-   rJ     r/   c                 s  s   | ]}|d kV  qdS r   r)   r   r)   r)   r-   rJ     r/   c                 s  s   | ]}t |tV  qd S r[   )rm   rn   r   r)   r)   r-   rJ     r/   c                 s  s   | ]}t |tV  qd S r[   )rm   ru   r   r)   r)   r-   rJ     r/   c                 s  s   | ]}t |tV  qd S r[   )rm   r   r   r)   r)   r-   rJ     r/   c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )rm   ru   encoder   r)   r)   r-   
<listcomp>  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r)   )rm   r   rn   r   r)   r)   r-   r     r/   c                 3  s   | ]}  |V  qd S r[   )Zcvt_enumr   infor)   r-   rJ     r/   r
   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   ru   r   r   r   rm   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthrI   
ValueErrorwarningswarn)rd   r   ro   r   Z	basetypesr   is_ifddestr)   r   r-   r   {  s~    



zImageFileDirectory_v2._setitemc                 C  s.   | j |d  | j|d  | j|d  d S r[   )r   popr   r   r   r)   r)   r-   __delitem__  s    z!ImageFileDirectory_v2.__delitem__c                 C  s   t t| jt| jB S r[   )iterr   r   r   rq   r)   r)   r-   __iter__  s    zImageFileDirectory_v2.__iter__c                 C  s   t | j| |S r[   )r   unpackr   )rd   r   r   r)   r)   r-   r     s    zImageFileDirectory_v2._unpackc                 G  s   t j| j| g|R  S r[   )r   packr   )rd   r   r   r)   r)   r-   r     s    zImageFileDirectory_v2._packHshortr2   longbzsigned bytehzsigned shortlzsigned longrt   rn   ddoubler   Zlong8r
   Tc                 C  s   |S r[   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 r[   )rm   rT   r   r   rd   r   r)   r)   r-   
write_byte  s
    


z ImageFileDirectory_v2.write_byter"   c                 C  s"   | dr|d d }|ddS )N    rR   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  )rm   r   ru   r   r   rd   ro   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$   r2   c                   s    r| |fS t | |S r[   rT   ar  r   r)   r-   combine	  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S r[   r)   r*   numdenomr  r)   r-   rJ     r/   z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r"   r
   r   rI   r   ziprd   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 gt|dR  V  qdS )Z2Ll    N)r   rZ   r*   r`   rq   r)   r-   rJ     s   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r)   rq   r-   write_rational  s    z$ImageFileDirectory_v2.write_rationalr'   c                 C  s   |S r[   r)   r   r)   r)   r-   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |trt|}t |tr,t|dd}|S )Nr   r   )rm   rT   r   ru   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 r[   r  r  r  r)   r-   r  $  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  s   | ]\}} ||V  qd S r[   r)   r   r#  r)   r-   rJ   '  r/   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 gt|ddR  V  qdS )Z2lii   N)r   ra   r*  rq   r)   r-   rJ   +  s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r)   rq   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. )readrI   OSError)rd   fpr   retr   r)   r)   r-   _ensure_read0  s    
z"ImageFileDirectory_v2._ensure_readc              
   C  s  |    | | _z0| jr0| d| |dn| d| |dd }t|D ]}| jrp| d| |dn| d| |d	\}}}}t|| j	j
}t|d
}	d| d| d|	 d| d	}
z| j| \}}W n$ ty   td|
| Y qPY n0 || }|| jrdndkrt| }| | jr4dnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 qP|st|
 qP|| j|< || j|< |
d|dkrd| nt| 7 }
t|
 qP| jr*| d| |dn| d| |d\| _W n6 tyz }
 ztt|
 W Y d }
~
d S d }
~
0 0 d S )Nr   r(   r
  r"   r   ZHHQ8s   HHL4sr3   unknownztag:  (
) - type: )z%s - unsupported type %sr$   r2   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r1  z. Skipping tag 
 - value: r:   <table: %d bytes>)r   tellr   r   r   r6  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readrI   r   r  r   r   r   r   r3  ru   )rd   r4  Z	tag_countir   r   countr   tagnametypnamer   Z	unit_sizer   r   hereoffsetr)   r)   r-   load:  st    








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| | g|R  }t|| jj}|r,d	n
t|d
}d| d| d| d| d	}|dt|dkrtdt| nt| 7 }t	| |rd}n(|tjtjtjfv rt|}nt|}t|dkr|||||dddf qF|||||  d||f |t|d d d 7 }qF|d ur||| \}}}}}|rNd}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
  r3   r$   zTag %s, Type: %s, Value: %sr   s   II*    s   MM *   )r   ifdr9  zsave: r:  r;  r<  r=  r5   r>  r
   r  r/   r2   r"   z&multistrip support not yet implementedr   z%s %s %s %s %sr8  s       ) r   rI   r   sortedr   STRIPOFFSETSr   rA  rC  rD  r   r   r   rm   r   r   r   tobytesr   r   r   r   r   r   ru   r   r   r   appendljustNotImplementedErrorr   )rd   rL  resultentriesZstripoffsetsr   ro   r   r  r   rN  r   Zifd_tagZ	ifd_valuer   rI  rJ  r   rH  r)   r)   r-   rQ  }  sj    


 


zImageFileDirectory_v2.tobytesc                 C  sN   |  dkr&|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r(   )r?  writer   r   rQ  rI   )rd   r4  rL  rU  r)   r)   r-   save  s    

zImageFileDirectory_v2.save)r   NN)T)T)T)T)T)r   )6r   r   r   r   r   __annotations__r   rp   r   rP   rL  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  r)  r+  r,  r-  r/  r0  r6  rM  rQ  rY  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|i | d| _d S )NT)superrp   r   )rd   re   kwargs	__class__r)   r-   rp     s    zImageFileDirectory_v1.__init__c                 C  s   | j S r[   )r   rq   r)   r)   r-   r     r/   zImageFileDirectory_v1.<lambda>c                 C  s   | j S r[   )r   rq   r)   r)   r-   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`

        rO   )rP   r   r   r   )clsoriginalrN  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`

        rO   )r   rP   r   r   r   r   )rd   rN  r)   r)   r-   to_v2  s
    zImageFileDirectory_v1.to_v2c                 C  s   || j v p|| jv S r[   )r   r   r   r)   r)   r-   r      s    z"ImageFileDirectory_v1.__contains__c                 C  s   t t| jt| jB S r[   )rI   r   r   r   rq   r)   r)   r-   r   #  s    zImageFileDirectory_v1.__len__c                 C  s   t t| jt| jB S r[   )r  r   r   r   rq   r)   r)   r-   r  &  s    zImageFileDirectory_v1.__iter__c                 C  s   dD ]}|  ||| qd S N)FT)r   )rd   r   ro   r   r)   r)   r-   r   )  s    z!ImageFileDirectory_v1.__setitem__c                 C  sn   || j vrL| j| }| j| }| j| \}}dD ]}| ||| ||| q0| j | }t|ttfsj|f}|S rh  )r   r   r   r   r   rm   r   r   )rd   r   r   r   r   r   legacyrV   r)   r)   r-   r   -  s    



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   rp   r   tagsZtagdatarZ  classmethodrf  rg  r   r   r  r   r   __classcell__r)   r)   rb  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 r[   )tag_v2r   r`  rp   )rd   r4  filenamerb  r)   r-   rp   G  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   NrR   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )r4  r2  r   rn  rN  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesrC  rD  r   _seek)rd   r   r)   r)   r-   _openP  s    

zTiffImageFile._openc                 C  sP   | j d u rJ|  }| t| j | j d u r@| |  d  q"| | | j S )Nr
   )rt  r?  ru  rI   rs  rE  )rd   currentr)   r)   r-   n_framesk  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_checkru  r   Z_decompression_bomb_checkr   corenewmodeim)rd   framer)   r)   r-   rE  u  s
    

zTiffImageFile.seekc                 C  sL  | 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v rd| _n
| jj| _| jdkr|d | _t| jdkr| jdk| _|  j	d7  _	q| j| j|  | j| j |   t| j | _| _|| _	|   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
   )rr  r4  r?  rI   rs  rp  EOFErrorrC  rD  rq  r   rE  rR  rn  rM  r   rt  is_animatedZ_reload_exifr_  rf  r   rN  _setup)rd   r}  r   r)   r)   r-   ru    sD    




zTiffImageFile._seekc                 C  s   | j S )zReturn the current frame number)rq  rq   r)   r)   r-   r?    s    zTiffImageFile.tellc                 C  s   t | jv 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.
        )XMPrn  Z_getxmprq   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   )	rn  rA  r   BaseZImageResourcesi16mathceili32)rd   blocksrV   idnr   r   r)   r)   r-   get_photoshop_blocks  s    $z"TiffImageFile.get_photoshop_blocksc                   s   | j r| jr|  S t  S r[   )tileuse_load_libtiff_load_libtiffr`  rM  rq   rb  r)   r-   rM    s    zTiffImageFile.loadc                 C  sj   | j s>d| _| j  |  }tjD ]}||vr2q$|| q$tj	| dd t
jj| jv rf| jt
jj= d S )NT)Zin_place)r  !_close_exclusive_fp_after_loadingr4  r?  Zgetexifr   TAGS_V2_GROUPSget_ifdr   Zexif_transposer   r  ZOrientationrn  )rd   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y   d}Y n0 |r||d< t | jd	t|| j}z|| j| W n2 ty } zd
}t||W Y d}~n
d}~0 0 | 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   rM  Zload_preparerI   r  r3  r\  r   r4  r  r  Z_getdecoderr{  r   Zdecoderconfigsetimager|  r   Z_exclusive_fpr  rC  rD  r  r  rE  r2  readonlyr  close)
rd   r   Zextentsre   r4  decodereZclose_self_fpr  errr)   r)   r-   r    sX    
 





zTiffImageFile._load_libtiffc              
   C  s  d| j v rd}t|t| j td | _| j td| _| j td}| jdkrVd}| j t	d}t
d t
d| j t
d	| t
d
| j t
d| t
d| jt 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v r^d}	n|dkrnd}	nd}	|	t|7 }	t|}
| j t| jdkr|dv 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 y } z$t
d d}t||W Y d}~n
d}~0 0 t
d| t
d| j! | j| j"d< | j t#d}| j t$d}|r\|r\| j t%}|dkr||f| j"d < nX|dkr&|d! |d! f| j"d < n6|du rN||f| j"d < ||f| j"d"< n||f| j"d"< d } }}g | _&t'p|| jd#k| _(| j(rZ|dkr|dd d |dd  }t
d| t| \| _}|d$krd%}d&|v r|)d&d'}d(|v 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 v srt-| j v rt,| j v 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 v r| j t2 | j"d/< | j!d0v 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: %sr0   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   r4   I;16Nz;16Bz;16Nz;16Lr   rA   Fr  r(   z- unsupported data organizationicc_profilerE   rF   c                 S  s   g | ]}t |d  qS r   r   )r*   r  r)   r)   r-   r     r/   z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr/   )8rn  r3  COMPRESSION_INFOrA  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERrC  rD  r   YCBCRSUBSAMPLINGr   
IMAGEWIDTHIMAGELENGTH_sizer   SAMPLEFORMATrI   r_   r^   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   rP   	OPEN_INFO_moderB  r{  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   rL  rR  rP  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r   r   palette)rd   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  wrL  strideZtile_rawmoder  r)   r)   r-   r  =  s   



2




 






 


zTiffImageFile._setup)NN)r   r   r   formatformat_descriptionr  rp   rv  r   rx  rE  ru  r?  r  r  rM  r  r  r  rl  r)   r)   rb  r-   rm  B  s    	
	,	Urm  r1   r2   r@   rE   rF   r>   r4   r8   r<   rA   rC   rB   rG   YCbCrrH   r?   r6   r9   r=   )r1   r2   r@   rE   rF   r7   r4   r8   r;   rA   rC   rB   rG   r  rH   r?   r6   r9   r=   c           5      C  sB	  zt | j \}}}}}}W n< tyV }	 z$d| j d}
t|
|	W Y d }	~	n
d }	~	0 0 t|d}| j}| j}z|d }W n, ty   | jd}t	|t
rd }Y n0 |d u rd}n|dkrd}n|dkrd	}tp|dk}d
|t< | jd |t< | jd
 |t< d|v r|d }n:d|v rJ|d }t	|trNt }|| |}ni }tdt| t	|trr| }|D ]h}t	|tjr|tjv r||||< n||||< z|j| |j|< W n ty   Y n0 qvt| dr0tt t!t"t#t$fD ]2}|| j%v r| j%| ||< | j%j| |j|< q|d| jd}|rR||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 ] \}}||v r|| ||< q|d}|rd|t< |d |t < |d
 |t!< |dkr||t,< t-|d
krt-||t.< |d ur"||t/< |d
kr4||t0< t1|vrH||t1< n| jdv 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 v rN| 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;|vr|r|d)t<}!| dkrd
nt=|!|  |}"|dkrt=|"d' d( d( |}"n|}"|"dkrd
}"|"|t;< | dkrd
n
| |t;  }#||t;  d
 |t;  }$|#d*kr8t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.|v 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 tSjTy   Y n0 i }*|'tUtEt?tAtVtWg7 }'t,|d i}+i },t| d5r| jX },i tY| di |,}-t0|-v r|-t0= tZ[|F |-F D ]\}%}&|%tj\vrztYtj]d6d7s*q|%|jv rF|j|% |*|%< n4t	|&t
t^t_tfs`qnt`|%ja}.|.rz|.|*|%< |%|+vr|%|'vrt	|&t_r|&bd8d9d: |+|%< n"t	|&tcrt^|&|+|%< n|&|+|%< qt0|+v rt-|+t0 d
kr|+t0 d |+t0< td;tN|+F  | jd<v r&d=}t|+F }/|/d  |||)||/|*f}0te| jd>|0|}1|1f| j8d?| j  |1bd@d
d  \}2}3|)s|g|3 |2rpqqp|)rztPh|) W n ty   Y n0 |2dk 	r.dA|2 dB}
t|
n@|'D ]}%||%= q|i|}4tjk| |dd?| j |4|| d
ffg dC|v 	r>|| _ld S )DNzcannot write mode z as TIFFrO   r  r   r   r   r    r   r
   r   Ztiffinfor  zTiffinfo Keys: %srn  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r"   r0   )r1   r2   r1   r   r  rA   r  r#   c                 S  s   g | ]}|d  qS r  r)   r   r)   r)   r-   r     r/   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)r6   r4   r  r  rD   i @  zencoder error z when writing image file_debug_multipage)m	SAVE_INFOr{  rB  r3  r   encoderinfoencoderconfigr   rA  rm   r   WRITE_LIBTIFFr  r   r  r  r   r   ZExifrM  rC  rD  r\  r_  rg  r   r  r  r   r   r   r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  rn  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  rI   r  r  r  r  copyr@  heightwidthr   invertr|  Z
getpaletter  r  
STRIP_SIZEr^   r   STRIPBYTECOUNTSr   rP  COMPRESSION_INFO_REVr  r  REFERENCEBLACKWHITEr   
setdefaultr  r  r  TILEBYTECOUNTSr   JPEGQUALITYrO  rE  osdupr  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFDr   rb   	itertoolschainZLIBTIFF_COREry  rn   ru   r   r   r   rT   sortZ_getencoderr  rX  r  rY  r   _saver  )5r|  r4  ro  r  rP   r  r  bitsextrar  r   rN  r  r  r  r  r   r  r  Ziccr   r  Zinverted_imZpxr  r  ZlutZcolormapcolorsrG  r  r  r  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imager   ro   Z	blocklistr  rr  typesZattsZ
legacy_ifdZsupplied_tagsr   rj  r  encodererrcoder   rL  r)   r)   r-   r  >  s    














*
&





 











r  c                   @  s   e Zd Zg dZh dZd1d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&d' Zd(d) Zd*d+ Zd,d- Zd2d.d/Zd0S )3AppendingTiffWriter)r   r
   r
   r"   r$   r(   r
   r
   r"   r$   r(   r$   r(   r$   r"   r$   r(   >   i   r   i  i  i	  r   Fc                 C  st   t |dr|| _d| _nD|| _d| _zt||r2dnd| _W n tyZ   t|d| _Y n0 | j | _|   d S )Nr2  FTzw+bzr+b)	r   rt   close_fpr   openr3  r?  	beginningsetup)rd   fnrz  r)   r)   r-   rp     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$   TFrL   r   rK   r   zInvalid TIFF file header)rt   rE  r  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager2  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rd   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  rt   rE  r  r2  r  r
  readLongr  	writeLongfixIFD)rd   r  r   
ifd_offsetr)   r)   r-   finalize  s    


zAppendingTiffWriter.finalizec                 C  s   |    |   d S r[   )r  r  rq   r)   r)   r-   newFrame  s    zAppendingTiffWriter.newFramec                 C  s   | S r[   r)   rq   r)   r)   r-   	__enter__  s    zAppendingTiffWriter.__enter__c                 C  s   | j r|   dS )NF)r  r  )rd   exc_type	exc_value	tracebackr)   r)   r-   __exit__  s    zAppendingTiffWriter.__exit__c                 C  s   | j  | j S r[   )rt   r?  r  rq   r)   r)   r-   r?    s    zAppendingTiffWriter.tellc                 C  s*   |t jkr|| j7 }| j|| |  S r[   )r  r  r  rt   rE  r?  )rd   rL  whencer)   r)   r-   rE    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   r5   )rt   rE  r  SEEK_ENDr?  rX  r   r  )rd   posZ	pad_bytesr)   r)   r-   r    s    
zAppendingTiffWriter.goToEndc                 C  s.   || _ | j d | _| j d | _| j d | _d S )Nr2   r
  ZHHL)endianlongFmtshortFmt	tagFormat)rd   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$   r3   )r  rt   r?  r  rE  	readShortr  SEEK_CUR)rd   r  num_tagsr)   r)   r-   r    s    zAppendingTiffWriter.skipIFDsc                 C  s   | j |S r[   )rt   rX  r  r)   r)   r-   rX    s    zAppendingTiffWriter.writec                 C  s   t | j| jd\}|S )Nr"   )r   r  r  rt   r2  r  r)   r)   r-   r     s    zAppendingTiffWriter.readShortc                 C  s   t | j| jd\}|S rM   )r   r  r  rt   r2  r  r)   r)   r-   r    s    zAppendingTiffWriter.readLongc                 C  sN   | j dtj | j t| j|}|d urJ|dkrJd| d}t|d S )Nr$   wrote only  bytes but wanted 4	rt   rE  r  r!  rX  r   r	  r  r
  rd   ro   Zbytes_writtenr   r)   r)   r-   rewriteLastShortToLong  s
    z*AppendingTiffWriter.rewriteLastShortToLongc                 C  sN   | j dtj | j t| j|}|d urJ|dkrJd| d}t|d S )Nr#  r"   r$   bytes but wanted 2)	rt   rE  r  r!  rX  r   r	  r  r
  r'  r)   r)   r-   rewriteLastShort  s
    z$AppendingTiffWriter.rewriteLastShortc                 C  sN   | j dtj | j t| j|}|d u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 ur:|dkr:d| d}t|d S )Nr"   r$  r)  )rt   rX  r   r	  r  r
  r'  r)   r)   r-   
writeShort  s    zAppendingTiffWriter.writeShortc                 C  s>   | j t| j|}|d ur:|dkr:d| d}t|d S )Nr$   r$  r%  )rt   rX  r   r	  r  r
  r'  r)   r)   r-   r    s    zAppendingTiffWriter.writeLongc                 C  s   |    | j  d S r[   )r  rt   r  rq   r)   r)   r-   r  "  s    zAppendingTiffWriter.closec                 C  s   |   }t|D ]}t| j| jd\}}}| j| }|| }|dk}|sj|  }	|	| j	7 }	| 
|	 || jv 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  rt   r2  
fieldSizesr  r  r,  Tagsr?  
fixOffsetsrE  r  r!  )rd   r"  rG  r   Z
field_typerH  Z
field_size
total_sizeis_localrL  Zcur_posr)   r)   r-   r  &  s2    





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(  rt   rE  r  r!  r-  r   r   r*  r,  )rd   rH  r.  r/  r   rG  rL  r)   r)   r-   r2  I  s"    

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   r0  r1  rp   r  r  r  r  r  r?  r  r  rE  r  r	  r  rX  r   r  r(  r*  r,  r-  r  r  r  r2  r)   r)   r)   r-   r  h  s0   	

#r  c              	   C  s   | j  }| j}t|dg }t| ds:|s:t| ||S |  }zt|v}| g| D ]Z}||_ ||_t|dsxd}	n|j	}	t
|	D ]*}
||
 |  t||| |  qqXW d    n1 s0    Y  W | | n| | 0 d S )Nappend_imagesrx  r
   )r  r  r  r\  rA  r   r  r?  r  rx  r@  rE  rM  r  )r|  r4  ro  r  r  r5  Zcur_idxtfZimsZnfrr   r)   r)   r-   	_save_allc  s(    



,r7  z.tifz.tiffz
image/tiff)y
__future__r   r  r  loggingr  r  r   r   collections.abcr   	fractionsr   numbersr   r   typingr   r   r	    r   r   r   r   r   r   _binaryr   r  r   r  r   r   	getLoggerr   rC  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  r  rP  r  r  r  r  r  r  r  r  r  r  r  Z	PREDICTORr  r  r  r  r  r  r  r  Z
JPEGTABLESr  r  r  r  r  r  ZEXIFIFDr  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r   r  r  r_   r  rN   rQ   rZ   ra   r   r   ri   rT   r   r   r   r   Z
_IFDv2Baser   r   r   r   setattrr_  ZImageFileDirectoryrm  r  r  r  r7  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer)   r)   r)   r-   <module>)   s   
|
|   s\   i  , |