o
    h)%                    @   sf  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZ ddlmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ eeZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3d Z4d!Z5d"Z6d#Z7d$Z8d%Z9d&Z:d'Z;d(Z<d)Z=d*Z>d+Z?d,Z@d-ZAd.ZBd/ZCd0ZDd1ZEd2ZFd3ZGd4ZHd5ZId6ZJd7ZKi dd8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXZLdYdZ eLM D ZNi e"d d[dd[d\fd]e#d d[dd[d\fd]e"d d[d9d[d\fd^e#d d[d9d[d\fd^e"dd[dd[d\fd_e#dd[dd[d\fd_e"dd[d9d[d\fd`e#dd[d9d[d\fd`e"d d[ddad\fdbe#d d[ddad\fdbe"d d[d9dad\fdce#d d[d9dad\fdce"dd[ddad\fdde#dd[ddad\fdde"dd[d9dad\fdee#dd[d9dad\fdee"d d[ddfd\fdgi e#d d[ddfd\fdge"d d[d9dfd\fdhe#d d[d9dfd\fdhe"dd[ddfd\fdie#dd[ddfd\fdie"dd[d9dfd\fdje#dd[d9dfd\fdje"d d[ddkd\fdle#d d[ddkd\fdle"d d[d9dkd\fdme#d d[d9dkd\fdme"dd[ddkd\fdne#dd[ddkd\fdne"dd[d9dkd\fdoe#dd[d9dkd\fdoe"dd[ddpd\fdqe"dd[ddrd\fdsi e#dd[ddrd\fdte"dd[d9drd\fdue"ddaddrd\fdve#ddaddrd\fdwe"d dxddyd\fdze#d dxddyd\fd{e"dd[ddyd\fd|e"ddaddyd\fd}e#ddaddyd\fd~e"ddxddyd\fdze#ddxddyd\fd{e"dd[dddafde#dd[dddafde"d9d[ddd\fde#d9d[ddd\fde"d9d[d9dd\fde#d9d[d9dd\fdi e"d9d[ddd\fde#d9d[ddd\fde"d9d[dddfde#d9d[dddfde"d9d[dddfde#d9d[dddfde"d9d[dddfde#d9d[dddfde"d9d[ddd[fde#d9d[ddd[fde"d9d[dddfde#d9d[dddfde"d9d[dddfde#d9d[dddfde"d9d[dddafde#d9d[dddafde"d9d[dddfdi e#d9d[dddfde"d9d[dddfde#d9d[dddfde"d9d[dddfde#d9d[dddfde"d9d[ddd\fde#d9d[ddd\fde"d9d[ddd\fde#d9d[ddd\fde"d9d[dddfde#d9d[dddfde"d9d[ddd[fde#d9d[ddd[fde"d9d[dddafde#d9d[dddafde"d;d[dd[d\fde#d;d[dd[d\fdi e"d;d[d9d[d\fde#d;d[d9d[d\fde"d;d[ddad\fde#d;d[ddad\fde"d;d[d9dad\fde#d;d[d9dad\fde"d;d[ddfd\fde#d;d[ddfd\fde"d;d[d9dfd\fde#d;d[d9dfd\fde"d;d[ddkd\fde#d;d[ddkd\fde"d;d[dddafde#d;d[dddafde"d;d[d9dkd\fde#d;d[d9dkd\fde"d?d[ddd\fde#d?d[ddd\fde"d?d[dddfde#d?d[dddfde"d?d[dddfde#d?d[dddfde"d?d[ddd\fde"dAd[ddd\fde#dAd[ddd\fde"dEd[ddd\fde#dEd[ddd\fdi
ZOg dZPdd ZQdd ZRdd ZSi ZTi ZUG dd deZVG dd deZWeTeW_TeUeW_UeM D ]!\ZXZYeYZddZYe[eWdeY eTeX d  e[eWdeY eUeX  q[T[U[X[YG dd deWZ\e\Z]G ddÄ dejZ^i dde"ddd[dfdde"dddkdfdde"dddd9fdde"d;ddkdfdde"d;ddd9fdde"dd9dydfdde"dddrdfdde"dd9drdfdde"dd;dydfdde"d9dddfdde"d9ddd fdde"d9ddd9fdde"d?dddfdde"dAdddfdde"dEdddfdde#dd9dydfdde#dddrdfde#dd9drdfde#dd;dydfdٜZ_ddۄ Z`G dd݄ d݃Zadd߄ Zbece^jde^eQ eee^jde` efe^jdeb ege^jdddg ehe^jdd dS )    N)MutableMapping)Fraction)NumberRational   )Image	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8TYPESFT   s   IIs   MM   i  i  i  i  i
  i    i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  B  C  D  iE  iJ  iR  iS  i[    i  i  i  I  is  ii    i  i  i  raw   Z
tiff_ccitt   Zgroup3   Zgroup4   Ztiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflatei  Ztiff_raw_16i  Zpackbitsi)  Ztiff_thunderscani  tiff_deflateit  Ztiff_sgilogiu  Ztiff_sgilog24im  lzmaiP  ZzstdiQ  Zwebpc                 C   s   i | ]\}}||qS  r(   ).0kvr(   r(   [/var/www/html/magazine_api/magazine_env/lib/python3.10/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    r-   r   r(   )1z1;I)r/   z1;IR)r/   r/   )r/   z1;R)r   )LzL;2I)r0   zL;2IR)r0   zL;2)r0   zL;2R)r   )r0   zL;4I)r0   zL;4IR)r0   zL;4)r0   zL;4R)r$   )r0   zL;I)r0   zL;IR)r0   r0   )r0   zL;R)   )I;16zI;12)   )r2   r2   )I;16Br4   )r2   zI;16R)II;16S)r5   I;16BS)r   )    )FF;32F)r9   F;32BF)r5   zI;32N)r5   I;32S)r5   I;32BS)r$   r$   )LAr>   )r$   r$   r$   )RGBr?   )r?   zRGB;R)r$   r$   r$   r$   )RGBAr@   r   )RGBXrB   )r$   r$   r$   r$   r$   r   r   )rB   ZRGBXX)r$   r$   r$   r$   r$   r$   )r   r   r   )rB   ZRGBXXX)r@   ZRGBa)r   r   )r@   ZRGBaX)r   r   r   )r@   ZRGBaXX)r   r   )r@   ZRGBAX)r   r   r   )r@   ZRGBAXX)i  )r3   r3   r3   )r?   zRGB;16L)r?   zRGB;16B)r3   r3   r3   r3   )r@   zRGBA;16L)r@   zRGBA;16B)rB   zRGBX;16L)rB   zRGBX;16B)r@   zRGBa;16L)r@   zRGBa;16B)PzP;1)rD   zP;1R)rD   zP;2)rD   zP;2R)rD   zP;4)rD   zP;4R)rD   rD   )PArE   )rD   zP;R)CMYKrF   )rF   ZCMYKX)rF   ZCMYKXX)rF   zCMYK;16L)r?   rB   )LABrG   )   MM *   II* s   MM* s   II *s   MM +s   II+ c                 C   s   | d d t v S Nr   )PREFIXESprefixr(   r(   r,   _accept     rN   c                 C   s<   t | dk}t|rd|  n| |}|r|d d d S |S )Nr   )absIFDRationallimit_rational)valmax_valinvn_dr(   r(   r,   _limit_rational  s   rX   c                 C   sP   t | }|j|jf}t||k rt| t|}t||kr&t | } t| |}|S N)r   	numeratordenominatorminrX   rQ   max)rT   rU   Zmin_valfracrW   r(   r(   r,   _limit_signed_rational  s   
r_   c                   @   sB  e Zd ZdZ	 dZd3ddZedd Zedd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Z	 edZedZedZedZedZedZedZedZed Zed!Zed"Zed#Zed$Zed%Zed&Zed'Zed(Z ed)Z!ed*Z"ed+Z#ed,Z$ed-Z%ed.Z&ed/Z'ed0Z(ed1Z)d2S )4rR   zImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )
_numerator_denominator_valr   c                 C   s   t |tr|j| _|j| _|j| _dS t |tr!|j| _|j| _n|| _|| _|dkr2td| _dS |dkr=t|| _dS t||| _dS )z
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   nanr   )	
isinstancerR   rZ   r`   r[   ra   rb   r   float)selfvaluer[   r(   r(   r,   __init__:  s   


zIFDRational.__init__c                 C      | j S rY   )r`   ar(   r(   r,   rZ   T     zIFDRational.numeratorc                 C   ri   rY   )ra   rj   r(   r(   r,   r[   X  rl   zIFDRational.denominatorc                 C   s.   | j dkr| j| j fS | j|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )r[   rZ   rb   limit_denominator)rf   max_denominatorfr(   r(   r,   rS   \  s   
zIFDRational.limit_rationalc                 C   s   t t| jS rY   )strre   rb   rf   r(   r(   r,   __repr__i  s   zIFDRational.__repr__c                 C   s
   | j  S rY   )rb   __hash__rq   r(   r(   r,   rs   l  s   
zIFDRational.__hash__c                 C   s0   | j }t|tr|j }t|trt|}||kS rY   )rb   rd   rR   re   )rf   otherrT   r(   r(   r,   __eq__o  s   

zIFDRational.__eq__c                 C   s   | j | j| jgS rY   )rb   r`   ra   rq   r(   r(   r,   __getstate__w  rO   zIFDRational.__getstate__c                 C   s,   t | d |\}}}|| _|| _|| _d S )Nr   )rR   rh   rb   r`   ra   )rf   staterb   r`   ra   r(   r(   r,   __setstate__z  s
   

zIFDRational.__setstate__c                        fdd}|S )Nc                    s   t | j | S rY   )getattrrb   )rf   argsopr(   r,   delegate  rO   z'IFDRational._delegate.<locals>.delegater(   )r}   r~   r(   r|   r,   	_delegate  s   zIFDRational._delegate__add____radd____sub____rsub____mul____rmul____truediv____rtruediv____floordiv____rfloordiv____mod____rmod____pow____rpow____pos____neg____abs__	__trunc____lt____gt____le____ge____bool____ceil__	__floor__	__round__Nr.   )*__name__
__module____qualname____doc__	__slots__rh   propertyrZ   r[   rS   rr   rs   ru   rv   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r(   r(   r,   rR   ,  sV    


rR   c                   @   s  e Zd ZdZd^ddZedd Zedd Zed	d Zej	d
d Zdd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fej$d8d9fg	 ed:d:d_d<d=Z%ed:d>d? Z&ed@d:d_dAdBZ'ed@dCdD Z(edEdFd_dGdHZ)edEdIdJ Z*edKd:d_dLdMZ+edKdNdO Z,edPdFd_dQdRZ-edPdSdT Z.dUdV Z/dWdX Z0d`dZd[Z1d\d] Z2dS )aImageFileDirectory_v2a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

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

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

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

       II*     Nc                 C   s   t |stdt| d|dur|n|dd | _| jtkr$d| _n| jtkr-d| _ntd|d dk| _|| _i | _		 | 
  | jrP| d	|d
d n	| d|dd \| _d| _dS )a  Initialize an ImageFileDirectory.

        To construct an ImageFileDirectory from a real file, pass the 8-byte
        magic header to the constructor.  To only set the endianness, pass it
        as the 'prefix' keyword argument.

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr   ><znot a TIFF IFD+   Qr$   r0   r   F)rN   SyntaxErrorrepr_prefixMM_endianII_bigtiffgrouptagtypereset_unpacknext_legacy_api)rf   ifhrM   r   r(   r(   r,   rh     s    

,
zImageFileDirectory_v2.__init__c                 C   ri   rY   )r   rq   r(   r(   r,   <lambda>      zImageFileDirectory_v2.<lambda>c                 C   ri   rY   )_offsetrq   r(   r(   r,   r     r   c                 C   ri   rY   )r   rq   r(   r(   r,   r     r   c                 C   s   t d)Nz"Not allowing setting of legacy api)	Exceptionrf   rg   r(   r(   r,   
legacy_api
  s   z ImageFileDirectory_v2.legacy_apic                 C   s(   i | _ i | _i | _i | _d | _d | _d S rY   )_tags_v1_tags_v2_tagdatar   _nextr   rq   r(   r(   r,   r     s   
zImageFileDirectory_v2.resetc                 C   s   t t| S rY   )rp   dictrq   r(   r(   r,   __str__     zImageFileDirectory_v2.__str__c                    s    fdd   D S )z
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c                    s"   i | ]\}}t | jj|qS r(   )r   lookupr   name)r)   coderg   rq   r(   r,   r-     s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsrq   r(   rq   r,   named  s   
zImageFileDirectory_v2.namedc                 C      t t| jt| jB S rY   )lensetr   r   rq   r(   r(   r,   __len__$     zImageFileDirectory_v2.__len__c                 C   sf   || j vr| j| }| j| }| j| \}}|| || j| |< | j | }| jr1t|ttfs1|f}|S rY   )r   r   r   _load_dispatchr   rd   tuplebytes)rf   tagdatatypsizehandlerrT   r(   r(   r,   __getitem__'  s   



z!ImageFileDirectory_v2.__getitem__c                 C      || j v p	|| jv S rY   )r   r   rf   r   r(   r(   r,   __contains__2     z"ImageFileDirectory_v2.__contains__c                 C   s   |  ||| j d S rY   )_setitemr   )rf   r   rg   r(   r(   r,   __setitem__5  r   z!ImageFileDirectory_v2.__setitem__c              
      s  t ttf}t|| j t||r|gn|}|| jvr jr% j| j|< ntj	| j|< t
dd |D rGt
dd |D r@tjntj| j|< nkt
dd |D rt
dd |D r`tj| j|< nRt
dd |D rptj| j|< nBt
dd |D r|tjntj| j|< n/t
dd |D rtj| j|< nt
d	d |D rtj| j|< nt
d
d |D rtj| j|< | j| tj	krdd |D }n| j| tjkrdd |D }| j| tjkot|t}|st fdd|D }|r| jn| j}|sO jdks| j| tjks jd u rOt|dkrO|sO|r'| j| tjtjfv r'|f}z|\||< W d S  tyN   td| dt| d |d ||< Y d S w |||< d S )Nc                 s       | ]}t |tV  qd S rY   )rd   rR   r)   r+   r(   r(   r,   	<genexpr>C      z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s       | ]}|d kV  qdS r   Nr(   r   r(   r(   r,   r   F      c                 s   r   rY   )rd   intr   r(   r(   r,   r   I  r   c                 s   s(    | ]}d |  kodk n  V  qdS )r   r   Nr(   r   r(   r(   r,   r   J     & c                 s   s(    | ]}d |  k odk n  V  qdS )i i   Nr(   r   r(   r(   r,   r   L  r   c                 s   r   r   r(   r   r(   r(   r,   r   Q  r   c                 s   r   rY   )rd   re   r   r(   r(   r,   r   T  r   c                 s   r   rY   )rd   rp   r   r(   r(   r,   r   V  r   c                 s   r   rY   )rd   r   r   r(   r(   r,   r   X  r   c                 S   s&   g | ]}t |tr|d dn|qS )asciireplace)rd   rp   encoder   r(   r(   r,   
<listcomp>\  s    z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S   s"   g | ]}t |trt|n|qS r(   )rd   r   re   r   r(   r(   r,   r   a  s   " c                 3   s    | ]}  |V  qd S rY   )Zcvt_enumr)   rg   infor(   r,   r   e  r   r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   rp   r   r   r   rd   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthr   
ValueErrorwarningswarn)rf   r   rg   r   Z	basetypesvaluesis_ifddestr(   r   r,   r   8  sr   



 zImageFileDirectory_v2._setitemc                 C   s.   | j |d  | j|d  | j|d  d S rY   )r   popr   r   r   r(   r(   r,   __delitem__  s   z!ImageFileDirectory_v2.__delitem__c                 C   r   rY   )iterr   r   r   rq   r(   r(   r,   __iter__  r   zImageFileDirectory_v2.__iter__c                 C   s   t | j| |S rY   )structunpackr   )rf   fmtr   r(   r(   r,   r     s   zImageFileDirectory_v2._unpackc                 G   s   t j| j| g|R  S rY   )r   packr   )rf   r  r   r(   r(   r,   _pack  r   zImageFileDirectory_v2._packc                    s    fdd}|S )Nc                    sB   ddl m} | jdr| jdd  dd| < | ft < | S )Nr   r   load_r   _ )r   r   r   
startswithr   r   )funcr   idxr   r(   r,   	decorator  s
   z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr(   )r
  r   r  r(   r	  r,   _register_loader  s   z&ImageFileDirectory_v2._register_loaderc                    ry   )Nc                    s   | t  < | S rY   )_write_dispatch)r  r
  r(   r,   r    s   z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr(   )r
  r  r(   r  r,   _register_writer  s   z&ImageFileDirectory_v2._register_writerc                    sX   ddl m} | \} }|||< td  d fdd	ft|<  fddt|< d S )	Nr   r   =Tc                    s   |  t|    |S rY   )r   r   rf   r   r   r  r   r(   r,   r     s   z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                    s   d  fdd|D S )N    c                 3   s    | ]	}  |V  qd S rY   )r  r   )r  rf   r(   r,   r     s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrf   r   )r  rq   r,   r     s   T)r   r   r   calcsizer   r  )Zidx_fmt_namer   r
  r   r(   r  r,   _register_basic  s   
z%ImageFileDirectory_v2._register_basicHZshortr0   longbzsigned bytehzsigned shortlzsigned longro   re   ddoubler   Zlong8r   Tc                 C      |S rY   r(   r  r(   r(   r,   	load_byte     zImageFileDirectory_v2.load_bytec                 C   r!  rY   r(   rf   r   r(   r(   r,   
write_byte  r#  z ImageFileDirectory_v2.write_byter   c                 C   s"   | dr|d d }|ddS )N    rP   zlatin-1r   )endswithdecoder  r(   r(   r,   load_string  s   
z!ImageFileDirectory_v2.load_stringc                 C   s   d| dd d S )Nr  r   r   r&  )r   r   r(   r(   r,   write_string  s   z"ImageFileDirectory_v2.write_stringr   r$   c                    V   |  t|d  d|}fdd t fddt|d d d |dd d D S )	Nr   r0   c                        r| |fS t | |S rY   rR   rk   r  r   r(   r,   combine     z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3       | ]
\}} ||V  qd S rY   r(   r)   numdenomr0  r(   r,   r         z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   r   r   r   ziprf   r   r   valsr(   r0  r   r,   load_rational     0z#ImageFileDirectory_v2.load_rationalc                       d  fdd|D S )Nr  c                 3   s(    | ]} j d gt|dR  V  qdS )Z2Ll    N)r  rX   r)   r^   rq   r(   r,   r     s    
z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r  r  r(   rq   r,   write_rational  s   z$ImageFileDirectory_v2.write_rationalr"   c                 C   r!  rY   r(   r  r(   r(   r,   load_undefined  r#  z$ImageFileDirectory_v2.load_undefinedc                 C   r!  rY   r(   r   r(   r(   r,   write_undefined  r#  z%ImageFileDirectory_v2.write_undefined
   c                    r+  )	Nr   r  c                    r,  rY   r-  r.  r/  r(   r,   r0    r1  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   r2  rY   r(   r3  r6  r(   r,   r     r7  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   r8  r:  r(   r<  r,   load_signed_rational  r>  z*ImageFileDirectory_v2.load_signed_rationalc                    r?  )Nr  c                 3   s*    | ]} j d gt|ddR  V  qdS )Z2lii   N)r  r_   r@  rq   r(   r,   r     s
    
z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r  r  r(   rq   r,   write_signed_rational  s   z+ImageFileDirectory_v2.write_signed_rationalc                 C   s4   | |}t||krtd| dt| d|S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readr   OSError)rf   fpr   retr(   r(   r,   _ensure_read  s   
z"ImageFileDirectory_v2._ensure_readc              
   C   sr  |    | | _z| jr| d| |dn	| d| |dd }t|D ]}| jr7| d| |dn	| d| |d	\}}}}t|| j	j
}t|d
}	d| d| d|	 d| d	}
z	| j| \}}W n ty~   t|
d|   Y q(w || }|| jrdndkr| }| | jrdnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 q(|st|
 q(|| j|< || j|< |
d|dkrd| nt| 7 }
t|
 q(| jr| d| |dn	| d| |d\| _W d S  ty8 }
 ztt|
 W Y d }
~
d S d }
~
ww )Nr   r$   r  r   r   ZHHQ8s   HHL4sr1   unknownztag:  (
) - type: )z - unsupported type r   r0   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read rG  z. Skipping tag 
 - value: r8   <table: %d bytes>)r   tellr   r   r   rL  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readr   r   r   r   r   r   r   rI  rp   )rf   rJ  Z	tag_countir   r   countr   tagnametypnamemsgZ	unit_sizer   r   hereoffsetr(   r(   r,   load  sz   






zImageFileDirectory_v2.loadr   c                 C   s  |  dt| j}g }|t| t| jd  d }d }t| j D ]\}}|tkr/t|}| j|}t	d| d| dt
|  |tjkoNt|t}|ry| jdkrYd}	nd	}	t|	|d
}
| j| }| D ]\}}||
|< qj|
|}nt|tr|n|f}| j| | g|R  }t|| jj}|rdnt|d}d| d| d| d| d	}|dt|dkrdt| nt| 7 }t	| |rd}n|tjtjtjfv rt|}nt|}t|dkr|||||dddf q#|||||  d||f |t|d d d 7 }q#|d ur<|| \}}}}}|r%td|  d| d|d | }|||||f||< |D ]*\}}}}}t	| d| d| dt
| dt
| 	 ||  d||||7 }q>|d7 }|D ]\}}}}}||7 }t|d@ r|d7 }qo|S )Nr  r1   r   zTag z, Type: z	, Value: r   s   II*    s   MM *   )r   ifdrO  zsave: rP  rQ  rR  rS  r3   rT  r   r&  r  r0   r   z&multistrip support not yet implementedr   r  rN  s       ) r  r   r   sortedr   STRIPOFFSETSr   rW  rY  rZ  r   r   r   rd   r   r   r   tobytesr   r  r   r   r   r   rp   r   r   r   appendljustNotImplementedErrorr   )rf   rc  resultentriesZstripoffsetsr   rg   r   r   r   re  r   Zifd_tagZ	ifd_valuer   r_  r`  ra  r^  r(   r(   r,   rh  P  sj    





.zImageFileDirectory_v2.tobytesc                 C   sN   |  dkr|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r$   )rU  writer   r  rh  r   )rf   rJ  rc  rl  r(   r(   r,   save  s   

zImageFileDirectory_v2.save)r   NNr  rA   )3r   r   r   r   rh   r   rM   rc  r   setterr   r   r   r   r   r   r   r   r   r   r   r  r  r  r  listmapr   r   r   ZSIGNED_BYTEr   r   FLOATr   ZIFDZLONG8r"  r%  r)  r*  r=  rA  rB  rC  rE  rF  rL  rd  rh  rp  r(   r(   r(   r,   r     s|    
<
P













	
DLr   r  r  r  Zwrite_c                       s   e Zd ZU dZ fddZedd Zedd Zee	d< 	 e
dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Z  ZS )ImageFileDirectory_v1a  This class represents the **legacy** interface to a TIFF tag directory.

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

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

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

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    c                    s   t  j|i | d| _d S )NT)superrh   r   )rf   r{   kwargs	__class__r(   r,   rh     s   
zImageFileDirectory_v1.__init__c                 C   ri   rY   )r   rq   r(   r(   r,   r     r   zImageFileDirectory_v1.<lambda>c                 C   ri   rY   )r   rq   r(   r(   r,   r     r   r   c                 C   s(   | |j d}|j|_|j|_|j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`

        rL   )rM   r   r   r   )clsoriginalre  r(   r(   r,   from_v2  s
   zImageFileDirectory_v1.from_v2c                 C   s4   t | jd}t| j|_t| j|_t| j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`

        rL   )r   rM   r   r   r   r   )rf   re  r(   r(   r,   to_v2  s
   zImageFileDirectory_v1.to_v2c                 C   r   rY   )r   r   r   r(   r(   r,   r     r   z"ImageFileDirectory_v1.__contains__c                 C   r   rY   )r   r   r   r   rq   r(   r(   r,   r     r   zImageFileDirectory_v1.__len__c                 C   r   rY   )r   r   r   r   rq   r(   r(   r,   r     r   zImageFileDirectory_v1.__iter__c                 C   s   dD ]	}|  ||| qd S N)FT)r   )rf   r   rg   r   r(   r(   r,   r     s   z!ImageFileDirectory_v1.__setitem__c                 C   sn   || j vr&| j| }| j| }| j| \}}dD ]}| ||| ||| q| j | }t|ttfs5|f}|S r~  )r   r   r   r   r   rd   r   r   )rf   r   r   r   r   r   legacyrT   r(   r(   r,   r      s   



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   rh   r   tagsZtagdatar   __annotations__classmethodr|  r}  r   r   r   r   r   __classcell__r(   r(   rx  r,   ru    s   
 
ru  c                       s   e Zd ZdZdZdZd fdd	Zdd Zed	d
 Z	dd Z
dd Zdd Zdd Zdd Z fddZdd Zdd Zdd Zdd Z  ZS ) TiffImageFileZTIFFz
Adobe TIFFFNc                    s"   d | _ 	 d | _	 t || d S rY   )tag_v2r   rv  rh   )rf   rJ  filenamerx  r(   r,   rh     s
   zTiffImageFile.__init__c                 C   s   | j d}|d dkr|| j d7 }t|| _d| _| jj | _| _d| _| j | _	g | _
d| _td td| j  tdt|  | d	 dS )
z#Open the first image in a TIFF filer$   r   r   NrP   z*** TiffImageFile._open ***z- __first: z- ifh: r   )rJ  rH  r   r  re  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp
_frame_pos	_n_framesrY  rZ  r   _seek)rf   r   r(   r(   r,   _open$  s   

zTiffImageFile._openc                 C   sX   | j d u r)|  }| t| j | j d u r$| |  d  | j d u s| | | j S )Nr   )r  rU  r  r   r  r[  )rf   currentr(   r(   r,   n_frames?  s   



zTiffImageFile.n_framesc                 C   s<   |  |sdS | | t| j tj| j| j| _dS )z%Select a given frame as current imageN)	Z_seek_checkr  r   Z_decompression_bomb_checkr   corenewmodeimrf   framer(   r(   r,   r[  I  s
   

zTiffImageFile.seekc                 C   sH  | j | _| j  t| j|kr| jstdtd| d| j	 d| j d| j   | j
| j | j| j td| j   | j| j | jj| jv rWd| _n| jj| _| jdkrf|d | _t| jdkrs| jdk| _|  j	d7  _	t| j|ks| j
| j|  | j| j t| j | _| _|| _	|   d S )	Nzno more images in TIFF filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %sr   r   )r  rJ  rU  r   r  r  EOFErrorrY  rZ  r  r[  ri  r  rd  r   r  is_animatedru  r|  r   re  _setupr  r(   r(   r,   r  T  s<   



zTiffImageFile._seekc                 C   ri   )zReturn the current frame number)r  rq   r(   r(   r,   rU  x  rl   zTiffImageFile.tellc                 C   s   d| j v r| | j d S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        r   )r  Z_getxmprq   r(   r(   r,   getxmp|  s   zTiffImageFile.getxmpc                 C   s   i }| j d}|r^|dd dkr^t|dd }t|d d d d }t|d| d|  }|d| d| |  }d	|i||< |td| | d d d }|dd dks|S )
a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        r   Nr   s   8BIMr    r   r   rD  r   )r  rW  i16mathceili32)rf   blocksrT   idnr   r   r(   r(   r,   get_photoshop_blocks  s   "z"TiffImageFile.get_photoshop_blocksc                    s   | j r
| jr
|  S t  S rY   )tileuse_load_libtiff_load_libtiffrv  rd  rq   rx  r(   r,   rd    s   
zTiffImageFile.loadc                 C   s   | j r/tjjtjjtjjtjjtjjtjjtjj	d
| j }|d ur/| j|| _| jj| _| jsPd| _| j  |  }tj D ]}||vrJqC|| qCd S d S )N)r   r   r   r   r    r"   r$   T)_tile_orientationr   Z	TransposeZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90rW  r  Z	transposer   _sizer  !_close_exclusive_fp_after_loadingrJ  rU  Zgetexifr   TAGS_V2_GROUPSkeysget_ifd)rf   methodexifkeyr(   r(   r,   load_end  s0   	

	zTiffImageFile.load_endc           	   
   C   s  t j |  |   t| jdkstd| jd d }t| jd d }zt| jdo3t	
