a
    Sic:&                    @   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 eLM 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de#dOdLddvdLfde"dOdLddzdfde#dOdLddzdfde"dOdLdd}dfde#dOdLdd}dfde"dOdLddvdSfdwe#dOdLddvdSfdwe"dOdLddzdfde#dOdLddzdfde"dOdLdd}dfde#dOdLdd}dfde"dOdLddvdfdwe#dOdLddvdfdwe"dOdLdddMfde#dOdLdddMfde"dOdLdddMfde#dOdLdddMfde"dOdLdddxfde#dOdLdddxfde"dOdLdddLfde#dOdLdddLfde"dOdLdddSfde#dOdLdddSfde"ddLddLdMfde#ddLddLdMfde"ddLdOdLdMfde#ddLdOdLdMfde"ddLddSdMfde#ddLddSdMfde"ddLdOdSdMfde#ddLdOdSdMfde"ddLddXdMfde#ddLddXdMfde"ddLdOdXdMfde#ddLdOdXdMfde"ddLdd]dMfde#ddLdd]dMfde"ddLddqdSfde#ddLddqdSfde"ddLdOd]dMfde#ddLdOd]dMfde"ddLddvdMfde#ddLddvdMfde"ddLddzdxfde#ddLddzdxfde"ddLdd}d{fde#ddLdd}d{fde"ddLdddMfde"ddLddsdMfde#ddLddsdMfde"ddLddsdMfde#ddLddsdMfdipZOg dZPdd ZQdd ZRdd ZSi ZTi ZUG dd deZVG dd deZWeTeW_TeUeW_UeM D ]B\ZXZYeYZddZYe[eWdeY eTeX d  e[eWdeY eUeX  	q[T[U[X[YG dd deWZ\e\Z]G dd dejZ^de"dddLdfde"ddd]dfde"dddqdOfde"ddd]dfde"dddqdOfde"ddOdkdfde"dddddfde"ddOdddfde"dddkdfde"dOddsdfde"dOddvd fde"dOddvdOfde"dddvdfde"dddsdfde"dddsdfde#ddOdkdfde#dddddfde#ddOdddfde#dddkdfd͜Z_ddτ Z`G ddф dуZaddӄ Zbece^jde^eQ eee^jde` efe^jdeb ege^jdddg ehe^jdd֡ dS )    N)MutableMapping)Fraction)NumberRational   )Image	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8TYPESFT   s   IIs   MM   i  i  i  i  i
  i    i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  B  C  D  iE  iJ  iR  iS  i[    i  i  i  I  is  ii    i  i  i  rawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzw	tiff_jpegjpegtiff_adobe_deflateZtiff_raw_16packbitsZtiff_thunderscantiff_deflateZtiff_sgilogZtiff_sgilog24lzmazstdwebp)r                        i  i  i)  i  it  iu  im  iP  iQ  c                 C   s   i | ]\}}||qS  r+   ).0kvr+   r+   O/var/www/html/django/DPS/env/lib/python3.9/site-packages/PIL/TiffImagePlugin.py
