o
    ŝi
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 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#m$Z$ ddlm%Z% dZ&e&rd dl	m'Z' d dlm(Z( ddl)m*Z*m+Z+m,Z, e-e.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(ZHd)ZId*ZJd+ZKd,ZLd-ZMd.ZNd/ZOd0ZPd1ZQd2ZRd3ZSd4ZTd5ZUd6ZVd7ZWd8ZXd9ZYd:ZZd;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^_ D Z`i e3d daddadbfdce4d daddadbfdce3d dad?dadbfdde4d dad?dadbfdde3ddaddadbfdee4ddaddadbfdee3ddad?dadbfdfe4ddad?dadbfdfe3d daddgdbfdhe4d daddgdbfdhe3d dad?dgdbfdie4d dad?dgdbfdie3ddaddgdbfdje4ddaddgdbfdje3ddad?dgdbfdke4ddad?dgdbfdke3d daddldbfdmi e4d daddldbfdme3d dad?dldbfdne4d dad?dldbfdne3ddaddldbfdoe4ddaddldbfdoe3ddad?dldbfdpe4ddad?dldbfdpe3d daddqdbfdre4d daddqdbfdre3d dad?dqdbfdse4d dad?dqdbfdse3ddaddqdbfdte4ddaddqdbfdte3ddgddqdbfdte4ddgddqdbfdte3ddad?dqdbfdue4ddad?dqdbfdui e3ddaddvdbfdwe3d daddxdbfdye3ddaddxdbfdye4ddaddxdbfdze3ddad?dxdbfd{e3ddgddxdbfd|e4ddgddxdbfd}e3d d~dddbfde4d d~dddbfde3ddadddbfde3ddgdddbfde4ddgdddbfde3dd~dddbfde4dd~dddbfde3ddadddgfde4ddadddgfde3d?dadddbfdi e4d?dadddbfde3d?dad?ddbfde4d?dad?ddbfde3d?dadddbfde4d?dadddbfde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfde3d?dadddafde4d?dadddafde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfdi e3d?dadddgfde4d?dadddgfde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfde3d?dadddfde4d?dadddfde3d?dadddbfde4d?dadddbfde3d?dadddbfde4d?dadddbfde3d?dadddfde4d?dadddfde3d?dadddafde4d?dadddafde3d?dadddgfdi e4d?dadddgfde3dAdaddadbfde4dAdaddadbfde3dAdad?dadbfde4dAdad?dadbfde3dAdaddgdbfde4dAdaddgdbfde3dAdad?dgdbfde4dAdad?dgdbfde3dAdaddldbfde4dAdaddldbfde3dAdad?dldbfde4dAdad?dldbfde3dAdaddqdbfde4dAdaddqdbfde3dAdadddfde4dAdadddfdi e3dAdadddgfde4dAdadddgfde3dAdad?dqdbfde4dAdad?dqdbfde3dEdadddbfde4dEdadddbfde3dEdadddfde4dEdadddfde3dEdadddfde4dEdadddfde3dEdadddbfde4dEdadddbfde3dGdaddqdbfdte4dGdaddqdbfdte3dGdadddbfde4dGdadddbfde3dKdadddbfde4dKdadddbfdiZaebdd eaD Zcg dZdd
ddZedddǄZfddd˄Zgi Zhi ZidddЄZjG ddȄ deZke
delemgef ZndddׄZodddڄZpddd߄Zqe&reeref ZsneZsG dd҄ desZtehet_heiet_ie%_ D ]#\ZuZvevwddZvexetdev eheu d  exetdev eieu  q[h[i[u[vG dd detZyeyZzG dd dejZ{i dde3dddadfdde3dddqdfdde3dddd?fdde3dAddqdfdde3dAddd?fdde3dd?ddfdde3dddxdfdde3dddxdfdde3ddAddfdde3d?dddfdde3d?ddd fdde3d?ddd?fdde3dEdddfdde3dGdddfdde3dKdddfdde4dddxdfZ|dddZ}G dd dej~ZdddZee{je{ee ee{je} ee{je ee{jddg ee{jd	 dS (      )annotationsN)CallableMutableMapping)Fraction)NumberRational)IOAnycast   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8)DeferredErroris_pathTYPESF)Iterator)NoReturn)BufferIntegralLikeStrOrBytesPath   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   
tiff_ccitt   group3   group4   tiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflatei  tiff_raw_16i  packbitsi)  tiff_thunderscani  tiff_deflateit  tiff_sgilogiu  tiff_sgilog24im  lzmaiP  zstdiQ  webpc                 C  s   i | ]\}}||qS  r<   ).0kvr<   r<   O/var/www/html/ocr-read/venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    rA   r   r<   )1z1;I)rC   z1;IR)rC   rC   )rC   z1;R)r%   )LzL;2I)rD   zL;2IR)rD   zL;2)rD   zL;2R)r)   )rD   zL;4I)rD   zL;4IR)rD   zL;4)rD   zL;4R)r1   )rD   zL;I)rD   zL;IR)rD   rD   )rD   zL;R)   )I;16zI;12)   )rF   rF   )I;16BrH   )rF   zI;16R)IzI;16S)rI   zI;16BS)r'   )    )FF;32F)rK   zF;32BF)rI   zI;32N)rI   I;32S)rI   zI;32BS)r1   r1   )LArN   )r1   r1   r1   )RGBrO   )rO   zRGB;R)r1   r1   r1   r1   )RGBArP   r   )rO   RGBX)r1   r1   r1   r1   r1   r   r   )rO   RGBXX)r1   r1   r1   r1   r1   r1   )r   r   r   )rO   RGBXXX)rP   RGBa)r   r   )rP   RGBaX)r   r   r   )rP   RGBaXX)r%   r   )rP   RGBAX)r%   r   r   )rP   RGBAXX)i  )rG   rG   rG   )rO   zRGB;16L)rO   zRGB;16B)rG   rG   rG   rG   )rP   zRGBA;16L)rP   zRGBA;16B)rO   zRGBX;16L)rO   zRGBX;16B)rP   zRGBa;16L)rP   zRGBa;16B)PzP;1)r[   zP;1R)r[   zP;2)r[   zP;2R)r[   zP;4)r[   zP;4R)r[   r[   )r[   PX)PAr]   )r[   zP;R)CMYKr^   )r^   CMYKX)r^   CMYKXX)r^   zCMYK;16L)r^   zCMYK;16B)LABra   c                 c  s    | ]	}t |d  V  qdS )r)   N)len)r=   key_tpr<   r<   r@   	<genexpr>      rd   )s   MM *s   II* s   MM* s   II *s   MM +s   II+ prefixbytesreturnboolc                 C  s   |  ttS N)
startswithtuplePREFIXESrf   r<   r<   r@   _accept"     ro   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)rq   rs   invn_dr<   r<   r@   _limit_rational&  s   r|   rx   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 rj   floatr=   ir<   r<   r@   rd   4      z)_limit_signed_rational.<locals>.<genexpr>c                 s  r~   rj   r   r   r<   r<   r@   rd   7  r   r   r   )r   	numeratordenominatorminr|   rw   rl   max)rq   rs   r}   fracr{   	n_d_floatr<   r<   r@   _limit_signed_rational.  s   r   opstrr	   c                   s   d	 fdd}|S )
Nselfrx   argstuple[float, ...]rh   bool | float | Fractionc                   s   t | j | S rj   )getattr_valr   r   r   r<   r@   delegateF  s   z_delegate.<locals>.delegate)r   rx   r   r   rh   r   r<   )r   r   r<   r   r@   	_delegateE  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 )Jrx   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   valuerr   r   rt   rh   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   )
isinstancerx   r   r   r   r   r   r   TYPE_CHECKINGr
   r   r   rt   )r   r   r   r<   r<   r@   __init__\  s(   


zIFDRational.__init__r   c                 C     | j S rj   )r   r   r<   r<   r@   r   ~     zIFDRational.numeratorc                 C  r   rj   )r   r   r<   r<   r@   r     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   )r   r   r   r   r   limit_denominator)r   r   fr<   r<   r@   ry     s
   
