B
    ‚Þ1\6 ã            à   @   sÞ
  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 dlmZ d dlmZm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Zdd	lmZ yd d
lmZ W n  ek
rÔ   d d
lmZ Y nX 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-ZCd.ZDd/ZEd0d1d2d3d4d5d6d7d8d9d:d;d<d=d>œZFd?d@„ eF G¡ D ƒZHe$d dAddAdBfdCe%d dAddAdBfdCe$d dAdDdAdBfdEe%d dAdDdAdBfdEe$ddAddAdBfdFe%ddAddAdBfdFe$ddAdDdAdBfdGe%ddAdDdAdBfdGe$d dAddHdBfdIe%d dAddHdBfdIe$d dAdDdHdBfdJe%d dAdDdHdBfdJe$ddAddHdBfdKe%ddAddHdBfdKe$ddAdDdHdBfdLe%ddAdDdHdBfdLe$d dAddMdBfdNe%d dAddMdBfdNe$d dAdDdMdBfdOe%d dAdDdMdBfdOe$ddAddMdBfdPe%ddAddMdBfdPe$ddAdDdMdBfdQe%ddAdDdMdBfdQe$d dAddRdBfdSe%d dAddRdBfdSe$d dAdDdRdBfdTe%d dAdDdRdBfdTe$ddAddRdBfdUe%ddAddRdBfdUe$ddAdDdRdBfdVe%ddAdDdRdBfdVe$ddAddWdBfdXe$ddAddYdBfdZe%ddAddYdBfd[e$ddHddYdBfd\e%ddHddYdBfd]e$d d^dd_dBfd`e%d d^dd_dBfdae$ddAdd_dBfdbe$ddHdd_dBfdce%ddHdd_dBfdde$dd^dd_dBfd`e%dd^dd_dBfdae$ddAddedHfdfe%ddAddedHfdfe$dDdAddgdBfdhe%dDdAddgdBfdhe$dDdAdDdgdBfdie%dDdAdDdgdBfdie$dDdAddjdBfdke%dDdAddjdBfdke$dDdAddjdlfdme%dDdAddjdlfdme$dDdAddndofdpe%dDdAddndofdpe$dDdAddqdrfdse%dDdAddqdrfdse$dDdAddjdAfdte%dDdAddjdAfdte$dDdAddndufdve%dDdAddndufdve$dDdAddqdwfdxe%dDdAddqdwfdxe$dDdAddjdHfdke%dDdAddjdHfdke$dDdAddndyfdze%dDdAddndyfdze$dDdAddqd{fd|e%dDdAddqd{fd|e$dDdAddjd}fdke%dDdAddjd}fdke$dDdAdd~dBfde%dDdAdd~dBfd€e$dDdAdddBfd‚e%dDdAdddBfdƒe$dDdAdddlfd„e%dDdAdddlfd…e$dDdAdddAfd†e%dDdAdddAfd‡e$dDdAdddHfd‚e%dDdAdddHfdƒe$dˆdAddAdBfd‰e%dˆdAddAdBfd‰e$dˆdAdDdAdBfdŠe%dˆdAdDdAdBfdŠe$dˆdAddHdBfd‹e%dˆdAddHdBfd‹e$dˆdAdDdHdBfdŒe%dˆdAdDdHdBfdŒe$dˆdAddMdBfde%dˆdAddMdBfde$dˆdAdDdMdBfdŽe%dˆdAdDdMdBfdŽe$dˆdAddRdBfde%dˆdAddRdBfde$dˆdAddedHfde%dˆdAddedHfde$dˆdAdDdRdBfd‘e%dˆdAdDdRdBfd‘e$d’dAddjdBfd“e%d’dAddjdBfd“e$d’dAddndlfd”e%d’dAddndlfd”e$d’dAddqdofd•e%d’dAddqdofd•e$d–dAddgdBfdhe%d–dAddgdBfdhe$d—dAddgdBfd˜e%d—dAddgdBfd˜inZId™dšd›dœgZJddž„ ZKdŸd „ ZLd¡d¢„ ZMi ZNi ZOG d£d¤„ d¤eƒZPG d¥d¦„ d¦eƒZQeNeQ_NeOeQ_OxNe G¡ D ]B\ZRZSeS Td§d¨¡ZSeUeQd©eS eNeR d ƒ eUeQdªeS eOeR ƒ qìW [N[O[R[SG d«d¬„ d¬eQƒZVeVZWG d­d®„ d®ejƒZXd¯e$dddAdfd°e$dddRdfd±e$dddedDfd²e$dˆddRdfd³e$dˆddedDfd´e$ddDd_dfdµe$dddYdfd¶e$ddDdYdfd·e$ddˆd_dfd¸e$dDddgdfd¹e$dDddjd fdºe$dDddjdDfd»e$d’ddjdfd¼e$d–ddgdfd½e$d—ddgdfd¾e%ddDd_dfd¿e%dddYdfdÀe%ddDdYdfdÁe%ddˆd_dfdÂœZYdÃdÄ„ ZZG dÅdÆ„ dÆƒZ[dÇdÈ„ Z\e ]eXj^eXeK¡ e _eXj^eZ¡ e `eXj^e\¡ e aeXj^dÉdÊg¡ e beXj^dË¡ dS )Ìé    )ÚdivisionÚprint_functioné   )ÚImageÚ	ImageFileÚImagePaletteÚTiffTags)Úi8Úo8)Úpy3)ÚFraction)ÚNumberÚRationalN)ÚTYPES)ÚMutableMappingz1.3.5FTs   IIs   MMé   i  i  i  i  i
  i  i  i  i  i  i  i  i  i(  i1  i2  i;  i=  i@  iD  iR  iS  i[  i˜‚  i»ƒ  iI†  is‡  ii‡  i¼  i–Æ  i—Æ  ÚrawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzwZ	tiff_jpegZjpegZtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscanZtiff_deflateZtiff_sgilogZtiff_sgilog24)r   é   é   é   é   é   é   é   i€  i€  i)€  i²€  it‡  iu‡  c             C   s   i | ]\}}||“qS © r   )Ú.0ÚkÚvr   r   ú2lib/python3.7/site-packages/PIL/TiffImagePlugin.pyú
<dictcomp>Š   s    r   )r   r   )Ú1z1;Ir   )r    z1;IR)r    r    )r    z1;R)r   )ÚLzL;2I)r!   zL;2IR)r!   zL;2)r!   zL;2R)r   )r!   zL;4I)r!   zL;4IR)r!   zL;4)r!   zL;4R)r   )r!   zL;I)r!   zL;IR)r!   r!   )r!   zL;R)é   )zI;16zI;12)é   )zI;16zI;16)zI;16BzI;16B)ÚIzI;16S)r$   zI;16BS)r   )é    )ÚFzF;32F)r&   zF;32BF)r$   zI;32N)r$   zI;32S)r$   zI;32BS)r   r   )ÚLAr'   )r   r   r   )ÚRGBr(   )r(   zRGB;R)r   r   r   r   )ÚRGBAr)   )r   )ÚRGBXr*   )r   r   r   r   r   )r   r   )r*   ZRGBXX)r   r   r   r   r   r   )r   r   r   )r*   ZRGBXXX)r)   ZRGBa)r   r   )r)   ZRGBaX)r   r   r   )r)   ZRGBaXX)r   r   )r)   ZRGBAX)r   r   r   )r)   ZRGBAXX)iç  )r#   r#   r#   )r(   zRGB;16L)r(   zRGB;16B)r#   r#   r#   r#   )r)   zRGBA;16L)r)   zRGBA;16B)r*   zRGBX;16L)r*   zRGBX;16B)r)   zRGBa;16L)r)   zRGBa;16Br   )ÚPzP;1)r+   zP;1R)r+   zP;2)r+   zP;2R)r+   zP;4)r+   zP;4R)r+   r+   )ÚPAr,   )r+   zP;Rr   )ÚCMYKr-   )r-   ZCMYKX)r-   ZCMYKXXr   r   )ÚLABr.   s   MM *s   II* s   MM* s   II *c             C   s   | d d… t kS )Nr   )ÚPREFIXES)Úprefixr   r   r   Ú_accept  s    r1   c             C   s<   t | ƒdk}t|rd|  n| ƒ |¡}|r8|d d d… S |S )Nr   éÿÿÿÿ)ÚabsÚIFDRationalÚlimit_rational)ÚvalZmax_valÚinvZn_dr   r   r   Ú_limit_rational  s    r8   c               C   s   t jj d¡d  d¡d S )NÚ
r   zVersion r   )r   ÚcoreZlibtiff_versionÚsplitr   r   r   r   Ú_libtiff_version   s    r<   c               @   s>  e Zd ZdZdZd1d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'ed.ƒZ(ed/ƒZ)d0S )2r4   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dƒ| _t|tƒr6|j| _|j| _ || _t|tƒr\|j| _ |j| _|j| _dS |dkrrtdƒ| _dS |dkr†t|ƒ| _nt||ƒ| _dS )z®
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        r   Nr   Únan)	r>   r=   Úfloatr?   Ú
isinstancer   Ú	numeratorÚdenominatorr4   )ÚselfÚvaluerD   r   r   r   Ú__init__9  s$    



zIFDRational.__init__c             C   s   | j S )N)r=   )Úar   r   r   rC   W  s    zIFDRational.numeratorc             C   s   | j S )N)r>   )rH   r   r   r   rD   [  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   )rD   rC   r?   Zlimit_denominator)rE   Zmax_denominatorÚfr   r   r   r5   _  s    
zIFDRational.limit_rationalc             C   s   t t| jƒƒS )N)ÚstrrA   r?   )rE   r   r   r   Ú__repr__l  s    zIFDRational.__repr__c             C   s
   | j  ¡ S )N)r?   Ú__hash__)rE   r   r   r   rL   o  s    zIFDRational.__hash__c             C   s
   | j |kS )N)r?   )rE   Úotherr   r   r   Ú__eq__r  s    zIFDRational.__eq__c                s   ‡ fdd„}|S )Nc                s   t | jˆ ƒ|Ž S )N)Úgetattrr?   )rE   Úargs)Úopr   r   Údelegatev  s    z'IFDRational._delegate.<locals>.delegater   )rQ   rR   r   )rQ   r   Ú	_delegateu  s    zIFDRational._delegateÚ__add__Ú__radd__Ú__sub__Ú__rsub__Ú__div__Ú__rdiv__Ú__mul__Ú__rmul__Ú__truediv__Ú__rtruediv__Ú__floordiv__Ú__rfloordiv__Ú__mod__Ú__rmod__Ú__pow__Ú__rpow__Ú__pos__Ú__neg__Ú__abs__Ú	__trunc__Ú__lt__Ú__gt__Ú__le__Ú__ge__Ú__nonzero__Ú__ceil__Ú	__floor__Ú	__round__N)r   )*Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rG   ÚpropertyrC   rD   r5   rK   rL   rN   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   r   r   r   r   r4   +  sL   
r4   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es„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 d0d1fej!d2d3fej"d4d5fej#d6d7f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ƒd^dGdH„ƒZ)edEƒdIdJ„ ƒZ*edKd:ƒd_dLdM„ƒZ+edKƒdNdO„ ƒZ,edPdFƒd`dQdR„ƒZ-edPƒdSdT„ ƒZ.dUdV„ Z/dWdX„ Z0dYdZ„ Z1dS )aÚ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] = 2
        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)rE   Úifhr0   r   r   r   rG   Ö  s    

zImageFileDirectory_v2.__init__c             C   s   | j S )N)r{   )rE   r   r   r   Ú<lambda>î  s    zImageFileDirectory_v2.<lambda>c             C   s   | j S )N)Ú_offset)rE   r   r   r   r„   ï  s    c             C   s   | j S )N)r‚   )rE   r   r   r   r„   ð  s    c             C   s   t dƒ‚d S )Nz"Not allowing setting of legacy api)Ú	Exception)rE   rF   r   r   r   Ú
legacy_apiò  s    z ImageFileDirectory_v2.legacy_apic             C   s(   i | _ i | _i | _i | _d | _d | _d S )N)Ú_tags_v1Ú_tags_v2Ú_tagdataÚtagtypeZ_nextr…   )rE   r   r   r   r   ö  s    zImageFileDirectory_v2.resetc             C   s   t t| ƒƒS )N)rJ   Údict)rE   r   r   r   Ú__str__þ  s    zImageFileDirectory_v2.__str__c             C   s   t dd„ |  ¡ D ƒƒS )z
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c             s   s"   | ]\}}t  |¡j|fV  qd S )N)r   ÚlookupÚname)r   ÚcoderF   r   r   r   ú	<genexpr>  s   z.ImageFileDirectory_v2.named.<locals>.<genexpr>)rŒ   Úitems)rE   r   r   r   Únamed  s    zImageFileDirectory_v2.namedc             C   s   t t| jƒt| jƒB ƒS )N)ÚlenÚsetrŠ   r‰   )rE   r   r   r   Ú__len__
  s    zImageFileDirectory_v2.__len__c             C   sf   || j kr>| j| }| j| }| j| \}}|| || jƒ| |< | j | }| jrbt|ttfƒsb|f}|S )N)r‰   rŠ   r‹   Ú_load_dispatchr‡   rB   ÚtupleÚbytes)rE   ÚtagÚdataÚtypÚsizeÚhandlerr6   r   r   r   Ú__getitem__  s    



