B ],@sddlZddlZddlZddlZddlZddlZddlmZmZm Z ddl m Z e ej dZerlddlmZdZddZd d Zd d Zd dZddZGdddeZGdddejZddZeejeddeejdejdkr eejeeejde dkre!ej"dkr6e#de$ee%ej"dd Z&x6e&j'd!D](Z(e(e&_(e&)e&j*Z*e*+d"e(qVWe%ej"dZ*e*+d#ejd$kre,d#dS)%N)Image ImageFilePngImagePlugin)i8Zjp2klib_version)Jpeg2KImagePlugincCstd|tS)Nz>4sI)structunpackread HEADERSIZE)fobjr 5/tmp/pip-build-ktz6qwqq/Pillow/PIL/IcnsImagePlugin.py nextheader#srcCsD|\}}|||d}|dkr,tdt||d|df|S)Nsz'Unknown signature, expecting 0x00000000)seekr SyntaxErrorread_32)r start_lengthsizestartlengthsigr r rread_32t's   rc Csl|\}}|||d|d|d|df}|d|d}||dkrp||}td||dddd}ntd|d}xtdD]} g} |} x| dkr|d} | sPt| } | d@r| d } |d} x4t| D]}| | qWn| d} | || | | 8} | dkrPqW| dkr4td | td |d | dd dd}|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 rr1s>         rc Csf|d}|||d|d|d|df}|d|d}td|||dddd}d|iS)Nrrrr!rA)rrr#r )r rrrr)r*r.r r rread_mk[s   r0c Cs|\}}|||d}|dddkrH||t|}d|iS|dddksp|dddksp|dkrts|td ||||}t|}t |}|j dkr| 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_jpeg2000es*          r:c@seZdZdefgdefgdefgdefgdefgdefdefdefgd efgd efgd efd efgd efdefdefgdefgdefdefdefgd ZddZddZ ddZ ddZ d ddZ dS)!IcnsFilesic10sic09sic14sic08sic13sic07sit32st8mksicp6sic12sih32sh8mksicp5sil32sl8mksic11sicp4sis32ss8mk) )iir)iir)r<r)r<r<r)rrr)rrr)@r=r) r>r)0r?r)r>r>r)r@r)r@r@rcCsi|_}||_t|\}}|dkr,tdt}xZ||krt|\}}|dkrVtd|t7}|t8}||f||<||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 rArfilesizer-r,r r r__init__s     zIcnsFile.__init__cCsHg}x>|jD]0\}}x&|D]\}}||jkr||PqWqW|S)N)SIZESitemsrAr&)rCsizesrZfmtsfmtreaderr r r itersizess   zIcnsFile.itersizescCs|}|stdt|S)NzNo 32bit icon resources found)rKrmax)rCrHr r rbestsizeszIcnsFile.bestsizecCsHi}x>|j|D]0\}}|j|}|dk r|||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)rFrAgetupdater )rCrrAcoderJdescr r r dataforsizes  zIcnsFile.dataforsizeNcCs|dkr|}t|dkr.|d|ddf}||}|dd}|rL|S|d}y||dWntk rYnX|S)Nrrrr2rr/)rMlenrRrNcopyZputalphaKeyError)rCrZchannelsr(r r rgetimages   zIcnsFile.getimage)N) __name__ __module__ __qualname__r:rr0rrFrErKrMrRrVr r r rr;s.  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 resourcecCs\t|j|_d|_|j|jd<|j|_|jd|jd|jd|jdf|_dS)Nr2rHrrr) r;fpicnsr7rKinforM best_sizer)rCr r r_opens   zIcnsImageFile._opencCs|jS)N)_size)rCr r rrszIcnsImageFile.sizecCs|}||jdkr0t|dkr0|d|ddf}||jdkrt|dkr|ddkrdd|jdD}||kr|jd||}||jdkrtd||_dS) NrHrrrrcSs,g|]$}|d|d|d|dfqS)rrrr ).0rr r r sz&IcnsImageFile.size..z2This is not one of the allowed sizes of this image)r]rSindexr4r`)rCvalueZ info_sizeZ simple_sizesr r rrs  cCst|jdkr@|j|_|jd|jd|jd|jdf|_tj||jrd|jj|jkrddS||j|j}||j|_|j |_ |j|_| dS)Nrrrr) rSrr^rloadr(Z load_preparer\rVr7Zload_end)rCr(r r rres zIcnsImageFile.loadN) rWrXrY__doc__formatformat_descriptionr_propertyrsetterrer r r rrZs  rZc Csft|dr|td}dd|jdgD}d}d}xdD]}d||}tj ||d } ||krzt || n$||| ||ft j} | | tj ||d }||d | |d |d ft j} | ||d }qBWd d lm} m} m}dddd||g}ttjd}| || |d}WdQRX|j|}t ||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)rar(r r r =sz_save..Z append_imagesN)r@r>rr<iz icon_{}x{}z.pngz@2x.pngrr)PopenPIPECalledProcessErrorZiconutilz-cr\z-owb)stdoutstderr)hasattrrktempfilemkdtempZ encoderinforNrgospathr'shutilcopyfileresizerZLANCZOSsave subprocessrnrorpopendevnullrrclosewaitrmtree)r(r[filenameZiconsetZprovided_imagesZlast_wZ second_pathwprefixZ first_pathZim_wZim_w2rnrorpZ convert_cmdrZ convert_procretcoder r r_save0s4     &    rcCs|dddkS)Nrsicnsr )xr r rar"rz.icnsdarwinz image/icns__main__rz(Syntax: python IcnsImagePlugin.py [file]rrbrHzout-%s-%s-%s.pngzout.pngZwindows)-r5rwryrsysruZPILrrrZ PIL._binaryrrtcorer3rr rrrr0r:objectr;rZrZ register_openrgZregister_extensionplatformZ register_saveZ register_mimerWrSargvprintexitr~Zimfr]rrer(r|Z startfiler r r rsL    * eH1