| j }t| jdr?| j  W n tyK   d}Y nw |rR||d< t | jd	t|| j}z	|| j| W n tyx } ztd
|d}~ww | jo| j }t| jdrtd || j \}}n,|rtd |s| jd |d\}}ntd | jd || j \}}|rzt	| W n	 ty   Y nw g | _d| _|   |r| j  d| _|dk rt|t j | S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r   filenoflushFr   libtiffzCouldn't set the imageNgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   rd  Zload_preparer   r  rI  rr  hasattrrJ  osdupr  r  Z_getdecoderr  r   Zdecoderconfigsetimager  r   Z_exclusive_fpr  rY  rZ  r(  r  r[  rH  closereadonlyr  )	rf   Zextentsr{   rJ  decodereZclose_self_fpr  errr(   r(   r,   r    sh   






zTiffImageFile._load_libtiffc              
   C   s  d| j v r	tdt| j td | _| j td| _| j td}| jdkr)d}| j t	d}t
d t
d| j  t
d	|  t
d
| j  t
d|  t
d| jd  t| j t}t| j t}||f| _t
d| j  | j td}t|dkrt|t|  krdkrn nd}| j td}| j td}|dv rd}n	|dkrd}nd}|t|7 }t|}	||	k r|d| }n||	kr|	dkr|| }| j t| jdkr|dv rdnd}
t||
krtd| j j|||||f}t
d|  z	t| \| _}W n ty- } z
t
d td|d}~ww t
d|  t
d| j  | j| jd< | j td}| j t d}|r|r| j t!}|dkrl||f| jd< n,|dkr}|d  |d  f| jd< n|du r||f| jd< ||f| jd!< n||f| jd!< d } }}g | _"t#p| jd"k| _$| j$r|dkr|dd d |dd  }t
d|  t| \| _}|d#krd$}d%|v r|%d%d&}d'|v r|%d'd&}|dkr | jd(kr | jdkr d)}|| jd*| j j&f}| j"'d+dd||fd|f nt(| j v s$t)| j v rt(| j v r<| j t( }| j t*|}| jd }n| j t) }| j d,}| j d-}|D ]h}|| |kra|t+| d. }nd}|}| jdkrs|| }|| }|t|df}| j"'| j||t|| |t|| |f||f || }|| jd krd|| }}|| jd krd }}|d7 }qOn	t
d/ tdt,| j v r| j t, | jd0< | jd1v rd2d3 | j t- D }t./d4d50|| _1| j d6| _2dS )7z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r!   r    z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: r   z- size: r.   r(   )r   r    r$   r   r   r   N)r   r    zunknown data organizationzformat key: z- unsupported formatzunknown pixel modez- raw mode: z- pil mode: compressionr   dpigRQ@
resolutionr   r2   I;16Nz;16Bz;16Nz;16Lr#   r?   Fr  r   r   r$   z- unsupported data organizationicc_profilerD   rE   c                 S   s   g | ]}t |d  qS )r   r   )r)   r  r(   r(   r,   r     s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr  i  )3r  rI  COMPRESSION_INFOrW  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERrY  rZ  r   r   
IMAGEWIDTHIMAGELENGTHr  r   SAMPLEFORMATr   r]   r\   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELr   rM   	OPEN_INFOr  rX  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   rc  ri  rg  TILEOFFSETSROWSPERSTRIPsum
ICCPROFILECOLORMAPr
   r   r  paletter  )rf   photoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamplesPerPixelr  rawmoder  ZxresZyresZresunitxylayerrk   offsetsr  wrc  strideZtile_rawmoder  r(   r(   r,   r    s  



,












zTiffImageFile._setupc                 C   sP   z#z| j | jkr| j   W n	 ty   Y nw W d | _ d S W d | _ d S d | _ w rY   )r  rJ  r  AttributeErrorrq   r(   r(   r,   
_close__fp  s   

zTiffImageFile._close__fp)NN)r   r   r   formatformat_descriptionr  rh   r  r   r  r[  r  rU  r  r  rd  r  r  r  r  r  r(   r(   rx  r,   r    s&    	
	$	[ Vr  r/   r0   r>   rD   rE   r5   r<   r2   r6   r9   r:   r?   rB   r@   rF   YCbCrrG   r=   r4   r7   r;   )r7   r;   c           .      C   sj  zt | j \}}}}}}W n ty# }	 z
