3 }\M.@sddlmZmZmZddlmZddlZddlZddlZddl Z ddl Z ddl Z e ej dZerlddlmZdZddZd d Zd d Zd dZddZGdddeZGdddejZddZejejeddejejde jdkr ejejeejejde dkre!e j"dkr6e#de j$ee%e j"dd Z&x6e&j'd!D](Z(e(e&_(e&j)e&j*Z*e*j+d"e(qVWej%e j"dZ*e*j+d#e jd$krej,d#dS)%)Image ImageFilePngImagePlugin)i8NZjp2klib_version)Jpeg2KImagePlugincCstjd|jtS)Nz>4sI)structunpackread HEADERSIZE)fobjr k/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-i584jbuk/Pillow/PIL/IcnsImagePlugin.py nextheader"srcCsD|\}}|j||jd}|dkr,tdt||d|df|S)Nsz'Unknown signature, expecting 0x00000000)seekr SyntaxErrorread_32)r start_lengthsizestartlengthsigr r rread_32t&s   rc Csl|\}}|j||d|d|d|df}|d|d}||dkrp|j|}tjd||dddd}ntjd|d}xtdD]} g} |} x| dkr|jd} | sPt| } | d@r| d } |jd} x4t| D]}| j| qWn| d} | j|j| | | 8} | dkrPqW| dkr4td | tjd |d j | dd dd}|j j |j | qWd|iS) zn Read a 32bit RGB icon resource. Seems to be either uncompressed or an RLE packbits-like scheme. rRGBrawN}zError reading channel [%r left]L) rr r frombuffernewrangerappendrjoinimZputband)r rrrr pixel_sizesizesqZindatar(Zband_ixdataZ bytesleftZbyte blocksizeibandr r rr0sB         rcCsf|d}|j||d|d|d|df}|d|d}tjd||j|dddd}d|iS)Nrrrr!rA)rrr#r )r rrrr)r*r.r r rread_mk^s  r0c Cs|\}}|j||jd}|dddkrH|j|tj|}d|iS|dddksp|dddksp|dkrts|td |j||j|}tj|}tj |}|j dkr|j d}d|iStd dS) N rsPNG  RGBArsOQs s jP zQUnsupported icon subimage format (rebuild PIL with JPEG 2000 support to fix this)z Unsupported icon subimage format) rr rZ PngImageFile enable_jpeg2k ValueErrorioBytesIOrZJpeg2KImageFilemodeconvert) r rrrrrr(Z jp2kstreamfr r rread_png_or_jpeg2000js(          r:c@seZdZd(defgd)defgd*defgd+defgd,d efgd-d efd efd efgd.defgd/defgd0defdefgd1defdefdefgd2defgd3defdefdefgi ZddZdd Z d!d"Z d#d$Z d4d&d'Z d%S)5IcnsFilersic10rsic09sic14sic08rsic13sic07sit32st8mk@sicp6 sic120sih32sh8mksicp5sil32sl8mksic11sicp4sis32ss8mkcCsi|_}||_t|\}}|dkr,tdt}xZ||krt|\}}|dkrVtd|t7}|t8}||f||<|j|tj||7}q2WdS)z@ fobj is a file-like object as an icns resource sicnsznot an icns filerzinvalid block headerN)dctr rrr rr5SEEK_CUR)selfr rBrfilesizer-r,r r r__init__s     zIcnsFile.__init__cCsHg}x>|jjD]0\}}x&|D]\}}||jkr|j|PqWqW|S)N)SIZESitemsrBr&)rDsizesrZfmtsfmtreaderr r r itersizess   zIcnsFile.itersizescCs|j}|stdt|S)NzNo 32bit icon resources found)rLrmax)rDrIr r rbestsizeszIcnsFile.bestsizecCsHi}x>|j|D]0\}}|jj|}|dk r|j||j||qW|S)z Get an icon resource as {channel: array}. Note that the arrays are bottom-up like windows bitmaps and will likely need to be flipped or transposed in some way. N)rGrBgetupdater )rDrrBcoderKdescr r r dataforsizes  zIcnsFile.dataforsizeNc Cs|dkr|j}t|dkr.|d|ddf}|j|}|jdd}|rL|S|jdj}y|j|dWntk rYnX|S)Nrrrr2rr/)rNlenrSrOcopyZputalphaKeyError)rDrZchannelsr(r r rgetimages   zIcnsFile.getimage)r<r<r)r<r<r)r=r=r)r=r=r)rrr)rrr)r>r>r)r?r?r)r@r@r)r?r?r)rArAr)rArAr)N) __name__ __module__ __qualname__r:rr0rrGrFrLrNrSrWr r r rr;sH   r;c@sBeZdZdZdZdZddZeddZej ddZd d Z d S) IcnsImageFilea! PIL image support for Mac OS .icns files. Chooses the best resolution, but will possibly load a different size image if you mutate the size attribute before calling 'load'. The info dictionary has a key 'sizes' that is a list of sizes that the icns file has. ZICNSzMac OS icns resourcecCsbt|j|_d|_|jj|jd<|jj|_|jd|jd|jd|jdf|_d|_ dS)Nr2rIrrr)r\) r;fpicnsr7rLinforN best_sizertile)rDr r r_open s  zIcnsImageFile._opencCs|jS)N)_size)rDr r rrszIcnsImageFile.sizecCs|}||jdkr0t|dkr0|d|ddf}||jdkrt|dkr|ddkrdd|jdD}||kr|jd|j|}||jdkrtd||_dS) NrIrrrrcSs,g|]$}|d|d|d|dfqS)rrrr ).0rr r r sz&IcnsImageFile.size..z2This is not one of the allowed sizes of this image)r_rTindexr4rc)rDvalueZ info_sizeZ simple_sizesr r rrs cCst|jdkr@|j|_|jd|jd|jd|jdf|_tjj||jsVdS|j|jj|j}|j|j |_ |j |_ |j|_|j r|j j d|_ d|_f|_|jdS)Nrrrr)rTrr`rloadraZ load_preparer^rWr(r7Z _exclusive_fpr]closeZload_end)rDr(r r rrh's&  zIcnsImageFile.loadN) rXrYrZ__doc__formatformat_descriptionrbpropertyrsetterrhr r r rr[s  r[c Csft|dr|jtjd}dd|jjdgD}d}d}xdD]}d j||}tjj ||d } ||krzt j || n$|j||j ||ft j} | j| tjj ||d}|j|d|j |d|dft j} | j||d}qBWddlm} m} m}dddd||g}ttjd}| || |d}WdQRX|jj|j}t j||rb|||dS)z Saves the image as a series of PNG files, that are then converted to a .icns file using the macOS command line utility 'iconutil'. macOS only. flushz.iconsetcSsi|] }||jqSr )width)rdr(r r r Osz_save..Z append_imagesNrAr?rr=z icon_{}x{}z.pngz@2x.pngrr)PopenPIPECalledProcessErrorZiconutilz-cr^z-owb)stdoutstderr)rAr?rr=rr)hasattrrotempfilemkdtempZ encoderinforOrkospathr'shutilcopyfileresizerZLANCZOSsave subprocessrsrtruopendevnullrwriwaitrmtree)r(r]filenameZiconsetZprovided_imagesZlast_wZ second_pathwprefixZ first_pathZim_wZim_w2rsrtruZ convert_cmdrZ convert_procretcoder r r_saveBs6     &    rcCs|dddkS)Nrsicnsr )xr r rusrz.icnsdarwinz image/icns__main__rz(Syntax: python IcnsImagePlugin.py [file]rrbrIzout-%s-%s-%s.pngzout.pngZwindows)-ZPILrrrZ PIL._binaryrr5r|r~rsysrzrycorer3rr rrrr0r:objectr;r[rZ register_openrkZregister_extensionplatformZ register_saveZ register_mimerXrTargvprintexitrZimfr_rrhr(rZ startfiler r r rsN    . wG2