o
    6dC5                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZ ddlmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ eeZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/d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/ZDd0ZEd1ZFd2ZGd3ZHd4ZId5ZJd6ZKd7ZLi dd8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXZMdYdZ eMN D ZOi e#d d[dd[d\fd]e$d d[dd[d\fd]e#d d[d9d[d\fd^e$d d[d9d[d\fd^e#dd[dd[d\fd_e$dd[dd[d\fd_e#dd[d9d[d\fd`e$dd[d9d[d\fd`e#d d[ddad\fdbe$d d[ddad\fdbe#d d[d9dad\fdce$d d[d9dad\fdce#dd[ddad\fdde$dd[ddad\fdde#dd[d9dad\fdee$dd[d9dad\fdee#d d[ddfd\fdgi e$d d[ddfd\fdge#d d[d9dfd\fdhe$d d[d9dfd\fdhe#dd[ddfd\fdie$dd[ddfd\fdie#dd[d9dfd\fdje$dd[d9dfd\fdje#d d[ddkd\fdle$d d[ddkd\fdle#d d[d9dkd\fdme$d d[d9dkd\fdme#dd[ddkd\fdne$dd[ddkd\fdne#ddaddkd\fdne$ddaddkd\fdne#dd[d9dkd\fdoe$dd[d9dkd\fdoi e#dd[ddpd\fdqe#d d[ddrd\fdse#dd[ddrd\fdse$dd[ddrd\fdte#dd[d9drd\fdue#ddaddrd\fdve$ddaddrd\fdwe#d dxddyd\fdze$d dxddyd\fd{e#dd[ddyd\fd|e#ddaddyd\fd}e$ddaddyd\fd~e#ddxddyd\fdze$ddxddyd\fd{e#dd[dddafde$dd[dddafde#d9d[ddd\fdi e$d9d[ddd\fde#d9d[d9dd\fde$d9d[d9dd\fde#d9d[ddd\fde$d9d[ddd\fde#d9d[dddfde$d9d[dddfde#d9d[dddfde$d9d[dddfde#d9d[dddfde$d9d[dddfde#d9d[ddd[fde$d9d[ddd[fde#d9d[dddfde$d9d[dddfde#d9d[dddfde$d9d[dddfdi e#d9d[dddafde$d9d[dddafde#d9d[dddfde$d9d[dddfde#d9d[dddfde$d9d[dddfde#d9d[dddfde$d9d[dddfde#d9d[ddd\fde$d9d[ddd\fde#d9d[ddd\fde$d9d[ddd\fde#d9d[dddfde$d9d[dddfde#d9d[ddd[fde$d9d[ddd[fde#d9d[dddafdi e$d9d[dddafde#d;d[dd[d\fde$d;d[dd[d\fde#d;d[d9d[d\fde$d;d[d9d[d\fde#d;d[ddad\fde$d;d[ddad\fde#d;d[d9dad\fde$d;d[d9dad\fde#d;d[ddfd\fde$d;d[ddfd\fde#d;d[d9dfd\fde$d;d[d9dfd\fde#d;d[ddkd\fde$d;d[ddkd\fde#d;d[dddafde$d;d[dddafde#d;d[d9dkd\fde$d;d[d9dkd\fde#d?d[ddd\fde$d?d[ddd\fde#d?d[dddfde$d?d[dddfde#d?d[dddfde$d?d[dddfde#d?d[ddd\fde#dAd[ddd\fde$dAd[ddd\fde#dEd[ddd\fde$dEd[ddd\fdiZPeQdd ePD ZRg dZSdd ZTdd ZUdd ZVi ZWi ZXG dd deZYG dd deZZeWeZ_WeXeZ_XeN D ]!\Z[Z\e\]ddZ\e^eZde\ eWe[ d  e^eZde\ eXe[  q:[W[X[[[\G ddÄ deZZ_e_Z`G ddń dejZai dde#ddd[dfdde#dddkdfdde#dddd9fdde#d;ddkdfdde#d;ddd9fdde#dd9dydfdde#dddrdfdde#dd9drdfdde#dd;dydfdde#d9dddfdde#d9ddd fdde#d9ddd9fdde#d?dddfdde#dAdddfdde#dEdddfdde$dd9dydfdde$dddrdfde$dd9drdfde$dd;dydfdۜZbdd݄ ZcG dd߄ d߃Zddd ZeefeajgeaeT eheajgec eieajgee ejeajgddg ekeajgd dS )    N)MutableMapping)Fraction)NumberRational   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8TYPESFT   s   IIs   MM   i  i  i  i  i
  i    i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  D  iE  iJ  iR  iS  i[  i  i  i  i  iI  is  ii  i  i  i  i  raw   Z
tiff_ccitt   Zgroup3   Zgroup4   Ztiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflatei  Ztiff_raw_16i  Zpackbitsi)  Ztiff_thunderscani  tiff_deflateit  Ztiff_sgilogiu  Ztiff_sgilog24im  lzmaiP  ZzstdiQ  Zwebpc                 C   s   i | ]\}}||qS  r$   ).0kvr$   r$   jC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\PIL/TiffImagePlugin.py
<dictcomp>   s    r)   r   r$   )1z1;I)r+   z1;IR)r+   r+   )r+   z1;R)r   )LzL;2I)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;16Br0   )r.   zI;16R)II;16S)r1   I;16BS)r   )    )FF;32F)r5   F;32BF)r1   zI;32N)r1   I;32S)r1   I;32BS)r    r    )LAr:   )r    r    r    )RGBr;   )r;   zRGB;R)r    r    r    r    )RGBAr<   r   )RGBXr>   )r    r    r    r    r    r   r   )r>   ZRGBXX)r    r    r    r    r    r    )r   r   r   )r>   ZRGBXXX)r<   ZRGBa)r   r   )r<   ZRGBaX)r   r   r   )r<   ZRGBaXX)r   r   )r<   ZRGBAX)r   r   r   )r<   ZRGBAXX)i  )r/   r/   r/   )r;   zRGB;16L)r;   zRGB;16B)r/   r/   r/   r/   )r<   zRGBA;16L)r<   zRGBA;16B)r>   zRGBX;16L)r>   zRGBX;16B)r<   zRGBa;16L)r<   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@   )PArA   )r@   zP;R)CMYKrB   )rB   ZCMYKX)rB   ZCMYKXX)rB   zCMYK;16L)r;   r>   )LABrC   c                 c   s    | ]	}t |d  V  qdS )r   N)len)r%   Zkey_tpr$   r$   r(   	<genexpr>      rE   )   MM *   II* s   MM* s   II *s   MM +s   II+ c                 C   s   | d d t v S Nr   )PREFIXESprefixr$   r$   r(   _accept     rM   c                 C   s<   t | dk}t|rd|  n| |}|r|d d d S |S )Nr   )absIFDRationallimit_rational)valmax_valinvn_dr$   r$   r(   _limit_rational  s   rW   c                 C   sP   t | }|j|jf}t||k rt| t|}t||kr&t | } t| |}|S N)r   	numeratordenominatorminrW   rP   max)rS   rT   Zmin_valfracrV   r$   r$   r(   _limit_signed_rational  s   
r^   c                   @   sX  e Zd ZdZ	 dZd4ddZedd Zedd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Z	 edZedZedZedZedZedZedZedZed Zed!Zed"Zed#Zed$Zed%Zed&Zed'Zed(Z ed)Z!ed*Z"ed+Z#ed,Z$ed-Z%ed.Z&ed/Z'ed0Z(ed1Z)e*e+d2red2Z,d3S d3S )5rQ   zImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

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

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rZ   rY   ra   limit_denominator)re   max_denominatorfr$   r$   r(   rR   a  s   
zIFDRational.limit_rationalc                 C   s   t t| jS rX   )strrd   ra   ri   r$   r$   r(   __repr__n  s   zIFDRational.__repr__c                 C   s
   | j  S rX   )ra   __hash__ri   r$   r$   r(   rp   q  s   
zIFDRational.__hash__c                 C   s0   | j }t|tr|j }t|trt|}||kS rX   )ra   rc   rQ   rd   )re   otherrS   r$   r$   r(   __eq__t  s   

zIFDRational.__eq__c                 C   s   | j | j| jgS rX   )ra   r_   r`   ri   r$   r$   r(   __getstate__|  rN   zIFDRational.__getstate__c                 C   s,   t | d |\}}}|| _|| _|| _d S )Nr   )rQ   rg   ra   r_   r`   )re   statera   r_   r`   r$   r$   r(   __setstate__  s
   

zIFDRational.__setstate__c                        fdd}|S )Nc                    s   t | j | S rX   )getattrra   )re   argsopr$   r(   delegate  rN   z'IFDRational._delegate.<locals>.delegater$   )rz   r{   r$   ry   r(   	_delegate  s   zIFDRational._delegate__add____radd____sub____rsub____mul____rmul____truediv____rtruediv____floordiv____rfloordiv____mod____rmod____pow____rpow____pos____neg____abs__	__trunc____lt____gt____le____ge____bool____ceil__	__floor__	__round____int__Nr*   )-__name__
__module____qualname____doc__	__slots__rg   propertyrY   rZ   rR   ro   rp   rr   rs   ru   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(   rQ   1  s\    



rQ   c                   @   s  e Zd ZdZd^ddZedd Zedd Zed	d Zej	d
d Zdd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fej$d8d9fg	 ed:d:d_d<d=Z%ed:d>d? Z&ed@d:d_dAdBZ'ed@dCdD Z(edEdFd_dGdHZ)edEdIdJ Z*edKd:d_dLdMZ+edKdNdO Z,edPdFd_dQdRZ-edPdSdT Z.dUdV Z/dWdX Z0d`dZd[Z1d\d] Z2dS )aImageFileDirectory_v2a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

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

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

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

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

    Data Structures:

        * ``self.tagtype = {}``

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

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

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

        * ``self._tagdata = {}``

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

        * ``self._tags_v1 = {}``

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

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

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

       II*     Nc                 C   s   t |sdt| d}t||dur|n|dd | _| jtkr&d| _n| jtkr/d| _nd}t||d dk| _|| _i | _		 | 
  | jrT| d	|d
