o
    h;L                    @  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
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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% ddl&m'Z' ddl(m)Z)m*Z* ddlm+Z+ dZ,e,rddl&m-Z-m.Z. e/e0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&ZHd'ZId(ZJd)ZKd*ZLd+ZMd,ZNd-ZOd.ZPd/ZQd0ZRd1ZSd2ZTd3ZUd4ZVd5ZWd6ZXd7ZYd8ZZd9Z[d:Z\d;Z]d<Z^d=Z_i dd>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^Z`d_d` e`a D Zbi e5d daddadbfdce6d daddadbfdce5d dad?dadbfdde6d dad?dadbfdde5ddaddadbfdee6ddaddadbfdee5ddad?dadbfdfe6ddad?dadbfdfe5d daddgdbfdhe6d daddgdbfdhe5d dad?dgdbfdie6d dad?dgdbfdie5ddaddgdbfdje6ddaddgdbfdje5ddad?dgdbfdke6ddad?dgdbfdke5d daddldbfdmi e6d daddldbfdme5d dad?dldbfdne6d dad?dldbfdne5ddaddldbfdoe6ddaddldbfdoe5ddad?dldbfdpe6ddad?dldbfdpe5d daddqdbfdre6d daddqdbfdre5d dad?dqdbfdse6d dad?dqdbfdse5ddaddqdbfdte6ddaddqdbfdte5ddgddqdbfdte6ddgddqdbfdte5ddad?dqdbfdue6ddad?dqdbfdui e5ddaddvdbfdwe5d daddxdbfdye5ddaddxdbfdye6ddaddxdbfdze5ddad?dxdbfd{e5ddgddxdbfd|e6ddgddxdbfd}e5d d~dddbfde6d d~dddbfde5ddadddbfde5ddgdddbfde6ddgdddbfde5dd~dddbfde6dd~dddbfde5ddadddgfde6ddadddgfde5d?dadddbfdi e6d?dadddbfde5d?dad?ddbfde6d?dad?ddbfde5d?dadddbfde6d?dadddbfde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfde5d?dadddafde6d?dadddafde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfdi e5d?dadddgfde6d?dadddgfde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfde5d?dadddbfde6d?dadddbfde5d?dadddbfde6d?dadddbfde5d?dadddfde6d?dadddfde5d?dadddafde6d?dadddafde5d?dadddgfdi e6d?dadddgfde5dAdaddadbfde6dAdaddadbfde5dAdad?dadbfde6dAdad?dadbfde5dAdaddgdbfde6dAdaddgdbfde5dAdad?dgdbfde6dAdad?dgdbfde5dAdaddldbfde6dAdaddldbfde5dAdad?dldbfde6dAdad?dldbfde5dAdaddqdbfde6dAdaddqdbfde5dAdadddfde5dAdadddgfdi e6dAdadddgfde5dAdad?dqdbfde6dAdad?dqdbfde5dEdadddbfde6dEdadddbfde5dEdadddfde6dEdadddfde5dEdadddfde6dEdadddfde5dEdadddbfde6dEdadddbfde5dGdaddqdbfdte6dGdaddqdbfdte5dGdadddbfde6dGdadddbfde5dKdadddbfde6dKdadddbfdZceddd ecD Zeg dZfegejhddse%dd dddĄZiddd˄ZjdddτZki Zli ZmdddԄZnG dd̄ deZoedepeqgef ZrdddۄZsdddބZtdddZue,reevef ZwneZwG ddք dewZxelex_lemex_me+a D ]#\ZyZzez{ddZze|exdez eley d  e|exdez emey  q[l[m[y[zG dd dexZ}e}Z~G dd dejZi dde5dddadfdde5dddqdfdde5dddd?fdde5dAddqdfdde5dAddd?fdde5dd?ddfdde5dddxdfdde5dd?dxdfdde5ddAddfdde5d?dddfdde5d?ddd fdde5d?ddd?fdde5dEdddfdde5dGdddfdde5dKdddfdde6dd?ddfdde6dddxdfd e6dd?dxdfde6ddAddfdZdd	d
ZG dd dejZdddZeejeei eeje eeje eejddg eejd dS (      )annotationsN)IteratorMutableMapping)Fraction)NumberRational)IOAnyCallableNoReturncast   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8)	deprecate)StrOrBytesPath)DeferredErroris_pathTYPESF)BufferIntegralLike   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  r2   ).0kvr2   r2   F/var/www/html/venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    r7   r   r2   )1z1;I)r9   z1;IR)r9   r9   )r9   z1;R)r&   )LzL;2I)r:   zL;2IR)r:   zL;2)r:   zL;2R)r(   )r:   zL;4I)r:   zL;4IR)r:   zL;4)r:   zL;4R)r.   )r:   zL;I)r:   zL;IR)r:   r:   )r:   zL;R)   )I;16zI;12)   )r<   r<   )I;16Br>   )r<   zI;16R)II;16S)r?   I;16BS)r'   )    )FF;32F)rC   F;32BF)r?   zI;32N)r?   I;32S)r?   I;32BS)r.   r.   )LArH   )r.   r.   r.   )RGBrI   )rI   zRGB;R)r.   r.   r.   r.   )RGBArJ   r   )rI   RGBX)r.   r.   r.   r.   r.   r   r   )rI   ZRGBXX)r.   r.   r.   r.   r.   r.   )r   r   r   )rI   ZRGBXXX)rJ   ZRGBa)r   r   )rJ   ZRGBaX)r   r   r   )rJ   ZRGBaXX)r&   r   )rJ   ZRGBAX)r&   r   r   )rJ   ZRGBAXX)i  )r=   r=   r=   )rI   zRGB;16L)rI   zRGB;16B)r=   r=   r=   r=   )rJ   zRGBA;16L)rJ   zRGBA;16B)rI   zRGBX;16L)rI   zRGBX;16B)rJ   zRGBa;16L)rJ   zRGBa;16B)PzP;1)rN   zP;1R)rN   zP;2)rN   zP;2R)rN   zP;4)rN   zP;4R)rN   rN   )rN   ZPX)PArO   )rN   zP;R)CMYKrP   )rP   ZCMYKX)rP   ZCMYKXX)rP   zCMYK;16L)rP   zCMYK;16B)LABrQ   c                 c  s    | ]	}t |d  V  qdS )r(   N)len)r3   Zkey_tpr2   r2   r6   	<genexpr>      rS   )s   MM *s   II* s   MM* s   II *s   MM +s   II+ libtiff_support_custom_tagsTz*Support for LibTIFF earlier than version 4r;   prefixbytesreturnboolc                 C  s   |  ttS N)
startswithtuplePREFIXESrV   r2   r2   r6   _accept#     r_   valfloat | Fraction | IFDRationalmax_valint!tuple[IntegralLike, IntegralLike]c                 C  s<   t | dk}t|rd|  n| |}|r|d d d S |S )Nr   )absIFDRationallimit_rational)ra   rc   invn_dr2   r2   r6   _limit_rational'  s   rl   rh   min_valc                 C  sp   t | }|j|jf}tdd |D |k rt| t|}tdd |D }t||kr6t|d |d  |}|S )Nc                 s      | ]}t |V  qd S rZ   floatr3   ir2   r2   r6   rS   5      z)_limit_signed_rational.<locals>.<genexpr>c                 s  rn   rZ   ro   rq   r2   r2   r6   rS   8  rs   r   r   )r   	numeratordenominatorminrl   rg   r\   max)ra   rc   rm   fracrk   Z	n_d_floatr2   r2   r6   _limit_signed_rational/  s   ry   opstrr	   c                   s   d	 fdd}|S )
Nselfrh   argstuple[float, ...]rX   bool | float | Fractionc                   s   t | j | S rZ   )getattr_valr|   r}   rz   r2   r6   delegateG  s   z_delegate.<locals>.delegate)r|   rh   r}   r~   rX   r   r2   )rz   r   r2   r   r6   	_delegateF  s   r   c                   @  sd  e Zd ZdZ	 dZ	dAdBd
dZedCddZedDddZdEddZ	dFddZ
dDddZdGddZdHd d!ZdId#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ed2Zed3Zed4Zed5Z ed6Z!ed7Z"ed8Z#ed9Z$ed:Z%ed;Z&ed<Z'ed=Z(ed>Z)e*e+d?red?Z,d@S d@S )Jrh   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_denominatorr   r   valuerb   ru   rd   rX   Nonec                 C  s   |  t |tr|j| _|j| _|j| _dS t |tr#|j| _|j| _ntr,t	t
|| _n|| _|| _|dkr=td| _dS |dkrHt|| _dS t||krXt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   )
isinstancerh   rt   r   ru   r   r   r   TYPE_CHECKINGr   r   rp   rd   )r|   r   ru   r2   r2   r6   __init__]  s(   


zIFDRational.__init__r   c                 C     | j S rZ   )r   r|   r2   r2   r6   rt        zIFDRational.numeratorc                 C  r   rZ   )r   r   r2   r2   r6   ru     r   zIFDRational.denominatormax_denominatortuple[IntegralLike, int]c                 C  s>   | j dkr| j| j fS t| jtsJ | j|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )ru   rt   r   r   r   limit_denominator)r|   r   fr2   r2   r6   ri     s
   
