U
    &^n                    @   s
  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 ddlmZmZ ddlm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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=d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAZ>dBdC e>? D Z@ed dDddDdEfdFed dDddDdEfdFed dDdGdDdEfdHed dDdGdDdEfdHeddDddDdEfdIeddDddDdEfdIeddDdGdDdEfdJeddDdGdDdEfdJed dDddKdEfdLed dDddKdEfdLed dDdGdKdEfdMed dDdGdKdEfdMeddDddKdEfdNeddDddKdEfdNeddDdGdKdEfdOeddDdGdKdEfdOed dDddPdEfdQed dDddPdEfdQed dDdGdPdEfdRed dDdGdPdEfdReddDddPdEfdSeddDddPdEfdSeddDdGdPdEfdTeddDdGdPdEfdTed dDddUdEfdVed dDddUdEfdVed dDdGdUdEfdWed dDdGdUdEfdWeddDddUdEfdXeddDddUdEfdXeddDdGdUdEfdYeddDdGdUdEfdYeddDddZdEfd[eddDdd\dEfd]eddDdd\dEfd^eddKdd\dEfd_eddKdd\dEfd`ed daddbdEfdced daddbdEfddeddDddbdEfdeeddKddbdEfdfeddKddbdEfdgeddaddbdEfdceddaddbdEfddeddDddhdKfdieddDddhdKfdiedGdDddjdEfdkedGdDddjdEfdkedGdDdGdjdEfdledGdDdGdjdEfdledGdDddmdEfdnedGdDddmdEfdnedGdDddmdofdpedGdDddmdofdpedGdDddqdrfdsedGdDddqdrfdsedGdDddtdufdvedGdDddtdufdvedGdDddmdDfdwedGdDddmdDfdwedGdDddqdxfdyedGdDddqdxfdyedGdDddtdzfd{edGdDddtdzfd{edGdDddmdKfdnedGdDddmdKfdnedGdDddqd|fd}edGdDddqd|fd}edGdDddtd~fdedGdDddtd~fdedGdDddmdfdnedGdDddmdfdnedGdDdddEfdedGdDdddEfdedGdDdddEfdedGdDdddEfdedGdDdddofdedGdDdddofdedGdDdddDfdedGdDdddDfdedGdDdddKfdedGdDdddKfdeddDddDdEfdeddDddDdEfdeddDdGdDdEfdeddDdGdDdEfdeddDddKdEfdeddDddKdEfdeddDdGdKdEfdeddDdGdKdEfdeddDddPdEfdeddDddPdEfdeddDdGdPdEfdeddDdGdPdEfdeddDddUdEfdeddDddUdEfdeddDddhdKfdeddDddhdKfdeddDdGdUdEfdeddDdGdUdEfdeddDddmdEfdeddDddmdEfdeddDddqdofdeddDddqdofdeddDddtdrfdeddDddtdrfdeddDdddEfdeddDddjdEfdeddDddjdEfdeddDddjdEfdeddDddjdEfdioZAddddgZBdd ZCdd ZDdd ZEi ZFi ZGG dd deZHG dd deZIeFeI_FeGeI_Ge? D ]B\ZJZKeKLddZKeMeIdeK eFeJ d  eMeIdeK eGeJ  q[F[G[J[KG dd deIZNeNZOG dd dejZPdedddDdfdedddUdfdedddhdGfdedddUdfdedddhdGfdeddGdbdfdeddd\dfdeddGd\dfdedddbdfdedGddjdfdedGddmd fdedGddmdGfdedddmdfdedddjdfdedddjdfdeddGdbdfdeddd\dfdeddGd\dfdedddbdfdǜZQddɄ ZRG dd˄ d˃ZSdd̈́ ZTeUePjVePeC eWePjVeR eXePjVeT eYePjVddg eZePjVdС dS )    N)MutableMapping)Fraction)NumberRational   )Image	ImageFileImagePaletteTiffTags)i8o8TYPESFTs   IIs   MM   i  i  i  i  i
  i    i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  D  iR  iS  i[  i  i  i  iI  is  ii  i  i  i  i  rawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzw	tiff_jpegjpegZtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscanZtiff_deflateZtiff_sgilogZtiff_sgilog24lzmaZzstdZwebp)r                        i  i  i)  i  it  iu  im  iP  iQ  c                 C   s   i | ]\}}||qS  r   ).0kvr   r   7/tmp/pip-install-a1j0c_p1/Pillow/PIL/TiffImagePlugin.py
<dictcomp>   s      r"   r   r   )1z1;Ir   )r$   z1;IR)r$   r$   )r$   z1;R)r   )LzL;2I)r%   zL;2IR)r%   zL;2)r%   zL;2R)r   )r%   zL;4I)r%   zL;4IR)r%   zL;4)r%   zL;4R)r   )r%   zL;I)r%   zL;IR)r%   r%   )r%   zL;R)   )I;16zI;12)   )r'   r'   )I;16Br)   )II;16S)r*   I;16BS)r   )    )FF;32F)r.   F;32BF)r*   zI;32N)r*   I;32S)r*   I;32BS)r   r   )LAr3   )r   r   r   )RGBr4   )r4   zRGB;R)r   r   r   r   )RGBAr5   )r   )RGBXr6   )r   r   r   r   r   r   r   )r6   ZRGBXX)r   r   r   r   r   r   )r   r   r   )r6   ZRGBXXX)r5   ZRGBa)r   r   )r5   ZRGBaX)r   r   r   )r5   ZRGBaXX)r   r   )r5   ZRGBAX)r   r   r   )r5   ZRGBAXX)i  )r(   r(   r(   )r4   zRGB;16L)r4   zRGB;16B)r(   r(   r(   r(   )r5   zRGBA;16L)r5   zRGBA;16B)r6   zRGBX;16L)r6   zRGBX;16B)r5   zRGBa;16L)r5   zRGBa;16Br   )PzP;1)r8   zP;1R)r8   zP;2)r8   zP;2R)r8   zP;4)r8   zP;4R)r8   r8   )PAr9   )r8   zP;Rr   )CMYKr:   )r:   ZCMYKX)r:   ZCMYKXX)r:   zCMYK;16Lr   )r4   r6   r   )LABr;      MM *   II* s   MM* s   II *c                 C   s   | d d t kS Nr   )PREFIXESprefixr   r   r!   _accept   s    rB   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    rK   c                 C   sP   t | }|j|jf}t||k r.t| t|}t||krLt | } t| |}|S N)r   	numeratordenominatorminrK   rD   max)rG   rH   Zmin_valfracrJ   r   r   r!   _limit_signed_rational
  s    
rR   c                   @   s.  e Zd ZdZdZd/d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edZedZedZedZedZedZedZedZedZedZedZedZed Zed!Zed"Zed#Zed$Zed%Zed&Z ed'Z!ed(Z"ed)Z#ed*Z$ed+Z%ed,Z&ed-Z'd.S )0rE   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   )	
isinstancerE   rM   rS   rN   rT   rU   r   float)selfvaluerN   r   r   r!   __init__-  s    


zIFDRational.__init__c                 C   s   | j S rL   )rS   ar   r   r!   rM   G  s    zIFDRational.numeratorc                 C   s   | j S rL   )rT   r\   r   r   r!   rN   K  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   )rN   rM   rU   Zlimit_denominator)rY   Zmax_denominatorfr   r   r!   rF   O  s    
zIFDRational.limit_rationalc                 C   s   t t| jS rL   )strrX   rU   rY   r   r   r!   __repr__\  s    zIFDRational.__repr__c                 C   s
   | j  S rL   )rU   __hash__r`   r   r   r!   rb   _  s    zIFDRational.__hash__c                 C   s
   | j |kS rL   )rU   )rY   otherr   r   r!   __eq__b  s    zIFDRational.__eq__c                    s    fdd}|S )Nc                    s   t | j | S rL   )getattrrU   )rY   argsopr   r!   delegatef  s    z'IFDRational._delegate.<locals>.delegater   )rh   ri   r   rg   r!   	_delegatee  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__r[   propertyrM   rN   rF   ra   rb   rd   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r!   rE     sL   