<dictcomp>       r0   r   r+   )1z1;Ir$   )r3   z1;IR)r3   r3   )r3   z1;R)r$   )LzL;2I)r4   zL;2IR)r4   zL;2)r4   zL;2R)r&   )r4   zL;4I)r4   zL;4IR)r4   zL;4)r4   zL;4R)r*   )r4   zL;I)r4   zL;IR)r4   r4   )r4   zL;R)   )I;16zI;12)   )r6   r6   )I;16Br8   )r6   zI;16R)II;16S)r9   I;16BS)r%   )    )FF;32F)r=   F;32BF)r9   zI;32N)r9   I;32S)r9   I;32BS)r*   r*   )LArB   )r*   r*   r*   )RGBrC   )rC   zRGB;R)r*   r*   r*   r*   )RGBArD   )r   )RGBXrE   )r*   r*   r*   r*   r*   r   r   )rE   ZRGBXX)r*   r*   r*   r*   r*   r*   )r   r   r   )rE   ZRGBXXX)rD   RGBa)r   r   )rD   ZRGBaX)r   r   r   )rD   ZRGBaXX)r$   r   )rD   ZRGBAX)r$   r   r   )rD   ZRGBAXX)i  )r7   r7   r7   )rC   zRGB;16L)rC   zRGB;16B)r7   r7   r7   r7   )rD   zRGBA;16L)rD   zRGBA;16B)rE   zRGBX;16L)rE   zRGBX;16B)rD   zRGBa;16L)rD   zRGBa;16Br%   )PzP;1)rH   zP;1R)rH   zP;2)rH   zP;2R)rH   zP;4)rH   zP;4R)rH   rH   )PArI   )rH   zP;Rr'   )CMYKrJ   )rJ   ZCMYKX)rJ   ZCMYKXX)rJ   zCMYK;16Lr(   )rC   rE   r*   )LABrK   )   MM *   II* s   MM* s   II *s   MM +s   II+ c                 C   s   | d d t v S Nr&   )PREFIXESprefixr+   r+   r/   _accept  s    rR   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[   rT   max)rW   rX   min_valfracrZ   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 )4rU   zImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )
_numerator_denominator_valr   c                 C   s   t |tr&|j| _|j| _|j| _dS t |trB|j| _|j| _n|| _|| _|dkrbtd| _n |dkrvt|| _nt||| _dS )z
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   nanr   )	
isinstancerU   r]   rd   r^   re   rf   r   float)selfvaluer^   r+   r+   r/   __init__:  s    


zIFDRational.__init__c                 C   s   | j S r\   )rd   rj   r+   r+   r/   r]   T  s    zIFDRational.numeratorc                 C   s   | j S r\   )re   rm   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   limit_denominator)rj   max_denominatorfr+   r+   r/   rV   \  s    
zIFDRational.limit_rationalc                 C   s   t t| jS r\   )strri   rf   rm   r+   r+   r/   __repr__i  s    zIFDRational.__repr__c                 C   s
   | j  S r\   )rf   __hash__rm   r+   r+   r/   rs   l  s    zIFDRational.__hash__c                 C   s0   | j }t|tr|j }t|tr(t|}||kS r\   )rf   rh   rU   ri   )rj   otherrW   r+   r+   r/   __eq__o  s    

zIFDRational.__eq__c                 C   s   | j | j| jgS r\   )rf   rd   re   rm   r+   r+   r/   __getstate__w  s    zIFDRational.__getstate__c                 C   s,   t | d |\}}}|| _|| _|| _d S )Nr   )rU   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 r\   )getattrrf   )rj   argsopr+   r/   delegate  s    z'IFDRational._delegate.<locals>.delegater+   )r|   r}   r+   r{   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^   rV   rr   rs   ru   rv   rx   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+   r+   r+   r/   rU   ,  sP   


rU   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u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*   r4   r&   F)rR   SyntaxErrorrepr_prefixMM_endianII_bigtiffgrouptagtypereset_unpacknext_legacy_api)rj   ifhrQ   r   r+   r+   r/   rl     s    

,zImageFileDirectory_v2.__init__c                 C   s   | j S r\   )r   rm   r+   r+   r/   <lambda>  r1   zImageFileDirectory_v2.<lambda>c                 C   s   | j S r\   )_offsetrm   r+   r+   r/   r     r1   c                 C   s   | j S r\   )r   rm   r+   r+   r/   r     r1   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 r\   )_tags_v1_tags_v2_tagdatar   _nextr   rm   r+   r+   r/   r     s    zImageFileDirectory_v2.resetc                 C   s   t t| S r\   )rq   dictrm   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   rm   r+   r/   r0     s   z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsrm   r+   rm   r/   named  s    
zImageFileDirectory_v2.namedc                 C   s   t t| jt| jB S r\   )lensetr   r   rm   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 r\   )r   r   r   _load_dispatchr   rh   tuplebytes)rj   tagdatatypsizehandlerrW   r+   r+   r/   __getitem__'  s    