z!ImageFileDirectory_v2.__getitem__c             C   s   || j kp|| jkS )N)r‰   rŠ   )rE   rš   r   r   r   Ú__contains__  s    z"ImageFileDirectory_v2.__contains__c             C   s   || kS )Nr   )rE   rš   r   r   r   Úhas_key  s    zImageFileDirectory_v2.has_keyc             C   s   |   ||| j¡ d S )N)Ú_setitemr‡   )rE   rš   rF   r   r   r   Ú__setitem__  s    z!ImageFileDirectory_v2.__setitem__c          	      s:  t ttf}ts|tf7 }t |¡‰ t||ƒr2|gn|}|| jkrˆ j	rVˆ j	| j|< n¾d| j|< t
dd„ |D ƒƒr€tj| j|< n”t
dd„ |D ƒƒrÀt
dd„ |D ƒƒr²tj| j|< ntj| j|< nTt
dd„ |D ƒƒràtj| j|< n4trt
dd„ |D ƒƒrtj| j|< ntj| j|< | j| tjkrLtrLt|tƒrD| dd	¡n|g}n | j| tjkrld
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gkrä|f}y|\||< W n8 tk
r*   t d|t|ƒf ¡ |d ||< Y nX n|||< d S )Nr   c             s   s   | ]}t |tƒV  qd S )N)rB   r4   )r   r   r   r   r   r‘   /  s    z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c             s   s   | ]}t |tƒV  qd S )N)rB   Úint)r   r   r   r   r   r‘   1  s    c             s   s   | ]}|d k V  qdS )i   Nr   )r   r   r   r   r   r‘   2  s    c             s   s   | ]}t |tƒV  qd S )N)rB   rA   )r   r   r   r   r   r‘   6  s    c             s   s   | ]}t |tƒV  qd S )N)rB   rJ   )r   r   r   r   r   r‘   :  s    ÚasciiÚreplacec             S   s"   g | ]}t |tƒrt|ƒn|‘qS r   )rB   r¤   rA   )r   r   r   r   r   ú
<listcomp>D  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c             3   s   | ]}ˆ   |¡V  qd S )N)Zcvt_enum)r   rF   )Úinfor   r   r‘   G  s    r   z=Metadata Warning, tag %s had too many entries: %s, expected 1r   )r   r™   rJ   r   Úunicoder   rŽ   rB   r‹   ÚtypeÚallZRATIONALÚSHORTÚLONGÚDOUBLEÚASCIIÚ	UNDEFINEDÚencoder˜   rˆ   r‰   Úlengthr”   ZSIGNED_RATIONALÚ
ValueErrorÚwarningsÚwarn)rE   rš   rF   r‡   Z	basetypesÚvaluesÚdestr   )r¨   r   r¢   "  sV    



 zImageFileDirectory_v2._setitemc             C   s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S )N)r‰   Úpoprˆ   rŠ   )rE   rš   r   r   r   Ú__delitem__g  s    z!ImageFileDirectory_v2.__delitem__c             C   s   t t| jƒt| jƒB ƒS )N)Úiterr•   rŠ   r‰   )rE   r   r   r   Ú__iter__l  s    zImageFileDirectory_v2.__iter__c             C   s   t  | j| |¡S )N)ÚstructÚunpackr}   )rE   Úfmtr›   r   r   r   r€   o  s    zImageFileDirectory_v2._unpackc             G   s   t j| j| f|žŽ S )N)r¼   Úpackr}   )rE   r¾   r¶   r   r   r   Ú_packr  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   rp   Ú
