o
    Ԧ/f                     @  s   d dl mZ d dlZddlmZmZ ddlmZ 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)i32bec                 C  s   | d d dkS )N   s   qoif )prefixr   r   2lib/python3.10/site-packages/PIL/QoiImagePlugin.py_accept   s   r   c                   @  s   e Zd ZdZdZdd ZdS )QoiImageFileZQOIzQuite OK Imagec                   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      Z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)__name__
__module____qualname__formatZformat_descriptionr"   r   r   r   r
   r      s    r   c                   @  s    e Zd ZdZdd Zdd ZdS )
QoiDecoderTc                 C  sD   || _ |\}}}}|d |d  |d  |d  d }|| j|< d S )Nr            @   )_previous_pixel_previously_seen_pixels)r   valuergbaZ
hash_valuer   r   r
   _add_to_previous_pixels)   s   $z"QoiDecoder._add_to_previous_pixelsc                   s*  i _ d _td t }tj}jjjj	 | }t
||k rjdd }|dkrCtjdjdd   }n|dkrNjd}n|d? }|dkrd|d	@ }j |td
}n|dkrtjd |d@ d?  d d jd |d@ d?  d d jd |d@  d d jd f}n[|dk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|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   r4   r      ?   )r   r   r   r   0   r                      c                 3  s*    | ]\}}j |   | d  V  qdS )r9   N)r,   )r   r   ZdiffZ
diff_greenr   r   r
   r   W   s
    
z$QoiDecoder.decode.<locals>.<genexpr>)r   )r-   r,   r3   	bytearrayr   ZgetmodebandsmodestateZxsizeZysizelenfdr   getr   	enumerateZ
set_as_raw)r   bufferdataZbandsZdest_lengthZbyter.   opZop_indexZsecond_byteZdiff_redZ	diff_blueZ
run_lengthr   r?   r
   decode0   sn    



1zQoiDecoder.decodeN)r#   r$   r%   Z	_pulls_fdr3   rK   r   r   r   r
   r'   &   s    r'   r   z.qoi)Z
__future__r   r    r   r   Z_binaryr   r   r   r   Z	PyDecoderr'   Zregister_openr&   Zregister_decoderZregister_extensionr   r   r   r
   <module>   s   G