zIFDRational.limit_rationalr{   c                 C  s   t t| jS rZ   )r{   rp   r   r   r2   r2   r6   __repr__  r`   zIFDRational.__repr__c                 C  s
   | j  S rZ   )r   __hash__r   r2   r2   r6   r        
zIFDRational.__hash__otherobjectrY   c                 C  s0   | j }t|tr|j }t|trt|}||kS rZ   )r   r   rh   rp   )r|   r   ra   r2   r2   r6   __eq__  s   

zIFDRational.__eq__%list[float | Fraction | IntegralLike]c                 C  s   | j | j| jgS rZ   )r   r   r   r   r2   r2   r6   __getstate__     zIFDRational.__getstate__statec                 C  s^   t | d |\}}}t|ttfsJ || _tr tt|| _	n|| _	t|t
s*J || _d S Nr   )rh   r   r   rp   r   r   r   r   r   r   rd   r   )r|   r   r   r   r   r2   r2   r6   __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__Nr8   )r   rb   ru   rd   rX   r   )rX   r   rX   rd   )r   rd   rX   r   rX   r{   )r   r   rX   rY   )rX   r   )r   r   rX   r   )-__name__
__module____qualname____doc__	__slots__r   propertyrt   ru   ri   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   r   hasattrr   r   r2   r2   r2   r6   rh   O  s\    "






ImageFileDirectory_v2idxsize$Callable[[_LoaderFunc], _LoaderFunc]c                   s   d fdd}|S )Nfunc_LoaderFuncrX   c                   sB   ddl m} | jdr| jdd  dd| < | ft < | S )Nr   r   load_r)   _ )r   r   r   r[   replace_load_dispatch)r   r   r   r   r2   r6   	decorator  s
   z#_register_loader.<locals>.decorator)r   r   rX   r   r2   )r   r   r   r2   r   r6   _register_loader  s   r   2Callable[[Callable[..., Any]], Callable[..., Any]]c                   s   d fdd}|S )Nr   Callable[..., Any]rX   c                   s   | t  < | S rZ   )_write_dispatch)r   r   r2   r6   r     s   z#_register_writer.<locals>.decorator)r   r   rX   r   r2   )r   r   r2   r   r6   _register_writer  s   r   idx_fmt_nametuple[int, str, str]r   c                   sb   ddl m} | \} }|||< td  	dd fdd}|ft|<  fddt|< d S )Nr   r   =Tr|   r   datarW   
legacy_apirY   rX   tuple[Any, ...]c                   s   |  t|    |S rZ   )_unpackrR   r|   r   r   fmtr   r2   r6   basic_handler  s   z&_register_basic.<locals>.basic_handlerc                   s   d  fdd|D S )N    c                 3  s    | ]	}  |V  qd S rZ   )_packr3   r   )r   r|   r2   r6   rS     rT   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinr|   values)r   r   r6   <lambda>  s   z!_register_basic.<locals>.<lambda>T)r|   r   r   rW   r   rY   rX   r   )r   r   structcalcsizer   r   )r   r   r   namer   r2   r   r6   _register_basic  s   
r   c                   @  sR  e Zd ZU dZi Zded< i Zded< 			d}d~ddZedd Z	edd Z
edddZejdddZdddZdddZdd!d"Zdd$d%Zdd(d)Zdd+d,Zdd-d.Zdd0d1Zdd2d3Zdd5d6Zdd:d;Zdd=d>Zeeeejd?d@fejdAdBfejdCdDfej dEdFfej!dGdHfej"dIdJfej#dKdLfej$dAdBfej%dMdNfg	 e&dOdOdddQdRZ'e(dOddTdUZ)e&dVdOdddWdXZ*e(dVddZd[Z+e&d\d]	Pddd_d`Z,e(d\ddbdcZ-e&dddOdddedfZ.e(ddddgdhZ/e&did]	PdddjdkZ0e(diddldmZ1ddqdrZ2ddsdtZ3ddudvZ4dddydzZ5dd{d|Z6dS )r   a  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, tuple[int, _LoaderFunc]]r   zdict[int, Callable[..., Any]]r      II*     NifhrW   rV   bytes | Nonegroup
int | NonerX   r   c                 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rV| d	|d
d d n| d|dd d | _d| _dS )a  Initialize an ImageFileDirectory.

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

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr&   ><znot a TIFF IFD+   Qr.   r   r:   r(   F)r_   reprSyntaxError_prefixMM_endianII_bigtiffr   tagtyperesetr   next_legacy_api)r|   r   rV   r   msgr2   r2   r6   r   H  s(   


zImageFileDirectory_v2.__init__c                 C  r   rZ   )r   r   r2   r2   r6   r   o      zImageFileDirectory_v2.<lambda>c                 C  r   rZ   )_offsetr   r2   r2   r6   r   p  r  rY   c                 C  r   rZ   )r  r   r2   r2   r6   r   r  r   z ImageFileDirectory_v2.legacy_apir   r   c                 C  s   d}t |)Nz"Not allowing setting of legacy api)	Exception)r|   r   r  r2   r2   r6   r   v  s   c                 C  s(   i | _ i | _i | _i | _d | _d | _d S rZ   )_tags_v1_tags_v2_tagdatar   _nextr  r   r2   r2   r6   r  {  s   
zImageFileDirectory_v2.resetr{   c                 C  s   t t| S rZ   )r{   dictr   r2   r2   r6   __str__     zImageFileDirectory_v2.__str__dict[str, Any]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 r2   )r   lookupr   r   )r3   coder   r   r2   r6   r7     s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsr   r2   r   r6   named  s   
zImageFileDirectory_v2.namedrd   c                 C     t t| jt| jB S rZ   )rR   setr
  r	  r   r2   r2   r6   __len__     zImageFileDirectory_v2.__len__tagr	   c                 C  sf   || j vr| j| }| j| }| j| \}}|| || j| |< | j | }| jr1t|ttfs1|f}|S rZ   )r	  r
  r   r   r   r   r\   rW   )r|   r  r   typr   handlerra   r2   r2   r6   __getitem__  s   



