o
    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g d eejd dS )    )annotations   )Image	ImageFile)i16be)o8)o32les    	
1LRGBCMYKPRGBA)
   P1   P2   P3   P4   P5   P6s   P0CMYKs   PyPs   PyRGBAs   PyCMYKc                 C  s   | dd dko| d dv S )Nr   r      Ps   0123456y )prefixr   r   E/var/www/html/venv/lib/python3.10/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 )
PpmImageFile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_magic9   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|sAd}t|t |dkrRd|  }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y   d}t|w |dv r d| _n|dv r(d| _n|dv r/d| _d }d}|d	v r9d
}tdD ]]}t|  }|dkrL|}q=|dkrc|}	|dkr]d| _d}
 n>| | _}
q=|dkr|}d|  k rsdk szn d}t	||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SyntaxErrorcustom_mimetyper   intr.   _moder*   _sizer   telltile)r"   magic_numbermoder-   maxvaldecoder_nameixr,   xsizeysizerawmodeargsr   r   r   _open]   sX   
"zPpmImageFile._openN)__name__
__module____qualname__formatformat_descriptionr&   r.   rK   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   	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_spansr^   rT   rW   )r"   rZ   comment_endcomment_startr   r   r   _ignore_comments   s,   

z PpmPlainDecoder._ignore_commentsc                 C  s   t  }| jj| jj }t||krF|  }|sn.| |}d| }|D ]}|dvr7dt	|g }t
|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   s   Invalid token for this mode: %sNs   01s    )	bytearraystaterG   rH   r)   rT   rc   joinsplitbytesr*   	maketrans	translate)r"   datatotal_bytesrZ   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|  }	|	sA|r>t d}	n	 |S | 	|	}	|rN||	 }	d}|	
 }
|	rt|	d	d   st|
 }t||krtd
|d |d   }t||
D ]F}t||krd
|d |d   }t|t|}||krd| }t|t|| | }|| jdkrt|nt|7 }t||kr nqvt||ks1|S )Nr'   r5      r   r6   r4   F    r_   s    Token too long found in data: %sz'Channel value too large for this mode: )rf   rC   r   getmodebandsrg   rG   rH   r)   rT   rc   ri   isspacepopr*   r=   roundo32r   )r"   rD   rm   max_lenout_byte_countout_maxbandsrn   
half_tokenrZ   ro   r-   r,   valuer   r   r   _decode_blocks   sP   


%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;8r_   r5   I;32r_   r   )r`   rC   rq   rJ   r   
set_as_rawrj   )r"   bufferrm   rI   rD   r   r   r   r+   
  s   


zPpmPlainDecoder.decodeN)r   )
rL   rM   rN   	_pulls_fdrT   r^   rc   rq   r   r+   r   r   r   r   rQ      s    
"0rQ   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 )Nr_      r   r3   r5   rr   r6   r4   r   r   )rf   rJ   rC   r   rt   r)   rg   rG   rH   rR   r    r   i16rX   rw   rx   r   r   rj   )r"   r   rm   rD   in_byte_countrz   r{   r|   pixelsr]   r~   rI   r   r   r   r+     s&   
   zPpmDecoder.decodeN)rL   rM   rN   r   r+   r   r   r   r   r     s    r   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d	| j  d
}t|||d| j   |dkrG|d n|dkrZ|dkrU|d n|d t| |dd| j d|ddffg d S )Nr	   )r2   r   r
   )r
   r   r5   )r7   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   )rC   OSErrorwritesizer   _save)imr   filenamerI   headr-   r   r   r   r   5  s$   








(r   r8   r0   )z.pbmz.pgmz.ppmz.pnmzimage/x-portable-anymapN)
__future__r    r   r   _binaryr   r   r   r   rx   r!   r9   r   r   	PyDecoderrQ   r   r   register_openrO   register_saveregister_decoderregister_extensionsregister_mimer   r   r   r   <module>   s:   _ 