U
    ­A›d‡,  ã                   @   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ddddg¡ e ejd¡ dS )é   )ÚImageÚ	ImageFile)Úi16be)Úo8)Úo32les    	
Ú1ÚLÚRGBZCMYKÚPÚRGBA)
ó   P1ó   P2ó   P3ó   P4ó   P5ó   P6s   P0CMYKs   PyPs   PyRGBAs   PyCMYKc                 C   s   | dd… dko| d dkS )Né    r   ó   Ps   0123456y© )Úprefixr   r   úK/home/sam/Atlas/atlas_env/lib/python3.8/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 )
ÚPpmImageFileZPPMzPbmplus imagec                 C   s:   d}t dƒD ](}| j d¡}|r(|tkr, q6||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r\| j d¡}|s$q\n.|tkr6|s\qq\n|dkrR| j d¡dkrq>q||7 }q|snd}t|ƒ‚n"t |ƒdkr�d| ¡ › �}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k
r4   d}t|ƒ‚Y nX |dkrFd| _n|dkrVd| _n|dkrdd| _d }d}|d	krxd
}tdƒD ]È}t|  ¡ ƒ}|dkrž|}q€|dkrÐ|}	|dkrÄd| _d}
 �qJn
| | _}
q€|dkr€|}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}
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ÚSyntaxErrorZcustom_mimetyper   Úintr+   Úmoder'   Ú_sizer   ÚtellZtile)r   Zmagic_numberr:   r*   ÚmaxvalZdecoder_nameZixr)   ÚxsizeÚysizeÚrawmodeÚargsr   r   r   Ú_open]   sT    
zPpmImageFile._openN)Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionr#   r+   rB   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   Z	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r0||d d … }q:q|  ¡ }qd| _ | d¡}|dkrTqœ|  ||¡}|dkr†|d |… ||d d …  }q@|d |… }d| _ qœq@|S )Néÿÿÿÿr   Fr%   T)Ú_comment_spansrT   rJ   rM   )r   rP   Zcomment_endÚcomment_startr   r   r   Ú_ignore_commentsŸ   s$    


z PpmPlainDecoder._ignore_commentsc                 C   s˜   t ƒ }| jj| jj }t|ƒ|kr‚|  ¡ }|s0q‚|  |¡}d | ¡ ¡}|D ]"}|dkrLdt	|gƒ }t
|ƒ‚qL|| d|… }q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Ústater>   r?   r&   rJ   rX   ÚjoinÚsplitÚbytesr'   Ú	maketransÚ	translate)r   ÚdataÚtotal_bytesrP   Ú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‚|  ¡ }	|	s‚|r~t dƒ}	n�q‚|  	|	¡}	|rœ||	 }	d}|	 
¡ }
|	rè|	d	d …  ¡ sè|
 ¡ }t|ƒ|krèd
|d |d …  }t|ƒ‚|
D ]’}t|ƒ|k�rd
|d |d …  }t|ƒ‚t|ƒ}||k�r>d|› �}t|ƒ‚t|| | ƒ}|| jdk�rdt|ƒnt|ƒ7 }t|ƒ|krì qVqìqV|S )Nr$   r2   é   r   r3   r1   Fó    rU   s    Token too long found in data: %sz'Channel value too large for this mode: )r[   r:   r   Úgetmodebandsr\   r>   r?   r&   rJ   rX   r^   ÚisspaceÚpopr'   r9   ÚroundÚo32r   )r   r=   rb   Úmax_lenÚout_byte_countÚout_maxÚbandsrc   Z
half_tokenrP   rd   r*   r)   Úvaluer   r   r   Ú_decode_blocksÚ   sJ    

ÿ

 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;8rU   r2   úI;32©rU   r   )rV   r:   rf   rA   rs   Ú
set_as_rawr_   )r   Úbufferrb   r@   r=   r   r   r   r(   
  s    


zPpmPlainDecoder.decodeN)r   )
rC   rD   rE   Ú	_pulls_fdrJ   rT   rX   rf   rs   r(   r   r   r   r   rH   ”   s   
"0rH   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 r’qôt|ƒD ]V}	|dkr®||	 nt||	| ƒ}
t|t|
| | ƒƒ}
|| jdkræt|
ƒnt|
ƒ7 }qšqP| jdk�rd	n| j}|  t|ƒ|¡ d
S )NrU   é   r   r0   r2   rg   r3   r1   rt   ru   )r[   rA   r:   r   ri   r&   r\   r>   r?   rI   r   r   Úi16rN   rl   rm   r   rv   r_   )r   rw   rb   r=   Zin_byte_countro   rp   rq   ZpixelsrS   rr   r@   r   r   r   r(     s$    
 ÿ"zPpmDecoder.decodeN)rC   rD   rE   rx   r(   r   r   r   r   ry     s   ry   c              
   C   sÜ   | j dkrd\}}nR| j dkr(d\}}n>| j dkr<d\}}n*| j dkrPd\}}nd	| j › d
�}t|ƒ‚| |d| j  ¡ |dkrŽ| d¡ n&|dkr´|dkrª| d¡ n
| d¡ t | |dd| j d|ddffg¡ d S )Nr   )r/   r   r   )r   r   r2   )r4   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)Zimr   Úfilenamer@   Úheadr*   r   r   r   r   5  s$    








r   r5   r-   z.pbmz.pgmz.ppmz.pnmzimage/x-portable-anymapN)Ú r   r   Ú_binaryr   r{   r   r   rm   r   r6   r   r   Z	PyDecoderrH   ry   r   Zregister_openrF   Zregister_saveZregister_decoderZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s6   ó_ 