z!ImageFileDirectory_v2.__getitem__r   c                 C     || j v p	|| jv S rZ   )r	  r
  r|   r  r2   r2   r6   __contains__     z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S rZ   )_setitemr   )r|   r  r   r2   r2   r6   __setitem__  r  z!ImageFileDirectory_v2.__setitem__r   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 rS|D ]}t|ts?J |dk rKtj| j|<  nq6tj| j|< nt
dd |D rd}d}d}	|D ]/}t|tsmJ |r|d|  krydk s|n d}|rd|  k rd	k sn d}|	r|dk rd}	qd|rtj| j|< nH|rtj| j|< n?|	rtj| j|< n6t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rdd |D }| j| tjkot|t}
|
s!t fdd|D }|r'| jn| j}|
s jdksL| j| tjksL jd u rt|dkr|s|r^| j| tjtjfv r^|f}z|\||< W d S  ty   td| dt| d |d ||< Y d S w |||< d S )Nc                 s      | ]}t |tV  qd S rZ   )r   rh   r3   r5   r2   r2   r6   rS         z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>r   c                 s  r"  rZ   )r   rd   r#  r2   r2   r6   rS     r$  Tr    Fi i   c                 s  r"  rZ   )r   rp   r#  r2   r2   r6   rS     r$  c                 s  r"  rZ   )r   r{   r#  r2   r2   r6   rS     r$  c                 s  r"  rZ   )r   rW   r#  r2   r2   r6   rS     r$  c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )r   r{   encoder#  r2   r2   r6   
<listcomp>  s    z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r2   )r   rd   rp   r#  r2   r2   r6   r'    s   " c                 3  s(    | ]}t |tr |n|V  qd S rZ   )r   r{   Zcvt_enumr   infor2   r6   rS     s
    
r   zMetadata Warning, tag z had too many entries: z, expected 1)r   rW   r{   r   r  r   r   r   type	UNDEFINEDallrh   ZSIGNED_RATIONALZRATIONALrd   SHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr  r\   r  r	  lengthrR   
ValueErrorwarningswarn)r|   r  r   r   Z	basetypesr   r5   shortZsigned_shortlongis_ifddestr2   r(  r6   r     s   

 zImageFileDirectory_v2._setitemc                 C  s.   | j |d  | j|d  | j|d  d S rZ   )r	  popr  r
  r  r2   r2   r6   __delitem__  s   z!ImageFileDirectory_v2.__delitem__Iterator[int]c                 C  r  rZ   )iterr  r
  r	  r   r2   r2   r6   __iter__  r  zImageFileDirectory_v2.__iter__r   r   r   c                 C  s   t | j| |S rZ   )r   unpackr   )r|   r   r   r2   r2   r6   r        zImageFileDirectory_v2._unpackr   c                 G  s   t j| j| g|R  S rZ   )r   packr   )r|   r   r   r2   r2   r6   r     r  zImageFileDirectory_v2._packHr8  r:   r9  bzsigned bytehzsigned shortlzsigned longr   rp   ddoubler   Zlong8r   Tc                 C     |S rZ   r2   r   r2   r2   r6   	load_byte"     zImageFileDirectory_v2.load_bytebytes | int | IFDRationalc                 C  s*   t |tr	t|}t |trt|f}|S rZ   )r   rh   rd   rW   r|   r   r2   r2   r6   
write_byte&  s
   