zIFDRational.limit_rationalr   c                 C  s   t t| jS rj   )r   r   r   r   r<   r<   r@   __repr__  rp   zIFDRational.__repr__c                 C  s
   | j  S rj   )r   __hash__r   r<   r<   r@   r        
zIFDRational.__hash__otherobjectri   c                 C  s0   | j }t|tr|j }t|trt|}||kS rj   )r   r   rx   r   )r   r   rq   r<   r<   r@   __eq__  s   

zIFDRational.__eq__%list[float | Fraction | IntegralLike]c                 C  s   | j | j| jgS rj   )r   r   r   r   r<   r<   r@   __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   )rx   r   r   r   r   r   r   r
   r   r   rt   r   )r   r   r   r   r   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__NrB   )r   rr   r   rt   rh   r   )rh   r   rh   rt   )r   rt   rh   r   rh   r   )r   r   rh   ri   )rh   r   )r   r   rh   r   )-__name__
__module____qualname____doc__	__slots__r   propertyr   r   ry   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   r<   r<   r<   r@   rx   N  s\    "






ImageFileDirectory_v2idxsize$Callable[[_LoaderFunc], _LoaderFunc]c                   s   d fdd}|S )Nfunc_LoaderFuncrh   c                   sB   ddl m} | jdr| jdd  dd| < | ft < | S )Nr   r   load_r+   _ )r   r   r   rk   replace_load_dispatch)r   r   r   r   r<   r@   	decorator  s
   z#_register_loader.<locals>.decorator)r   r   rh   r   r<   )r   r   r   r<   r   r@   _register_loader  s   r   2Callable[[Callable[..., Any]], Callable[..., Any]]c                   s   d fdd}|S )Nr   Callable[..., Any]rh   c                   s   | t  < | S rj   )_write_dispatch)r   r   r<   r@   r     s   z#_register_writer.<locals>.decorator)r   r   rh   r   r<   )r   r   r<   r   r@   _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   datarg   
