a
    h|!                     @  s   d dl mZ d dlZd dlmZ ddlmZmZ ddlm	Z
 ddl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dddddddZG dd dejZeejee ede eejd eeje ede dS )    )annotationsN)IO   )Image	ImageFile)i32be)o8)o32bebytesbool)prefixreturnc                 C  s
   |  dS )N   qoif)
startswith)r    r   @/var/www/auris/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 )
N   znot a QOI filer   r      RGBRGBAqoir   r   )r   fpreadSyntaxErrori32_size_modeseekosSEEK_CURr   _TiletellZtile)selfmsg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            @   )r1   r2   )r'   r3   rgba
hash_valuer   r   r   _add_to_previous_pixels.   s    $z"QoiDecoder._add_to_previous_pixelsz$bytes | Image.SupportsArrayInterfaceztuple[int, int])bufferr   c                   sP  j d usJ i _td_t }tj}jjjj	 | }t
||k rB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rLjrLt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 }qD| |dkr8|d d }||7 }qD| dS )Nr   r   r      r   r      r   r@   r      ?   r   r   r   r   0                         c                 3  s(   | ] \}}j |   | d  V  qdS )rG   N)r1   ).0idiffZ
diff_greenr'   r   r   	<genexpr>^   s   z$QoiDecoder.decode.<locals>.<genexpr>)r   )fdr2   	bytearrayr1   r   getmodebandsmodestateZxsizeZysizelenr   gettuple	enumerater=   Z
set_as_raw)r'   r>   databandsZdest_lengthbyter3   opZop_indexZsecond_byteZdiff_redZ	diff_blueZ
run_lengthr   rP   r   decode5   sl    
"





zQoiDecoder.decode)	r+   r,   r-   Z	_pulls_fdr1   __annotations__r2   r=   r`   r   r   r   r   r0   )   s
   
r0   zImage.Imagez	IO[bytes]zstr | bytesr   )imr   filenamer   c              	   C  s   | j dkrd}n| j dkr d}nd}t|| jddkr@dnd	}|d
 |t| jd  |t| jd	  |t| |t| t	| |t
dd| j g d S )Nr   r   r   r   zUnsupported QOI image mode
colorspaceZsRGBr   r   r   r   r   )rV   
ValueErrorZencoderinforY   writeo32sizer   r   _saver%   )rb   r   rc   r)   r(   rd   r   r   r   ri   t   s    


ri   c                   @  s^   e Zd ZU dZdZded< i Zded< dZdd	d
dZddddddZ	dddddZ
dS )
QoiEncoderTNz tuple[int, int, int, int] | Noner1   z$dict[int, tuple[int, int, int, int]]r2   r   r
   r   c                 C  s   t d| jd B }d| _|S )N   r   r   )r   _run)r'   r\   r   r   r   
_write_run   s    zQoiEncoder._write_runint)leftrightr   c                 C  s    || d@ }|dkr|d8 }|S )Nr@      rG   r   )r'   ro   rp   resultr   r   r   _delta   s    zQoiEncoder._deltaztuple[int, int, bytes])bufsizer   c                 C  s  | j d usJ ddi| _d| _t }| j j\}}t| j}t|D ]~}t|D ]n}| j 	||f}|dkr~g |dR }|| jkr|  j
d7  _
| j
dkr||  7 }n| j
r||  7 }|\}	}
}}|	d |
d  |d	  |d
  d }| j||kr|t|7 }n| jr|| j|< | j\}}}}||kr| |	|}| |
|}| ||}d|  krzdk rn nfd|  krdk rn nJd|  krdk rn n.|td|d d> B |d d> B |d B 7 }n| ||}| ||}d|  krdk rn njd|  kr0dk rn nNd|  krLdk rn n2|td|d B 7 }|t|d d> |d B 7 }n |td7 }|t|d d 7 }n|td7 }|t|7 }|| _qRqD| j
r||  7 }|td7 }t|d|fS )Nr   rD   r?   r   r@   r   >   r4   r5   r6   r7   rF   r   irK   irI   rq   rA   )r   r   r   r   r   r   r   r   )rb   r2   r1   rT   rh   r   rU   rV   rangeZgetpixelrl   rm   rY   r   rs   r
   rX   )r'   rt   r\   whr]   yxZpixelr8   r9   r:   r;   r<   Zprev_rZprev_gZprev_bZprev_aZdelta_rZdelta_gZdelta_bZdelta_grZdelta_gbr   r   r   encode   s    


$











zQoiEncoder.encode)r+   r,   r-   Z
_pushes_fdr1   ra   r2   rl   rm   rs   r|   r   r   r   r   rj      s   
rj   r   z.qoi)
__future__r   r#   typingr    r   r   _binaryr   r   r   r	   rg   r   r   Z	PyDecoderr0   ri   Z	PyEncoderrj   Zregister_openr.   Zregister_decoderZregister_extensionZregister_saveZregister_encoderr   r   r   r   <module>   s    K]