o
    ë6Wj80  ã                   @  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	Zd
ddd
ddddddddœZd+dd„ZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZd,d%d&„Ze ejee¡ e eje¡ e d'e¡ e d(e¡ e ejg d)¢¡ e ejd*¡ dS )-é    )ÚannotationsN)ÚIOé   )ÚImageÚ	ImageFile)Úi16be)Úo8)Úo32les    	
Ú1ÚLÚRGBÚCMYKÚFÚPÚRGBA)ó   P1ó   P2ó   P3ó   P4ó   P5ó   P6s   P0CMYKó   Pfs   PyPs   PyRGBAs   PyCMYKÚprefixÚbytesÚreturnÚboolc                 C  s"   t | ƒdko|  d¡o| d dv S )Né   ó   Pr   s	   0123456fy)ÚlenÚ
startswith)r   © r    úa/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/PIL/PpmImagePlugin.pyÚ_accept1   s   "r"   c                   @  s2   e Zd ZdZdZddd„Zddd„Zdd
d„ZdS )ÚPpmImageFileÚPPMzPbmplus imager   r   c                 C  sJ   | j d usJ ‚d}tdƒD ]}| j  d¡}|r|tv r |S ||7 }q|S )Nó    é   r   )ÚfpÚrangeÚreadÚb_whitespace)ÚselfÚmagicÚ_Úcr    r    r!   Ú_read_magic=   s   
ÿzPpmImageFile._read_magicc                 C  s°   | j d usJ ‚d}t|ƒdkr@| j  d¡}|sn(|tv r |sq	n |dkr6| j  d¡dvr5	 | j  d¡dvs,q	||7 }t|ƒdks|sHd}t|ƒ‚t|ƒdkrVd| }t|ƒ‚|S )Nr%   é
   r   ó   #s   
z Reached EOF while reading headers!   Token too long in file header: %s)r'   r   r)   r*   Ú
ValueError)r+   Útokenr.   ÚmsgÚmsg_too_longr    r    r!   Ú_read_tokenI   s0   ÿòzPpmImageFile._read_tokenÚNonec           	      C  s°  | j d usJ ‚|  ¡ }zt| }W n ty   d}t|ƒ‚w || _|dv r*d| _n|dv r2d| _n|dv r9d| _t|  ¡ ƒt|  ¡ ƒf| _	d}|d	v rNd
}|dkrUd}nq|dkrƒt
|  ¡ ƒ}|dksht |¡snd}t|ƒ‚t|ƒ| jd< |dk r{dnd}|ddf}nCt|  ¡ ƒ}d|  k r“dk sšn d}t|ƒ‚|dkr¥|dkr¥d| _|}|d
kr¼|dkr¶|dkr¶d}n|dkr¼d}|dkrÂ|n||f}t |d| j | j  ¡ |¡g| _d S )Nznot a PPM file)r   r   zimage/x-portable-bitmap)r   r   zimage/x-portable-graymap)r   r   zimage/x-portable-pixmapÚraw)r   r   r   Ú	ppm_plainr
   ú1;Ir   g        z!scale must be finite and non-zeroÚscaler   úF;32FzF;32BFéÿÿÿÿi   z1maxval must be greater than 0 and less than 65536éÿ   r   ÚIéÿÿ  úI;16BÚppm©r   r   )r'   r/   ÚMODESÚKeyErrorÚSyntaxErrorÚ_modeÚcustom_mimetypeÚintr6   Ú_sizeÚfloatÚmathÚisfiniter2   ÚabsÚinfor   Ú_TileÚsizeÚtellÚtile)	r+   Úmagic_numberÚmoder4   Údecoder_nameÚargsr;   ÚrawmodeÚmaxvalr    r    r!   Ú_opene   sX   þ
ÿzPpmImageFile._openN©r   r   )r   r7   )Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionr/   r6   rZ   r    r    r    r!   r#   9   s    

r#   c                   @  sX   e Zd ZU dZded< ddd„Zdddd„Zddd„Zd dd„Zd!dd„Z	d"dd„Z
dS )#ÚPpmPlainDecoderTr   Ú_comment_spansr   r   c                 C  s   | j d usJ ‚| j  tj¡S )N)Úfdr)   r   Ú	SAFEBLOCK)r+   r    r    r!   Ú_read_block§   s   zPpmPlainDecoder._read_blockr   ÚblockÚstartrI   c                 C  s8   |  d|¡}|  d|¡}|| dkrt||ƒS t||ƒS )Nó   
ó   r   )ÚfindÚminÚmax)r+   rf   rg   ÚaÚbr    r    r!   Ú_find_comment_end¬   s    z!PpmPlainDecoder._find_comment_endc                 C  s¦   | j r|r|  |¡}|dkr||d d … }n|  ¡ }|sd| _ 	 | d¡}|dkr-	 |S |  ||¡}|dkrF|d |… ||d d …  }n|d |… }d| _ 	 |S q!)Nr=   r   FTr1   )rb   ro   re   rj   )r+   rf   Úcomment_endÚcomment_startr    r    r!   Ú_ignore_comments±   s,   
ö
öñz PpmPlainDecoder._ignore_commentsÚ	bytearrayc                 C  s¢   t ƒ }| jj| jj }t|ƒ|krF|  ¡ }|sn.|  |¡}d | ¡ ¡}|D ]}|dvr7dt	|gƒ }t
|ƒ‚q&|| d|… }t|ƒ|kst	 dd¡}| |¡S )z¥
        This is a separate method because in the plain PBM format, all data tokens are
        exactly one byte, so the inter-token whitespace is optional.
        r%   )é0   é1   s   Invalid token for this mode: %sNs   01s   ÿ )rs   ÚstateÚxsizeÚysizer   re   rr   ÚjoinÚsplitr   r2   Ú	maketransÚ	translate)r+   ÚdataÚtotal_bytesrf   Útokensr3   r4   Úinvertr    r    r!   Ú_decode_bitonalÓ   s"   