rE   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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Z/dZd[ Z0d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
    `~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
                   ~PIL.TiffTags.TYPES`

    .. versionadded:: 3.0.0
       II*     Nc                 C   s   |dd t krtd| |dk	r(|n
|dd | _| jtkrHd| _n| jtkrZd| _ntd|   | 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 %r not valid)r   ><znot a TIFF IFDr%   F)
r?   SyntaxError_prefixMM_endianIIreset_unpacknext_legacy_api)rY   ifhrA   r   r   r!   r[     s    

zImageFileDirectory_v2.__init__c                 C   s   | j S rL   )r   r`   r   r   r!   <lambda>      zImageFileDirectory_v2.<lambda>c                 C   s   | j S rL   )_offsetr`   r   r   r!   r     r   c                 C   s   | j S rL   )r   r`   r   r   r!   r     r   c                 C   s   t dd S )Nz"Not allowing setting of legacy api)	ExceptionrY   rZ   r   r   r!   
legacy_api  s    z ImageFileDirectory_v2.legacy_apic                 C   s(   i | _ i | _i | _i | _d | _d | _d S rL   )_tags_v1_tags_v2_tagdatatagtype_nextr   r`   r   r   r!   r     s    zImageFileDirectory_v2.resetc                 C   s   t t| S rL   )r_   dictr`   r   r   r!   __str__  s    zImageFileDirectory_v2.__str__c                 C   s   dd |   D S )z
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c                 S   s   i | ]\}}t |j|qS r   )r
   lookupname)r   coderZ   r   r   r!   r"     s     
 z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsr`   r   r   r!   named  s    zImageFileDirectory_v2.namedc                 C   s   t t| jt| jB S rL   )lensetr   r   r`   r   r   r!   __len__  s    zImageFileDirectory_v2.__len__c                 C   sf   || j kr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrbt|ttfsb|f}|S rL   )r   r   r   _load_dispatchr   rW   tuplebytes)rY   tagdatatypsizehandlerrG   r   r   r!   __getitem__  s    



z!ImageFileDirectory_v2.__getitem__c                 C   s   || j kp|| jkS rL   )r   r   rY   r   r   r   r!   __contains__  s    z"ImageFileDirectory_v2.__contains__c                 C   s   |  ||| j d S rL   )_setitemr   )rY   r   rZ   r   r   r!   __setitem__
  s    z!ImageFileDirectory_v2.__setitem__c              	      sj  t ttf}t| t||r$|gn|}|| jkrJ jrJ 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|< nBt	dd |D r*tj| j|< n t	d	d |D rJtj| j|< | j| tjkr|t|trt|d
dn|g}n | j| tj
krdd |D }t fdd|D }|r| jn| j} jdks jd kr^t|dkr^|s^|r| j| tj
tjfkr|f}z|\||< W n8 tk
rZ   td|t|f  |d ||< Y nX n|||< d S )Nc                 s   s   | ]}t |tV  qd S rL   )rW   rE   r   r    r   r   r!   	<genexpr>  s     z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS r   Nr   r   r   r   r!   r     s     c                 s   s   | ]}t |tV  qd S rL   )rW   intr   r   r   r!   r     s     c                 s   s&   | ]}d |  kodk n  V  qdS )r      Nr   r   r   r   r!   r     s     c                 s   s&   | ]}d |  k odk n  V  qdS )i i   Nr   r   r   r   r!   r   !  s     c                 s   s   | ]}|d kV  qdS r   r   r   r   r   r!   r   &  s     c                 s   s   | ]}t |tV  qd S rL   )rW   rX   r   r   r   r!   r   )  s     c                 s   s   | ]}t |tV  qd S rL   )rW   r_   r   r   r   r!   r   ,  s     asciireplacec                 S   s"   g | ]}t |trt|n|qS r   )rW   r   rX   r   r   r   r!   
<listcomp>4  s     z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 3   s   | ]}  |V  qd S rL   )Zcvt_enumr   rZ   infor   r!   r   6  s     r   z=Metadata Warning, tag %s had too many entries: %s, expected 1r   )r   r   r_   r
   r   rW   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIencoder   r   r   lengthr   
ValueErrorwarningswarn)rY   r   rZ   r   Z	basetypesvaluesdestr   r   r!   r     sl    





zImageFileDirectory_v2._setitemc                 C   s.   | j |d  | j|d  | j|d  d S rL   )r   popr   r   r   r   r   r!   __delitem__W  s    z!ImageFileDirectory_v2.__delitem__c                 C   s   t t| jt| jB S rL   )iterr   r   r   r`   r   r   r!   __iter__\  s    zImageFileDirectory_v2.__iter__c                 C   s   t | j| |S rL   )structunpackr   )rY   fmtr   r   r   r!   r   _  s    zImageFileDirectory_v2._unpackc                 G   s   t j| j| f| S rL   )r   packr   )rY   r   r   r   r   r!   _packb  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!   	decoratorf  s
    z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr   )r   r   r   r   r   r!   _register_loadere  s    z&ImageFileDirectory_v2._register_loaderc                    s    fdd}|S )Nc                    s   | t  < | S rL   )_write_dispatch)r   r   r   r!   r   q  s    z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr   )r   r   r   r   r!   _register_writerp  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   |  dt|  |S )Nz{}{})r   formatr   rY   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 rL   )r   r   )r   rY   r   r!   r     s     zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrY   r   )r   r`   r!   r     s    )T)r
   r   r   calcsizer   r   )Zidx_fmt_namer   r   r   r   r   r!   _register_basicw  s    
z%ImageFileDirectory_v2._register_basicHshortr%   longbzsigned bytehzsigned shortlzsigned longr^   rX   ddoubler   Tc                 C   s   |S rL   r   r   r   r   r!   	load_byte  s    zImageFileDirectory_v2.load_bytec                 C   s   |S rL   r   rY   r   r   r   r!   
write_byte  s    z ImageFileDirectory_v2.write_byter   c                 C   s"   | dr|d d }|ddS )N    rC   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   |  dt|d |}fdd t fddt|d d d |dd d D S )	Nz{}Lr   c                    s    r| |fS t | |S rL   rE   r]   r   r   r   r!   combine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3   s   | ]\}} ||V  qd S rL   r   r   numZdenomr  r   r!   r     s     z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   r   r   r   r   ziprY   r   r   valsr   r  r   r!   load_rational  s    z#ImageFileDirectory_v2.load_rationalc                    s   d  fdd|D S )Nr   c                 3   s"   | ]} j dt|d V  qdS )2Ll    N)r  )r   rK   r   rQ   r`   r   r!   r     s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r   r`   r!   write_rational  s    z$ImageFileDirectory_v2.write_rationalr   c                 C   s   |S rL   r   r   r   r   r!   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc                 C   s   |S rL   r   r   r   r   r!   write_undefined  s    z%ImageFileDirectory_v2.write_undefined
   c                    sV   |  dt|d |}fdd t fddt|d d d |dd d D S )	Nz{}lr   c                    s    r| |fS t | |S rL   r  r  r  r   r!   r    s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   s   | ]\}} ||V  qd S rL   r   r  r
  r   r!   r     s     z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   r  r  r   r  r!   load_signed_rational  s    z*ImageFileDirectory_v2.load_signed_rationalc                    s   d  fdd|D S )Nr   c                 3   s$   | ]} j dt|dd V  qdS )2lii   N)r  )r   rR   r  r`   r   r!   r     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r   r`   r!   write_signed_rational  s    z+ImageFileDirectory_v2.write_signed_rationalc                 C   s2   | |}t||kr.tdd|t|f  |S )NzCorrupt EXIF data.  z,Expecting to read %d bytes but only got %d. )readr   OSError)rY   fpr   retr   r   r!   _ensure_read  s    
z"ImageFileDirectory_v2._ensure_readc              
   C   s  |    | | _zt| d| |dd D ]l}| d| |d\}}}}trt|j	}t
|d}td||||f dd	 z| j| \}	}
W n& tk
r   trtd
| Y q2Y nX ||	 }|dkr&| }| d|\}trtd||dd	 || t||}|| n|d | }t||krZtd|t||f  q2|sbq2|| j|< || j|< tr2|dkrtd|  q2td| |  q2| d| |d\| _W n8 tk
r } ztt| W Y d S d }~X Y nX d S )Nr   r   r   HHL4sr&   unknownztag: %s (%d) - type: %s (%d)r   endz- unsupported typer   r%   z$Tag Location: {} - Data Location: {}zXPossibly corrupt EXIF data.  Expecting to read %d bytes but only got %d. Skipping tag %sr-   - value: <table: %d bytes>- value:)r   tellr   ranger   r  DEBUGr
   r   r   r   getprintr   KeyErrorr   seekr   
_safe_readr   r   r   r   r   r   r  r_   )rY   r  ir   r   countr   tagnametypnameZ	unit_sizer   r   hereoffsetmsgr   r   r!   load  sd    
"







zImageFileDirectory_v2.loadr   c              
   C   st  |  dt| j}g }|t| t| jd  d }d }t| j D ]H\}}|tkr`t|}| j|}trt	d
