3 }\Lm@sddlZddlZddlZddlZddlmZmZmZddlm Z m Z m Z mZmZddlmZdZejeZejdjZdZdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgiZejdZejZd eZ d!d"Z!dhd#d$Z"Gd%d&d&e#Z$Gd'd(d(e%Z&Gd)d*d*e#Z'Gd+d,d,e$Z(d-d.Z)Gd/d0d0ejZ*didjdkdldmdndodpdqdrdsdtdudvd>Z+d?d@Z,GdAdBdBe#Z-e,fdCdDZ.dEdFZ/ej0e*j1e*e)ej2e*j1e.ej3e*j1dGdHgej4e*j1dIdS)wN)Image ImageFile ImagePalette)i8i16bei32beo16beo32be)py3z0.9s\w\w\w\wsPNG  1LL;2L;4II;16BRGBRGB;16BPP;1P;2P;4LARGBALA;16BRGBA;16Bs^**$@cCs&tj}|j|t}|jr"td|S)NzDecompressed Data Too Large)zlib decompressobj decompressMAX_TEXT_CHUNKunconsumed_tail ValueError)sZdobj plaintextr+j/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-i584jbuk/Pillow/PIL/PngImagePlugin.py_safe_zlib_decompressYs  r-cCstj||d@S)Nl)r#crc32)dataseedr+r+r,_crc32asr1c@s^eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dddZ dS) ChunkStreamcCs||_g|_dS)N)fpqueue)selfr3r+r+r,__init__jszChunkStream.__init__cCszd}|jr(|jj\}}}|jj|n*|jjd}|dd}|jj}t|}t|sptj spt dt ||||fS)z.Fetch a new chunk. Returns header information.Nrrzbroken PNG file (chunk %s)) r4popr3seekreadtelli32is_cidrLOAD_TRUNCATED_IMAGES SyntaxErrorrepr)r5cidposlengthr)r+r+r,r9os   zChunkStream.readcCs|S)Nr+)r5r+r+r, __enter__szChunkStream.__enter__cGs |jdS)N)close)r5argsr+r+r,__exit__szChunkStream.__exit__cCsd|_|_|_dS)N)r4crcr3)r5r+r+r,rDszChunkStream.closecCs|jj|||fdS)N)r4append)r5r@rArBr+r+r,pushszChunkStream.pushcCs*tjd|||t|d|jd||S)z"Call the appropriate chunk handlerzSTREAM %r %s %sZchunk_ascii)loggerdebuggetattrdecode)r5r@rArBr+r+r,callszChunkStream.callc Cstjr*t|dd?d@r*|j||dSy6t|t|}t|jjd}||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)) rr=rcrc_skipr1r;r3r9r>structerror)r5r@r/Zcrc1Zcrc2r+r+r,rGs  zChunkStream.crccCs|jjddS)z3Read checksum. Used if the C module is not presentrN)r3r9)r5r@r/r+r+r,rQszChunkStream.crc_skipIENDc Csjg}x`y|j\}}}Wntjk r6tdYnX||krBP|j|tj|j||j|qW|S)Nztruncated PNG file) r9rRrSIOErrorrGr _safe_readr3rH)r5ZendchunkZcidsr@rArBr+r+r,verifyszChunkStream.verifyN)rT) __name__ __module__ __qualname__r6r9rCrFrDrIrOrGrQrWr+r+r+r,r2hsr2c@seZdZdZedddZdS)iTXtzq Subclass of string to allow iTXt chunks to look like strings while keeping their extra information NcCstj||}||_||_|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)clstextr^r_r5r+r+r,r]s z iTXt.__new__)NN)rXrYrZ__doc__ staticmethodr]r+r+r+r,r[sr[c@s4eZdZdZddZddZd dd Zdd d Zd S)PngInfoz< PNG chunk container (for use with save(pnginfo=)) cCs g|_dS)N)chunks)r5r+r+r,r6szPngInfo.__init__cCs|jj||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)rerH)r5r@r/r+r+r,addsz PngInfo.addFcCst|ts|jdd}t|ts,|jdd}t|tsB|jdd}t|tsX|jdd}|r|jd|d|d|dtj|n$|jd|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) isinstancebytesencoderfr#compress)r5keyvaluer^r_zipr+r+r,add_itxts        zPngInfo.add_itxtc Cst|tr"|j|||j|j|dSt|ts^y|jdd}Wn tk r\|j|||dSXt|tst|jdd}|r|jd|dt j |n|jd|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 )rpzlatin-1rhszTXtsstEXtriN) rjr[rqr^r_rkrl UnicodeErrorrfr#rm)r5rnrorpr+r+r,add_texts    zPngInfo.add_textN)rgrgF)F)rXrYrZrbr6rfrqrsr+r+r+r,rds  rdc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#S)$ PngStreamcCs@tj||i|_i|_d|_d|_d|_d|_d|_d|_ dS)Nr)rr) r2r6im_infoim_textim_sizeim_modeim_tile im_paletteim_custom_mimetype text_memory)r5r3r+r+r,r6's zPngStream.__init__cCs*|j|7_|jtkr&td|jdS)Nz7Too much memory used in text chunks: %s>MAX_TEXT_MEMORY)r|MAX_TEXT_MEMORYr()r5Zchunklenr+r+r,check_text_memory6s zPngStream.check_text_memoryc Cstj|j|}|jd}tjd|d|tjdt||t||}|dkr`td|yt||dd}Wn:t k rtj rd}nYnt j k rd}YnX||j d<|S)NriziCCP profile name %rzCompression method %srz+Unknown compression method %s in iCCP chunkr icc_profile)rrVr3findrKrLrr>r-r(r=r#rSru)r5rArBr)i comp_methodrr+r+r, chunk_iCCP<s$    zPngStream.chunk_iCCPc Cstj|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) rrVr3r;rw_MODESrrx im_rawmode Exceptionrur>)r5rArBr)r+r+r, chunk_IHDRXs(   zPngStream.chunk_IHDRcCs&dd|j||jfg|_||_tdS)Nrpr)rr)rwrryZim_idatEOFError)r5rArBr+r+r, chunk_IDATgszPngStream.chunk_IDATcCstdS)N)r)r5rArBr+r+r, chunk_IENDnszPngStream.chunk_IENDcCs&tj|j|}|jdkr"d|f|_|S)Nrr)rrVr3rxrz)r5rArBr)r+r+r, chunk_PLTEss  zPngStream.chunk_PLTEcCstj|j|}|jdkrLtj|r@|jd}|dkrJ||jd<q||jd<nP|jd krft||jd<n6|jdkrt|t|d dt|d df|jd<|S) Nrrir transparencyr rrrr r)r rr) rrVr3rx_simple_palettematchrrui16)r5rArBr)rr+r+r, chunk_tRNS{s       ,zPngStream.chunk_tRNScCs$tj|j|}t|d|jd<|S)Ngj@gamma)rrVr3r;ru)r5rArBr)r+r+r, chunk_gAMAszPngStream.chunk_gAMAcCsBtj|j|}tjdt|d|}tdd|D|jd<|S)Nz>%dIrcss|]}|dVqdS)gj@Nr+).0eltr+r+r, sz'PngStream.chunk_cHRM..Z chromaticity)rrVr3rRunpacklentupleru)r5rArBr)Zraw_valsr+r+r, chunk_cHRMszPngStream.chunk_cHRMcCs tj|j|}t||jd<|S)NZsrgb)rrVr3rru)r5rArBr)r+r+r, chunk_sRGBszPngStream.chunk_sRGBcCstj|j|}t|t|dd}}t|d}|dkrht|ddt|ddf}||jd<n|dkr~||f|jd<|S) Nrrrg F%u?g?dpirZaspect)rrVr3r;rintru)r5rArBr)Zpxpyunitrr+r+r, chunk_pHYss   zPngStream.chunk_pHYsc Cstj|j|}y|jdd\}}Wntk r>|}d}YnX|rtr`|jdd}|jdd}||j|<|j|<|j t ||S)Nrirzlatin-1rhreplace) rrVr3splitr(r rNrurvr~r)r5rArBr)kvr+r+r, chunk_tEXts   zPngStream.chunk_tEXtcCstj|j|}y|jdd\}}Wntk r>|}d}YnX|rRt|d}nd}|dkrjtd|yt|dd}Wn:tk rtjrd}nYnt j k rd}YnX|rt r|j dd}|j dd}||j |<|j|<|jt||S) Nrirrrz+Unknown compression method %s in zTXt chunkzlatin-1rhr)rrVr3rr(rr>r-r=r#rSr rNrurvr~r)r5rArBr)rrrr+r+r, chunk_zTXts6    zPngStream.chunk_zTXtc $Cs~tj|j|}}y|jdd\}}Wntk r:|SXt|dkrL|St|dt|d|dd}}}y|jdd\}} } Wntk r|SX|dkr|dkry t| } Wn6tk rtjr|SYnt j k r|SXn|St rPy4|j dd}|j dd}| j dd} | j dd} Wnt k rN|SXt| || |j|<|j|<|jt| |S)Nrirr rzlatin-1rhzutf-8)rrVr3rr(rrr-r=r#rSr rNrrr[rurvr~) r5rArBrr)rZcfcmr^Ztkrr+r+r, chunk_iTXtsD (      zPngStream.chunk_iTXtcCs tj|j|}d||jd<|S)NsExifexif)rrVr3ru)r5rArBr)r+r+r, chunk_eXIfszPngStream.chunk_eXIfcCstj|j|}d|_|S)Nz image/apng)rrVr3r{)r5rArBr)r+r+r, chunk_acTLszPngStream.chunk_acTLN)rXrYrZr6r~rrrrrrrrrrrrrrrr+r+r+r,rt%s"   $*rtcCs|ddtkS)Nr)_MAGIC)prefixr+r+r,_accept(src@sXeZdZdZdZddZeddZddZd d Z d d Z d dZ ddZ ddZ dS) PngImageFileZPNGzPortable network graphicsc Cs|jjdtkrtdt|j|_x~|jj\}}}y|jj|||}WnFtk r`PYn2tk rt j d|||t j |j|}YnX|jj ||q&W|jj|_|jj|_|jj|_d|_|jj|_|jj|_|jjr|jj\}}tj|||_||_dS)Nrznot a PNG filez%r %s %s (unknown))r3r9rr>rtpngrOrAttributeErrorrKrLrrVrGrxmoderw_sizeruinfo_textrytiler{Zcustom_mimetyperzrrawpalette_PngImageFile__idat)r5r@rArBr)rawmoder/r+r+r,_open4s.       zPngImageFile._opencCs|jdkr|j|jS)N)rload)r5r+r+r,racs zPngImageFile.textcCsZ|jdkrtd|jj|jddd|jj|jj|jrP|jjd|_dS)zVerify PNG fileNz)verify must be called directly after openrr r)r3 RuntimeErrorr8rrrWrDZ _exclusive_fp)r5r+r+r,rWls    zPngImageFile.verifycCs(|jjdr|jd|_tjj|dS)z"internal: prepare to read PNG filerrN)r)rgetZ decoderconfigr load_prepare)r5r+r+r,r|s  zPngImageFile.load_preparecCsxL|jdkrL|jjd|jj\}}}|dkrD|jj|||dS||_qW|dkr^|j}n t||j}|j||_|jj|S)zinternal: read more image datarrIDATDDATr)rr)rr3r9rrImin)r5 read_bytesr@rArBr+r+r, load_reads     zPngImageFile.load_readcCsx|jjdy|jj\}}}Wntjtfk r>PYnX|dkrJPy|jj|||Wqtk rtPYqtk rt j |j|Yqt k rt j d|||t j |j|YqXqW|jj|_|jjd|_dS)z%internal: finished reading image datarsIENDz%r %s %s (unknown)N)r3r9rrRrSr>rOUnicodeDecodeErrorrrrVrrKrLrvrrD)r5r@rArBr+r+r,load_ends(   zPngImageFile.load_endcCs,d|jkr|jd|jkr dSt|jS)Nr)rrdictgetexif)r5r+r+r,_getexifs   zPngImageFile._getexifcCsd|jkr|jtjj|S)Nr)rrrr)r5r+r+r,rs zPngImageFile.getexifN)rXrYrZformatformat_descriptionrpropertyrarWrrrrrr+r+r+r,r/s/ rL;1)r zL;1zL;2zL;4rrrzI;16zP;1zP;2zP;4rrrcGsJdj|}|jtt|||j|t|t|}|jt|dS)z'Write a PNG chunk (including CRC field)rN)joinwriteo32rr1)r3r@r/rGr+r+r,putchunks   rc@seZdZddZddZdS)_idatcCs||_||_dS)N)r3chunk)r5r3rr+r+r,r6sz_idat.__init__cCs|j|jd|dS)NsIDAT)rr3)r5r/r+r+r,rsz _idat.writeN)rXrYrZr6rr+r+r+r,rsrcCs|j}|dkrd|jkr(d|jd>}n.|jrRttt|jjdddd}nd}|dkrdd}n |dkrrd}n|dkrd}nd }|d krd ||f}|jjd d |jjd d>|jjdd?|jjddf|_yt |\}}Wn"t k rt d|YnX|j t ||dt|jdt|jd|ddddddddg}|jjd|jjd} | rd} | dtj| } ||d| |jd|jjd} | rdd d!d"g} xL| jD]B\}} ||kr|j||||| n|| kr|||| qW|jdkrNd|d}|jjd#d|}xt||kr@|d7}q&W||d$||jjd%|jjd%d}|sv|dkrZ|jdkrd|}t|tr||d&|d|n0tdtd'|}d(|d}||d&|d|nz|jd@kr tdtd,|}||d&t|nL|jd#krD|\}}}||d&t|t|t|nd%|jkrt d-nF|jdkr|jjd.kr|jjd.d/}d|}||d&|d||jjd0}|r||d1tt|dd2d3tt|dd2d3d4|jjd} | r:d5d6g}x4| jD]*\}} ||kr |j||||| q W|jjd7|jjd7}|rt|tjrn|jd }|jd8r|d9d}||d:|t j!|t"||d;dA|jd|fg||d.collectorcSsdS)Nr+)r5r/r+r+r,rsz"getchunks..collector.writecSs|jj|dS)N)r/rH)r5rr+r+r,rHsz#getchunks..collector.appendN)rXrYrZr/rrHr+r+r+r, collectorsrcWs0dj|}tt|t|}|j|||fdS)Nr)rrr1rH)r3r@r/rGr+r+r,rHs zgetchunks..appendN)objectrrr/)rparamsrrHr3r+r+r, getchunkss rz.pngz.apngz image/png)rr)r r )r r)rr)rr)rr)rr)rr)rr)rr)rr )rr)rr )rr)rr)rr)r r)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr )rr)rr )rr!)r)r r)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)5loggingrer#rRrgrrr_binaryrrrrr;r rr rZ_utilr __version__ getLoggerrXrKcompilerr<rrrZ SAFEBLOCKr&r}r-r1rr2r\r[rdrtrrrrrrrZ register_openrZ register_saveZregister_extensionsZ register_mimer+r+r+r,"s|     [M