z ImageFileDirectory_v2.write_byter&   c                 C  s"   | dr|d d }|ddS )N    rf   zlatin-1r   )endswithdecoder   r2   r2   r6   load_string.  s   
z!ImageFileDirectory_v2.load_stringstr | bytes | intc                 C  s0   t |tr	t|}t |ts|dd}|d S )Nr%  r   rP  )r   rd   r{   rW   r&  r|   r   r2   r2   r6   write_string4  s
   

z"ImageFileDirectory_v2.write_stringr)   r.   )tuple[tuple[int, int] | IFDRational, ...]c                   X   |  t|d  d|}dfdd	 t fd
dt|d d d |dd d D S )Nr(   r:   ard   rE  rX   tuple[int, int] | IFDRationalc                       r| |fS t | |S rZ   rh   rY  rE  r   r2   r6   combineC     z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3      | ]
\}} ||V  qd S rZ   r2   r3   numdenomr_  r2   r6   rS   F      z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r&   r   rY  rd   rE  rd   rX   rZ  r   rR   r\   zipr|   r   r   valsr2   r_  r   r6   load_rational=     0z#ImageFileDirectory_v2.load_rationalrh   c                      d  fdd|D S )Nr   c                 3  s(    | ]} j d gt|dR  V  qdS )Z2Ll    N)r   rl   r3   rx   r   r2   r6   rS   J  s    
z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r2   r   r6   write_rationalH  s   z$ImageFileDirectory_v2.write_rationalr,   c                 C  rJ  rZ   r2   r   r2   r2   r6   load_undefinedN  rL  z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tr	t|}t |trt|dd}|S )Nr%  r   )r   rh   rd   r{   r&  rU  r2   r2   r6   write_undefinedR  s
   

z%ImageFileDirectory_v2.write_undefined
   c                   rX  )Nr(   rG  rY  rd   rE  rX   rZ  c                   r[  rZ   r\  r]  r^  r2   r6   r_  `  r`  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  ra  rZ   r2   rb  re  r2   r6   rS   c  rf  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r&   r   rg  rh  rj  r2   rl  r6   load_signed_rationalZ  rn  z*ImageFileDirectory_v2.load_signed_rationalc                   ro  )Nr   c                 3  s*    | ]} j d gt|ddR  V  qdS )Z2lii   N)r   ry   rp  r   r2   r6   rS   g  s
    
z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r2   r   r6   write_signed_rationale  s   z+ImageFileDirectory_v2.write_signed_rationalfp	IO[bytes]r   c                 C  s8   | |}t||krd| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrR   OSError)r|   rw  r   retr  r2   r2   r6   _ensure_readl  s   
z"ImageFileDirectory_v2._ensure_readc              
   C  st  |    | | _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7 }
|
|dkrd| dnt|7 }
t|
 q(| jr| d| |dn	| d| |d\| _W d S  ty9 }
 ztt|
 W Y d }
~
d S d }
~
ww )Nr   r.   rD  r&   r   HHQ8s   HHL4sr;   unknownztag:  (
) - type: )z%s - unsupported type %sr(   r:   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read ry  z. Skipping tag z
 - value: rB   <table:  bytes>)r  tellr  r   r   r}  ranger   r  r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readrR   r6  r7  r
  r   r   r  r{  r{   )r|   rw  Z	tag_countrr   r  r  countr   tagnametypnamer  Z	unit_sizer  r   hereoffsetr2   r2   r6   loadv  sx   






 zImageFileDirectory_v2.loadc                 C  s`   | j | d| jr
dnd }| jr|| ddd7 }|| jr'| dd7 }|S | d	d7 }|S )
NrD  r   *   HHr.   r   r   r=   r:   )r   r   r   r|   r   r2   r2   r6   _get_ifh  s   zImageFileDirectory_v2._get_ifhr   r  c              
     s`  |  | jrdndt| j}g }| jrdnd}| jrdnd} t|t| j| jr+dnd  | 7  d }t| j D ]\}}|tkrGt|}| j| }	t	d||	t
| |	tjko_t|t}
|
rt|  |d	}| j| }| D ]\}}|||< qs| }nt|tr|n|f}| j|	 | g|R  }t|| jj}|
rd
nt|	d}d| d| d| d|	 d	}|t|dkrdt| dnt|7 }t	| |
rd}n|	tjtjtjfv rt|}nt|}t||kr|||	|||ddf q;|||	||  | |f  t|d d d 7  q;|d urb|| \}}	}}}|rK| j|	 \}} fdd|| || j D }| j|	 | g|R  }n|  || !||d   }||	|||f||< |D ]'\}}	}}}t	d||	|t
|t
| ||  | jrdnd||	||7 }qd||  |d7 }|D ]\}}	}}}||7 }t|d@ r|d7 }q|S )Nr   rD  r:   r.   r(   r  r;   zTag %s, Type: %s, Value: %s)r   ifdr  zsave: r  r  z) - value: r=   r  r  r   rP  r   r&   c                   s   g | ]}|  qS r2   r2   )r3   ra   r  r2   r6   r'        z1ImageFileDirectory_v2.tobytes.<locals>.<listcomp>r   z%s %s %s %s %sr~  r  )"r   r   rR   r	  sortedr  STRIPOFFSETSr   r  r  r   r   r/  r   r  r   r  tobytesr\   r   r  r   r   r   r  r{   r3  r2  r+  appendljustr   r   r   )r|   r  resultentriesr   fmt_sizeZstripoffsetsr  r   r  r:  r  r   Zifd_tagZ	ifd_valuer   r  r  r  r  r   r  r2   r  r6   r    sp   "


(



zImageFileDirectory_v2.tobytesc                 C  sB   |  dkr||   |  }| |}|| |t| S r   )r  writer  r  rR   )r|   rw  r  r  r2   r2   r6   save  s   

zImageFileDirectory_v2.save)r   NN)r   rW   rV   r   r   r   rX   r   )rX   rY   )r   rY   rX   r   rX   r   r   )rX   r  r   r  rd   rX   r	   r  r   rX   rY   r  rd   r   r	   rX   r   )r  rd   r   r	   r   rY   rX   r   )r  rd   rX   r   rX   r>  )r   r{   r   rW   rX   r   )r   r{   r   r	   rX   rW   r   )r   rW   r   rY   rX   rW   )r   rM  rX   rW   )r   rW   r   rY   rX   r{   )r   rT  rX   rW   )r   rW   r   rY   rX   rW  )r   rh   rX   rW   )r   rM  rX   rW   )rw  rx  r   rd   rX   rW   )rw  rx  rX   r   )rX   rW   rK   )r  rd   rX   rW   )rw  rx  rX   rd   )7r   r   r   r   r   __annotations__r   r   r   rV   r  r   setterr  r  r  r  r  r  r!  r   r=  r@  r   r   listmapr   r   r-  r/  ZSIGNED_BYTEr.  r0  FLOATr1  ZIFDLONG8r   rK  r   rO  rS  rV  rm  rq  rr  rs  ru  rv  r}  r  r  r  r  r2   r2   r2   r6   r     s   
 <'








