
    Wh|!                       d dl mZ d dlZd dlmZ ddlmZmZ ddlm	Z
 ddlmZ ddlmZ dd	Z G d
 dej                        Z G d dej                         ZddZ G d dej&                        Z ej*                  ej,                  ee        ej.                  de        ej0                  ej,                  d        ej2                  ej,                  e        ej4                  de       y)    )annotationsN)IO   )Image	ImageFile)i32be)o8)o32bec                $    | j                  d      S )N   qoif)
startswith)prefixs    L/var/www/html/jupyter_env/lib/python3.12/site-packages/PIL/QoiImagePlugin.py_acceptr      s    W%%    c                      e Zd ZdZdZddZy)QoiImageFileQOIzQuite OK Imagec                0   t        | j                  j                  d            sd}t        |      t	        | j                  j                  d            t	        | j                  j                  d            f| _        | j                  j                  d      d   }|dk(  rdnd| _        | j                  j                  dt        j                         t        j                  dd	| j
                  z   | j                  j                               g| _        y )
N   znot a QOI filer   r      RGBRGBAqoir   r   )r   fpreadSyntaxErrori32_size_modeseekosSEEK_CURr   _Tiletelltile)selfmsgchannelss      r   _openzQoiImageFile._open   s    tww||A'"Cc""a)3tww||A+??
77<<?1%&!mU
Q$__UFTZZ,?PQ	r   N)returnNone)__name__
__module____qualname__formatformat_descriptionr+    r   r   r   r      s    F)Rr   r   c                  >    e Zd ZU dZdZded<   i Zded<   d	dZd
dZy)
QoiDecoderTNzbytes | bytearray | None_previous_pixelzdict[int, bytes | bytearray]_previously_seen_pixelsc                r    || _         |\  }}}}|dz  |dz  z   |dz  z   |dz  z   dz  }|| j                  |<   y )Nr            @   )r6   r7   )r(   valuergba
hash_values          r   _add_to_previous_pixelsz"QoiDecoder._add_to_previous_pixels.   sO    $
1a!ea!ema!e+a"f4:
38$$Z0r   c           
          j                   J i  _        t        d       _        t               }t	        j
                   j                        } j                  j                   j                  j                  z  |z  }t        |      |k  r, j                   j                  d      d   }|dk(  rB j                  r6t         j                   j                  d             j                  dd  z   }n|dk(  r j                   j                  d      }nu|dz	  }|dk(  r,|d	z  } j                  j                  |t        d
            }n?|dk(  rz j                  rnt         j                  d   |dz  dz	  z   dz
  dz   j                  d   |dz  dz	  z   dz
  dz   j                  d   |dz  z   dz
  dz   j                  d   f      }n|dk(  r j                  rv j                   j                  d      d   }	|d	z  dz
  |	dz  dz	  dz
  }
|	dz  dz
  }t        t         fdt        |
