
 X              
   @   sh  d  d l  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 d  d l	 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 m Z d Z d Z d Z d Z d Z d Z d Z e j Z e j 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! Z0 d" Z1 d# Z2 d$ Z3 d% Z4 d& Z5 d' Z6 d( Z7 d) Z8 d* Z9 d+ Z: d, Z; d- Z< d. Z= d/ Z> i d0 d	 6d1 d2 6d3 d4 6d5 d6 6d7 d8 6d9 d: 6d; d< 6d= d> 6d? d@ 6dA dB 6dC dD 6dE dF 6dG dH 6dI dJ 6Z? e@ dK dL   e? jA   D  ZB iT dM dN f e d  d	 f d	 d	 f f  f 6dM dN f e d  d	 f d	 d	 f f  f 6dM dO f e d  d	 f d2 d	 f f  f 6dM dO f e d  d	 f d2 d	 f f  f 6dM dM f e d	 d	 f d	 d	 f f  f 6dM dM f e d	 d	 f d	 d	 f f  f 6dM dP f e d	 d	 f d2 d	 f f  f 6dM dP f e d	 d	 f d2 d	 f f  f 6dQ dR f e d  d	 f d	 d2 f f  f 6dQ dR f e d  d	 f d	 d2 f f  f 6dQ dS f e d  d	 f d2 d2 f f  f 6dQ dS f e d  d	 f d2 d2 f f  f 6dQ dT f e d	 d	 f d	 d2 f f  f 6dQ dT f e d	 d	 f d	 d2 f f  f 6dQ dU f e d	 d	 f d2 d2 f f  f 6dQ dU f e d	 d	 f d2 d2 f f  f 6dQ dV f e d  d	 f d	 d6 f f  f 6dQ dV f e d  d	 f d	 d6 f f  f 6dQ dW f e d  d	 f d2 d6 f f  f 6dQ dW f e d  d	 f d2 d6 f f  f 6dQ dX f e d	 d	 f d	 d6 f f  f 6dQ dX f e d	 d	 f d	 d6 f f  f 6dQ dY f e d	 d	 f d2 d6 f f  f 6dQ dY f e d	 d	 f d2 d6 f f  f 6dQ dZ f e d  d	 f d	 d> f f  f 6dQ dZ f e d  d	 f d	 d> f f  f 6dQ d[ f e d  d	 f d2 d> f f  f 6dQ d[ f e d  d	 f d2 d> f f  f 6dQ dQ f e d	 d	 f d	 d> f f  f 6dQ dQ f e d	 d	 f d	 d> f f  f 6dQ d\ f e d	 d	 f d2 d> f f  f 6dQ d\ f e d	 d	 f d2 d> f f  f 6d] d^ f e d	 d	 f d	 d_ f f  f 6d] d] f e d	 d	 f d	 d` f f  f 6da da f e d	 d	 f d	 d` f f  f 6db db f e d	 d2 f d	 d` f f  f 6dc dc f e d	 d2 f d	 d` f f  f 6dd de f e d  d4 f d	 df f f  f 6dd dg f e d  d4 f d	 df f f  f 6dh di f e d	 d	 f d	 df f f  f 6dh dj f e d	 d2 f d	 df f f  f 6dk dk f e d	 d2 f d	 df f f  f 6dd de f e d	 d4 f d	 df f f  f 6dd dg f e d	 d4 f d	 df f f  f 6dl dl f e d	 d	 f d	 d> d> f d2 f f 6dl dl f e d	 d	 f d	 d> d> f d2 f f 6dm dm f e d2 d	 f d	 d> d> d> f f  f 6dm dm f e d2 d	 f d	 d> d> d> f f  f 6dm dn f e d2 d	 f d2 d> d> d> f f  f 6dm dn f e d2 d	 f d2 d> d> d> f f  f 6do do f e d2 d	 f d	 d> d> d> d> f f  f 6do do f e d2 d	 f d	 d> d> d> d> f f  f 6dp dp f e d2 d	 f d	 d> d> d> d> f d  f f 6dp dp f e d2 d	 f d	 d> d> d> d> f d  f f 6do dq f e d2 d	 f d	 d> d> d> d> f d	 f f 6do dq f e d2 d	 f d	 d> d> d> d> f d	 f f 6do do f e d2 d	 f d	 d> d> d> d> f d2 f f 6do do f e d2 d	 f d	 d> d> d> d> f d2 f f 6do do f e d2 d	 f d	 d> d> d> d> f dr f f 6do do f e d2 d	 f d	 d> d> d> d> f dr f f 6ds dt f e d4 d	 f d	 d	 f f  f 6ds dt f e d4 d	 f d	 d	 f f  f 6ds du f e d4 d	 f d2 d	 f f  f 6ds du f e d4 d	 f d2 d	 f f  f 6ds dv f e d4 d	 f d	 d2 f f  f 6ds dv f e d4 d	 f d	 d2 f f  f 6ds dw f e d4 d	 f d2 d2 f f  f 6ds dw f e d4 d	 f d2 d2 f f  f 6ds dx f e d4 d	 f d	 d6 f f  f 6ds dx f e d4 d	 f d	 d6 f f  f 6ds dy f e d4 d	 f d2 d6 f f  f 6ds dy f e d4 d	 f d2 d6 f f  f 6ds ds f e d4 d	 f d	 d> f f  f 6ds ds f e d4 d	 f d	 d> f f  f 6dz dz f e d4 d	 f d	 d> d> f d2 f f 6dz dz f e d4 d	 f d	 d> d> f d2 f f 6ds d{ f e d4 d	 f d2 d> f f  f 6ds d{ f e d4 d	 f d2 d> f f  f 6d| d| f e d8 d	 f d	 d> d> d> d> f f  f 6d| d| f e d8 d	 f d	 d> d> d> d> f f  f 6d} d} f e d: d	 f d	 d> d> d> f f  f 6d} d} f e d: d	 f d	 d> d> d> f f  f 6d~ d~ f e d> d	 f d	 d> d> d> f f  f 6d~ d~ f e d> d	 f d	 d> d> d> f f  f 6ZC d d d g ZD d d   ZE d d   ZF i  ZG i  ZH Gd d   d e  ZI Gd d   d e	 jJ  ZK eG eK _G eH eK _H x` e jA   D]R \ ZL ZM eM jN d d  ZM eO eK d eM eG eL d	  eO eK d eM eH eL  qW[G [H [L [M Gd d   d eK  ZP eP ZQ Gd d   d e j  ZR i dM e d	 d	 d	 f d f dM 6dQ e d	 d	 d> f d f dQ 6dl e d	 d	 d> d> f d2 f dl 6ds e d4 d	 d> f d f ds 6dz e d4 d	 d> d> f d2 f dz 6dj e d	 d2 df f d f dh 6d] e d	 d	 d` f d f d] 6db e d	 d2 d` f d f db 6de e d	 d4 df f d f dd 6dm e d2 d	 d> d> d> f d f dm 6dp e d2 d	 d> d> d> d> f d  f dp 6do e d2 d	 d> d> d> d> f d2 f do 6d| e d8 d	 d> d> d> d> f d f d| 6d} e d: d	 d> d> d> f d f d} 6d~ e d> d	 d> d> d> f d f d~ 6dk e d	 d2 df f d f dk 6da e d	 d	 d` f d f da 6dc e d	 d2 d` f d f dc 6dg e d	 d4 df f d f dg 6ZS d d   ZT Gd d   d  ZU d d   ZV e jW eR jX eR eE  e jY eR jX eT  e jZ eR jX eV  e j[ eR jX d  e j[ eR jX d  e j\ eR jX d  d S)    )divisionprint_function)Image	ImageFile)ImagePalette)_binary)TiffTagsN)Fraction)NumberRational   )TYPESz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  raw
