o
    Ԧ/f-                 #   @  s(  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZmZ d dlmZmZmZ ddlmZ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Z0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8d Z9d!Z:d"Z;d#Z<d$Z=d%Z>d&Z?d'Z@d(ZAd)ZBd*ZCd+ZDd,ZEd-ZFd.ZGd/ZHd0ZId1ZJd2ZKd3ZLd4ZMd5ZNd6ZOd7ZPd8ZQd9ZRd:ZSi dd;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[ZTd\d] eTU D ZVi e)d d^dd^d_fd`e*d d^dd^d_fd`e)d d^d<d^d_fdae*d d^d<d^d_fdae)dd^dd^d_fdbe*dd^dd^d_fdbe)dd^d<d^d_fdce*dd^d<d^d_fdce)d d^dddd_fdee*d d^dddd_fdee)d d^d<ddd_fdfe*d d^d<ddd_fdfe)dd^dddd_fdge*dd^dddd_fdge)dd^d<ddd_fdhe*dd^d<ddd_fdhe)d d^ddid_fdji e*d d^ddid_fdje)d d^d<did_fdke*d d^d<did_fdke)dd^ddid_fdle*dd^ddid_fdle)dd^d<did_fdme*dd^d<did_fdme)d d^ddnd_fdoe*d d^ddnd_fdoe)d d^d<dnd_fdpe*d d^d<dnd_fdpe)dd^ddnd_fdqe*dd^ddnd_fdqe)dddddnd_fdqe*dddddnd_fdqe)dd^d<dnd_fdre*dd^d<dnd_fdri e)dd^ddsd_fdte)d d^ddud_fdve)dd^ddud_fdve*dd^ddud_fdwe)dd^d<dud_fdxe)dddddud_fdye*dddddud_fdze)d d{dd|d_fd}e*d d{dd|d_fd~e)dd^dd|d_fde)ddddd|d_fde*ddddd|d_fde)dd{dd|d_fd}e*dd{dd|d_fd~e)dd^ddddfde*dd^ddddfde)d<d^ddd_fdi e*d<d^ddd_fde)d<d^d<dd_fde*d<d^d<dd_fde)d<d^ddd_fde*d<d^ddd_fde)d<d^dddfde*d<d^dddfde)d<d^dddfde*d<d^dddfde)d<d^dddfde*d<d^dddfde)d<d^ddd^fde*d<d^ddd^fde)d<d^dddfde*d<d^dddfde)d<d^dddfde*d<d^dddfdi e)d<d^ddddfde*d<d^ddddfde)d<d^dddfde*d<d^dddfde)d<d^dddfde*d<d^dddfde)d<d^dddfde*d<d^dddfde)d<d^ddd_fde*d<d^ddd_fde)d<d^ddd_fde*d<d^ddd_fde)d<d^dddfde*d<d^dddfde)d<d^ddd^fde*d<d^ddd^fde)d<d^ddddfdi e*d<d^ddddfde)d>d^dd^d_fde*d>d^dd^d_fde)d>d^d<d^d_fde*d>d^d<d^d_fde)d>d^dddd_fde*d>d^dddd_fde)d>d^d<ddd_fde*d>d^d<ddd_fde)d>d^ddid_fde*d>d^ddid_fde)d>d^d<did_fde*d>d^d<did_fde)d>d^ddnd_fde*d>d^ddnd_fde)d>d^ddddfde*d>d^ddddfde)d>d^d<dnd_fde*d>d^d<dnd_fde)dBd^ddd_fde*dBd^ddd_fde)dBd^dddfde*dBd^dddfde)dBd^dddfde*dBd^dddfde)dBd^ddd_fde)dDd^ddnd_fdqe*dDd^ddnd_fdqe)dDd^ddd_fde*dDd^ddd_fde)dHd^ddd_fde*dHd^ddd_fdiZWeXdd eWD ZYg dZZdd Z[dd Z\dd Z]i Z^i Z_dd Z`G dd deZadd ZbddĄ ZcddƄ Zderde
