
hR\(              
   @   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 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 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 d. d 6d/ d0 6d1 d2 6d3 d4 6d5 d6 6d7 d8 6d9 d: 6d; d< 6d= d> 6d? d@ 6dA dB 6dC dD 6dE dF 6dG dH 6Z? dI dJ   e? j@   D ZA i^ dK dL f e d  d f d d f f  f 6dK dL f e d  d f d d f f  f 6dK dM f e d  d f d0 d f f  f 6dK dM f e d  d f d0 d f f  f 6dK dK f e d d f d d f f  f 6dK dK f e d d f d d f f  f 6dK dN f e d d f d0 d f f  f 6dK dN f e d d f d0 d f f  f 6dO dP f e d  d f d d0 f f  f 6dO dP f e d  d f d d0 f f  f 6dO dQ f e d  d f d0 d0 f f  f 6dO dQ f e d  d f d0 d0 f f  f 6dO dR f e d d f d d0 f f  f 6dO dR f e d d f d d0 f f  f 6dO dS f e d d f d0 d0 f f  f 6dO dS f e d d f d0 d0 f f  f 6dO dT f e d  d f d d4 f f  f 6dO dT f e d  d f d d4 f f  f 6dO dU f e d  d f d0 d4 f f  f 6dO dU f e d  d f d0 d4 f f  f 6dO dV f e d d f d d4 f f  f 6dO dV f e d d f d d4 f f  f 6dO dW f e d d f d0 d4 f f  f 6dO dW f e d d f d0 d4 f f  f 6dO dX f e d  d f d d< f f  f 6dO dX f e d  d f d d< f f  f 6dO dY f e d  d f d0 d< f f  f 6dO dY f e d  d f d0 d< f f  f 6dO dO f e d d f d d< f f  f 6dO dO f e d d f d d< f f  f 6dO dZ f e d d f d0 d< f f  f 6dO dZ f e d d f d0 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 6d_ d_ f e d d f d d^ f f  f 6d` da f e d d0 f d d^ f f  f 6d` db f e d d0 f d d^ f f  f 6dc dd f e d  d2 f d de f f  f 6dc df f e d  d2 f d de f f  f 6d` dg f e d d f d de f f  f 6d` dh f e d d0 f d de f f  f 6d` di f e d d0 f d de f f  f 6dc dd f e d d2 f d de f f  f 6dc df f e d d2 f d de f f  f 6dj dj f e d d f d d< d< f d0 f f 6dj dj f e d d f d d< d< f d0 f f 6dk dk f e d0 d f d d< d< d< f f  f 6dk dk f e d0 d f d d< d< d< f f  f 6dk dl f e d0 d f d0 d< d< d< f f  f 6dk dl f e d0 d f d0 d< d< d< f f  f 6dm dm f e d0 d f d d< d< d< d< f f  f 6dm dm f e d0 d f d d< d< d< d< f f  f 6dn dn f e d0 d f d d< d< d< d< f d  f f 6dn dn f e d0 d f d d< d< d< d< f d  f f 6dm do f e d0 d f d d< d< d< d< f d f f 6dm do f e d0 d f d d< d< d< d< f d f f 6dm dm f e d0 d f d d< d< d< d< f d0 f f 6dm dm f e d0 d f d d< d< d< d< f d0 f f 6dm dm f e d0 d f d d< d< d< d< f dp f f 6dm dm f e d0 d f d d< d< d< d< f dp f f 6dk dq f e d0 d f d d^ d^ d^ f f  f 6dk dr f e d0 d f d d^ d^ d^ f f  f 6dm ds f e d0 d f d d^ d^ d^ d^ f f  f 6dm dt f e d0 d f d d^ d^ d^ d^ f f  f 6dn du f e d0 d f d d^ d^ d^ d^ f d  f f 6dn dv f e d0 d f d d^ d^ d^ d^ f d  f f 6dm dw f e d0 d f d d^ d^ d^ d^ f d f f 6dm dx f e d0 d f d d^ d^ d^ d^ f d f f 6dm ds f e d0 d f d d^ d^ d^ d^ f d0 f f 6dm dt f e d0 d f d d^ d^ d^ d^ f d0 f f 6dy dz f e d2 d f d d f f  f 6dy dz f e d2 d f d d f f  f 6dy d{ f e d2 d f d0 d f f  f 6dy d{ f e d2 d f d0 d f f  f 6dy d| f e d2 d f d d0 f f  f 6dy d| f e d2 d f d d0 f f  f 6dy d} f e d2 d f d0 d0 f f  f 6dy d} f e d2 d f d0 d0 f f  f 6dy d~ f e d2 d f d d4 f f  f 6dy d~ f e d2 d f d d4 f f  f 6dy d f e d2 d f d0 d4 f f  f 6dy d f e d2 d f d0 d4 f f  f 6dy dy f e d2 d f d d< f f  f 6dy dy f e d2 d f d d< f f  f 6d d f e d2 d f d d< d< f d0 f f 6d d f e d2 d f d d< d< f d0 f f 6dy d f e d2 d f d0 d< f f  f 6dy d f e d2 d f d0 d< f f  f 6d d f e d6 d f d d< d< d< d< f f  f 6d d f e d6 d f d d< d< d< d< f f  f 6d d f e d8 d f d d< d< d< f f  f 6d d f e d8 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 6ZB d d d d g ZC d d   ZD d d   ZE i  ZF i  ZG Gd d   d e  ZH Gd d   d e jI  ZJ eF eJ _F eG eJ _G x` e j@   D]R \ ZK ZL eL jM d d  ZL eN eJ d eL eF eK d  eN eJ d eL eG eK  qW[F [G [K [L Gd d   d eJ  ZO eO ZP Gd d   d e j  ZQ i dK e d d d f d f dK 6dO e d d d< f d f dO 6dj e d d d< d< f d0 f dj 6dy e d2 d d< f d f dy 6d e d2 d d< d< f d0 f d 6dh e d d0 de f d f d` 6d[ e d d d^ f d f d[ 6da e d d0 d^ f d f da 6dd e d d2 de f d f dc 6dk e d0 d d< d< d< f d f dk 6dn e d0 d d< d< d< d< f d  f dn 6dm e d0 d d< d< d< d< f d0 f dm 6d e d6 d d< d< d< d< f d f d 6d e d8 d d< d< d< f d f d 6d e d< d d< d< d< f d f d 6di e d d0 de f d f di 6d_ e d d d^ f d f d_ 6db e d d0 d^ f d f db 6df e d d2 de f d f df 6ZR d d   ZS Gd d   d  ZT d d   ZU e jV eQ jW eQ eD  e jX eQ jW eS  e jY eQ jW eU  e jZ eQ jW d d g  e j[ eQ jW d  d S)    )divisionprint_function   )Image	ImageFileImagePaletteTiffTags)i8o8N)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  rawZ
tiff_ccitt   Zgroup3   Zgroup4   Ztiff_lzw   Z	tiff_jpeg   jpeg   Ztiff_adobe_deflate   Ztiff_raw_16i  packbitsi  Ztiff_thunderscani)  Ztiff_deflatei  Ztiff_sgilogit  Ztiff_sgilog24iu  c             C   s   i  |  ] \ } } | |  q S r   ).0kvr   r   H/var/www/dbchiro/venv/lib/python3.4/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   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;16BIzI;16SzI;16BSFzF;32F    zF;32BFzI;32NzI;32SzI;32BSZLARGBzRGB;RZRGBAZRGBXZRGBai  zRGB;16LzRGB;16BzRGBA;16LzRGBA;16BzRGBX;16LzRGBX;16BzRGBa;16LzRGBa;16BPzP;1zP;1RzP;2zP;2RzP;4zP;4RZPAzP;RZCMYKZYCbCrZLABs   MM *s   II* s   MM* s   II *c             C   s   |  d  d  t  k S)Nr   )PREFIXES)prefixr   r   r   _accept   s    r+   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    %r2   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)4r.   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  rT | j |  _ | j |  _  | |  _ n  t | t  r | j |  _  | j |  _ | j |  _ d S| d k r t 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)	r4   r3   floatr5   
isinstancer   	numeratordenominatorr.   )selfvaluer:   r   r   r   __init__  s$    		zIFDRational.__init__c             C   s   |  j  S)N)r3   )ar   r   r   r9   9  s    zIFDRational.numeratorc             C   s   |  j  S)N)r4   )r>   r   r   r   r:   =  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   )r:   r9   r5   Zlimit_denominator)r;   Zmax_denominatorfr   r   r   r/   A  s    zIFDRational.limit_rationalc             C   s   t  t |  j   S)N)strr7   r5   )r;   r   r   r   __repr__N  s    zIFDRational.__repr__c             C   s   |  j  j   S)N)r5   __hash__)r;   r   r   r   rB   Q  s    zIFDRational.__hash__c             C   s   |  j  | k S)N)r5   )r;   otherr   r   r   __eq__T  s    zIFDRational.__eq__c                s     f d d   } | S)Nc                s   t  |  j    |   S)N)getattrr5   )r;   args)opr   r   delegateX  s    z'IFDRational._delegate.<locals>.delegater   )rG   rH   r   )rG   r   	_delegateW  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__r=   propertyr9   r:   r/   rA   rB   rD   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   r   r   r   r   r.     sL   r.   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 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 da db dc dd de df dg g   e dA dA  dB dC dD   Z e dA  dE dF    Z e dG dA  dB dH dI   Z  e dG  dJ dK    Z! e dL d5  dB dM dN   Z" e dL  dO dP    Z# e dQ dA  dB dR dS   Z$ e dQ  dT dU    Z% e dV d5  dB dW dX   Z& e dV  dY dZ    Z' d[ d\   Z( d] d^   Z) d_ d`   Z* d S)h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)
r)   SyntaxError_prefixMM_endianIIreset_unpacknext_legacy_api)r;   ifhr*   r   r   r   r=     s    %
"zImageFileDirectory_v2.__init__c             C   s   |  j  S)N)rp   )r;   r   r   r   <lambda>  s    zImageFileDirectory_v2.<lambda>c             C   s   |  j  S)N)_offset)r;   r   r   r   ry     s    c             C   s   |  j  S)N)rw   )r;   r   r   r   ry     s    c             C   s   t  d   d  S)Nz"Not allowing setting of legacy api)	Exception)r;   r<   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_nextrz   )r;   r   r   r   rt     s    					zImageFileDirectory_v2.resetc             C   s   t  t |    S)N)r@   dict)r;   r   r   r   __str__  s    zImageFileDirectory_v2.__str__c             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   coder<   r   r   r   	<genexpr>  s   z.ImageFileDirectory_v2.named.<locals>.<genexpr>)r   items)r;   r   r   r   named  s    zImageFileDirectory_v2.namedc             C   s    t  t |  j  t |  j  B S)N)lensetr   r~   )r;   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|   r8   tuplebytes)r;   tagdatatypsizehandlerr0   r   r   r   __getitem__  s    z!ImageFileDirectory_v2.__getitem__c             C   s   | |  j  k p | |  j k S)N)r~   r   )r;   r   r   r   r   __contains__  s    z"ImageFileDirectory_v2.__contains__c             C   s
   | |  k S)Nr   )r;   r   r   r   r   has_key  s    zImageFileDirectory_v2.has_keyc             C   s   |  j  | | |  j  d  S)N)_setitemr|   )r;   r   r<   r   r   r   __setitem__   s    z!ImageFileDirectory_v2.__setitem__c                s  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 s6  j d  k rt |  d k r| r| r[|  j | d k r[| f } n  y | \ | | <Wqt k
 rt j d | t |  f  | d | | <YqXn
 | | | <d  S)Nr   c             s   s   |  ] } t  | t  Vq d  S)N)r8   r.   )r   r   r   r   r   r     s    z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>r   c             s   s   |  ] } t  | t  Vq d  S)N)r8   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)r8   r7   )r   r   r   r   r   r     s    r"   r   c             s   s   |  ] } t  | t  Vq d  S)N)r8   r@   )r   r   r   r   r   r     s    asciireplacec             3   s   |  ] }   j  |  Vq d  S)N)Zcvt_enum)r   r<   )infor   r   r   %  s    r   
   z=Metadata Warning, tag %s had too many entries: %s, expected 1r   )r   r   )r   r   r@   unicoder   r   r8   r   typeallencoder   r}   r~   lengthr   