tiff_ccitt   group3   group4   tiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflate   tiff_raw_16i  packbitsi  tiff_thunderscani)  tiff_deflatei  tiff_sgilogit  tiff_sgilog24iu  c             C   s"   g  |  ] \ } } | | f  q S r$   ).0kvr$   r$   P/home/ubuntu/projects/ifolica/lib/python3.4/site-packages/PIL/TiffImagePlugin.py
<listcomp>   s   	 r)   1z1;Iz1;IRz1;RLzL;2IzL;2IRzL;2zL;2RzL;4IzL;4IRzL;4zL;4RzL;IzL;IRzL;RzI;16zI;12      zI;16BzI;16SzI;16BSFzF;32F    zF;32BFIzI;32NzI;32SzI;32BSZLARGBzRGB;RZRGBAZRGBXZRGBai  PzP;1zP;1RzP;2zP;2RzP;4zP;4RZPAzP;RZCMYKZYCbCrZLABs   MM *s   II* s   II c             C   s   |  d  d  t  k S)Nr   )PREFIXES)prefixr$   r$   r(   _accept   s    r5   c             C   sR   t  |   d k } t | r% d |  n |   j |  } | rN | d  d  d  S| S)Nr   )absIFDRationallimit_rational)valZmax_valinvZn_dr$   r$   r(   _limit_rational   s    %r<   c               @   s  e  Z d  Z d Z d3 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' e d0  Z( e d1  Z) d2 S)4r8   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 k rW | j |  _ | j |  _  | |  _ n  t |  t k r | j |  _  | j |  _ | j |  _ d S| d k r t d  |  _ d S| d k rt	 j
 d k  r t |  t k r t j |  |  _ q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   nani  )r>   r=   floatr?   typer	   	numeratordenominatorr8   sys
hexversionZ
from_float)selfvaluerD   r$   r$   r(   __init__  s(    		!zIFDRational.__init__c             C   s   |  j  S)N)r=   )ar$   r$   r(   rC   1  s    zIFDRational.numeratorc             C   s   |  j  S)N)r>   )rJ   r$   r$   r(   rD   5  s    zIFDRational.denominatorc             C   sA   |  j  d k r |  j |  j  f S|  j 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)rG   Zmax_denominatorfr$   r$   r(   r9   9  s    zIFDRational.limit_rationalc             C   s   t  t |  j   S)N)strrA   r?   )rG   r$   r$   r(   __repr__F  s    zIFDRational.__repr__c             C   s   |  j  j   S)N)r?   __hash__)rG   r$   r$   r(   rN   I  s    zIFDRational.__hash__c             C   s   |  j  | k S)N)r?   )rG   otherr$   r$   r(   __eq__L  s    zIFDRational.__eq__c                s     f d d   } | S)Nc                s   t  |  j    |   S)N)getattrr?   )rG   args)opr$   r(   delegateP  s    z'IFDRational._delegate.<locals>.delegater$   )rS   rT   r$   )rS   r(   	_delegateO  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)z
_numeratorz_denominatorz_val)*__name__
__module____qualname____doc__	__slots__rI   propertyrC   rD   r9   rM   rN   rP   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   rp   rq   r$   r$   r$   r(   r8     sL   "r8   c               @   s  e  Z d  Z d Z d 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 e e k r d d   Z n  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 dc dd de df dg dh di g   e dC dC  dD dE dF   Z e dC  dG dH    Z  e dI dC  dD dJ dK   Z! e dI  dL dM    Z" e dN d7  dD dO dP   Z# e dN  dQ dR    Z$ e dS dC  dD dT dU   Z% e dS  dV dW    Z& e dX d7  dD dY dZ   Z' e dX  d[ d\    Z( d] d^   Z) d_ d`   Z* da db   Z+ d S)j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
    s   II*     Nc             C   s   | d d  t  k r) t d |   n  | d k	 r; | n | d d  |  _ |  j t k ri d |  _ n' |  j t k r d |  _ n t d   |  j   |  j 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)