eeef Zfne
ZfG ddȄ defZge^eg_^e_eg__e!U D ]!\ZhZieijddʡZiekegdei e^eh d  ekegdei e_eh  qx[^[_[h[iG dd΄ degZlelZmG ddЄ dejZni dde)ddd^dfdde)dddndfdde)dddd<fdde)d>ddndfdde)d>ddd<fdde)dd<d|dfdde)dddudfdde)dd<dudfdde)dd>d|dfdde)d<dddfdde)d<ddd fdde)d<ddd<fdde)dBdddfdde)dDdddfdde)dHdddfdde*dd<d|dfdde*dddudfde*dd<dudfde*dd>d|dfdZodd ZpG dd dZqdd Zresenjtene[ euenjtep evenjter ewenjtddg exenjtd dS )    )annotationsN)MutableMapping)Fraction)NumberRational)TYPE_CHECKINGAnyCallable   )ExifTags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@  iB  iC  D  iE  iJ  iR  iS  i[  i  i  i  i  iI  is  ii  i  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)   3lib/python3.10/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    r.   r
   r)   )1z1;I)r0   z1;IR)r0   r0   )r0   z1;R)r   )LzL;2I)r1   zL;2IR)r1   zL;2)r1   zL;2R)r   )r1   zL;4I)r1   zL;4IR)r1   zL;4)r1   zL;4R)r%   )r1   zL;I)r1   zL;IR)r1   r1   )r1   zL;R)   )I;16zI;12)   )r3   r3   )I;16Br5   )r3   zI;16R)II;16S)r6   I;16BS)r   )    )FF;32F)r:   F;32BF)r6   zI;32N)r6   I;32S)r6   I;32BS)r%   r%   )LAr?   )r%   r%   r%   )RGBr@   )r@   zRGB;R)r%   r%   r%   r%   )RGBArA   r   )RGBXrC   )r%   r%   r%   r%   r%   r   r   )rC   ZRGBXX)r%   r%   r%   r%   r%   r%   )r   r   r   )rC   ZRGBXXX)rA   ZRGBa)r
   r   )rA   ZRGBaX)r
   r   r   )rA   ZRGBaXX)r   r   )rA   ZRGBAX)r   r   r   )rA   ZRGBAXX)i  )r4   r4   r4   )r@   zRGB;16L)r@   zRGB;16B)r4   r4   r4   r4   )rA   zRGBA;16L)rA   zRGBA;16B)rC   zRGBX;16L)rC   zRGBX;16B)rA   zRGBa;16L)rA   zRGBa;16B)PzP;1)rE   zP;1R)rE   zP;2)rE   zP;2R)rE   zP;4)rE   zP;4R)rE   rE   )PArF   )rE   zP;R)CMYKrG   )rG   ZCMYKX)rG   ZCMYKXX)rG   zCMYK;16L)r@   rC   )LABrH   c                 c  s    | ]	}t |d  V  qdS )r   N)len)r*   Zkey_tpr)   r)   r-   	<genexpr>      rJ   )   MM *   II* s   MM* s   II *s   MM +s   II+ c                 C  s   | d d t v S Nr   )PREFIXESprefixr)   r)   r-   _accept     rR   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   r\   c                 C  sP   t | }|j|jf}t||k rt| t|}t||kr&t | } t| |}|S N)r   	numeratordenominatorminr\   rU   max)rX   rY   Zmin_valfracr[   r)   r)   r-   _limit_signed_rational"  s   
rc   c                       fdd}|S )Nc                   s   t | j | S r]   )getattr_val)selfargsopr)   r-   delegate8  rS   z_delegate.<locals>.delegater)   )rj   rk   r)   ri   r-   	_delegate7  s   rl   c                   @  sP  e Zd ZdZ	 dZd2d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	 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*e+d0red0Z,d1S d1S )3rV   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_denominatorrf   r
   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
   )	
isinstancerV   r^   rm   r_   rn   rf   r   float)rg   valuer_   r)   r)   r-   __init__L  s   


zIFDRational.__init__c                 C     | j S r]   )rm   rg   r)   r)   r-   r^   f     zIFDRational.numeratorc                 C  rt   r]   )rn   ru   r)   r)   r-   r_   j  rv   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_   r^   rf   Zlimit_denominator)rg   Zmax_denominatorfr)   r)   r-   rW   n  s   
zIFDRational.limit_rationalc                 C  s   t t| jS r]   )strrq   rf   ru   r)   r)   r-   __repr__{  s   zIFDRational.__repr__c                 C  s
   | j  S r]   )rf   __hash__ru   r)   r)   r-   rz   ~  s   
zIFDRational.__hash__c                 C  s0   | j }t|tr|j }t|trt|}||kS r]   )rf   rp   rV   rq   )rg   otherrX   r)   r)   r-   __eq__  s   

zIFDRational.__eq__c                 C  s   | j | j| jgS r]   )rf   rm   rn   ru   r)   r)   r-   __getstate__  rS   zIFDRational.__getstate__c                 C  s,   t | d |\}}}|| _|| _|| _d S )Nr   )rV   rs   rf   rm   rn   )rg   staterf   rm   rn   r)   r)   r-   __setstate__  s
   