d n	| d|dd \| _d| _dS )a  Initialize an ImageFileDirectory.

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

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

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

CMr   r  r  r  Zwrite_c                       s   e Zd ZU dZ fddZedd Zedd Zee	d< 	 e
dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Z  ZS )ImageFileDirectory_v1a  This class represents the **legacy** interface to a TIFF tag directory.

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

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

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

    Values are returned as a tuple.

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

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

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

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

        rK   )r   rL   r   r   r   r   )re   rc  r$   r$   r(   to_v2  s
   zImageFileDirectory_v1.to_v2c                 C   r   rX   )r   r   r   r$   r$   r(   r     r   z"ImageFileDirectory_v1.__contains__c                 C   r   rX   )rD   r   r   r   ri   r$   r$   r(   r     r   zImageFileDirectory_v1.__len__c                 C   r   rX   )r   r   r   r   ri   r$   r$   r(   r     r   zImageFileDirectory_v1.__iter__c                 C   s   dD ]	}|  ||| qd S N)FT)r   )re   r   rf   r   r$   r$   r(   r     s   z!ImageFileDirectory_v1.__setitem__c                 C   sn   || j vr&| j| }| j| }| j| \}}dD ]}| ||| ||| q| j | }t|ttfs5|f}|S r|  )r   r   r   r   r   rc   r   r   )re   r   r   r   r   r   legacyrS   r$   r$   r(   r     s   



z!ImageFileDirectory_v1.__getitem__)r   r   r   r   rg   r   tagsZtagdatar   __annotations__classmethodrz  r{  r   r   r   r   r   __classcell__r$   r$   rv  r(   rs    s   
 
rs  c                       s   e Zd ZdZdZdZd fdd	Zdd Zed	d
 Z	dd Z
dd Zdd Zdd Zdd Z fddZdd Zdd Zdd Z  ZS )TiffImageFileZTIFFz
Adobe TIFFFNc                    s"   d | _ 	 d | _	 t || d S rX   )tag_v2r   rt  rg   )re   rI  filenamerv  r$   r(   rg   /  s
   zTiffImageFile.__init__c                 C   s   | j d}|d dkr|| j d7 }t|| _d| _| jj | _| _d| _| j | _	g | _