r3   SyntaxError_prefixMM_endianIIreset_unpacknext_legacy_api)rG   ifhr4   r$   r$   r(   rI     s    %
"zImageFileDirectory_v2.__init__c             C   s   |  j  S)N)r|   )rG   r$   r$   r(   <lambda>  s    zImageFileDirectory_v2.<lambda>c             C   s   |  j  S)N)_offset)rG   r$   r$   r(   r     s    c             C   s   |  j  S)N)r   )rG   r$   r$   r(   r     s    c             C   s   t  d   d  S)Nz"Not allowing setting of legacy api)	Exception)rG   rH   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   )rG   r$   r$   r(   r     s    					zImageFileDirectory_v2.resetc             C   s   t  t |    S)N)rL   dict)rG   r$   r$   r(   __str__  s    zImageFileDirectory_v2.__str__c             C   s   t  j d d t  t |   S)zPReturn a dictionary of the image's tags.

        .. deprecated:: 3.0.0
        zas_dict() is deprecated. zPlease use dict(ifd) instead.)warningswarnDeprecationWarningr   )rG   r$   r$   r(   as_dict  s    	zImageFileDirectory_v2.as_dictc             C   s   t  d d   |  j   D  S)z
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c             s   s-   |  ]# \ } } t  j |  j | f Vq d  S)N)r   lookupname)r%   coderH   r$   r$   r(   	<genexpr>  s   z.ImageFileDirectory_v2.named.<locals>.<genexpr>)r   items)rG   r$   r$   r(   named  s    zImageFileDirectory_v2.namedc             C   s    t  t |  j  t |  j  B S)N)lensetr   r   )rG   r$   r$   r(   __len__  s    zImageFileDirectory_v2.__len__c             C   s   | |  j  k rX |  j | } |  j | } |  j | \ } } | |  | |  j  |  | <n  |  j  | } |  j r t | t t f  r | f } n  | S)N)r   r   r   _load_dispatchr   
isinstancetuplebytes)rG   tagdatatypsizehandlerr:   r$   r$   r(   __getitem__  s    z!ImageFileDirectory_v2.__getitem__c             C   s   | |  j  k p | |  j k S)N)r   r   )rG   r   r$   r$   r(   __contains__  s    z"ImageFileDirectory_v2.__contains__c             C   s
   | |  k S)Nr$   )rG   r   r$   r$   r(   has_key  s    zImageFileDirectory_v2.has_keyc             C   s   |  j  | | |  j  d  S)N)_setitemr   )rG   r   rH   r$   r$   r(   __setitem__  s    z!ImageFileDirectory_v2.__setitem__c                sQ  t  t t f } t t k r+ | t f 7} n  t j |    t | |  rR | g n | } | |  j k r|  j r   j |  j | <q|d |  j | <t	 d d   | D  r d |  j | <q|t	 d d   | D  rt	 d d   | D  r d |  j | <qyd |  j | <q|t	 d	 d   | D  r4d
 |  j | <q|t t k rPd |  j | <q|t	 d d   | D  r|d |  j | <q|n  |  j | d k rt t k	 rt | t  r| j
 d d  n | g } n  t   f d d   | D  } | r|  j n |  j }   j d k rC| r3|  j | d k r3| f } n  | \ | | <n
 | | | <d  S)Nr   c             s   s   |  ] } t  | t  Vq d  S)N)r   r8   )r%   r'   r$   r$   r(   r     s    z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>r   c             s   s   |  ] } t  | t  Vq d  S)N)r   int)r%   r'   r$   r$   r(   r     s    c             s   s   |  ] } | d k  Vq d S)r   r-   Ni   r$   )r%   r'   r$   r$   r(   r     s    r   r   c             s   s   |  ] } t  | t  Vq d  S)N)r   rA   )r%   r'   r$   r$   r(   r     s    r,   r   c             s   s   |  ] } t  | t  Vq d  S)N)r   rL   )r%   r'   r$   r$   r(   r     s    asciireplacec             3   s   |  ] }   j  |  Vq d  S)N)Zcvt_enum)r%   rH   )infor$   r(   r   %  s    r   
   )r   r   )r
   r   rL   unicoder   r   r   r   rB   allencoder   r   r   length)rG   r   rH   r   Z	basetypesvaluesdestr$   )r   r(   r     s<    	-zImageFileDirectory_v2._setitemc             C   s=   |  j  j | d   |  j j | d   |  j j | d   d  S)N)r   popr   r   )rG   r   r$   r$   r(   __delitem__0  s    z!ImageFileDirectory_v2.__delitem__c             C   s    t  t |  j  t |  j  B S)N)iterr   r   r   )rG   r$   r$   r(   __iter__5  s    zImageFileDirectory_v2.__iter__c             C   s   t  j |  j | |  S)N)structunpackr~   )rG   fmtr   r$   r$   r(   r   8  s    zImageFileDirectory_v2._unpackc             G   s   t  j |  j | |  S)N)r   packr~   )rG   r   r   r$   r$   r(   _pack;  s    zImageFileDirectory_v2._packc                s      f d d   } | S)Nc                s\   d d l  m } |  j j d  rH |  j d d   j d d  |   <n   |  f t   <|  S)Nr   )r   load_r   _ )PIL.TiffTagsr   rr   
