U
    e_,                     @  s  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
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 )!    )annotations   )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 )Nr   r      Ps   0123456y )prefixr   r   T/var/www/html/StaffProfile/newvenv/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rd|  }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rd| _d}
 qJn
| | _}
q|dkr|}d|  k rd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rd}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_numbermoder+   maxvalZdecoder_nameZixr*   xsizeysizerawmodeargsr   r   r   _open]   sT    
zPpmImageFile._openN)__name__
__module____qualname__formatformat_descriptionr$   r,   rD   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_spansrV   rL   rO   )r    rR   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@   rA   r'   rL   rZ   joinsplitbytesr(   	maketrans	translate)r    datatotal_bytesrR   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rd
|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 qVqqV|S )Nr%   r3      r   r4   r2   F    rW   s    Token too long found in data: %sz'Channel value too large for this mode: )r]   r>   r   getmodebandsr^   r@   rA   r'   rL   rZ   r`   isspacepopr(   r:   roundo32r   )r    r?   rd   max_lenout_byte_countout_maxbandsre   Z
half_tokenrR   rf   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;8rW   r3   I;32rW   r   )rX   r>   rh   rC   ru   
set_as_rawra   )r    bufferrd   rB   r?   r   r   r   r)   
  s    


zPpmPlainDecoder.decodeN)r   )
rE   rF   rG   	_pulls_fdrL   rV   rZ   rh   ru   r)   r   r   r   r   rJ      s   
"0rJ   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 )NrW      r   r1   r3   ri   r4   r2   rv   rw   )r]   rC   r>   r   rk   r'   r^   r@   rA   rK   r   r   i16rP   rn   ro   r   rx   ra   )r    ry   rd   r?   Zin_byte_countrq   rr   rs   ZpixelsrU   rt   rB   r   r   r   r)     s$    
 "zPpmDecoder.decodeN)rE   rF   rG   rz   r)   r   r   r   r   r{     s   r{   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	   )r0   r   r
   )r
   r   r3   )r5   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   filenamerB   headr+   r   r   r   r   5  s$    








r   r6   r.   z.pbmz.pgmz.ppmz.pnmzimage/x-portable-anymapN)
__future__r    r   r   _binaryr   r}   r   r   ro   r   r7   r   r   Z	PyDecoderrJ   r{   r   Zregister_openrH   Zregister_saveZregister_decoderZregister_extensionsZregister_mimer   r   r   r   <module>   s8   _ 