d|f      D                    }| j                  dd  z  }n9|dk(  r4 j                  r(|d	z  dz   } j                  }|dk(  r|d d }|||z  z  } j                         |dk(  r|d d }||z  }t        |      |k  r, j!                  |       y)Nr   r   r      r   r      r   rF   r      ?   r   r   r   r   0                         c              3  T   K   | ]  \  }}j                   |   z   |z   d z   ! yw)rM   N)r6   ).0idiff
diff_greenr(   s      r   	<genexpr>z$QoiDecoder.decode.<locals>.<genexpr>^   s7       '4 "11!4zADHCOs   %()r   )fdr7   	bytearrayr6   r   getmodebandsmodestatexsizeysizelenr   gettuple	enumeraterC   
set_as_raw)r(   bufferdatabandsdest_lengthbyter=   opop_indexsecond_bytediff_red	diff_blue
run_lengthrW   s   `            @r   decodezQoiDecoder.decode5   s   ww"""')$(8{""499-jj&&)9)99EA$i+%77<<?1%Dz!d&:&:!$'',,q/2T5I5I!"5MM#QQY7#j0H 88<< )L"9E 1W!5!5%!11!4
9Jq8PQTUU!"!11!4
9Jq8PQTUU!"!11!4z8IJQNRUU 003	E 1W!5!5"&'',,q/!"4K"&"3r!9J!,z!9a ?1DH!,z!9Q >I% +4h95M+N E T11!"55E1W!5!5"&"3q!8J 00Ez %bq	EJ..D((/zbq	EMDc $i+%d 	r   )r=   zbytes | bytearrayr,   r-   )rf   z$bytes | Image.SupportsArrayInterfacer,   ztuple[int, int])	r.   r/   r0   	_pulls_fdr6   __annotations__r7   rC   rq   r3   r   r   r5   r5   )   s(    I04O-4<>9>9<r   r5   c           	     B   | j                   dk(  rd}n| j                   dk(  rd}nd}t        |      | j                  j                  d      dk(  rdnd	}|j	                  d
       |j	                  t        | j                  d                |j	                  t        | j                  d	                |j	                  t        |             |j	                  t        |             t        j                  | |t        j                  dd| j                  z         g       y )Nr   r   r   r   zUnsupported QOI image mode
colorspacesRGBr   r   r   r   r   )r]   
ValueErrorencoderinforb   writeo32sizer	   r   _saver%   )imr   filenamer*   r)   ru   s         r   r|   r|   t   s    	ww%	F	*onn((6&@aJHHWHHS_HHS_HHR\HHR
^OOBY__UFRWW4DEFGr   c                  J    e Zd ZU dZdZded<   i Zded<   dZddZdd	Z	dd
Z
y)
QoiEncoderTNz tuple[int, int, int, int] | Noner6   z$dict[int, tuple[int, int, int, int]]r7   r   c                J    t        d| j                  dz
  z        }d| _        |S )N   r   r   )r	   _run)r(   rg   s     r   
_write_runzQoiEncoder._write_run   s%    *		A./	r   c                *    ||z
  dz  }|dk\  r|dz  }|S )NrF      rM   r3   )r(   leftrightresults       r   _deltazQoiEncoder._delta   s%    ,#%S=cMFr   c                4   | j                   J ddi| _        d| _        t               }| j                   j                  \  }}t        j                  | j                        }t        |      D ]o  }t        |      D ]]  }| j                   j                  ||f      }|dk(  rg |d}|| j                  k(  r:| xj                  dz  c_
        | j                  dk(  r|| j                         z  }n| j                  r|| j                         z  }|\  }	}
}}|	dz  |
dz  z   |d	z  z   |d
z  z   dz  }| j                  j                  |      |k(  r|t        |      z  }ns| j                  rf|| j                  |<   | j                  \  }}}}||k(  r$| j                  |	|      }| j                  |
|      }| j                  ||      }d|cxk  rdk  rFn nCd|cxk  rdk  r8n n5d|cxk  rdk  r*n n'|t        d|dz   dz  z  |dz   dz  z  |dz   z        z  }n| j                  ||      }| j                  ||      }d|cxk  rdk  rNn nKd|cxk  rdk  r@n n=d|cxk  rdk  r2n n/|t        d|dz   z        z  }|t        |dz   dz  |dz   z        z  }n<|t        d      z  }|t        |d d       z  }n|t        d      z  }|t        |      z  }|| _        ` r | j                  r|| j                         z  }|t        d      z  }t!        |      d|fS )Nr   rJ   rE   r   rF   r   >   r9   r:   r;   r<   rL   r   irQ   irO   r   rG   )r   r   r   r   r   r   r   r   )r}   r7   r6   r[   r{   r   r\   r]   rangegetpixelr   r   rb   r	   r   bytesra   )r(   bufsizerg   whrh   yxpixelr>   r?   r@   rA   rB   prev_rprev_gprev_bprev_adelta_rdelta_gdelta_bdelta_grdelta_gbs                          r   encodezQoiEncoder.encode   s/   ww"""()<'8$-{ww||1""499-q 9	-A1X 8-((!Q0A:)eMSMED000IINIyyB 11yy 11!&JAq!Q"#a%!a%-!a%"7!b&"@B!FJ3377
CuL:.--CH44Z@9=9M9M6!Q;&*kk!V&<G&*kk!V&<G&*kk!V&<G !#g 1 1$&'$5A$5$&'$5A$5 $$.'.{q&8%9'.{q&8%9 (/{%4)" !" ,0;;w+H+/;;w+H$&($6Q$6(+w(;(;(*h(:(:$(B(2gl(C-& %&D %)B1/BhQRl/S,T$TD$(BzN$:D$(E%),<$<D BzN2D E%L0D',$q8-9	-v 99DOO%%D.//4y!T!!r   )r,   r   )r   intr   r   r,   r   )r   r   r,   ztuple[int, int, bytes])r.   r/   r0   
_pushes_fdr6   rs   r7   r   r   r   r   r3   r   r   r   r      s3    J8<O5<DFAFD
I"r   r   r   z.qoi)r   r   r,   bool)r}   zImage.Imager   z	IO[bytes]r~   zstr | bytesr,   r-   )
__future__r   r#   typingr    r   r   _binaryr   r   r	   r
   rz   r   r   	PyDecoderr5   r|   	PyEncoderr   register_openr1   register_decoderregister_extensionregister_saveregister_encoderr3   r   r   <module>r      s    # 	   !  !&R9&& R$H$$ HVH(Z"$$ Z"z   L''w ?   uj )   ,,f 5   L'' /   uj )r   