||| t|tr|n|f}| j| | f| }	trt|j}
t|d}t	d|
|||f dd t|	d	krt	d
t|	  n
t	d| |tjtjtjfkr(t|	}nt|}t|	dkr\|||||	dddf qF|||||  d||	f |t|	d d d 7 }qF|d k	r|| \}}}}}	|	rtd|  d| d|d | }|||||	f||< |D ]D\}}}}}	trt	|||t|t|	 ||  d||||7 }q|d7 }|D ].\}}}}}	||	7 }t|	d@ r@|d7 }q@|S )Nr   r&   r   zTag {}, Type: {}, Value: {}r   zsave: %s (%d) - type: %s (%d)r   r!  r(   r#  r$  r   r   r%   r   r   z&multistrip support not yet implementedr   r  s       )r   r   r   sortedr   STRIPOFFSETSr   r(  r'  r)  r   rW   r   r   r
   r   r   r   ZBYTEr   r   appendljustNotImplementedErrorr   repr)rY   r2  resultentriesZstripoffsetsr   rZ   r   r   r   r/  r0  r.  r   r   r!   tobytes  sZ    


zImageFileDirectory_v2.tobytesc                 C   sN   |  dkr&|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r   )r%  writer   r   r=  r   )rY   r  r2  r;  r   r   r!   saveZ  s    

