B .^J@sddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Z mZmZmZmZmZeeZedjZdZddd d d d d dddddddddZedZe j Z!de!Z"dZ#dZ$dZ%dZ&dZ'ddZ(dJddZ)GdddZ*Gd d!d!e+Z,Gd"d#d#Z-Gd$d%d%e*Z.d&d'Z/Gd(d)d)e j Z0d*d+d,d-d.d/d0d0d1d2d3d4d5d6d7Z1d8d9Z2Gd:d;d;Z3Gdd?Z5d@dAZ6e2dBfdCdDZ7dEdFZ8e9e0j:e0e/e;e0j:e7ee0j:dIdS)KN)Image ImageChops ImageFile ImagePalette ImageSequence)i8i16bei32beo8o16beo32bes\w\w\w\wsPNG  )1r)LzL;2)rzL;4)rr)IzI;16B)RGBr)rzRGB;16B)PzP;1)rzP;2)rzP;4)rr)LAr)RGBAzLA;16B)rr)rzRGBA;16B))rr)r)r)r)r)rr)rr)r)rr)rr)rr)rr)rr)r)rrs^**$@rcCs&t}||t}|jr"td|S)NzDecompressed Data Too Large)zlib decompressobj decompressMAX_TEXT_CHUNKunconsumed_tail ValueError)sZdobj plaintextr$6/tmp/pip-install-mwhup7aw/Pillow/PIL/PngImagePlugin.py_safe_zlib_decompress`s  r&cCst||d@S)Nl)rcrc32)dataseedr$r$r%_crc32hsr*c@s^eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dddZ dS) ChunkStreamcCs||_g|_dS)N)fpqueue)selfr,r$r$r%__init__qszChunkStream.__init__cCszd}|jr(|j\}}}|j|n*|jd}|dd}|j}t|}t|sptj spt dt ||||fS)z.Fetch a new chunk. Returns header information.Nrrzbroken PNG file (chunk %s)) r-popr,seekreadtelli32is_cidrLOAD_TRUNCATED_IMAGES SyntaxErrorrepr)r.cidposlengthr"r$r$r%r2vs   zChunkStream.readcCs|S)Nr$)r.r$r$r% __enter__szChunkStream.__enter__cGs |dS)N)close)r.argsr$r$r%__exit__szChunkStream.__exit__cCsd|_|_|_dS)N)r-crcr,)r.r$r$r%r=szChunkStream.closecCs|j|||fdS)N)r-append)r.r9r:r;r$r$r%pushszChunkStream.pushcCs*td|||t|d|d||S)z"Call the appropriate chunk handlerzSTREAM %r %s %sZchunk_ascii)loggerdebuggetattrdecode)r.r9r:r;r$r$r%callszChunkStream.callcCstjr*t|dd?d@r*|||dSy6t|t|}t|jd}||kr^td|Wn"t j k rtd|YnXdS)zRead and verify checksumrrNrz+broken PNG file (bad header checksum in %r)z+broken PNG file (incomplete checksum in %r)) rr6rcrc_skipr*r4r,r2r7structerror)r.r9r(Zcrc1Zcrc2r$r$r%r@s zChunkStream.crccCs|jddS)z3Read checksum. Used if the C module is not presentrN)r,r2)r.r9r(r$r$r%rJszChunkStream.crc_skipIENDcCsjg}x`y|\}}}Wntjk r6tdYnX||krBP||t|j|||qW|S)Nztruncated PNG file) r2rKrLOSErrorr@r _safe_readr,rA)r.ZendchunkZcidsr9r:r;r$r$r%verifyszChunkStream.verifyN)rM) __name__ __module__ __qualname__r/r2r<r?r=rBrHr@rJrPr$r$r$r%r+psr+c@seZdZdZedddZdS)iTXtzq Subclass of string to allow iTXt chunks to look like strings while keeping their extra information NcCst||}||_||_|S)z :param cls: the class to use when creating the instance :param text: value for this key :param lang: language code :param tkey: UTF-8 version of the key name )str__new__langtkey)clstextrWrXr.r$r$r%rVs z iTXt.__new__)NN)rQrRrS__doc__ staticmethodrVr$r$r$r%rTsrTc@s4eZdZdZddZddZd dd Zdd d Zd S)PngInfoz< PNG chunk container (for use with save(pnginfo=)) cCs g|_dS)N)chunks)r.r$r$r%r/szPngInfo.__init__cCs|j||fdS)zAppends an arbitrary chunk. Use with caution. :param cid: a byte string, 4 bytes long. :param data: a byte string of the encoded data N)r^rA)r.r9r(r$r$r%addsz PngInfo.addFcCst|ts|dd}t|ts,|dd}t|tsB|dd}t|tsX|dd}|r|d|d|d|dt|n$|d|d|d|d|dS) zAppends an iTXt chunk. :param key: latin-1 encodable text key name :param value: value for this key :param lang: language code :param tkey: UTF-8 version of the key name :param zip: compression flag zlatin-1strictzutf-8siTXtssN) isinstancebytesencoder_rcompress)r.keyvaluerWrXzipr$r$r%add_itxts        &zPngInfo.add_itxtcCst|tr"|j|||j|j|dSt|ts^y|dd}Wn tk r\|j|||dSXt|tst|dd}|r|d|dt |n|d|d|dS) zAppends a text chunk. :param key: latin-1 encodable text key name :param value: value for this key, text or an :py:class:`PIL.PngImagePlugin.iTXt` instance :param zip: compression flag )rizlatin-1raszTXtsstEXtrbN) rcrTrjrWrXrdre UnicodeErrorr_rrf)r.rgrhrir$r$r%add_text s    zPngInfo.add_textN)r`r`F)F)rQrRrSr[r/r_rjrlr$r$r$r%r]s  r]cseZdZfddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*ZZS)+ PngStreamcsRt|i|_i|_d|_d|_d|_d|_d|_d|_ d|_ d|_ d|_ dS)N)rrr) superr/im_infoim_textim_sizeim_modeim_tile im_paletteim_custom_mimetype im_n_frames_seq_num rewind_state text_memory)r.r,) __class__r$r%r/.s zPngStream.__init__cCs*|j|7_|jtkr&td|jdS)Nz7Too much memory used in text chunks: %s>MAX_TEXT_MEMORY)ryMAX_TEXT_MEMORYr!)r.Zchunklenr$r$r%check_text_memory?s  zPngStream.check_text_memorycCs|j|j|jd|_dS)N)infotileseq_num)rocopyrsrwrx)r.r$r$r% save_rewindGszPngStream.save_rewindcCs(|jd|_|jd|_|jd|_dS)Nr}r~r)rxrorsrw)r.r$r$r%rewindNs  zPngStream.rewindcCst|j|}|d}td|d|tdt||t||}|dkr`td|yt||dd}Wn:t k rtj rd}nYnt j k rd}YnX||j d<|S)NrbziCCP profile name %rzCompression method %srz+Unknown compression method %s in iCCP chunkr icc_profile)rrOr,findrDrErr7r&r!r6rrLro)r.r:r;r"i comp_methodrr$r$r% chunk_iCCPSs$     zPngStream.chunk_iCCPcCst|j|}t|t|ddf|_y(tt|dt|df\|_|_Wnt k rdYnXt|dr|d|j d<t|drt d|S) Nrr r interlace zunknown filter category) rrOr,r4rq_MODESrrr im_rawmode Exceptionror7)r.r:r;r"r$r$r% chunk_IHDRps(   zPngStream.chunk_IHDRcCs`d|jkr"d|jd||jfg}n*|jdk r6d|jd<dd|j||jfg}||_||_tdS)NbboxriT default_image)rr)rorrvrqrsZim_idatEOFError)r.r:r;r~r$r$r% chunk_IDATs   zPngStream.chunk_IDATcCstdS)N)r)r.r:r;r$r$r% chunk_IENDszPngStream.chunk_IENDcCs&t|j|}|jdkr"d|f|_|S)Nrr)rrOr,rrrt)r.r:r;r"r$r$r% chunk_PLTEs  zPngStream.chunk_PLTEcCst|j|}|jdkrLt|r@|d}|dkrJ||jd<q||jd<nP|jdkrft||jd<n6|jdkrt|t|ddt|ddf|jd<|S) Nrrbr transparency)rrrrrr) rrOr,rr_simple_palettematchrroi16)r.r:r;r"rr$r$r% chunk_tRNSs       ,zPngStream.chunk_tRNScCs$t|j|}t|d|jd<|S)Ngj@gamma)rrOr,r4ro)r.r:r;r"r$r$r% chunk_gAMAszPngStream.chunk_gAMAcCsBt|j|}tdt|d|}tdd|D|jd<|S)Nz>%dIrcss|]}|dVqdS)gj@Nr$).0eltr$r$r% sz'PngStream.chunk_cHRM..Z chromaticity)rrOr,rKunpacklentuplero)r.r:r;r"Zraw_valsr$r$r% chunk_cHRMszPngStream.chunk_cHRMcCs t|j|}t||jd<|S)NZsrgb)rrOr,rro)r.r:r;r"r$r$r% chunk_sRGBszPngStream.chunk_sRGBcCst|j|}t|t|dd}}t|d}|dkrht|ddt|ddf}||jd<n|dkr~||f|jd<|S) Nrrrg F%u?g?dpirZaspect)rrOr,r4rintro)r.r:r;r"pxpyunitrr$r$r% chunk_pHYss   zPngStream.chunk_pHYscCst|j|}y|dd\}}Wntk r>|}d}YnX|r~|dd}|dd}||j|<|j|<|t ||S)Nrbrzlatin-1rareplace) rrOr,splitr!rGrorpr|r)r.r:r;r"kvr$r$r% chunk_tEXts   zPngStream.chunk_tEXtcCst|j|}y|dd\}}Wntk r>|}d}YnX|rRt|d}nd}|dkrjtd|yt|dd}Wn:tk rtjrd}nYnt j k rd}YnX|r| dd}| dd}||j |<|j |<|t||S) Nrbrrrz+Unknown compression method %s in zTXt chunkzlatin-1rar)rrOr,rr!rr7r&r6rrLrGrorpr|r)r.r:r;r"rrrr$r$r% chunk_zTXts4     zPngStream.chunk_zTXtc Csxt|j|}}y|dd\}}Wntk r:|SXt|dkrL|St|dt|d|dd}}}y|dd\}} } Wntk r|SX|dkr|dkry t| } Wn6tk rtjr|SYnt j k r|SXn|Sy4| dd}| dd}| dd} | dd} Wnt k rH|SXt | || |j|<|j|<|t| |S)Nrbrrrzlatin-1razutf-8)rrOr,rr!rrr&r6rrLrGrkrTrorpr|) r.r:r;rr"rZcfcmrWZtkrr$r$r% chunk_iTXt sB (      zPngStream.chunk_iTXtcCs t|j|}d||jd<|S)NsExifexif)rrOr,ro)r.r:r;r"r$r$r% chunk_eXIf5szPngStream.chunk_eXIfcCsxt|j|}|jdk r,d|_td|St|}|dksD|dkrRtd|S||_t|dd|jd<d|_|S)Nz4Invalid APNG, will use default PNG image if possiblerlrloopz image/apng) rrOr,rvwarningswarnr4roru)r.r:r;r"n_framesr$r$r% chunk_acTL;s   zPngStream.chunk_acTLc CsHt|j|}t|}|jdkr(|dks@|jdk rH|j|dkrHtd||_t|ddt|dd}}t|ddt|dd}}|j\} } ||| ks||| krtd||||||f|jd <t|d dt|d d} } | dkrd } t | t | d |jd<t |d|jd<t |d|jd<|S)Nrrz#APNG contains frame sequence errorsrrrrzAPNG contains invalid framesrdidurationdisposalblend) rrOr,r4rwr7rqrorfloatr) r.r:r;r"seqwidthheightrrZim_wZim_hZ delay_numZ delay_denr$r$r% chunk_fcTLJs&"" " zPngStream.chunk_fcTLcCsFt|jd}t|}|j|dkr,td||_||d|dS)Nrrz#APNG contains frame sequence errors)rrOr,r4rwr7r)r.r:r;r"rr$r$r% chunk_fdAT`s zPngStream.chunk_fdAT)rQrRrSr/r|rrrrrrrrrrrrrrrrrrr __classcell__r$r$)rzr%rm-s*     $)rmcCs|ddtkS)Nr)_MAGIC)prefixr$r$r%_acceptmsrc@szeZdZdZdZddZeddZddZd d Z dd d Z ddZ ddZ ddZ ddZddZddZddZdS) PngImageFileZPNGzPortable network graphicsc Cs|jdtkrtd|j|_d|_t|j|_x~|j\}}}y|j|||}WnFt k rnPYn2t k rt d|||t |j|}YnX|j||q4W|jj|_|jj|_|jj|_d|_|jj|_|jj|_|jjpd|_|jdd|_|jjr,|jj\}}t !|||_"|dkrB|d |_#n||_#|jjdk rd|_$|j%|j#|_&|j'|_(|jr|jd7_|)d|jdk|_*dS) Nrznot a PNG filerz%r %s %s (unknown)rrFsfdATr)+r,r2rr7_PngImageFile__fp_PngImageFile__framermpngrHrAttributeErrorrDrErrOr@rrmoderq_sizeror}_textrsr~ruZcustom_mimetypervrgetrrtrrawpalette_PngImageFile__prepare_idatZ!_close_exclusive_fp_after_loadingr_PngImageFile__rewind_idatr3_PngImageFile__rewind_seek is_animated)r.r9r:r;r"rawmoder(r$r$r%_openzsL             zPngImageFile._opencCsD|jdkr>|jr&|j}||jd||jr>|||jS)Nr)rrrr1rload)r.framer$r$r%rZs  zPngImageFile.textcCsZ|jdkrtd|j|jddd|j|j|jrP|jd|_dS)zVerify PNG fileNz)verify must be called directly after openrrr)r, RuntimeErrorr1r~rrPr=Z _exclusive_fp)r.r$r$r%rPs    zPngImageFile.verifyc Cs||sdS||jkr$|dd|j}xRt|jd|dD]:}y||Wq@tk rx||tdYq@Xq@WdS)NrTrzno more images in APNG file)Z _seek_checkrrrangerr1)r.rZ last_framefr$r$r%r1s    zPngImageFile.seekFc CsV|dkr|rZ|j|j|j|j|_d|_|jr>d|_|jj |_ |jj |_ |j|_ d|_d|_|j dd|_|j d|_|j d|_|j d|_d|_dS||jdkrtd|||j|_ |jrt|j |jd|_d}x|j d y|j\}}}Wntjtfk r6PYnX|d krJtd |d krf|rbtd d}y|j|||Wqt k rPYqtk r|dkr|d 8}|r||_Pt|j |Yqt!k rt"#d|||t|j |YqXqW||_|jj |_ |j d|_|j d|_|j d|_|j sRtdS)NrrFrrrrzcannot seek to frame %drsIENDzNo more images in APNG filesfcTLzAPNG missing frame dataTsfdATz%r %s %s (unknown))$rr1rrrrrimpyaccessror}rsr~r,_prev_imdisposerr dispose_opblend_opdispose_extentrr!rrrOr2rKrLr7rrHUnicodeDecodeErrorrrDrE)r.rrZ frame_startr9r:r;r$r$r%rsx         zPngImageFile._seekcCs|jS)N)r)r.r$r$r%r32szPngImageFile.tellcCs0|jdr|jd|_|j|_tj|dS)z"internal: prepare to read PNG filer)rN)r}rZ decoderconfigr_PngImageFile__idatr load_prepare)r.r$r$r%r5s  zPngImageFile.load_preparecCsx|jdkr|jd|j\}}}|dkrD|j|||dS|dkry|j|||Wntk rtYnX|d|_q||_qW|dkr|j}n t||j}|j||_|j|S)zinternal: read more image datarr)sIDATsDDATsfdATrsfdAT)rr,r2rrBrHrmin)r. read_bytesr9r:r;r$r$r% load_read>s$      zPngImageFile.load_readc Csx|jdy|j\}}}Wntjtfk r@PYnX|dkrNPn&|dkrt|jrtd|_|j|||Py|j |||Wqt k rPYqt k r|dkr|d8}t |j|Yqtk rtd|||t |j|YqXqW|jj|_|js(|jd|_n|jdkrF|jtkrFt|_|jtkrl|j}|||j}n2|jtkrtjd|jd }|||j}nd}|jr|jt kr||j!|j}|j"||j|#d|j|_!|j$rd|_$|j!|_|r|j"||jdS) z%internal: finished reading image datarsIENDsfcTLrsfdATz%r %s %s (unknown)Nr)rrrr)%r,r2rrKrLr7rrrBrHrrrrOrrDrErprr=rrAPNG_DISPOSE_OP_PREVIOUSAPNG_DISPOSE_OP_BACKGROUNDrZ_croprrcorefillsizerAPNG_BLEND_OP_OVERrpasteconvertr)r.r9r:r;rupdatedr$r$r%load_end_s\       zPngImageFile.load_endcCs6d|jkr|d|jkr*d|jkr*dSt|S)NrzRaw profile type exif)r}rdictgetexif)r.r$r$r%_getexifs  zPngImageFile._getexifcCszd|jkr||jdkr&t|_|jd}|dkrhd|jkrhtd|jd ddd}|j||jS)NrzRaw profile type exifr` r) r}rZ_exifrExifrrdfromhexjoinr)r.Z exif_infor$r$r%rs      zPngImageFile.getexifcCsBz4y|j|jkr|jWntk r0YnXWdd|_XdS)N)rr,r=r)r.r$r$r% _close__fps   zPngImageFile._close__fpN)F)rQrRrSformatformat_descriptionrpropertyrZrPr1rr3rrrrrrr$r$r$r%rusA  J !<r)rs)zL;1s)zL;2s)zL;4s)rs)rs)zI;16Bs)zP;1s)zP;2s)zP;4s)rs)rs)rs)rzL;1zL;2zL;4rrrzI;16zP;1zP;2zP;4rrrcGsJd|}|tt||||t|t|}|t|dS)z'Write a PNG chunk (including CRC field)rN)rwriteo32rr*)r,r9r(r@r$r$r%putchunks   r c@seZdZddZddZdS)_idatcCs||_||_dS)N)r,chunk)r.r,r r$r$r%r/sz_idat.__init__cCs||jd|dS)NsIDAT)r r,)r.r(r$r$r%rsz _idat.writeN)rQrRrSr/rr$r$r$r%r sr c@seZdZddZddZdS)_fdatcCs||_||_||_dS)N)r,r r)r.r,r rr$r$r%r/sz_fdat.__init__cCs*||jdt|j||jd7_dS)NsfdATr)r r,rr)r.r(r$r$r%rsz _fdat.writeN)rQrRrSr/rr$r$r$r%r sr cCsr|jd|jd}|jd|jdd}|jd|jdd}|jd|jd}|jd|jd}|rt|jdg} nt|g|jdg} g} d} x.| D]$} xt| D] } | } | j|jkr|jdkr| j |j|j d } n | |j} |j}t |t t fr6|| |d<t |t t frR|| |d<t |t t frn|| |d<| d 7} | r| d }|d d}|d d}|tkrt| d kr|tk|tkr|d}tjd|jd}|d}|r||}n d|j}|||n |tkr.| dd}n|d}t| d| d}|}|s||dkr||dkr|dd}|rd|d kr|d d|7<q||d d<qnd}| | ||dqWqW||dtt| t||r"t|t||dd|jd|fgd}xDt| D]6\}}|d} |dsZd| j}n|d}| |} | j}t t!|d dd}|d dt"}|d dt#}||dt|t|dt|d t|dt|d t$|t$dt%|t%| |d 7}|dkr8|s8t| t||dd| jd|fgn0t&|||}t| |dd| jd|fg|j'}q2WdS)NrrrrrrZ append_imagesr)rr encoderinforrr)rrrrr)rrr)rrrsacTLrisfcTLi)(rrr} itertoolschainrIteratorrrrrrclistrrrrrrrrZcroprrZsubtract_moduloZgetbboxrArr_saver  enumeraterroundAPNG_DISPOSE_OP_NONEAPNG_BLEND_OP_SOURCEo16r r r)rr,r rrrrrrrZ im_framesZ frame_countZim_seqZim_framerpreviousZ prev_disposalZ prev_blendZbase_imrrdeltarrZ frame_datarZ fdat_chunksr$r$r%_write_multiple_framess            $         rcCst|||dddS)NT)save_all)r)rr,filenamer$r$r% _save_allosrFc Cs|j}|dkrd|jkr(d|jd>}n.|jrRttt|jdddd}nd}|dkrdd}n |dkrrd}n|dkrd}nd }|d krd ||f}|jd d |jd d|jdd|jddf|_yt |\}}Wn t k rt d|YnX| t ||dt|jdt|jd|ddddddddg} |jd|jd} | rd} | dt| } ||d| | d|jd} | rd d!d"d#g}xL| jD]B\}} || kr| ||||| n||kr|||| qW|jdkrLd|d}|jd$d|}xt||kr>|d7}q$W||d%||jd&|jd&d}|st|dkrX|jdkrd|}t|tr||d'|d|n0tdtd(|}d)|d}||d'|d|nz|jd*kr tdtd+|}||d't|nL|jd$krB|\}}}||d't|t|t|nd&|jkrt d,nF|jdkr|jd-kr|jd-d.}d|}||d'|d||jd/}|r||d0tt|dd1d2tt|dd1d2d3| r,d4d5g} x4| jD]*\}} || kr| ||||| qW|jd6|jd6}|rt|tjr`|d }|d7rx|d8d}||d9||rt ||||n$t!"|t#||d:d;|jd|fg||dNrbitsrrrrrrz%s;%doptimizeFZcompress_levelr  compress_type dictionaryrzcannot write mode %s as PNGsIHDRrrbscHRMsgAMAssBITssRGBstIMErs ICC ProfilessiCCPZpnginfossPLTsiTXtstEXtszTXtrsPLTErstRNS)rrriz%cannot use transparency for this moderArspHYsg F%u?g?sbKGDshISTrsExifrseXIfri)rrsIENDflush)&rrrmaxrrZgetdatarZ encoderconfig _OUTMODESKeyErrorrNrrrrr}rrfremover^rZ getpalettercrdrZgetpalettemoderrrtobytes startswithrrrr hasattrr))rr,rr rrcolorsr rr^Ziccnamer(r}Zchunks_multiple_allowedr9Zpalette_byte_numberZ palette_bytesrZ alpha_bytesalphaZredZgreenZbluerrr$r$r%rss $                       "         $  rcKsBGddd}dd}|}z||_t||d|Wd|`X|jS)z4Return a list of PNG chunks representing this image.c@s eZdZgZddZddZdS)zgetchunks..collectorcSsdS)Nr$)r.r(r$r$r%rsz"getchunks..collector.writecSs|j|dS)N)r(rA)r.r r$r$r%rA sz#getchunks..collector.appendN)rQrRrSr(rrAr$r$r$r% collectorsr4cWs0d|}tt|t|}||||fdS)Nr)rrr*rA)r,r9r(r@r$r$r%rA#s zgetchunks..appendN)rrr()rparamsr4rAr,r$r$r% getchunkss r6z.pngz.apngz image/png)r)?rloggingrerKrrr`rrrrr_binaryrr rr r4r r rr r getLoggerrQrDcompilerr5rrrZ SAFEBLOCKrr{rrrrrr&r*r+rUrTr]rmrrr+r r r rrrr6Z register_openrZ register_saveZregister_save_allZregister_extensionsZ register_mimer$r$r$r%"s     XOBM   {%