
    e_,                    &   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 Z G d dej                        Z G d dej                        Z G d dej                        Zd Z ej&                  ej(                  ee        ej*                  ej(                  e        ej,                  de        ej,                  de        ej.                  ej(                  g d        ej0                  ej(                  d       y)    )annotations   )Image	ImageFile)i16be)o8)o32les    	
1LRGBCMYKPRGBA)
   P1   P2   P3   P4   P5   P6s   P0CMYKs   PyPs   PyRGBAs   PyCMYKc                $    | dd dk(  xr | d   dv S )Nr   r      Ps   0123456y )prefixs    4/usr/lib/python3/dist-packages/PIL/PpmImagePlugin.py_acceptr   -   s!    !A;$;6!9#;;    c                  &    e Zd ZdZdZd Zd Zd Zy)PpmImageFilePPMzPbmplus imagec                    d}t        d      D ]/  }| j                  j                  d      }|r|t        v r |S ||z  }1 |S )Nr      r   )rangefpreadb_whitespace)selfmagic_cs       r   _read_magiczPpmImageFile._read_magic9   sO    q 	AQA\) QJE		
 r   c                   d}t        |      dk  r| j                  j                  d      }|snb|t        v r|s7nV|dk(  r=| j                  j                  d      dvr	 | j                  j                  d      dvrz||z  }t        |      dk  r|sd}t	        |      t        |      dkD  rd|j                          }t	        |      |S )Nr   
   r      #s   
z Reached EOF while reading headerzToken too long in file header: )lenr#   r$   r%   
ValueErrordecode)r&   tokenr)   msgs       r   _read_tokenzPpmImageFile._read_tokenC   s    %jBQAl"dggll1oW4 ggll1oW4QJE %jB 4CS/!Z"_3ELLN3CDCS/!r   c                   | j                         }	 t        |   }|dv rd| _        n|dv rd| _        n|dv rd| _        d }d}|d	v rd
}t        d      D ]  }t        | j                               }|dk(  r|}$|dk(  r|}	|dk(  rd| _        d}
 nZ|x| _        }
E|dk(  sK|}d|cxk  rdk  sn d}t        |      |dkD  r|dk(  rd| _        |d
k7  s~|dk(  r|dk(  rd}
|dk7  sd} |dk(  r
ddfn
|f}	f| _
        |dd||	f| j                  j                         |fg| _        y # t        $ r d}t        |      w xY w)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"   intr3   _moder/   _sizer#   telltile)r&   magic_numbermoder2   maxvaldecoder_nameixr1   xsizeysizerawmodeargss               r   _openzPpmImageFile._open]   s   '')	#&D
 >)#<D ^+#=D ^+#<D 00&L( 	-B((*+EQwq3;!$DJ#G+//DJq6)E)MC$S/)C<DCK!$DJ;.43;")3',3	-6 #/%"7Agv=NE\