legacy_apiri   rh   tuple[Any, ...]c                   s   |  t|    |S rj   )_unpackrb   r   r   r   fmtr   r<   r@   basic_handler  s   z&_register_basic.<locals>.basic_handlerc                   s   d  fdd|D S )N    c                 3  s    | ]	}  |V  qd S rj   )_packr=   r   )r   r   r<   r@   rd     re   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinr   values)r   r   r@   <lambda>  s   z!_register_basic.<locals>.<lambda>T)r   r   r   rg   r   ri   rh   r   )r   r   structcalcsizer   r   )r   r   r   namer   r<   r   r@   _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ifhrg   rf   bytes | Nonegroup
int | Nonerh   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+   Qr1   r   rD   r)   F)ro   reprSyntaxError_prefixMM_endianII_bigtiffr  tagtyperesetr   next_legacy_api)r   r  rf   r  msgr<   r<   r@   r   G  s(   


zImageFileDirectory_v2.__init__c                 C  r   rj   )r  r   r<   r<   r@   r   n      zImageFileDirectory_v2.<lambda>c                 C  r   rj   )_offsetr   r<   r<   r@   r   o  r  ri   c                 C  r   rj   )r  r   r<   r<   r@   r   q  r   z ImageFileDirectory_v2.legacy_apir   r   c                 C  s   d}t |)Nz"Not allowing setting of legacy api)	Exception)r   r   r  r<   r<   r@   r   u  s   c                 C  s(   i | _ i | _i | _i | _d | _d | _d S rj   )_tags_v1_tags_v2_tagdatar  _nextr  r   r<   r<   r@   r  z  s   
zImageFileDirectory_v2.resetr   c                 C  s   t t| S rj   )r   dictr   r<   r<   r@   __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 r<   )r   lookupr  r   )r=   coder   r   r<   r@   rA     s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsr   r<   r   r@   named  s   
zImageFileDirectory_v2.namedrt   c                 C     t t| jt| jB S rj   )rb   setr  r  r   r<   r<   r@   __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 rj   )r  r  r  r   r   r   rl   rg   )r   r)  r   typr   handlerrq   r<   r<   r@   __getitem__  s   



z!ImageFileDirectory_v2.__getitem__r   c                 C     || j v p	|| jv S rj   )r  r  r   r)  r<   r<   r@   __contains__     z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S rj   )_setitemr   )r   r)  r   r<   r<   r@   __setitem__  r0  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 rj   )r   rx   r=   r?   r<   r<   r@   rd         z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>r   c                 s  r3  rj   )r   rt   r4  r<   r<   r@   rd     r5  Tr   Fi i   c                 s  r3  rj   )r   r   r4  r<   r<   r@   rd     r5  c                 s  r3  rj   )r   r   r4  r<   r<   r@   rd     r5  c                 s  r3  rj   )r   rg   r4  r<   r<   r@   rd     r5  c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )r   r   encoder4  r<   r<   r@   
<listcomp>  s    z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r<   )r   rt   r   r4  r<   r<   r@   r8    s   " c                 3  s(    | ]}t |tr |n|V  qd S rj   )r   r   cvt_enumr   infor<   r@   rd     s
    