startswithr   r   )funcr   )idxr   r$   r(   	decorator?  s
    &z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr$   )r   r   r   r$   )r   r   r(   _register_loader>  s    z&ImageFileDirectory_v2._register_loaderc                s     f d d   } | S)Nc                s   |  t    <|  S)N)_write_dispatch)r   )r   r$   r(   r   H  s    
z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr$   )r   r   r$   )r   r(   _register_writerG  s    z&ImageFileDirectory_v2._register_writerc                sx   d d l  m } |  \ }   } | | | <t j d      d    f d d  f t | <  f d d   t | <d  S)Nr   )r   =Tc                s&   |  j  d j t |      |  S)Nz{0}{1})r   formatr   )rG   r   r   )r   r   r$   r(   r   R  s    z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                s#   d j     f d d   | D  S)N    c             3   s!   |  ] }  j    |  Vq d  S)N)r   )r%   rH   )r   rG   r$   r(   r   U  s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>)join)rG   r   )r   )rG   r(   r   T  s    )r   r   r   calcsizer   r   )Zidx_fmt_namer   r   r   r$   )r   r   r(   _register_basicM  s    
"z%ImageFileDirectory_v2._register_basicr   Hshortr   r+   longr   bsigned byter   hsigned short	   lsigned long   rK   rA   r,   ddoubler   Tc             C   s   | S)Nr$   )rG   r   r   r$   r$   r(   	load_byte\  s    zImageFileDirectory_v2.load_bytec             C   s   | S)Nr$   )rG   r   r$   r$   r(   
write_byte`  s    z ImageFileDirectory_v2.write_byter   c             C   s2   | j  d  r" | d  d  } n  | j d d  S)Ns    r   zlatin-1r   r6   )endswithdecode)rG   r   r   r$   r$   r(   load_stringd  s    z!ImageFileDirectory_v2.load_stringc             C   s@   t  j d d k r( | j d d  } n  d | j d d  d S)Nr   r   r   r   r   s    )rE   version_infor   r   )rG   rH   r$   r$   r(   write_stringj  s    z"ImageFileDirectory_v2.write_stringr   c                sw   |  j  d j t |  d  |  }  f d d     t   f d d   t | d  d  d  | d d  d   D  S)	Nz{0}Lr   c                s     r |  | f St  |  |  S)N)r8   )rJ   r   )r   r$   r(   r   t  s    z5ImageFileDirectory_v2.load_rational.<locals>.<lambda>c             3   s$   |  ] \ } }   | |  Vq d  S)Nr$   )r%   numdenom)combiner$   r(   r   u  s   z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   )r   r   r   r   zip)rG   r   r   valsr$   )r   r   r(   load_rationalq  s    %z#ImageFileDirectory_v2.load_rationalc                s    d j    f d d   | D  S)Nr   c             3   s*   |  ]  }   j  d  t | d   Vq d S)2Lr      Nl        )r   r<   )r%   frac)rG   r$   r(   r   z  s   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>)r   )rG   r   r$   )rG   r(   write_rationalx  s    z$ImageFileDirectory_v2.write_rationalr   c             C   s   | S)Nr$   )rG   r   r   r$   r$   r(   load_undefined}  s    z$ImageFileDirectory_v2.load_undefinedc             C   s   | S)Nr$   )rG   rH   r$   r$   r(   write_undefined  s    z%ImageFileDirectory_v2.write_undefinedr   c                sw   |  j  d j t |  d  |  }  f d d     t   f d d   t | d  d  d  | d d  d   D  S)	Nz{0}lr   c                s     r |  | f St  |  |  S)N)r8   )rJ   r   )r   r$   r(   r     s    z<ImageFileDirectory_v2.load_signed_rational.<locals>.<lambda>c             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   )rG   r   r   r   r$   )r   r   r(   load_signed_rational  s    %z*ImageFileDirectory_v2.load_signed_rationalc                s    d j    f d d   | D  S)Nr   c             3   s*   |  ]  }   j  d  t | d   Vq d S)r   r      Ni   @)r   r<   )r%   r   )rG   r$   r(   r     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>)r   )rG   r   r$   )rG   r(   write_signed_rational  s    z+ImageFileDirectory_v2.write_signed_rationalc             C   sH   | j  |  } t |  | k rD t d d | t |  f   n  | S)NzCorrupt EXIF data.  z,Expecting to read %d bytes but only got %d. )readr   IOError)rG   fpr   retr$   r$   r(   _ensure_read  s    z"ImageFileDirectory_v2._ensure_readc             C   s  |  j    | j   |  _ yExt |  j d |  j | d   d  D]} |  j d |  j | d   \ } } } } t r t j |  j	 } t
 j | d  } t d | | | | f d d	 n  y |  j | \ }	 }
 Wn+ t k
 rt r t d
 |  n  wE Yn X| |	 } | d k r| j   } |  j d |  \ } t rat d | | f d d	 n  | j |  t j | |  } | j |  n | d  |  } t |  | k rt j d | t |  | f  qE n  | sqE n  | |  j | <| |  j | <t rE | d k r!t d |  q5t d |  |  qE qE W|  j d |  j | d   \ |  _ Wn< t k
 r} z t j t |   d  SWYd  d  } ~ Xn Xd  S)Nr   r   r   HHL4sr,   unknownztag: %s (%d) - type: %s (%d)endr   z- 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   
_safe_readr   r   r   r   r   r   r   rL   )rG   r   ir   r   countr   tagnametypnameZ	unit_sizer   r   hereoffsetmsgr$   r$   r(   load  sV    
/*
	(zImageFileDirectory_v2.loadc             C   s  | j    d k r8 | j |  j |  j d d d   n  | j |  j d t |  j    g  } | j    t |  j  d d } d  } xt |  j j    D]\ } } | t k r t |  } n  |  j	 j
 |  } t r t d | | | f  n  t | t  r| n | f } |  j | |  |  }	 t rt j |  j }
 t j
 | d	  } t d
 |
 | | | f d d t |	  d k rt d t |	   qt d |  n  | d k rt |	  n	 t |  } t |	  d k r| j | | | |	 j d d  d f  q | j | | | |  j d |  |	 f  | t |	  d d d 7} q W| d  k	 r| | \ } } } } }	 |	 rt d   n  |  j d |  j d |  d |  } | | | | |	 f | | <n  xp | D]h \ } } } } }	 t d k rt | | | t |  t |	   n  | j |  j d | | | |   qW| j d  xJ | D]B \ } } } } }	 | j |	  t |	  d @rY| j d  qYqYW| 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   s    r   r+   r   z&multistrip support not yet implementedr   s       )r   r   )r   writer|   r   r   r   sortedr   STRIPOFFSETSr   r   r   r   r   r   r   r   r   r   r   appendljustNotImplementedErrorr   repr)rG   r   entriesr  Zstripoffsetsr   rH   r   r   r   r  r  r  r$   r$   r(   save  sX    &"!"$+( &%&zImageFileDirectory_v2.save)r   r   zshort)r   r+   zlong)r   r   r   )r   r   r   )r   r   r   )r   rK   zfloat)r,   r   r   ),rr   rs   rt   ru   rI   rw   r4   r  r   setterr   r   r   r   r   r   r   r   rL   r   r   r   r   r   r   r   r   r   r   listmapr   r   r   r   r   r   r   r   r   r   r   r	  r  r$   r$   r$   r(   rx   z  s\   		,	
	8rx   r   r   r   Zwrite_c               @   s   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 |  | |  d |  _ d  S)NT)rx   rI   r   )rG   rR   kwargsr$   r$   r(   rI   1  s    zImageFileDirectory_v1.__init__c             C   s   |  j  S)N)r   )rG   r$   r$   r(   r   5  s    zImageFileDirectory_v1.<lambda>c             C   s   |  j  S)N)r   )rG   r$   r$   r(   r   6  s    c             C   s:   |  d | j   } | 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`

        r4   )r4   r   r   r   )clsZoriginalifdr$   r$   r(   from_v28  s
    zImageFileDirectory_v1.from_v2c             C   sL   t  d |  j  } 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`

        r4   )rx   r4   r   r   r   r   )rG   r  r$   r$   r(   to_v2J  s
    zImageFileDirectory_v1.to_v2c             C   s   | |  j  k p | |  j k S)N)r   r   )rG   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   )rG   r$   r$   r(   r   ^  s    zImageFileDirectory_v1.__len__c             C   s    t  t |  j  t |  j  B S)N)r   r   r   r   )rG   r$   r$   r(   r   a  s    zImageFileDirectory_v1.__iter__c             C   s(   x! d D] } |  j  | | |  q Wd  S)NFT)FT)r   )rG   r   rH   r   r$   r$   r(   r   d  s    z!ImageFileDirectory_v1.__setitem__c             C   s   | |  j  k ro |  j | } |  j | } |  j | \ } } x0 d D]% } |  j | | |  | |  |  qC Wn  |  j  | } t | t t f  s | f } n  | S)NFT)FT)r   r   r   r   r   r   r   r   )rG   r   r   r   r   r   Zlegacyr:   r$   r$   r(   r   h  s    &z!ImageFileDirectory_v1.__getitem__N)rr   rs   rt   ru   rI   rw   tagsZtagdataclassmethodr  r  r   r   r   r   r   r$   r$   r$   r(   r    s   r  c                   s   e  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 d d d  Z   f d d   Z d d   Z d d   Z   S)TiffImageFileZTIFFz
Adobe TIFFc             C   s   |  j  j d  } t |  |  _ d |  _ |  _ |  j j |  _ |  _ d |  _	 |  j  |  _
 g  |  _ d |  _ d |  _ t r t d  t d |  j  t d |  n  |  j d  d S)	z#Open the first image in a TIFF filer   Nr   z*** TiffImageFile._open ***z
- __first:z- ifh: r   r6   )r   r   rx   tag_v2r   r  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp
_frame_pos	_n_frames_is_animatedr   r   _seek)rG   r   r$   r$   r(   _open  s    				
zTiffImageFile._openc             C   s|   |  j  d  k ru |  j   } y" x |  j |  j   d  q! WWn% t k
 rd |  j   d |  _  Yn X|  j |  n  |  j  S)Nr   )r%  r   r'  EOFErrorr   )rG   currentr$   r$   r(   n_frames  s    zTiffImageFile.n_framesc             C   sj   |  j  d  k rc |  j   } y |  j d  d |  _  Wn t k
 rR d |  _  Yn X|  j |  n  |  j  S)Nr   TF)r&  r   r   r)  )rG   r*  r$   r$   r(   is_animated  s    zTiffImageFile.is_animatedc             C   sH   |  j  t | d   t j |  j  t j j |  j |  j  |  _ d S)z%Select a given frame as current imager   N)	r'  maxr   Z_decompression_bomb_checkr   corenewmodeim)rG   framer$   r$   r(   r     s    zTiffImageFile.seekc             C   sS  |  j  |  _ x t |  j  | k r |  j s< t d   n  t rn t d | |  j |  j |  j j	   f  n  |  j j	   |  j j
 |  j  |  j j |  j  t r t d |  j j	    n  |  j j |  j  |  j j |  _ |  j d 7_ q W|  j j
 |  j |  |  j j |  j  t j |  j  |  _ |  _ | |  _ |  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)rG   r2  r$   r$   r(   r'    s(    	&	zTiffImageFile._seekc             C   s   |  j  S)zReturn the current frame number)r"  )rG   r$   r$   r(   r     s    zTiffImageFile.tellNc             C   s  d } | d k r. |  j  d k r. | | } n  |  j } | d k rU | d d f } n | d k r | d f } t |  j k r |  j t \ |  _ q nO | d	 k r | } n: | d
 k r | } t |  j k r |  j t f |  _ q n  t |  j k r
|  j t |  j d <n  | S)zSetup decoder contextsNr1   r   r   r   r   r    r   r   icc_profile)	_planar_configuration_compression
JPEGTABLESr   Ztile_prefix	PREDICTORdecoderconfig
ICCPROFILEr   )rG   rawmodeZlayertilerR   compressionr$   r$   r(   _decoder  s&    		zTiffImageFile._decoderc                s&   |  j  r |  j   St t |   j   S)N)use_load_libtiff_load_libtiffsuperr  r	  )rG   )	__class__r$   r(   r	    s    	
zTiffImageFile.loadc             C   s  t  j  j |   } |  j d k r0 t d   n  |  j s= | S|  j   t |  j  d k sk t d   n  |  j d d } t |  j d d  |  j j g } yP t	 |  j
 d  o t j |  j
 j    } t	 |  j
 d  r |  j
 j   n  Wn t k
 r
d	 } Yn X| r| | d
 <n  t  j |  j d t |  |  j  } y | j |  j |  Wn t k
 ryt d   Yn Xt	 |  j
 d  rt rt d  n  | j |  j
 j    \ } } n~ t	 |  j
 d  rt rt d  n  |  j
 j d  | j d  \ } } n1 t r t d  n  | j |  j
 j    \ } } g  |  _ d |  _ t	 |  j
 d  r~|  j s~|  j
 j   q~n  d |  _
 | d k  rt |   n  |  j   t  j  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close) r   r	  r=  r   Zload_preparer   r  r   r  hasattrr   osduprD  rE  Z_getdecoderr0  r   r:  setimager1  
ValueErrorr   r   r   rG  r   r   readonlyr!  rH  Zload_end)rG   ZpixelZextentsrR   r   decodernerrr$   r$   r(   rA    s\    	
$*
!				
zTiffImageFile._load_libtiffc             C   s  d |  j  k r t d   n  t |  j  j t d  |  _ |  j  j t d  |  _ |  j  j t d  } |  j  j t	 d  } t
 r t d  t d |  j  t d |  t d |  j  t d	 |  n  |  j  j t  } |  j  j t  } | | f |  _ t
 rt d
 |  j  n  |  j  j t d0  } t |  d k rmt |  t |  k o_d k n rmd1 } n  |  j  j | | | |  j  j t d2  |  j  j t f   f } t
 rt d |  n  y t | \ |  _ } Wn1 t k
 r	t
 rt d  n  t d   Yn Xt
 r0t d |  t d |  j  n  |  j |  j d <|  j  j t d  } |  j  j t d  }	 | r|	 r|  j  j t d  }
 |
 d k r| |	 f |  j d <q|
 d k r| d |	 d f |  j d <q| |	 f |  j d <n  d } } } g  |  _ d |  _ t  |  j  k r|  j  t  } |  j  j t! |  } |  j d } t" s`|  j d3 k rGd! |  _ | d k r|  j  j | | d |  j  j t d4  |  j  j t f   f } t
 rt d |  n  t | \ |  _ } n  |  j d5 k rd# | k rd$ } n  | |  j d f } |  j j# |  j d d | | f d | f  d% } q6xt$ t |   D] } |  j% | | |  } |  j j# |  j d t | |  | t | | |  f | | | f  t
 rt d& |  j  n  | | } | |  j d k rd } } | d 7} n  d% } qZWn"t& |  j  k r|  j  j d'  } |  j  j d(  } d% } x |  j  t& D] } | s||  j% | |  } n  |  j j# |  j | | | | | | f | | f  | | } | |  j d k r[d | | } } | |  j d k rd } } | d 7} d% } qq[q[Wn t
 r*t d)  n  t d*   |  j d+ k rd, d-   |  j  t' D } t( j) d. d/ j* |   |  _+ n  d% S)6z-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- size:zformat key:z- unsupported formatzunknown pixel modez- raw mode:z- pil mode:r>  r   dpir   gRQ@
