a
    AøgW  ã                   @  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   úQ/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/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                 C  s’   t | j d¡ƒsd}t|ƒ‚t| j d¡ƒt| j d¡ƒf| _| j d¡d }|dkrZdnd| _| j dtj	¡ t
 dd	| j | j ¡ ¡g| _d S )
Nr   znot a QOI filer   r   é   ZRGBZRGBAÚqoi)r   r   )r   ÚfpÚreadÚSyntaxErrorÚi32Ú_sizeÚ_modeÚseekÚosÚSEEK_CURr   Z_TileÚtellZtile)ÚselfÚ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_pixelsz$bytes | Image.SupportsArrayInterfaceztuple[int, int])Úbufferr
   c                   sT  ˆj d usJ ‚i ˆ_ˆ tdƒ¡ tƒ }t ˆj¡}ˆjjˆjj	 | }t
|ƒ|k rFˆj  d¡d }|dkr–ˆjr–tˆ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   r3   r   é   é?   )r   r   r   r   é0   é   é   é   é    éð   é   é   c                 3  s(   | ] \}}ˆj | ˆ  | d  V  qdS )r9   N)r&   )Ú.0ÚiÚdiff©Z
diff_greenr   r   r   Ú	<genexpr>[   s   ÿz$QoiDecoder.decode.<locals>.<genexpr>)éÿÿÿÿr   )Úfdr'   r1   Ú	bytearrayr   ZgetmodebandsÚmodeÚstateZxsizeZysizeÚlenr   r&   ÚgetÚtupleÚ	enumerateZ
set_as_raw)r   r2   ÚdataZbandsZdest_lengthÚbyter(   ÚopZop_indexZsecond_byteZdiff_redZ	diff_blueZ
run_lengthr   rB   r   Údecode2   sl    "ÿÿÿúÿ
þÿ




zQoiDecoder.decode)	r    r!   r"   Z	_pulls_fdr&   Ú__annotations__r'   r1   rP   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