d| _td td| j  tdt|  | d	 dS )
z#Open the first image in a TIFF filer    r   r   NrO   z*** TiffImageFile._open ***z- __first: z- ifh: r   )rI  rG  r   r  rc  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesrX  rY  r   _seek)re   r   r$   r$   r(   _open8  s   

zTiffImageFile._openc                 C   sX   | j d u r)|  }| t| j | j d u r$| |  d  | j d u s| | | j S )Nr   )r  rT  r  rD   r  rZ  )re   currentr$   r$   r(   n_framesS  s   



zTiffImageFile.n_framesc                 C   s<   |  |sdS | | t| j tj| j| j| _dS )z%Select a given frame as current imageN)	Z_seek_checkr  r   Z_decompression_bomb_checkr   corenewmodeim)re   framer$   r$   r(   rZ  ]  s
   

zTiffImageFile.seekc                 C   sT  | j | _| j  t| j|kr| jsd}t|td| d| j	 d| j d| j   | j
| j | j| j td| j   | j| j | jj| jv rYd| _n| jj| _| jdkrh|d | _t| jdkru| jdk| _|  j	d7  _	t| j|ks| j
| j|  | j| j |   t| j | _| _|| _	|   d S )	Nzno more images in TIFF filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %sr   r   )r  rI  rT  rD   r  r  EOFErrorrX  rY  r  rZ  rg  r  rb  r   r  is_animatedZ_reload_exifrs  rz  r   rc  _setup)re   r  r   r$   r$   r(   r  h  s@   



zTiffImageFile._seekc                 C   rh   )zReturn the current frame number)r  ri   r$   r$   r(   rT    rj   zTiffImageFile.tellc                 C   s   t | jv r| | jt  S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

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

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        Nr   s   8BIMr   r   r   rC  r   )	r  rV  r   BaseZImageResourcesi16mathceili32)re   blocksrS   idnr   r   r$   r$   r(   get_photoshop_blocks  s   "z"TiffImageFile.get_photoshop_blocksc                    s   | j r
| jr
|  S t  S rX   )tileuse_load_libtiff_load_libtiffrt  rb  ri   rv  r$   r(   rb    s   
zTiffImageFile.loadc                 C   s   | j r/tjjtjjtjjtjjtjjtjjtjj	d
| j }|d ur/| j|| _| jj| _| jsNd| _| j  |  }tjD ]}||vrHqA|| qAd S d S )N)r   r   r   r   r   r   r    T)_tile_orientationr   Z	TransposeZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90rV  r  Z	transposer   _sizer  !_close_exclusive_fp_after_loadingrI  rT  Zgetexifr   TAGS_V2_GROUPSget_ifd)re   methodexifkeyr$   r$   r(   load_end  s0   	


	zTiffImageFile.load_endc           
   
   C   s  t j |  |   t| jdksd}t|| jd d }t| jd d }zt| jdo2| j	 }t| jdr>| j
  W n tyJ   d}Y nw |rQ||d< t | jd	t|| j}z	|| j| W n tyy } zd
}t||d}~ww | jo| j }t| jdrtd || j \}}	n,|rtd |s| jd |d\}}	ntd | jd || j \}}	g | _d| _|   |r| j  d| _|	dk rt|	t j | S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r   filenoflushFr   libtiffzCouldn't set the imageNgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   rb  Zload_preparerD   r  rH  rp  r   rI  r  r  Z_getdecoderr  r   Zdecoderconfigsetimager  r   Z_exclusive_fpr  rX  rY  r%  r  rZ  rG  readonlyr  close)
re   r   Zextentsrx   rI  decodereZclose_self_fpr  errr$   r$   r(   r    s`   






zTiffImageFile._load_libtiffc              
   C   s   d| j v rd}t|t| j td | _| j td| _| j td}| jdkr+d}| j t	d}t
d t
d| j  t
d	|  t
d
| j  t
d|  t
d| jt  t| j t}t| j t}||f| _t
d| j  | j td}t|dkrt|t|  krdkrn nd}| j td}| j td}|dv rd}	n	|dkrd}	nd}	|	t|7 }	t|}
| j t| jdkr|dv rdnd}|tkrt
d| d}t|||
k r|d| }n||
kr|
dkr|| }t||krd}t|| j j|||||f}t
d|  z	t| \| _}W n t yF } 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'r1|dkr|dd d |dd  }t
d|  t| \| _}|d$krd%}d&|v r|(d&d'}d(|v r|(d(d'}|dkr| jd)kr| jdkrd*}|| jd+| j j)f}| j%*d,dd||fd|f nt+| j v s=t,| j v rt+| j v rU| j t+ }| j t-|}| jd }n| j t, }| j t.}| j t/}|D ]h}|| |krz|t0| d- }nd}|}| jdkr|| }||	 }|t|df}| j%*| j||t|| |t|| |f||f || }|| jd krd|| }}|| jd krd }}|d7 }qhnt
d. d}t|t1| j v r| j t1 | j!d/< | jd0v rd1d2 | j t2 D }t34d3d45|| _6| j t7j8j9| _:dS )5z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r   r   z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: z- size: r*   r$   )r   r   r    r   r   r   )r   r   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: z- unsupported formatzunknown pixel modez- raw mode: z- pil mode: compressionr   dpigRQ@
resolutionr   r.   I;16Nz;16Bz;16Nz;16Lr   r;   Fr  r    z- unsupported data organizationicc_profiler@   rA   c                 S   s   g | ]}t |d  qS r   r   )r%   r  r$   r$   r(   r     s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr  );r  rH  COMPRESSION_INFOrV  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERrX  rY  r   YCBCRSUBSAMPLINGr   
IMAGEWIDTHIMAGELENGTHr  r   SAMPLEFORMATrD   r\   r[   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   rL   	OPEN_INFOr  rW  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   ra  rg  re  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r   r  paletter   r  ZOrientationr  )re   r   photoZ	fillorderZxsizeZysizeZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr  rawmoder  ZxresZyresZresunitxylayerr-  offsetsr  wra  strideZtile_rawmoder  r$   r$   r(   r  )  s  



,












zTiffImageFile._setup)NN)r   r   r   formatformat_descriptionr  rg   r  r   r  rZ  r  rT  r  r  rb  r  r  r  r  r$   r$   rv  r(   r  *  s"    	
	&	Ur  r+   r,   r:   r@   rA   r1   r8   r.   r2   r5   r6   r;   r>   r<   rB   YCbCrrC   r9   r0   r3   r7   )r3   r7   c           2      C   s(	  zt | j \}}}}}}W n ty% }	 zd| j d}
t|
|	d }	~	ww t|d}| j}| j}z|d }W n tyM   | jd}t	|t
rKd }Y nw |d u rUd}n|dkr\d}n|dkrbd	}tpg|dk}d
|t< | jd |t< | jd
 |t< d|v r|d }nd|v r|d }t	|trt }|| |}ni }tdt|  t	|tr| }|D ]/}t	|tjr|tjv r||||< n||||< z
|j| |j|< W q ty   Y qw t| dr	tt t!t"t#t$fD ]}|| j%v r| j%| ||< | j%j| |j|< q|d| jd}|r||t&< t'dft dft!dft dft!dftdft(dft)dft*dft+dff
D ]\}}||v rI|| ||< q:|d}|rcd|t< |d |t < |d
 |t!< |dkry||t,< t-|d
kryt-||t.< |d ur||t/< |d
kr||t0< t1|vr||t1< nF| jdv r|t1 dkr| jdkr| 2 }| }t3|j4D ]}t3|j5D ]}|||f dkrdnd|||f< qq|} nt67| } | jd v r| j89d!d"}g }t-|d# }t3d#D ]}|d$d% ||| ||d
   D 7 }|dgd&|  7 }q||t:< t-|| jd |d  d' d(  }|rW|d)t;}|dkr9d
n	t<|| | jd
 } |dkrVt<| d' d( d( | jd
 } n| jd
 } | dkrcd
} |dkrjd
n||  }!| jd
 |  d
 |  }"| |t=< |!d*krtj>|jt?< |!f|"d
  || jd
  |!|"d
   f |t?< t@t3d|!|" |!|tA< tB|d
|tC< | jd+krtDd,tEd-iF D ]\}#}$|G|#|$ qtHtItJtKg}%|rhd.|v r|d. }&t	|&t
r|&dk s|&d/krd0}
tL|
|dkr d1}
tL|
|&|tM< td2 td3tN|F   d}'t|d4r6z|Od tPQ|R }'W n tSjTy5   Y nw i }(|%tEt?tAtUtVg7 }%t,|d i})i }*t| d5rT| jW }*i tX| di |*}+t0|+v rf|+t0= tYZ|F |+F D ]j\}#}$|#tj[vrtXtj\d6d7sqp|#|jv r|j|# |(|#< nt	|$t
t]t^tfsqpt_|#j`},|,r|,|(|#< |#|)vr|#|%vrt	|$t^r|$ad8d9d: |)|#< qpt	|$tbrt]|$|)|#< qp|$|)|#< qpt0|)v rt-|)t0 d
kr|)t0 d |)t0< td;tN|)F   | jd<v rd=}t|)F }-|-c  |||'||-|(f}.td| jd>|.|}	|	e| j8d?| j  	 |	adAd
d  \}/}0|'s=|f|0 |/rAnq*|'rXztPg|' W n
 tyW   Y nw |/dk rgdB|/ dC}