resolutionFr   r   r   r   r   r    r!   r"   r#   r   TI;16BI;16zI;16NNztiles: iB  iC  z- unsupported data organizationzunknown data organizationr2   c             S   s    g  |  ] } t  | d    q S)r   )o8)r%   r   r$   r$   r(   r)     s   	 z(TiffImageFile._setup.<locals>.<listcomp>zRGB;Lr   )r   )r   )r   )
r   r   r   r   r   r    r!   r"   r#   r   )r   )rT  rU  ),r   r   COMPRESSION_INFOr   COMPRESSIONr7  PLANAR_CONFIGURATIONr6  PHOTOMETRIC_INTERPRETATION	FILLORDERr   r   
IMAGEWIDTHIMAGELENGTHr   SAMPLEFORMATr   r-  minr4   BITSPERSAMPLEEXTRASAMPLES	OPEN_INFOr0  r   r{   r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr=  r@  r  ROWSPERSTRIPREAD_LIBTIFFr  r   r?  TILEOFFSETSCOLORMAPr   r   r   palette)rG   photoZ	fillorderZxsizeZysizeZsampleFormatkeyr<  ZxresZyresZresunitxyr   offsetsr   wrJ   r  orj  r$   r$   r(   r3  X  s    
(			      						%

	


zTiffImageFile._setup)rr   rs   rt   r   Zformat_descriptionr(  rw   r+  r,  r   r'  r   r?  r	  rA  r3  r$   r$   )rC  r(   r  |  s   	Yr  c             C   sO  y# t  |  j \ } } } } } } Wn% t k
 rJ t d |  j   Yn Xt d |  }	 |  j j d |  j j d d   }
 t p |
 d k } t	 |  d d  |	 t
 <|  j d |	 t <|  j d |	 t <|  j j d i   } t r t d	 t |   n  t | t  r| j   } n  xD | D]< } | j |  |	 | <y | j | |	 j | <WqYqXqWt |  d
  rxZ t t t t t t f D]@ } | |  j k r|  j | |	 | <|  j j | |	 j | <qqWd |  j k r|  j d |	 t <qn  x 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 g
 D] \ } } | j# d d  } d | k r| |  j k rt$ j% d | | f t&  |  j | j# d d  |	 | <n  | |  j k rR|  j | |	 | <qRqRW|  j j d  } | r-d |	 t <| d |	 t <| d |	 t <n  | d1 k rk| |	 t' <t( |  d k rkt( |  |	 t) <qkn  | d  k	 r| |	 t* <n  | d k r| |	 t+ <n  | |	 t, <|  j d k r|  j- j. d d  } t/ d d   | D  |	 t0 <n  t( |  |  j d | d d d  } |  j d |	 t1 <| |  j d |	 t2 <d |	 t3 <t4 j |
 d  |	 t5 <| rt rt d!  t d" t6 |	 j7     n  d } t | d#  ry& | j8 d  t9 j: | j;    } Wqt< j= k
 rYqXn  t3 t2 g } i  } | d | t' <i  } t |  d$  r(|  j> j   } n  x t? j@ |	 j7   t	 |  d
 i   j7   | j7    D] \ } } | tA jB k r}q\n  | | k r\| | k r\t | tC tD k rtE n tD  r| jF d% d&  d' | | <qt | tG  rtH |  | | <q| | | <q\q\Wt r)t d( t6 | j7     n  |  j d2 k rAd+ } n  | |
 | | | f } tI jJ |  j d, | |  jK  } | jL |  j- d3 |  j  x< | jF d4  \ } } } | s| jM |  n  | rPqqW| d k  r0t d/ |   q0nA |	 jN |  } tO jP |  | d d5 |  j | | | d f f g  d0 |  j k rK|	 |  _Q n  d  S)6Nzcannot write mode %s as TIFFr4   r>  r   r6  r   r   ZtiffinfozTiffinfo Keys: %sr   r5  descriptionrS  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr   r   z %r is deprecated; use %r insteadrR  r   r2   r1   zRGB;Lc             s   s   |  ] } t  |  d  Vq d S)r   N)i8)r%   r'   r$   r$   r(   r     s    z_save.<locals>.<genexpr>r   r   zSaving using libtiff encoderz	Items: %srD  r   r   r   s    zConverted items: %sI;16BI;16zI;16NrF  r-   i   z(encoder error %d when writing image file_debug_multipage)r   )rv  rw  )r   r   i @  )r   r   )R	SAVE_INFOr0  r   r   rx   Zencoderinfor   r   WRITE_LIBTIFFrQ   rY  r   r\  r]  r   r   r  r   r  r  r   rI  re  rc  rd  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPr   r;  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr   r   r   r   r`  r   SAMPLESPERPIXELra  r^  rZ  r1  Z