ValueErrorwarningswarn)r;   r   r<   r|   Z	basetypesvaluesdestr   )r   r   r     sL    	*(zImageFileDirectory_v2._setitemc             C   s=   |  j  j | d   |  j j | d   |  j j | d   d  S)N)r~   popr}   r   )r;   r   r   r   r   __delitem__A  s    z!ImageFileDirectory_v2.__delitem__c             C   s    t  t |  j  t |  j  B S)N)iterr   r   r~   )r;   r   r   r   __iter__F  s    zImageFileDirectory_v2.__iter__c             C   s   t  j |  j | |  S)N)structunpackrr   )r;   fmtr   r   r   r   ru   I  s    zImageFileDirectory_v2._unpackc             G   s   t  j |  j | |  S)N)r   packrr   )r;   r   r   r   r   r   _packL  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   _ )r   r   rf   
startswithr   r   )funcr   )idxr   r   r   	decoratorP  s
    &z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr   )r   r   r   r   )r   r   r   _register_loaderO  s    z&ImageFileDirectory_v2._register_loaderc                s     f d d   } | S)Nc                s   |  t    <|  S)N)_write_dispatch)r   )r   r   r   r   Y  s    
z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr   )r   r   r   )r   r   _register_writerX  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{}{})ru   formatr   )r;   r   r|   )r   r   r   r   ry   c  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   r<   )r   r;   r   r   r   f  s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>)join)r;   r   )r   )r;   r   ry   e  s    )r   r   r   calcsizer   r   )Zidx_fmt_namer   r   r   r   )r   r   r   _register_basic^  s    
"z%ImageFileDirectory_v2._register_basicr   Hshortr   r!   longr   bsigned byter   hsigned short	   lsigned long   r?   r7   r"   ddoubler   Tc             C   s   | S)Nr   )r;   r   r|   r   r   r   	load_byteq  s    zImageFileDirectory_v2.load_bytec             C   s   | S)Nr   )r;   r   r   r   r   
write_byteu  s    z ImageFileDirectory_v2.write_byter   c             C   s2   | j  d  r" | d  d  } n  | j d d  S)Ns    r   zlatin-1r   r,   )endswithdecode)r;   r   r|   r   r   r   load_stringy  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    )sysversion_infor   r   )r;   r<   r   r   r   write_string  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{}Lr   c                s     r |  | f St  |  |  S)N)r.   )r>   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   )ru   r   r   r   zip)r;   r   r|   valsr   )r   r|   r   load_rational  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   r2   )r   frac)r;   r   r   r     s   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>)r   )r;   r   r   )r;   r   write_rational  s    z$ImageFileDirectory_v2.write_rationalr   c             C   s   | S)Nr   )r;   r   r|   r   r   r   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc             C   s   | S)Nr   )r;   r<   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{}lr   c                s     r |  | f St  |  |  S)N)r.   )r>   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   )ru   r   r   r   r   )r;   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   r2   )r   r   )r;   r   r   r     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>)r   )r;   r   r   )r;   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)r;   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:)rt   tellrz   rangeru   r   DEBUGr   r   r   r   getprintr   KeyErrorseekr   
_safe_readr   r   r   r   r   rv   r   r@   )r;   r   ir   r   countr   tagnametypnameZ	unit_sizer   r   hereoffsetmsgr   r   r   load  sX    
/	!
	(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   writerp   r   r   r~   sortedr   STRIPOFFSETSr   r   r   r   r8   r   r   r   r   r   r   appendljustNotImplementedErrorru   repr)r;   r   entriesr   Zstripoffsetsr   r<   r   r   r   r   r   r   r   r   r   save  sZ    &"!"$+
 &%&zImageFileDirectory_v2.save)r   r   zshort)r   r!   zlong)r   r   r   )r   r   r   )r   r   r   )r   r?   zfloat)r"   r   r   )+rf   rg   rh   ri   r=   rk   r*   r   r|   setterrt   r   r   r   r   r   r   r@   r   r   r   r   r   ru   r   r   r   r   listmapr   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   rl     sb   	>	
	9rl   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)rl   r=   rw   )r;   rF   kwargsr   r   r   r=   K  s    zImageFileDirectory_v1.__init__c             C   s   |  j  S)N)r}   )r;   r   r   r   ry   O  s    zImageFileDirectory_v1.<lambda>c             C   s   |  j  S)N)r   )r;   r   r   r   ry   P  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`

        r*   )r*   r   r   rv   )clsZoriginalifdr   r   r   from_v2R  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`

        r*   )rl   r*   r   r   r   r~   )r;   r  r   r   r   to_v2d  s
    zImageFileDirectory_v1.to_v2c             C   s   | |  j  k p | |  j k S)N)r}   r   )r;   r   r   r   r   r   u  s    z"ImageFileDirectory_v1.__contains__c             C   s    t  t |  j  t |  j  B S)N)r   r   r   r}   )r;   r   r   r   r   x  s    zImageFileDirectory_v1.__len__c             C   s    t  t |  j  t |  j  B S)N)r   r   r   r}   )r;   r   r   r   r   {  s    zImageFileDirectory_v1.__iter__c             C   s(   x! d D] } |  j  | | |  q Wd  S)NFT)FT)r   )r;   r   r<   r|   r   r   r   r   ~  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   r8   r   r   )r;   r   r   r   r   r   Zlegacyr0   r   r   r   r     s    &z!ImageFileDirectory_v1.__getitem__N)rf   rg   rh   ri   r=   rk   tagsZtagdataclassmethodr  r  r   r   r   r   r   r   r   r   r   r
  9  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 d d d  Z   f d d   Z d d   Z d d   Z d d   Z   S)TiffImageFileZTIFFz
