a
    çÝEb© ã                â   @   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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 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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@d0ZAd1ZBd2ZCd3ZDd4ZEd5ZFd6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGœZGdHdI„ eG H¡ D ƒZIed dJddJdKfdLed dJddJdKfdLed dJdMdJdKfdNed dJdMdJdKfdNeddJddJdKfdOeddJddJdKfdOeddJdMdJdKfdPeddJdMdJdKfdPed dJddQdKfdRed dJddQdKfdRed dJdMdQdKfdSed dJdMdQdKfdSeddJddQdKfdTeddJddQdKfdTeddJdMdQdKfdUeddJdMdQdKfdUed dJddVdKfdWed dJddVdKfdWed dJdMdVdKfdXed dJdMdVdKfdXeddJddVdKfdYeddJddVdKfdYeddJdMdVdKfdZeddJdMdVdKfdZed dJdd[dKfd\ed dJdd[dKfd\ed dJdMd[dKfd]ed dJdMd[dKfd]eddJdd[dKfd^eddJdd[dKfd^eddJdMd[dKfd_eddJdMd[dKfd_eddJdd`dKfdaeddJddbdKfdceddJddbdKfddeddQddbdKfdeeddQddbdKfdfed dgddhdKfdied dgddhdKfdjeddJddhdKfdkeddQddhdKfdleddQddhdKfdmeddgddhdKfdieddgddhdKfdjeddJddndQfdoeddJddndQfdoedMdJddpdKfdqedMdJddpdKfdqedMdJdMdpdKfdredMdJdMdpdKfdredMdJddsdKfdtedMdJddsdKfdtedMdJddsdufdvedMdJddsdufdvedMdJddwdxfdyedMdJddwdxfdyedMdJddzd{fd|edMdJddzd{fd|edMdJddsdJfd}edMdJddsdJfd}edMdJddwd~fdedMdJddwd~fdedMdJddzd€fd�edMdJddzd€fd�edMdJddsdQfdtedMdJddsdQfdtedMdJddwd‚fdƒedMdJddwd‚fdƒedMdJddzd„fd…edMdJddzd„fd…edMdJddsd†fdtedMdJddsd†fdtedMdJdd‡dKfdˆedMdJdd‡dKfd‰edMdJddŠdKfd‹edMdJddŠdKfdŒedMdJddŠdufd�edMdJddŠdufdŽedMdJddŠdJfd�edMdJddŠdJfd�edMdJddŠdQfd‹edMdJddŠdQfdŒed‘dJddJdKfd’ed‘dJddJdKfd’ed‘dJdMdJdKfd“ed‘dJdMdJdKfd“ed‘dJddQdKfd”ed‘dJddQdKfd”ed‘dJdMdQdKfd•ed‘dJdMdQdKfd•ed‘dJddVdKfd–ed‘dJddVdKfd–ed‘dJdMdVdKfd—ed‘dJdMdVdKfd—ed‘dJdd[dKfd˜ed‘dJdd[dKfd˜ed‘dJddndQfd™ed‘dJddndQfd™ed‘dJdMd[dKfdšed‘dJdMd[dKfdšed›dJddsdKfdœed›dJddsdKfdœed›dJddwdufd�ed›dJddwdufd�ed›dJddzdxfdžed›dJddzdxfdžed›dJddŠdKfdŸed dJddpdKfd¡ed dJddpdKfd¡ed¢dJddpdKfd£ed¢dJddpdKfd£ioZJg d¤¢ZKd¥d¦„ ZLd§d¨„ ZMd©dª„ ZNi ZOi ZPG d«d¬„ d¬eƒZQG d­d®„ d®eƒZReOeR_OePeR_Pe H¡ D ]B\ZSZTeT Ud¯d°¡ZTeVeRd±eT eOeS d ƒ eVeRd²eT ePeS ƒ �qØ[O[P[S[TG d³d´„ d´eRƒZWeWZXG dµd¶„ d¶ejƒZYd·edddJdfd¸eddd[dfd¹edddndMfdºed‘dd[dfd»ed‘ddndMfd¼eddMdhdfd½edddbdfd¾eddMdbdfd¿edd‘dhdfdÀedMddpdfdÁedMddsd fdÂedMddsdMfdÃed›ddsdfdÄed ddpdfdÅed¢ddpdfdÆeddMdhdfdÇedddbdfdÈeddMdbdfdÉedd‘dhdfdÊœZZdËdÌ„ Z[G dÍdÎ„ dÎƒZ\dÏdÐ„ Z]e ^eYj_eYeL¡ e `eYj_e[¡ e aeYj_e]¡ e beYj_dÑdÒg¡ e ceYj_dÓ¡ dS )Ôé    N)ÚMutableMapping)ÚFraction)ÚNumberÚRationalé   )ÚImageÚ	ImageFileÚImageOpsÚImagePaletteÚTiffTags©Ú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»ƒ  iI†  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%   úS/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/PIL/TiffImagePlugin.pyÚ
<dictcomp>‡   ó    r*   ©r   r%   )Ú1z1;Ir   )r-   z1;IR)r-   r-   )r-   z1;R)r   )ÚLzL;2I)r.   zL;2IR)r.   zL;2)r.   zL;2R)r    )r.   zL;4I)r.   zL;4IR)r.   zL;4)r.   zL;4R)r$   )r.   zL;I)r.   zL;IR)r.   r.   )r.   zL;R)é   )úI;16zI;12)é   )r0   r0   )úI;16Br2   )ÚIúI;16S)r3   úI;16BS)r   )é    )ÚFúF;32F)r7   úF;32BF)r3   zI;32N)r3   úI;32S)r3   ú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ç  )r1   r1   r1   )r=   zRGB;16L)r=   zRGB;16B)r1   r1   r1   r1   )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)rA   zP;1R)rA   zP;2)rA   zP;2R)rA   zP;4)rA   zP;4R)rA   rA   )ÚPArB   )rA   zP;Rr!   )ÚCMYKrC   )rC   ZCMYKX)rC   ZCMYKXX)rC   zCMYK;16Lr"   )r=   r?   r$   )ÚLABrD   )ó   MM *ó   II* s   MM* s   II *c                 C   s   | d d… t v S ©Nr    )ÚPREFIXES©Úprefixr%   r%   r)   Ú_accept  s    rK   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    rT   c                 C   sP   t | ƒ}|j|jf}t|ƒ|k r.t| t|ƒƒ}t|ƒ|krLt |Ž } t| |ƒ}|S ©N)r   Ú	numeratorÚdenominatorÚminrT   rM   Úmax)rP   rQ   Zmin_valÚfracrS   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 )4rN   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   )	Ú
isinstancerN   rV   r\   rW   r]   r^   r   Úfloat)ÚselfÚvaluerW   r%   r%   r)   Ú__init__4  s    


