o
    svXj‡,  ã                   @   sò   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œ
Z
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„ 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 )é   )ÚImageÚ	ImageFile)Úi16be)Úo8)Úo32les    	
Ú1ÚLÚRGBÚCMYKÚPÚRGBA)
ó   P1ó   P2ó   P3ó   P4ó   P5ó   P6s   P0CMYKs   PyPs   PyRGBAs   PyCMYKc                 C   s   | dd… dko| d dv S )Né    r   ó   Ps   0123456y© )Úprefixr   r   úO/var/www/html/myproject/venv/lib/python3.10/site-packages/PIL/PpmImagePlugin.pyÚ_accept-   s   r   c                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚPpmImageFileÚPPMzPbmplus imagec                 C   s<   d}t dƒD ]}| j d¡}|r|tv r |S ||7 }q|S )Nó    é   r   )ÚrangeÚfpÚreadÚb_whitespace)ÚselfÚmagicÚ_Úcr   r   r   Ú_read_magic9   s   
ÿzPpmImageFile._read_magicc                 C   s¨   d}t |ƒdkr9| j d¡}|sn(|tv r|sqn |dkr/| j d¡dvr.	 | j d¡dvs%q||7 }t |ƒdks|sAd}t|ƒ‚t |ƒdkrRd| ¡ › �}t|ƒ‚|S )Nr   é
   r   ó   #s   
z Reached EOF while reading headerzToken too long in file header: )Úlenr   r   r    Ú
ValueErrorÚdecode)r!   Útokenr$   Úmsgr   r   r   Ú_read_tokenC   s.   ÿòzPpmImageFile._read_tokenc                 C   s|  |   ¡ }zt| }W n ty   d}t|ƒ‚w |dv r d| _n|dv r(d| _n|dv r/d| _d }d}|d	v r9d
}tdƒD ]]}t|  ¡ ƒ}|dkrL|}q=|dkrc|}	|dkr]d| _d}
 n>| | _}
q=|dkrš|}d|  k rsdk szn d}t	|ƒ‚|dkr…|dkr…d| _|d
krš|dkr”|dkr”d}
q=|dkršd}q=|dkr¤|
ddfn|
|f}||	f| _
|dd||	f| j ¡ |f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_plainé   r   r   r   ú1;Ié   i   z1maxval must be greater than 0 and less than 65536éÿ   r   ÚIéÿÿ  úI;16BÚppm)r%   ÚMODESÚKeyErrorÚSyntaxErrorÚcustom_mimetyper   Úintr-   Úmoder)   Ú_sizer   ÚtellÚtile)r!   Úmagic_numberr=   r,   ÚmaxvalÚdecoder_nameÚixr+   ÚxsizeÚysizeÚrawmodeÚargsr   r   r   Ú_open]   sX   þ€
"zPpmImageFile._openN)Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionr%   r-   rI   r   r   r   r   r   5   s    
r   c                   @   sB   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚPpmPlainDecoderTc                 C   s   | j  tj¡S )N)Úfdr   r   Ú	SAFEBLOCK)r!   r   r   r   Ú_read_block—   s   zPpmPlainDecoder._read_blockr   c                 C   s8   |  d|¡}|  d|¡}|| dkrt||ƒS t||ƒS )Nó   
ó   r   )ÚfindÚminÚmax)r!   ÚblockÚstartÚ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!)Néÿÿÿÿr   FTr'   )Ú_comment_spansr\   rR   rU   )r!   rX   Úcomment_endÚcomment_startr   r   r   Ú_ignore_commentsŸ   s,   
ö
öñz PpmPlainDecoder._ignore_commentsc                 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   ÿ )Ú	bytearrayÚstaterE   rF   r(   rR   ra   ÚjoinÚsplitÚbytesr)   Ú	maketransÚ	translate)r!   ÚdataÚtotal_bytesrX   Útokensr+   r,   Úinvertr   r   r   Ú_decode_bitonalÁ   s"   
þó
zPpmPlainDecoder._decode_bitonalc                 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Ã|  ¡ }	|	sA|r>t dƒ}	n	 |S |  	|	¡}	|rN||	 }	d}|	 
¡ }
|	rt|	d	d …  ¡ st|
 ¡ }t|ƒ|krtd
|d |d …  }t|ƒ‚|
D ]F}t|ƒ|krŒd
|d |d …  }t|ƒ‚t|ƒ}||kr�d|› �}t|ƒ‚t|| | ƒ}|| jdkr¯t|ƒnt|ƒ7 }t|ƒ|kr¼ nqvt|ƒ|ks1|S )Nr&   r4   é   r   r5   r3   Fó    r]   s    Token too long found in data: %sz'Channel value too large for this mode: )rd   r=   r   Úgetmodebandsre   rE   rF   r(   rR   ra   rg   ÚisspaceÚpopr)   r<   ÚroundÚo32r   )r!   rB   rk   Úmax_lenÚout_byte_countÚout_maxÚbandsrl   Ú
half_tokenrX   rm   r,   r+   Úvaluer   r   r   Ú_decode_blocksÚ   sP   

äÿ
ÿÝ%zPpmPlainDecoder._decode_blocksc                 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]   r4   úI;32©r]   r   )r^   r=   ro   rH   r}   Ú
set_as_rawrh   )r!   Úbufferrk   rG   rB   r   r   r   r*   
  s   


zPpmPlainDecoder.decodeN)r   )
rJ   rK   rL   Ú	_pulls_fdrR   r\   ra   ro   r}   r*   r   r   r   r   rO   ”   s    
"0rO   c                   @   s   e Zd ZdZdd„ ZdS )Ú
PpmDecoderTc                 C   s:  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¡}t|ƒ| jj| jj | | k r‰| j	 
|| ¡}t|ƒ|| k rIn@t|ƒD ]+}	|dkrW||	 nt||	| ƒ}
t|t|
| | ƒƒ}
|| jdkrst|
ƒnt|
ƒ7 }qMt|ƒ| jj| jj | | k s8| jdkr�d	n| j}|  t|ƒ|¡ d
S )Nr]   é   r   r2   r4   rp   r5   r3   r~   r   )rd   rH   r=   r   rr   r(   re   rE   rF   rP   r   r   Úi16rV   ru   rv   r   r€   rh   )r!   r�   rk   rB   Úin_byte_countrx   ry   rz   Úpixelsr[   r|   rG   r   r   r   r*     s&   
 ÿ  özPpmDecoder.decodeN)rJ   rK   rL   r‚   r*   r   r   r   r   rƒ     s    rƒ   c              
   C   sÜ   | j dkr
d\}}n)| j dkrd\}}n| j dkrd\}}n| j dv r(d\}}nd	| j › d
�}t|ƒ‚| |d| j  ¡ |dkrG| d¡ n|dkrZ|dkrU| d¡ n| d¡ t | |dd| j d|ddffg¡ d S )Nr   )r1   r   r   )r   r   r4   )r6   r   )r	   r   )r	   r   zcannot write mode z as PPMs   
%d %d
r   s   255
r   s   65535
r.   )r   r   r   r   )r=   ÚOSErrorÚwriteÚsizer   Ú_save)Úimr   ÚfilenamerG   Úheadr,   r   r   r   r‹   5  s$   








(r‹   r7   r/   )z.pbmz.pgmz.ppmz.pnmzimage/x-portable-anymapN)Ú r   r   Ú_binaryr   r…   r   r   rv   r    r8   r   r   Ú	PyDecoderrO   rƒ   r‹   Úregister_openrM   Úregister_saveÚregister_decoderÚregister_extensionsÚregister_mimer   r   r   r   Ú<module>   s8   ó_ 