startswithr¦   r—   )Úfuncr   )Úidxr   r   r   Ú	decoratorv  s
    z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr   )rÆ   r   rÇ   r   )rÆ   r   r   Ú_register_loaderu  s    z&ImageFileDirectory_v2._register_loaderc                s   ‡ fdd„}|S )Nc                s   | t ˆ < | S )N)Ú_write_dispatch)rÅ   )rÆ   r   r   rÇ     s    z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr   )rÆ   rÇ   r   )rÆ   r   Ú_register_writer~  s    z&ImageFileDirectory_v2._register_writerc                sX   ddl m} | \}‰ }|||< t dˆ  ¡‰ˆd‡ ‡fdd„	ft|< ‡ fdd„t|< d S )	Nr   )r   ú=Tc                s   |   d t|ƒˆ ˆ ¡|¡S )Nz{}{})r€   Úformatr”   )rE   r›   r‡   )r¾   r   r   r   r„   ‰  s    z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                s   d  ‡‡ fdd„|D ƒ¡S )Nó    c             3   s   | ]}ˆ  ˆ |¡V  qd S )N)rÀ   )r   rF   )r¾   rE   r   r   r‘   Œ  s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>)Újoin)rE   r¶   )r¾   )rE   r   r„   ‹  s    )T)r   r   r¼   Zcalcsizer—   rÉ   )Zidx_fmt_namer   rÆ   r   r   )r¾   r   r   Ú_register_basic„  s    
