o
     hR0                     @  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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&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 )-    )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prefixbytesreturnboolc                 C  s   |  do
| d dv S )N   Pr   s	   0123456fy)
startswith)r    r   X/home/www/facesmatcher.com/frenv_anti/lib/python3.10/site-packages/PIL/PpmImagePlugin.py_accept1   s   r   c                   @  s2   e Zd ZdZdZdddZdddZdd
dZdS )PpmImageFileZPPMzPbmplus imager   r   c                 C  sJ   | j d usJ d}tdD ]}| j d}|r|tv r |S ||7 }q|S )N       r   )fprangereadb_whitespace)selfmagic_cr   r   r   _read_magic=   s   
zPpmImageFile._read_magicc                 C  s   | j d usJ d}t|dkr@| j d}|sq@|tv r |sq	q@|dkr6| j ddvr5	 | j ddvs,q	||7 }t|dks|sHd}t|t|dkrVd| }t||S )Nr!   
   r      #s   
z Reached EOF while reading headers!   Token too long in file header: %s)r#   lenr%   r&   
ValueError)r'   tokenr*   msgZmsg_too_longr   r   r   _read_tokenI   s0   zPpmImageFile._read_tokenNonec           	      C  s  | j d usJ |  }zt| }W n ty   d}t|w || _|dv r*d| _n|dv r2d| _n|dv r9d| _t|  t|  f| _	d}|d	v rNd
}|dkrUd}nq|dkrt
|  }|dksht|snd}t|t|| jd< |dk r{dnd}|ddf}nCt|  }d|  k rdk sn d}t||dkr|dkrd| _|}|d
kr|dkr|dkrd}n|dkrd}|dkr|n||f}t|d| j | j  |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+   MODESKeyErrorSyntaxError_modeZcustom_mimetypeintr2   _sizefloatmathisfiniter/   absinfor   _TilesizetellZtile)	r'   Zmagic_numbermoder1   Zdecoder_nameargsr7   rawmodemaxvalr   r   r   _opene   sX   
zPpmImageFile._openNr   r   )r   r3   )__name__
__module____qualname__formatformat_descriptionr+   r2   rR   r   r   r   r   r    9   s    

r    c                   @  sX   e Zd ZU dZded< dddZddddZdddZd ddZd!ddZ	d"ddZ
dS )#PpmPlainDecoderTr   _comment_spansr   r   c                 C  s   | j d usJ | j tjS )N)fdr%   r   Z	SAFEBLOCK)r'   r   r   r   _read_block   s   zPpmPlainDecoder._read_blockr   blockstartrD   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_endc                 C  s   | j r|r| |}|dkr||d d  }q|  }|sd| _ 	 |d}|dkr-	 |S | ||}|dkrF|d | ||d d   }n|d | }d| _ 	 |S q!)Nr9   r   FTr-   )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rF|  }|sqF| |}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    )ri   statexsizeysizer.   r\   rh   joinsplitr   r/   	maketrans	translate)r'   datatotal_bytesr]   tokensr0   r1   invertr   r   r   _decode_bitonal   s"   

zPpmPlainDecoder._decode_bitonalrQ   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|  }	|	sA|r>t d}	n	 |S | 	|	}	|rN||	 }	d}|	
 }
|	rt|	d	d   st|
 }t||krtd
|d |d   }t||
D ]S}t||krd
|d |d   }t|t|}|dk rd| }t|||krd| }t|t|| | }|| jdkrt|nt|7 }t||kr qqvt||ks1|S )Nr,   r;      r   r<   r:   r!       r9   s    Token too long found in data: %sr   zChannel value is negative: z'Channel value too large for this mode: )ri   rN   r   getmodebandsrl   rm   rn   r.   r\   rh   rp   isspacepopr/   rD   roundo32r   )r'   rQ   rs   max_lenout_byte_countout_maxbandsrt   Z
half_tokenr]   ru   r1   r0   valueZmsg_strr   r   r   _decode_blocks   sV   
!


(zPpmPlainDecoder._decode_blocksbuffer$bytes | Image.SupportsArrayInterfacetuple[int, int]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;8r9   r;   I;32r9   r   )rZ   rN   rw   rO   r   
set_as_rawr   )r'   r   rs   rP   rQ   r   r   r   decode  s   


zPpmPlainDecoder.decodeNrS   )r   )r]   r   r^   rD   r   rD   )r]   r   r   r   )r   ri   )rQ   rD   r   ri   r   r   r   r   )rT   rU   rV   	_pulls_fd__annotations__r\   rf   rh   rw   r   r   r   r   r   r   rY      s   
 


"
3rY   c                   @  s   e Zd ZdZd	ddZdS )

PpmDecoderTr   r   r   r   c                 C  s8  | j d usJ 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}| jj| jj | | }t	||k r| j 
|| }	t	|	|| k rRqt|D ]+}
|dkr`|	|
 nt|	|
| }t|t|| | }|| jdkr|t|nt|7 }qVt	||k sA| jdkrd	n| j}| t|| d
S )Nr9      r      r;   rx   r<   r:   r   r   )r[   ri   rO   rN   r   rz   rl   rm   rn   r.   r%   r$   i16rb   r}   r~   r   r   r   )r'   r   rs   rQ   Zin_byte_countr   r   r   Zdest_lengthZpixelsre   r   rP   r   r   r   r   /  s*   
 zPpmDecoder.decodeNr   )rT   rU   rV   r   r   r   r   r   r   r   ,  s    r   imImage.Imager#   	IO[bytes]filenamestr | bytesr3   c                 C  s  | j dkr
d\}}n3| j dkrd\}}n)| j dv rd\}}n| j dv r(d\}}n| j d	kr2d
\}}nd| j  d}t|||d| j   |dkrQ|d n|dkre|dkr_|d qn|d n	|dkrn|d | j d	krudnd}t| |tdd| j d|d|fg d S )Nr
   )r6   r   r   )r   r   )r;   zI;16)r=   r   )r   r   )r   r   r   )r8   r   zcannot write mode z as PPMs   
%d %d
r   s   255
r   s   65535
r   s   -1.0
r9   r   r4   r?   r   )rN   OSErrorwriterL   r   _saverK   )r   r#   r   rP   headr1   Z	row_orderr   r   r   r   M  s2   










 r   r>   r5   )z.pbmz.pgmz.ppmz.pnmz.pfmzimage/x-portable-anymap)r   r   r   r   )r   r   r#   r   r   r   r   r3   )
__future__r   rG   typingr    r   r   _binaryr   r   r   r	   r~   r&   r@   r   r    Z	PyDecoderrY   r   r   Zregister_openrW   Zregister_saveZregister_decoderZregister_extensionsZregister_mimer   r   r   r   <module>   s@   
j 

!"