B
    àz÷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dzdfd‚e#dOdLddzdf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ddMfdŽe#dOdLdddMfde"dOdLdddxfde#dOdLdddxfd‘e"dOdLdddLfd’e#dOdLdddLfd“e"dOdLdddSfdŽe#dOdLdddSfde"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de#d”dLdOd]dMfde"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ddMf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_UxNe M¡ D ]B\ZXZYeY Zd·d¸¡ZYe[eWd¹eY eTeX d ƒ e[eWdºeY eUeX ƒ 	qW [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)ÚTYPESFTi   s   IIs   MMé   i  i  i  i  i
  i  i  i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  iD  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_sgilog24ZlzmaZzstdZwebp)r   é   é   é   é   é   é   é   i€  i€  i)€  i²€  it‡  iu‡  imˆ  iPÃ  iQÃ  c             C   s   i | ]\}}||“qS © r   )Ú.0ÚkÚvr   r   ú2lib/python3.7/site-packages/PIL/TiffImagePlugin.pyú
<dictcomp>Š   s    r"   )r   r   )Ú1z1;Ir   )r#   z1;IR)r#   r#   )r#   z1;R)r   )ÚLzL;2I)r$   zL;2IR)r$   zL;2)r$   zL;2R)r   )r$   zL;4I)r$   zL;4IR)r$   zL;4)r$   zL;4R)r   )r$   zL;I)r$   zL;IR)r$   r$   )r$   zL;R)é   )zI;16zI;12)é   )zI;16zI;16)zI;16BzI;16B)zI;16zI;16R)ÚIzI;16S)r'   zI;16BS)r   )é    )ÚFzF;32F)r)   zF;32BF)r'   zI;32N)r'   zI;32S)r'   zI;32BS)r   r   )ÚLAr*   )r   r   r   )ÚRGBr+   )r+   zRGB;R)r   r   r   r   )ÚRGBAr,   )r   )ÚRGBXr-   )r   r   r   r   r   )r   r   )r-   ZRGBXX)r   r   r   r   r   r   )r   r   r   )r-   ZRGBXXX)r,   ZRGBa)r   r   )r,   ZRGBaX)r   r   r   )r,   ZRGBaXX)r   r   )r,   ZRGBAX)r   r   r   )r,   ZRGBAXX)iç  )r&   r&   r&   )r+   zRGB;16L)r+   zRGB;16B)r&   r&   r&   r&   )r,   zRGBA;16L)r,   zRGBA;16B)r-   zRGBX;16L)r-   zRGBX;16B)r,   zRGBa;16L)r,   zRGBa;16Br   )ÚPzP;1)r.   zP;1R)r.   zP;2)r.   zP;2R)r.   zP;4)r.   zP;4R)r.   r.   )ÚPAr/   )r.   zP;Rr   )ÚCMYKr0   )r0   ZCMYKX)r0   ZCMYKXX)r0   zCMYK;16Lr   )r+   r-   r   )ÚLABr1   s   MM *s   II* s   MM* s   II *s   MM +s   II+ c             C   s   | d d… t kS )Nr   )ÚPREFIXES)Úprefixr   r   r!   Ú_accept  s    r4   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    r=   c             C   sP   t | ƒ}|j|jf}t|ƒ|k r.t| t|ƒƒ}t|ƒ|krLt |Ž } t| |ƒ}|S )N)r   Ú	numeratorÚdenominatorÚminr=   r6   Úmax)r9   r:   Zmin_valÚfracr<   r   r   r!   Ú_limit_signed_rational  s    
rC   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 )4r7   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   )	Ú
isinstancer7   r>   rD   r?   rE   rF   r   Úfloat)ÚselfÚvaluer?   r   r   r!   Ú__init__:  s    


zIFDRational.__init__c             C   s   | j S )N)rD   )rJ   r   r   r!   r>   T  s    zIFDRational.numeratorc             C   s   | j S )N)rE   )rJ   r   r   r!   r?   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   )r?   r>   rF   Zlimit_denominator)rJ   Zmax_denominatorÚfr   r   r!   r8   \  s    
zIFDRational.limit_rationalc             C   s   t t| jƒƒS )N)ÚstrrI   rF   )rJ   r   r   r!   Ú__repr__i  s    zIFDRational.__repr__c             C   s
   | j  ¡ S )N)rF   Ú__hash__)rJ   r   r   r!   rP   l  s    zIFDRational.__hash__c             C   s0   | j }t|tƒr|j }t|tƒr(t|ƒ}||kS )N)rF   rH   r7   rI   )rJ   Úotherr9   r   r   r!   Ú__eq__o  s    

zIFDRational.__eq__c             C   s   | j | j| jgS )N)rF   rD   rE   )rJ   r   r   r!   Ú__getstate__w  s    zIFDRational.__getstate__c             C   s,   t  | d¡ |\}}}|| _|| _|| _d S )Nr   )r7   rL   rF   rD   rE   )rJ   ÚstaterF   rD   rE   r   r   r!   Ú__setstate__z  s
    
