o
    _h|!                     @  s   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dZG dd dejZG dd dejZd!ddZG dd dejZeejee ede eejd eeje ede dS )"    )annotationsN)IO   )Image	ImageFile)i32be)o8)o32beprefixbytesreturnboolc                 C  s
   |  dS )N   qoif)
startswith)r
    r   F/var/www/html/myenv/lib/python3.10/site-packages/PIL/QoiImagePlugin.py_accept   s   
r   c                   @  s   e Zd ZdZdZdddZdS )	QoiImageFileQOIzQuite OK Imager   Nonec                 C  s   t | jdsd}t|t| jdt| jdf| _| jdd }|dkr-dnd| _| jdtj	 t
dd	| j | j g| _d S )
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channelsr   r   r   _open   s   ""zQoiImageFile._openN)r   r   )__name__
__module____qualname__formatformat_descriptionr+   r   r   r   r   r      s    r   c                   @  s>   e Zd ZU dZdZded< i Zded< dddZdddZdS )
QoiDecoderTNzbytes | bytearray | None_previous_pixelzdict[int, bytes | bytearray]_previously_seen_pixelsvaluebytes | bytearrayr   r   c                 C  sD   || _ |\}}}}|d |d  |d  |d  d }|| j|< d S )Nr            @   )r2   r3   )r(   r4   rgba
hash_valuer   r   r   _add_to_previous_pixels.   s   $z"QoiDecoder._add_to_previous_pixelsbuffer$bytes | Image.SupportsArrayInterfacetuple[int, int]c                   sJ  j d usJ i _td_t }tj}jjjj	 | }t
||k rj dd }|dkrHjrHtj djdd   }n|dkrSj d}n|d? }|dkri|d	@ }j|td
}n|dkrjrtjd |d@ d?  d d jd |d@ d?  d d jd |d@  d d jd f}nc|dkrjrj dd }	|d	@ d  |	d@ d? d }
|	d@ d }tt fddt|
d|fD }|jdd  7 }n#|dkrjr|d	@ d }j}|dkr|d d }||| 7 }q"| |dkr|d d }||7 }t
||k s)| dS )Nr   r   r      r   r      r   rD   r      ?   r   r   r   r   0                         c                 3  s*    | ]\}}j |   | d  V  qdS )rK   N)r2   ).0idiff
diff_greenr(   r   r   	<genexpr>^   s
    
z$QoiDecoder.decode.<locals>.<genexpr>)r   )fdr3   	bytearrayr2   r   getmodebandsmodestatexsizeysizelenr   gettuple	enumerater?   
set_as_raw)r(   r@   databandsdest_lengthbyter4   opop_indexsecond_bytediff_red	diff_blue
run_lengthr   rT   r   decode5   sn   
 



2zQoiDecoder.decode)r4   r5   r   r   )r@   rA   r   rB   )	r,   r-   r.   	_pulls_fdr2   __annotations__r3   r?   rn   r   r   r   r   r1   )   s   
 
r1   imImage.Imager   	IO[bytes]filenamestr | bytesr   c              	   C  s   | j dkrd}n| j dkrd}nd}t|| jddkr dnd	}|d
 |t| jd  |t| jd	  |t| |t| t	| |t
dd| j g d S )Nr   r   r   r   zUnsupported QOI image mode
colorspacesRGBr   r   r   r   r   )r[   
ValueErrorencoderinfor`   writeo32sizer   r   _saver%   )rq   r   rt   r*   r)   rv   r   r   r   r}   t   s   


"r}   c                   @  sL   e Zd ZU dZdZded< i Zded< dZdd
dZdddZ	dddZ
dS )
QoiEncoderTNz tuple[int, int, int, int] | Noner2   z$dict[int, tuple[int, int, int, int]]r3   r   r   r   c                 C  s   t d| jd B }d| _|S )N   r   r   )r   _run)r(   rd   r   r   r   
_write_run   s   zQoiEncoder._write_runleftintrightc                 C  s    || d@ }|dkr|d8 }|S )NrD      rK   r   )r(   r   r   resultr   r   r   _delta   s   zQoiEncoder._deltabufsizetuple[int, int, bytes]c                 C  s  | j d usJ ddi| _d| _t }| j j\}}t| j}t|D ]6}t|D ].}| j 	||f}|dkr?g |dR }|| jkrW|  j
d7  _
| j
dkrV||  7 }n| j
r`||  7 }|\}	}
}}|	d |
d  |d	  |d
  d }| j||kr|t|7 }n| jrU|| j|< | j\}}}}||krI| |	|}| |
|}| ||}d|  krdk rn n/d|  krdk rn n#d|  krdk rn n|td|d d> B |d d> B |d B 7 }nl| ||}| ||}d|  krdk r8n n5d|  krdk r8n n'd|  krdk r8n n|td|d B 7 }|t|d d> |d B 7 }n|td7 }|t|d d 7 }n|td7 }|t|7 }|| _q)q"| j
rd||  7 }|td7 }t|d|fS )Nr   rH   rC   r   rD   r   >   r6   r7   r8   r9   rJ   r   irO   irM   r   rE   )r   r   r   r   r   r   r   r   )rq   r3   r2   rY   r|   r   rZ   r[   rangegetpixelr   r   r`   r   r   r   r_   )r(   r   rd   whre   yxpixelr:   r;   r<   r=   r>   prev_rprev_gprev_bprev_adelta_rdelta_gdelta_bdelta_grdelta_gbr   r   r   encode   sx   


$




:zQoiEncoder.encode)r   r   )r   r   r   r   r   r   )r   r   r   r   )r,   r-   r.   
_pushes_fdr2   rp   r3   r   r   r   r   r   r   r   r   r~      s   
 

r~   r   z.qoi)r
   r   r   r   )rq   rr   r   rs   rt   ru   r   r   )
__future__r   r#   typingr    r   r   _binaryr   r   r   r	   r{   r   r   	PyDecoderr1   r}   	PyEncoderr~   register_openr/   register_decoderregister_extensionregister_saveregister_encoderr   r   r   r   <module>   s"   

K]