z!ImageFileDirectory_v2.__getitem__c                 C   s   || j v p|| jv S r\   )r   r   rj   r   r+   r+   r/   __contains__2  s    z"ImageFileDirectory_v2.__contains__c                 C   s   |  ||| j d S r\   )_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vrp jrN j| j|< n"tj	| j|< t
dd |D rt
dd |D rtjntj| j|< nt
dd |D rt
dd |D rtj| j|< nDt
dd |D rtj| j|< n$t
dd |D rtjntj| j|< ndt
dd |D r.tj| j|< nBt
d	d |D rPtj| j|< n t
d
d |D rptj| j|< | j| tj	krdd |D }n | j| tjkrdd |D }| j| tjkot|t}|st fdd|D }|r| jn| j}|s jdks@| j| tjks@ jd u rt|dkr|s|rd| j| tjtjfv rd|f}z|\||< W n< ty   td| dt| d |d ||< Y n0 n|||< d S )Nc                 s   s   | ]}t |tV  qd S r\   )rh   rU   r,   r.   r+   r+   r/   	<genexpr>C  r1   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS r   Nr+   r   r+   r+   r/   r   F  r1   c                 s   s   | ]}t |tV  qd S r\   )rh   intr   r+   r+   r/   r   I  r1   c                 s   s&   | ]}d |  kodk n  V  qdS )r   r   Nr+   r   r+   r+   r/   r   J  r1   c                 s   s&   | ]}d |  k odk n  V  qdS )i i   Nr+   r   r+   r+   r/   r   L  r1   c                 s   s   | ]}|d kV  qdS r   r+   r   r+   r+   r/   r   Q  r1   c                 s   s   | ]}t |tV  qd S r\   )rh   ri   r   r+   r+   r/   r   T  r1   c                 s   s   | ]}t |tV  qd S r\   )rh   rq   r   r+   r+   r/   r   V  r1   c                 s   s   | ]}t |tV  qd S r\   )rh   r   r   r+   r+   r/   r   X  r1   c                 S   s&   g | ]}t |tr|d dn|qS )asciireplace)rh   rq   encoder   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   a  r1   c                 3   s   | ]}  |V  qd S r\   )cvt_enumr,   rk   infor+   r/   r   e  r1   r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   rq   r   r   r   rh   r   type	UNDEFINEDallRATIONAL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 r\   )r   popr   r   r   r+   r+   r/   __delitem__  s    z!ImageFileDirectory_v2.__delitem__c                 C   s   t t| jt| jB S r\   )iterr   r   r   rm   r+   r+   r/   __iter__  s    zImageFileDirectory_v2.__iter__c                 C   s   t | j| |S r\   )structunpackr   )rj   fmtr   r+   r+   r/   r     s    zImageFileDirectory_v2._unpackc                 G   s   t j| j| g|R  S r\   )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   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 r\   )_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 r\   )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 )Nr1   c                 3   s   | ]}  |V  qd S r\   )r   r   )r   rj   r+   r/   r     r1   zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrj   r   )r   rm   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shortr4   longbzsigned bytehzsigned shortlzsigned longrp   ri   ddoubler   Zlong8r   Tc                 C   s   |S r\   r+   r  r+   r+   r/   	load_byte  s    zImageFileDirectory_v2.load_bytec                 C   s   |S r\   r+   rj   r   r+   r+   r/   
write_byte  s    z ImageFileDirectory_v2.write_byter$   c                 C   s"   | dr|d d }|ddS )N    rS   zlatin-1r   )endswithdecoder  r+   r+   r/   load_string  s    
z!ImageFileDirectory_v2.load_stringc                 C   s   d| dd d S )Nr1   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&   r4   c                    s    r| |fS t | |S r\   rU   ar  r   r+   r/   combine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3   s   | ]\}} ||V  qd S r\   r+   r,   numdenomr#  r+   r/   r     r1   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 )Nr1   c                 3   s&   | ]} j d gt|dR  V  qdS )Z2Ll    N)r   r[   r,   rb   rm   r+   r/   r     s   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r
  r  r+   rm   r/   write_rational  s    z$ImageFileDirectory_v2.write_rationalr)   c                 C   s   |S r\   r+   r  r+   r+   r/   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc                 C   s   |S r\   r+   r   r+   r+   r/   write_undefined  s    z%ImageFileDirectory_v2.write_undefined
   c                    sV   |  t|d  d|}fdd t fddt|d d d |dd d D S )	Nr&   r  c                    s    r| |fS t | |S r\   r  r   r"  r+   r/   r#    s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   s   | ]\}} ||V  qd S r\   r+   r$  r'  r+   r/   r     r1   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 )Nr1   c                 3   s(   | ] } j d gt|ddR  V  qdS )Z2lii   N)r   rc   r.  rm   r+   r/   r     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r
  r  r+   rm   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)rj   fpr   retr+   r+   r/   _ensure_read  s    
