U
    ڲg/                     @  s.  d dl mZ d dlZd dlmZ 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dZddd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dd d!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)d*g eejd+ dS ),    )annotationsN)IO   )Image	ImageFile)i16be)o8)o32les    	
1LRGBZCMYKFPRGBA)   P1   P2   P3   P4   P5   P6s   P0CMYK   Pfs   PyPs   PyRGBAs   PyCMYKbytesbool)prefixreturnc                 C  s   | dd dko| d dkS )Nr   r      Ps	   0123456fy )r   r   r   6/tmp/pip-unpacked-wheel-xela2va7/PIL/PpmImagePlugin.py_accept1   s    r   c                   @  s>   e Zd ZdZdZddddZddddZd	dd
dZdS )PpmImageFileZPPMzPbmplus imager   r   c                 C  sH   | j d k	std}tdD ](}| j d}|r6|tkr: qD||7 }q|S )N       r   )fpAssertionErrorrangereadb_whitespace)selfmagic_cr   r   r   _read_magic=   s    
zPpmImageFile._read_magicc                 C  s   | j d k	std}t|dkrj| j d}|s2qjn.|tkrD|sjqqjn|dkr`| j ddkrqLq||7 }q|s|d}t|n"t|dkrd|  }t||S )Nr!   
   r      #s   
z Reached EOF while reading headerzToken too long in file header: )r#   r$   lenr&   r'   
ValueErrordecode)r(   tokenr+   msgr   r   r   _read_tokenI   s,    

zPpmImageFile._read_tokenNonec           	      C  s  | j d k	st|  }zt| }W n  tk
rB   d}t|Y nX || _|dkrZd| _n|dkrjd| _n|dkrxd| _t| 	 t| 	 f| _
d}|d	krd
}|dkrd}n|dkrt| 	 }|dkst|sd}t|t|| jd< |dk rdnd}|ddf}nt| 	 }d|  k r2dk s@n d}t||dkrZ|dkrZd| _|}|d
kr|dkr|dkrd}n|dkrd}|dkr|n||f}|d| j | 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_plainr
   1;Ir   g        z!scale must be finite and non-zeroscaler   F;32FzF;32BFi   z1maxval must be greater than 0 and less than 65536   r   I  I;16Bppmr   r   )r#   r$   r,   MODESKeyErrorSyntaxError_modeZcustom_mimetypeintr4   _sizefloatmathisfiniter0   absinfosizetellZtile)	r(   Zmagic_numbermoder3   Zdecoder_nameargsr9   rawmodemaxvalr   r   r   _opene   sT    


zPpmImageFile._openN)__name__
__module____qualname__formatformat_descriptionr,   r4   rS   r   r   r   r   r   9   s
   r   c                   @  sz   e Zd ZU dZded< ddddZddd	d	d
ddZdddddZddddZd	ddddZ	dddddZ
dS )PpmPlainDecoderTr   _comment_spansr   r    c                 C  s   | j d k	st| j tjS )N)fdr$   r&   r   Z	SAFEBLOCK)r(   r   r   r   _read_block   s    zPpmPlainDecoder._read_blockr   rF   )blockstartr   c                 C  s8   | d|}| d|}|| dkr.t||S t||S )N   
   r   )findminmax)r(   r]   r^   abr   r   r   _find_comment_end   s    z!PpmPlainDecoder._find_comment_end)r]   r   c                 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;   r   Fr.   T)rZ   rf   r\   ra   )r(   r]   Zcomment_endcomment_startr   r   r   _ignore_comments   s$    


z PpmPlainDecoder._ignore_comments	bytearrayc                 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    )ri   statexsizeysizer/   r\   rh   joinsplitr   r0   	maketrans	translate)r(   datatotal_bytesr]   tokensr2   r3   invertr   r   r   _decode_bitonal   s    

zPpmPlainDecoder._decode_bitonal)rR   r   c                 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rd
|d |d   }t||
D ]}t||krd
|d |d   }t|t|}|dk r>d| }t|||krZd| }t|t|| | }|| jdkrt|nt|7 }t||kr qVqqV|S )Nr-   r=      r   r>   r<   r!       r;   s    Token too long found in data: %sr   zChannel value is negative: z'Channel value too large for this mode: )ri   rO   r   getmodebandsrl   rm   rn   r/   r\   rh   rp   isspacepopr0   rF   roundo32r   )r(   rR   rs   max_lenout_byte_countout_maxbandsrt   Z
half_tokenr]   ru   r3   r2   valueZmsg_strr   r   r   _decode_blocks   sP    





 zPpmPlainDecoder._decode_blockstuple[int, int]bufferr   c                 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;   r=   I;32r;   r   )rZ   rO   rw   rP   r   
set_as_rawr   )r(   r   rs   rQ   rR   r   r   r   r1     s    


zPpmPlainDecoder.decodeN)r   )rT   rU   rV   	_pulls_fd__annotations__r\   rf   rh   rw   r   r1   r   r   r   r   rY      s   
"3rY   c                   @  s    e Zd ZdZdddddZdS )
PpmDecoderTr   r   r   c                 C  s4  | j d k	stt }| jd }|dk r*dnd}| jdkr<dnd}| jdkrNdnd}t| j}| jj| jj	 | | }t
||k r
| j || }	t
|	|| k rq
t|D ]V}
|dkr|	|
 nt|	|
| }t|t|| | }|| jdkrt|nt|7 }qqv| jdkrd	n| j}| t|| d
S )Nr;      r      r=   rx   r>   r<   r   r   )r[   r$   ri   rP   rO   r   rz   rl   rm   rn   r/   r&   r%   i16rb   r}   r~   r   r   r   )r(   r   rs   rR   Zin_byte_countr   r   r   Zdest_lengthZpixelsre   r   rQ   r   r   r   r1   -  s(    
"zPpmDecoder.decodeN)rT   rU   rV   r   r1   r   r   r   r   r   *  s   r   zImage.Imagez	IO[bytes]zstr | bytesr5   )imr#   filenamer   c              
   C  s  | j dkrd\}}nf| j dkr(d\}}nR| j dkr<d\}}n>| j dkrPd\}}n*| j d	krdd
\}}nd| j  d}t|||d| j   |dkr|d n:|dkr|dkr|d q|d n|dkr|d | j d	krdnd}t| |dd| j d|d|ffg d S )Nr
   )r8   r   r   )r   r   r=   )r?   r   )r   r   )r   r   r   )r:   r   zcannot write mode z as PPMs   
%d %d
r   s   255
r   s   65535
r   s   -1.0
r;   r   r6   rA   r   )rO   OSErrorwriterM   r   _save)r   r#   r   rQ   headr3   Z	row_orderr   r   r   r   K  s.    










r   r@   r7   z.pbmz.pgmz.ppmz.pnmz.pfmzimage/x-portable-anymap)
__future__r   rI   typingr    r   r   _binaryr   r   r   r	   r~   r'   rB   r   r   Z	PyDecoderrY   r   r   Zregister_openrW   Zregister_saveZregister_decoderZregister_extensionsZregister_mimer   r   r   r   <module>   s>   h 
! 