getpaletter   ri  rf  STRIPBYTECOUNTSr  COMPRESSION_INFO_REVrX  r  r   r   rJ  rK  rD  ioUnsupportedOperationr   	itertoolschainr   ZLIBTIFF_COREr   rL   r   r   r8   rA   r   Z_getencoderZencoderconfigrL  r  r  r   _saverx  )r1  r   filenamer<  r4   rk  r   bitsextrar  r>  rF  r   rl  r   Zname_with_spacesrR  ZlutZstride_fpZ	blocklistZattsZ
legacy_ifdr   rH   rJ   er   sr   r  r$   r$   r(   r  .  s    #										 


 '

!	&r  c               @   sZ  e  Z d  Z d d d d d d d d d d d d d g Z e d:  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 d1 d2   Z d3 d4   Z d5 d6   Z d d d7 d8  Z d9 S);AppendingTiffWriterr   r   r   r   r        D      	  Fc             C   s   t  | d  r$ | |  _ d |  _ na | |  _ d |  _ y% t j | | rN d n d  |  _ Wn' t k
 r t j | d  |  _ Yn X|  j j   |  _ |  j	   d  S)Nr   FTzw+bzr+b)
rI  rK   close_fpr   r  openr   r   	beginningsetup)rG   fnr/  r$   r$   r(   rI     s    			%zAppendingTiffWriter.__init__c             C   s   |  j  j |  j t j  d  |  _ d |  _ |  j  j d  |  _ } | sW d |  _	 d  Sd |  _	 | d k r| |  j
 d  n( | d k r |  j
 d  n t d	   |  j   |  j   d  S)
