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   X/home/www/facesmatcher.com/frenv_anti/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 )	QoiImageFileZ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tellZ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            @   )r0   r1   )r&   r2   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   rB   r      ?   r   r   r   r   0                         c                 3  s*    | ]\}}j |   | d  V  qdS )rI   N)r0   ).0idiffZ
diff_greenr&   r   r   	<genexpr>^   s
    
z$QoiDecoder.decode.<locals>.<genexpr>)r   )fdr1   	bytearrayr0   r   getmodebandsmodestateZxsizeZysizelenr   gettuple	enumerater=   Z
set_as_raw)r&   r>   databandsZdest_lengthbyter2   opZop_indexZsecond_byteZdiff_redZ	diff_blueZ
run_lengthr   rR   r   decode5   sn   
 



2zQoiDecoder.decode)r2   r3   r   r   )r>   r?   r   r@   )	r*   r+   r,   Z	_pulls_fdr0   __annotations__r1   r=   rb   r   r   r   r   r/   )   s   
 
r/   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
colorspaceZsRGBr   r   r   r   r   )rX   
ValueErrorZencoderinfor[   writeo32sizer   r   _saver$   )rd   r   rg   r(   r'   ri   r   r   r   rn   t   s   


"rn   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] | Noner0   z$dict[int, tuple[int, int, int, int]]r1   r   r   r   c                 C  s   t d| jd B }d| _|S )N   r   r   )r   _run)r&   r^   r   r   r   
_write_run   s   zQoiEncoder._write_runleftintrightc                 C  s    || d@ }|dkr|d8 }|S )NrB      rI   r   )r&   rs   ru   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 ]9}t|D ]1}| j 	||f}|dkr?g |dR }|| jkrX|  j
d7  _
| j
dkrV||  7 }n | j
ra||  7 }|\}	}
}}|	d |
d  |d	  |d
  d }| j||kr|t|7 }n| jrX|| j|< | j\}}}}||krL| |	|}| |
|}| ||}d|  krdk rn n0d|  krdk rn n$d|  krdk rn n|td|d d> B |d d> B |d B 7 }qX| ||}| ||}d|  krdk r;n n6d|  krdk r;n n(d|  krdk r;n n|td|d B 7 }|t|d d> |d B 7 }qX|td7 }|t|d d 7 }n|td7 }|t|7 }|| _q)q"| j
rg||  7 }|td7 }t|d|fS )Nr   rF   rA   r   rB   r   >   r4   r5   r6   r7   rH   r   irM   irK   rv   rC   )r   r   r   r   r   r   r   r   )rd   r1   r0   rV   rm   r   rW   rX   rangeZgetpixelrq   rr   r[   r   rx   r   rZ   )r&   ry   r^   whr_   yxZpixelr8   r9   r:   r;   r<   Zprev_rZprev_gZprev_bZprev_aZdelta_rZdelta_gZdelta_bZdelta_grZdelta_gbr   r   r   encode   s   


$











 :zQoiEncoder.encode)r   r   )rs   rt   ru   rt   r   rt   )ry   rt   r   rz   )r*   r+   r,   Z
_pushes_fdr0   rc   r1   rq   rr   rx   r   r   r   r   r   ro      s   
 

ro   r   z.qoi)r
   r   r   r   )rd   re   r   rf   rg   rh   r   r   )
__future__r   r"   typingr    r   r   _binaryr   r   r   r	   rl   r   r   Z	PyDecoderr/   rn   Z	PyEncoderro   Zregister_openr-   Zregister_decoderZregister_extensionZregister_saveZregister_encoderr   r   r   r   <module>   s"   

K]