zIFDRational.__init__c                 C   s   | j S rU   )r\   ©Úar%   r%   r)   rV   N  s    zIFDRational.numeratorc                 C   s   | j S rU   )r]   re   r%   r%   r)   rW   R  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   )rW   rV   r^   Úlimit_denominator)rb   Úmax_denominatorÚfr%   r%   r)   rO   V  s    
zIFDRational.limit_rationalc                 C   s   t t| jƒƒS rU   )Ústrra   r^   ©rb   r%   r%   r)   Ú__repr__c  s    zIFDRational.__repr__c                 C   s
   | j  ¡ S rU   )r^   Ú__hash__rk   r%   r%   r)   rm   f  s    zIFDRational.__hash__c                 C   s0   | j }t|tƒr|j }t|tƒr(t|ƒ}||kS rU   )r^   r`   rN   ra   )rb   ÚotherrP   r%   r%   r)   Ú__eq__i  s    

zIFDRational.__eq__c                 C   s   | j | j| jgS rU   )r^   r\   r]   rk   r%   r%   r)   Ú__getstate__q  s    zIFDRational.__getstate__c                 C   s,   t  | d¡ |\}}}|| _|| _|| _d S )Nr   )rN   rd   r^   r\   r]   )rb   Ústater^   r\   r]   r%   r%   r)   Ú__setstate__t  s
    
zIFDRational.__setstate__c                    s   ‡ fdd„}|S )Nc                    s   t | jˆ ƒ|Ž S rU   )Úgetattrr^   )rb   Ú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__rd   ÚpropertyrV   rW   rO   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)   rN   &  sP   


rN   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gƒƒ ed8d8ƒd]d:d;„ƒZ$ed8ƒd<d=„ ƒZ%ed>d8ƒd^d?d@„ƒZ&ed>ƒdAdB„ ƒZ'edCdDƒd_dEdF„ƒZ(edCƒdGdH„ ƒZ)edId8ƒd`dJdK„ƒZ*edIƒdLdM„ ƒZ+edNdDƒdadOdP„ƒZ,edNƒdQdR„ ƒZ-dSdT„ Z.dUdV„ Z/dbdXdY„Z0dZd[„ Z1dS )cÚImageFileDirectory_v2a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v2()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        'Some Data'

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

    ó   II*     Nc                 C   s    |dd… t vr$tdt|ƒ› d�ƒ‚|dur0|n
|dd… | _| jtkrPd| _n| jtkrbd| _ntdƒ‚|| _i | _|  	¡  |  
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.
        Nr    znot a TIFF file (header z not valid)r   ú>ú<znot a TIFF IFDr.   F)rH   ÚSyntaxErrorÚreprÚ_prefixÚMMÚ_endianÚIIÚgroupÚtagtypeÚresetÚ_unpackÚnextÚ_legacy_api)rb   ÚifhrJ   r£   r%   r%   r)   rd   â  s    