r   zMetadata Warning, tag z had too many entries: z, expected 1)r   rg   r   r   r!  r  r   r  type	UNDEFINEDallrx   SIGNED_RATIONALRATIONALrt   SHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr  rl   r  r  lengthrb   
ValueErrorwarningswarn)r   r)  r   r   	basetypesr   r?   shortsigned_shortlongis_ifddestr<   r:  r@   r1    s   

 zImageFileDirectory_v2._setitemc                 C  s.   | j |d  | j|d  | j|d  d S rj   )r  popr  r  r.  r<   r<   r@   __delitem__  s   z!ImageFileDirectory_v2.__delitem__Iterator[int]c                 C  r%  rj   )iterr&  r  r  r   r<   r<   r@   __iter__  r(  zImageFileDirectory_v2.__iter__r   r   r   c                 C  s   t | j| |S rj   )r   unpackr  )r   r   r   r<   r<   r@   r   
     zImageFileDirectory_v2._unpackr   c                 G  s   t j| j| g|R  S rj   )r   packr  )r   r   r   r<   r<   r@   r     r(  zImageFileDirectory_v2._packHrM  rD   rO  bzsigned bytehzsigned shortlzsigned longr   r   ddoubler	  long8r   Tc                 C     |S rj   r<   r   r<   r<   r@   	load_byte!     zImageFileDirectory_v2.load_bytebytes | int | IFDRationalc                 C  s*   t |tr	t|}t |trt|f}|S rj   )r   rx   rt   rg   r   r   r<   r<   r@   
write_byte%  s
   


z ImageFileDirectory_v2.write_byter%   c                 C  s"   | dr|d d }|ddS )N    rv   zlatin-1r   )endswithdecoder   r<   r<   r@   load_string-  s   
z!ImageFileDirectory_v2.load_stringstr | bytes | intc                 C  s0   t |tr	t|}t |ts|dd}|d S )Nr6  r   rg  )r   rt   r   rg   r7  r   r   r<   r<   r@   write_string3  s
   

z"ImageFileDirectory_v2.write_stringr+   r1   )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)   rD   art   r[  rh   tuple[int, int] | IFDRationalc                       r| |fS t | |S rj   rx   rp  r[  r   r<   r@   combineB     z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3      | ]
\}} ||V  qd S rj   r<   r=   numdenomrv  r<   r@   rd   E      z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r%   r   rp  rt   r[  rt   rh   rq  r   rb   rl   zipr   r   r   valsr<   rv  r   r@   load_rational<     0z#ImageFileDirectory_v2.load_rationalrx   c                      d  fdd|D S )Nr   c                 3  s(    | ]} j d gt|dR  V  qdS )2Ll    N)r   r|   r=   r   r   r<   r@   rd   I  s    
z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r<   r   r@   write_rationalG  s   z$ImageFileDirectory_v2.write_rationalr/   c                 C  ra  rj   r<   r   r<   r<   r@   load_undefinedM  rc  z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tr	t|}t |trt|dd}|S )Nr6  r   )r   rx   rt   r   r7  rl  r<   r<   r@   write_undefinedQ  s
   

z%ImageFileDirectory_v2.write_undefined
   c                   ro  )Nr)   r]  rp  rt   r[  rh   rq  c                   rr  rj   rs  rt  ru  r<   r@   rv  _  rw  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  rx  rj   r<   ry  r|  r<   r@   rd   b  r}  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r%   r   r~  r  r  r<   r  r@   load_signed_rationalY  r  z*ImageFileDirectory_v2.load_signed_rationalc                   r  )Nr   c                 3  s*    | ]} j d gt|ddR  V  qdS )2lii   N)r   r   r  r   r<   r@   rd   f  s
    
z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r<   r   r@   write_signed_rationald  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. )readrb   OSError)r   r  r   retr  r<   r<   r@   _ensure_readk  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	  r1   rZ  r%   r   HHQ8s   HHL4srE   unknownztag:  (
) - type: )z%s - unsupported type %sr)   rD   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r  z. Skipping tag z
 - value: rJ   <table:  bytes>)r  tellr  r  r   r  ranger   r!  r  r   r   getr   KeyErrorloggerdebugseekr   
_safe_readrb   rJ  rK  r  r  r
  r  r  r   )r   r  	tag_countr   r)  r*  countr   tagnametypnamer  	unit_sizer+  r   hereoffsetr<   r<   r@   loadu  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 )
NrZ  r  *   HHr1   r   r	  rG   rD   )r  r   r  r   r  r<   r<   r@   _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	  rZ  rD   r1   r)   r  rE   zTag %s, Type: %s, Value: %s)r  ifdr  zsave: r  r  z) - value: rG   r  r  r   rg  r   r%   c                   s   g | ]}|  qS r<   r<   )r=   rq   r  r<   r@   r8        z1ImageFileDirectory_v2.tobytes.<locals>.<listcomp>r   z%s %s %s %s %sr  r  )"r   r  rb   r  sortedr#  STRIPOFFSETSr  r  r  r
  r   rC  r   r  r   r  tobytesrl   r   r!  r  r   r   r  r   rG  rF  r=  appendljustr   r   r   )r   r  resultentriesr   fmt_sizestripoffsetsr)  r   r*  rP  r  r   ifd_tag	ifd_valuer   r  r  r  r  r   r+  r<   r  r@   r    sp   "