Adobe TIFFFc             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   r,   )r   r   rl   tag_v2r   r  rv   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp
_frame_pos	_n_frames_is_animatedr   r   _seek)r;   rx   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   )r;   currentr   r   r   n_frames  s    zTiffImageFile.n_framesc             C   s   |  j  d  k r |  j d  k	 r3 |  j d k |  _  q |  j   } y |  j d  d |  _  Wn t k
 rv d |  _  Yn X|  j |  n  |  j  S)Nr   TF)r  r  r   r   r  )r;   r  r   r   r   is_animated  s    zTiffImageFile.is_animatedc             C   sR   |  j  |  s d S|  j |  t j |  j  t j j |  j |  j  |  _ d S)z%Select a given frame as current imageN)	Z_seek_checkr  r   Z_decompression_bomb_checkr   corenewmodeim)r;   framer   r   r   r     s
    zTiffImageFile.seekc             C   sb  |  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  |  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   rv   r
  r  r   r  _setup)r;   r$  r   r   r   r    s*    	&	zTiffImageFile._seekc             C   s   |  j  S)zReturn the current frame number)r  )r;   r   r   r   r     s    zTiffImageFile.tellNc             C   sn   d } | d k r. |  j  d k r. | | } n  |  j } | d k rU | d d f } n | d k rj | } n  | S)zSetup decoder contextsNr'   r   r   r   r   r   )_planar_configuration_compression)r;   rawmodeZlayertilerF   compressionr   r   r   _decoder  s    		zTiffImageFile._decoderc                s&   |  j  r |  j   St t |   j   S)N)use_load_libtiff_load_libtiffsuperr  r   )r;   )	__class__r   r   r     s    	