zImageFileDirectory_v2.__init__c                 C   s   | j S rU   )rŸ   rk   r%   r%   r)   Ú<lambda>ý  r+   zImageFileDirectory_v2.<lambda>c                 C   s   | j S rU   )Ú_offsetrk   r%   r%   r)   rª   þ  r+   c                 C   s   | j S rU   )r¨   rk   r%   r%   r)   rª   ÿ  r+   c                 C   s   t dƒ‚d S )Nz"Not allowing setting of legacy api)Ú	Exception©rb   rc   r%   r%   r)   Ú
legacy_api  s    z ImageFileDirectory_v2.legacy_apic                 C   s(   i | _ i | _i | _i | _d | _d | _d S rU   )Ú_tags_v1Ú_tags_v2Ú_tagdatar¤   Ú_nextr«   rk   r%   r%   r)   r¥     s    zImageFileDirectory_v2.resetc                 C   s   t t| ƒƒS rU   )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&   Úcoderc   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 rU   )ÚlenÚsetr±   r°   rk   r%   r%   r)   Ú__len__  s    zImageFileDirectory_v2.__len__c                 C   sf   || j vr>| j| }| j| }| j| \}}|| || jƒ| |< | j | }| jrbt|ttfƒsb|f}|S rU   )r°   r±   r¤   Ú_load_dispatchr®   r`   ÚtupleÚbytes)rb   ÚtagÚdataÚtypÚsizeÚhandlerrP   r%   r%   r)   Ú__getitem__  s    



z!ImageFileDirectory_v2.__getitem__c                 C   s   || j v p|| jv S rU   )r°   r±   ©rb   rÀ   r%   r%   r)   Ú__contains__)  s    z"ImageFileDirectory_v2.__contains__c                 C   s   |   ||| j¡ d S rU   )Ú_setitemr®   )rb   rÀ   rc   r%   r%   r)   Ú__setitem__,  s    z!ImageFileDirectory_v2.__setitem__c              
      s¾  t ttf}t || j¡‰ t||ƒr(|gn|}|| jv�rpˆ jrNˆ j| j|< �n"tj	| j|< t
dd„ |D ƒƒ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 u �r²t|ƒdk�r²|�s²|�rd| j| tjtjfv �rd|f}z|\||< W n< t�y®   t d|› dt|ƒ› d�¡ |d ||< Y n0 n|||< d S )Nc                 s   s   | ]}t |tƒV  qd S rU   )r`   rN   ©r&   r(   r%   r%   r)   Ú	<genexpr>:  r+   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS ©r   Nr%   rÊ   r%   r%   r)   rË   =  r+   c                 s   s   | ]}t |tƒV  qd S rU   )r`   ÚintrÊ   r%   r%   r)   rË   @  r+   c                 s   s&   | ]}d |  kodk n  V  qdS )r   r   Nr%   rÊ   r%   r%   r)   rË   A  r+   c                 s   s&   | ]}d |  k odk n  V  qdS )i €ÿÿi €  Nr%   rÊ   r%   r%   r)   rË   C  r+   c                 s   s   | ]}|d kV  qdS rÌ   r%   rÊ   r%   r%   r)   rË   H  r+   c                 s   s   | ]}t |tƒV  qd S rU   )r`   ra   rÊ   r%   r%   r)   rË   K  r+   c                 s   s   | ]}t |tƒV  qd S rU   )r`   rj   rÊ   r%   r%   r)   rË   M  r+   c                 s   s   | ]}t |tƒV  qd S rU   )r`   r¿   rÊ   r%   r%   r)   rË   O  r+   c                 S   s&   g | ]}t |tƒr| d d¡n|‘qS )ÚasciiÚreplace)r`   rj   ÚencoderÊ   r%   r%   r)   Ú
<listcomp>S  s   ÿz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S   s"   g | ]}t |tƒrt|ƒn|‘qS r%   )r`   rÍ   ra   rÊ   r%   r%   r)   rÑ   X  r+   c                 3   s   | ]}ˆ   |¡V  qd S rU   )Zcvt_enum©r&   rc   ©Úinfor%   r)   rË   \  r+   r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r¿   rj   r   rµ   r£   r`   r¤   ÚtypeÚ	UNDEFINEDÚallZRATIONALZSIGNED_RATIONALÚSHORTÚSIGNED_SHORTÚLONGÚSIGNED_LONGÚDOUBLEÚASCIIÚBYTEr³   r¾   r¯   r°   Úlengthrº   Ú
ValueErrorÚwarningsÚwarn)rb   rÀ   rc   r®   Z	basetypesÚvaluesÚis_ifdÚdestr%   rÓ   r)   rÈ   /  s~    
ÿý
ÿý
þÿþý
ýýþÿÿzImageFileDirectory_v2._setitemc                 C   s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S rU   )r°   Úpopr¯   r±   rÆ   r%   r%   r)   Ú__delitem__  s    z!ImageFileDirectory_v2.__delitem__c                 C   s   t t| jƒt| jƒB ƒS rU   )Úiterr»   r±   r°   rk   r%   r%   r)   Ú__iter__„  s    zImageFileDirectory_v2.__iter__c                 C   s   t  | j| |¡S rU   )ÚstructÚunpackr¡   )rb   ÚfmtrÁ   r%   r%   r)   r¦   ‡  s    zImageFileDirectory_v2._unpackc                 G   s   t j| j| g|¢R Ž S rU   )rê   Úpackr¡   )rb   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 rU   )Ú_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 rU   )r¦   rº   ©rb   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 rU   )rî   rÒ   )rì   rb   r%   r)   rË   ¬  r+   zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>©Újoin©rb   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Úshortr.   ÚlongÚbzsigned byteÚhzsigned shortÚlzsigned longri   ra   ÚdÚdoubler   Tc                 C   s   |S rU   r%   rü   r%   r%   r)   Ú	load_byte¿  s    zImageFileDirectory_v2.load_bytec                 C   s   |S rU   r%   ©rb   rÁ   r%   r%   r)   Ú
write_byteÃ  s    z ImageFileDirectory_v2.write_byter   c                 C   s"   |  d¡r|d d… }| dd¡S )Nó    rL   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    r.   c                    s   ˆ r| |fS t | |ƒS rU   ©rN   ©rf   r  ©r®   r%   r)   ÚcombineÖ  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3   s   | ]\}}ˆ ||ƒV  qd S rU   r%   ©r&   ÚnumÚdenom©r  r%   r)   rË   Ù  r+   z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   ©r¦   rº   r¾   Úzip©rb   rÁ   r®   Úvalsr%   ©r  r®   r)   Úload_rationalÒ  s    z#ImageFileDirectory_v2.load_rationalc                    s   d  ‡ fdd„|D ƒ¡S )Nr+   c                 3   s&   | ]}ˆ j d gt|dƒ¢R Ž V  qdS )Z2Ll   ÿÿ N)rî   rT   ©r&   rZ   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 rU   r%   rü   r%   r%   r)   Úload_undefinedá  s    z$ImageFileDirectory_v2.load_undefinedc                 C   s   |S rU   r%   r­   r%   r%   r)   Úwrite_undefinedå  s    z%ImageFileDirectory_v2.write_undefinedé
   c                    sV   |   t|ƒd › d�|¡}‡fdd„‰ t‡ fdd„t|d d d… |dd d… ƒD ƒƒS )	Nr    r  c                    s   ˆ r| |fS t | |ƒS rU   r  r  r  r%   r)   r  í  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   s   | ]\}}ˆ ||ƒV  qd S rU   r%   r  r  r%   r)   rË   ð  r+   z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   r  r  r%   r  r)   Úload_signed_rationalé  s    z*ImageFileDirectory_v2.load_signed_rationalc                    s   d  ‡ fdd„|D ƒ¡S )Nr+   c                 3   s(   | ] }ˆ j d gt|ddƒ¢R Ž V  qdS )Z2liÿÿÿi   €N)rî   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)rb   ÚfprÃ   Úretr%   r%   r)   Ú_ensure_readù  s    
ÿÿÿz"ImageFileDirectory_v2._ensure_readc              
   C   s  |   ¡  | ¡ | _�zÊt|  d|  |d¡¡d ƒD �]Ž}|  d|  |d¡¡\}}}}t || j¡j	}t
 |d¡}d|› d|› d	|› d|› d
�	}	z| j| \}
}W n* tyÊ   t |	d|› � ¡ Y q2Y n0 ||
 }|dk�r*| ¡ }|  d|¡\}|	d|› d|› �7 }	| |¡ t ||¡}| |¡ n|d |… }t|ƒ|k�rpt d|› dt|ƒ› d|› �¡ t |	¡ q2|�s‚t |	¡ q2|| j|< || j|< |	d|dk�r¬d| nt|ƒ 7 }	t |	¡ q2|  d|  |d¡¡\| _W n6 t�y }	 zt t|	ƒ¡ W Y d }	~	d S d }	~	0 0 d S )Nr  r   r   ÚHHL4sr/   Úunknownztag: ú (ú
) - type: ú)z - unsupported type r    r.   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r(  z. Skipping tag ú
 - value: r6   ú<table: %d bytes>)r¥   Útellr«   Úranger¦   r-  r   rµ   r£   r¶   r   Úgetr½   ÚKeyErrorÚloggerÚdebugÚseekr   Ú
_safe_readrº   rá   râ   r±   r¤   rž   r§   r*  rj   )rb   r+  ÚirÀ   rÂ   ÚcountrÁ   ÚtagnameÚtypnameÚmsgZ	unit_sizerÄ   rÃ   ÚhereÚoffsetr%   r%   r)   Úload  s^    
"


ÿÿþÿ



ÿ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| | g|¢R Ž }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fv �rÄt|ƒ}nt|ƒ}t|ƒdk�rø| |||| dd¡df¡ qF| ||||   d|¡|f¡ |t|ƒd d d 7 }qF|d u�r†|| \}}}}}|�rXt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  r/   r    zTag z, Type: z	, Value: rœ   s   II*    s   MM *   )r£   Úifdr/  zsave: r0  r1  r2  r3  r1   r4  r   r  r+   r.   r   z&multistrip support not yet implementedr   rñ   r.  s       ) rî   rº   r°   Úsortedr¸   ÚSTRIPOFFSETSr¤   r7  r9  r:  rž   r   rÚ   r`   r³   r¡   r™   Útobytesr¾   rø   rµ   r£   r¶   r   rj   rÞ   rÝ   rÖ   ÚappendÚljustÚNotImplementedErrorr¦   )rb   rC  ÚresultÚentriesZstripoffsetsrÀ   rc   rÂ   rä   r©   rE  rã   Zifd_tagZ	ifd_valuerÁ   r?  r@  rA  r>  r%   r%   r)   rH  9  sh     


 ÿ


