o
    Zh2                     @  s   d dl mZ d dlZddlmZ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ee
je
e	 ede ee
jd dS )    )annotationsN   )Image	ImageFile)i32beprefixbytesreturnboolc                 C  s   | d d dkS )N   s   qoif )r   r   r   I/var/www/html/lang_env/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                   s   t  jdsd}t|t fddtdD  _ jdd }|dkr*d	nd
 _ jdt	j
 dd j  j d fg _d S )Nr   znot a QOI filec                 3  s     | ]}t  jd V  qdS )r   N)i32fpread).0iselfr   r   	<genexpr>   s    z%QoiImageFile._open.<locals>.<genexpr>   r   r      RGBZRGBAqoi)r   r   )r   r   r   SyntaxErrortuplerange_size_modeseekosSEEK_CURtellZtile)r   msgZ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            @   )r.   r/   )r   r0   rgbaZ
hash_valuer   r   r   _add_to_previous_pixels+   s   $z"QoiDecoder._add_to_previous_pixelsbufferr   tuple[int, int]c                   sN  j d usJ i _td t }tj}jjjj	 | }t
||k r j dd }|dkrJjrJtj djdd   }n|dkrUj d}n|d? }|dkrk|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   r=   r      ?   )r   r   r   r   0   r                      c                 3  s*    | ]\}}j |   | d  V  qdS )rB   N)r.   )r   r   diffZ
diff_greenr   r   r   r   [   s
    
z$QoiDecoder.decode.<locals>.<genexpr>)r   )fdr/   r:   	bytearrayr   ZgetmodebandsmodestateZxsizeZysizelenr   r.   getr   	enumerateZ
set_as_raw)r   r;   dataZbandsZdest_lengthbyter0   opZop_indexZsecond_byteZdiff_redZ	diff_blueZ
run_lengthr   rI   r   decode2   sn    



2zQoiDecoder.decode)r0   r1   r	   r   )r;   r   r	   r<   )	r(   r)   r*   Z	_pulls_fdr.   __annotations__r/   r:   rU   r   r   r   r   r-   &   s   
 
r-   r   z.qoi)r   r   r	   r
   )
__future__r   r#    r   r   _binaryr   r   r   r   Z	PyDecoderr-   Zregister_openr+   Zregister_decoderZregister_extensionr   r   r   r   <module>   s   
K