o
    svXj!  ã                   @   sŠ   d dl Z ddlmZmZ ddl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 )é    Né   )ÚImageÚ	ImageFile)Úi32be©Úo8c                 C   s   | d d… dkS )Né   s   qoif© )Úprefixr	   r	   úO/var/www/html/myproject/venv/lib/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 )ÚQoiImageFileÚ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   é   Ú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)Ú__name__Ú
__module__Ú__qualname__ÚformatÚ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ÚaÚ
hash_valuer	   r	   r   Ú_add_to_previous_pixels)   s   $z"QoiDecoder._add_to_previous_pixelsc                    sJ  i ˆ_ d ˆ_ˆ d dd„ dD ƒ¡¡ tƒ }t ˆj¡}t|ƒˆj	j
ˆj	j | k �rˆj d¡d }|dkrBˆj d¡td	ƒ }n¸|d	krMˆj d
¡}n­|d? }|dkra|d@ }ˆj  |d¡}n�|dkr˜ˆjd |d@ d
?  d d ˆjd |d@ d?  d d ˆjd |d@  d d f}|ˆjd f7 }nX|dkrÒˆj d¡d }|d@ d ‰ |d@ d
? d }	|d@ d }
t‡ ‡fdd„t|	d|
fƒD ƒƒ}|ˆjd f7 }n|dkrð|d@ d }ˆj}|dkré|d d… }||| 7 }qd dd„ |D ƒ¡}ˆ |¡ |dk�r
|d d… }||7 }t|ƒˆj	j
ˆj	j | k s+ˆ t|ƒ¡ dS )Nó    c                 s   ó   � | ]}t |ƒV  qd S ©Nr   r   r	   r	   r   r   3   ó   € z$QoiDecoder.decode.<locals>.<genexpr>)r   r   r   éÿ   r   r   éþ   r   rA   r   é   é?   )r   r   r   r   é0   r   é   é   é    éð   é   é   c                 3   s*   � | ]\}}ˆj | ˆ  | d  V  qdS )rF   N)r4   )r   r   Údiff©Ú
diff_greenr   r	   r   r   Q   s
   € ÿ
ÿc                 s   r>   r?   r   r   r	   r	   r   r   ]   r@   )éÿÿÿÿr   )r5   r4   r<   ÚjoinÚ	bytearrayr   Úgetmodebandsr!   ÚlenÚstateÚxsizeÚysizeÚfdr   r   Úgetr   Ú	enumerateÚ
set_as_rawÚbytes)r   ÚbufferÚdataÚbandsÚbyter6   ÚopÚop_indexÚsecond_byteÚdiff_redÚ	diff_blueÚ
run_lengthr	   rM   r   Údecode0   sb   ÿÿûþ

Õ,zQoiDecoder.decodeN)r*   r+   r,   Ú	_pulls_fdr<   rf   r	   r	   r	   r   r/   &   s    r/   r   z.qoi)r#   Ú r   r   Ú_binaryr   r   r   r   r   Ú	PyDecoderr/   Úregister_openr-   Úregister_decoderÚregister_extensionr	   r	   r	   r   Ú<module>   s   A