o
    e -                     @   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g d 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v S )N    r      Ps   0123456y )prefixr   r   BD:\Projects\ConvertPro\env\Lib\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v r |S ||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r9| jd}|sn(|tv r|sqn |dkr/| jddvr.	 | jddvs%q||7 }t |dks|s?tdt |dkrNt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   sz  |   }zt| }W n ty   tdw |dv rd| _n|dv r&d| _n|dv r-d| _d }d}|d	v r7d
}tdD ]^}t|  }|dkrJ|}q;|dkra|}|dkr[d| _d}	 n?| | _}	q;|dkr|}d|  k rtdk syt	d t	d|dkr|dkrd| _|d
kr|dkr|dkrd}	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_numberr9   maxvalZdecoder_nameZixr)   xsizeysizerawmodeargsr   r   r   _open\   s`   
"zPpmImageFile._openN)__name__
__module____qualname__formatformat_descriptionr#   r*   rA   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r||d d  }n|  }|sd| _ 	 |d}|dkr-	 |S | ||}|dkrF|d | ||d d   }n|d | }d| _ 	 |S q!)Nr   FTr%   )_comment_spansrS   rI   rL   )r   rO   Zcomment_endcomment_startr   r   r   _ignore_comments   s,   

z PpmPlainDecoder._ignore_commentsc                 C   s   t  }| jj| jj }t||krE|  }|sn-| |}d| }|D ]}|dvr6t	dt
|g q&|| d| }t||ks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&   rI   rW   joinsplitr'   bytes	maketrans	translate)r   datatotal_bytesrO   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}t||kr|  }	|	sA|r>t d}	n	 |S | 	|	}	|rL||	 }	|	
 }
|	rq|	d	d   sq|
 }t||krqtd
|d |d   |
D ]C}t||krtd
|d |d   t|}||krtd| t|| | }|| jdkrt|nt|7 }t||kr nqst||ks1|S )Nr$   r1      r   r2   r0   F    rT   zToken too long found in data: z'Channel value too large for this mode: )rZ   r9   r   getmodebandsr[   r=   r>   r&   rI   rW   r]   isspacepopr'   r8   roundo32r   )r   r<   ra   max_lenout_byte_countout_maxbandsrb   Z
half_tokenrO   rc   r)   valuer   r   r   _decode_blocks   sN   

#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;8rT   r1   I;32rT   r   )rU   r9   re   r@   rr   
set_as_rawr^   )r   bufferra   r?   r<   r   r   r   r(     s   


zPpmPlainDecoder.decodeN)r   )
rB   rC   rD   	_pulls_fdrI   rS   rW   re   rr   r(   r   r   r   r   rG      s    
".rG   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 rIn@t|D ]+}	|dkrW||	 nt||	| }
t|t|
| | }
|| jdkrst|
nt|
7 }qMt|| jj| jj | | k s8| jdkrd	n| j}| t|| d
S )NrT      r   r/   r1   rf   r2   r0   rs   rt   )rZ   r@   r9   r   rh   r&   r[   r=   r>   rH   r   r   i16rM   rk   rl   r   ru   r^   )r   rv   ra   r<   Zin_byte_countrn   ro   rp   ZpixelsrR   rq   r?   r   r   r   r(     s&   
   zPpmDecoder.decodeN)rB   rC   rD   rw   r(   r   r   r   r   rx     s    rx   c              
   C   s   | j dkr
d\}}n'| j dkrd\}}n| j dkrd\}}n| j dv r(d\}}n	td	| j  d
||d| j   |dkrE|d n|dkrX|dkrS|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   rz   r   r   rl   r   r5   r   r   Z	PyDecoderrG   rx   r~   Zregister_openrE   Zregister_saveZregister_decoderZregister_extensionsZregister_mimer   r   r   r   <module>   s8   ^ 