U
    Å½„b)% ã                ä   @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZ ddlmZmZmZmZmZ ddlmZ 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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/ZCd0ZDd1ZEd2ZFd3ZGd4ZHd5ZId6ZJd7ZKd8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIœZLdJdK„ eL M¡ D ƒZNe"d dLddLdMfdNe#d dLddLdMfdNe"d dLdOdLdMfdPe#d dLdOdLdMfdPe"ddLddLdMfdQe#ddLddLdMfdQe"ddLdOdLdMfdRe#ddLdOdLdMfdRe"d dLddSdMfdTe#d dLddSdMfdTe"d dLdOdSdMfdUe#d dLdOdSdMfdUe"ddLddSdMfdVe#ddLddSdMfdVe"ddLdOdSdMfdWe#ddLdOdSdMfdWe"d dLddXdMfdYe#d dLddXdMfdYe"d dLdOdXdMfdZe#d dLdOdXdMfdZe"ddLddXdMfd[e#ddLddXdMfd[e"ddLdOdXdMfd\e#ddLdOdXdMfd\e"d dLdd]dMfd^e#d dLdd]dMfd^e"d dLdOd]dMfd_e#d dLdOd]dMfd_e"ddLdd]dMfd`e#ddLdd]dMfd`e"ddLdOd]dMfdae#ddLdOd]dMfdae"ddLddbdMfdce"ddLddddMfdee#ddLddddMfdfe"ddLdOdddMfdge"ddSddddMfdhe#ddSddddMfdie"d djddkdMfdle#d djddkdMfdme"ddLddkdMfdne"ddSddkdMfdoe#ddSddkdMfdpe"ddjddkdMfdle#ddjddkdMfdme"ddLddqdSfdre#ddLddqdSfdre"dOdLddsdMfdte#dOdLddsdMfdte"dOdLdOdsdMfdue#dOdLdOdsdMfdue"dOdLddvdMfdwe#dOdLddvdMfdwe"dOdLddvdxfdye#dOdLddvdxfdye"dOdLddzd{fd|e#dOdLddzd{fd|e"dOdLdd}d~fde#dOdLdd}d~fde"dOdLddvdLfd€e#dOdLddvdLfd€e"dOdLddzd�fd‚e#dOdLddzd�fd‚e"dOdLdd}dƒfd„e#dOdLdd}dƒfd„e"dOdLddvdSfdwe#dOdLddvdSfdwe"dOdLddzd…fd†e#dOdLddzd…fd†e"dOdLdd}d‡fdˆe#dOdLdd}d‡fdˆe"dOdLddvd‰fdwe#dOdLddvd‰fdwe"dOdLddŠdMfd‹e#dOdLddŠdMfdŒe"dOdLdd�dMfdŽe#dOdLdd�dMfd�e"dOdLdd�dxfd�e#dOdLdd�dxfd‘e"dOdLdd�dLfd’e#dOdLdd�dLfd“e"dOdLdd�dSfdŽe#dOdLdd�dSfd�e"d”dLddLdMfd•e#d”dLddLdMfd•e"d”dLdOdLdMfd–e#d”dLdOdLdMfd–e"d”dLddSdMfd—e#d”dLddSdMfd—e"d”dLdOdSdMfd˜e#d”dLdOdSdMfd˜e"d”dLddXdMfd™e#d”dLddXdMfd™e"d”dLdOdXdMfdše#d”dLdOdXdMfdše"d”dLdd]dMfd›e#d”dLdd]dMfd›e"d”dLddqdSfdœe#d”dLddqdSfdœe"d”dLdOd]dMfd�e#d”dLdOd]dMfd�e"dždLddvdMfdŸe#dždLddvdMfdŸe"dždLddzdxfd e#dždLddzdxfd e"dždLdd}d{fd¡e#dždLdd}d{fd¡e"dždLdd�dMfd¢e"d£dLddsdMfd¤e#d£dLddsdMfd¤e"d¥dLddsdMfd¦e#d¥dLddsdMfd¦ipZOd§d¨d©dªd«d¬gZPd­d®„ ZQd¯d°„ ZRd±d²„ ZSi ZTi ZUG d³d´„ d´eƒZVG dµd¶„ d¶eƒZWeTeW_TeUeW_Ue M¡ D ]B\ZXZYeY Zd·d¸¡ZYe[eWd¹eY eTeX d ƒ e[eWdºeY eUeX ƒ �	q[T[U[X[YG d»d¼„ d¼eWƒZ\e\Z]G d½d¾„ d¾ejƒZ^d¿e"dddLdfdÀe"ddd]dfdÁe"dddqdOfdÂe"d”dd]dfdÃe"d”ddqdOfdÄe"ddOdkdfdÅe"dddddfdÆe"ddOdddfdÇe"dd”dkdfdÈe"dOddsdfdÉe"dOddvd fdÊe"dOddvdOfdËe"džddvdfdÌe"d£ddsdfdÍe"d¥ddsdfdÎe#ddOdkdfdÏe#dddddfdÐe#ddOdddfdÑe#dd”dkdfdÒœZ_dÓdÔ„ Z`G dÕdÖ„ dÖƒZad×dØ„ Zbe ce^jde^eQ¡ e ee^jde`¡ e fe^jdeb¡ e ge^jddÙdÚg¡ e he^jddÛ¡ dS )Üé    N)ÚMutableMapping)ÚFraction)ÚNumberÚRationalé   )Ú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@  éB  éC  éD  iE  iJ  iR  iS  i[  é  i  i˜‚  i»ƒ  éI†  is‡  ii‡  é¼  i  i–Æ  i—Æ  ÚrawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzwÚ	tiff_jpegÚjpegÚtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscanÚtiff_deflateZtiff_sgilogZtiff_sgilog24ÚlzmaZzstdZwebp)r   é   é   é   é   é   é   é   i€  i€  i)€  i²€  it‡  iu‡  imˆ  iPÃ  iQÃ  c                 C   s   i | ]\}}||“qS © r(   )Ú.0ÚkÚvr(   r(   ú7/tmp/pip-unpacked-wheel-_wxctax1/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)r0   zL;2IR)r0   zL;2)r0   zL;2R)r#   )r0   zL;4I)r0   zL;4IR)r0   zL;4)r0   zL;4R)r'   )r0   zL;I)r0   zL;IR)r0   r0   )r0   zL;R)é   )úI;16zI;12)é   )r2   r2   )úI;16Br4   )r2   zI;16R)ÚIúI;16S)r5   úI;16BS)r"   )é    )ÚFúF;32F)r9   úF;32BF)r5   zI;32N)r5   úI;32S)r5   úI;32BS)r'   r'   )ÚLAr>   )r'   r'   r'   )ÚRGBr?   )r?   zRGB;R)r'   r'   r'   r'   )ÚRGBAr@   )r   )ÚRGBXrA   )r'   r'   r'   r'   r'   ©r   r   )rA   ZRGBXX)r'   r'   r'   r'   r'   r'   )r   r   r   )rA   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ç  )r3   r3   r3   )r?   zRGB;16L)r?   zRGB;16B)r3   r3   r3   r3   )r@   zRGBA;16L)r@   zRGBA;16B)rA   zRGBX;16L)rA   zRGBX;16B)r@   zRGBa;16L)r@   zRGBa;16Br"   )ÚPzP;1)rC   zP;1R)rC   zP;2)rC   zP;2R)rC   zP;4)rC   zP;4R)rC   rC   )ÚPArD   )rC   zP;Rr$   )ÚCMYKrE   )rE   ZCMYKX)rE   ZCMYKXX)rE   zCMYK;16Lr%   )r?   rA   r'   )ÚLABrF   ó   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    rM   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    rV   c                 C   sP   t | ƒ}|j|jf}t|ƒ|k r.t| t|ƒƒ}t|ƒ|krLt |Ž } t| |ƒ}|S ©N)r   Ú	numeratorÚdenominatorÚminrV   rO   Úmax)rR   rS   Zmin_valÚfracrU   r(   r(   r,   Ú_limit_signed_rational  s    