(



zImageFileDirectory_v2.tobytesc                 C  sB   |  dkr||   |  }| |}|| |t| S r   )r  writer  r  rb   )r   r  r  r  r<   r<   r@   save  s   

zImageFileDirectory_v2.save)r  NN)r  rg   rf   r  r  r  rh   r   )rh   ri   )r   ri   rh   r   rh   r   r   )rh   r   r   r)  rt   rh   r	   r)  r   rh   ri   r)  rt   r   r	   rh   r   )r)  rt   r   r	   r   ri   rh   r   )r)  rt   rh   r   rh   rT  )r   r   r   rg   rh   r   )r   r   r   r	   rh   rg   r   )r   rg   r   ri   rh   rg   )r   rd  rh   rg   )r   rg   r   ri   rh   r   )r   rk  rh   rg   )r   rg   r   ri   rh   rn  )r   rx   rh   rg   )r   rd  rh   rg   )r  r  r   rt   rh   rg   )r  r  rh   r   )rh   rg   rQ   )r  rt   rh   rg   )r  r  rh   rt   )7r   r   r   r   r   __annotations__r   r   r   rf   r  r   setterr  r  r$  r'  r,  r/  r2  r1  rS  rV  r   r   listmapr   r   rA  rC  SIGNED_BYTErB  rD  FLOATrE  IFDLONG8r   rb  r   rf  rj  rm  r  r  r  r  r  r  r  r  r  r  r  r<   r<   r<   r@   r     s   
 <'








^

















CPr   r   r   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	   kwargsrh   r   c                   s   t  j|i | d| _d S )NT)superr   r  )r   r   r  	__class__r<   r@   r   7  s   
zImageFileDirectory_v1.__init__c                 C  r   rj   )r  r   r<   r<   r@   r   ;  r  zImageFileDirectory_v1.<lambda>c                 C  r   rj   )r  r   r<   r<   r@   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`

        rn   )rf   r  r  r  )clsr  r  r<   r<   r@   from_v2B  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`

        rn   )r   rf   r  r  r  r  )r   r  r<   r<   r@   to_v2T  s
   zImageFileDirectory_v1.to_v2r)  r   ri   c                 C  r-  rj   )r  r  r.  r<   r<   r@   r/  e  r0  z"ImageFileDirectory_v1.__contains__rt   c                 C  r%  rj   )rb   r&  r  r  r   r<   r<   r@   r'  h  r(  zImageFileDirectory_v1.__len__rT  c                 C  r%  rj   )rU  r&  r  r  r   r<   r<   r@   rV  k  r(  zImageFileDirectory_v1.__iter__r   c                 C  s   dD ]	}|  ||| qd S N)FT)r1  )r   r)  r   r   r<   r<   r@   r2  n  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   r1  r   rl   rg   )r   r)  r   r*  r   r+  legacyrq   r<   r<   r@   r,  r  s   



z!ImageFileDirectory_v1.__getitem__)r   r	   r  r	   rh   r   )r  r   rh   r  )rh   r   r  r   r  r  r  )r   r   r   r   r   r   tagstagdatar  classmethodr  r  r/  r'  rV  r2  r,  __classcell__r<   r<   r  r@   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 ).TiffImageFileTIFFz
Adobe TIFFFNr  StrOrBytesPath | IO[bytes]filenamestr | bytes | Nonerh   r   c                   s   |  	 |  	 t  || d S rj   )r  r   )r   r  r  r  r<   r@   r     s
   zTiffImageFile.__init__c                 C  s   | j dusJ | 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 fileNr1   r%   r  rv   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )r  r  r   tag_v2r  _TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesr  r  r
  _seekr  r<   r<   r@   _open  s   

zTiffImageFile._openrt   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  rb   r  r  )r   current_n_framescurrentr<   r<   r@   n_frames  s   


zTiffImageFile.n_framesframec                 C  sV   |  |sdS | | | jdur'| jj| jks"| jj| jks"| jr)d| _dS dS dS )z%Select a given frame as current imageN)_seek_checkr  _imimr   
_tile_sizemodereadonly)r   r  r<   r<   r@   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 }t |trt|dkr|d }|| 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   xmp)r   r  r   exr  rb   r  r  EOFErrorr  r  r  r  rI  r  r  r  r  r  r  is_animatedXMPrl   r;  _reload_exifr  r  r)  r  _setup)r   r  r  r  r<   r<   r@   r    sV   