z"ImageFileDirectory_v2._ensure_readc              
   C   s  |    | | _z8| jr0| d| |dn| d| |dd }t|D ]}| jrp| d| |dn| d| |d	\}}}}t|| j	j
}t|d
}	d| d| d|	 d| d	}
z| j| \}}W n, ty   t|
d|   Y qPY n0 || }|| jrdndkr|| }| | jr<dnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 qP|st|
 qP|| j|< || j|< |
d|dkrd| nt| 7 }
t|
 qP| jr2| d| |dn| d| |d\| _W n6 ty }
 ztt|
 W Y d }
~
d S d }
~
0 0 d S )Nr   r*   r  r$   r   ZHHQ8s   HHL4sr5   unknownztag:  (
) - type: )z - unsupported type r&   r4   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r5  z. Skipping tag 
 - value: r<   <table: %d bytes>)r   tellr   r   r   r:  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readr   r   r   r   r   r   r   r7  rq   )rj   r8  Z	tag_countir   r   countr   tagnametypnamemsg	unit_sizer   r   hereoffsetr+   r+   r/   load  st    








zImageFileDirectory_v2.loadr   c                 C   s   |  dt| j}g }|t| t| jd  d }d }t| j D ]\}}|tkr`t|}| j|}t	d| d| dt
|  |tjkot|t}|r| jdkrd}	nd	}	t|	|d
}
| j| }| D ]\}}||
|< q|
|}n,t|tr|n|f}| j| | g|R  }t|| jj}|r:dn
t|d}d| d| d| d| d	}|dt|dkrdt| nt| 7 }t	| |rd}n(|tjtjtjfv rt|}nt|}t|dkr|||||dddf qF|||||  d||f |t|d d d 7 }qF|d ur|| \}}}}}|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  r5   r&   zTag z, Type: z	, Value: r   s   II*    s   MM *   )r   ifdr=  zsave: r>  r?  r@  rA  r7   rB  r   r  r1   r4   r$   z&multistrip support not yet implementedr   r   r<  s       ) r   r   r   sortedr   STRIPOFFSETSr   rE  rG  rH  r   r   r   rh   r   r   r   tobytesr   r  r   r   r   r   rq   r   r   r   appendljustNotImplementedErrorr   )rj   rR  resultentriesZstripoffsetsr   rk   r   r   r   rT  r   ifd_tagZ	ifd_valuer   rM  rN  rO  rL  r+   r+   r/   rW  P  sh     


 


.zImageFileDirectory_v2.tobytesc                 C   sN   |  dkr&|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r*   )rC  writer   r   rW  r   )rj   r8  rR  r[  r+   r+   r/   save  s    

zImageFileDirectory_v2.save)r   NN)T)T)T)T)T)r   )3r   r   r   r   rl   r   rQ   rR  r   setterr   r   r   r   r   r   r   r   r   r   r   r   r  r  r  listmapr   r   r   SIGNED_BYTEr   r   FLOATr   IFDLONG8r  r  r  r  r-  r/  r0  r1  r3  r4  r:  rS  rW  r`  r+   r+   r+   r/   r     sz   <

P













	D