Nr   r   TFs   II* rz   s   MM *ry   zInvalid TIFF file header)rK   r   r  rJ  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager   IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rG   r  r$   r$   r(   r    s    				
zAppendingTiffWriter.setupc             C   s   |  j  r d  S|  j j |  j  |  j j d  } | s< d  S| |  j k rZ t d   n  |  j   } | |  j 7} |  j j |  j  |  j	 |  |  j j |  |  j
   d  S)Nr   z1IIMM of new page doesn't match IIMM of first page)r  rK   r   r  r   r  r  readLongr  	writeLongfixIFD)rG   r  	IFDoffsetr$   r$   r(   finalize  s    	zAppendingTiffWriter.finalizec             C   s   |  j    |  j   d  S)N)r  r  )rG   r$   r$   r(   newFrame1  s    
zAppendingTiffWriter.newFramec             C   s   |  S)Nr$   )rG   r$   r$   r(   	__enter__6  s    zAppendingTiffWriter.__enter__c             C   s   |  j  r |  j   n  d S)NF)r  rH  )rG   exc_type	exc_value	tracebackr$   r$   r(   __exit__9  s    	zAppendingTiffWriter.__exit__c             C   s   |  j  j   |  j S)N)rK   r   r  )rG   r$   r$   r(   r   >  s    zAppendingTiffWriter.tellc             C   s<   | t  j k r | |  j 7} n  |  j j | |  |  j   S)N)rJ  r  r  rK   r   r   )rG   r  whencer$   r$   r(   r   A  s    zAppendingTiffWriter.seekc             C   s   |  j  j d t j  |  j  j   } d | d } d | k  oJ d k  n rn |  j  j t t |    n  |  j  j   |  _ d  S)Nr   r-   )	rK   r   rJ  SEEK_ENDr   r  r   	bytearrayr  )rG   posZpadBytesr$   r$   r(   r  H  s    zAppendingTiffWriter.goToEndc             C   s=   | |  _  |  j  d |  _ |  j  d |  _ |  j  d |  _ d  S)Nr+   r   ZHHL)endianlongFmtshortFmt	tagFormat)rG   r  r$   r$   r(   r  R  s    	zAppendingTiffWriter.setEndianc             C   ss   xl |  j    } | d k r5 |  j j   d |  _ Pn  |  j j |  |  j   } |  j j | d t j  q Wd  S)Nr   r   r,   )r  rK   r   r  r   	readShortrJ  SEEK_CUR)rG   r  numTagsr$   r$   r(   r  X  s    zAppendingTiffWriter.skipIFDsc             C   s   |  j  j |  S)N)rK   r  )rG   r   r$   r$   r(   r  c  s    zAppendingTiffWriter.writec             C   s(   t  j |  j |  j j d   \ } | S)Nr   )r   r   r  rK   r   )rG   rH   r$   r$   r(   r  f  s    $zAppendingTiffWriter.readShortc             C   s(   t  j |  j |  j j d   \ } | S)Nr   )r   r   r  rK   r   )rG   rH   r$   r$   r(   r  j  s    $zAppendingTiffWriter.readLongc             C   sf   |  j  j d t j  |  j  j t j |  j |   } | d  k	 rb | d k rb t d |   n  d  S)Nr   r   z wrote only %u bytes but wanted 4)	rK   r   rJ  r  r  r   r   r  r  )rG   rH   bytesWrittenr$   r$   r(   rewriteLastShortToLongn  s
    !z*AppendingTiffWriter.rewriteLastShortToLongc             C   sf   |  j  j d t j  |  j  j t j |  j |   } | d  k	 rb | d k rb t d |   n  d  S)Nr   z wrote only %u bytes but wanted 2r  )	rK   r   rJ  r  r  r   r   r  r  )rG   rH   r  r$   r$   r(   rewriteLastShortu  s
    !z$AppendingTiffWriter.rewriteLastShortc             C   sf   |  j  j d t j  |  j  j t j |  j |   } | d  k	 rb | d k rb t d |   n  d  S)Nr   z wrote only %u bytes but wanted 4)	rK   r   rJ  r  r  r   r   r  r  )rG   rH   r  r$   r$   r(   rewriteLastLong|  s
    !z#AppendingTiffWriter.rewriteLastLongc             C   sP   |  j  j t j |  j |   } | d  k	 rL | d k rL t d |   n  d  S)Nr   z wrote only %u bytes but wanted 2)rK   r  r   r   r  r  )rG   rH   r  r$   r$   r(   
writeShort  s    !zAppendingTiffWriter.writeShortc             C   sP   |  j  j t j |  j |   } | d  k	 rL | d k rL t d |   n  d  S)Nr   z wrote only %u bytes but wanted 4)rK   r  r   r   r  r  )rG   rH   r  r$   r$   r(   r    s    !zAppendingTiffWriter.writeLongc             C   s   |  j    |  j j   d  S)N)r  rK   rH  )rG   r$   r$   r(   rH    s    
zAppendingTiffWriter.closec             C   st  |  j    } xat |  D]S} t j |  j |  j j d   \ } } } |  j | } | | } | d k } | s |  j   }	 |	 |  j	 7}	 |  j
 |	  n  | |  j k rM|  j j   }
 | r |  j | d | d k d | d k |  j j |
 d  nE |  j j |	  |  j | d | d k d | d k |  j j |
  d  }	 }
 q | r |  j j d t j  q q Wd  S)Nr   r   isShortr   isLong)r  r   r   r   r  rK   r   