.zImageFileDirectory_v2.tobytesc                 C   sN   |  ¡ dkr&| | j|  ddd¡ ¡ |  ¡ }|  |¡}| |¡ |t|ƒ S )Nr   ZHLé*   r$   )r5  ÚwriterŸ   rî   rH  rº   )rb   r+  rC  rL  r%   r%   r)   Úsave…  s    

zImageFileDirectory_v2.save)rš   NN)T)T)T)T)T)r   )2r“   r”   r•   r–   rd   r˜   rJ   rC  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IFDr  r  r  r  r   r"  r#  r$  r&  r'  r-  rD  rH  rP  r%   r%   r%   r)   r™   ¥  sx   <

P







øþÿ




	7
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|i |¤Ž d| _d S )NT)Úsuperrd   r¨   )rb   rt   Úkwargs©Ú	__class__r%   r)   rd   ®  s    zImageFileDirectory_v1.__init__c                 C   s   | j S rU   )r¯   rk   r%   r%   r)   rª   ²  r+   zImageFileDirectory_v1.<lambda>c                 C   s   | j S rU   )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`

        rI   )rJ   r±   r¤   r§   )ÚclsÚoriginalrE  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`

        rI   )r™   rJ   r³   r±   r¤   r°   )rb   rE  r%   r%   r)   Úto_v2Ë  s
    zImageFileDirectory_v1.to_v2c                 C   s   || j v p|| jv S rU   )r¯   r±   rÆ   r%   r%   r)   rÇ   Ü  s    z"ImageFileDirectory_v1.__contains__c                 C   s   t t| jƒt| jƒB ƒS rU   )rº   r»   r±   r¯   rk   r%   r%   r)   r¼   ß  s    zImageFileDirectory_v1.__len__c                 C   s   t t| jƒt| jƒB ƒS rU   )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È   )rb   rÀ   rc   r®   r%   r%   r)   rÉ   å  s    z!ImageFileDirectory_v1.__setitem__c                 C   sn   || j vrL| j| }| j| }| j| \}}dD ]}|  ||| ||ƒ|¡ q0| j | }t|ttfƒsj|f}|S r^  )r¯   r±   r¤   r½   rÈ   r`   r¾   r¿   )rb   rÀ   rÁ   rÂ   rÃ   rÄ   ÚlegacyrP   r%   r%   r)   rÅ   é  s    