^

















CPr   r   r   Zwrite_c                      s   e Zd ZU dZd$ fddZed	d
 Zedd
 Zded< 	 e	d%ddZ
d&ddZd'ddZd(ddZd)ddZd*d d!Zd+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
    r}   r	   kwargsrX   r   c                   s   t  j|i | d| _d S )NT)superr   r  )r|   r}   r  	__class__r2   r6   r   8  s   
zImageFileDirectory_v1.__init__c                 C  r   rZ   )r  r   r2   r2   r6   r   <  r  zImageFileDirectory_v1.<lambda>c                 C  r   rZ   )r
  r   r2   r2   r6   r   =  r  zdict[int, int]r   originalr   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`

        r^   )rV   r
  r   r  )clsr  r  r2   r2   r6   from_v2C  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`

        r^   )r   rV   r  r
  r   r	  )r|   r  r2   r2   r6   to_v2U  s
   zImageFileDirectory_v1.to_v2r  r   rY   c                 C  r  rZ   )r  r
  r  r2   r2   r6   r  f  r  z"ImageFileDirectory_v1.__contains__rd   c                 C  r  rZ   )rR   r  r
  r  r   r2   r2   r6   r  i  r  zImageFileDirectory_v1.__len__r>  c                 C  r  rZ   )r?  r  r
  r  r   r2   r2   r6   r@  l  r  zImageFileDirectory_v1.__iter__r   c                 C  s   dD ]	}|  ||| qd S N)FT)r   )r|   r  r   r   r2   r2   r6   r!  o  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   r   r\   rW   )r|   r  r   r  r   r  legacyra   r2   r2   r6   r  s  s   



z!ImageFileDirectory_v1.__getitem__)r}   r	   r  r	   rX   r   )r  r   rX   r  )rX   r   r  r   r  r  r  )r   r   r   r   r   r   tagsZtagdatar  classmethodr  r  r  r  r@  r!  r  __classcell__r2   r2   r  r6   r  %  s   
 




r  c                      s   e Zd ZdZdZdZ	d'd( fddZd)ddZed*ddZ	d+ddZ
d+ddZd*ddZd,ddZd- fddZd)dd Zd)d!d"Zd-d#d$Zd)d%d&Z  ZS ).TiffImageFileZTIFFz
Adobe TIFFFNrw  StrOrBytesPath | IO[bytes]filenamestr | bytes | NonerX   r   c                   s   |  	 |  	 t  || d S rZ   )r  r   )r|   rw  r  r  r2   r6   r     s
   zTiffImageFile.__init__c                 C  s   | j d}|d dkr|| j d7 }t|| _| 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   rf   Nz*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )rw  rz  r   tag_v2r  Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesr  r  r   _seekr  r2   r2   r6   _open  s   

zTiffImageFile._openrd   c                 C  sj   | j }|d u r+|  }| t| j | j d u r&| |  d  | j d u s| | | j d us2J | j S )Nr   )r  r  r  rR   r  r  )r|   Zcurrent_n_framescurrentr2   r2   r6   n_frames  s   


zTiffImageFile.n_framesframec                 C  sP   |  |sdS | | | jdur$| jj| jks| jj| jkr&d| _dS dS dS )z%Select a given frame as current imageN)Z_seek_checkr  _imimr   
_tile_sizemode)r|   r  r2   r2   r6   r    s   