zIFDRational.__setstate__c                s   ‡ fdd„}|S )Nc                s   t | jˆ ƒ|Ž S )N)ÚgetattrrF   )rJ   Úargs)Úopr   r!   Údelegate‚  s    z'IFDRational._delegate.<locals>.delegater   )rX   rY   r   )rX   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__rL   Úpropertyr>   r?   r8   rO   rP   rR   rS   rU   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   r   r   r   r!   r7   ,  sL   
r7   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   r$   r   F)r4   ÚSyntaxErrorÚreprÚ_prefixÚMMÚ_endianÚIIÚ_bigtiffÚgroupÚtagtypeÚresetÚ_unpackÚnextÚ_legacy_api)rJ   Úifhr3   rˆ   r   r   r!   rL   è  s    

2zImageFileDirectory_v2.__init__c             C   s   | j S )N)rƒ   )rJ   r   r   r!   Ú<lambda>  ó    zImageFileDirectory_v2.<lambda>c             C   s   | j S )N)Ú_offset)rJ   r   r   r!   r     r   c             C   s   | j S )N)r   )rJ   r   r   r!   r     r   c             C   s   t dƒ‚d S )Nz"Not allowing setting of legacy api)Ú	Exception)rJ   rK   r   r   r!   Ú
legacy_api
  s    z ImageFileDirectory_v2.legacy_apic             C   s(   i | _ i | _i | _i | _d | _d | _d S )N)Ú_tags_v1Ú_tags_v2Ú_tagdatar‰   Z_nextr‘   )rJ   r   r   r!   rŠ     s    zImageFileDirectory_v2.resetc             C   s   t t| ƒƒS )N)rN   Údict)rJ   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   ÚcoderK   )rJ   r   r!   r"     s   z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)Úitems)rJ   r   )rJ   r!   Únamed  s    
zImageFileDirectory_v2.namedc             C   s   t t| jƒt| jƒB ƒS )N)ÚlenÚsetr–   r•   )rJ   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 )N)r•   r–   r‰   Ú_load_dispatchr“   rH   ÚtupleÚbytes)rJ   ÚtagÚdataÚtypÚsizeÚhandlerr9   r   r   r!   Ú__getitem__'  s    



z!ImageFileDirectory_v2.__getitem__c             C   s   || j kp|| jkS )N)r•   r–   )rJ   r¤   r   r   r!   Ú__contains__2  s    z"ImageFileDirectory_v2.__contains__c             C   s   |   ||| j¡ d S )N)Ú_setitemr“   )rJ   r¤   rK   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gkrd|f}y|\||< 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 )N)rH   r7   )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!   r­   F  s    c             s   s   | ]}t |tƒV  qd S )N)rH   Úint)r   r    r   r   r!   r­   I  s    c             s   s&   | ]}d |  kodk n  V  qdS )r   i   Nr   )r   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!   r­   L  s    c             s   s   | ]}|d kV  qdS )r   Nr   )r   r    r   r   r!   r­   Q  s    c             s   s   | ]}t |tƒV  qd S )N)rH   rI   )r   r    r   r   r!   r­   T  s    c             s   s   | ]}t |tƒV  qd S )N)rH   rN   )r   r    r   r   r!   r­   V  s    c             s   s   | ]}t |tƒV  qd S )N)rH   r£   )r   r    r   r   r!   r­   X  s    c             S   s&   g | ]}t |tƒr| d d¡n|‘qS )ÚasciiÚreplace)rH   rN   Úencode)r   r    r   r   r!   ú
<listcomp>]  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c             S   s"   g | ]}t |tƒrt|ƒn|‘qS r   )rH   r®   rI   )r   r    r   r   r!   r²   a  s    c             3   s   | ]}ˆ   |¡V  qd S )N)Zcvt_enum)r   rK   )Úinfor   r!   r­   e  s    r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r£   rN   r   r™   rˆ   rH   r‰   ÚtypeÚ	UNDEFINEDÚallZRATIONALZSIGNED_RATIONALÚSHORTÚSIGNED_SHORTÚLONGÚSIGNED_LONGÚDOUBLEÚASCIIÚBYTEr—   r¢   r”   r•   Úlengthrž   Ú
ValueErrorÚwarningsÚwarn)rJ   r¤   rK   r“   Z	basetypesÚvaluesÚis_ifdÚdestr   )r³   r!   r«   8  s^    

 zImageFileDirectory_v2._setitemc             C   s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S )N)r•   Úpopr”   r–   )rJ   r¤   r   r   r!   Ú__delitem__ˆ  s    z!ImageFileDirectory_v2.__delitem__c             C   s   t t| jƒt| jƒB ƒS )N)ÚiterrŸ   r–   r•   )rJ   r   r   r!   Ú__iter__  s    zImageFileDirectory_v2.__iter__c             C   s   t  | j| |¡S )N)ÚstructÚunpackr…   )rJ   Úfmtr¥   r   r   r!   r‹     s    zImageFileDirectory_v2._unpackc             G   s   t j| j| f|žŽ S )N)rÉ   Úpackr…   )rJ   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   ru   Ú