td| j d|	d }	~	ww t|d}
| j}| j}|d| jd}|d u r@d}n|dkrGd}n|dkrMd	}t	pR|dk}d
|
t
< | jd |
t< | jd
 |
t< d|v rn|d }nd|v r|d }t|trt }|| |}ni }tdt|  t|tr| }|D ]1}t|tjr|tj v r|||
|< n|||
|< z
|j| |
j|< W q ty   Y qw t| drtt t!t"t#t$fD ]}|| j%v r| j%| |
|< | j%j| |
j|< q|d| jd}|r||
t&< t'dft dft!dft dft!dftdft(dft)dft*dft+dff
D ]\}}||v r4|| |
|< q%|d}|rNd|
t< |d |
t < |d
 |
t!< |dkrd||
t,< t-|d
krdt-||
t.< |d urm||
t/< |d
krv||
t0< t1|
vr||
t1< nF| jdv r|
t1 dkr| jdkr| 2 }| }t3|j4D ]}t3|j5D ]}|||f dkrdnd|||f< qq|} nt67| } | jd v r| j89d!d"}t:d#d$ |D |
t;< t-|| jd |d  d% d&  }|r|dkrd
n	t<t=| | jd
 }|dkrt<|d% d& d& | jd
 }n| jd
 }|dkr#d
}|dkr*d
n|| }| jd
 | d
 | }||