z!ImageFileDirectory_v1.__getitem__)r“   r”   r•   r–   rd   r˜   ÚtagsZtagdatar³   Ú__annotations__Úclassmethodr\  r]  rÇ   r¼   ré   rÉ   rÅ   Ú__classcell__r%   r%   rX  r)   rU  ›  s   

rU  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‡ 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 rU   )Útag_v2rÀ   rV  rd   )rb   r+  ÚfilenamerX  r%   r)   rd     s    zTiffImageFile.__init__c                 C   s„   | j  d¡}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$   NrL   z*** TiffImageFile._open ***z- __first: z- ifh: r   )r+  r)  r™   re  rE  r§   Z_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_TiffImageFile__fpÚ
_frame_posÚ	_n_framesr9  r:  rž   Ú_seek)rb   r©   r%   r%   r)   Ú_open  s    

zTiffImageFile._openc                 C   sP   | j d u rJ|  ¡ }|  t| jƒ¡ | j d u r@|  |  ¡ d ¡ q"|  |¡ | j S )Nr   )rk  r5  rl  rº   rj  r;  )rb   Ú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_checkrl  r   Z_decompression_bomb_checkrÃ   ÚcoreÚnewÚmodeÚim©rb   Úframer%   r%   r)   r;  0  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v 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   )ri  r+  r5  rº   rj  rg  ÚEOFErrorr9  r:  rh  r;  rI  re  rD  r§   rk  Úis_animatedrU  r\  rÀ   rE  Ú_setuprt  r%   r%   r)   rl  ;  s:    
ÿÿÿ


zTiffImageFile._seekc                 C   s   | j S )zReturn the current frame number)rh  rk   r%   r%   r)   r5  _  s    zTiffImageFile.tellc                 C   s   d| j v 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   )re  Z_getxmprk   r%   r%   r)   Úgetxmpc  s    zTiffImageFile.getxmpc                    s   | j r| jr|  ¡ S tƒ  ¡ S rU   )ÚtileÚuse_load_libtiffÚ_load_libtiffrV  rD  rk   rX  r%   r)   rD  k  s    zTiffImageFile.loadc                 C   s–   | j rPtjtjtjtjtjtjtjdœ 	| j ¡}|d urP| j
 |¡| _
| j
j| _| js’d| _| j ¡  |  ¡ }tj ¡ D ]}||vr†qx| |¡ qxd S )N)r   r   r    r!   r"   r#   r$   T)Ú_tile_orientationr   ZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90r7  rs  Z	transposerÃ   Ú_sizerw  Ú!_close_exclusive_fp_after_loadingr+  r5  Zgetexifr   ÚTAGS_V2_GROUPSÚkeysÚget_ifd)rb   ÚmethodÚexifÚkeyr%   r%   r)   Úload_endp  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y–   d}Y n0 |r¤||d< t  | jd	t|ƒ| j¡}z| | j|¡ W n. tyü } ztd
ƒ|‚W Y d}~n
d}~0 0 | j�o| j }t| jdƒ�r<t d¡ | | j ¡ ¡\}}n\|�rnt d¡ |�s^| j d¡ | d¡\}}n*t d¡ | j d¡ | | j ¡ ¡\}}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   rD  Zload_preparerº   rz  r*  rR  Úhasattrr+  ÚosÚdupr‡  rˆ  Z_getdecoderrr  r¾   ZdecoderconfigÚsetimagers  rà   Z_exclusive_fprw  r9  r:  r  rŠ  r;  r)  Úreadonlyr†  Úclose)	rb   Zextentsrt   r+  ÚdecoderÚeZclose_self_fpÚnÚerrr%   r%   r)   r|  �  sT    
ÿ 





zTiffImageFile._load_libtiffc              
   C   sò  d| j v 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v �rrd}n|dk�r‚d}nd}|t|ƒ7 }|t|ƒk�r¶t|ƒdk�r¶|| }| j  t| jdk�rØ|dv �rØdnd¡}	t|ƒ|	k�rôtdƒ‚| j j|||||f}
t
 d|
› �¡ zt|
 \| _}W n: t�yd } z t
 d¡ tdƒ|‚W Y d}~n
d}~0 0 t
 d|› �¡ t
 d| j› �¡ | j| jd< | j  td¡}| j  t d¡}|�r:|�r:| j  t!¡}|dk�râ||f| jd< nX|dk�r|d  |d  f| jd< n6|du �r,||f| jd< ||f| jd!< n||f| jd!< d } }}g | _"t#�pZ| jd"k| _$| j$�r<|dk�rª|