z%ImageFileDirectory_v2._register_basicÚHZshortr!   ZlongÚbzsigned byteÚhzsigned shortÚlzsigned longrI   rA   ÚdZdoubler   Tc             C   s   |S )Nr   )rE   r›   r‡   r   r   r   Ú	load_byte—  s    zImageFileDirectory_v2.load_bytec             C   s   |S )Nr   )rE   r›   r   r   r   Ú
write_byte›  s    z ImageFileDirectory_v2.write_byter   c             C   s"   |  d¡r|d d… }| dd¡S )Nó    r2   zlatin-1r¦   )ÚendswithÚdecode)rE   r›   r‡   r   r   r   Úload_stringŸ  s    
z!ImageFileDirectory_v2.load_stringc             C   s,   t jjdkr| dd¡}d| dd¡ d S )Nr   r¥   r¦   rÍ   r×   )ÚsysÚversion_infoÚmajorrÙ   r±   )rE   rF   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 )N)r4   )rH   rÑ   )r‡   r   r   Úcombine°  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec             3   s   | ]\}}ˆ ||ƒV  qd S )Nr   )r   ÚnumÚdenom)rß   r   r   r‘   ±  s   z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   )r€   rÌ   r”   r˜   Úzip)rE   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À   r8   )r   Úfrac)rE   r   r   r‘   ¶  s   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>)rÎ   )rE   r¶   r   )rE   r   Úwrite_rational´  s    z$ImageFileDirectory_v2.write_rationalr   c             C   s   |S )Nr   )rE   r›   r‡   r   r   r   Úload_undefined¹  s    z$ImageFileDirectory_v2.load_undefinedc             C   s   |S )Nr   )rE   rF   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 )N)r4   )rH   rÑ   )r‡   r   r   rß   Å  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec             3   s   | ]\}}ˆ ||ƒV  qd S )Nr   )r   rà   rá   )rß   r   r   r‘   Æ  s   z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   )r€   rÌ   r”   r˜   râ   )rE   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ƒžŽ V  qdS )rå   i   @N)rå   )rÀ   r8   )r   ræ   )rE   r   r   r‘   Ë  s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>)rÎ   )rE   r¶   r   )rE   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”   ÚIOError)rE   Úfpr   Zretr   r   r   Ú_ensure_readÎ  s    
z"ImageFileDirectory_v2._ensure_readc          
   C   sø  |   ¡  | ¡ | _y¬xŒt|  d|  |d¡¡d ƒD ]j}|  d|  |d¡¡\}}}}trŒt |¡j	}t
 |d¡}td||||f dd	 y| j| \}	}
W n$ tk
rÂ   tr¼td
|ƒ w6Y nX ||	 }|dkr(| ¡ }|  d|¡\}trtd||f dd	 | |¡ t ||¡}| |¡ n|d |… }t|ƒ|kr\t d|t|ƒ|f ¡ q6|sdq6|| j|< || j|< tr6|dkr”td| ƒ q6td| | ƒ q6W |  d|  |d¡¡\| _W n2 tk
rò } zt t|ƒ¡ 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: %s - Data Location: %szXPossibly corrupt EXIF data.  Expecting to read %d bytes but only got %d. Skipping tag %sr%   z- value: <table: %d bytes>z- value:)r   Útellr…   Úranger€   rð   ÚDEBUGr   rŽ   r   r   ÚgetÚprintr—   ÚKeyErrorÚseekr   Z
_safe_readr”   r´   rµ   rŠ   r‹   r   rî   rJ   )rE   rï   Úirš   rœ   Úcountr›   ÚtagnameÚtypnameZ	unit_sizerž   r   ÚhereÚoffsetÚmsgr   r   r   ÚloadÖ  sX    
&





zImageFileDirectory_v2.loadc          
   C   s´  |  ¡ dkr&| | j|  ddd¡ ¡ | |  dt| jƒ¡¡ g }|  ¡ t| jƒd  d }d }xZt| j ¡ ƒD ]F\}}|tkrŒt|ƒ}| j	 
|¡}tr®td|||f ƒ t|tƒr¼|n|f}| j| | f|žŽ }	tr6t |¡j}
t 
|d	¡}td
|
|||f dd t|	ƒdkr,tdt|	ƒ ƒ n
td|ƒ |tjtjgkrRt|	ƒ}nt|ƒ}t|	ƒdkr†| ||||	 dd¡df¡ qr| ||||  d|¡|	f¡ |t|	ƒd d d 7 }qrW |d k	r|| \}}}}}	|	rètdƒ‚|  d|  d|¡d | ¡}|||||	f||< xR|D ]J\}}}}}	tdkrLt|||t|ƒt|	ƒƒ | |  d||||¡¡ qW | d¡ x:|D ]2\}}}}}	| |	¡ t|	ƒd@ rz| d¡ qzW |S )Nr   ZHLé*   r   rÐ   r"   r   zTag %s, Type: %s, Value: %srò   zsave: %s (%d) - type: %s (%d)rÃ   )ró   r#   z- value: <table: %d bytes>z- value:r×   rÍ   r!   r   r   z&multistrip support not yet implementedrñ   s       )rô   Úwriter{   rÀ   r”   r‰   Úsortedr’   ÚSTRIPOFFSETSr‹   r÷   rö   rø   rB   r˜   rÉ   r   rŽ   r   r   r¯   r°   ÚappendÚljustÚNotImplementedErrorr€   Úrepr)rE   rï   Úentriesr   Zstripoffsetsrš   rF   rœ   r¶   r›   rý   rþ   rü   r   r   r   Úsave  s^    





