B
    eAd‡,  ã               @   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)
s   P1s   P2s   P3s   P4s   P5s   P6s   P0CMYKs   PyPs   PyRGBAs   PyCMYKc             C   s   | dd… dko| d dkS )Né    r   ó   Ps   0123456y© )Úprefixr   r   úD/var/www/html/venv/lib/python3.7/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}x2t dƒD ]&}| j d¡}|r*|tkr,P ||7 }qW |S )Nó    é   r   )ÚrangeÚfpÚreadÚb_whitespace)ÚselfÚmagicÚ_Úcr   r   r   Ú_read_magic9   s    zPpmImageFile._read_magicc             C   sœ   d}x^t |ƒdkrb| j d¡}|s&P n2|tkr8|s4qP n |dkrXx| j d¡dkrTqBW q||7 }qW |svd}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  |   ¡ }y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
}xÎtdƒD ]Â}t|  ¡ ƒ}|dkr |}q‚|dkrÎ|}	|dkrÂd| _d}
P n
| | _}
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r8|dkr8d}
q‚|dkr‚d}q‚W |dkr\|
ddfn|
|f}||	f| _
|dd||	f| j ¡ |fg| _d S )Nznot a PPM file)s   P1s   P4zimage/x-portable-bitmap)s   P2s   P5zimage/x-portable-graymap)s   P3s   P6zimage/x-portable-pixmapÚraw)s   P1s   P2s   P3Ú	ppm_plainé   r   r   r   z1;Ié   i   z1maxval must be greater than 0 and less than 65536éÿ   r   ÚIiÿÿ  zI;16BÚppm)r   ÚMODESÚKeyErrorÚSyntaxErrorZcustom_mimetyper   Úintr%   Úmoder!   Ú_sizer   ÚtellZtile)r   Zmagic_numberr1   r$   ÚmaxvalZdecoder_nameZixr#   ÚxsizeÚysizeÚrawmodeÚargsr   r   r   Ú_open]   sT    
zPpmImageFile._openN)Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionr   r%   r9   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>x6|r<|  |¡}|dkr2||d d … }P q|  ¡ }qW d| _ x^| d¡}|dkrZP |  ||¡}|dkrŒ|d |… ||d d …  }qF|d |… }d| _ P qFW |S )Néÿÿÿÿr   Fr   T)Ú_comment_spansrK   rA   rD   )r   rG   Zcomment_endÚcomment_startr   r   r   Ú_ignore_commentsŸ   s&    

z PpmPlainDecoder._ignore_commentsc             C   s    t ƒ }| jj| jj }xrt|ƒ|krˆ|  ¡ }|s2P |  |¡}d | ¡ ¡}x*|D ]"}|dkrPdt	|gƒ }t
|ƒ‚qPW || d|… }qW 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Ústater5   r6   r    rA   rO   ÚjoinÚsplitÚbytesr!   Ú	maketransÚ	translate)r   ÚdataÚtotal_bytesrG   Ú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}x.t|ƒ|kr†|  ¡ }	|	s„|r‚t dƒ}	nP |  	|	¡}	|rž||	 }	d}|	 
¡ }
|	rê|	d	d …  ¡ sê|
 ¡ }t|ƒ|krêd
|d |d …  }t|ƒ‚x˜|
D ]}t|ƒ|krd
|d |d …  }t|ƒ‚t|ƒ}||krBd|› }t|ƒ‚t|| | ƒ}|| jdkrht|ƒnt|ƒ7 }t|ƒ|krðP qðW qZW |S )Nr   r+   é   r   iÿÿ  r*   Fó    rL   s    Token too long found in data: %sz'Channel value too large for this mode: )rR   r1   r   ÚgetmodebandsrS   r5   r6   r    rA   rO   rU   ÚisspaceÚpopr!   r0   ÚroundÚo32r   )r   r4   rY   Úmax_lenÚout_byte_countÚout_maxÚbandsrZ   Z
half_tokenrG   r[   r$   r#   Úvaluer   r   r   Ú_decode_blocksÚ   sH    




 
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;8rL   r+   zI;32)rL   r   )rM   r1   r]   r8   rj   Ú
set_as_rawrV   )r   ÚbufferrY   r7   r4   r   r   r   r"   
  s    


zPpmPlainDecoder.decodeN)r   )
r:   r;   r<   Ú	_pulls_fdrA   rK   rO   r]   rj   r"   r   r   r   r   r?   ”   s   
"0r?   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¡}xªt|ƒ| jj| jj | | k rú| j	 
|| ¡}t|ƒ|| k r”P xbt|ƒD ]V}	|dkr²||	 nt||	| ƒ}
t|t|
| | ƒƒ}
|| jdkrêt|
ƒnt|
ƒ7 }qžW qRW | jdkrd	n| j}|  t|ƒ|¡ d
S )NrL   é   r   r)   r+   r^   iÿÿ  r*   zI;32)rL   r   )rR   r8   r1   r   r`   r    rS   r5   r6   r@   r   r   Úi16rE   rc   rd   r   rk   rV   )r   rl   rY   r4   Zin_byte_countrf   rg   rh   ZpixelsrJ   ri   r7   r   r   r   r"     s"    
"&zPpmDecoder.decodeN)r:   r;   r<   rm   r"   r   r   r   r   rn     s   rn   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   )z1;Is   P4r   )r   s   P5r+   )zI;16Bs   P5)r	   r   )r	   s   P6zcannot write mode z as PPMs   
%d %d
s   P6s   255
s   P5s   65535
r&   )r   r   r   r   )r1   ÚOSErrorÚwriteÚsizer   Ú_save)Zimr   Úfilenamer7   Úheadr$   r   r   r   rt   5  s$    








rt   r,   r'   z.pbmz.pgmz.ppmz.pnmzimage/x-portable-anymapN)Ú r   r   Ú_binaryr   rp   r   r   rd   r   r-   r   r   Z	PyDecoderr?   rn   rt   Zregister_openr=   Zregister_saveZregister_decoderZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s4   _ 