zTiffImageFile.loadc             C   s)   |  j  d k r% |  j r% d |  _ n  d  S)Nr   T)r  r  !_close_exclusive_fp_after_loading)r;   r   r   r   load_end  s    zTiffImageFile.load_endc             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 |  _ |  j r|  j d k r|  j r|  j
 j    d |  _
 qn  | d k  rt |   n  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)!r   r   r)  r   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)r;   ZpixelZextentsrF   r   decodernerrr   r   r   r-    sZ    	
$*
!			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 d.  } t |  d k rmt |  t |  k o_d k n rmd/ } n  |  j  j t d0  } |  j  j t f   } | d1 k rd } n | d k rd } n d } | t |  7} | t |  k rt |  d k r| | } n  |  j  j | | | | | f }	 t
 r<t d |	  n  y t |	 \ |  _ }
 Wn1 t k
 rt
 rvt d  n  t d   Yn Xt
 rt d |
  t d |  j  n  |  j |  j d <|  j  j t d  } |  j  j t d  } | r| r|  j  j t  } | d k r'| | f |  j d <q| d k rQ| d | d f |  j d <q| d k r| | f |  j 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 d k r)d |  _ | d k r|  j  j | | d |  j  j t d2  |  j  j t f   f }	 t
 rvt d |	  n  t |	 \ |  _ }
 n  |
 d k rd }
 n  d  |
 k r|
 j# d  d!  }
 n  d" |
 k r|
 j# d" d!  }
 n  |
 |  j d f } |  j j$ |  j d d | | f d | f  d } qx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 } q6Wn"t' |  j  k r|  j  j d$  } |  j  j d%  } d } x |  j  t' D] } | sZ|  j& |
 |  } n  |  j j$ |  j | | | | | | f | | f  | | } | |  j d k r9d | | } } | |  j d k rd } } | d 7} d } qq9q9Wn t
 rt d&  n  t d'   t( |  j  k r:|  j  t( |  j d( <n  |  j d) k rd* d+   |  j  t) D } t* j+ d, d- j, |   |  _- n  d S)3z-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:r   r   r   r   r   r   zformat key:z- unsupported formatzunknown pixel modez- raw mode:z- pil mode:r*  dpigRQ@N