r]   c                   @   s>  e Zd ZdZdZd3d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)d2S )4rP   zÀImplements 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   )	Ú
isinstancerP   rX   r^   rY   r_   r`   r   Úfloat)ÚselfÚvaluerY   r(   r(   r,   Ú__init__:  s    


zIFDRational.__init__c                 C   s   | j S rW   )r^   ©Úar(   r(   r,   rX   T  s    zIFDRational.numeratorc                 C   s   | j S rW   )r_   rg   r(   r(   r,   rY   X  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   )rY   rX   r`   Zlimit_denominator)rd   Zmax_denominatorÚfr(   r(   r,   rQ   \  s    
zIFDRational.limit_rationalc                 C   s   t t| jƒƒS rW   )Ústrrc   r`   ©rd   r(   r(   r,   Ú__repr__i  s    zIFDRational.__repr__c                 C   s
   | j  ¡ S rW   )r`   Ú__hash__rk   r(   r(   r,   rm   l  s    zIFDRational.__hash__c                 C   s0   | j }t|tƒr|j }t|tƒr(t|ƒ}||kS rW   )r`   rb   rP   rc   )rd   ÚotherrR   r(   r(   r,   Ú__eq__o  s    

zIFDRational.__eq__c                 C   s   | j | j| jgS rW   )r`   r^   r_   rk   r(   r(   r,   Ú__getstate__w  s    zIFDRational.__getstate__c                 C   s,   t  | d¡ |\}}}|| _|| _|| _d S )Nr   )rP   rf   r`   r^   r_   )rd   Ústater`   r^   r_   r(   r(   r,   Ú__setstate__z  s
    
zIFDRational.__setstate__c                    s   ‡ fdd„}|S )Nc                    s   t | jˆ ƒ|Ž S rW   )Úgetattrr`   )rd   Úargs©Úopr(   r,   Údelegate‚  s    z'IFDRational._delegate.<locals>.delegater(   )rv   rw   r(   ru   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__N)r   )*Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rf   ÚpropertyrX   rY   rQ   rl   rm   ro   rp   rr   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‘   r’   r(   r(   r(   r,   rP   ,  sP   


rP   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tdt|ƒ› d�ƒ‚|dk	r(|n
|dd… | _| jtkrHd| _n| jtkrZd| _ntdƒ‚|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'   r0   r#   F)rM   ÚSyntaxErrorÚreprÚ_prefixÚMMÚ_endianÚIIÚ_bigtiffÚgroupÚtagtypeÚresetÚ_unpackÚnextÚ_legacy_api)rd   ÚifhrL   r¦   r(   r(   r,   rf   è  s    

,ÿzImageFileDirectory_v2.__init__c                 C   s   | j S rW   )r¡   rk   r(   r(   r,   Ú<lambda>  ó    zImageFileDirectory_v2.<lambda>c                 C   s   | j S rW   )Ú_offsetrk   r(   r(   r,   r­     r®   c                 C   s   | j S rW   )r«   rk   r(   r(   r,   r­     r®   c                 C   s   t dƒ‚d S )Nz"Not allowing setting of legacy api)Ú	Exception©rd   re   r(   r(   r,   Ú
legacy_api
  s    z ImageFileDirectory_v2.legacy_apic                 C   s(   i | _ i | _i | _i | _d | _d | _d S rW   )Ú_tags_v1Ú_tags_v2Ú_tagdatar§   Ú_nextr¯   rk   r(   r(   r,   r¨     s    zImageFileDirectory_v2.resetc                 C   s   t t| ƒƒS rW   )rj   Údictrk   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)   Úcodere   rk   r(   r,   r-     s   ÿ z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)Úitemsrk   r(   rk   r,   Únamed  s    
þzImageFileDirectory_v2.namedc                 C   s   t t| jƒt| jƒB ƒS rW   )ÚlenÚsetrµ   r´   rk   r(   r(   r,   Ú__len__$  s    zImageFileDirectory_v2.__len__c                 C   sf   || j kr>| j| }| j| }| j| \}}|| || jƒ| |< | j | }| jrbt|ttfƒsb|f}|S rW   )r´   rµ   r§   Ú_load_dispatchr²   rb   ÚtupleÚbytes)rd   ÚtagÚdataÚtypÚsizeÚhandlerrR   r(   r(   r,   Ú__getitem__'  s    



z!ImageFileDirectory_v2.__getitem__c                 C   s   || j kp|| jkS rW   )r´   rµ   ©rd   rÄ   r(   r(   r,   Ú__contains__2  s    z"ImageFileDirectory_v2.__contains__c                 C   s   |   ||| j¡ d S rW   )Ú_setitemr²   )rd   rÄ   re   r(   r(   r,   Ú__setitem__5  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 ƒƒr’t
dd„ |D ƒƒr„tjntj| j|< nÞt
dd„ |D ƒƒ�rt
dd„ |D ƒƒrÆtj| j|< nDt
dd„ |D ƒƒrætj| j|< n$t
dd„ |D ƒƒrþt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�r’dd„ |D ƒ}n | j| tjk�r²dd„ |D ƒ}| j| tjk�oÌt|tƒ}|�sêt‡ fdd„|D ƒƒ}|�rö| jn| j}|�s´ˆ jdk�s@| j| tjk�s@ˆ jd k�r´t|ƒ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 rW   )rb   rP   ©r)   r+   r(   r(   r,   Ú	<genexpr>C  s     z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS ©r   Nr(   rÎ   r(   r(   r,   rÏ   F  s     c                 s   s   | ]}t |tƒV  qd S rW   )rb   ÚintrÎ   r(   r(   r,   rÏ   I  s     c                 s   s&   | ]}d |  kodk n  V  qdS )r   r   Nr(   rÎ   r(   r(   r,   rÏ   J  s     c                 s   s&   | ]}d |  k odk n  V  qdS )i €ÿÿi €  Nr(   rÎ   r(   r(   r,   rÏ   L  s     c                 s   s   | ]}|d kV  qdS rÐ   r(   rÎ   r(   r(   r,   rÏ   Q  s     c                 s   s   | ]}t |tƒV  qd S rW   )rb   rc   rÎ   r(   r(   r,   rÏ   T  s     c                 s   s   | ]}t |tƒV  qd S rW   )rb   rj   rÎ   r(   r(   r,   rÏ   V  s     c                 s   s   | ]}t |tƒV  qd S rW   )rb   rÃ   rÎ   r(   r(   r,   rÏ   X  s     c                 S   s&   g | ]}t |tƒr| d d¡n|‘qS )ÚasciiÚreplace)rb   rj   ÚencoderÎ   r(   r(   r,   Ú
<listcomp>\  s   ÿz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S   s"   g | ]}t |tƒrt|ƒn|‘qS r(   )rb   rÑ   rc   rÎ   r(   r(   r,   rÕ   a  s     c                 3   s   | ]}ˆ   |¡V  qd S rW   )Zcvt_enum©r)   re   ©Úinfor(   r,   rÏ   e  s     r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   rÃ   rj   r   r¹   r¦   rb   r§   ÚtypeÚ	UNDEFINEDÚallZRATIONALZSIGNED_RATIONALÚSHORTÚSIGNED_SHORTÚLONGÚSIGNED_LONGÚDOUBLEÚASCIIÚBYTEr·   rÂ   r³   r´   Úlengthr¾   Ú
ValueErrorÚwarningsÚwarn)rd   rÄ   re   r²   Z	basetypesÚvaluesÚis_ifdÚdestr(   r×   r,   rÌ   8  sz    
ÿý
ÿý
þÿþý
ýýþÿzImageFileDirectory_v2._setitemc                 C   s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S rW   )r´   Úpopr³   rµ   rÊ   r(   r(   r,   Ú__delitem__ˆ  s    z!ImageFileDirectory_v2.__delitem__c                 C   s   t t| jƒt| jƒB ƒS rW   )Úiterr¿   rµ   r´   rk   r(   r(   r,   Ú__iter__�  s    zImageFileDirectory_v2.__iter__c                 C   s   t  | j| |¡S rW   )ÚstructÚunpackr£   )rd   ÚfmtrÅ   r(   r(   r,   r©   �  s    zImageFileDirectory_v2._unpackc                 G   s   t j| j| f|žŽ S rW   )rî   Úpackr£   )rd   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 rW   )Ú_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 rW   )r©   r¾   ©rd   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 rW   )rò   rÖ   )rð   rd   r(   r,   rÏ   µ  s     zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>©Újoin©rd   rç   )rð   rk   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Úshortr0   ÚlongÚbzsigned byteÚhzsigned shortÚlzsigned longri   rc   ÚdÚdoublerž   Zlong8r   Tc                 C   s   |S rW   r(   r   r(   r(   r,   Ú	load_byteÉ  s    zImageFileDirectory_v2.load_bytec                 C   s   |S rW   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ó    rN   zlatin-1rÓ   )ÚendswithÚdecoder   r(   r(   r,   Úload_stringÑ  s    
z!ImageFileDirectory_v2.load_stringc                 C   s   d|  dd¡ d S )Nr®   rÒ   rÓ   r  )rÔ   r±   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#   r0   c                    s   ˆ r| |fS t | |ƒS rW   ©rP   ©rh   r
  ©r²   r(   r,   Úcombineà  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3   s   | ]\}}ˆ ||ƒV  qd S rW   r(   ©r)   ÚnumZdenom©r  r(   r,   rÏ   ã  s     z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r!   r   ©r©   r¾   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t|dƒžŽ V  qdS )Ú2Ll   ÿÿ N)r$  )rò   rV   ©r)   r\   rk   r(   r,   rÏ   ç  s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r  r  r(   rk   r,   Úwrite_rationalå  s    ÿz$ImageFileDirectory_v2.write_rationalr&   c                 C   s   |S rW   r(   r   r(   r(   r,   Úload_undefinedë  s    z$ImageFileDirectory_v2.load_undefinedc                 C   s   |S rW   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 rW   r  r  r  r(   r,   r  ÷  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   s   | ]\}}ˆ ||ƒV  qd S rW   r(   r  r  r(   r,   rÏ   ú  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%  rk   r(   r,   rÏ   þ  s   ÿz>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r  r  r(   rk   r,   Úwrite_signed_rationalü  s    þz+ImageFileDirectory_v2.write_signed_rationalc                 C   s4   |  |¡}t|ƒ|kr0td|› dt|ƒ› d�ƒ‚|S )Nz&Corrupt EXIF data.  Expecting to read ú bytes but only got z. )Úreadr¾   ÚOSError)rd   ÚfprÇ   Úretr(   r(   r,   Ú_ensure_read  s    
ÿz"ImageFileDirectory_v2._ensure_readc              
   C   sŒ  |   ¡  | ¡ | _�z:| 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�r~| ¡ }|  | j�r>dnd|¡\}|
d|› d|› �7 }
| |¡ t ||¡}| |¡ n|d |… }t|ƒ|k�rÄt d|› dt|ƒ› d|› �¡ t |
¡ qP|�sÖt |
¡ qP|| j|< || j|< |
d|dk�r d| nt|ƒ 7 }
t |
¡ qP| j�r4|  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é   ÚHHL4sr1   Úunknownztag: ú (ú
) - type: ú)z - unsupported type r#   r0   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r-  z. Skipping tag ú
 - value: r8   ú<table: %d bytes>)r¨   Útellr¯   r¥   r©   r2  Úranger   r¹   r¦   rº   r   ÚgetrÁ   ÚKeyErrorÚloggerÚdebugÚseekr   Ú
_safe_readr¾   rå   ræ   rµ   r§   r    rª   r/  rj   )rd   r0  Z	tag_countÚirÄ   rÆ   ÚcountrÅ   ÚtagnameÚtypnameÚmsgZ	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|› d|› dt
|ƒ› �¡ |tjkožt|tƒ}|rô| jdkr´d}	nd	}	t|	|d
�}
| j| }| ¡ D ]\}}||
|< qÖ|
 |¡}n*t|tƒ�r|n|f}| j| | f|žŽ }t || j¡j}|�r8dn
t |d¡}d|› d|› d|› d|› d�	}|dt|ƒdk�r€dt|ƒ nt|ƒ 7 }t 	|¡ |�r¢d}n(|tjtjtjfk�rÂt|ƒ}nt|ƒ}t|ƒdk�rö| |||| dd¡df¡ qF| ||||   d|¡|f¡ |t|ƒd d d 7 }qF|d k	�r„|| \}}}}}|�rVtdƒ‚|   d|  d|¡d | ¡}|||||f||< |D ]T\}}}}}t 	|› d|› d|› dt
|ƒ› dt
|ƒ› �	¡ ||   d||||¡7 }�qˆ|d7 }|D ].\}}}}}||7 }t|ƒd@ �rê|d7 }�qê|S )Nr  r1   r#   zTag z, Type: z	, Value: rœ   s   II*    s   MM *   )r¦   Úifdr5  zsave: r6  r7  r8  r9  r3   r:  r   r  r®   r0   r!   z&multistrip support not yet implementedr   rõ   r4  s       ) rò   r¾   r´   Úsortedr¼   ÚSTRIPOFFSETSr§   r=  r?  r@  r    r   rÞ   rb   r·   r£   r™   ÚtobytesrÂ   rü   r¹   r¦   rº   r   rj   râ   rá   rÚ   ÚappendÚljustÚNotImplementedErrorr©   )rd   rI  ÚresultÚentriesZstripoffsetsrÄ   re   rÆ   rè   r¬   rK  rç   Zifd_tagZ	ifd_valuerÅ   rE  rF  rG  rD  r(   r(   r,   rN  P  sh     


 ÿ


.zImageFileDirectory_v2.tobytesc                 C   sN   |  ¡ dkr&| | j|  ddd¡ ¡ |  ¡ }|  |¡}| |¡ |t|ƒ S )Nr   ZHLé*   r'   )r;  Úwriter¡   rò   rN  r¾   )rd   r0  rI  rR  r(   r(   r,   Úsaveœ  s    

zImageFileDirectory_v2.save)rš   NN)T)T)T)T)T)r   )3r“   r”   r•   r–   rf   r˜   rL   rI  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,  r2  rJ  rN  rV  r(   r(   r(   r,   r™   «  sz   <

P








÷þÿ




	D
Lr™   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e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)Úsuperrf   r«   )rd   rt   Úkwargs©Ú	__class__r(   r,   rf   Å  s    zImageFileDirectory_v1.__init__c                 C   s   | j S rW   )r³   rk   r(   r(   r,   r­   É  r®   zImageFileDirectory_v1.<lambda>c                 C   s   | j S rW   )rµ   rk   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`

        rK   )rL   rµ   r§   rª   )ÚclsÚoriginalrK  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`

        rK   )r™   rL   r·   rµ   r§   r´   )rd   rK  r(   r(   r,   Úto_v2â  s
    zImageFileDirectory_v1.to_v2c                 C   s   || j kp|| jkS rW   )r³   rµ   rÊ   r(   r(   r,   rË   ó  s    z"ImageFileDirectory_v1.__contains__c                 C   s   t t| jƒt| jƒB ƒS rW   )r¾   r¿   rµ   r³   rk   r(   r(   r,   rÀ   ö  s    zImageFileDirectory_v1.__len__c                 C   s   t t| jƒt| jƒB ƒS rW   )rì   r¿   rµ   r³   rk   r(   r(   r,   rí   ù  s    zImageFileDirectory_v1.__iter__c                 C   s   dD ]}|   |||¡ qd S ©N)FT)rÌ   )rd   rÄ   re   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 rd  )r³   rµ   r§   rÁ   rÌ   rb   rÂ   rÃ   )rd   rÄ   rÅ   rÆ   rÇ   rÈ   ÚlegacyrR   r(   r(   r,   rÉ      s    



z!ImageFileDirectory_v1.__getitem__)r“   r”   r•   r–   rf   r˜   ÚtagsZtagdatar·   Ú__annotations__Úclassmethodrb  rc  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dd„ Z‡  ZS ) ÚTiffImageFileZTIFFz
Adobe TIFFFNc                    s   d | _ d | _tƒ  ||¡ d S rW   )Útag_v2rÄ   r\  rf   )rd   r0  Úfilenamer^  r(   r,   rf     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�   NrN   z*** TiffImageFile._open ***z- __first: z- ifh: r   )r0  r.  r™   rk  rK  rª   Z_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_TiffImageFile__fpÚ
_frame_posÚ	_n_framesr?  r@  r    Ú_seek)rd   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   )rq  r;  rr  r¾   rp  rA  )rd   Úcurrentr(   r(   r,   Ún_frames?  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_checkrr  r   Z_decompression_bomb_checkrÇ   ÚcoreÚnewÚmodeÚim©rd   Úframer(   r(   r,   rA  I  s
    

zTiffImageFile.seekc                 C   s<  | j | _| j ¡  t| jƒ|krö| js.tdƒ‚t d|› d| j	› d| j› d| j ¡ › �¡ | j 
| j¡ | j | j¡ t d| j ¡  ¡ | j | j¡ | jj| jkr®d| _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 filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %sr   r   )ro  r0  r;  r¾   rp  rm  ÚEOFErrorr?  r@  rn  rA  rO  rk  rJ  rª   rq  Úis_animatedr[  rb  rÄ   rK  Ú_setuprz  r(   r(   r,   rr  T  s2    
$ÿ


zTiffImageFile._seekc                 C   s   | j S )zReturn the current frame number)rn  rk   r(   r(   r,   r;  x  s    zTiffImageFile.tellc                 C   s   d| j kr|  | j d ¡S i S )z™
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        r   )rk  Z_getxmprk   r(   r(   r,   Úgetxmp|  s    zTiffImageFile.getxmpc                 C   s²   i }| j  d¡}|r®|dd… dkr®t|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.
        r   Nr#   s   8BIMr%   r   r!   r)  rÅ   )rk  r=  Úi16ÚmathÚceilÚi32)rd   ÚblocksrR   ÚidÚnrÇ   rÅ   r(   r(   r,   Úget_photoshop_blocks…  s    $z"TiffImageFile.get_photoshop_blocksc                    s   | j r| jr|  ¡ S tƒ  ¡ S rW   )ÚtileÚuse_load_libtiffÚ_load_libtiffr\  rJ  rk   r^  r(   r,   rJ  š  s    zTiffImageFile.loadc                 C   s¤   | j r^tjjtjjtjjtjjtjjtjjtjj	dœ 
| j ¡}|d k	r^| j |¡| _| jj| _| js d| _| j ¡  |  ¡ }tj ¡ D ]}||kr”q†| |¡ q†d S )N)r!   r"   r#   r$   r%   r&   r'   T)Ú_tile_orientationr   Z	TransposeZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90r=  ry  Z	transposerÇ   Ú_sizer}  Ú!_close_exclusive_fp_after_loadingr0  r;  Zgetexifr   ÚTAGS_V2_GROUPSÚkeysÚget_ifd)rd   ÚmethodÚexifÚkeyr(   r(   r,   Úload_endŸ  s,    ùø	

zTiffImageFile.load_endc           	   
   C   s  t j  | ¡ |  ¡  t| jƒdks*tdƒ‚| jd d }t| jd d ƒ}z6t| jdƒoft	 
| 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 n, tk
rü } ztd
ƒ|‚W 5 d}~X Y nX | j�o| j }t| jdƒ�r<t d¡ | | j ¡ ¡\}}n\|�rnt d¡ |�s^| j d¡ | d¡\}}n*t d¡ | j d¡ | | j ¡ ¡\}}|�rÄzt	 |¡ W n tk
�rÂ   Y nX g | _d| _|  ¡  |�rî| j ¡  d| _|dk �r t|ƒ‚t j  | ¡S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r"   ÚfilenoÚflushFr!   ÚlibtiffzCouldn't set the imageNÚgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   rJ  Zload_preparer¾   rˆ  r/  rX  Úhasattrr0  ÚosÚdupr•  r–  Z_getdecoderrx  rÂ   ZdecoderconfigÚsetimagery  rä   Z_exclusive_fpr}  r?  r@  r  r˜  rA  r.  ÚcloseÚreadonlyr”  )	rd   Zextentsrt   r0  ÚdecoderÚeZclose_self_fpr†  Úerrr(   r(   r,   rŠ  ¾  sd    
   ÿ





zTiffImageFile._load_libtiffc              
   C   s  d| j krtdƒ‚t| j  td¡ | _| j  td¡| _| j  td¡}| jdkrRd}| j  t	d¡}t
 d¡ t
 d| j› �¡ t
 d	|› �¡ t
 d
| j› �¡ t
 d|› �¡ t
 d| j d¡› �¡ t| j  t¡ƒ}t| j  t¡ƒ}||f| _t
 d| j› �¡ | j  td¡}t|ƒdk�rFt|ƒt|ƒ  k�r>dk�rFn nd}| j  td¡}| j  td¡}|dk�rrd}n|dk�r‚d}nd}|t|ƒ7 }t|ƒ}	||	k �r²|d|… }n||	k�rÎ|	dk�rÎ|| }| j  t| jdk�rð|dk�rðdnd¡}
t|ƒ|
k�rtdƒ‚| j j|||||f}t
 d|› �¡ zt| \| _}W n8 tk
�rz } zt
 d¡ tdƒ|‚W 5 d}~X Y nX t
 d|› �¡ t
 d| j› �¡ | j| jd< | j  td¡}| j  t d¡}|�rP|�rP| j  t!¡}|dk�rø||f| jd< nX|dk�r|d  |d  f| jd< n6|dk�rB||f| jd< ||f| jd!< n||f| jd!< d } }}g | _"t#�pp| jd"k| _$| j$�rR|dk�rÀ|dd… d |dd…  }t
 d|› �¡ t| \| _}|d#k�rÎd$}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¡ �nTt(| j k�sjt)| j k�r”t(| j k�rš| j t( }| j  t*|¡}| jd }n"| j t) }| j  d,¡}| j  d-¡}|D ]Ð}|| |k�rä|t+|ƒ d. }nd}|}| jdk�r|| }|| }|t|ƒdf}| j" '| j||t|| |ƒt|| |ƒf||f¡ || }|| jd k�rÀd||  }}|| jd k�rÀd }}|d7 }�qÀnt
 d/¡ tdƒ‚t,| j k�rÂ| j t, | jd0< | jd1k�röd2d3„ | j t- D ƒ}t. /d4d5 0|¡¡| _1| j  d6¡| _2dS )7z-Setup this image object based on current tagsi¼  z+Windows Media Photo files not yet supportedr   r   r   r%   z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: r   z- size: r.   r(   )r!   r%   r'   r"   r$   r#   N)r!   r%   zunknown data organizationzformat key: z- unsupported formatzunknown pixel modez- raw mode: z- pil mode: Úcompressionr!   ÚdpigR¸…ëQ@Ú
resolutionr   r2   úI;16Nz;16Bz;16Nz;16Lr   r?   Fr—  r   r   r'   z- unsupported data organizationÚicc_profile©rC   rD   c                 S   s   g | ]}t |d  ƒ‘qS )r   r   )r)   r
  r(   r(   r,   rÕ   é  s     z(TiffImageFile._setup.<locals>.<listcomp>úRGB;Lr®   i  )3rk  r/  ÚCOMPRESSION_INFOr=  ÚCOMPRESSIONÚ_compressionÚPLANAR_CONFIGURATIONZ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERr?  r@  rÄ   rÑ   Ú
IMAGEWIDTHÚIMAGELENGTHrŒ  rÇ   ÚSAMPLEFORMATr¾   r[   rZ   ÚBITSPERSAMPLEÚEXTRASAMPLESÚSAMPLESPERPIXELrŸ   rL   Ú	OPEN_INFOrx  r>  rØ   ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITrˆ  ÚREAD_LIBTIFFr‰  rÓ   rI  rO  rM  ÚTILEOFFSETSÚROWSPERSTRIPÚsumÚ
ICCPROFILEÚCOLORMAPr
   r   r  Úpaletter‹  )rd   ÚphotoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamplesPerPixelr“  Úrawmoder   ZxresZyresZresunitÚxÚyZlayerrh   Úoffsetsr  ÚwrI  ÚstrideZtile_rawmoder¿  r(   r(   r,   r~    s   



2


þú







ÿþý 

üÿ
zTiffImageFile._setupc                 C   sB   z4z| j | jkr| j  ¡  W n tk
r0   Y nX W 5 d | _ X d S rW   )ro  r0  r�  ÚAttributeErrorrk   r(   r(   r,   Ú
_close__fpî  s    
zTiffImageFile._close__fp)NN)r“   r”   r•   ÚformatÚformat_descriptionr�  rf   rs  r˜   ru  rA  rr  r;  r  r‡  rJ  r”  rŠ  r~  rÈ  ri  r(   r(   r^  r,   rj    s$   	
	$	[ Vrj  r/   r0   r>   rC   rD   r<   r2   r6   r:   r?   rA   r@   rE   ÚYCbCrrF   r=   r4   r7   r;   )r/   r0   r>   rC   rD   r5   r2   r6   r9   r?   rA   r@   rE   rË  rF   r=   r4   r7   r;   c           .      C   s„  zt | j \}}}}}}W n6 tk
rP }	 ztd| j› d�ƒ|	‚W 5 d }	~	X Y nX t|d�}
| j}| j}| d| j d¡¡}|d krŠd}n|dkr˜d}n|dkr¤d	}t	p®|dk}d
|
t
< | jd |
t< | jd
 |
t< d|kræ|d }n:d|k�r|d }t|tƒ�r t ¡ }| |¡ |}ni }t dt|ƒ ¡ t|tƒ�rF| ¡ }|D ]n}t|tjƒ�r||tj ¡ k�r|| |¡|
|< n| |¡|
|< z|j| |
j|< W n tk
�r´   Y nX �qJt| dƒ�r
tt t!t"t#t$fD ]2}|| j%k�rÖ| j%| |
|< | j%j| |
j|< �qÖ| d| j d¡¡}|�r,||
t&< t'dft dft!dft dft!dftdft(dft)dft*dft+dff
D ] \}}||k�rl|| |
|< �ql| d¡}|�r¾d|
t< |d |
t < |d
 |
t!< |dk�rê||
t,< t-|ƒd
k�rêt-|ƒ|
t.< |d k	�rü||
t/< |d
k�r||
t0< t1|
k�r"||
t1< nŒ| jdk�r®|
t1 dk�r®| jdk�r¤|  2¡ }| ¡ }t3|j4ƒD ]:}t3|j5ƒD ](}|||f dk�rŠdnd|||f< �qp�qb|} n
t6 7| ¡} | jd k�rÞ| j8 9d!d"¡}t:d#d$„ |D ƒƒ|
t;< t-|ƒ| jd |d  d% d&  }|�rP|dk�rd
nt<t=| | jd
 ƒ}|dk�rZt<|d% d& d& | jd
 ƒ}n
| jd
 }|dk�rhd
}|dk�rvd
n|| }| jd
 | d
 | }||
t>< |d'k�r²tj?|
jt@< |f|d
  || jd
  ||d
   f |
t@< t:t3d|| |ƒƒ|
tA< tB |d
¡|
tC< | jd(k�r<tDd)tEd*i F¡ D ]\}}|
 G||¡ �q$tHtItJtKg} |�r0d+|k�r¢|d+ }!t|!tLƒ�r€|!dk �s€|!d,k�rˆtMd-ƒ‚|dk�rštMd.ƒ‚|!|
tN< t d/¡ t d0tO|
 F¡ ƒ ¡ d}"t|d1ƒ�rz| Pd¡ tQ R| S¡ ¡}"W n tTjUk
�r   Y nX i }#| tEt@tAtVtWg7 } i }$|d |$t,< i }%t| d2ƒ�rH| jX ¡ }%tY| di ƒ|%–}&t0|&k�rh|&t0= tZ [|
 F¡ |& F¡ ¡D ]Ì\}}|tj\k�rîtj]j^�sž�q|||
jk�rº|
j| |#|< n4t|tLt_t`tfƒ�sÔ�q|nt a|¡jb}'|'�rî|'|#|< ||$k�r||| k�r|t|t`ƒ�r$| cd3d4¡d5 |$|< n"t|tdƒ�r>t_|ƒ|$|< n||$|< �q|t0|$k�rvt-|$t0 ƒd
k�rv|$t0 d |$t0< t d6tO|$ F¡ ƒ ¡ | jd7k�rœd8}t|$ F¡ ƒ}(|( e¡  |||"||(|#f})t f| jd9|)|¡}	|	 g| j8d:| j ¡ |	 cd;¡\}*}+},|"�s| h|,¡ |+�ræ�q�qæ|+dk �rptd<|+› d=�ƒ‚n@| D ]}|
|= �q4|
 i|¡}-tj k| |dd:| j |-||d