dd… d |
dd…  }
t
 d|
› �¡ t|
 \| _}|d#k�r¸d$}d%|v �rÎ| %d%d&¡}d'|v �rä| %d'd&¡}|dk�r
| jd(k�r
| jdk�r
d)}|| jd*| j j&f}| j" 'd+dd||fd|f¡ �nTt(| j v �sTt)| j v �r~t(| j v �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 v �r¬| j t, | jd0< | jd1v �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    )r   r"   zunknown data organizationzformat key: z- unsupported formatzunknown pixel modeNz- raw mode: z- pil mode: Úcompressionr   ÚdpigR¸…ëQ@Ú
resolutionr   r0   úI;16Nz;16Bz;16Nz;16Lr   r=   Fr‰  r   r   r$   z- unsupported data organizationÚicc_profile©rA   rB   c                 S   s   g | ]}t |d  ƒ‘qS )r   r   )r&   r  r%   r%   r)   rÑ   ¯  r+   z(TiffImageFile._setup.<locals>.<listcomp>úRGB;Lr+   i  )3re  r*  ÚCOMPRESSION_INFOr7  ÚCOMPRESSIONÚ_compressionÚPLANAR_CONFIGURATIONÚ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERr9  r:  rÀ   rÍ   Ú
IMAGEWIDTHÚIMAGELENGTHr~  rÃ   ÚSAMPLEFORMATrº   rY   rX   ÚBITSPERSAMPLEÚEXTRASAMPLESÚSAMPLESPERPIXELr�   rJ   Ú	OPEN_INFOrr  r8  rÔ   ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITrz  ÚREAD_LIBTIFFr{  rÏ   rC  rI  rG  ÚTILEOFFSETSÚROWSPERSTRIPÚsumÚ
ICCPROFILEÚCOLORMAPr
   r   rÿ   Úpaletter}  )rb   ÚphotoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countZsamplesPerPixelr…  Úrawmoder’  ZxresZyresZresunitÚxÚyÚlayerrf   Úoffsetsr  ÚwrC  ÚstrideZtile_rawmoder³  r%   r%   r)   rx  ä  sü    



2

þú
 






ÿþý 

üÿ
zTiffImageFile._setupc                 C   sF   z8z| j | jkr| j  ¡  W n ty.   Y n0 W d | _ nd | _ 0 d S rU   )ri  r+  r�  ÚAttributeErrorrk   r%   r%   r)   Ú
_close__fp´  s    zTiffImageFile._close__fp)NN)r“   r”   r•   ÚformatÚformat_descriptionr  rd   rm  r˜   ro  r;  rl  r5  ry  rD  r†  r|  rx  r½  rc  r%   r%   rX  r)   rd  þ  s"   	
	$U Qrd  r-   r.   r<   rA   rB   r:   r0   r4   r8   r=   r?   r>   rC   ÚYCbCrrD   r;   r2   r5   r9   )r-   r.   r<   rA   rB   r3   r0   r4   r7   r=   r?   r>   rC   rÀ  rD   r;   r2   r5   r9   c           .      C   sŽ  zt | j \}}}}}}W n8 tyR }	 z td| j› d�ƒ|	‚W Y d }	~	n
d }	~	0 0 t|d�}
| j}| j}| d| j d¡¡}|d u rŒd}n|dkršd}n|dkr¦d	}t	p°|dk}t
| d
dƒ|
t< | jd |
t< | jd |
t< d|v rð|d }n:d|v �r&|d }t|tƒ�r*t ¡ }| |¡ |}ni }t dt|ƒ ¡ t|tƒ�rP| ¡ }|D ]l}t|tjƒ�r†|tj ¡ v �r†| |¡|
|< n| |¡|
|< z|j| |
j|< W n t�y¼   Y n0 �qTt| dƒ�rt t!t"t#t$t%fD ]2}|| j&v �rÞ| j&| |
|< | j&j| |
j|< �qÞ| d| j d¡¡}|�r4||
t'< t(dft!dft"dft!dft"dft dft)dft*dft+dft,dff
D ] \}}||v �rt|| |
|< �qt| d¡}|�rÆd|
t < |d |
t!< |d |
t"< |dk�rò||
t-< t.|ƒdk�ròt.|ƒ|
t/< |d u�r||
t0< |dk�r||
t1< t2|
v�r*||
t2< nŒ| jdv �r¶|
t2 dk�r¶| jdk�r¬|  3¡ }| ¡ }t4|j5ƒD ]:}t4|j6ƒD ](}|||f d k�r’dnd |||f< �qx�qj|} n
t7 8| ¡} | jd!v �ræ| j9 :d"d#¡}t;d$d%„ |D ƒƒ|
t<< t.|ƒ| jd |d  d& d'  }|�rX|dk�rdnt=t>| | jd ƒ}|dk�rbt=|d& d' d' | jd ƒ}n
| jd }|dk�rpd}|dk�r~dn|| }| jd | d | }||
t?< |d(k�rºtj@|
jtA< |f|d  || jd  ||d   f |
tA< t;t4d|| |ƒƒ|
tB< tC |d¡|
tD< | jd)k�rDtEd*tFd+i G¡ D ]\}}|
 H||¡ �q,tItJtKtLg} |�r:d,|v �rª|d, }!t|!tMƒ�rˆ|!dk �sˆ|!d-k�r�tNd.ƒ‚|dk�r¢tNd/ƒ‚|!|
