o
    üÞ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„ZG dd„ dejƒZG dd„ dejƒZ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ÚprefixÚbytesÚreturnÚboolc                 C  s
   |   d¡S )Nó   qoif)Ú
startswith)r
   © r   úR/var/www/html/premium_crap/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                 C  s’   t | j d¡ƒsd}t|ƒ‚t| j d¡ƒt| j d¡ƒf| _| j d¡d }|dkr-d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ÚtellÚtile)ÚselfÚ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Úbufferú$bytes | Image.SupportsArrayInterfaceútuple[int, int]c                   sJ  ˆj d usJ ‚i ˆ_tdƒˆ_tƒ }t ˆj¡}ˆjjˆjj	 | }t
|ƒ|k �rˆj  d¡d }|dkrHˆjrHtˆj  d¡ƒˆjdd …  }n¼|dkrSˆj  d¡}n±|d? }|dkri|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   rD   r   é   é?   ©r   r   r   r   é0   é   é   é   é    éð   é   é   c                 3  s*   � | ]\}}ˆj | ˆ  | d  V  qdS )rK   N)r2   )Ú.0ÚiÚdiff©Ú
diff_greenr(   r   r   Ú	<genexpr>^   s
   € ÿ
ÿz$QoiDecoder.decode.<locals>.<genexpr>)éÿÿÿÿr   )Úfdr3   Ú	bytearrayr2   r   ÚgetmodebandsÚmodeÚstateÚxsizeÚysizeÚlenr   ÚgetÚtupleÚ	enumerater?   Ú
set_as_raw)r(   r@   ÚdataÚbandsÚdest_lengthÚbyter4   ÚopÚop_indexÚsecond_byteÚdiff_redÚ	diff_blueÚ
run_lengthr   rT   r   Údecode5   sn   
 ÿÿÿúÿ
þÿ

Ï
2zQoiDecoder.decode)r4   r5   r   r   )r@   rA   r   rB   )	r,   r-   r.   Ú	_pulls_fdr2   Ú__annotations__r3   r?   rn   r   r   r   r   r1   )   s   
 
r1   ÚimúImage.Imager   ú	IO[bytes]Úfilenameústr | bytesr   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Ú
colorspaceÚsRGBr   r   r   r   r   )r[   Ú
ValueErrorÚencoderinfor`   ÚwriteÚo32Úsizer   r   Ú_saver%   )rq   r   rt   r*   r)   rv   r   r   r   r}   t   s   


"r}   c                   @  sL   e Zd ZU dZdZded< i Zded< dZdd
d„Zddd„Z	ddd„Z
dS )Ú
QoiEncoderTNz tuple[int, int, int, int] | Noner2   z$dict[int, tuple[int, int, int, int]]r3   r   r   r   c                 C  s   t d| jd B ƒ}d| _|S )NéÀ   r   r   )r   Ú_run)r(   rd   r   r   r   Ú
_write_runŽ   s   zQoiEncoder._write_runÚleftÚintÚrightc                 C  s    || d@ }|dkr|d8 }|S )NrD   é€   rK   r   )r(   r‚   r„   Úresultr   r   r   Ú_delta“   s   zQoiEncoder._deltaÚbufsizeútuple[int, int, bytes]c                 C  sâ  | j d usJ ‚ddi| _d| _tƒ }| j j\}}t | j¡}t|ƒD �]6}t|ƒD �].}| j  	||f¡}|dkr?g |¢d‘R }|| jkrW|  j
d7  _
| j
dkrV||  ¡ 7 }nþ| j
r`||  ¡ 7 }|\}	}
}}|	d |
d  |d	  |d
  d }| j |¡|kr‡|t|ƒ7 }nÎ| j�rU|| j|< | j\}}}}||k�rI|  |	|¡}|  |
|¡}|  ||¡}d|  kr¸dk rén n/d|  krÄdk rén n#d|  krÐdk rén n|td|d d> B |d d> B |d B ƒ7 }nl|  ||¡}|  ||¡}d|  k�rdk �r8n n5d|  k�rdk �r8n n'd|  k�rdk �r8n n|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 }|| _q)q"| j
�rd||  ¡ 7 }|tdƒ7 }t|ƒd|fS )Nr   rH   rC   r   rD   r   é>   r6   r7   r8   r9   éþÿÿÿrJ   r   iøÿÿÿrO   iàÿÿÿrM   r…   rE   )r   r   r   r   r   r   r   r   )rq   r3   r2   rY   r|   r   rZ   r[   ÚrangeÚgetpixelr€   r�   r`   r   r‡   r   r_   )r(   rˆ   rd   ÚwÚhre   ÚyÚxÚpixelr:   r;   r<   r=   r>   Úprev_rÚprev_gÚprev_bÚprev_aÚdelta_rÚdelta_gÚdelta_bÚdelta_grÚdelta_gbr   r   r   Úencode™   sx   


€$


ÿ
þýÿ
ÿÈ:zQoiEncoder.encode)r   r   )r‚   rƒ   r„   rƒ   r   rƒ   )rˆ   rƒ   r   r‰   )r,   r-   r.   Ú
_pushes_fdr2   rp   r3   r€   r�   r‡   rœ   r   r   r   r   r~   ˆ   s   
 

r~   r   z.qoi)r
   r   r   r   )rq   rr   r   rs   rt   ru   r   r   )Ú
__future__r   r#   Útypingr   Ú r   r   Ú_binaryr   r   r   r	   r{   r   r   Ú	PyDecoderr1   r}   Ú	PyEncoderr~   Úregister_openr/   Úregister_decoderÚregister_extensionÚregister_saveÚregister_encoderr   r   r   r   Ú<module>   s"   

K]