zImageFileDirectory_v2.save)rw   N)T)T)T)T)T)2rp   rq   rr   rs   rG   ru   r0   r   r‡   Úsetterr   r   r“   r–   rŸ   r    r   r¡   r£   r¢   r¹   r»   r€   rÀ   rÈ   rÊ   rÏ   ÚlistÚmapr   r¬   r­   ZSIGNED_BYTEZSIGNED_SHORTZSIGNED_LONGZFLOATr®   rÕ   rÖ   rÚ   rÞ   rä   rç   rè   ré   rë   rì   rð   r  r  r   r   r   r   rv      sb   
	E	






9rv   rÃ   rÂ   rÁ   Zwrite_c               @   sl   e Zd ZdZ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d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] = 2
        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             O   s   t j| f|ž|Ž d| _d S )NT)rv   rG   r‚   )rE   rP   Úkwargsr   r   r   rG   t  s    zImageFileDirectory_v1.__init__c             C   s   | j S )N)rˆ   )rE   r   r   r   r„   x  s    zImageFileDirectory_v1.<lambda>c             C   s   | j S )N)rŠ   )rE   r   r   r   r„   y  s    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`

        )r0   )r0   rŠ   r‹   r   )ÚclsZ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`

        )r0   )rv   r0   rŒ   rŠ   r‹   r‰   )rE   r  r   r   r   Úto_v2  s
    zImageFileDirectory_v1.to_v2c             C   s   || j kp|| jkS )N)rˆ   rŠ   )rE   rš   r   r   r   r    ž  s    z"ImageFileDirectory_v1.__contains__c             C   s   t t| jƒt| jƒB ƒS )N)r”   r•   rŠ   rˆ   )rE   r   r   r   r–   ¡  s    zImageFileDirectory_v1.__len__c             C   s   t t| jƒt| jƒB ƒS )N)rº   r•   rŠ   rˆ   )rE   r   r   r   r»   ¤  s    zImageFileDirectory_v1.__iter__c             C   s    xdD ]}|   |||¡ qW d S )N)FT)r¢   )rE   rš   rF   r‡   r   r   r   r£   §  s    
z!ImageFileDirectory_v1.__setitem__c             C   sr   || j krP| j| }| j| }| j| \}}x"dD ]}|  ||| ||ƒ|¡ q2W | j | }t|ttfƒsn|f}|S )N)FT)rˆ   rŠ   r‹   r—   r¢   rB   r˜   r™   )rE   rš   r›   rœ   r   rž   Zlegacyr6   r   r   r   rŸ   «  s    




z!ImageFileDirectory_v1.__getitem__N)rp   rq   rr   rs   rG   ru   ZtagsZtagdataÚclassmethodr  r  r    r–   r»   r£   rŸ   r   r   r   r   r  b  s   r  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edd„ ƒZej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| _d| _trttdƒ td| jƒ td|ƒ |  d¡ dS )z#Open the first image in a TIFF filer   Nr2   z*** TiffImageFile._open ***z
- __first:z- ifh: r   )rï   rí   rv   Útag_v2rš   r  r   Z_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_TiffImageFile__fpÚ
_frame_posÚ	_n_framesÚ_is_animatedrö   rø   Ú_seek)rE   rƒ   r   r   r   Ú_openÅ  s    

zTiffImageFile._openc             C   sb   | j d kr\|  ¡ }yx|  |  ¡ d ¡ qW W n" tk
rP   |  ¡ d | _ Y nX |  |¡ | j S )Nr   )r  rô   r  ÚEOFErrorrú   )rE   Úcurrentr   r   r   Ún_framesá  s    

zTiffImageFile.n_framesc             C   sj   | j d krd| jd k	r"| jdk| _ nB|  ¡ }y|  d¡ d| _ W n tk
rX   d| _ Y nX |  |¡ | j S )Nr   TF)r  r  rô   rú   r!  )rE   r"  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   r:   ÚnewÚmodeÚim)rE   Úframer   r   r   rú   þ  s
    

zTiffImageFile.seekc             C   sþ   | j | _x¤t| jƒ|kr¬| js&tdƒ‚trHtd|| j| j| j 	¡ f ƒ | j 	¡  | j 
| j¡ | j | j¡ tr„td| j 	¡  ƒ | j | j¡ | jj| _|  jd7  _q
W | j 
| j| ¡ | 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  rï   r”   r  r  r!  rö   rø   r  rô   rú   r  r  r  r   r  r  rš   r  Ú_setup)rE   r(  r   r   r   r  	  s*    


zTiffImageFile._seekc             C   s   | j S )zReturn the current frame number)r  )rE   r   r   r   rô   $  s    zTiffImageFile.tellc             C   s   | j S )N)Ú_size)rE   r   r   r   r   (  s    zTiffImageFile.sizec             C   s   t  dt¡ || _d S )Nz€Setting the size of a TIFF image directly is deprecated, and will be removed in a future version. Use the resize method instead.)r´   rµ   ÚDeprecationWarningr*  )rE   rF   r   r   r   r   ,  s    c                s   | j r|  ¡ S tt| ƒ ¡ S )N)Úuse_load_libtiffÚ_load_libtiffÚsuperr  r  )rE   )Ú	__class__r   r   r  5  s    zTiffImageFile.loadc             C   s   | j dkr| jsd| _d S )Nr   T)r  r  Ú!_close_exclusive_fp_after_loading)rE   r   r   r   Úload_end:  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 ƒ| jjg }y6t	| j
dƒoŒt | j
 ¡ ¡}t	| j
