a :jgB0 @s(ddlmZddlZddlmZddlmZmZddlm Z ddlm Z ddlm Z d Zd d d d d d d dddd d ZdddddZGdddejZGdddejZGdddejZdddd d!d"d#Zeejeeeejeed$eed%eeejgd&eejd'dS)() annotationsN)IO)Image ImageFile)i16be)o8)o32les 1LRGBZCMYKFPRGBA) P1P2P3P4P5P6sP0CMYKPfsPyPsPyRGBAsPyCMYKbytesbool)prefixreturncCs|dddko|ddvS)NrrPs 0123456fy)rrreZdZdZdZddddZddddZd dd d Zd S) PpmImageFileZPPMz Pbmplus imagerrcCsH|jdusJd}tdD](}|jd}|r6|tvr:qD||7}q|S)Nr)fprangeread b_whitespace)selfmagic_crrr _read_magic=s    zPpmImageFile._read_magiccCs|jdusJd}t|dkrj|jd}|s2qjn.|tvrD|sjqqjn|dkr`|jddvrqLq||7}q|s|d}t|n"t|dkrd|}t||S)Nr! r#s z Reached EOF while reading headerzToken too long in file header: )r#lenr%r& ValueErrordecode)r'tokenr*msgrrr _read_tokenIs,     zPpmImageFile._read_tokenNonec Cs|jdusJ|}z t|}Wnty@d}t|Yn0||_|dvrXd|_n|dvrhd|_n|dvrvd|_t|t|f|_ d}|d vrd }|d krd }n|d kr t |}|dkst |sd}t |t||jd<|dkrdnd}|ddf}nt|}d|kr0dks>nd}t ||dkrX|dkrXd|_|}|d kr|dkr|dkrd}n|dkrd}|dkr|n||f}t|d|j|j|g|_dS)Nznot a PPM file)rrzimage/x-portable-bitmap)rrzimage/x-portable-graymap)rrzimage/x-portable-pixmapraw)rrr ppm_plainr 1;Ir gz!scale must be finite and non-zeroscalerF;32FzF;32BFiz1maxval must be greater than 0 and less than 65536r II;16Bppmrr)r#r+MODESKeyError SyntaxError_modeZcustom_mimetypeintr3_sizefloatmathisfiniter/absinfor_TilesizetellZtile) r'Z magic_numbermoder2Z decoder_nameargsr8rawmodemaxvalrrr_openesV        zPpmImageFile._openN)__name__ __module__ __qualname__formatformat_descriptionr+r3rSrrrrr9s  rc@szeZdZUdZded<ddddZddd d d d d Zddd ddZddddZd ddddZ dddddZ dS)PpmPlainDecoderTr_comment_spansrr cCs|jdusJ|jtjS)N)fdr%rZ SAFEBLOCK)r'rrr _read_blockszPpmPlainDecoder._read_blockrrE)blockstartrcCs8|d|}|d|}||dkr.t||St||S)N  r)findminmax)r'r]r^abrrr_find_comment_ends  z!PpmPlainDecoder._find_comment_end)r]rcCs|jr:|r:||}|dkr0||dd}q:q|}qd|_|d}|dkrTq|||}|dkr|d|||dd}q@|d|}d|_qq@|S)Nr:rFr-T)rZrfr\ra)r'r]Z comment_end comment_startrrr_ignore_commentss$     z PpmPlainDecoder._ignore_comments bytearraycCst}|jj|jj}t||kr|}|s0q||}d|}|D]"}|dvrLdt |g}t |qL||d|}qt dd}| |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!)01sInvalid token for this mode: %sNs01s) ristatexsizeysizer.r\rhjoinsplitrr/ maketrans translate)r'data total_bytesr]tokensr1r2invertrrr_decode_bitonals    zPpmPlainDecoder._decode_bitonal)rRrcCst}d}|jdkrdnd}|jdkr*dnd}t|j}|jj|jj||}d}t||kr|} | s|r~td} nq| | } |r|| } d}| } | r| d d s| }t||krd |d|d} t | | D]} t| |krd | d|d} t | t| } | d kr>d | }t || |krZd | }t |t| ||} ||jdkrt| nt| 7}t||krqVqqV|S)Nr,r<rr=r;r! r:s Token too long found in data: %srzChannel value is negative: z'Channel value too large for this mode: )rirOr getmodebandsrlrmrnr.r\rhrpisspacepopr/rEroundo32r)r'rRrsmax_lenout_byte_countout_maxbandsrtZ half_tokenr]rur2r1valueZmsg_strrrr_decode_blockssP          zPpmPlainDecoder._decode_blocks$bytes | Image.SupportsArrayInterfacetuple[int, int]bufferrcCsZd|_|jdkr|}d}n(|jd}||}|jdkr@dn|j}|t||dS)NFr z1;8r:r<I;32r:r)rZrOrwrPr set_as_rawr)r'rrsrQrRrrrr0s   zPpmPlainDecoder.decodeN)r) rTrUrV _pulls_fd__annotations__r\rfrhrwrr0rrrrrYs "3rYc@s eZdZdZdddddZdS) PpmDecoderTrrrc Cs4|jdusJt}|jd}|dkr*dnd}|jdkr|jdvrPd\}}n*|jd krdd \}}nd |jd }t|||d |j|dkr|dn:|dkr|dkr|dq|dn|dkr|d|jd krdnd}t||tdd|jd|d|fgdS)Nr )r7rr )r r)r<zI;16)r>r)r r)r rr )r9rzcannot write mode z as PPMs %d %d rs255 rs65535 rs-1.0 r:rr5r@r)rOOSErrorwriterMr_saverL)rr#rrQheadr2Z row_orderrrrrMs2               rr?r6)z.pbmz.pgmz.ppmz.pnmz.pfmzimage/x-portable-anymap) __future__rrHtypingrrr_binaryrrrr r~r&rArrZ PyDecoderrYrrZ register_openrWZ register_saveZregister_decoderZregister_extensionsZ register_mimerrrrs>     j !"