resolutionFr   TzI;16zI;16Nz;16Bz;16Nz;16Lztiles: iB  iC  z- unsupported data organizationzunknown data organizationicc_profiler(   c             S   s    g  |  ] } t  | d    q S)r   )r
   )r   r   r   r   r   
<listcomp>4  s   	 z(TiffImageFile._setup.<locals>.<listcomp>zRGB;Lr   )r   )r   )r   )r   r   r   )r   ).r  r   COMPRESSION_INFOr   COMPRESSIONr'  PLANAR_CONFIGURATIONr&  PHOTOMETRIC_INTERPRETATION	FILLORDERr   r   
IMAGEWIDTHIMAGELENGTHr   SAMPLEFORMATr   maxminBITSPERSAMPLEEXTRASAMPLESr*   	OPEN_INFOr"  r   ro   r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr)  r,  r   ROWSPERSTRIPREAD_LIBTIFFr   r  	enumerater+  TILEOFFSETS
ICCPROFILECOLORMAPr   r   r   palette)r;   photoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countkeyr(  ZxresZyresZresunitxyr   offsetsr   wr>   r   r   orY  r   r   r   r%  o  s    
(			$							%

	


zTiffImageFile._setup)rf   rg   rh   r   Zformat_descriptionr0  r  rk   r  r  r   r  r   r+  r   r1  r-  r%  r   r   )r/  r   r    s   Wr  c             C   s  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x] t t t t t t f D]@ } | |  j k r|  j | |	 | <|  j j | |	 j | <qqWn  d |  j k r|  j d |	 t <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 k rR|  j | |	 | <qRqRW|  j j d  } | rd |	 t <| d |	 t <| d |	 t <n  | d. k r| |	 t# <t$ |  d k rt$ |  |	 t% <qn  | d  k	 r| |	 t& <n  | d k r6| |	 t' <n  | |	 t( <|  j d k r|  j) j* d d  } t+ d d   | D  |	 t, <n  t$ |  |  j d | d d d } |  j d |	 t- <| |  j d |	 t. <d |	 t/ <t0 j |
 d  |	 t1 <| rt r$t d  t d t2 |	 j3     n  d } t | d   rzy& | j4 d  t5 j6 | j7    } Wqzt8 j9 k
 rvYqzXn  t/ t. g } i  } | d | t# <i  } t |  d!  r|  j: j   } n  x t; j< |	 j3   t	 |  d
 i   j3   | j3    D] \ } } | t= j> k rqn  | | k r| | k rt | t? t@ k rFtA n t@  rl| jB d" d#  d$ | | <qt | tC  rtD |  | | <q| | | <qqWt rt d% t2 | j3     n  |  j d/ k rd( } n  | |
 | | | f } tE jF |  j d) | |  jG  } | jH |  j) d0 |  j  x< | jB d1  \ } } } | sX| jI |  n  | r*Pq*q*W| d k  rt d, |   qnA |	 jJ |  } tK jL |  | d d2 |  j | | | d f f g  d- |  j k r|	 |  _M n  d  S)3Nzcannot write mode %s as TIFFr*   r*  r   r&  r   r   ZtiffinfozTiffinfo Keys: %sr  rA  descriptionr@  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr?  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   r   r   s    zConverted items: %sI;16BI;16zI;16Nr4  r#   i   z(encoder error %d when writing image file_debug_multipage)r   )rd  re  )r   r   i @  )r   r   )N	SAVE_INFOr"  r   r   rl   encoderinfor   r   WRITE_LIBTIFFrE   rE  r   rH  rI  r   r   r  r8   r
  r  r   r6  rR  rP  rQ  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPr  rW  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTrM  r   SAMPLESPERPIXELrN  rJ  rF  r#  Z