tO< t d0¡ t d1tP|
 G¡ ƒ ¡ d}"t|d2ƒ�rz| Qd¡ tR S| T¡ ¡}"W n tUjV�y   Y n0 i }#| tFtAtBtWtXg7 } i }$|d |$t-< i }%t| d3ƒ�rN| jY ¡ }%i t
| di ƒ¥|%¥}&t1|&v �rr|&t1= tZ [|
 G¡ |& G¡ ¡D ]Ì\}}|tj\v�røtj]j^�s¨�q†||
jv �rÄ|
j| |#|< n4t|tMt_t`tfƒ�sÞ�q†nt a|¡jb}'|'�rø|'|#|< ||$v�r†|| v�r†t|t`ƒ�r.| cd4d5¡d6 |$|< n"t|tdƒ�rHt_|ƒ|$|< n||$|< �q†t1|$v �r€t.|$t1 ƒdk�r€|$t1 d |$t1< t d7tP|$ G¡ ƒ ¡ | jd8v �r¦d9}t|$ G¡ ƒ}(|( e¡  |||"||(|#f})t f| jd:|)|¡}	|	 g| j9d;| j ¡ |	 cd<¡\}*}+},|"�s| h|,¡ |+�rð�q�qð|+dk �rztd=|+› d>�ƒ‚n@| D ]}|
|= �q>|
 i|¡}-tj k| |dd;| j |-||dffg¡ d?|v �rŠ|
| _ld S )@Nzcannot write mode z as TIFFrI   r•  r   r   r   r   r   r   r   r   Ztiffinfor„  zTiffinfo Keys: %sre  r™  Údescriptionr—  Zx_resolutionZy_resolutionZresolution_unitZsoftwareÚ	date_timeZartistÚ	copyrightr–  r   r,   )r-   r.   r-   éÿ   rš  r=   r›  c                 s   s   | ]}|d  V  qdS )r   Nr%   rÊ   r%   r%   r)   rË   U  r+   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)r2   r0   r˜  r‰  r@   i @  zencoder error z when writing image fileÚ_debug_multipage)mÚ	SAVE_INFOrr  r8  r*  r™   ÚencoderinfoÚencoderconfigr7  rÔ   ÚWRITE_LIBTIFFrs   rŸ  rÃ   r£  r¤  r`   r¿   r   ZExifrD  r9  r:  rR  rU  r]  r   r€  r�  r‚  r¤   r¬   r‹  r¬  rª  r«  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKÚXMPre  r±  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTr¦  rº   r¨  r§  r¥  r¡  Úcopyr6  ÚheightÚwidthr	   Úinvertrs  Z
getpaletter¾   r²  rX   Ú
STRIP_SIZEr¯  rÚ   ÚSTRIPBYTECOUNTSrG  ÚCOMPRESSION_INFO_REVr�  ÚYCBCRSUBSAMPLINGÚREFERENCEBLACKWHITEr¸   Ú
setdefaultÚ	TILEWIDTHÚ
TILELENGTHr®  ÚTILEBYTECOUNTSrÍ   rà   ÚJPEGQUALITYrF  r;  rŒ  r�  r‡  ÚioÚUnsupportedOperationÚTRANSFERFUNCTIONÚSUBIFDrÀ   Ú	itertoolsÚchainZLIBTIFF_CORErp  Zlibtiff_support_custom_tagsra   rj   rµ   rÕ   rÐ   rN   ÚsortZ_getencoderrŽ  rO  rP  r   Ú_saverÈ  ).rs  r+  rf  rµ  rJ   r´  r¾  ÚbitsÚextrar’  rE  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À   rc   Z	blocklistrÆ  Ú_fpÚtypesZattsZ
legacy_ifdZsupplied_tagsrÕ   r`  rf   r  Úsr	  rC  r%   r%   r)   rê  Þ  s†   *




úö






*
""



ÿ
ÿþ
 
ÿ

û






ÿ
rê  c                   @   sÖ   e Zd Zg d¢Zh d£Zd1dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zejfdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd2d.d/„Zd0S )3ÚAppendingTiffWriter)r   r   r   r   r    r$   r   r   r   r    r$   r    r$   >   i   r   i  i  i	  r   Fc                 C   st   t |dƒr|| _d| _nD|| _d| _zt||r2dndƒ| _W n tyZ   t|dƒ| _Y n0 | j ¡ | _|  ¡  d S )Nr)  FTzw+bzr+b)	r‹  ri   Úclose_fpr¶   Úopenr*  r5  Ú	beginningÚsetup)rb   Úfnrq  r%   r%   r)   rd     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    TFrF   rœ   rE   r›   zInvalid TIFF file header)ri   r;  ró  rŒ  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPager)  ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)rb   rù  r%   r%   r)   rô    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   r;  rø  r)  rù  rü  ÚreadLongr÷  Ú	writeLongÚfixIFD)rb   rù  Ú	IFDoffsetr%   r%   r)   Úfinalize2  s    