zTiffImageFile.seekc                 C  s  t | jtr
| jj| j| _t| j|kr| jsd}t|t	
d|| j| j| j  | jdkr7d}t|| j| j | j| j t	
d| j  | j| j | jj| jv r`d| _n| jj| _| jdkro|d | _t| jdkr|| jdk| _|  jd7  _t| j|ks| j| j|  | j| j t| jv r| jt | jd< n	d| jv r| jd= |   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   Zxmp)r   r  r   exrw  rR   r  r  EOFErrorr  r  r  r  r5  r  r  r  r  r  r  is_animatedXMPr)  Z_reload_exifr  r  r  r  _setup)r|   r  r  r2   r2   r6   r    sP   





zTiffImageFile._seekc                 C  r   )zReturn the current frame number)r  r   r2   r2   r6   r    r   zTiffImageFile.telldict[int, dict[str, bytes]]c                 C  s   i }| j tjj}|rZ|drZt|dd }t|d d d d }t	|d| d|  }|d| d| |  }d|i||< |td| | d d d }|d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.
        s   8BIMr(   r*   r   r&   rt  r   N)
r  r  r   BaseZImageResourcesr[   i16mathceili32)r|   blocksra   idnr   r   r2   r2   r6   get_photoshop_blocks  s   
"
z"TiffImageFile.get_photoshop_blocksImage.core.PixelAccess | Nonec                   s   | j r
| jr
|  S t  S rZ   )tileuse_load_libtiff_load_libtiffr  r  r   r  r2   r6   r    s   
zTiffImageFile.loadc                 C  s:   | j d u rt| j tj| j| j| _tj	|  d S rZ   )
r  r   Z_decompression_bomb_checkr  corenewr  r  r   load_preparer   r2   r2   r6   r    s   
zTiffImageFile.load_preparec                 C  sd   | j sd| _|  }tjD ]}||vrq|| qtj| dd tj	j
| jv r0| jtj	j
= d S d S )NT)Zin_place)r  !_close_exclusive_fp_after_loadingZgetexifr   TAGS_V2_GROUPSget_ifdr   Zexif_transposer   r  Orientationr  )r|   exifkeyr2   r2   r6   load_end  s   
zTiffImageFile.load_endc              
   C  s
  t j |  |   t| jdksd}t|| jd d }| jd d }zt| jdo0| j }t| jdr<| j	  W n tyH   d}Y nw |r^t
|tsRJ t|}||d< t|}t | jd	|| j}z	|| j| W n ty } zd
}t||d}~ww | jo| j }t| jdrtd || j \}	}
n<|rtd |s| jd t|dtj}|d\}	}
t||tj ntd | jd || j \}	}
g | _d| _|    |r| j!  d| _|
dk rd|
 }t|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 readingzdecoder error )"r   r  r  rR   r  r{  r   rw  r  r  r   r\   r  Z_getdecoderr  Zdecoderconfigsetimager  r5  Z_exclusive_fpr  r  r  rR  r  r  oslseekSEEK_CURSEEK_SETrz  readonlyr  close)r|   r  Zextentsr}   rw  Z	args_listdecodereZclose_self_fpr  errposr2   r2   r6   r  ,  sh   







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 z| j t }| j t }W n tyz } zd}t||d}~ww t|trt|tsd}t|||f| _| j tjj}|dv r||f| _n||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 rdnd}|t!krt
"d| d}t#|||k r&|	d| }	n||kr4|dkr4|	| }	t|	|krAd}t#|| j j$||||	|
f}t
d| z	t%| \| _&}W n tys } 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r||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.rT|d"kr|dd d |dd  }t
d| t%| \| _&}|dkr$| jd'kr$| jdkr$d(}n|d)kr,d*}n|/d+r:|dd, d- }|| jd.| j j0f}| j,1t23d/dd||fd| nt4| j v s`t5| j v rt4| j v ru| j t4 }| j t6|}|}n%| j t5 }| j t7}| j t8}t|trt|tsd0}t||}||kr||kr| jd"kr|d,d }|D ]b}|| |kr|t9|	 d1 }nd}|}| jd"kr|| }|| }|t|df}| j,1t23| j||t|| |t|| |f|| ||7 }||krd|| }}||krd}|d7 }qnt
d2 d}t#|t:| j v r/| j t: | j(d3< | j'd4v rKd5d6 | j t; D }t<=d7d8>|| _?dS dS )9z-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Missing dimensionsNzInvalid dimensions)r)   r*   r,   r.   z
- size: %sr8   r2   )r&   r*   r.   r'   r)   r(   )r&   r*   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %scompressionr&   dpigRQ@
resolutionr%   r-   rI   r<   I;16N)z;16Bz;16Lrf   NFr  zInvalid tile dimensionsr.   z- unsupported data organizationicc_profilerN   rO   c                 S  s   g | ]}t |d  qS r"   r   )r3   rE  r2   r2   r6   r'  z  s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   )@r  r{  COMPRESSION_INFOr  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr  r  YCBCRSUBSAMPLING
IMAGEWIDTHIMAGELENGTHr  	TypeErrorr   rd   r5  r  r   r  r  _sizer   SAMPLEFORMATrR   rw   rv   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   rV   	OPEN_INFO_moder  r)  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  rQ  r  r  r   _Tiler  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r%   r   palette) r|   r  photoZ	fillorderZxsizeZysizer  ZorientationZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr  rawmodeZxresZyresZresunitxylayerrY  offsetsrF  wZ	tilewidthr  strideZtile_rawmoder}   r&  r2   r2   r6   r    s<  






,









"

 


zTiffImageFile._setuprZ   )rw  r  r  r  rX   r   r  r   )r  rd   rX   r   )rX   r  )rX   r  )r   r   r   formatformat_descriptionr  r   r  r   r  r  r  r  r  r  r  r  r  r  r  r2   r2   r  r6   r    s$    



.



`r  r9   r:   rH   rN   rO   r?   rF   r<   r@   rC   rD   rI   rL   rJ   rP   YCbCrrQ   rG   r>   rA   rE   )rA   rE   r  Image.Imagerw  rx  r  str | bytesc           6      C  st	  zt | j \}}}}}}W n ty% }	 zd| j d}
t|
|	d }	~	ww | j}| j}t|d}|dr9d|_z|d }W n tyU   | j	d}t
|trSd }Y nw |d u r]d}n|dkrdd	}n|d
krjd}tpo|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 i }t| dr| j  }i |t!| di }t"t#fD ]}||v r||= qt| drNt$t%t&t't(t)fD ]0}|| j*v rL|t'kr<| j*j| tj+tj,fvr<||= q| 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t0dft1dft2dff
D ]\}}||v r|| ||< q|d}|rd|t$< |d |t%< |d |t&< |dkr||t3< t4|dkrt4||t5< |d ur||t6< |dkr||t#< t7|vr||t7< nK| jd v r%|t7 dkr%| jd!kr | 8 }| }|d urt9|j:D ]}t9|j;D ]}|||f d"krdnd"|||f< qq|} nt<=| } | jd#v rb| j>?d$d%}g }t4|d& }t9d&D ]} |d'd( |||  || d   D 7 }|dgd)|  7 }q>||t@< |t |t }!}"t4||!|d  d* d+  }#tA|vr|r|d,tB}$|#dkrdntC|$|# |"}%|d	krtC|%d* d+ d+ |"}%n|"}%|%dkrd}%|%|tA< |#dkrdn|#|tA  }&|"|tA  d |tA  }'|&d-krtjD|jtE< |&f|'d  |#|" |&|'d   f |tE< tFt9d|&|' |&|tG< tH|d|tI< | jd.krtJd/tKd0iL D ]\}}(|M||( qtNtOtPtQg})|rd1|v rP|d1 }*t
|*tr;|*dk s;|*d2krAd3}
tR|
|d	krLd4}
tR|
|*|tS< td5 td6tT|L  d}+t|d7r~z|Ud |V }+W n tWjXy}   Y nw i },|)tYtKtEtGtZt[g7 })t3|d i}-t\]|L |L D ]v\}}.|tj^vrt!tj_d8d9sq|tjv rtj`|,|< n'||jv r|j| |,|< nt
|.ttatbtfsԐqtc|jd}/|/r|/|,|< ||-vr||)vrt
|.tbr|.ed:d;d< |-|< qt
|.tfrta|.|-|< q|.|-|< qt#|-v r't4|-t# dkr'|-t# d |-t#< td=tT|-L  | jd>v r9d?}t|-L }0|0g  |||+||0|,f}1th| jd@|1|}2|2i| j>dA| j  	 |2etjjkdd  \}3}4|+ss|l|4 |3rwnq_|3dk rdB|3 dC}
t|
n"|)D ]}||= q|m|}5tjn| |tjoddA| j |5||#dfg dD|v rtp| dD| d S d S )ENzcannot write mode z as TIFFr^   Zbig_tiffTr  r%   r+   r-   r0   r/   r   r   Ztiffinfor  zTiffinfo Keys: %sr  r  r  descriptionr   Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r&   r8   )r9   r:   r9   r!   r  rI   r  r'   c                 S  s   g | ]}|d  qS r  r2   r#  r2   r2   r6   r'  6  r  z_save.<locals>.<listcomp>r"   r,   r.   Z
strip_sizer    r1  )r   r   )r   r!      r!   r7  r!   qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  rU   Fr%  r   rP  zConverted items: %s)r>   r<   r  r  rM   zencoder error z when writing image fileZ_debug_multipage)q	SAVE_INFOr  r  r{  encoderinfoencoderconfigr   r  r   r)  r   rd   WRITE_LIBTIFFr
  r   r  r  rW   r   ZExifr  r  r  r  r  r  r   r  r  r   r  r   r  r   EXIFIFDr  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r  r3  r+  r$  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  rR   r  r  r  copyr  heightwidthr   invertr  Z
