o
    “jŠ"  ã                   @  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   ú\C:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\PIL/QoiImagePlugin.pyÚ_accept   s   
r   c                   @  s   e Zd ZdZdZddd„ZdS )	ÚQoiImageFileZQOIzQuite OK Imager   ÚNonec                 C  s    | j d usJ ‚t| j  d¡ƒsd}t|ƒ‚t| j  d¡ƒt| j  d¡ƒf| _| j  d¡d }|dkr4d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   )Úfpr   ÚreadÚSyntaxErrorÚi32Ú_sizeÚ_modeÚseekÚosÚSEEK_CURr   Ú_TileÚtellZ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   é   é   é   é@   )r0   r1   )r&   r2   Ú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   rB   r   é   é?   ©r   r   r   r   é0   é   é   é   é    éð   é   é   c                 3  s*   � | ]\}}ˆj | ˆ  | d  V  qdS )rI   N)r0   )Ú.0ÚiÚdiff©Z
diff_greenr&   r   r   Ú	<genexpr>_   s
   € ÿ
ÿz$QoiDecoder.decode.<locals>.<genexpr>)éÿÿÿÿr   )Úfdr1   Ú	bytearrayr0   r   ÚgetmodebandsÚmodeÚstateZxsizeZysizeÚlenr   ÚgetÚtupleÚ	enumerater=   Z
set_as_raw)r&   r>   ÚdataÚbandsZdest_lengthÚbyter2   ÚopZop_indexZsecond_byteZdiff_redZ	diff_blueZ
run_lengthr   rR   r   Údecode6   sn   
 ÿÿÿúÿ
þÿ

Ï
2zQoiDecoder.decode)r2   r3   r   r   )r>   r?   r   r@   )	r*   r+   r,   Z	_pulls_fdr0   Ú__annotations__r1   r=   rb   r   r   r   r   r/   *   s   
 
r/   Ú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Ú
colorspaceZsRGBr   r   r   r   r   )rX   Ú
ValueErrorZencoderinfor[   ÚwriteÚo32Úsizer   r   Ú_saver$   )rd   r   rg   r(   r'   ri   r   r   r   rn   u   s   


"rn   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] | Noner0   z$dict[int, tuple[int, int, int, int]]r1   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ÚleftÚintÚrightc                 C  s    || d@ }|dkr|d8 }|S )NrB   é€   rI   r   )r&   rs   ru   Ú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   rF   rA   r   rB   r   é>   r4   r5   r6   r7   éþÿÿÿrH   r   iøÿÿÿrM   iàÿÿÿrK   rv   rC   )r   r   r   r   r   r   r   r   )rd   r1   r0   rV   rm   r   rW   rX   ÚrangeZgetpixelrq   rr   r[   r   rx   r   rZ   )r&   ry   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   )rs   rt   ru   rt   r   rt   )ry   rt   r   rz   )r*   r+   r,   Z
_pushes_fdr0   rc   r1   rq   rr   rx   r‚   r   r   r   r   ro   ‰   s   
 

ro   r   z.qoi)r
   r   r   r   )rd   re   r   rf   rg   rh   r   r   )Ú
__future__r   r"   Útypingr   Ú r   r   Ú_binaryr   r   r   r	   rl   r   r   Z	PyDecoderr/   rn   Z	PyEncoderro   Zregister_openr-   Zregister_decoderZregister_extensionZregister_saveZregister_encoderr   r   r   r   Ú<module>   s"   

K]