"Q5%$8$'',,.$OP	Y  	#"Cc""	#s   	D( (D?N)__name__
__module____qualname__formatformat_descriptionr*   r3   rQ   r   r   r   r   r   5   s    F(40Qr   r   c                  6    e Zd ZdZd Zd	dZd Zd Zd Zd Z	y)
PpmPlainDecoderTc                T    | j                   j                  t        j                        S )N)fdr$   r   	SAFEBLOCK)r&   s    r   _read_blockzPpmPlainDecoder._read_block   s    ww||I//00r   c                    |j                  d|      }|j                  d|      }||z  dkD  rt        ||      S t        ||      S )N   
   r   )findminmax)r&   blockstartabs        r   _find_comment_endz!PpmPlainDecoder._find_comment_end   sC    JJue$JJue$EAIs1ay43q!94r   c                0   | j                   r4|r2| j                  |      }|dk7  r	||dz   d  }n| j                         }|r2d| _         	 |j                  d      }|dk(  r	 |S | j                  ||      }|dk7  r|d | ||dz   d  z   }n|d | }d| _         	 |S O)Nr   FTr-   )_comment_spansrg   r\   r`   )r&   rc   comment_endcomment_starts       r   _ignore_commentsz PpmPlainDecoder._ignore_comments   s    "44U;"$ "+/"34E !,,.E  $!JJt,M"  00FKb  n}-kAo6G0HH n}-&*# r   c                   t               }| j                  j                  | j                  j                  z  }t	        |      |k7  r| j                         }|snl| j                  |      }dj                  |j                               }|D ]   }|dvsdt        |g      z  }t        |       ||z   d| }t	        |      |k7  rt        j                  dd      }|j                  |      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staterM   rN   r.   r\   rm   joinsplitbytesr/   	maketrans	translate)r&   datatotal_bytesrc   tokensr1   r2   inverts           r   _decode_bitonalzPpmPlainDecoder._decode_bitonal   s    
 {jj&&)9)99$i;&$$&E))%0EXXekkm,F *(<ueW~MC$S/)* 6M<K0D $i;& 4~~f%%r   c                   t               }d}| j                  dk(  rdnd}| j                  dk(  rdnd}t        j                  | j                        }| j                  j
                  | j                  j                  z  |z  |z  }d}t        |      |k7  r:| j                         }	|	s|rt        d      }	n	 |S | j                  |	      }	|r||	z   }	d}|	j                         }
|	rG|	d	d  j                         s4|
j                         }t        |      |kD  rd
|d |dz    z  }t        |      |
D ]  }t        |      |kD  rd
|d |dz    z  }t        |      t        |      }||kD  rd| }t        |      t        ||z  |z        }|| j                  dk(  rt!        |      n
t#        |      z  }t        |      |k(  s n t        |      |k7  r:|S )Nr,   r;      r   r<   r:   F    ri   s    Token too long found in data: %sz'Channel value too large for this mode: )rq   rI   r   getmodebandsrr   rM   rN   r.   r\   rm   rt   isspacepopr/   rC   roundo32r   )r&   rJ   rx   max_lenout_byte_countout_maxbandsry   
half_tokenrc   rz   r2   r1   values                 r   _decode_blockszPpmPlainDecoder._decode_blocks   s   {"ii3.A99+%""499-jj&&)9)99EANR
$i;&$$&E%dOE < 9 ))%0E"U*"
[[]FU23Z//1#ZZ\
z?W,;j7UV;>WW  %S/) u:'=mRS@TTC$S/)E
6>CE7KC$S/)efnw67dii3&6E
BuIEt9+3 $i;&J r   c                   d| _         | j                  dk(  r| j                         }d}n=| j                  d   }| j	                  |      }| j                  dk(  rdn| j                  }| j                  t        |      |       y)NFr
   z1;8ri   r;   I;32ri   r   )rj   rI   r|   rP   r   
set_as_rawru   )r&   bufferrx   rO   rJ   s        r   r0   zPpmPlainDecoder.decode
  sq    #99'')DGYYr]F&&v.D $		S 0fdiiGdW-r   N)r   )
rR   rS   rT   	_pulls_fdr\   rg   rm   r|   r   r0   r   r   r   rX   rX      s'    I15
 D&2.`
r   rX   c                      e Zd ZdZd Zy)
PpmDecoderTc                x   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                        }t        |      | j                  j                  | j                  j                  z  |z  |z  k  r| j                  j                  ||z        }t        |      ||z  k  rnt        |      D ]^  }	|dk(  r||	   nt        ||	|z        }
t        |t        |
|z  |z              }
|| j                  dk(  rt        |
      n
t!        |
      z  }` t        |      | j                  j                  | j                  j                  z  |z  |z  k  r| j                  dk(  rd	n| j                  }| j#                  t%        |      |       y
)Nri      r   r9   r;   r~   r<   r:   r   r   )rq   rP   rI   r   r   r.   rr   rM   rN   rZ   r$   r"   i16ra   r   r   r   r   ru   )r&   r   rx   rJ   in_byte_countr   r   r   pixelsrf   r   rO   s               r   r0   zPpmDecoder.decode  s   {2#c\q"ii3.A99+%""499-$i$****TZZ-=-==EVVWW\\-%"78F6{]U225\ F!.!!3F1IVQEV9W  GU56>G+C%DEdii3&6E
BuIEF $i$****TZZ-=-==EVV !II,&$))dW-r   N)rR   rS   rT   r   r0   r   r   r   r   r     s    Ir   r   c           
        | j                   dk(  rd\  }}nY| j                   dk(  rd\  }}nD| j                   dk(  rd\  }}n/| j                   dv rd\  }}nd	| j                    d
}t        |      |j                  |d| j                  z  z          |dk(  r|j                  d       n-|dk(  r(|dk(  r|j                  d       n|j                  d       t	        j
                  | |dd| j                  z   d|ddffg       y )Nr
   )r8   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
r5   )r   r   r   r   )rI   OSErrorwritesizer   _save)imr#   filenamerO   headr2   s         r   r   r   5  s    	ww#~$	C"	C&	O	#$"277)73clHHTL277**+u}
	c>HHXHHZ OOBeVbgg%5q7Aq/JKLr   r>   r6   )z.pbmz.pgmz.ppmz.pnmzimage/x-portable-anymapN)
__future__r    r   r   _binaryr   r   r   r	   r   r%   r?   r   r   	PyDecoderrX   r   r   register_openrU   register_saveregister_decoderregister_extensionsregister_mimer   r   r   <module>r      s    #  !  !
 + 	"<XQ9&& XQ~@i)) @F$$ <M6   L''w ?   L'' /   uj )   {O 4   ,--/O P   L'')B Cr   