zTiffImageFile._seekc                 C  r   )zReturn the current frame number)r  r   r<   r<   r@   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%   r  r   N)
r  r  r   BaseImageResourcesrk   i16mathceili32)r   blocksrq   idnr   r   r<   r<   r@   get_photoshop_blocks  s   
"
z"TiffImageFile.get_photoshop_blocksImage.core.PixelAccess | Nonec                   s   | j r
| jr
|  S t  S rj   )tileuse_load_libtiff_load_libtiffr  r  r   r  r<   r@   r    s   
zTiffImageFile.loadc                 C  s:   | j d u rt| j tj| j| j| _tj	|  d S rj   )
r  r   _decompression_bomb_checkr  corenewr  r  r   load_preparer   r<   r<   r@   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)in_place)r  !_close_exclusive_fp_after_loadinggetexifr   TAGS_V2_GROUPSget_ifdr   exif_transposer   r  Orientationr  )r   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 }| jd d }| jdus,J zt| jdo7| j }t| jdrC| j	  W n tyO   d}Y nw |ret
|tsYJ 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 rd|
 }t|t j | S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r'   NfilenoflushFr%   libtiffzCouldn't set the imagegetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just readingzdecoder error )"r   r  r  rb   r  r  r  r   r  r  r   rl   r  _getdecoderr  decoderconfigsetimager  rI  _exclusive_fpr  r  r  ri  r   r  oslseekSEEK_CURSEEK_SETr  r  r  close)r   r  extentsr   r  	args_listdecodereclose_self_fpr	  errposr<   r<   r@   r  0  sj   








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/   r1   z
- size: %srB   r<   )r%   r-   r1   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$   r0   rO   rF   I;16N)z;16Bz;16Lrv   NFr  zInvalid tile dimensionsr1   z- unsupported data organizationicc_profiler[   r]   c                 S  s   g | ]}t |d  qS r!   r   )r=   r[  r<   r<   r@   r8    s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   )@r  r  COMPRESSION_INFOr  COMPRESSION_compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr  r  YCBCRSUBSAMPLING
IMAGEWIDTHIMAGELENGTHr  	TypeErrorr   rt   rI  r  r   r  r  _sizer   SAMPLEFORMATrb   r   r   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr  rf   	OPEN_INFO_moder  r;  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  rh  r  r  r   _Tiler  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r$   r   palette) r   r  photo	fillorderxsizeysizer-  orientationsample_format	bps_tupleextra_tuple	bps_countbps_actual_countsamples_per_pixelr  rawmodexresyresresunitxylayerrp  offsetsr\  w	tilewidthr  stridetile_rawmoder   rZ  r<   r<   r@   r    s<  






,









"

 


zTiffImageFile._setuprj   )r  r  r  r  rh   r   r  r   )r  rt   rh   r   )rh   r   )rh   r  )r   r   r   formatformat_descriptionr  r   r  r   r  r  r  r  r
  r  r  r  r  r  r  r<   r<   r  r@   r    s$    



1



