o
    Ñ­j2  ã                   @  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   úO/var/www/html/CropPilot/venv/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 )	ÚQoiImageFileÚ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   é   ÚRGBÚRGBAÚqoi)r   r   )r   r   r   ÚSyntaxErrorÚtupleÚrangeÚ_sizeÚ_modeÚseekÚosÚSEEK_CURÚtellÚtile)r   Ú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   é   é   é   é@   )r2   r3   )r   r4   ÚrÚgÚbÚaÚ
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r£tˆ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   r   é   é   é    éð   é   é   c                 3  s*   � | ]\}}ˆj | ˆ  | d  V  qdS )rG   N)r2   )r   r   Údiff©Ú
diff_greenr   r   r   r   [   s
   € ÿ
ÿz$QoiDecoder.decode.<locals>.<genexpr>)éÿÿÿÿr   )Úfdr3   r?   Ú	bytearrayr   ÚgetmodebandsÚmodeÚstateÚxsizeÚysizeÚlenr   r2   Úgetr    Ú	enumerateÚ
set_as_raw)r   r@   ÚdataÚbandsÚdest_lengthÚbyter4   ÚopÚop_indexÚsecond_byteÚdiff_redÚ	diff_blueÚ
run_lengthr   rN   r   Údecode2   sn    ÿÿÿúÿ
þÿ

Ï
2zQoiDecoder.decode)r4   r5   r	   r   )r@   r   r	   rA   )	r,   r-   r.   Ú	_pulls_fdr2   Ú__annotations__r3   r?   rf   r   r   r   r   r1   &   s   
 
r1   r   z.qoi)r   r   r	   r
   )Ú
__future__r   r%   Ú r   r   Ú_binaryr   r   r   r   Ú	PyDecoderr1   Úregister_openr/   Úregister_decoderÚregister_extensionr   r   r   r   Ú<module>   s   
K