zImageFileDirectory_v2.save)r   N)T)T)T)T)T)r   )1r   r   r   r   r[   r   rA   r2  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   r   r   r  r  r  r  r  r  r  r  r  r4  r=  r@  r   r   r   r!   r     sv   6

J











	>
Cr   r   r   r   Zwrite_c                       st   e Zd ZdZ fddZed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  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,
    `~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    c                    s   t  j|| d| _d S )NT)superr[   r   )rY   rf   kwargs	__class__r   r!   r[     s    zImageFileDirectory_v1.__init__c                 C   s   | j S rL   )r   r`   r   r   r!   r     r   zImageFileDirectory_v1.<lambda>c                 C   s   | j S rL   )r   r`   r   r   r!   r     r   c                 C   s(   | |j d}|j|_|j|_|j|_|S )a3   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`

        r@   )rA   r   r   r   )clsoriginalifdr   r   r!   from_v2  s
    zImageFileDirectory_v1.from_v2c                 C   s4   t | jd}t| j|_t| j|_t| j|_|S )a3   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`

        r@   )r   rA   r   r   r   r   )rY   rL  r   r   r!   to_v2  s
    zImageFileDirectory_v1.to_v2c                 C   s   || j kp|| jkS rL   )r   r   r   r   r   r!   r     s    z"ImageFileDirectory_v1.__contains__c                 C   s   t t| jt| jB S rL   )r   r   r   r   r`   r   r   r!   r     s    zImageFileDirectory_v1.__len__c                 C   s   t t| jt| jB S rL   )r   r   r   r   r`   r   r   r!   r     s    zImageFileDirectory_v1.__iter__c                 C   s   dD ]}|  ||| qd S N)FT)r   )rY   r   rZ   r   r   r   r!   r     s    z!ImageFileDirectory_v1.__setitem__c                 C   sn   || j krL| j| }| j| }| j| \}}dD ]}| ||| ||| q0| j | }t|ttfsj|f}|S rO  )r   r   r   r   r   rW   r   r   )rY   r   r   r   r   r   legacyrG   r   r   r!   r     s    



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   r[   r   tagsZtagdataclassmethodrM  rN  r   r   r   r   r   __classcell__r   r   rH  r!   rE  p  s   
rE  c                       s   e Zd ZdZdZdZdd Zedd Ze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 TIFFFc                 C   s|   | j d}t|| _d | _| _| jj | _| _d| _	| j | _
g | _d| _trntd td| j td| | d dS )z#Open the first image in a TIFF filer   NrC   z*** TiffImageFile._open ***z
- __first:z- ifh: r   )r  r  r   tag_v2r   rL  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp
_frame_pos	_n_framesr'  r)  _seek)rY   r   r   r   r!   _open  s    

zTiffImageFile._openc                 C   sP   | j d krJ|  }| t| j | j d kr@| |  d  q"| | | j S )Nr   )rZ  r%  r[  r   rY  r+  )rY   currentr   r   r!   n_frames  s    


zTiffImageFile.n_framesc                 C   s   | j S rL   )_is_animatedr`   r   r   r!   is_animated  s    zTiffImageFile.is_animatedc                 C   s<   |  |sdS | | t| j tj| j| j| _dS )z%Select a given frame as current imageN)	Z_seek_checkr[  r   Z_decompression_bomb_checkr   corenewmodeimrY   framer   r   r!   r+    s
    

zTiffImageFile.seekc                 C   s  | j | _t| j|kr| js$tdtrFtd|| j| j| j	 f  | j	  | j
| j | j| j trtd| j	   | j| j | jj| _| jdkr|d | _t| jdkr| jdk| _|  jd7  _q| j
| j|  | j| j t| j | _| _|| _|   d S )Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %szLoading tags, location: %sr   r   )rX  r  r   rY  rV  EOFErrorr'  r)  rW  r%  r+  r7  rU  r4  r   rZ  r_  rE  rM  r   rL  _setupre  r   r   r!   r[  	  s6    