þó
zPpmPlainDecoder._decode_bitonalrY   c                 C  s   t ƒ }d}| jdkrdnd}| jdkrdnd}t | j¡}| jj| jj | | }d}t|ƒ|krÎ|  ¡ }	|	s?|r<d}	n	 |S |  	|	¡}	|rL||	 }	d}|	 
¡ }
|	rr|	d	d …  ¡ sr|
 ¡ }t|ƒ|krrd
|d |d …  }t|ƒ‚|
D ]S}t|ƒ|krŠd
|d |d …  }t|ƒ‚t|ƒ}|dk r›d|› �}t|ƒ‚||kr¨d|› �}t|ƒ‚t|| | ƒ}|| jdkrºt|ƒnt|ƒ7 }t|ƒ|krÇ nqtt|ƒ|ks1|S )Nr0   r?   é   r   r@   r>   r%   ó    r=   s    Token too long found in data: %sr   zChannel value is negative: z'Channel value too large for this mode: )rs   rU   r   Úgetmodebandsrv   rw   rx   r   re   rr   rz   ÚisspaceÚpopr2   rI   ÚroundÚo32r   )r+   rY   r}   Úmax_lenÚout_byte_countÚout_maxÚbandsr~   Ú
half_tokenrf   r   r4   r3   ÚvalueÚmsg_strr    r    r!   Ú_decode_blocksì   sV   !
áÿ

ÿÚ(zPpmPlainDecoder._decode_blocksÚbufferúImage.DecoderInputútuple[int, int]c                 C  sZ   d| _ | jdkr|  ¡ }d}n| jd }|  |¡}| jdkr dn| j}|  t|ƒ|¡ dS )NFr
   z1;8r=   r?   úI;32©r=   r   )rb   rU   r�   rW   r�   Ú
set_as_rawr   )r+   r‘   r}   rX   rY   r    r    r!   Údecode  s   


zPpmPlainDecoder.decodeNr[   )r   )rf   r   rg   rI   r   rI   )rf   r   r   r   )r   rs   )rY   rI   r   rs   ©r‘   r’   r   r“   )r\   r]   r^   Ú	_pulls_fdÚ__annotations__re   ro   rr   r�   r�   r—   r    r    r    r!   ra   £   s   
 


"
3ra   c                   @  s   e Zd ZdZd	dd„ZdS )
Ú
PpmDecoderTr‘   r’   r   r“   c                 C  s8  | j d usJ ‚tƒ }| jd }|dk rdnd}| jdkrdnd}| jdkr'dnd}t | j¡}| jj| jj | | }t	|ƒ|k rˆ| j  
|| ¡}	t	|	ƒ|| k rRn6t|ƒD ]+}
|dkr`|	|
 nt|	|
| ƒ}t|t|| | ƒƒ}|| jdkr|t|ƒnt|ƒ7 }qVt	|ƒ|k sA| jdkr�d	n| j}|  t|ƒ|¡ d
S )Nr=   é   r   r   r?   r‚   r@   r>   r”   r•   )rc   rs   rW   rU   r   r„   rv   rw   rx   r   r)   r(   Úi16rk   r‡   rˆ   r   r–   r   )r+   r‘   r}   rY   Úin_byte_countrŠ   r‹   rŒ   Údest_lengthÚpixelsrn   rŽ   rX   r    r    r!   r—   /  s*   
ÿ özPpmDecoder.decodeNr˜   )r\   r]   r^   r™   r—   r    r    r    r!   r›   ,  s    r›   ÚimúImage.Imager'   ú	IO[bytes]Úfilenameústr | bytesr7   c                 C  s  | j dkr
d\}}n3| j dkrd\}}n)| j dv rd\}}n| j dv r(d\}}n| j d	kr2d
\}}nd| j › d�}t|ƒ‚| |d| j  ¡ |dkrQ| d¡ n|dkre|dkr_| d¡ n| d¡ n	|dkrn| d¡ | j d	krudnd}t | |t dd| j d|d|f¡g¡ d S )Nr
   )r:   r   r   )r   r   )r?   zI;16)rA   r   )r   r   )r   r   r   )r<   r   zcannot write mode z as PPMs   
%d %d
r   s   255
r   s   65535
r   s   -1.0
r=   r   r8   rC   r   )rU   ÚOSErrorÚwriterQ   r   Ú_saverP   )r¡   r'   r¤   rX   Úheadr4   Ú	row_orderr    r    r!   r¨   M  s2   










 ÿr¨   rB   r9   )z.pbmz.pgmz.ppmz.pnmz.pfmzimage/x-portable-anymap)r   r   r   r   )r¡   r¢   r'   r£   r¤   r¥   r   r7   )Ú
__future__r   rL   Útypingr   Ú r   r   Ú_binaryr   r�   r   r	   rˆ   r*   rD   r"   r#   Ú	PyDecoderra   r›   r¨   Úregister_openr_   Úregister_saveÚregister_decoderÚregister_extensionsÚregister_mimer    r    r    r!   Ú<module>   s@   ò
j 

!"