t|
n |%D ]}#||#= qj|h|}1tij| |dd?| j |1||d
ffg dD|v r|| _kd S d S )ENzcannot write mode z as TIFFrK   r  r   r   r   r"   r!   r   r   Ztiffinfor  zTiffinfo Keys: %sr  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r   r*   )r+   r,   r+      r  r;   r  r   c                 S   s   g | ]}|d  qS r  r$   r   r$   r$   r(   r     s    z_save.<locals>.<listcomp>r   r   r    Z
strip_sizer   r  )r   r   )r   r     r  r  r  qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  r   Zlibtiff_support_custom_tagsFr   r   r#  zConverted items: %s)r0   r.   r  r  r?   Ti @  zencoder error z when writing image file_debug_multipage)l	SAVE_INFOr  rW  rH  r   encoderinfoencoderconfigr   rV  rc   r   WRITE_LIBTIFFr  r   r  r  r   r   ZExifrb  rX  rY  rp  rs  r{  r   r  r  r   r   r   r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  rD   r  r  r  r  copyrU  heightwidthr
   invertr  Z
getpaletter  
STRIP_SIZEr[   r  r   STRIPBYTECOUNTSr   re  COMPRESSION_INFO_REVr  r  REFERENCEBLACKWHITEr   
setdefaultr  r  r  TILEBYTECOUNTSr   JPEGQUALITYrd  rZ  osdupr  ioUnsupportedOperationTRANSFERFUNCTIONSUBIFDr   rw   	itertoolschainZLIBTIFF_COREr  rd   rn   r   r   r   rQ   sortZ_getencoderr  rm  r  rn  r	   _saver  )2r  rI  r  r  rL   r  r  bitsextrar  r   rc  r  r  r  r  r   r  r  Ziccr   r  Zinverted_imZpxr  r  ZlutZcolormapcolorsr\  r  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imager   rf   Z	blocklistr  r  typesZattsZ
legacy_ifdZsupplied_tagsr   r~  r-  errcoder   ra  r$   r$   r(   r  ,  s  













&
&""






 


	







r  c                   @   s   e Zd Zg dZh dZd1ddZdd Zdd	 Zd
d Zdd Z	dd Z
dd ZejfddZdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd2d.d/Zd0S )3AppendingTiffWriter)r   r   r   r   r   r    r   r   r   r   r    r   r    r   r   r   r    >   i   r   i  i  i	  r   Fc                 C   st   t |dr|| _d| _n"|| _d| _zt||rdnd| _W n ty-   t|d| _Y nw | j | _|   d S )NrG  FTzw+bzr+b)	r   rm   close_fpr   openrH  rT  	beginningsetup)re   fnr  r$   r$   r(   rg   o  s   
zAppendingTiffWriter.__init__c                 C   s   | j | jtj d | _d| _| j d | _}|sd| _	d S d| _	|dkr,| 
d n|dkr6| 
d nd	}t||   |   d S )
Nr   r   TFrH   r   rG   r   zInvalid TIFF file header)rm   rZ  r  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPagerG  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)re   iimmr   r$   r$   r(   r  }  s    zAppendingTiffWriter.setupc                 C   s   | j rd S | j| j | jd}|sd S || jkr!d}t||  }|| j7 }| j| j | 	| | j| | 
  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)r  rm   rZ  r  rG  r  r  readLongr  	writeLongfixIFD)re   r"  r   