Lr   r   r   r   Zwrite_c                       s~   e Zd ZU dZ fddZedd Zedd Zee	d< e
dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Z  ZS )ImageFileDirectory_v1a  This class represents the **legacy** interface to a TIFF tag directory.

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

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

    Also contains a dictionary of tag types as read from the tiff image file,
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    c                    s   t  j|i | d| _d S )NT)superrl   r   )rj   rz   kwargs	__class__r+   r/   rl     s    zImageFileDirectory_v1.__init__c                 C   s   | j S r\   )r   rm   r+   r+   r/   r     r1   zImageFileDirectory_v1.<lambda>c                 C   s   | j S r\   )r   rm   r+   r+   r/   r     r1   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`

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

        rP   )r   rQ   r   r   r   r   )rj   rT  r+   r+   r/   to_v2  s
    zImageFileDirectory_v1.to_v2c                 C   s   || j v p|| jv S r\   )r   r   r   r+   r+   r/   r     s    z"ImageFileDirectory_v1.__contains__c                 C   s   t t| jt| jB S r\   )r   r   r   r   rm   r+   r+   r/   r     s    zImageFileDirectory_v1.__len__c                 C   s   t t| jt| jB S r\   )r   r   r   r   rm   r+   r+   r/   r     s    zImageFileDirectory_v1.__iter__c                 C   s   dD ]}|  ||| qd S N)FT)r   )rj   r   rk   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 rq  )r   r   r   r   r   rh   r   r   )rj   r   r   r   r   r   legacyrW   r+   r+   r/   r      s    



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   rl   r   tagsZtagdatar   __annotations__classmethodro  rp  r   r   r   r   r   __classcell__r+   r+   rk  r/   rh    s   

rh  c                       s   e Zd ZdZdZdZd fdd	Zdd Zed	d
 Z	dd Z
dd Zdd Zdd Zdd Z fddZdd Zdd Zdd Z  ZS )TiffImageFileZTIFFz
Adobe TIFFFNc                    s   d | _ d | _t || d S r\   )tag_v2r   ri  rl   )rj   r8  filenamerk  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   NrS   z*** TiffImageFile._open ***z- __first: z- ifh: r   )r8  r6  r   rx  rT  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesrG  rH  r   _seek)rj   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   )r~  rC  r  r   r}  rI  )rj   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)	_seek_checkr  r   _decompression_bomb_checkr   corenewmodeimrj   framer+   r+   r/   rI  I  s
    

zTiffImageFile.seekc                 C   sD  | 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 rd| _n
| jj| _| jdkr|d | _t| jdkr| jdk| _|  j	d7  _	q| j
| j|  | j| j |   t| j | _| _|| _	|   d S )	Nzno more images in TIFF filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %sr   r   )r|  r8  rC  r   r}  rz  EOFErrorrG  rH  r{  rI  rX  rx  rS  r   r~  is_animated_reload_exifrh  ro  r   rT  _setupr  r+   r+   r/   r  T  s<    



zTiffImageFile._seekc                 C   s   | j S )zReturn the current frame number)r{  rm   r+   r+   r/   rC  y  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   )rx  _getxmprm   r+   r+   r/   getxmp}  s    zTiffImageFile.getxmpc                 C   s   i }| j d}|r|dd dkrt|dd }t|d d d d }t|d| d|  }|d| d| |  }d	|i||< |td| | d d d }q|S )
a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        r   Nr&   s   8BIMr(   r   r$   r2  r   )rx  rE  i16mathceili32)rj   blocksrW   idnr   r   r+   r+   r/   get_photoshop_blocks  s    $z"TiffImageFile.get_photoshop_blocksc                    s   | j r| jr|  S t  S r\   )tileuse_load_libtiff_load_libtiffri  rS  rm   rk  r+   r/   rS    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 ur^| j|| _| jj| _| jsd| _| j  |  }tj D ]}||vrq|| qd S )N)r$   r%   r&   r'   r(   r)   r*   T)_tile_orientationr   	TransposeFLIP_LEFT_RIGHT
ROTATE_180FLIP_TOP_BOTTOM	TRANSPOSE
ROTATE_270
TRANSVERSE	ROTATE_90rE  r  	transposer   _sizer  !_close_exclusive_fp_after_loadingr8  rC  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 }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 \}}|rzt	| W n ty   Y n0 g | _d| _|   |r| j  d| _|dk rt|t j | S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r%   filenoflushFr$   libtiffzCouldn't set the imageNgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   rS  load_preparer   r  r7  rb  hasattrr8  osdupr  r  _getdecoderr  r   decoderconfigsetimager  r   _exclusive_fpr  rG  rH  r  r  rI  r6  closereadonlyr  )	rj   extentsrz   r8  decodereZclose_self_fpr  errr+   r+   r/   r    s^    
 





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rd}nd}|t|7 }t|}	| j t| jdkr|dv rdnd}
|
|	k r|d|
 }n|
|	kr|	dkr||
 }t||
krtd| j j|||||f}t
d|  zt| \| _}W n: ty| } 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}|rR|rR| j t!}|dkr||f| jd< nX|dkr|d  |d  f| jd< n6|du rD||f| jd< ||f| jd!< n||f| jd!< d } }}g | _"t#pr| jd"k| _$| j$rT|dkr|dd d |dd  }t
d|  t| \| _}|d#krd$}d%|v r|%d%d&}d'|v r|%d'd&}|dkr"| jd(kr"| jdkr"d)}|| jd*| j j&f}| j"'d+dd||fd|f nTt(| j v slt)| j v rt(| 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rd||  }}|| jd krd }}|d7 }qnt
d/ tdt,| j v r| j t, | jd0< | jd1v rd2d3 | j t- D }t./d4d50|| _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: r2   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   r6   I;16Nz;16Bz;16Nz;16Lr   rC   Fr  r   r   r*   z- unsupported data organizationicc_profilerH   rI   c                 S   s   g | ]}t |d  qS r   r   )r,   r  r+   r+   r/   r     r1   z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr1   i  )3rx  r7  COMPRESSION_INFOrE  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERrG  rH  r   r   
IMAGEWIDTHIMAGELENGTHr  r   SAMPLEFORMATr   r`   r_   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELr   rQ   	OPEN_INFOr  rF  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   rR  rX  rV  TILEOFFSETSROWSPERSTRIPsum
ICCPROFILECOLORMAPr
   r   r  paletter  )rj   photoZ	fillorderxsizeysizeZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr  rawmoder  ZxresZyresZresunitxylayerr!  offsetsr  wrR  strideZtile_rawmoder  r+   r+   r/   r    s   