ar  rC   rD   rN   r[   r]   rI   rM   rF   I;16LrK   rL   rO   rR   rP   r^   YCbCrra   rH   r  Image.Imager  r  r  str | bytesc           6      C  s|	  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 ]z\}}.|tj^vr|tjv rtj_|,|< n5||jv r|j| |,|< n't
|.tt`tatfst
|.tFrtbd8d9 |.D rtc|jd}/|/r|/|,|< ||-vr||)vrt
|.tar|.ed:d;d< |-|< qt
|.tfrt`|.|-|< q|.|-|< qt#|-v r+t4|-t# dkr+|-t# d |-t#< td=tT|-L  | jd>v r=d?}t|-L }0|0g  |||+||0|,f}1th| jd@|1|}2|2i| j>dA| j  	 |2etjjkdd  \}3}4|+sw|l|4 |3r{nqc|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 TIFFrn   big_tiffTr1  r$   r.   r0   r6   r2   r   r   tiffinfor  zTiffinfo Keys: %sr)  r  r6  descriptionr3  x_resolutiony_resolutionresolution_unitsoftware	date_timeartist	copyrightr2  r%   rB   )rC   rD   rC   r    r7  rO   r9  r'   c                 S  s   g | ]}|d  qS r8  r<   r4  r<   r<   r@   r8  8  r  z_save.<locals>.<listcomp>r!   r/   r1   
strip_sizer   ru  )r   r   )r   r       r    r  r    qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  c                 s  s     | ]}t |tttfV  qd S rj   )r   rt   r   rx   r4  r<   r<   r@   rd     s    z_save.<locals>.<genexpr>r6  r   rg  zConverted items: %s)rF   rH   rt  r4  r  rS   zencoder error z when writing image file_debug_multipage)q	SAVE_INFOr  r  r  encoderinfoencoderconfigr   r  r  r;  r   rt   WRITE_LIBTIFFr=  r   rB  rC  rg   r   Exifr  r  r  r  r  r  r   r  r  r  r  r   r)  r   EXIFIFDrF  rP  rN  rO  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r  rG  r=  rX  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTrG  rb   rI  rH  r?  copyr  heightwidthr   invertr  
getpaletterY  rT  
STRIP_SIZEr   rC  STRIPBYTECOUNTSrl   r  COMPRESSION_INFO_REVr;  rA  REFERENCEBLACKWHITEr#  
setdefaultrU  rV  rS  TILEBYTECOUNTSrI  JPEGQUALITYr  r  r  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFD	itertoolschainLIBTIFF_COREr  r   r   r>  r!  r<  r7  rx   sort_getencoderr#  r   MAXBLOCKr  r  _saverR  setattr)6r  r  r  rf  rf   r[  rr  bitsextrar-  r  r  r  r  r1  r  r;  r  r  
legacy_ifdsupplied_tagsr)  iccr   r2  inverted_impxrk  rj  lutcolormapcolorsr   rn  r\  rp  im_strip_sizerows_per_stripstrip_byte_countsstrips_per_imagedefault_value	blocklistr  r  typesattsr   r<  r  rp  encodererrcoder   r  r<   r<   r@   r    s  



















&
&






 








r  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)   r1   r   r   r%   r)   r1   r)   r1   r)   r%   r)   r1   >       	     r"   r#   Ffnr  r  ri   rh   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   rg   r  	beginningsetup)r   r  r  r<   r<   r@   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  r  r%  r(  whereToWriteNewIFDOffsetoffsetOfNewPager  IIMMr  isFirstrm   RuntimeError	setEndianrk   r  r'  skipIFDsgoToEnd)r   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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 pager1   )r  r   r  r  r  r  r  r  r%  r'  _readr  _writefixIFD)r   r  r  
ifd_offsetr<   r<   r@   finalize  s$   

zAppendingTiffWriter.finalizec                 C  s   |    |   d S rj   )r  r  r   r<   r<   r@   newFrame5  s   zAppendingTiffWriter.newFramec                 C  s   | S rj   r<   r   r<   r<   r@   	__enter__:  s   zAppendingTiffWriter.__enter__r   r   c                 G  s   | j r	|   d S d S rj   )r  r)  r   r<   r<   r@   __exit__=  s   zAppendingTiffWriter.__exit__rt   c                 C  s   | j  | j S rj   )r   r  r  r   r<   r<   r@   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(  r  r   r  r  )r   r  r  r<   r<   r@   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   rG   )r   r  r%  SEEK_ENDr  r  rg   r  )r   r0  	pad_bytesr<   r<   r@   r  Q  s   
zAppendingTiffWriter.goToEndendianr   c                 C  sB   || _ | j  d| _| j  d| _| j  d| jrdnd | _d S )NrD   rZ  r  r	  )r  longFmtshortFmtr  	tagFormat)r   r  r<   r<   r@   r  [  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)NTr1   r)   r   r%   r  rE   )r  r  r   r  r  r  r%  r'  )r   r  num_tagsr<   r<   r@   r  a  s   zAppendingTiffWriter.skipIFDsr   r   c                C  s   | j |S rj   )r   r  re  r<   r<   r@   r  n  r  zAppendingTiffWriter.write
field_sizec                 C  s.   z	dddd| W S  t y   d}t|w )NrZ  rD   r	  )r%   r)   r1   zoffset is not supported)r  r  )r   r  r  r<   r<   r@   _fmtq  s   zAppendingTiffWriter._fmtc                 C  s&   t | j| | | j|\}|S rj   )r   rW  r  r  r   r  )r   r  r   r<   r<   r@   r  x  s   zAppendingTiffWriter._readc                 C  
   |  dS Nr%   r  r   r<   r<   r@   	readShort~  r   zAppendingTiffWriter.readShortc                 C  r  Nr)   r  r   r<   r<   r@   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 )r  )r  r  r  r<   r<   r@   _verify_bytes_written  s   z)AppendingTiffWriter._verify_bytes_writtenr   r   new_field_sizec                 C  sJ   | j | tj |s|}| j t| j| | |}| 	|| d S rj   )