dƒr¤| j
 ¡  W n tk
r¾   d	}Y nX |rÌ||d
< t  | jdt|ƒ| j¡}y| | j|¡ W n tk
r   tdƒ‚Y nX t	| j
dƒrHtr2tdƒ | | j
 ¡ ¡\}}nZt	| j
dƒr€trdtdƒ | j
 d¡ | d¡\}}n"trŽtdƒ | | j
 ¡ ¡\}}g | _d| _| jrÚ| jdkrÚ| jsÚ| j
  ¡  d| _
|dk rìt|ƒ‚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   r  Útilerî   Zload_preparer”   r  r  r   Úhasattrrï   ÚosÚdupr2  r3  Z_getdecoderr&  r˜   ZdecoderconfigÚsetimager'  r³   rö   rø   rÙ   r5  rú   rí   ÚreadonlyZ_exclusive_fpr  r  Úclose)rE   ZpixelZextentsrP   rï   ÚdecoderÚnÚerrr   r   r   r-  @  sZ    




zTiffImageFile._load_libtiffc          
   C   s<  d| j krtdƒ‚t| j  td¡ | _| j  td¡| _| j  td¡}| j  t	d¡}t
rœtdƒ td| jƒ td|ƒ td| jƒ td	|ƒ td
| j d¡ƒ | j  t¡}| j  t¡}||f| _t
rÎt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r>d}n|dkrNd}nd}|t|ƒ7 }|t|ƒkr‚t|ƒdkr‚|| }| j j|||||f}	t
r¦td|	ƒ yt|	 \| _}
W n, tk
rä   t
rØt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r\||f| jd< nX|dkr~|d |d f| jd< n6|dkr¦||f| jd< ||f| jd< n||f| jd< d } }}g | _ t!pÔ| jdk| _"| j"rŒ|dkr$|	dd… d |	dd…  }	t
rtd|	ƒ t|	 \| _}
|
dkr2d }
d!|
krH|
 #d!d"¡}
d#|
kr^|
 #d#d"¡}
|
| jd$f}| j  $| jdd||fd|f¡ n\t%| j ks¤t&| j krÒt%| j krÔ| j t% }| j  t'|¡}| jd }n"| j t& }| j  d%¡}| j  d&¡}xð|D ]Ð}|| |kr |t(|ƒ d' }nd}|
}| jdkrD|
| }|| }|t)|ƒdf}| j  $| j||t|| |ƒt|| |ƒf||f¡ || }|| jd krüd||  }}|| jd krüd }}|d7 }qüW nt
ràtd(ƒ td)ƒ‚t*| j kr| j t* | jd*< | jd+kr8d,d-„ | j t+ D ƒ}t, -d.d/ .|¡¡| _/dS )0z-Setup this image object based on current tagsi¼  z+Windows Media Photo files not yet supportedr   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   zI;16zI;16Nz;16Bz;16Nz;16LFiB  iC  r   z- unsupported data organizationzunknown data organizationÚicc_profiler+   c             S   s   g | ]}t |d  ƒ‘qS )r   )r
   )r   rÑ   r   r   r   r§   O  s    z(TiffImageFile._setup.<locals>.<listcomp>zRGB;LrÍ   )0r  rî   ÚCOMPRESSION_INFOr÷   ÚCOMPRESSIONZ_compressionÚPLANAR_CONFIGURATIONÚ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERrö   rø   rš   Ú
IMAGEWIDTHÚIMAGELENGTHr*  r   ÚSAMPLEFORMATr”   ÚmaxÚminÚBITSPERSAMPLEÚEXTRASAMPLESr0   Ú	OPEN_INFOr&  rù   rz   r¨   ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITr6  ÚREAD_LIBTIFFr,  r¦   r  r  ÚTILEOFFSETSÚROWSPERSTRIPÚsumr¤   Ú
ICCPROFILEÚCOLORMAPr   r   rÎ   Úpalette)rE   ÚphotoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countÚkeyÚrawmodeZxresZyresZresunitÚxÚyZlayerrH   ZoffsetsrÒ   Úwr   ÚstrideZtile_rawmoder[  r   r   r   r)  —  sâ    



$
