ffg¡ d>|k�r€|
| _ld S )?Nzcannot write mode z as TIFFrK   r¢  r   r   r   r   r   r   r   Ztiffinfor’  zTiffinfo Keys: %srk  r¦  Údescriptionr¤  Zx_resolutionZy_resolutionZresolution_unitZsoftwareÚ	date_timeZartistÚ	copyrightr£  r!   r.   )r/   r0   r/   éÿ   r§  r?   r¨  c                 s   s   | ]}|d  V  qdS )r   Nr(   rÎ   r(   r(   r,   rÏ   �  s     z_save.<locals>.<genexpr>r&   r'   r   rË  )r   r   )r   rÏ  é€   rÏ  rÐ  rÏ  Úqualityéd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr•  rÄ   rÒ   rÓ   r  zConverted items: %s)r4   r2   r¥  r—  rB   i @  zencoder error z when writing image fileÚ_debug_multipage)mÚ	SAVE_INFOrx  r>  r/  r™   ÚencoderinfoÚencoderconfigr=  rØ   ÚWRITE_LIBTIFFr¬  rÇ   r¯  r°  rb   rÃ   r   ZExifrJ  r?  r@  rX  r[  rc  r   rŽ  r�  r�  r§   r°   r™  r¸  r¶  r·  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKÚXMPrk  r½  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTr²  r¾   r´  r³  r±  r­  Úcopyr<  ÚheightÚwidthr	   Úinvertry  Z
getpaletterÂ   r¾  rZ   Ú
STRIP_SIZEr»  rÞ   ÚSTRIPBYTECOUNTSrM  ÚCOMPRESSION_INFO_REVrª  ÚYCBCRSUBSAMPLINGÚREFERENCEBLACKWHITEr¼   Ú
setdefaultÚ	TILEWIDTHÚ
TILELENGTHrº  ÚTILEBYTECOUNTSrÑ   rä   ÚJPEGQUALITYrL  rA  rš  r›  r•  ÚioÚUnsupportedOperationÚTRANSFERFUNCTIONÚSUBIFDrÄ   rs   Ú	itertoolsÚchainZLIBTIFF_CORErv  Zlibtiff_support_custom_tagsrc   rj   r¹   rÙ   rÔ   rP   ÚsortZ_getencoderrœ  rU  rV  r   Ú_saverÓ  ).ry  r0  rl  rÁ  rL   rÀ  rÉ  ÚbitsÚextrar   rK  rÕ  rÖ  r¢  r—  rØ   r’  r“  Ziccrº   r£  Zinverted_imZpxrÃ  rÂ  ZlutrÆ  Zrows_per_stripZstrip_byte_countsZstrips_per_imagerÄ   re   Z	blocklistrÑ  Ú_fpÚtypesZattsZ
legacy_ifdZsupplied_tagsrÙ   rf  rh   r  Úsr  rI  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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 )Nr.  FTzw+bzr+b)	r™  ri   Úclose_fprº   Úopenr/  r;  Ú	beginningÚsetup)rd   Úfnrw  r(   r(   r,   rf   F  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td	ƒ‚|  ¡  |  ¡  d S )
Nr   r#   TFrH   rœ   rG   r›   zInvalid TIFF file header)ri   rA  rþ  rš  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPager.  ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)rd   r  r(   r(   r,   rÿ  T  s    zAppendingTiffWriter.setupc                 C   s€   | j r
d S | j | j¡ | j d¡}|s,d S || jkr>tdƒ‚|  ¡ }|| j7 }| j | j¡ |  	|¡ | j |¡ |  
¡  d S )Nr#   z1IIMM of new page doesn't match IIMM of first page)r  ri   rA  r  r.  r  r  ÚreadLongr  Ú	writeLongÚfixIFD)rd   r  Ú	IFDoffsetr(   r(   r,   Úfinalizel  s    