getpaletter%  r   
STRIP_SIZErv   r/  STRIPBYTECOUNTSr\   r  COMPRESSION_INFO_REVr  r  REFERENCEBLACKWHITEr  
setdefaultr!  r"  r  TILEBYTECOUNTSr5  JPEGQUALITYr  r  r  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFD	itertoolschainZLIBTIFF_COREr  r  rp   r{   r  r*  r&  rh   sortZ_getencoderr  r   ZMAXBLOCKr  r  _saver  setattr)6r  rw  r  r(  rV   r'  r/  bitsextrar  r  r;  r<  r  r  r  r)  r  r  Z
legacy_ifdZsupplied_tagsr  Ziccr   r  Zinverted_imZpxr*  r)  ZlutZcolormapcolorsrr   r-  rF  r.  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imagedefault_valueZ	blocklistr8  r  typesZattsr   r*  r  rY  encodererrcoder   r  r2   r2   r6   rY    s  



















&
&






 








rY  c                   @  sH  e Zd Zg dZh dZdVdWd
dZdXddZdXddZdXddZdYddZ	dZddZ
d[ddZejfd\ddZdXdd Zd]d#d$ZdXd%d&Zd^d)d*Zd_d,d-Zd`d.d/Zd[d0d1Zd[d2d3Zedad7d8Z	9dbdcd<d=Zddd>d?Zddd@dAZdddBdCZdedDdEZdddFdGZdddHdIZdXdJdKZ dXdLdMZ!dfdOdPZ"	dgdhdSdTZ#dUS )iAppendingTiffWriter)r   r   r   r&   r(   r.   r   r   r&   r(   r.   r(   r.   r(   r&   r(   r.   >   i   r$   i  i  i	  r#   Ffnr  r  rY   rX   r   c                 C  s~   |  t |r(|| _d| _zt||rdnd| _W n ty'   t|d| _Y nw ttt || _d| _| j	 | _
|   d S )NTzw+bzr+bF)r   r   close_fpopenr   r{  r   r   rW   r  	beginningsetup)r|   rc  r  r2   r2   r6   r     s   zAppendingTiffWriter.__init__c                 C  s   | j | jtj d | _d| _| j d | _}d|v | _	|s$d| _
d S d| _
|tvr1d}t|| |tr:dnd | j	rH| j dtj |   |   d S )	Nr   r(      +TFzInvalid TIFF file headerr   r   )r   r  rf  r  r  whereToWriteNewIFDOffsetoffsetOfNewPagerz  IIMMr   isFirstr]   RuntimeError	setEndianr[   r   r  skipIFDsgoToEnd)r|   iimmr  r2   r2   r6   rg    s"   
zAppendingTiffWriter.setupc                 C  s   | j rd S | j| j | jd}|sd S || jkr!d}t|| jr,| jdtj	 | 
| jr3dnd}|| j7 }| jd usBJ | j| j | || jrQdnd | j| |   d S )Nr(   z1IIMM of new page doesn't match IIMM of first pager.   )rl  r   r  rj  rz  rk  rm  r   r  r  _readri  _writefixIFD)r|   rq  r  
ifd_offsetr2   r2   r6   finalize  s$   

zAppendingTiffWriter.finalizec                 C  s   |    |   d S rZ   )rv  rg  r   r2   r2   r6   newFrame5  s   zAppendingTiffWriter.newFramec                 C  s   | S rZ   r2   r   r2   r2   r6   	__enter__:  s   zAppendingTiffWriter.__enter__r}   r   c                 G  s   | j r	|   d S d S rZ   )rd  r  r   r2   r2   r6   __exit__=  s   zAppendingTiffWriter.__exit__rd   c                 C  s   | j  | j S rZ   )r   r  rj  r   r2   r2   r6   r  A  r   zAppendingTiffWriter.tellr  whencec                 C  s*   |t jkr
|| j7 }| j|| |  S )z
        :param offset: Distance to seek.
        :param whence: Whether the distance is relative to the start,
                       end or current position.
        :returns: The resulting position, relative to the start.
        )r  r  rj  r   r  r  )r|   r  rz  r2   r2   r6   r  D  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   r=   )r   r  r  SEEK_ENDr  r  rW   rj  )r|   r  Z	pad_bytesr2   r2   r6   rp  Q  s   
zAppendingTiffWriter.goToEndendianr{   c                 C  sB   || _ | j  d| _| j  d| _| j  d| jrdnd | _d S )Nr:   rD  r  r   )r|  ZlongFmtZshortFmtr   	tagFormat)r|   r|  r2   r2   r6   rn  [  s    zAppendingTiffWriter.setEndianc                 C  s|   	 |  | jrdnd}|dkr| j | jrdnd | _d S | j| |  | jr+dnd}| j|| jr7dnd tj q)NTr.   r(   r   r&   r  r;   )rr  r   r   r  ri  r  r  r  )r|   ru  num_tagsr2   r2   r6   ro  a  s   zAppendingTiffWriter.skipIFDsr   r   c                C  s   | j |S rZ   )r   r  rN  r2   r2   r6   r  n  r  zAppendingTiffWriter.write
field_sizec                 C  s.   z	dddd| W S  t y   d}t|w )NrD  r:   r   )r&   r(   r.   zoffset is not supported)r  rm  )r|   r  r  r2   r2   r6   _fmtq  s   zAppendingTiffWriter._fmtc                 C  s&   t | j| | | j|\}|S rZ   )r   rA  r|  r  r   rz  )r|   r  r   r2   r2   r6   rr  x  s   zAppendingTiffWriter._readc                 C  
   |  dS Nr&   rr  r   r2   r2   r6   	readShort~  r   zAppendingTiffWriter.readShortc                 C  r  Nr(   r  r   r2   r2   r6   readLong  r   zAppendingTiffWriter.readLongbytes_writtenr   expectedc                 C  s0   | d ur| |krd|  d| }t |d S d S )Nzwrote only z bytes but wanted )rm  )r  r  r  r2   r2   r6   _verify_bytes_written  s   z)AppendingTiffWriter._verify_bytes_writtenr   r   new_field_sizec                 C  sJ   | j | tj |s|}| j t| j| | |}| 	|| d S rZ   )