zTiffImageFile._setupc             C   sB   z4y| j | jkr| j  ¡  W n tk
r0   Y nX W d d | _ X d S )N)r  rï   r<  ÚAttributeError)rE   r   r   r   Ú
_close__fpR  s    
zTiffImageFile._close__fp)rp   rq   rr   rÌ   Zformat_descriptionr0  r   ru   r#  r$  rú   r  rô   r   r  r  r1  r-  r)  rd  Ú__classcell__r   r   )r/  r   r  ¿  s"   	W <r  r    r!   r'   r+   r,   zI;32SzI;16zI;16SzF;32Fr(   r*   r)   r-   ÚYCbCrr.   zI;32BSzI;16BzI;16BSzF;32BF)r    r!   r'   r+   r,   r$   zI;16zI;16Sr&   r(   r*   r)   r-   rf  r.   zI;32BSzI;16BzI;16BSzF;32BFc             C   s”  y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rÄtd	t|ƒ ƒ t|tƒrÖ| ¡ }xF|D ]>}| |¡|	|< y|j| |	j|< W qÜ tk
r   Y qÜX qÜW t| d
ƒrrxFttttttfD ]2}|| jkr<| j| |	|< | jj| |	j|< q<W d| jkrŒ| jd |	t< xhtdftdftdftdftdftdft dft!dft"dft#dfg
D ]$\}}|| jkrÎ| j| |	|< qÎW | j d¡}|r(d|	t< |d |	t< |d |	t< |dkrT||	t$< t%|ƒdkrTt%|ƒ|	t&< |d k	rf||	t'< |dkrx||	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  |	t/< d|	t0< t1 |
d¡|	t2< |rPtr2tdƒ td t3|	 4¡ ƒ ƒ d}t|d!ƒrxy| 5d¡ t6 7| 8¡ ¡}W n t9j:k
rv   Y nX t0t/g}i }|d |t$< i }t| d"ƒrª| j; ¡ }xüt< =|	 4¡ t	| d
i ƒ 4¡ | 4¡ ¡D ]Ö\}}|t>j?kr@t> @|¡jAt>jBkrúqÎtCjD EtFƒ ¡tCjD Ed#¡k sÎt|tGtHtItJfƒs@tKsÎt|tLƒs@qÎ||krÎ||krÎt|tKrbtIntLƒr€| Md$d%¡d& ||< n"t|tNƒrštH|ƒ||< n|||< qÎW trÂtd't3| 4¡ ƒ ƒ | jd(krÒd)}||
|||f}tO P| jd*|| jQ¡}| R| j*d+| j ¡ x.| Md,¡\}}}|s*| S|¡ |r
P q
W |dk r~td-| ƒ‚n.|	 T|¡}tU V| |dd+| j |||dffg¡ d.| jkr|	| _Wd S )/Nzcannot write mode %s as TIFF)r0   r@  r   rG  r   r   ZtiffinfozTiffinfo Keys: %sr  rC  ZdescriptionrB  Zx_resolutionZy_resolutionZresolution_unitZsoftwareZ	date_timeZartistÚ	copyrightrA  r   )r   r+   r(   zRGB;Lc             s   s   | ]}t |ƒd  V  qdS )r   N)r	   )r   r   r   r   r   r‘   Î  s    z_save.<locals>.<genexpr>r   r   zSaving using libtiff encoderz	Items: %sr2  rš   z4.0r¥   r¦   r×   zConverted items: %s)zI;16BzI;16zI;16Nr4  )r   r   i @  z(encoder error %d when writing image fileÚ_debug_multipage)XÚ	SAVE_INFOr&  rù   rî   rv   Úencoderinfor÷   r¨   ÚWRITE_LIBTIFFrO   rF  r   rJ  rK  rö   rø   r  rB   r  r  r‹   r†   r7  rT  rR  rS  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKÚXMPr  rY  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTrO  r”   ÚSAMPLESPERPIXELrP  rL  rH  r'  Z
getpaletter˜   rZ  rW  ÚSTRIPBYTECOUNTSr  ÚCOMPRESSION_INFO_REVrE  r  r’   rú   r8  r9  r2  ÚioÚUnsupportedOperationrš   Ú	itertoolsÚchainr   ZLIBTIFF_CORErŽ   rª   r°   Ú	distutilsÚversionZStrictVersionr<   r¤   rA   rJ   r™   r   r©   r±   r4   r   Z_getencoderÚencoderconfigr:  r  r  r   Ú_saverh  )r'  rï   Úfilenamer^  r0   r\  rÌ   ÚbitsZextrar  r@  r4  r¨   r]  r   rA  Zlutrb  Z_fpZ	blocklistZattsZ
legacy_ifdrš   rF   rH   ÚerÓ   ÚsrÔ   r   r   r   r   r~  }  sî    






"




