B
    eAd!  ã               @   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   úD/var/www/html/venv/lib/python3.7/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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   é   Ú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               @   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                sD  i ˆ_ d ˆ_ˆ d dd„ dD ƒ¡¡ tƒ }t ˆj¡}xöt|ƒˆj	j
ˆj	j | k r0ˆj d¡d }|dkrŠˆj d¡td	ƒ }n||d	kr¢ˆj d
¡}nd|d? }|dkrÌ|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 }n¶|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 }q<W ˆ t|ƒ¡ dS )Nó    c             s   s   | ]}t |ƒV  qd S )N)r   )r   r   r   r   r
   r   3   s    z$QoiDecoder.decode.<locals>.<genexpr>)r   r   r   éÿ   r   r   éþ   r   r7   r   é   é?   )r   r   r   r   é0   r   é   é   é    éð   é   é   c             3   s(   | ] \}}ˆj | ˆ  | d  V  qdS )r<   N)r-   )r   r   Údiff)Ú
diff_greenr   r   r
   r   R   s   c             s   s   | ]}t |ƒV  qd S )N)r   )r   r   r   r   r
   r   ]   s    )éÿÿÿÿr   )r.   r-   r5   ÚjoinÚ	bytearrayr   Zgetmodebandsr   ÚlenÚstateZxsizeZysizeÚfdr   r   Úgetr   Ú	enumerateZ
set_as_rawÚbytes)r   ÚbufferÚdataZbandsÚbyter/   ÚopZop_indexZsecond_byteZdiff_redZ	diff_blueZ
run_lengthr   )rC   r   r
   Údecode0   sZ    "





zQoiDecoder.decodeN)r#   r$   r%   Z	_pulls_fdr5   rQ   r   r   r   r
   r(   &   s   r(   r   z.qoi)r   Ú r   r   Ú_binaryr   r   r   r   r   Z	PyDecoderr(   Zregister_openr&   Zregister_decoderZregister_extensionr   r   r   r
   Ú<module>	   s   A