2



 






 


zTiffImageFile._setup)NN)r   r   r   formatformat_descriptionr  rl   r  r   r  rI  r  rC  r  r  rS  r  r  r  rv  r+   r+   rk  r/   rw    s    	
	%	[rw  r3   r4   rB   rH   rI   r@   r6   r:   r>   rC   rE   rD   rJ   YCbCrrK   rA   r8   r;   r?   )r3   r4   rB   rH   rI   r9   r6   r:   r=   rC   rE   rD   rJ   r  rK   rA   r8   r;   r?   c           1      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}z|d }W n, ty   | jd}t	|t
rd }Y n0 |d u rd}n|dkrd}n|dkrd	}tp|dk}d
|
t< | jd |
t< | jd
 |
t< d|v r|d }n:d|v rF|d }t	|trJt }|| |}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r2t t!t"t#t$t%fD ]2}|| j&v r| j&| |
|< | j&j| |
j|< q|d| jd}|rT||
t'< t(dft!dft"dft!dft"dft dft)dft*dft+dft,dff
D ] \}}||v r|| |
|< q|d}|rd|
t < |d |
t!< |d
 |
t"< |dkr||
t-< t.|d
krt.||
t/< |d ur$||
t0< |d
kr6||
t1< t2|
vrJ||
t2< n| jdv r|
t2 dkr| jdkr| 3 }| }t4|j5D ]:}t4|j6D ](}|||f dkrdnd|||f< qq|} n
t78| } | jd v rP| j9:d!d"}g }t.|d# }t4d#D ]>}|d$d% ||| ||d
   D 7 }|dgd&|  7 }q||
t;< t.|| jd |d  d' d(  }|r|dkrd
nt<t=| | jd
 }|dkrt<|d' d( d( | jd
 }n