ifd_offsetr$   r$   r(   finalize  s   


zAppendingTiffWriter.finalizec                 C   s   |    |   d S rX   )r'  r  ri   r$   r$   r(   newFrame  s   zAppendingTiffWriter.newFramec                 C   s   | S rX   r$   ri   r$   r$   r(   	__enter__  s   zAppendingTiffWriter.__enter__c                 C   s   | j r|   dS )NF)r  r  )re   exc_type	exc_value	tracebackr$   r$   r(   __exit__  s   zAppendingTiffWriter.__exit__c                 C   s   | j  | j S rX   )rm   rT  r  ri   r$   r$   r(   rT    rN   zAppendingTiffWriter.tellc                 C   s*   |t jkr
|| j7 }| j|| |  S rX   )r  r  r  rm   rZ  rT  )re   ra  whencer$   r$   r(   rZ    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/   )rm   rZ  r  SEEK_ENDrT  rm  r   r  )re   posZ	pad_bytesr$   r$   r(   r!    s   
zAppendingTiffWriter.goToEndc                 C   s.   || _ | j d | _| j d | _| j d | _d S )Nr,   r  ZHHL)endianlongFmtshortFmt	tagFormat)re   r1  r$   r$   r(   r    s   zAppendingTiffWriter.setEndianc                 C   sP   	 |   }|dkr| j d | _d S | j| |  }| j|d tj q)NTr   r   r-   )r#  rm   rT  r  rZ  	readShortr  SEEK_CUR)re   r&  num_tagsr$   r$   r(   r     s   zAppendingTiffWriter.skipIFDsc                 C   s   | j |S rX   )rm   rm  r!  r$   r$   r(   rm    r   zAppendingTiffWriter.writec                 C      t | j| jd\}|S )Nr   )r   r   r3  rm   rG  r'  r$   r$   r(   r5       zAppendingTiffWriter.readShortc                 C   r8  rI   )r   r   r2  rm   rG  r'  r$   r$   r(   r#    r9  zAppendingTiffWriter.readLongc                 C   R   | j dtj | j t| j|}|d ur%|dkr'd| d}t|d S d S )Nr   wrote only  bytes but wanted 4	rm   rZ  r  r6  rm  r   r   r2  r  re   rf   Zbytes_writtenr   r$   r$   r(   rewriteLastShortToLong     z*AppendingTiffWriter.rewriteLastShortToLongc                 C   r:  )Nr;  r   r<   bytes but wanted 2)	rm   rZ  r  r6  rm  r   r   r3  r  r?  r$   r$   r(   rewriteLastShort  rA  z$AppendingTiffWriter.rewriteLastShortc                 C   r:  )Nr   r<  r=  r>  r?  r$   r$   r(   rewriteLastLong  rA  z#AppendingTiffWriter.rewriteLastLongc                 C   B   | j t| j|}|d ur|dkrd| d}t|d S d S )Nr   r<  rB  )rm   rm  r   r   r3  r  r?  r$   r$   r(   
writeShort  
   zAppendingTiffWriter.writeShortc                 C   rF  )Nr   r<  r=  )rm   rm  r   r   r2  r  r?  r$   r$   r(   r$    rH  zAppendingTiffWriter.writeLongc                 C   s   |    | j  d S rX   )r'  rm   r  ri   r$   r$   r(   r    s   zAppendingTiffWriter.closec                 C   s   |   }t|D ]u}t| j| jd\}}}| j| }|| }|dk}|s5|  }	|	| j	7 }	| 