r~  c               @   sî   e Zd ZdddddddddddddgZdddd	d
dhZd:dd„Zdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd;d7d8„Zd9S )<ÚAppendingTiffWriterr   r   r   r   r   i  i   iD  i  i  i	  Fc             C   sz   t |dƒr|| _d| _nJ|| _d| _yt ||r4dnd¡| _W n" tk
r`   t |d¡| _Y nX | j ¡ | _|  	¡  d S )Nrí   FTzw+bzr+b)
r7  rI   Úclose_fpr   rw  Úopenrî   rô   Ú	beginningÚsetup)rE   Úfnr%  r   r   r   rG   C  s    
zAppendingTiffWriter.__init__c             C   sˆ   | j  | jtj¡ d | _d| _| j  d¡ | _}|s>d| _	d S d| _	|dkrX|  
d¡ n|dkrl|  
d¡ ntd	ƒ‚|  ¡  |  ¡  d S )
Nr   r   TFs   II* ry   s   MM *rx   zInvalid TIFF file header)rI   rú   r†  r8  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPagerí   ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)rE   rŒ  r   r   r   r‡  Q  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)rE   rŒ  Ú	IFDoffsetr   r   r   Úfinalizei  s    


zAppendingTiffWriter.finalizec             C   s   |   ¡  |  ¡  d S )N)r–  r‡  )rE   r   r   r   ÚnewFrame  s    zAppendingTiffWriter.newFramec             C   s   | S )Nr   )rE   r   r   r   Ú	__enter__†  s    zAppendingTiffWriter.__enter__c             C   s   | j r|  ¡  dS )NF)r„  r<  )rE   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   Ú__exit__‰  s    zAppendingTiffWriter.__exit__c             C   s   | j  ¡ | j S )N)rI   rô   r‹  )rE   r   r   r   rô   Ž  s    zAppendingTiffWriter.tellc             C   s*   |t jkr|| j7 }| j ||¡ |  ¡ S )N)r8  r‰  r‹  rI   rú   rô   )rE   r   Úwhencer   r   r   rú   ‘  s    

zAppendingTiffWriter.seekc             C   sb   | j  dtj¡ | j  ¡ }d|d  }d|  k r:dk rRn n| j  tt|ƒƒ¡ | j  ¡ | _d S )Nr   r#   )	rI   rú   r8  ÚSEEK_ENDrô   r  r™   Ú	bytearrayr‹  )rE   Ú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)rE   r¡  r   r   r   rŽ  ¢  s    zAppendingTiffWriter.setEndianc             C   sT   xN|   ¡ }|dkr$| j ¡ d | _P | j |¡ |  ¡ }| j |d tj¡ qW d S )Nr   r   r"   )r’  rI   rô   rŠ  rú   Ú	readShortr8  ÚSEEK_CUR)rE   r•  ÚnumTagsr   r   r   r  ¨  s    zAppendingTiffWriter.skipIFDsc             C   s   | j  |¡S )N)rI   r  )rE   r›   r   r   r   r  ³  s    zAppendingTiffWriter.writec             C   s   t  | j| j d¡¡\}|S )Nr   )r¼   r½   r£  rI   rí   )rE   rF   r   r   r   r¥  ¶  s    zAppendingTiffWriter.readShortc             C   s   t  | j| j d¡¡\}|S )Nr   )r¼   r½   r¢  rI   rí   )rE   rF   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 )Néþÿÿÿr   z wrote only %u bytes but wanted 4)	rI   rú   r8  r¦  r  r¼   r¿   r¢  r  )rE   rF   Ú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   z wrote only %u bytes but wanted 2)	rI   rú   r8  r¦  r  r¼   r¿   r£  r  )rE   rF   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 )Néüÿÿÿr   z wrote only %u bytes but wanted 4)	rI   rú   r8  r¦  r  r¼   r¿   r¢  r  )rE   rF   r©  r   r   r   ÚrewriteLastLongÌ  s
    z#AppendingTiffWriter.rewriteLastLongc             C   s6   | j  t | j|¡¡}|d k	r2|dkr2td| ƒ‚d S )Nr   z wrote only %u bytes but wanted 2)rI   r  r¼   r¿   r£  r  )rE   rF   r©  r   r   r   Ú
writeShortÓ  s    zAppendingTiffWriter.writeShortc             C   s6   | j  t | j|¡¡}|d k	r2|dkr2td| ƒ‚d S )Nr   z wrote only %u bytes but wanted 4)rI   r  r¼   r¿   r¢  r  )rE   rF   r©  r   r   r   r“  Ù  s    zAppendingTiffWriter.writeLongc             C   s   |   ¡  | j ¡  d S )N)r–  rI   r<  )rE   r   r   r   r<  ß  s    zAppendingTiffWriter.closec             C   s  |   ¡ }xöt|ƒD ]ê}t | j| j d¡¡\}}}| j| }|| }|dk}|sl|  ¡ }	|	| j	7 }	|  
|	¡ || jkrè| j ¡ }
|r®| j||dk|dkd | j |
d ¡ n0| j |	¡ | j||dk|dkd | j |
¡ d  }	}
q|r| j dtj¡ qW d S )Nr   r   r   )ÚisShortÚisLong)r¥  rõ   r¼   r½   r¤  rI   rí   Ú
fieldSizesr’  r‹  r­  ÚTagsrô   Ú
fixOffsetsrú   r8  r¦  )rE   r§  rû   rš   Z	fieldTyperü   Z	fieldSizeZ	totalSizeZisLocalr   ZcurPosr   r   r   r”  ã  s0    





zAppendingTiffWriter.fixIFDc             C   s²   |s|st dƒ‚xœt|ƒD ]}|r*|  ¡ n|  ¡ }|| j7 }|r|dkr|dkrXt dƒ‚|  |¡ | j dtj	¡ |  
tj¡ | j dtj	¡ q|r |  |¡ q|  |¡ qW d S )Nz offset is neither short nor longi   r   znot implementediöÿÿÿr   )r  rõ   r¥  r’  r‹  rª  rI   rú   r8  r¦  r®  r   r­   r«  r­  )rE   rü   r¯  r°  rû   r   r   r   r   r³    s    

zAppendingTiffWriter.fixOffsetsN)F)FF)rp   rq   rr   r±  r²  rG   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ƒ  *  sH   	

"rƒ  c          	   C   sÚ   | j  ¡ }| j}t| dg ¡ƒ}t| dƒs:|s:t| ||ƒS |  ¡ }z†t|ƒt}xl| g| D ]^}||_ ||_t|dƒszd}	n|j	}	x6t
|	ƒD ]*}
| |
¡ | ¡  t|||ƒ | ¡  qŠW qZW W d Q R X W d |  |¡ X d S )NÚappend_imagesr#  r   )rj  Úcopyr}  r  r÷   r7  r~  rô   rƒ  r#  rõ   rú   r  r—  )r'  rï   r  rj  r}  r´  Zcur_idxZtfZimsZnfrrÆ   r   r   r   Ú	_save_all  s(    



r¶  z.tifz.tiffz
image/tiff)cZ
__future__r   r   Ú r   r   r   r   Z_binaryr	   r
   Z_utilr   Z	fractionsr   Znumbersr   r   rw  ry  r8  r¼   rÛ   r´   Zdistutils.versionr{  r   Zcollections.abcr   ÚImportErrorÚcollectionsÚ__version__rö   rU  rk  ZIFD_LEGACY_APIr~   r|   rJ  rK  rO  rE  rH  rI  ro  r  rt  rW  ru  rR  rS  rF  rT  rp  rq  rr  Z	PREDICTORrZ  rV  rP  rL  Z
JPEGTABLESrs  rl  rm  rY  ZEXIFIFDrn  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATArD  r’   rv  rQ  r/   r1   r8   r<   r—   rÉ   r4   rv   rÆ   r   r¦   Úsetattrr  ZImageFileDirectoryr  ri  r~  rƒ  r¶  Zregister_openrÌ   Zregister_saveZregister_save_allZregister_extensionsZregister_mimer   r   r   r   Ú<module>*   sÚ  u   ;W   * . t