zIFDRational.__setstate____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____int__Nr/   )-__name__
__module____qualname____doc__	__slots__rs   propertyr^   r_   rW   ry   rz   r|   r}   r   rl   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   hasattrr   r   r)   r)   r)   r-   rV   >  sZ    



rV   c                   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   
startswithreplace_load_dispatch)funcr   idxsizer)   r-   	decorator  s
   z#_register_loader.<locals>.decoratorr)   )r   r   r   r)   r   r-   _register_loader  s   r   c                   rd   )Nc                   s   | t  < | S r]   )_write_dispatch)r   r   r)   r-   r     s   z#_register_writer.<locals>.decoratorr)   )r   r   r)   r   r-   _register_writer  s   r   c                   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 r]   )_unpackrI   rg   data
legacy_apifmtr   r)   r-   <lambda>  s   z!_register_basic.<locals>.<lambda>c                   s   d  fdd|D S )N    c                 3  s    | ]	}  |V  qd S r]   )_packr*   rr   )r   rg   r)   r-   rJ     rK   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinrg   values)r   ru   r-   r     s   T)r   r   structZcalcsizer   r   )Zidx_fmt_namer   r   namer)   r   r-   _register_basic  s   
r   c                   @  s  e Zd ZU dZi Zded< i Zded< d\dd	Zed
d Z	edd Z
edd Zejdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z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 d.d/fej!d0d1fej"d2d3fej#d4d5fej$d*d+fej%d6d7fg	 e&d8d8d]d:d;Z'e(d8d<d= Z)e&d>d8d]d?d@Z*e(d>dAdB Z+e&dCdDd]dEdFZ,e(dCdGdH Z-e&dId8d]dJdKZ.e(dIdLdM Z/e&dNdDd]dOdPZ0e(dNdQdR Z1dSdT Z2dUdV Z3d^dXdYZ4dZd[ Z5dS )_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``.

    z>dict[int, Callable[[ImageFileDirectory_v2, bytes, bool], Any]]r   zdict[int, Callable[..., Any]]r      II*     Nc                 C  s   t |sdt| d}t||dur|n|dd | _| jtkr&d| _n| jtkr/d| _nd}t||d dk| _|| _i | _		 | 
  | jrT| 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%   r1   r   F)rR   reprSyntaxError_prefixMM_endianII_bigtiffgrouptagtyperesetr   next_legacy_api)rg   ifhrQ   r   msgr)   r)   r-   rs   %  s$   

,
zImageFileDirectory_v2.__init__c                 C  rt   r]   )r   ru   r)   r)   r-   r   E      zImageFileDirectory_v2.<lambda>c                 C  rt   r]   )_offsetru   r)   r)   r-   r   F  r   c                 C  rt   r]   )r   ru   r)   r)   r-   r   H  rv   z ImageFileDirectory_v2.legacy_apic                 C  s   d}t |)Nz"Not allowing setting of legacy api)	Exception)rg   rr   r   r)   r)   r-   r   L  s   c                 C  s(   i | _ i | _i | _i | _d | _d | _d S r]   )_tags_v1_tags_v2_tagdatar   Z_nextr   ru   r)   r)   r-   r   Q  s   
zImageFileDirectory_v2.resetc                 C  s   t t| S r]   )rx   dictru   r)   r)   r-   __str__Y     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   r   )r*   coderr   ru   r)   r-   r.   b  s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsru   r)   ru   r-   named\  s   
zImageFileDirectory_v2.namedc                 C     t t| jt| jB S r]   )rI   setr   r   ru   r)   r)   r-   __len__g     zImageFileDirectory_v2.__len__c                 C  sf   || j vr| j| }| j| }| j| \}}|| || j| |< | j | }| jr1t|ttfs1|f}|S r]   )r   r   r   r   r   rp   tuplebytes)rg   tagr   typr   handlerrX   r)   r)   r-   __getitem__j  s   



z!ImageFileDirectory_v2.__getitem__c                 C     || j v p	|| jv S r]   )r   r   rg   r   r)   r)   r-   __contains__u     z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S r]   )_setitemr   )rg   r   rr   r)   r)   r-   __setitem__x  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 r]   )rp   rV   r*   r,   r)   r)   r-   rJ         z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s      | ]}|d kV  qdS r   Nr)   r   r)   r)   r-   rJ         c                 s  r   r]   )rp   intr   r)   r)   r-   rJ     r   c                 s  s(    | ]}d |  kodk n  V  qdS )r   r   Nr)   r   r)   r)   r-   rJ        & c                 s  s(    | ]}d |  k odk n  V  qdS )i i   Nr)   r   r)   r)   r-   rJ     r   c                 s  r   r   r)   r   r)   r)   r-   rJ     r   c                 s  r   r]   )rp   rq   r   r)   r)   r-   rJ     r   c                 s  r   r]   )rp   rx   r   r)   r)   r-   rJ     r   c                 s  r   r]   )rp   r   r   r)   r)   r-   rJ     r   c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )rp   rx   encoder   r)   r)   r-   
<listcomp>  s    z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r)   )rp   r   rq   r   r)   r)   r-   r     s   " c                 3  s    | ]}  |V  qd S r]   )Zcvt_enumr   infor)   r-   rJ     r   r
   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   rx   r   r   r   rp   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthrI   