zAppendingTiffWriter.finalizec                 C   s   |   ¡  |  ¡  d S rU   )r  rô  rk   r%   r%   r)   ÚnewFrameI  s    zAppendingTiffWriter.newFramec                 C   s   | S rU   r%   rk   r%   r%   r)   Ú	__enter__N  s    zAppendingTiffWriter.__enter__c                 C   s   | j r|  ¡  dS )NF)rñ  r�  )rb   Úexc_typeÚ	exc_valueÚ	tracebackr%   r%   r)   Ú__exit__Q  s    zAppendingTiffWriter.__exit__c                 C   s   | j  ¡ | j S rU   )ri   r5  rø  rk   r%   r%   r)   r5  V  s    zAppendingTiffWriter.tellc                 C   s*   |t jkr|| j7 }| j ||¡ |  ¡ S rU   )rŒ  rö  rø  ri   r;  r5  )rb   rC  Úwhencer%   r%   r)   r;  Y  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   r1   )ri   r;  rŒ  ÚSEEK_ENDr5  rO  r¿   rø  )rb   ÚposZpadBytesr%   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)rb   r  r%   r%   r)   rû  j  s    zAppendingTiffWriter.setEndianc                 C   sP   |   ¡ }|dkr"| j ¡ d | _qL| j |¡ |  ¡ }| j |d tj¡ q d S )Nr   r    r/   )rÿ  ri   r5  r÷  r;  Ú	readShortrŒ  ÚSEEK_CUR)rb   r  ÚnumTagsr%   r%   r)   rý  p  s    zAppendingTiffWriter.skipIFDsc                 C   s   | j  |¡S rU   )ri   rO  r  r%   r%   r)   rO  {  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 rG   )rê   rë   r  ri   r)  r­   r%   r%   r)   rÿ  ‚  s    zAppendingTiffWriter.readLongc                 C   sJ   | j  dtj¡ | j  t | j|¡¡}|d urF|dkrFtd|› d�ƒ‚d S )Néþÿÿÿr    úwrote only ú bytes but wanted 4©	ri   r;  rŒ  r  rO  rê   rí   r  rü  ©rb   rc   ZbytesWrittenr%   r%   r)   ÚrewriteLastShortToLong†  s    z*AppendingTiffWriter.rewriteLastShortToLongc                 C   sJ   | j  dtj¡ | j  t | j|¡¡}|d urF|dkrFtd|› d�ƒ‚d S )Nr  r   r  ú bytes but wanted 2)	ri   r;  rŒ  r  rO  rê   rí   r  rü  r  r%   r%   r)   ÚrewriteLastShortŒ  s    z$AppendingTiffWriter.rewriteLastShortc                 C   sJ   | j  dtj¡ | j  t | j|¡¡}|d u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 ur6|dkr6td|› d�ƒ‚d S )Nr   r  r  )ri   rO  rê   rí   r  rü  r  r%   r%   r)   Ú
writeShort˜  s    zAppendingTiffWriter.writeShortc                 C   s:   | j  t | j|¡¡}|d ur6|dkr6td|› d�ƒ‚d S )Nr    r  r  )ri   rO  rê   rí   r  rü  r  r%   r%   r)   r   �  s    zAppendingTiffWriter.writeLongc                 C   s   |   ¡  | j ¡  d S rU   )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v ræ| j ¡ }
|r¬| j||dk|dkd� | j |
d ¡ n0| j |	¡ | j||dk|dkd� | j |
¡ d  }	}
q|r| j dtj¡ qd S )Nr$   r    r   )ÚisShortÚisLong)r  r6  rê   rë   r  ri   r)  Ú
fieldSizesrÿ  rø  r  ÚTagsr5  Ú
fixOffsetsr;  rŒ  r  )rb   r  r=  rÀ   Z	fieldTyper>  Z	fieldSizeZ	totalSizeZisLocalrC  ZcurPosr%   r%   r)   r  ¦  s2    




ÿÿ
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ü  r6  r  rÿ  rø  r  ri   r;  rŒ  r  r  r   rÚ   r  r  )rb   r>  r  r   r=  rC  r%   r%   r)   r#  É  s    

zAppendingTiffWriter.fixOffsetsN)F)FF)r“   r”   r•   r!  r"  rd   rô  r  r  r  r	  r5  rã  rö  r;  rþ  rû  rý  rO  r  rÿ  r  r  r  r  r   r�  r  r#  r%   r%   r%   r)   rð  ó  s0   

#rð  c              	   C   sð   | j  ¡ }| j}t| dg ¡ƒ}t| dƒs:|s:t| ||ƒS |  ¡ }zœt|ƒ�v}| g| D ]Z}||_ ||_t|dƒsxd}	n|j	}	t
|	ƒD ]*}
| |
¡ | ¡  t|||ƒ | ¡  q†qXW d   ƒ n1 sÈ0    Y  W |  |¡ n|  |¡ 0 d S )NÚappend_imagesro  r   )rÊ  rÕ  rË  rR  r7  r‹  rê  r5  rð  ro  r6  r;  rD  r  )rs  r+  rf  rÊ  rË  r$  Zcur_idxÚtfZimsZnfrrõ   r%   r%   r)   Ú	_save_allá  s(    



,r&  z.tifz.tiffz
image/tiff)drã  rç  ÚloggingrŒ  rê   rá   Úcollections.abcr   Ú	fractionsr   Únumbersr   r   Ú r   r   r	   r
   r   Ú_binaryr   r   Ú	getLoggerr“   r9  r­  rÌ  ZIFD_LEGACY_APIrÙ  r¢   r    r£  r¤  r¦  r�  r¡  r¢  rÐ  rG  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©  rH   rK   rT   r[   r½   rø   rN   r™   rõ   r¶   rÏ   ÚsetattrrU  ZImageFileDirectoryrd  rÉ  rê  rð  r&  Zregister_openr¾  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer%   r%   r%   r)   Ú<module>)   sè  
î�v   o\   Më   o