r   r  r  r  r  r   rC  r|  r  r  )r|   r   r  r  r  r2   r2   r6   _rewriteLast  s   z AppendingTiffWriter._rewriteLastc                 C  s   |  |dd d S )Nr&   r(   r  rU  r2   r2   r6   rewriteLastShortToLong  rB  z*AppendingTiffWriter.rewriteLastShortToLongc                 C     |  |dS r  r  rU  r2   r2   r6   rewriteLastShort  r  z$AppendingTiffWriter.rewriteLastShortc                 C  r  r  r  rU  r2   r2   r6   rewriteLastLong  r  z#AppendingTiffWriter.rewriteLastLongc                 C  s0   | j t| j| | |}| || d S rZ   )r   r  r   rC  r|  r  r  )r|   r   r  r  r2   r2   r6   rs    s   zAppendingTiffWriter._writec                 C     |  |d d S r  rs  rU  r2   r2   r6   
writeShort  r   zAppendingTiffWriter.writeShortc                 C  r  r  r  rU  r2   r2   r6   	writeLong  r   zAppendingTiffWriter.writeLongc                 C  s    |    | jr| j  d S d S rZ   )rv  rd  r   r  r   r2   r2   r6   r    s   zAppendingTiffWriter.closec              
   C  s*  |  | jrdnd}t|D ]}t| j| j| jrdnd\}}}| j| }|| }| jr1dnd}||k}	|	sG|  || j	 }
| 
|
| || jv r| j }tdt|j|t|d||| |	ru| || | j||  q| j|
 | || | j| q|	r| j|tj qd S )Nr.   r&   r;   r(   z;fixIFD: %s (%d) - type: %s (%d) - type size: %d - count: %dr  )rr  r   r  r   rA  r}  r   rz  
fieldSizesrj  r  Tagsr  r  r  r   r  r   r   r  _fixOffsetsr  r  r  )r|   r~  rr   r  Z
field_typer  r  Z
total_sizer  is_localr  Zcur_posr2   r2   r6   rt    sB   






zAppendingTiffWriter.fixIFDr  c                 C  s   t |D ]^}| |}|| j7 }d}| jr |dv r |dkr d}n
|dkr*|dkr*d}|r\|dkr6d	}t|| ||| | d d }| j|tj	 | 
| | jd| tj	 q| || qd S )
Nr   )r&   r(   l        r.   r&   r    r(   r   znot implemented)r  rr  rj  r   rm  r  r   r  r  r  r  )r|   r  r  rr   r  r  r  rewindr2   r2   r6   r    s&   


zAppendingTiffWriter._fixOffsetsisShortisLongc                 C  s$   |rd}n|r
d}nd}|  ||S )Nr&   r(   r   )r  )r|   r  r  r  r  r2   r2   r6   
fixOffsets  s   zAppendingTiffWriter.fixOffsetsN)F)rc  r  r  rY   rX   r   r  )rX   rb  )r}   r   rX   r   r   )r  rd   rz  rd   rX   rd   )r|  r{   rX   r   )r   r   rX   rd   )r  rd   rX   r{   )r  rd   rX   rd   )r  r   r  rd   rX   r   rK   )r   rd   r  rd   r  rd   rX   r   )r   rd   rX   r   )r   rd   r  rd   rX   r   )r  rd   r  rd   rX   r   )FF)r  rd   r  rY   r  rY   rX   r   )$r   r   r   r  r  r   rg  rv  rw  rx  ry  r  rQ  r  r  rp  rn  ro  r  r  rr  r  r  staticmethodr  r  r  r  r  rs  r  r  r  rt  r  r  r2   r2   r2   r6   rb    sD    	























)rb  c           	   	   C  s   t | jdg }t| ds|st| ||S |  }z\t|@}| g| D ]2}t|ds/i |_t|ds7d|_t|dd}t	|D ]}|
| |  t||| |  qAq%W d    n1 sbw   Y  W | 
| d S W | 
| d S | 
| w )Nappend_imagesr  r;  r<  r2   r   )r  r;  r  r   rY  r  rb  r<  r   r  r  r  rw  )	r  rw  r  r  Zcur_idxtfZimsZnfrr   r2   r2   r6   	_save_all 	  s.   




r  z.tifz.tiffz
image/tiff)rV   rW   rX   rY   )ra   rb   rc   rd   rX   re   )ra   rh   rc   rd   rm   rd   rX   re   )rz   r{   rX   r	   )r   rd   r   rd   rX   r   )r   rd   rX   r   )r   r   rX   r   )r  r2  rw  rx  r  r3  rX   r   )
__future__r   rQ  rV  loggingr  r  r   r6  collections.abcr   r   	fractionsr   numbersr   r   typingr   r	   r
   r   r    r   r   r   r   r   r   _binaryr   r  r   r  r   Z
_deprecater   Z_typingr   Z_utilr   r   r   r   r   r   	getLoggerr   r  r  r=  rJ  r   r   rS  r  r  r  r  r  r  rA  r  r  r   rK  r  r  r
  r  rT  rB  rC  rD  Z	PREDICTORr%  r!  r"  r  rO  rU  r  r  Z
JPEGTABLESr  rM  rE  r?  r@  r$  r>  r  rP  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r  rL  r  rw   r  r]   r   r  r_   rl   ry   r   r   r   rh   rW   rY   r   r   r   r   rd   Z
_IFDv2Baser   r   r   r   rZ  r  ZImageFileDirectoryr  r:  rY  BytesIOrb  r  Zregister_openr/  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer2   r2   r2   r6   <module>   sb  ( 
	
	
 !"#$%&'()*+,-./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jklmnopqrstuxyz{~	
	     \    	

  8  .