fieldSizesr  r  r  Tagsr   
fixOffsetsr   rJ  r  )rG   r  r  r   Z	fieldTyper  Z	fieldSizeZ	totalSizeZisLocalr  ZcurPosr$   r$   r(   r    s.    *
zAppendingTiffWriter.fixIFDc             C   s   | r | r t  d   n  x t |  D] } | rB |  j   n	 |  j   } | |  j 7} | r | d k r | d k r t  d   n  |  j |  |  j j d t j	  |  j
 d  |  j j d t j	  q* | r |  j |  q* |  j |  q* Wd  S)	Nz offset is neither short nor longi   r   znot implementedr   r   r   i)r  r   r  r  r  r  rK   r   rJ  r  r  r  r  )rG   r  r  r  r  r  r$   r$   r(   r    s    zAppendingTiffWriter.fixOffsetsN)r  r  r  r  r  r  )rr   rs   rt   r  r   r  rI   r  r  r  r  r  r   r   r  r  r  r  r  r  r  r  r  r  r  rH  r  r  r$   r$   r$   r(   r    sH   		
%r  c             C   s   t  |  d  s t |  | |  S|  j   } zd t |  R } xH t |  j  D]7 } |  j |  |  j   t |  | |  | j   qM WWd  QXWd  |  j |  Xd  S)Nr+  )	rI  r  r   r  r   r+  r   r	  r  )r1  r   r  Zcur_idxtfr   r$   r$   r(   	_save_all  s    
r  z.tifz.tiffz
image/tiff)]
__future__r   r   ZPILr   r   r   r   r   collectionsZ	fractionsr	   Znumbersr
   r   r  r  rJ  r   rE   r   r   __version__r   rg  rz  ZIFD_LEGACY_APIr   r}   ru  rV  r\  r]  r`  rX  rZ  r[  r~  r  r  rf  r  rc  rd  rY  re  r  r  r  r9  ri  rh  ra  r^  r8  r  r{  r|  r;  ZEXIFIFDr}  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATArW  r   r   r  rb  r3   r5   r<   r   r   r8   MutableMappingrx   r   r   r   setattrr  ZImageFileDirectoryr  ry  r  r  r  Zregister_openr   Zregister_saveZregister_save_allZregister_extensionZregister_mimer$   r$   r$   r(   <module>*   s  		
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%++++++..11111111%%%%%%%%%%%%%%++%%..+++.y 		W "%%%""