|	 || jv rs| j }
|rV| j||dk|dkd | j|
d  n| j|	 | j||dk|dkd | j|
 d  }	}
q|r}| jdtj qd S )Nr    r   r   )isShortisLong)r5  rU  r   r   r4  rm   rG  
fieldSizesr#  r  rE  TagsrT  
fixOffsetsrZ  r  r6  )re   r7  r\  r   Z
field_typer]  Z
field_size
total_sizeis_localra  Zcur_posr$   r$   r(   r%    s6   





zAppendingTiffWriter.fixIFDc                 C   s   |s
|s
d}t |t|D ]J}|r|  n|  }|| j7 }|rK|dkrK|dkr/d}t || | | jdtj	 | 
tj | jdtj	 q|rS| | q| | qd S )Nz offset is neither short nor longr   r   znot implementedir    )r  rU  r5  r#  r  r@  rm   rZ  r  r6  rG  r   r   rC  rE  )re   r]  rI  rJ  r   r\  ra  r$   r$   r(   rM  4  s$   

zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   rK  rL  rg   r  r'  r(  r)  r-  rT  r  r  rZ  r!  r  r   rm  r5  r#  r@  rC  rE  rG  r$  r  r%  rM  r$   r$   r$   r(   r  R  s2    

#r  c              	   C   s   | j  }| j}t|dg }t| ds|st| ||S |  }zWt|;}| g| D ]-}||_ ||_t|ds<d}	n|j	}	t
|	D ]}
||
 |  t||| |  qCq,W d    n1 sdw   Y  W | | d S W | | d S | | w )Nappend_imagesr  r   )r  r  r  rp  rV  r   r  rT  r  r  rU  rZ  rb  r(  )r  rI  r  r  r  rP  Zcur_idxtfZimsZnfrr  r$   r$   r(   	_save_allN  s2   




rR  z.tifz.tiffz
image/tiff)lr  r
  loggingr  r  r   r   collections.abcr   	fractionsr   numbersr   r    r   r   r	   r
   r   r   _binaryr   r  r   r  r   r   	getLoggerr   rX  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  re  r  r  r  r  r  r  r  r  r  r  r  Z	PREDICTORr  r  r  r  r  r	  r  r  Z
JPEGTABLESr  r   r  r  r  r  ZEXIFIFDr  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r   r  r  r\   r  rJ   rM   rW   r^   r   r
  rQ   r   r  r   r   setattrrs  ZImageFileDirectoryr  r  r  r  rR  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer$   r$   r$   r(   <module>   s  ( 
	
	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghiz
     \   l	
  ( }