ValueErrorwarningswarn)rg   r   rr   r   Z	basetypesr   is_ifddestr)   r   r-   r   {  sr   



 zImageFileDirectory_v2._setitemc                 C  s.   | j |d  | j|d  | j|d  d S r]   )r   popr   r   r   r)   r)   r-   __delitem__  s   z!ImageFileDirectory_v2.__delitem__c                 C  r   r]   )iterr   r   r   ru   r)   r)   r-   __iter__  r   zImageFileDirectory_v2.__iter__c                 C  s   t | j| |S r]   )r   unpackr   )rg   r   r   r)   r)   r-   r     s   zImageFileDirectory_v2._unpackc                 G  s   t j| j| g|R  S r]   )r   packr   )rg   r   r   r)   r)   r-   r     r   zImageFileDirectory_v2._packHZshortr1   Zlongbzsigned bytehzsigned shortlzsigned longrw   rq   dZdoubler   Zlong8r
   Tc                 C     |S r]   r)   r   r)   r)   r-   	load_byte     zImageFileDirectory_v2.load_bytec                 C  s*   t |tr	t|}t |trt|f}|S r]   )rp   rV   r   r   rg   r   r)   r)   r-   
write_byte  s
   


z ImageFileDirectory_v2.write_byter   c                 C  s"   | dr|d d }|ddS )N    rT   zlatin-1r   )endswithdecoder   r)   r)   r-   load_string  s   
z!ImageFileDirectory_v2.load_stringc                 C  s0   t |tr	t|}t |ts|dd}|d S )Nr   r   r"  )rp   r   rx   r   r   rg   rr   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   r1   c                       r| |fS t | |S r]   rV   ar  r   r)   r-   combine	     z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3      | ]
\}} ||V  qd S r]   r)   r*   ZnumZdenomr.  r)   r-   rJ         z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r
   r   rI   r   ziprg   r   r   Zvalsr)   r.  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   r\   r*   rb   ru   r)   r-   rJ     s    
z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r)   ru   r-   write_rational  s   z$ImageFileDirectory_v2.write_rationalr#   c                 C  r  r]   r)   r   r)   r)   r-   load_undefined  r  z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tr	t|}t |trt|dd}|S )Nr   r   )rp   rV   r   rx   r   r&  r)   r)   r-   write_undefined  s
   

z%ImageFileDirectory_v2.write_undefined
   c                   r(  )	Nr   r  c                   r)  r]   r*  r+  r-  r)   r-   r.  $  r/  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  r0  r]   r)   r1  r2  r)   r-   rJ   '  r3  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r
   r4  r6  r)   r7  r-   load_signed_rational   r9  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   rc   r;  ru   r)   r-   rJ   +  s
    
z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r)   ru   r-   write_signed_rational)  s   z+ImageFileDirectory_v2.write_signed_rationalc                 C  s8   | |}t||krd| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrI   OSError)rg   fpr   retr   r)   r)   r-   _ensure_read0  s   
z"ImageFileDirectory_v2._ensure_readc              
   C  sl  |    | | _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y5 }
 ztt|
 W Y d }
~
d S d }
~
ww )Nr   r%   r  r   r   ZHHQ8s   HHL4sr2   unknownztag:  (
) - type: )z%s - unsupported type %sr   r1   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read rB  z. Skipping tag 
 - value: r9   <table: %d bytes>)r   tellr   r   r   rG  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   Z