startswithr°   r¡   )Úfuncr   )Úidxr§   r   r!   Ú	decorator—  s
    z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr   )rÓ   r§   rÔ   r   )rÓ   r§   r!   Ú_register_loader–  s    z&ImageFileDirectory_v2._register_loaderc                s   ‡ fdd„}|S )Nc                s   | t ˆ < | S )N)Ú_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 )N)r‹   rž   )rJ   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 )N)rÍ   )r   rK   )rË   rJ   r   r!   r­   µ  s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>)Újoin)rJ   rÂ   )rË   )rJ   r!   r   ´  s    )T)r   r   rÉ   Zcalcsizer¡   rÖ   )Zidx_fmt_namer   rÓ   rš   r   )rË   r§   r!   Ú_register_basic¨  s    
z%ImageFileDirectory_v2._register_basicÚHZshortr$   ZlongÚbzsigned byteÚhzsigned shortÚlzsigned longrM   rI   ÚdZdoubler€   Zlong8r   Tc             C   s   |S )Nr   )rJ   r¥   r“   r   r   r!   Ú	load_byteÉ  s    zImageFileDirectory_v2.load_bytec             C   s   |S )Nr   )rJ   r¥   r   r   r!   Ú
write_byteÍ  s    z ImageFileDirectory_v2.write_byter   c             C   s"   |  d¡r|d d… }| dd¡S )Nó    r5   zlatin-1r°   )ÚendswithÚdecode)rJ   r¥   r“   r   r   r!   Úload_stringÑ  s    
z!ImageFileDirectory_v2.load_stringc             C   s   d|  dd¡ d S )Nr   r¯   r°   râ   )r±   )rJ   rK   r   r   r!   Úwrite_string×  s    z"ImageFileDirectory_v2.write_stringr   r   c                sV   |   t|ƒd › d|¡}‡fdd„‰ t‡ fdd„t|d d d… |dd d… ƒD ƒƒS )	Nr   r$   c                s   ˆ r| |fS t | |ƒS )N)r7   )ÚarÜ   )r“   r   r!   Úcombineà  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec             3   s   | ]\}}ˆ ||ƒV  qd S )Nr   )r   ÚnumÚdenom)rè   r   r!   r­   ã  s    z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   )r‹   rž   r¢   Úzip)rJ   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Í   r=   )r   rB   )rJ   r   r!   r­   è  s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>)rÙ   )rJ   rÂ   r   )rJ   r!   Úwrite_rationalå  s    z$ImageFileDirectory_v2.write_rationalr   c             C   s   |S )Nr   )rJ   r¥   r“   r   r   r!   Úload_undefinedë  s    z$ImageFileDirectory_v2.load_undefinedc             C   s   |S )Nr   )rJ   rK   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 )N)r7   )rç   rÜ   )r“   r   r!   rè   ÷  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec             3   s   | ]\}}ˆ ||ƒV  qd S )Nr   )r   ré   rê   )rè   r   r!   r­   ú  s    z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   )r‹   rž   r¢   rë   )rJ   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Í   rC   )r   rB   )rJ   r   r!   r­   ÿ  s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>)rÙ   )rJ   rÂ   r   )rJ   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 z bytes but only got z. )Úreadrž   ÚOSError)rJ   Úfpr§   Zretr   r   r!   Ú_ensure_read  s
    
z"ImageFileDirectory_v2._ensure_readc          
   C   sŠ  |   ¡  | ¡ | _y>| jr0|  d|  |d¡¡n|  d|  |d¡¡d }xÐt|ƒD ]Â}| jrt|  d|  |d¡¡n|  d|  |d	¡¡\}}}}t || j	¡j
}t |d
¡}	d|› d|› d|	› d|› d	}
y| j| \}}W n, tk
r   t |
d|›  ¡ wTY 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 |
¡ qT|sØt |
¡ qT|| j|< || j|< |
d|dkrd| nt|ƒ 7 }
t |
¡ qTW | jr8|  d|  |d¡¡n|  d|  |d¡¡\| _W n2 tk
r„ }
 zt t|
ƒ¡ d S d }
~
X Y nX d S )Nr€   r   rÛ   r   r   ZHHQ8sé   ÚHHL4sr%   Úunknownztag: z (z
) - type: ú)z - unsupported type r   r$   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read z bytes but only got z. Skipping tag z
 - value: r(   z<table: %d bytes>)rŠ   Útellr‘   r‡   r‹   rù   Úranger   r™   rˆ   rš   r   Úgetr¡   ÚKeyErrorÚloggerÚdebugÚseekr   Z
_safe_readrž   rÀ   rÁ   r–   r‰   r‚   rŒ   r÷   rN   )rJ   rø   Z	tag_countÚir¤   r¦   Úcountr¥   ÚtagnameÚtypnameÚmsgZ	unit_sizer¨   r§   ÚhereÚoffsetr   r   r!   Úload  sX    





zImageFileDirectory_v2.loadr   c             C   s0  |   dt| jƒ¡}g }|t|ƒ t| jƒd  d }d }xút| j ¡ ƒD ]æ\}}|tkrdt|ƒ}| j |¡}t 	d|› d|› dt
|ƒ› ¡ |tjko¢t|tƒ}|rü| jdkr¸d}	nd	}	t|	|d
}
| j| }x| ¡ D ]\}}||
|< qÜW |
 |¡}n*t|tƒr|n|f}| j| | f|žŽ }t || j¡j}|r@dn