getpaletter   rX  rS  STRIPBYTECOUNTSr   COMPRESSION_INFO_REVrD  r   r   r   r7  r8  r2  ioUnsupportedOperationr   	itertoolschainr   ZLIBTIFF_COREr   r@   r   r   r.   r7   r   Z_getencoderencoderconfigr9  r   r  r   _saverf  )r#  r   filenamer(  r*   rZ  r   bitsextrar  r*  r4  r   r[  r   r?  ZlutZstride_fpZ	blocklistZattsZ
legacy_ifdr   r<   r>   er   sr   r   r   r   r   rz  Y  s    #	!								


 '

!	&rz  c               @   sf  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 d1 d2   Z d3 d4   Z d5 d6   Z d d d7 d8  Z d9 S):AppendingTiffWriterr   r   r   r   r   i  i   iD  i  i  i	  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)
r6  r?   close_fpr   ru  openr   r   	beginningsetup)r;   fnr!  r   r   r   r=     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* rn   s   MM *rm   zInvalid TIFF file header)r?   r   r  r7  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager   IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)r;   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  r?   r   r  r   r  r  readLongr  	writeLongfixIFD)r;   r  	IFDoffsetr   r   r   finalize@  s    	zAppendingTiffWriter.finalizec             C   s   |  j    |  j   d  S)N)r  r  )r;   r   r   r   newFrameX  s    
zAppendingTiffWriter.newFramec             C   s   |  S)Nr   )r;   r   r   r   	__enter__]  s    zAppendingTiffWriter.__enter__c             C   s   |  j  r |  j   n  d S)NF)r  r;  )r;   exc_type	exc_value	tracebackr   r   r   __exit__`  s    	zAppendingTiffWriter.__exit__c             C   s   |  j  j   |  j S)N)r?   r   r  )r;   r   r   r   r   e  s    zAppendingTiffWriter.tellc             C   s<   | t  j k r | |  j 7} n  |  j j | |  |  j   S)N)r7  r  r  r?   r   r   )r;   r   whencer   r   r   r   h  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#   )	r?   r   r7  SEEK_ENDr   r   r   	bytearrayr  )r;   posZpadBytesr   r   r   r  o  s    zAppendingTiffWriter.goToEndc             C   s=   | |  _  |  j  d |  _ |  j  d |  _ |  j  d |  _ d  S)Nr!   r   ZHHL)endianlongFmtshortFmt	tagFormat)r;   r  r   r   r   r  y  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  r?   r   r  r   	readShortr7  SEEK_CUR)r;   r  numTagsr   r   r   r    s    zAppendingTiffWriter.skipIFDsc             C   s   |  j  j |  S)N)r?   r   )r;   r   r   r   r   r     s    zAppendingTiffWriter.writec             C   s(   t  j |  j |  j j d   \ } | S)Nr   )r   r   r  r?   r   )r;   r<   r   r   r   r    s    $zAppendingTiffWriter.readShortc             C   s(   t  j |  j |  j j d   \ } | S)Nr   )r   r   r  r?   r   )r;   r<   r   r   r   r    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)	r?   r   r7  r  r   r   r   r  r  )r;   r<   bytesWrittenr   r   r   rewriteLastShortToLong  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  )	r?   r   r7  r  r   r   r   r  r  )r;   r<   r  r   r   r   rewriteLastShort  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)	r?   r   r7  r  r   r   r   r  r  )r;   r<   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)r?   r   r   r   r  r  )r;   r<   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)r?   r   r   r   r  r  )r;   r<   r  r   r   r   r    s    !zAppendingTiffWriter.writeLongc             C   s   |  j    |  j j   d  S)N)r  r?   r;  )r;   r   r   r   r;    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  r?   r   
fieldSizesr  r  r  Tagsr   
fixOffsetsr   r7  r  )r;   r  r   r   Z	fieldTyper   Z	fieldSizeZ	totalSizeZisLocalr   ZcurPosr   r   r   r    s0    
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  r?   r   r7  r  r  r  r  )r;   r   r  r  r   r   r   r   r   r    s    zAppendingTiffWriter.fixOffsetsN)rf   rg   rh   r  r  r=   r  r  r  r  r  r   r   r  r  r  r   r  r  r  r  r  r  r  r;  r  r  r   r   r   r   r    sH   		
"r  c             C   s$  |  j  j   } |  j } t | j d g    } t |  d  rW | rW t |  | |  S|  j   } z t |   } x |  g | D] } | | _  | | _ t | d  s d }	 n	 | j	 }	 xE t
 |	  D]7 }
 | j |
  | j   t | | |  | j   q Wq WWd  QXWd  |  j |  Xd  S)Nappend_imagesr  r   )rh  copyry  r  r   r6  rz  r   r  r  r   r   r   r  )r#  r   r{  rh  ry  r  Zcur_idxtfZimsZnfrr   r   r   r   	_save_all  s(    					
r  z.tifz.tiffz
image/tiff)\
__future__r   r    r   r   r   r   Z_binaryr	   r
   collectionsZ	fractionsr   Znumbersr   r   ru  rw  r7  r   r   r   r   __version__r   rT  ri  ZIFD_LEGACY_APIrs   rq   rH  rI  rM  rD  rF  rG  rm  r   rr  rS  rs  rP  rQ  rE  rR  rn  ro  rp  Z	PREDICTORrX  rV  rN  rJ  Z
JPEGTABLESrq  rj  rk  rW  ZEXIFIFDrl  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATArC  r   rt  rO  r)   r+   r2   r   r   r.   MutableMappingrl   r   r   r   setattrr
  ZImageFileDirectoryr  rg  rz  r  r  Zregister_openr   Zregister_saveZregister_save_allZregister_extensionsZregister_mimer   r   r   r   <module>*   s  "
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%++++++..11111111++..111111%%%%%%%%%%%%%%++%%..+++.		u 		W "%%%""