_safe_readrI   r  r  r   r   r   r   rD  rx   )rg   rE  Z	tag_countir   r   countr   tagnametypnamer   Z	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||t
| |tjkoHt|t}|rs| jdkrSd}	nd}	t|	|d}
| j| }| D ]\}}||
|< qd|
|}nt|trz|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r8|| \}}}}}|r!d}t||  d| d|d | }|||||f||< |D ]!\}}}}}t	d|||t
|t
| ||  d||||7 }q:|d7 }|D ]\}}}}}||7 }t|d@ rx|d7 }qb|S )Nr  r2   r   zTag %s, Type: %s, Value: %sr   s   II*    s   MM *   )r   ifdrJ  zsave: rK  rL  rM  rN  r4   rO  r
   r"  r   r1   r   z&multistrip support not yet implementedr   z%s %s %s %s %srI  s       ) r   rI   r   sortedr   STRIPOFFSETSr   rR  rT  rU  r   r   r  rp   r   r   r   tobytesr   r   r   r   r   r   rx   r  r
  r  appendljustNotImplementedErrorr   )rg   r\  resultentriesZstripoffsetsr   rr   r   r  r   r^  r   Zifd_tagZ	ifd_valuer   rY  rZ  r   rX  r)   r)   r-   ra  }  sl   





zImageFileDirectory_v2.tobytesc                 C  sN   |  dkr|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r%   )rP  writer   r   ra  rI   )rg   rE  r\  re  r)   r)   r-   save  s   

zImageFileDirectory_v2.save)r   NNr   rB   )6r   r   r   r   r   __annotations__r   rs   r   rQ   r\  r   setterr   r   r   r   r   r   r   r   r  r  r   r   listmapr   r   r  r  ZSIGNED_BYTEr  r  ZFLOATr	  ZIFDZLONG8r   r  r   r!  r%  r'  r8  r<  r=  r>  r@  rA  rG  r]  ra  ri  r)   r)   r)   r-   r     s|   
 <
 

P















CMr   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d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)superrs   r   )rg   rh   kwargs	__class__r)   r-   rs     s   
zImageFileDirectory_v1.__init__c                 C  rt   r]   )r   ru   r)   r)   r-   r     r   zImageFileDirectory_v1.<lambda>c                 C  rt   r]   )r   ru   r)   r)   r-   r     r   zdict[int, int]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`

        rP   )rQ   r   r   r   )clsZoriginalr^  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`

        rP   )r   rQ   r   r   r   r   )rg   r^  r)   r)   r-   to_v2  s
   zImageFileDirectory_v1.to_v2c                 C  r   r]   )r   r   r   r)   r)   r-   r      r   z"ImageFileDirectory_v1.__contains__c                 C  r   r]   )rI   r   r   r   ru   r)   r)   r-   r   #  r   zImageFileDirectory_v1.__len__c                 C  r   r]   )r  r   r   r   ru   r)   r)   r-   r  &  r   zImageFileDirectory_v1.__iter__c                 C  s   dD ]	}|  ||| qd S N)FT)r   )rg   r   rr   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 rv  )r   r   r   r   r   rp   r   r   )rg   r   r   r   r   r   ZlegacyrX   r)   r)   r-   r   -  s   



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   rs   r   tagsZtagdatarj  classmethodrt  ru  r   r   r  r   r   __classcell__r)   r)   rq  r-   rn    s   
 
rn  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  ZS )TiffImageFileZTIFFz
Adobe TIFFFNc                   s"   d | _ 	 d | _	 t || d S r]   )tag_v2r   ro  rs   )rg   rE  filenamerq  r)   r-   rs   G  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   NrT   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )rE  rC  r   r{  r^  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesrT  rU  r   _seek)rg   r   r)   r)   r-   _openP  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  rP  r  rI   r  rV  )rg   Zcurrentr)   r)   r-   n_framesk  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)rg   framer)   r)   r-   rV  u  s
   

zTiffImageFile.seekc                 C  sX  | j | _| j  t| j|kr| jsd}t|td|| j	| j| j  | jdkr2d}t
|| j| j | j| j td| j  | j| j | jj| jv r[d| _n| jj| _| jdkrj|d | _t| jdkrw| jdk| _|  j	d7  _	t| j|ks| j| j|  | j| j |   t| j | _| _|| _	|   d S )Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %sl            zUnable to seek to framezLoading tags, location: %sr   r
   )r  rE  rP  rI   r  r}  EOFErrorrT  rU  r~  r  rV  rb  r{  r]  r   r  is_animatedZ_reload_exifrn  rt  r   r^  _setup)rg   r  r   r)   r)   r-   r    sF   




zTiffImageFile._seekc                 C  rt   )zReturn the current frame number)r~  ru   r)   r)   r-   rP    rv   zTiffImageFile.tellc                 C  s   t | jv r| | jt  S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        )XMPr{  Z_getxmpru   r)   r)   r-   getxmp  s   zTiffImageFile.getxmpc                 C  s   i }| j tjj}|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.
        Nr   s   8BIMr!   r
   r   r?  r   )	r{  rR  r   BaseZImageResourcesi16mathZceili32)rg   ZblocksrX   idnr   r   r)   r)   r-   get_photoshop_blocks  s   "z"TiffImageFile.get_photoshop_blocksc                   s   | j r