t>< |d'krHtj?|
jt@< |f|d
  || jd
  ||d
   f |
t@< t:t3d|| ||
tA< tB|d
|
tC< | jd(krtDd)tEd*iF D ]\}}|
G|| qtHtItJtKg} |r	d+|v r|d+ }!t|!tLr|!dk s|!d,krtMd-|dkrtMd.|!|
tN< td/ td0tO|
F   d}"t|d1rz|Pd tQR|S }"W n tTjUy   Y nw i }#| tEt@tAtVtWg7 } i }$|d |$t,< i }%t| d2r| jX }%i tY| di |%}&t0|&v r$|&t0= tZ[|
F |&F D ]g\}}|tj\vrftj]j^s?q.||
jv rM|
j| |#|< nt|tLt_t`tfsYq.ta|jb}'|'rf|'|#|< ||$vr|| vrt|t`r|cd3d4d5 |$|< q.t|tdrt_||$|< q.||$|< q.t0|$v rt-|$t0 d
kr|$t0 d |$t0< td6tO|$F   | jd7v rd8}t|$F }(|(e  |||"||(|#f})tf| jd9|)|}	|	g| j8d:| j  	 |	cd<\}*}+},|"s|h|, |+rnq|+dk rtd=|+ d>n | D ]}|
|= q|
i|}-tjk| |dd:| j |-||d
ffg d?|v r3|
| _ld S d S )@Nzcannot write mode z as TIFFrL   r  r   r!   r#   r&   r%   r   r   Ztiffinfor  zTiffinfo Keys: %sr  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r   r.   )r/   r0   r/      r  r?   r  c                 s   s    | ]}|d  V  qdS )r   Nr(   r   r(   r(   r,   r     r   z_save.<locals>.<genexpr>r"   r$   r   r  )r   r   )r   r     r  r  r  qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  r   r   r   r&  zConverted items: %s)r4   r2   r  r  rC   Ti @  zencoder error z when writing image file_debug_multipage)m	SAVE_INFOr  rX  rI  r   encoderinfoencoderconfigrW  r   WRITE_LIBTIFFr  r   r  r  rd   r   r   ZExifrd  rY  rZ  rr  ru  r}  r   r  r  r  r   r   r  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPr  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  r   r  r  r  r  copyrV  heightwidthr	   invertr  Z
getpaletter   r  r\   
STRIP_SIZEr  r   STRIPBYTECOUNTSrg  COMPRESSION_INFO_REVr  YCBCRSUBSAMPLINGREFERENCEBLACKWHITEr   
setdefault	TILEWIDTH
TILELENGTHr  TILEBYTECOUNTSr   r   JPEGQUALITYrf  r[  r  r  r  ioUnsupportedOperationTRANSFERFUNCTIONSUBIFDr   rz   	itertoolschainZLIBTIFF_COREr  Zlibtiff_support_custom_tagsre   rp   r   r   r   rR   sortZ_getencoderr  ro  rp  r   _saver  ).r  rJ  r  r  rM   r  r  bitsextrar  re  r  r  r  r  r   r  r  Ziccr   r  Zinverted_imZpxr  r  Zlutr  Zrows_per_stripZstrip_byte_countsZstrips_per_imager   rg   Z	blocklistr  _fptypesZattsZ
legacy_ifdZsupplied_tagsr   r  rk   r  sr  rc  r(   r(   r,   r    s  













&
""






 











r  c                   @   s   e Zd Zg dZh dZd1ddZdd Zdd	 Zd
d Zdd Z	dd Z
dd ZejfddZdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd2d.d/Zd0S )3AppendingTiffWriter)r   r   r   r   r   r$   r   r   r   r   r$   r   r$   >   i   r   i  i  i	  r   Fc                 C   st   t |dr|| _d| _n"|| _d| _zt||rdnd| _W n ty-   t|d| _Y nw | j | _|   d S )NrH  FTzw+bzr+b)	r  ro   close_fpr   openrI  rU  	beginningsetup)rf   fnr  r(   r(   r,   rh   F  s   
zAppendingTiffWriter.__init__c                 C   s   | j | jtj d | _d| _| j d | _}|sd| _	d S d| _	|dkr,| 
d n|dkr6| 
d ntd	|   |   d S )
Nr   r   TFrI   r   rH   r   zInvalid TIFF file header)ro   r[  r  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPagerH  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rf   r  r(   r(   r,   r  T  s   zAppendingTiffWriter.setupc                 C   s   | j rd S | j| j | jd}|sd S || jkrtd|  }|| j7 }| j| j | 	| | j| | 
  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)r   ro   r[  r  rH  r  r"  readLongr  	writeLongfixIFD)rf   r  	IFDoffsetr(   r(   r,   finalizel  s   


zAppendingTiffWriter.finalizec                 C   s   |    |   d S rY   )r)  r  rq   r(   r(   r,   newFrame  s   zAppendingTiffWriter.newFramec                 C   s   | S rY   r(   rq   r(   r(   r,   	__enter__  s   zAppendingTiffWriter.__enter__c                 C   s   | j r|   dS )NF)r  r  )rf   exc_type	exc_value	tracebackr(   r(   r,   __exit__  s   zAppendingTiffWriter.__exit__c                 C   s   | j  | j S rY   )ro   rU  r  rq   r(   r(   r,   rU    rO   zAppendingTiffWriter.tellc                 C   s*   |t jkr
|| j7 }| j|| |  S rY   )r  r  r  ro   r[  rU  )rf   rc  whencer(   r(   r,   r[    s   

zAppendingTiffWriter.seekc                 C   s^   | j dtj | j  }d|d  }d|  k rdk r'n n| j t| | j  | _d S )Nr   r3   )ro   r[  r  SEEK_ENDrU  ro  r   r  )rf   posZpadBytesr(   r(   r,   r$    s   
zAppendingTiffWriter.goToEndc                 C   s.   || _ | j d | _| j d | _| j d | _d S )Nr0   r  ZHHL)endianlongFmtshortFmt	tagFormat)rf   r3  r(   r(   r,   r!    s   zAppendingTiffWriter.setEndianc                 C   sP   	 |   }|dkr| j d | _d S | j| |  }| j|d tj q)NTr   r   r1   )r%  ro   rU  r  r[  	readShortr  SEEK_CUR)rf   r(  numTagsr(   r(   r,   r#    s   zAppendingTiffWriter.skipIFDsc                 C   s   | j |S rY   )ro   ro  r$  r(   r(   r,   ro    r   zAppendingTiffWriter.writec                 C      t | j| jd\}|S )Nr   )r   r   r5  ro   rH  r   r(   r(   r,   r7       zAppendingTiffWriter.readShortc                 C   r:  rJ   )r   r   r4  ro   rH  r   r(   r(   r,   r%    r;  zAppendingTiffWriter.readLongc                 C   N   | j dtj | j t| j|}|d ur#|dkr%td| dd S d S )Nr   wrote only  bytes but wanted 4	ro   r[  r  r8  ro  r   r  r4  r"  rf   rg   ZbytesWrittenr(   r(   r,   rewriteLastShortToLong  
   z*AppendingTiffWriter.rewriteLastShortToLongc                 C   r<  )Nr=  r   r>   bytes but wanted 2)	ro   r[  r  r8  ro  r   r  r5  r"  rA  r(   r(   r,   rewriteLastShort  rC  z$AppendingTiffWriter.rewriteLastShortc                 C   r<  )Nr   r>  r?  r@  rA  r(   r(   r,   rewriteLastLong  rC  z#AppendingTiffWriter.rewriteLastLongc                 C   >   | j t| j|}|d ur|dkrtd| dd S d S )Nr   r>  rD  )ro   ro  r   r  r5  r"  rA  r(   r(   r,   
writeShort     zAppendingTiffWriter.writeShortc                 C   rH  )Nr   r>  r?  )ro   ro  r   r  r4  r"  rA  r(   r(   r,   r&    rJ  zAppendingTiffWriter.writeLongc                 C   s   |    | j  d S rY   )r)  ro   r  rq   r(   r(   r,   r    s   zAppendingTiffWriter.closec                 C   s   |   }t|D ]u}t| j| jd\}}}| j| }|| }|dk}|s5|  }	|	| j	7 }	| 
|	 || jv rs| j }
|rV| j||dk|dkd | j|
d  n| j|	 | j||dk|dkd | j|
 d  }	}