| jd
 }|dkrd
}|dkrd
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rtEd+tFd,iG D ]\}!}"|
H|!|" qtItJtKtLg}#|rd-|v r|d- }$t	|$t
r|$dk s|$d.krtMd/|dkrtMd0|$|
tN< td1 td2tO|
G   d}%t|d3rxz|Pd tQR|S }%W n tTjUyv   Y n0 i }&|#tFt@tBtVtWg7 }#t-|d i}'i }(t| d4r| jX }(i tY| di |(})t1|)v r|)t1= tZ[|
G |)G D ]\}!}"|!tj\vr^tj]j^sq|!|
jv r*|
j|! |&|!< n4t	|"t
t_t`tfsDqnta|!jb}*|*r^|*|&|!< |!|'vr|!|#vrt	|"t`r|"cd5d6d7 |'|!< n"t	|"tdrt_|"|'|!< n|"|'|!< qt1|'v rt.|'t1 d
kr|'t1 d |'t1< td8tO|'G   | jd9v rd:}t|'G }+|+e  |||%||+|&f},tf| jd;|,|}	|	g| j9d<| j  |	cd=\}-}.}/|%sv|h|/ |.rVqqV|.dk rtd>|. d?n@|#D ]}!|
|!= q|
i|}0tjk| |dd<| j |0||d
ffg d@|v r|
| _ld S )ANzcannot write mode z as TIFFrP   r  r   r   r   r    r   r   r   Ztiffinfor  zTiffinfo Keys: %srx  r  descriptionr  x_resolutionZy_resolutionresolution_unitsoftware	date_timeartist	copyrightr  r$   r2   )r3   r4   r3      r  rC   r  r%   c                 S   s   g | ]}|d  qS r  r+   r   r+   r+   r/   r     r1   z_save.<locals>.<listcomp>r   r)   r*   r   r  )r   r   )r   r     r  r  r  qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  r   r   r   r  zConverted items: %s)r8   r6   r  r  rF   i @  zencoder error z when writing image file_debug_multipage)m	SAVE_INFOr  rF  r7  r   encoderinfoencoderconfigr   rE  rh   r   WRITE_LIBTIFFr  r   r  r  r   r   ExifrS  rG  rH  rb  rh  rp  r   r  r  r  r   r   r  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPrx  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  r   r  r  r  r  copyrD  heightwidthr	   invertr  
getpaletter  r_   
STRIP_SIZEr  r   STRIPBYTECOUNTSr   rV  COMPRESSION_INFO_REVr  YCBCRSUBSAMPLINGREFERENCEBLACKWHITEr   
setdefault	TILEWIDTH
TILELENGTHr  TILEBYTECOUNTSr   JPEGQUALITYrU  rI  r  r  r  ioUnsupportedOperationTRANSFERFUNCTIONSUBIFDr   ry   	itertoolschainLIBTIFF_COREr  libtiff_support_custom_tagsri   rq   r   r   r   rU   sort_getencoderr  r_  r`  r   _saver  )1r  r8  ry  r  rQ   r  r  bitsextrar  rT  r  r  r  r  r   r  r  iccr   r  Zinverted_impxr  r  lutcolormapcolorsrK  r  Zrows_per_stripZstrip_byte_countsZstrips_per_imager   rk   Z	blocklistr  r|  typesZattsZ
legacy_ifdZsupplied_tagsr   rs  r!  r  sr  rR  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 )Nr6  FTzw+bzr+b)	r  rp   close_fpr   openr7  rC  	beginningsetup)rj   fnr  r+   r+   r/   rl   H  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&   TFrM   r   rL   r   zInvalid TIFF file header)rp   rI  r-  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager6  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rj   iimmr+   r+   r/   r.  V  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)r4  rp   rI  r2  r6  r3  r6  readLongr1  	writeLongfixIFD)rj   r9  
ifd_offsetr+   r+   r/   finalizen  s    


zAppendingTiffWriter.finalizec                 C   s   |    |   d S r\   )r>  r.  rm   r+   r+   r/   newFrame  s    zAppendingTiffWriter.newFramec                 C   s   | S r\   r+   rm   r+   r+   r/   	__enter__  s    zAppendingTiffWriter.__enter__c                 C   s   | j r|   dS )NF)r+  r  )rj   exc_type	exc_value	tracebackr+   r+   r/   __exit__  s    zAppendingTiffWriter.__exit__c                 C   s   | j  | j S r\   )rp   rC  r2  rm   r+   r+   r/   rC    s    zAppendingTiffWriter.tellc                 C   s*   |t jkr|| j7 }| j|| |  S r\   )r  r0  r2  rp   rI  rC  )rj   rR  whencer+   r+   r/   rI    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   r7   )rp   rI  r  SEEK_ENDrC  r_  r   r2  )rj   posZ	pad_bytesr+   r+   r/   r8    s    
zAppendingTiffWriter.goToEndc                 C   s.   || _ | j d | _| j d | _| j d | _d S )Nr4   r  ZHHL)endianlongFmtshortFmt	tagFormat)rj   rH  r+   r+   r/   r5    s    zAppendingTiffWriter.setEndianc                 C   sP   |   }|dkr"| j d | _qL| j| |  }| j|d tj q d S )Nr   r&   r5   )r:  rp   rC  r1  rI  	readShortr  SEEK_CUR)rj   r=  num_tagsr+   r+   r/   r7    s    zAppendingTiffWriter.skipIFDsc                 C   s   | j |S r\   )rp   r_  r  r+   r+   r/   r_    s    zAppendingTiffWriter.writec                 C   s   t | j| jd\}|S )Nr$   )r   r   rJ  rp   r6  r   r+   r+   r/   rL    s    zAppendingTiffWriter.readShortc                 C   s   t | j| jd\}|S rN   )r   r   rI  rp   r6  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 )Nr&   wrote only  bytes but wanted 4	rp   rI  r  rM  r_  r   r   rI  r6  rj   rk   Zbytes_writtenr+   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 )NrO  r$   rP   bytes but wanted 2)	rp   rI  r  rM  r_  r   r   rJ  r6  rS  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 )Nr&   rP  rQ  rR  rS  r+   r+   r/   rewriteLastLong  s    z#AppendingTiffWriter.rewriteLastLongc                 C   s:   | j t| j|}|d ur6|dkr6td| dd S )Nr$   rP  rU  )rp   r_  r   r   rJ  r6  rS  r+   r+   r/   
writeShort  s    zAppendingTiffWriter.writeShortc                 C   s:   | j t| j|}|d ur6|dkr6td| dd S )Nr&   rP  rQ  )rp   r_  r   r   rI  r6  rS  r+   r+   r/   r;    s    zAppendingTiffWriter.writeLongc                 C   s   |    | j  d S r\   )r>  rp   r  rm   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)rL  rD  r   r   rK  rp   r6  
fieldSizesr:  r2  rX  TagsrC  
fixOffsetsrI  r  rM  )rj   rN  rK  r   
field_typerL  
field_size
total_sizeis_localrR  Zcur_posr+   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 implementedir*   )r6  rD  rL  r:  r2  rT  rp   rI  r  rM  rY  r   r   rV  rX  )rj   rL  rZ  r[  rK  rR  r+   r+   r/   r^    s    

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   r\  r]  rl   r.  r>  r?  r@  rD  rC  r  r0  rI  r8  r5  r7  r_  rL  r:  rT  rV  rX  rY  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 |  }zt|v}| g| D ]Z}||_ ||_t|dsxd}	n|j	}	t
|	D ]*}
||
 |  t||| |  qqXW d    n1 s0    Y  W | | n| | 0 d S )Nappend_imagesr  r   )r  r  r  rb  rE  r  r   rC  r*  r  rD  rI  rS  r?  )r  r8  ry  r  r  rc  cur_idxtfimsZnfrr  r+   r+   r/   	_save_all  s(    



,rg  z.tifz.tiffz
image/tiff)ir  r  loggingr  r  r   r   collections.abcr   	fractionsr   numbersr   r    r   r   r	   r
   r   _binaryr   r  r   r  r   r   	getLoggerr   rG  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  rV  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  rO   rR   r[   rc   r   r  rU   r   r  r   r   setattrrh  ZImageFileDirectoryrw  r  r   r*  rg  register_openr  register_saveregister_save_allregister_extensionsregister_mimer+   r+   r+   r/   <module>)   s  
w
    \   h  ! o