t |d¡}d|› d|› d|› d|› d	}|dt|ƒdkrˆdt|ƒ nt|ƒ 7 }t 	|¡ |rªd}n(|tjtjtjgkrÊt|ƒ}nt|ƒ}t|ƒdkrþ| |||| dd¡df¡ qJ| ||||   d|¡|f¡ |t|ƒd d d 7 }qJW |d k	rŽ|| \}}}}}|r`tdƒ‚|   d|  d|¡d | ¡}|||||f||< x\|D ]T\}}}}}t 	|› d|› d|› dt
|ƒ› dt
|ƒ› 	¡ ||   d||||¡7 }q”W |d7 }x6|D ].\}}}}}||7 }t|ƒd@ rú|d7 }qúW |S )NrÛ   r%   r   zTag z, Type: z	, Value: r~   s   II*    s   MM *   )rˆ   Úifdrü   zsave: z (z
) - type: rý   z
 - value: r&   z<table: %d bytes>r   râ   r   r$   r   z&multistrip support not yet implementedr   rÐ   rû   s       ) rÍ   rž   r•   Úsortedrœ   ÚSTRIPOFFSETSr‰   r   r  r  r‚   r   r¹   rH   r—   r…   r{   Útobytesr¢   rÖ   r™   rˆ   rš   r   rN   r½   r¼   rµ   ÚappendÚljustÚNotImplementedErrorr‹   )rJ   r  ÚresultÚentriesZstripoffsetsr¤   rK   r¦   rÃ   rŽ   r  rÂ   Zifd_tagZ	ifd_valuer¥   r  r  r	  r  r   r   r!   r  P  sf     

&


.zImageFileDirectory_v2.tobytesc             C   sN   |  ¡ dkr&| | j|  ddd¡ ¡ |  ¡ }|  |¡}| |¡ |t|ƒ S )Nr   ZHLé*   r   )rþ   Úwriterƒ   rÍ   r  rž   )rJ   rø   r  r  r   r   r!   Úsaveœ  s    

zImageFileDirectory_v2.save)r|   NN)T)T)T)T)T)r   )3ru   rv   rw   rx   rL   rz   r3   r  r“   ÚsetterrŠ   r˜   r   r    r©   rª   r¬   r«   rÆ   rÈ   r‹   rÍ   rÕ   r×   rÚ   ÚlistÚmapr   r·   r¹   ZSIGNED_BYTEr¸   rº   ZFLOATr»   ZIFDZLONG8rà   rá   rå   ræ   rí   rï   rð   rñ   ró   rõ   rù   r  r  r  r   r   r   r!   r{   «  sh   ;
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)ÚsuperrL   r   )rJ   rW   Úkwargs)Ú	__class__r   r!   rL   Å  s    zImageFileDirectory_v1.__init__c             C   s   | j S )N)r”   )rJ   r   r   r!   r   É  r   zImageFileDirectory_v1.<lambda>c             C   s   | j S )N)r–   )rJ   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`

        )r3   )r3   r–   r‰   rŒ   )ÚclsZoriginalr  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`

        )r3   )r{   r3   r—   r–   r‰   r•   )rJ   r  r   r   r!   Úto_v2â  s
    zImageFileDirectory_v1.to_v2c             C   s   || j kp|| jkS )N)r”   r–   )rJ   r¤   r   r   r!   rª   ó  s    z"ImageFileDirectory_v1.__contains__c             C   s   t t| jƒt| jƒB ƒS )N)rž   rŸ   r–   r”   )rJ   r   r   r!   r    ö  s    zImageFileDirectory_v1.__len__c             C   s   t t| jƒt| jƒB ƒS )N)rÇ   rŸ   r–   r”   )rJ   r   r   r!   rÈ   ù  s    zImageFileDirectory_v1.__iter__c             C   s    xdD ]}|   |||¡ qW d S )N)FT)r«   )rJ   r¤   rK   r“   r   r   r!   r¬   ü  s    
z!ImageFileDirectory_v1.__setitem__c             C   sr   || j krP| j| }| j| }| j| \}}x"dD ]}|  ||| ||ƒ|¡ q2W | j | }t|ttfƒsn|f}|S )N)FT)r”   r–   r‰   r¡   r«   rH   r¢   r£   )rJ   r¤   r¥   r¦   r§   r¨   Zlegacyr9   r   r   r!   r©      s    




z!ImageFileDirectory_v1.__getitem__)ru   rv   rw   rx   rL   rz   ÚtagsZtagdatar—   Ú__annotations__Úclassmethodr!  r"  rª   r    rÈ   r¬   r©   Ú__classcell__r   r   )r  r!   r  ²  s   
r  c                   sŠ   e Zd ZdZdZdZd‡ fdd„	Zdd„ Zed	d
„ ƒZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚTiffImageFileZTIFFz
Adobe TIFFFNc                s   d | _ d | _tƒ  ||¡ d S )N)Útag_v2r¤   r  rL   )rJ   rø   Úfilename)r  r   r!   rL     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   Nr5   z*** TiffImageFile._open ***z- __first: z- ifh: r   )rø   rö   r{   r(  r  rŒ   Z_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_fpÚ
_frame_posÚ	_n_framesr  r  r‚   Ú_seek)rJ   rŽ   r   r   r!   Ú_open$  s    

zTiffImageFile._openc             C   sT   | j d krN|  ¡ }|  t| jƒ¡ x | j d krB|  |  ¡ d ¡ q$W |  |¡ | j S )Nr   )r.  rþ   r/  rž   r-  r  )rJ   Z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_checkr/  r   Z_decompression_bomb_checkr§   ÚcoreÚnewÚmodeÚim)rJ   Úframer   r   r!   r  I  s
    

zTiffImageFile.seekc             C   sH  | j | _| j ¡  xæt| jƒ|krø| js0t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W | 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   )r,  rø   rþ   rž   r-  r*  ÚEOFErrorr  r  r+  r  r  r(  r  rŒ   r.  Úis_animatedZ_reload_exifr  r!  r¤   r  Ú_setup)rJ   r6  r   r   r!   r/  T  s2    
(


zTiffImageFile._seekc             C   s   | j S )zReturn the current frame number)r+  )rJ   r   r   r!   rþ   y  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.
        i¼  )r(  Z_getxmp)rJ   r   r   r!   Úgetxmp}  s    zTiffImageFile.getxmpc             C   s¶   i }| j  d¡}|r²xœ|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W |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.
        iI†  Nr   s   8BIMr   r   r   rò   r¥   )r(  r   Úi16ÚmathZceilÚi32)rJ   Zblocksr9   ÚidÚnr§   r¥   r   r   r!   Úget_photoshop_blocks†  s    &z"TiffImageFile.get_photoshop_blocksc                s   | j r| jr|  ¡ S tƒ  ¡ S )N)ÚtileÚuse_load_libtiffÚ_load_libtiffr  r  )rJ   )r  r   r!   r  ›  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 ¡  |  ¡ }x&tj ¡ D ]}||kr–qˆ| |¡ qˆW 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   r5  Z	transposer§   Ú_sizer8  Ú!_close_exclusive_fp_after_loadingrø   rþ   Zgetexifr   ÚTAGS_V2_GROUPSÚkeysÚget_ifd)rJ   Ú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 ƒ}| j ¡ }| j 	d¡ t
 | j ¡ ¡}| j 	|¡ y6t| jdƒo˜t | j ¡ ¡}t| jdƒr°| j ¡  W n tk
rÊ   d}Y nX |rØ||d< t  | jd	t|ƒ| j¡}y| | j|¡ W n. tk
r0 } ztd
ƒ|‚W dd}~X Y nX | jo@| j }t| jdƒrpt d¡ | | j ¡ ¡\}}	n\|r¢t d¡ |s’| j 	d¡ | d¡\}}	n*t d¡ | j 	d¡ | | j ¡ ¡\}}	|røyt |¡ W n tk
rö   Y nX g | _d| _ |  !¡  |r"| j ¡  d| _|	dk r4t|	ƒ‚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   r  Zload_preparerž   rA  r÷   r  rø   rþ   r  ÚioÚBytesIOrö   ÚhasattrÚosÚduprN  rO  Z_getdecoderr4  r¢   ZdecoderconfigÚsetimager5  r¿   Z_exclusive_fpr8  r  r  rä   rQ  ÚcloseÚreadonlyrM  )
rJ   ZextentsrW   Zpositionrø   ÚdecoderÚeZclose_self_fpr?  Úerrr   r   r!   rC  ¿  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|ƒ}	| j  t| jdkr¼|dkr¼dnd¡}
|
|	k rÚ|d|
… }n|
|	krö|	dkrö||
 }t|ƒ|
krtdƒ‚| j j|||||f}t
 d|› ¡ yt| \| _}W n8 tk
rz } zt
 d¡ tdƒ|‚W d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¡ nXt(| j ksjt)| j kr˜t(| j krš| j t( }| j  t*|¡}| jd }n"| j t) }| j  d,¡}| j  d-¡}xì|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ÂW 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: i  z- size: )r   r   )r   r   r   r   r   r   )r   r   Nzunknown data organizationzformat key: z- unsupported formatzunknown pixel modez- raw mode: z- pil mode: Úcompressionr   ÚdpigR¸…ëQ@Ú
resolutionr   zI;16zI;16Nz;16Bz;16Nz;16Lr   r+   FrP  iB  iC  r   z- unsupported data organizationÚicc_profile)r.   r/   c             S   s   g | ]}t |d  ƒ‘qS )r   )r   )r   rÜ   r   r   r!   r²   î  s    z(TiffImageFile._setup.<locals>.<listcomp>zRGB;Lr   i  )3r(  r÷   ÚCOMPRESSION_INFOr   ÚCOMPRESSIONZ_compressionÚPLANAR_CONFIGURATIONZ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERr  r  r¤   r®   Ú
IMAGEWIDTHÚIMAGELENGTHrE  r§   ÚSAMPLEFORMATrž   rA   r@   ÚBITSPERSAMPLEÚEXTRASAMPLESÚSAMPLESPERPIXELr   r3   Ú	OPEN_INFOr4  r  r³   ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITrA  ÚREAD_LIBTIFFrB  r°   r  r  r  ÚTILEOFFSETSÚROWSPERSTRIPÚsumÚ
ICCPROFILEÚCOLORMAPr
   r   rÙ   ÚpaletterD  )rJ   ÚphotoZ	fillorderZxsizeZysizeZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelrL  Úrawmoder[  ZxresZyresZresunitÚxÚyZlayerrç   ZoffsetsrÝ   Úwr  ÚstrideZtile_rawmoderv  r   r   r!   r9    sô    



2

 









 



zTiffImageFile._setup)NN)ru   rv   rw   ÚformatZformat_descriptionrF  rL   r0  rz   r1  r  r/  rþ   r:  r@  r  rM  rC  r9  r&  r   r   )r  r!   r'    s   	
%	_r'  r#   r$   r*   r.   r/   zI;32SzI;16zI;16SzF;32Fr+   r-   r,   r0   ÚYCbCrr1   zI;32BSzI;16BzI;16BSzF;32BF)r#   r$   r*   r.   r/   r'   zI;16zI;16Sr)   r+   r-   r,   r0   r~  r1   zI;32BSzI;16BzI;16BSzF;32BFc       1      C   s	  yt | j \}}}}}}W n6 tk
rP }	 ztd| j› dƒ|	‚W d d }	~	X Y nX t|d}
| j}| j}y|d }W n. tk
r¢   | j d¡}t	|t
ƒržd }Y nX |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rF|d }t	|tƒrJt ¡ }| |¡ |}ni }t dt|ƒ ¡ t	|tƒrp| ¡ }xv|D ]n}t	|tjƒr¨|tj ¡ kr¨| |¡|
|< n| |¡|
|< y|j| |
j|< W n tk
rà   Y nX qvW t| dƒr<xFt t!t"t#t$t%fD ]2}|| j&kr| j&| |
|< | j&j| |
j|< qW | d| j d¡¡}|r^||
t'< xdt(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g
D ] \}}||kr || |
|< q W | d¡}|rôd|
t < |d |
t!< |d
 |
t"< |dkr ||
t-< t.|ƒd
kr t.|ƒ|
t/< |d k	r2||
t0< |d
krD||
t1< t2|
krX||
t2< n”| jdkrì|
t2 dkrì| jdkrâ|  3¡ }| ¡ }xLt4|j5ƒD ]>}x6t4|j6ƒD ](}|||f dkrÄdnd|||f< qªW qšW |} n
t7 8| ¡} | jd krj| j9 :d!d"¡}g }t.|ƒd# }xJt4d#ƒD ]>}|d$d%„ ||| ||d
  … D ƒ7 }|dgd&|  7 }q W ||
t;< t.|ƒ| jd |d  d' d(  }|rÜ|dkr d
nt<t=| | jd
 ƒ}|dkræt<|d' d( d( | jd
 ƒ}n
| jd
 }|dkrôd
}|dkrd
n|| }| jd
 | d
 | } ||
t>< |d)kr>tj?|
jt@< |f| d
  || jd
  || d
   f |
t@< tAt4d||  |ƒƒ|
tB< tC |d
¡|
tD< | jd*krÌx*tEd+tFd,i G¡ D ]\}!}"|
 H|!|"¡ q²W tItJtKtLg}#|rÂd-|kr2|d- }$t	|$t
ƒr|$dk s|$d.krtMd/ƒ‚|dkr*tMd0ƒ‚|$|
tN< t d1¡ t d2tO|
 G¡ ƒ ¡ d}%t|d3ƒr˜y| Pd¡ tQ R| S¡ ¡}%W n tTjUk
r–   Y nX i }&|#tFt@tBtVtWg7 }#t-|d i}'i }(t| d4ƒrÔ| jX ¡ }(tY| di ƒ|(–})t1|)krô|)t1= xätZ [|
 G¡ |) G¡ ¡D ]Ì\}!}"|!tj\kr|tj]j^s,q
|!|
jkrH|
j|! |&|!< n4t	|"t
t_t`tfƒsbq
nt a|!¡jb}*|*r||*|&|!< |!|'kr
|!|#kr
t	|"t`ƒr²|" cd5d6¡d7 |'|!< n"t	|"tdƒrÌt_|"ƒ|'|!< n|"|'|!< q
W t1|'krt.|'t1 ƒd
kr|'t1 d |'t1< t d8tO|' G¡ ƒ ¡ | jd9kr,d:}t|' G¡ ƒ}+|+ e¡  |||%||+|&f},t f| jd;|,|¡}	|	 g| j9d<| j ¡ x.|	 cd=¡\}-}.}/|%s˜| h|/¡ |.rxP qxW |.dk 	rtd>|.› d?ƒ‚nDx|#D ]}!|
|!= qÈW |
 i|¡}0tj k| |dd<| j |0||d