q|r}| jdtj qd S )Nr$   r   r   )isShortisLong)r7  rV  r   r   r6  ro   rH  
fieldSizesr%  r  rG  TagsrU  
fixOffsetsr[  r  r8  )rf   r9  r]  r   Z	fieldTyper^  Z	fieldSizeZ	totalSizeZisLocalrc  ZcurPosr(   r(   r,   r'    s6   





zAppendingTiffWriter.fixIFDc                 C   s   |s|st dt|D ]H}|r|  n|  }|| j7 }|rG|dkrG|dkr+t d| | | jdtj	 | 
tj | jdtj	 q|rO| | q| | qd S )Nz offset is neither short nor longr   r   znot implementedir$   )r"  rV  r7  r%  r  rB  ro   r[  r  r8  rI  r   r   rE  rG  )rf   r^  rK  rL  r]  rc  r(   r(   r,   rO    s    

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   rM  rN  rh   r  r)  r*  r+  r/  rU  r	  r  r[  r$  r!  r#  ro  r7  r%  rB  rE  rG  rI  r&  r  r'  rO  r(   r(   r(   r,   r  -  s2    

#r  c              	   C   s   | j  }| j}t|dg }t| ds|st| ||S |  }zWt|;}| g| D ]-}||_ ||_t|ds<d}	n|j	}	t
|	D ]}
||
 |  t||| |  qCq,W d    n1 sdw   Y  W | | d S W | | d S | | w )Nappend_imagesr  r   )r  r  r  rr  rW  r  r  rU  r  r  rV  r[  rd  r*  )r  rJ  r  r  r  rP  Zcur_idxtfZimsZnfrr
  r(   r(   r,   	_save_all  s2   




rR  z.tifz.tiffz
image/tiff)ir	  r  loggingr  r  r   r   collections.abcr   	fractionsr   numbersr   r    r   r   r	   r
   r   _binaryr   r  r   r  r   r   	getLoggerr   rY  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  rg  r  r  r   r  r  r  r  r  r  r  r  Z	PREDICTORr  r  r  r  r  r  r  r  Z
JPEGTABLESr  r  r  r  r  r  ZEXIFIFDr  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r   r  r  rK   rN   rX   r_   r   r  rR   r   r
  r   r   setattrru  ZImageFileDirectoryr  r  r  r  rR  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer(   r(   r(   r,   <module>   s  (
	
	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghiw
    \   m	
   o