B
    zb+                 @   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   1lib/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_magic:   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 |srtdnt |dkrtd|  |S )Nr   
   r      #s   
z Reached EOF while reading headerzToken too long in file header: )lenr   r   r   
ValueErrordecode)r   tokenr   r   r   r   _read_tokenD   s&    
zPpmImageFile._read_tokenc             C   s  |   }yt| }W n tk
r0   tdY nX |dkrBd| _n|dkrRd| _n|dkr`d| _d }d}|d	krtd
}xtdD ]}t|  }|dkr|}q~|dkr|}|dkrd| _d}	P n
| | _}	q~|dkr~|}d|  k rdk sn t	d|dkr|dkrd| _|d
kr~|dkr0|dkr0d}	q~|dkr~d}q~W |dkrT|	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!   Z_sizer   tellZtile)r   Zmagic_numberr0   maxvalZdecoder_nameZixr#   xsizeysizerawmodeargsr   r   r   _open\   sR    
zPpmImageFile._openN)__name__
__module____qualname__formatZformat_descriptionr   r$   r7   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 )Nr   Fr   T)_comment_spansrH   r>   rA   )r   rD   Zcomment_endZcomment_startr   r   r   _ignore_comments   s&    

z PpmPlainDecoder._ignore_commentsc             C   s   t  }| jj| jj }xpt||kr|  }|s2P | |}d| }x(|D ] }|dkrPt	dt
|g 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   zInvalid token for this mode: Ns   01s    )	bytearraystater3   r4   r    r>   rK   joinsplitr!   bytes	maketrans	translate)r   datatotal_bytesrD   tokensr#   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rz|  }	|	s|rt d}	nP | 	|	}	|r||	 }	|	
 }
|	r|	d	d   s|
 }t||krtd
|d |d   x|
D ]}t||krtd
|d |d   t|}||kr6td| t|| | }|| jdkr\t|nt|7 }t||krP qW qZW |S )Nr   r*      r   i  r)   F    rI   zToken too long found in data: z'Channel value too large for this mode: )rN   r0   r   getmodebandsrO   r3   r4   r    r>   rK   rQ   isspacepopr!   r/   roundo32r   )r   r2   rU   Zmax_lenout_byte_countout_maxbandsrV   Z
half_tokenrD   rW   r#   valuer   r   r   _decode_blocks   sD    



 
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;8rI   r*   zI;32)rI   r   )rJ   r0   rY   r6   re   
set_as_rawrR   )r   bufferrU   r5   r2   r   r   r   r"     s    


zPpmPlainDecoder.decodeN)r   )
r8   r9   r:   	_pulls_fdr>   rH   rK   rY   re   r"   r   r   r   r   r<      s   
".r<   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}xt|| jj| jj | | k r| j	
|| }t||| k rP xbt|D ]V}	|dkr||	 nt||	| }
t|t|
| | }
|| jdkrt|
nt|
7 }qW qRW | jdkrd	n| j}| t|| d
S )NrI      r   r(   r*   rZ   i  r)   zI;32)rI   r   )rN   r6   r0   r   r\   r    rO   r3   r4   r=   r   r   i16rB   r_   r`   r   rf   rR   )r   rg   rU   r2   Zin_byte_countra   rb   rc   ZpixelsrG   rd   r5   r   r   r   r"     s"    
"&zPpmDecoder.decodeN)r8   r9   r:   rh   r"   r   r   r   r   ri     s   ri   c          
   C   s   | j dkrd\}}nN| j dkr(d\}}n:| j dkr<d\}}n&| j dkrPd\}}ntd	| j  d
||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   )r0   OSErrorwritesizer   _save)Zimr   filenamer5   headr   r   r   ro   1  s"    








ro   r+   r&   z.pbmz.pgmz.ppmz.pnmzimage/x-portable-anymapN) r   r   Z_binaryr   rk   r   r   r`   r   r,   r   r   Z	PyDecoderr<   ri   ro   Zregister_openr;   Zregister_saveZregister_decoderZregister_extensionsZregister_mimer   r   r   r   <module>   s4   ^ 