zTiffImageFile._seekc                 C   s   | j S )zReturn the current frame number)rW  r`   r   r   r!   r%  (  s    zTiffImageFile.tellc                    s   | j r|  S t  S rL   )use_load_libtiff_load_libtiffrF  r4  r`   rH  r   r!   r4  ,  s    zTiffImageFile.loadc                 C   s`   | j rPtjtjtjtjtjtjtjd	| j }|d k	rP| j
|| _
| j
j| _| js\d| _d 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_90r(  rd  Z	transposer   _sizer_  !_close_exclusive_fp_after_loading)rY   methodr   r   r!   load_end1  s     	
zTiffImageFile.load_endc           	      C   s  t j | }| jdkrtd| js(|S |   t| jdksFtd| jd d }t| jd d }z6t| jdot	
| j }t| jdr| j  W n tk
r   d	}Y nX |r||d
< t | jdt|| j}z|| j| W n tk
r
   tdY nX | jo| j }t| jdrNtr8td || j \}}nd|rtrbtd |st| jd |d\}}n.trtd | jd || j \}}g | _d| _|   |r| j  d| _|dk rt|t j | S )z] Overload method triggered when we detect a compressed tiff
            Calls out to libtiff Nzcannot load this imager   zNot exactly one tiler   r   filenoflushFr   libtiffzCouldn't set the image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   r4  tiler  Zload_preparer   rB  hasattrr  osduprp  rq  Z_getdecoderrc  r   Zdecoderconfigsetimagerd  r   Z_exclusive_fpr_  r'  r)  r  rs  r+  r  readonlyro  close)	rY   ZpixelZextentsrf   r  decoderZclose_self_fpnerrr   r   r!   rj  E  sh    

   


zTiffImageFile._load_libtiffc              
   C   s  d| j krtdt| j td | _| j td| _| j td}| jdkrRd}| j t	d}t
rtd td| j td	| td
| j td| td| jd t| j t}t| j t}||f| _t
rtd| j | j td}t|dkr(t|t|  kr dkr(n nd}| j td}| j td}|dkrTd}n|dkrdd}nd}|t|7 }|t|krt|dkr|| }| j j|||||f}	t
rtd|	 zt|	 \| _}
W n, tk
r   t
rtd tdY nX t
rtd|
 td| j | j| jd< | j td}| j td}|r|r| j t }|dkrt|d t|d f| jd< nx|dkrt|d d t|d d f| jd< nF|dkrt|d t|d f| jd< ||f| jd < n||f| jd < d } }}g | _!t"p| jd!k| _#| j#r|dkrj|	dd d |	dd  }	t
r\td|	 t|	 \| _}
|
d"krxd#}
d$|
kr|
$d$d%}
d&|
kr|
$d&d%}
|
| jd'| j j%f}| j!&d(dd||fd|f nXt'| j kst(| j krt'| j kr| j t' }| j t)|}| jd }n"| j t( }| j d)}| j d*}|D ]}|| |krh|t*| d+ }nd}|
}| jdkr|
| }|| }|t|df}| j!&| j||t|| |t|| |f||f || }|| jd krDd||  }}|| jd krDd }}|d7 }qDnt
r&td, td-t+| j krJ| j t+ | jd.< | jd/kr~d0d1 | j t, D }t-.d2d3/|| _0| j d4| _1dS )5z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r   r   z*** Summary ***z- compression:z- photometric_interpretation:z- planar_configuration:z- fill_order:z- YCbCr subsampling:i  z- size:r#   r   )r   r   r   r   r   r   zformat key:z- unsupported formatzunknown pixel modez- raw mode:z- pil mode:compressionr         ?dpigRQ@N
resolutionr   r'   I;16Nz;16Bz;16Nz;16LFrr  iB  iC  r   z- unsupported data organizationzunknown data organizationicc_profiler8   r9   c                 S   s   g | ]}t |d  qS )r   )r   )r   r   r   r   r!   r   d  s     z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   i  )2rU  r  COMPRESSION_INFOr(  COMPRESSION_compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr'  r)  r   r   
IMAGEWIDTHIMAGELENGTHrl  r   SAMPLEFORMATr   rP   rO   BITSPERSAMPLEEXTRASAMPLESrA   	OPEN_INFOrc  r*  r   r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITrt  READ_LIBTIFFri  r   r2  r7  r6  TILEOFFSETSROWSPERSTRIPsum
ICCPROFILECOLORMAPr	   r   r   paletterk  )rY   photoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countkeyrawmodeZxresZyresZresunitxyZlayerr]   offsetsr   wr2  strideZtile_rawmoder  r   r   r!   rh    s    




2




 
(





 

zTiffImageFile._setupc                 C   sB   z4z| j | jkr| j   W n tk
r0   Y nX W 5 d | _ X d S rL   )rX  r  rz  AttributeErrorr`   r   r   r!   
_close__fpi  s    
zTiffImageFile._close__fp)r   r   r   r   format_descriptionrm  r\  r   r^  r`  r+  r[  r%  r4  ro  rj  rh  r  rS  r   r   rH  r!   rT    s"   
	
] HrT  r$   r%   r3   r8   r9   r1   r'   r+   r/   r4   r6   r5   r:   YCbCrr;   r2   r)   r,   r0   )r$   r%   r3   r8   r9   r*   r'   r+   r.   r4   r6   r5   r:   r  r;   r2   r)   r,   r0   c           !      C   s  zt | j \}}}}}}W n" tk
r<   td| j Y nX t|d}	| jd| jd}
|
d krjd}
tpt|
dk}t	| dd|	t
< | jd |	t< | jd |	t< | jdi }trtd	t|  t|tr| }|D ]>}|||	|< z|j| |	j|< W q tk
r   Y qX qt| d
rjttttttfD ]2}|| jkr6| j| |	|< | jj| |	j|< q6d| jkr| jd |	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 ]$\}}|| jkr| j| |	|< q| jd}|r,d|	t< t$|d d |	t< t$|d d |	t< |dkrX||	t%< t&|dkrXt&||	t'< |d k	rj||	t(< |dkr|||	t)< ||	t*< | jdkr| j+,dd}t-dd |D |	t.< t&|| jd |d  d d  }| jd |	t/< || jd  |	t0< d|	t1< t2|
d|	t3< |rd | jkrl| jd  }t|t$rJ|dk sJ|d!krRt4d"|
d#krdt4d$||	t5< trtd% td&t6|	7   d}t|d'rz|8d t9:|; }W n t<j=k
r   Y nX i }t.t>t)t0t1t?g}i }|d |t%< i }t| d(r| j@ }tAB|	7 t	| d
i 7 |7 D ]\}}|tCjDkrtCE|jFtCjGks4tHjIjJsjq4||	jkr|	j| ||< nt|t$tKtLtMfsq4||kr4||kr4t|tLr|Nd)d*d+ ||< n"t|tOrtK|||< n|||< q4trtd,t6|7   | jd-kr$d.}t|7 }|P  ||
||||f}tHQ| jd/|| jR}|S| j+d0| j  |Nd1\}}}|s|T| |rpqqp|dk rtd2| n.|	U|} tVW| |dd0| j | ||dffg d3| jkr|	| _Xd S )4Nzcannot write mode %s as TIFFr@   r~  r   r  r   r   ZtiffinfozTiffinfo Keys: %srU  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r   r  r#   r  r4   r  c                 s   s   | ]}t |d  V  qdS )r   N)r   r   r   r   r!   r     s     z_save.<locals>.<genexpr>r   r   qualityd   zInvalid quality settingr   z5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %srp  r   r   r   r   zConverted items: %s)r)   r'   r  rr  r7   i @  z(encoder error %d when writing image file_debug_multipage)Y	SAVE_INFOrc  r*  r  r   encoderinfor(  r   WRITE_LIBTIFFre   r  r   r  r  r'  r)  rB  rW   rE  rN  r   r   ru  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPrU  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr   r  r   SAMPLESPERPIXELr  r  r  rd  Z
getpaletter   r  r  STRIPBYTECOUNTSr6  COMPRESSION_INFO_REVr  r   JPEGQUALITYr5  r   r+  rv  rw  rp  ioUnsupportedOperationREFERENCEBLACKWHITETRANSFERFUNCTIONr   	itertoolschainr
   ZLIBTIFF_COREr   r   r   r   ra  Zlibtiff_support_custom_tagsrX   r_   r   r   rE   sortZ_getencoderencoderconfigrx  r?  r@  r   _saver  )!rd  r  filenamer  rA   r  r   bitsextrarL  r~  rr  r   r  r   r  Zlutr  r  _fptypesZ	blocklistZattsZ
legacy_ifdr   rZ   rQ  r]   er   sr   r2  r   r   r!   r    s*   




"
 

		
  


  r  c                   @   s   e Zd ZdddddddddddddgZdddd	d
dhZd:ddZdd Zdd Zdd Zdd Z	dd Z
dd ZejfddZdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd;d7d8Zd9S )<AppendingTiffWriterr   r   r   r   r   r   i   r   i  i  i	  Fc                 C   sv   t |dr|| _d| _nF|| _d| _zt||r2dnd| _W n  tk
r\   t|d| _Y nX | j | _|   d S )Nr  FTzw+bzr+b)	ru  r^   close_fpr   openr  r%  	beginningsetup)rY   fnrb  r   r   r!   r[     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   TFr=   r   r<   r   zInvalid TIFF file header)r^   r+  r  rv  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rY   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  r^   r+  r  r  r  r  readLongr  	writeLongfixIFD)rY   r  	IFDoffsetr   r   r!   finalize  s    


zAppendingTiffWriter.finalizec                 C   s   |    |   d S rL   )r  r  r`   r   r   r!   newFrame  s    zAppendingTiffWriter.newFramec                 C   s   | S rL   r   r`   r   r   r!   	__enter__  s    zAppendingTiffWriter.__enter__c                 C   s   | j r|   dS )NF)r  rz  )rY   exc_type	exc_value	tracebackr   r   r!   __exit__  s    zAppendingTiffWriter.__exit__c                 C   s   | j  | j S rL   )r^   r%  r  r`   r   r   r!   r%    s    zAppendingTiffWriter.tellc                 C   s*   |t jkr|| j7 }| j|| |  S rL   )rv  r  r  r^   r+  r%  )rY   r2  whencer   r   r!   r+    s    