zAppendingTiffWriter.finalizec                 C   s   |   ¡  |  ¡  d S rW   )r  rÿ  rk   r(   r(   r,   ÚnewFrameƒ  s    zAppendingTiffWriter.newFramec                 C   s   | S rW   r(   rk   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 rW   )ri   r;  r  rk   r(   r(   r,   r;  �  s    zAppendingTiffWriter.tellc                 C   s*   |t jkr|| j7 }| j ||¡ |  ¡ S rW   )rš  r  r  ri   rA  r;  )rd   rI  Úwhencer(   r(   r,   rA  “  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   r3   )ri   rA  rš  ÚSEEK_ENDr;  rU  rÃ   r  )rd   ÚposZpadBytesr(   r(   r,   r	  š  s    
zAppendingTiffWriter.goToEndc                 C   s.   || _ | j d | _| j d | _| j d | _d S )Nr0   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#   r1   )r
  ri   r;  r  rA  Ú	readShortrš  ÚSEEK_CUR)rd   r  ÚnumTagsr(   r(   r,   r  ª  s    zAppendingTiffWriter.skipIFDsc                 C   s   | j  |¡S rW   )ri   rU  r  r(   r(   r,   rU  µ  s    zAppendingTiffWriter.writec                 C   s   t  | j| j d¡¡\}|S )Nr!   )rî   rï   r  ri   r.  r±   r(   r(   r,   r  ¸  s    zAppendingTiffWriter.readShortc                 C   s   t  | j| j d¡¡\}|S rI   )rî   rï   r  ri   r.  r±   r(   r(   r,   r
  ¼  s    zAppendingTiffWriter.readLongc                 C   sJ   | j  dtj¡ | j  t | j|¡¡}|d k	rF|dkrFtd|› d�ƒ‚d S )Néþÿÿÿr#   úwrote only ú bytes but wanted 4©	ri   rA  rš  r  rU  rî   rñ   r  r  ©rd   re   ZbytesWrittenr(   r(   r,   ÚrewriteLastShortToLongÀ  s    z*AppendingTiffWriter.rewriteLastShortToLongc                 C   sJ   | j  dtj¡ | j  t | j|¡¡}|d k	rF|dkrFtd|› d�ƒ‚d S )Nr  r!   r   ú bytes but wanted 2)	ri   rA  rš  r  rU  rî   rñ   r  r  r#  r(   r(   r,   ÚrewriteLastShortÆ  s    z$AppendingTiffWriter.rewriteLastShortc                 C   sJ   | j  dtj¡ | j  t | j|¡¡}|d k	rF|dkrFtd|› d�ƒ‚d S )Néüÿÿÿr#   r   r!  r"  r#  r(   r(   r,   ÚrewriteLastLongÌ  s    z#AppendingTiffWriter.rewriteLastLongc                 C   s:   | j  t | j|¡¡}|d k	r6|dkr6td|› d�ƒ‚d S )Nr!   r   r%  )ri   rU  rî   rñ   r  r  r#  r(   r(   r,   Ú
writeShortÒ  s    zAppendingTiffWriter.writeShortc                 C   s:   | j  t | j|¡¡}|d k	r6|dkr6td|› d�ƒ‚d S )Nr#   r   r!  )ri   rU  rî   rñ   r  r  r#  r(   r(   r,   r  ×  s    zAppendingTiffWriter.writeLongc                 C   s   |   ¡  | j ¡  d S rW   )r  ri   r�  rk   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   r.  Ú
fieldSizesr
  r  r(  ÚTagsr;  Ú
fixOffsetsrA  rš  r  )rd   r  rC  rÄ   Z	fieldTyperD  Z	fieldSizeZ	totalSizeZisLocalrI  ZcurPosr(   r(   r,   r  à  s:    




  ÿ  ÿ
zAppendingTiffWriter.fixIFDc                 C   s®   |s|st dƒ‚t|ƒD ]�}|r(|  ¡ n|  ¡ }|| j7 }|rŽ|dkrŽ|dkrVt dƒ‚|  |¡ | 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 implementediöÿÿÿr'   )r  r<  r  r
  r  r$  ri   rA  rš  r  r)  r   rÞ   r&  r(  )rd   rD  r*  r+  rC  rI  r(   r(   r,   r.    s    

zAppendingTiffWriter.fixOffsetsN)F)FF)r“   r”   r•   r,  r-  rf   rÿ  r  r  r  r  r;  rî  r  rA  r	  r  r  rU  r  r
  r$  r&  r(  r)  r  r�  r  r.  r(   r(   r(   r,   rû  -  sJ   ó

#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|||ƒ | ¡  q†qXW 5 Q R X W 5 |  |¡ X d S )NÚappend_imagesru  r   )rÕ  rà  rÖ  rX  r=  r™  rõ  r;  rA  rû  ru  r<  rJ  r  )ry  r0  rl  rÕ  rÖ  r/  Zcur_idxÚtfZimsZnfrrù   r(   r(   r,   Ú	_save_all  s(    



r1  z.tifz.tiffz
image/tiff)irî  rò  Úloggingr�  rš  rî   rå   Úcollections.abcr   Z	fractionsr   Znumbersr   r   Ú r   r   r	   r
   r   Ú_binaryr   r€  r   rƒ  r   r   Ú	getLoggerr“   r?  r¹  r×  ZIFD_LEGACY_APIrä  r¤   r¢   r¯  r°  r²  rª  r­  r®  rÛ  rM  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µ  rJ   rM   rV   r]   rÁ   rü   rP   r™   rù   rº   rÓ   Úsetattrr[  ZImageFileDirectoryrj  rÔ  rõ  rû  r1  Zregister_openrÉ  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer(   r(   r(   r,   Ú<module>)   sÞ  
î                                                                                                                Œxú
    \   pë   o