| jr
|  S t  S r]   )tileuse_load_libtiff_load_libtiffro  r]  ru   rq  r)   r-   r]    s   
zTiffImageFile.loadc                 C  sn   | j sd| _| j  |  }tjD ]}||vrq|| qtj	| dd t
jj| jv r5| jt
jj= d S d S )NT)Zin_place)r  !_close_exclusive_fp_after_loadingrE  rP  Zgetexifr   TAGS_V2_GROUPSget_ifdr   Zexif_transposer   r  ZOrientationr{  )rg   exifkeyr)   r)   r-   load_end  s   

zTiffImageFile.load_endc           
   
   C  s  t j |  |   t| jdksd}t|| jd d }t| jd d }zt| jdo2| j	 }t| jdr>| j
  W n tyJ   d}Y nw |rQ||d< t | jd	t|| j}z	|| j| W n tyy } zd
}t||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 \}}	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   r]  Zload_preparerI   r  rD  rl  r   rE  r  r  Z_getdecoderr  r   Zdecoderconfigsetimager  r  Z_exclusive_fpr  rT  rU  r$  r  rV  rC  readonlyr  close)
rg   r   Zextentsrh   rE  decodereZclose_self_fpr  errr)   r)   r-   r    s`   






zTiffImageFile._load_libtiffc              
   C  s  d| j v rd}t|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t 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|}
| j t| jdkr|dv rdnd}|tkrt
d| d}t|||
k r|d| }n||
kr|
dkr|| }t||krd}t|| j j|||||f}t
d| z	t| \| _}W n t y6 } zt
d d}t||d}~ww t
d| t
d| j! | j| j"d< | j t#d}| j t$d}|r|r| j t%}|dkrq||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 t/}| j t0}|D ]h}|| |krd|t1| d- }nd}|}| jdkrv|| }||	 }|t|df}| j&+| j||t|| |t|| |f||f || }|| jd krd|| }}|| jd krd }}|d7 }qRnt
d. d}t|t2| j v r| j t2 | j"d/< | j!d0v rd1d2 | j t3 D }t45d3d46|| _7dS dS )5z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr
   r   r"   r!   z*** Summary ***z- compression: %sz - photometric_interpretation: %sz- planar_configuration: %sz- fill_order: %sz- YCbCr subsampling: %sz
- size: %sr/   r)   )r   r!   r%   r   r    r   )r   r!   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %scompressionr   dpigRQ@
resolutionr   r3   I;16Nz;16Bz;16Nz;16Lr$   r@   Fr  r%   z- unsupported data organizationicc_profilerE   rF   c                 S  s   g | ]}t |d  qS r   r   )r*   r  r)   r)   r-   r     s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   )8r{  rD  COMPRESSION_INFOrR  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERrT  rU  r   YCBCRSUBSAMPLINGr   
IMAGEWIDTHIMAGELENGTH_sizer   SAMPLEFORMATrI   ra   r`   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   rQ   	OPEN_INFO_moderS  r  r  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   r\  rb  r`  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r   r   palette)rg   r   photoZ	fillorderZxsizeZysizeZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr  rawmoder  ZxresZyresZresunitxyZlayerr,  Zoffsetsr  wr\  strideZtile_rawmoder  r)   r)   r-   r  =  s  



,












zTiffImageFile._setup)NN)r   r   r   formatZformat_descriptionr  rs   r  r   r  rV  r  rP  r  r  r]  r  r  r  ry  r)   r)   rq  r-   rz  B  s"    	
	,	Urz  r0   r1   r?   rE   rF   r6   r=   r3   r7   r:   r;   r@   rC   rA   rG   YCbCrrH   r>   r5   r8   r<   )r8   r<   c           5      C  s(	  zt | j \}}}}}}W n ty% }	 zd| j d}
t|
|	d }	~	ww t|d}| j}| j}z|d }W n tyM   | jd}t	|t
rKd }Y nw |d u rUd}n|dkr\d}n|dkrbd	}tpg|dk}d
|t< | jd |t< | jd
 |t< d|v r|d }nd|v r|d }t	|trt }|| |}ni }tdt| t	|tr| }|D ]/}t	|tjr|tjv r||||< n||||< z
|j| |j|< W q ty   Y qw t| drt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 rH|| ||< q9|d}|rbd|t< |d |t < |d
 |t!< |dkrx||t,< t-|d
krxt-||t.< |d ur||t/< |d
kr||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"}g }t-|d# }t3d#D ]}|d$d% ||| ||d
   D 7 }|dgd&|  7 }q||t:< |t |t }}t-|||d  d' d(  } t;|vrh|r[|d)t<}!| dkrCd
nt=|!|  |}"|dkrZt=|"d' d( d( |}"n|}"|"dkrdd
}"|"|t;< | dkrod
n| |t;  }#||t;  d
 |t;  }$|#d*krtj>|jt?< |#f|$d
  | | |#|$d
   f |t?< t@t3d|#|$ |#|tA< tB|d
|tC< | jd+krtDd,tEd-iF D ]\}%}&|G|%|& qtHtItJtKg}'|rhd.|v r|d. }(t	|(t
r|(dk s|(d/krd0}
tL|
|dkrd1}
tL|
|(|tM< td2 td3tN|F  d})t|d4r6z|Od tPQ|R })W n tSjTy5   Y nw i }*|'tUtEt?tAtVtWg7 }'t,|d i}+i },t| d5rU| jX },i tY| di |,}-t0|-v rg|-t0= tZ[|F |-F D ]j\}%}&|%tj\vrtYtj]d6d7sqq|%|jv r|j|% |*|%< nt	|&t
t^t_tfsqqt`|%ja}.|.r|.|*|%< |%|+vr|%|'vrt	|&t_r|&bd8d9d: |+|%< qqt	|&tcrt^|&|+|%< qq|&|+|%< qqt0|+v rt-|+t0 d
kr|+t0 d |+t0< td;tN|+F  | jd<v rd=}t|+F }/|/d  |||)||/|*f}0te| jd>|0|}1|1f| j8d?| j  	 |1bdAd
d  \}2}3|)s=|g|3 |2rAnq*|)rXztPh|) W n
 tyW   Y nw |2dk rgdB|2 dC}