zAppendingTiffWriter.seekc                 C   s^   | j dtj | j  }d|d  }d|  k r:dk rNn n| j t| | j  | _d S )Nr   r(   )r^   r+  rv  SEEK_ENDr%  r?  r   r  )rY   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)rY   r  r   r   r!   r    s    zAppendingTiffWriter.setEndianc                 C   sP   |   }|dkr"| j d | _qL| j| |  }| j|d tj q d S )Nr   r   r&   )r  r^   r%  r  r+  	readShortrv  SEEK_CUR)rY   r  numTagsr   r   r!   r    s    zAppendingTiffWriter.skipIFDsc                 C   s   | j |S rL   )r^   r?  r   r   r   r!   r?    s    zAppendingTiffWriter.writec                 C   s   t | j| jd\}|S )Nr   )r   r   r  r^   r  r   r   r   r!   r    s    zAppendingTiffWriter.readShortc                 C   s   t | j| jd\}|S r>   )r   r   r  r^   r  r   r   r   r!   r    s    zAppendingTiffWriter.readLongc                 C   sF   | j dtj | j t| j|}|d k	rB|dkrBtd| d S )Nr    wrote only %u bytes but wanted 4	r^   r+  rv  r  r?  r   r   r  r  rY   rZ   ZbytesWrittenr   r   r!   rewriteLastShortToLong  s    z*AppendingTiffWriter.rewriteLastShortToLongc                 C   sF   | j dtj | j t| j|}|d k	rB|dkrBtd| d S )Nr  r    wrote only %u bytes but wanted 2)	r^   r+  rv  r  r?  r   r   r  r  r  r   r   r!   rewriteLastShort  s    z$AppendingTiffWriter.rewriteLastShortc                 C   sF   | j dtj | j t| j|}|d k	rB|dkrBtd| d S )Nr   r  r  r  r   r   r!   rewriteLastLong  s    z#AppendingTiffWriter.rewriteLastLongc                 C   s6   | j t| j|}|d k	r2|dkr2td| d S )Nr   r  )r^   r?  r   r   r  r  r  r   r   r!   
writeShort  s    zAppendingTiffWriter.writeShortc                 C   s6   | j t| j|}|d k	r2|dkr2td| d S )Nr   r  )r^   r?  r   r   r  r  r  r   r   r!   r    s    zAppendingTiffWriter.writeLongc                 C   s   |    | j  d S rL   )r  r^   rz  r`   r   r   r!   rz    s    zAppendingTiffWriter.closec                 C   s   |   }t|D ]}t| j| jd\}}}| j| }|| }|dk}|sj|  }	|	| j	7 }	| 
|	 || jkr| j }
|r| j||dk|dkd | j|
d  n0| j|	 | j||dk|dkd | j|
 d  }	}
q|r| jdtj qd S )Nr   r   r   )isShortisLong)r  r&  r   r   r  r^   r  
fieldSizesr  r  r  Tagsr%  
fixOffsetsr+  rv  r  )rY   r  r-  r   Z	fieldTyper.  Z	fieldSizeZ	totalSizeZisLocalr2  ZcurPosr   r   r!   r    s:    




    
zAppendingTiffWriter.fixIFDc                 C   s   |s|st dt|D ]}|r(|  n|  }|| j7 }|r|dkr|dkrVt d| | | jdtj	 | 
tj | jdtj	 q|r| | q| | qd S )Nz offset is neither short nor longr   r   znot implementedir   )r  r&  r  r  r  r  r^   r+  rv  r  r  r
   r   r  r  )rY   r.  r  r  r-  r2  r   r   r!   r   ?  s    

zAppendingTiffWriter.fixOffsetsN)F)FF)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  rz  r  r   r   r   r   r!   r  i  sJ   

#r  c              	   C   s   | j  }| j}t|dg }t| ds:|s:t| ||S |  }z~t	|l}| g| D ]Z}||_ ||_t|dsxd}	n|j
}	t|	D ]*}
||
 |  t||| |  qqXW 5 Q R X W 5 | | X d S )Nappend_imagesr^  r   )r  copyr  rB  r(  ru  r  r%  r+  r  r^  r&  r4  r  )rd  r  r  r  r  r  Zcur_idxtfZimsZnfrr   r   r   r!   	_save_allW  s(    



r  z.tifz.tiffz
image/tiff)[r  r  rv  r   r   collections.abcr   Z	fractionsr   Znumbersr   r    r   r   r	   r
   _binaryr   r   r   r'  r  r  ZIFD_LEGACY_APIr   r   r  r  r  r  r  r  r  r6  r  r  r  r  r  r  r  r  r  r  r  Z	PREDICTORr  r  r  r  Z
JPEGTABLESr  r  r  r  r  ZEXIFIFDr  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r   r  r  r?   rB   rK   rR   r   r   rE   r   r   r   r   setattrrE  ZImageFileDirectoryrT  r  r  r  r  Zregister_openr   Zregister_saveZregister_save_allZregister_extensionsZregister_mimer   r   r   r!   <module>)   s                                                                                                                 wp   ZX   1 W o