ffg¡ d@|k	r|
| _ld S )ANzcannot write mode z as TIFF)r3   r]  r   r   r   r   r   r   r   ZtiffinforK  zTiffinfo Keys: %sr(  r`  Zdescriptionr_  Zx_resolutionZy_resolutionZresolution_unitZsoftwareZ	date_timeZartistÚ	copyrightr^  r   )r   )r#   r$   r#   éÿ   )r.   r/   r+   zRGB;Lr   c             S   s   g | ]}|d  ‘qS )r   r   )r   r    r   r   r!   r²   ”  s    z_save.<locals>.<listcomp>r   r   r   i   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: %srN  r¤   r¯   r°   râ   zConverted items: %s)zI;16BzI;16zI;16NrP  )r   r   i @  zencoder error z when writing image fileÚ_debug_multipage)mÚ	SAVE_INFOr4  r  r÷   r{   ÚencoderinfoÚencoderconfigr³   r   rH   r®   ÚWRITE_LIBTIFFrc  r§   rf  rg  r£   r   ZExifr  r  r  r  r  r"  r   rG  rH  rI  r‰   r’   rT  ro  rm  rn  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKÚXMPr(  rt  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTri  rž   rk  rj  rh  rd  Úcopyrÿ   ZheightÚwidthr	   Úinvertr5  Z
getpaletteru  r@   Ú
STRIP_SIZErr  r¹   ÚSTRIPBYTECOUNTSr¢   r  ÚCOMPRESSION_INFO_REVrb  ÚYCBCRSUBSAMPLINGÚREFERENCEBLACKWHITErœ   Ú
setdefaultÚ	TILEWIDTHÚ
TILELENGTHrq  ÚTILEBYTECOUNTSr¿   ÚJPEGQUALITYr  r  rU  rV  rN  rR  ÚUnsupportedOperationÚTRANSFERFUNCTIONÚSUBIFDr¤   rV   Ú	itertoolsÚchainZLIBTIFF_COREr2  Zlibtiff_support_custom_tagsrI   rN   r™   r´   r±   r7   ÚsortZ_getencoderrW  r  r  r   Ú_saver„  )1r5  rø   r)  rx  r3   rw  r}  ÚbitsZextrar[  r  r†  r‡  r]  rP  r³   rK  rL  Ziccrš   r^  Zinverted_imZpxrz  ry  ZlutZcolormapZcolorsr  r|  Zrows_per_stripZstrip_byte_countsZstrips_per_imager¤   rK   Z	blocklistr‚  r,  ÚtypesZattsZ
legacy_ifdZsupplied_tagsr´   r#  rç   rÞ   Úsrß   r  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   i  i   iD  i  i  i	  Fc             C   sv   t |dƒr|| _d| _nF|| _d| _yt||r2dndƒ| _W n  tk
r\   t|dƒ| _Y nX | j ¡ | _|  ¡  d S )Nrö   FTzw+bzr+b)	rT  rM   Úclose_fprš   Úopenr÷   rþ   Ú	beginningÚsetup)rJ   Úfnr3  r   r   r!   rL   L  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   TFs   II* r~   s   MM *r}   zInvalid TIFF file header)rM   r  r«  rU  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPagerö   ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)rJ   Úiimmr   r   r!   r¬  Z  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²  rM   r  r°  rö   r±  r´  ÚreadLongr¯  Ú	writeLongÚfixIFD)rJ   r·  Ú
ifd_offsetr   r   r!   Úfinalizer  s    


zAppendingTiffWriter.finalizec             C   s   |   ¡  |  ¡  d S )N)r¼  r¬  )rJ   r   r   r!   ÚnewFrame‰  s    zAppendingTiffWriter.newFramec             C   s   | S )Nr   )rJ   r   r   r!   Ú	__enter__Ž  s    zAppendingTiffWriter.__enter__c             C   s   | j r|  ¡  dS )NF)r©  rX  )rJ   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r!   Ú__exit__‘  s    zAppendingTiffWriter.__exit__c             C   s   | j  ¡ | j S )N)rM   rþ   r°  )rJ   r   r   r!   rþ   –  s    zAppendingTiffWriter.tellc             C   s*   |t jkr|| j7 }| j ||¡ |  ¡ S )N)rU  r®  r°  rM   r  rþ   )rJ   r  Úwhencer   r   r!   r  ™  s    

zAppendingTiffWriter.seekc             C   s^   | j  dtj¡ | j  ¡ }d|d  }d|  k r:dk rNn n| j  t|ƒ¡ | j  ¡ | _d S )Nr   r&   )rM   r  rU  ÚSEEK_ENDrþ   r  r£   r°  )rJ   ÚposZ	pad_bytesr   r   r!   r¶     s    
zAppendingTiffWriter.goToEndc             C   s.   || _ | j d | _| j d | _| j d | _d S )Nr$   rÛ   ZHHL)ÚendianÚlongFmtÚshortFmtÚ	tagFormat)rJ   rÆ  r   r   r!   r³  ª  s    zAppendingTiffWriter.setEndianc             C   sT   xN|   ¡ }|dkr$| j ¡ d | _P | j |¡ |  ¡ }| j |d tj¡ qW d S )Nr   r   r%   )r¸  rM   rþ   r¯  r  Ú	readShortrU  ÚSEEK_CUR)rJ   r»  Únum_tagsr   r   r!   rµ  °  s    zAppendingTiffWriter.skipIFDsc             C   s   | j  |¡S )N)rM   r  )rJ   r¥   r   r   r!   r  »  s    zAppendingTiffWriter.writec             C   s   t  | j| j d¡¡\}|S )Nr   )rÉ   rÊ   rÈ  rM   rö   )rJ   rK   r   r   r!   rÊ  ¾  s    zAppendingTiffWriter.readShortc             C   s   t  | j| j d¡¡\}|S )Nr   )rÉ   rÊ   rÇ  rM   rö   )rJ   rK   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   zwrote only z bytes but wanted 4)	rM   r  rU  rË  r  rÉ   rÌ   rÇ  r´  )rJ   rK   Úbytes_writtenr   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   zwrote only z bytes but wanted 2)	rM   r  rU  rË  r  rÉ   rÌ   rÈ  r´  )rJ   rK   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   zwrote only z bytes but wanted 4)	rM   r  rU  rË  r  rÉ   rÌ   rÇ  r´  )rJ   rK   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   zwrote only z bytes but wanted 2)rM   r  rÉ   rÌ   rÈ  r´  )rJ   rK   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   zwrote only z bytes but wanted 4)rM   r  rÉ   rÌ   rÇ  r´  )rJ   rK   rÎ  r   r   r!   r¹  Ý  s    zAppendingTiffWriter.writeLongc             C   s   |   ¡  | j ¡  d S )N)r¼  rM   rX  )rJ   r   r   r!   rX  â  s    zAppendingTiffWriter.closec             C   s  |   ¡ }xöt|ƒD ]ê}t | j| j d¡¡\}}}| j| }|| }|dk}|sl|  ¡ }	|	| 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W d S )Nr   r   r   )ÚisShortÚisLong)rÊ  rÿ   rÉ   rÊ   rÉ  rM   rö   Ú
fieldSizesr¸  r°  rÒ  ÚTagsrþ   Ú
fixOffsetsr  rU  rË  )rJ   rÌ  r  r¤   Z
field_typer  Z
field_sizeZ
total_sizeZis_localr  Zcur_posr   r   r!   rº  æ  s.    





zAppendingTiffWriter.fixIFDc             C   s²   |s|st dƒ‚xœt|ƒD ]}|r*|  ¡ n|  ¡ }|| j7 }|r|dkr|dkrXt dƒ‚|  |¡ | j dtj	¡ |  
tj¡ | j dtj	¡ q|r |  |¡ q|  |¡ qW d S )Nz offset is neither short nor longi   r   znot implementediöÿÿÿr   )r´  rÿ   rÊ  r¸  r°  rÏ  rM   r  rU  rË  rÓ  r   r¹   rÐ  rÒ  )rJ   r  rÔ  rÕ  r  r  r   r   r!   rØ  	  s    

zAppendingTiffWriter.fixOffsetsN)F)FF)ru   rv   rw   rÖ  r×  rL   r¬  r¼  r½  r¾  rÂ  rþ   rR  r®  r  r¶  r³  rµ  r  rÊ  r¸  rÏ  rÐ  rÒ  rÓ  r¹  rX  rº  rØ  r   r   r   r!   r¨  3  sH   	

#r¨  c          	   C   sÚ   | j  ¡ }| j}t| dg ¡ƒ}t| dƒs:|s:t| ||ƒS |  ¡ }z†t|ƒt}xl| g| D ]^}||_ ||_t|dƒszd}	n|j	}	x6t
|	ƒD ]*}
| |
¡ | ¡  t|||ƒ | ¡  qŠW qZW W d Q R X W d |  |¡ X d S )NÚappend_imagesr1  r   )r†  r‘  r‡  r  r   rT  r¤  rþ   r¨  r1  rÿ   r  r  r½  )r5  rø   r)  r†  r‡  rÙ  Zcur_idxZtfZimsZnfrrÓ   r   r   r!   Ú	_save_all!  s(    



rÚ  z.tifz.tiffz
image/tiff)irR  r¡  Zloggingr<  rU  rÉ   rÀ   Zcollections.abcr   Z	fractionsr   Znumbersr   r   Ú r   r   r	   r
   r   Z_binaryr   r;  r   r=  r   r   Z	getLoggerru   r  rp  rˆ  ZIFD_LEGACY_APIr”  r†   r„   rf  rg  ri  rb  rd  re  rŒ  r  rk  rr  r•  rm  rn  rc  ro  rŸ  r  rŽ  r  Z	PREDICTORru  rš  r›  rq  rœ  r   rj  rh  Z
JPEGTABLESr—  r˜  r  r‰  rŠ  rt  ZEXIFIFDr‹  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAra  rœ   r–  rl  r2   r4   r=   rC   r¡   rÖ   r7   r{   rÓ   rš   r°   Úsetattrr  ZImageFileDirectoryr'  r…  r¤  r¨  rÚ  Zregister_openr}  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer   r   r   r!   Ú<module>)   sö  
    \   l  ! o