U
    ڲg2                     @  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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bytesbool)prefixreturnc                 C  s   | d d dkS )N   s   qoif )r	   r   r   6/tmp/pip-unpacked-wheel-xela2va7/PIL/QoiImagePlugin.py_accept   s    r   c                   @  s"   e Zd ZdZdZddddZdS )QoiImageFileZQOIzQuite OK ImageNone)r
   c                   s   t  jdsd}t|t fddtdD  _ jdd }|dkrTd	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__formatformat_descriptionr&   r   r   r   r   r      s   r   c                   @  sJ   e Zd ZU dZdZded< i Zded< ddd	d
dZdddddZdS )
QoiDecoderTNzbytes | bytearray | None_previous_pixelzdict[int, bytes | bytearray]_previously_seen_pixelszbytes | bytearrayr   )valuer
   c                 C  sD   || _ |\}}}}|d |d  |d  |d  d }|| j|< d S )Nr            @   )r-   r.   )r   r/   rgbaZ
hash_valuer   r   r   _add_to_previous_pixels+   s    $z"QoiDecoder._add_to_previous_pixelsr   ztuple[int, int])bufferr
   c                   sT  j d k	sti _td t }tj}jj	jj
 | }t||k rFj dd }|dkrjrtj djdd   }n|dkrj d}nn|d? }|dkr|d	@ }j|td
}n@|dkrPjrPt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rԈj dd }	|d	@ d  |	d@ d? d }
|	d@ d }tt fddt|
d|fD }|jdd  7 }nH|dkrjr|d	@ d }j}|dkr|d d }||| 7 }qH| |dkr<|d d }||7 }qH| 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 )r?   N)r-   )r   r   ZdiffZ
diff_greenr   r   r   r   [   s   z$QoiDecoder.decode.<locals>.<genexpr>)r   )fdAssertionErrorr.   r8   	bytearrayr   ZgetmodebandsmodestateZxsizeZysizelenr   r-   getr   	enumerateZ
set_as_raw)r   r9   dataZbandsZdest_lengthbyter/   opZop_indexZsecond_byteZdiff_redZ	diff_blueZ
run_lengthr   rE   r   decode2   sn    " 





zQoiDecoder.decode)	r'   r(   r)   Z	_pulls_fdr-   __annotations__r.   r8   rR   r   r   r   r   r,   &   s
   
r,   r   z.qoi)
__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