U
    ॡc+                     @   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   6/tmp/pip-unpacked-wheel-h_ukwjmx/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_magic:   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|sjt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  |   }z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
}tdD ]}t|  }|dkr|}q||dkr|}|dkrd| _d}	 q@n
| | _}	q||dkr||}d|  k rdk sn t	d|dkr|dkrd| _|d
kr||dkr2|dkr2d}	q||dkr|d}q||dkrT|	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_numberr9   maxvalZdecoder_name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| _ qq@|S )Nr   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rLt	dt
|g 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   zInvalid token for this mode: Ns   01s    )	bytearraystater>   r?   r&   rJ   rX   joinsplitr'   bytes	maketrans	translate)r   datatotal_bytesrP   tokensr)   invertr   r   r   _decode_bitonal   s    
zPpmPlainDecoder._decode_bitonalc                 C   sz  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rv|  }	|	s|r~t d}	nqv| 	|	}	|r||	 }	|	
 }
|	r|	d	d   s|
 }t||krtd
|d |d   |
D ]}t||krtd
|d |d   t|}||kr2td| t|| | }|| jdkrXt|nt|7 }t||kr qVqqV|S )Nr$   r1      r   r2   r0   F    rU   zToken too long found in data: z'Channel value too large for this mode: )r[   r9   r   getmodebandsr\   r>   r?   r&   rJ   rX   r^   isspacepopr'   r8   roundo32r   )r   r<   rb   max_lenout_byte_countout_maxbandsrc   Z
half_tokenrP   rd   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;8rU   r1   I;32rU   r   )rV   r9   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   
".rH   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 rqt|D ]V}	|dkr||	 nt||	| }
t|t|
| | }
|| jdkrt|
nt|
7 }qqP| jdkrd	n| j}| t|| d
S )NrU      r   r/   r1   rg   r2   r0   rt   ru   )r[   rA   r9   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\}}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   )r.   r   r   )r   r   r1   )r3   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   )r9   OSErrorwritesizer   _save)Zimr   filenamer@   headr   r   r   r   1  s"    








r   r4   r,   z.pbmz.pgmz.ppmz.pnmzimage/x-portable-anymapN) r   r   _binaryr   r{   r   r   rm   r   r5   r   r   Z	PyDecoderrH   ry   r   Zregister_openrF   Zregister_saveZregister_decoderZregister_extensionsZregister_mimer   r   r   r   <module>   s6   ^ 