r   r  r%  r'  r  r   rY  r  r  r  )r   r   r  r  r  r<   r<   r@   _rewriteLast  s   z AppendingTiffWriter._rewriteLastc                 C  s   |  |dd d S )Nr%   r)   r  rl  r<   r<   r@   rewriteLastShortToLong  rX  z*AppendingTiffWriter.rewriteLastShortToLongc                 C     |  |dS r  r  rl  r<   r<   r@   rewriteLastShort  r  z$AppendingTiffWriter.rewriteLastShortc                 C  r  r  r  rl  r<   r<   r@   rewriteLastLong  r  z#AppendingTiffWriter.rewriteLastLongc                 C  s0   | j t| j| | |}| || d S rj   )r   r  r   rY  r  r  r  )r   r   r  r  r<   r<   r@   r    s   zAppendingTiffWriter._writec                 C     |  |d d S r  r  rl  r<   r<   r@   
writeShort  r   zAppendingTiffWriter.writeShortc                 C  r  r  r  rl  r<   r<   r@   	writeLong  r   zAppendingTiffWriter.writeLongc                 C  s    |    | jr| j  d S d S rj   )r  r  r   r)  r   r<   r<   r@   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 )Nr1   r%   rE   r)   z;fixIFD: %s (%d) - type: %s (%d) - type size: %d - count: %dr  )r  r  r  r   rW  r  r   r  
fieldSizesr  r  Tagsr  r  r  r   r!  r   r   r  _fixOffsetsr  r%  r'  )r   r  r   r)  
field_typer  r  
total_sizer  is_localr  cur_posr<   r<   r@   r    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        r1   r%   r   r)   r   znot implemented)r  r  r  r  r  r  r   r  r%  r'  r  )r   r  r  r   r  r  r  rewindr<   r<   r@   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  r<   r<   r@   
fixOffsets  s   zAppendingTiffWriter.fixOffsetsN)F)r  r  r  ri   rh   r   r  )rh   r  )r   r   rh   r   r   )r  rt   r  rt   rh   rt   )r  r   rh   r   )r   r   rh   rt   )r  rt   rh   r   )r  rt   rh   rt   )r  r  r  rt   rh   r   rQ   )r   rt   r  rt   r  rt   rh   r   )r   rt   rh   r   )r   rt   r  rt   rh   r   )r  rt   r  rt   rh   r   )FF)r  rt   r  ri   r  ri   rh   r   )$r   r   r   r  r  r   r  r  r  r  r  r  r  r(  r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r  r  r  r  r  r)  r  r  r  r<   r<   r<   r@   r    sD    	























)r  c           
   	   C  s   t | jdg }t| ds|st| ||S |  }z\t|@}| g| D ]2}|| }t|ds4d|_t	|dd}t
|D ]}	||	 |  t||| |  q>||_q%W d    n1 sbw   Y  W | | d S W | | d S | | w )Nappend_imagesr  r  r<   r   )r  r  r  r   r  r  r  _attach_default_encoderinfor  r   r  r  r  r  )
r  r  r  r  cur_idxtfimsr  nfrr   r<   r<   r@   	_save_all 	  s,   




r  z.tifz.tiffz
image/tiff)rf   rg   rh   ri   )rq   rr   rs   rt   rh   ru   )rq   rx   rs   rt   r}   rt   rh   ru   )r   r   rh   r	   )r   rt   r   rt   rh   r   )r   rt   rh   r   )r   r   rh   r   )r  rv  r  r  r  rw  rh   r   )
__future__r   r  r  loggingr  r%  r   rJ  collections.abcr   r   	fractionsr   numbersr   r   typingr   r	   r
    r   r   r   r   r   r   _binaryr   r  r   r  r   _utilr   r   r   r   r   r   _typingr   r   r   	getLoggerr   r  rQ  r  r  r  r  r  rB  rC  rG  r;  r?  r@  r  r  rI  rT  r  rN  rO  r=  rP  r  r  r  r  	PREDICTORrY  rU  rV  rS  r  r  rH  rF  
JPEGTABLESrA  r  r  r  r  rX  r  r  r  IMAGEJ_META_DATA_BYTE_COUNTSIMAGEJ_META_DATAr:  r#  r  rL  r   rJ  rm   ro   r|   r   r   r   r   rx   rg   ri   r   r   r   r   rt   
_IFDv2Baser   r   r   r   r  r  ImageFileDirectoryr  r  r  BytesIOr  r  register_openrr  register_saveregister_save_allregister_extensionsregister_mimer<   r<   r<   r@   <module>   sX  ( 
	
	
 !"#$%&'()*+,-./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vyz{|
	     \    	
  6  .