t|
n |'D ]}%||%= qj|i|}4tjk| |dd?| j |4|| d
ffg dD|v r|| _ld S d S )ENzcannot write mode z as TIFFrP   r  r   r"   r$   r'   r&   r
   r   Ztiffinfor  zTiffinfo Keys: %sr{  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftwareZ	date_timeZartist	copyrightr  r   r/   )r0   r1   r0   r   r  r@   r  r   c                 S  s   g | ]}|d  qS r  r)   r   r)   r)   r-   r     s    z_save.<locals>.<listcomp>r   r#   r%   Z
strip_sizer   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   Zlibtiff_support_custom_tagsFr   r   r"  zConverted items: %s)r5   r3   r  r  rD   Ti @  zencoder error z when writing image file_debug_multipage)m	SAVE_INFOr  rS  rD  r   encoderinfoencoderconfigr  rR  rp   r   WRITE_LIBTIFFr  r   r  r  r   r   ZExifr]  rT  rU  rl  rn  ru  r   r  r  r   r   r   r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r{  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  rI   r  r  r  r  copyrQ  Zheightwidthr   invertr  Z
getpaletter  r  
STRIP_SIZEr`   r  STRIPBYTECOUNTSr   r`  COMPRESSION_INFO_REVr  r  REFERENCEBLACKWHITEr   
setdefaultr  r  r  TILEBYTECOUNTSr  JPEGQUALITYr_  rV  osdupr  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFDr   re   	itertoolschainZLIBTIFF_COREr  rq   rx   r   r  r   rV   sortZ_getencoderr  rh  r  ri  r   _saver  )5r  rE  r|  r  rQ   r  r  bitsZextrar  r   r^  r  r  r  r  r  r  r  Ziccr   r  Zinverted_imZpxr  r  ZlutZcolormapZcolorsrW  r  r  r  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imager   rr   Z	blocklistr  r  typesZattsZ
legacy_ifdZsupplied_tagsr  rw  r,  encoderZerrcoder   r\  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%   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 )NrC  FTzw+bzr+b)	r   rw   close_fpr   openrD  rP  	beginningsetup)rg   fnr  r)   r)   r-   rs     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d	}t||   |   d S )
Nr   r   TFrM   r   rL   r   zInvalid TIFF file header)rw   rV  r  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPagerC  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rg   iimmr   r)   r)   r-   r    s    zAppendingTiffWriter.setupc                 C  s   | j rd S | j| j | jd}|sd S || jkr!d}t||  }|| j7 }| j| j | 	| | j| | 
  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)r
  rw   rV  r  rC  r	  r  readLongr  	writeLongfixIFD)rg   r  r   
ifd_offsetr)   r)   r-   finalize  s   


zAppendingTiffWriter.finalizec                 C  s   |    |   d S r]   )r  r  ru   r)   r)   r-   newFrame  s   zAppendingTiffWriter.newFramec                 C  s   | S r]   r)   ru   r)   r)   r-   	__enter__  s   zAppendingTiffWriter.__enter__c                 C  s   | j r|   dS )NF)r  r  )rg   exc_type	exc_value	tracebackr)   r)   r-   __exit__  s   zAppendingTiffWriter.__exit__c                 C  s   | j  | j S r]   )rw   rP  r  ru   r)   r)   r-   rP    rS   zAppendingTiffWriter.tellc                 C  s*   |t jkr
|| j7 }| j|| |  S r]   )r  r  r  rw   rV  rP  )rg   r\  whencer)   r)   r-   rV    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   r4   )rw   rV  r  SEEK_ENDrP  rh  r   r  )rg   posZ	pad_bytesr)   r)   r-   r    s   
zAppendingTiffWriter.goToEndc                 C  s.   || _ | j d | _| j d | _| j d | _d S )Nr1   r  ZHHL)endianlongFmtshortFmt	tagFormat)rg   r  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   r2   )r  rw   rP  r  rV  	readShortr  SEEK_CUR)rg   r  num_tagsr)   r)   r-   r    s   zAppendingTiffWriter.skipIFDsc                 C  s   | j |S r]   )rw   rh  r   r)   r)   r-   rh    r   zAppendingTiffWriter.writec                 C     t | j| jd\}|S )Nr   )r   r  r   rw   rC  r&  r)   r)   r-   r"       zAppendingTiffWriter.readShortc                 C  r%  rN   )r   r  r  rw   rC  r&  r)   r)   r-   r    r&  zAppendingTiffWriter.readLongc                 C  R   | j dtj | j t| j|}|d ur%|dkr'd| d}t|d S d S )Nr   wrote only  bytes but wanted 4	rw   rV  r  r#  rh  r   r  r  r  rg   rr   Zbytes_writtenr   r)   r)   r-   rewriteLastShortToLong     z*AppendingTiffWriter.rewriteLastShortToLongc                 C  r'  )Nr(  r   r)   bytes but wanted 2)	rw   rV  r  r#  rh  r   r  r   r  r,  r)   r)   r-   rewriteLastShort  r.  z$AppendingTiffWriter.rewriteLastShortc                 C  r'  )Nr   r)  r*  r+  r,  r)   r)   r-   rewriteLastLong  r.  z#AppendingTiffWriter.rewriteLastLongc                 C  B   | j t| j|}|d ur|dkrd| d}t|d S d S )Nr   r)  r/  )rw   rh  r   r  r   r  r,  r)   r)   r-   
writeShort  
   zAppendingTiffWriter.writeShortc                 C  r3  )Nr   r)  r*  )rw   rh  r   r  r  r  r,  r)   r)   r-   r    r5  zAppendingTiffWriter.writeLongc                 C  s   |    | j  d S r]   )r  rw   r  ru   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)r"  rQ  r   r  r!  rw   rC  
fieldSizesr  r  r2  TagsrP  
fixOffsetsrV  r  r#  )rg   r$  rW  r   Z
field_typerX  Z
field_sizeZ
total_sizeZis_localr\  Zcur_posr)   r)   r-   r  &  s6   





zAppendingTiffWriter.fixIFDc                 C  s   |s
|s
d}t |t|D ]J}|r|  n|  }|| j7 }|rK|dkrK|dkr/d}t || | | jdtj	 | 
tj | jdtj	 q|rS| | q| | qd S )Nz offset is neither short nor longr   r
   znot implementedir%   )r  rQ  r"  r  r  r-  rw   rV  r  r#  r4  r   r  r0  r2  )rg   rX  r6  r7  r   rW  r\  r)   r)   r-   r:  I  s$   

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   r8  r9  rs   r  r  r  r  r  rP  r  r  rV  r  r  r  rh  r"  r  r-  r0  r2  r4  r  r  r  r:  r)   r)   r)   r-   r   h  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  rl  rR  r   r  rP  r   r  rQ  rV  r]  r  )r  rE  r|  r  r  r;  Zcur_idxZtfZimsZnfrr   r)   r)   r-   	_save_allc  s2   




r<  z.tifz.tiffz
image/tiff)yZ
__future__r   r  r  Zloggingr  r  r   r  Zcollections.abcr   Z	fractionsr   Znumbersr   r   typingr   r   r	    r   r   r   r   r   r   Z_binaryr   r  r   r  r   r   Z	getLoggerr   rT  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  r  r`  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  ra   r  rO   rR   r\   rc   r   r   rl   rV   r   r   r   r   Z
_IFDv2Baser   r   r   r   setattrrn  ZImageFileDirectoryrz  r  r  r   r<  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|
|   s\   f	
  , |