B .^, @sddlZddlZddlZddlZddlZddlZddlZddlmZm Z m Z ddl m Z e ejdZertddlmZdZddZd d Zd d Zd dZddZGdddZGddde j ZddZeejeddeejdejdkreejeeejde dkre!ej"dkr4sI)structunpackread HEADERSIZE)fobjr 7/tmp/pip-install-mwhup7aw/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 bytesleftbyte blocksizeibandr r rr2s>         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   r1c 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_jpeg2000fs*          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)rAr)rArArcCsi|_}||_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 rr6SEEK_CUR)selfr rBrfilesizer.r-r r r__init__s     zIcnsFile.__init__cCsHg}x>|jD]0\}}x&|D]\}}||jkr||PqWqW|S)N)SIZESitemsrBr&)rDsizesrZfmtsfmtreaderr r r itersizess   zIcnsFile.itersizescCs|}|stdt|S)NzNo 32bit icon resources found)rLrmax)rDrIr 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)rGrBgetupdater )rDrrBcoderKdescr r r dataforsizes  zIcnsFile.dataforsizeNcCs|dkr|}t|dkr.|d|ddf}||}|dd}|rL|S|d}y||dWntk rYnX|S)Nrrrr3rr0)rNlenrSrOcopyZputalphaKeyError)rDrZchannelsr(r r rgetimages   zIcnsFile.getimage)N) __name__ __module__ __qualname__r;rr1rrGrFrLrNrSrWr 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)Nr3rIrrr) r<fpicnsr8rLinforN best_sizer)rDr r r_opens   zIcnsImageFile._opencCs|jS)N)_size)rDr r rrszIcnsImageFile.sizecCs|}||jdkr0t|dkr0|d|ddf}||jdkrt|dkr|ddkrdd|jdD}||kr|jd||}||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^rTindexr5ra)rDvalueZ info_sizeZ simple_sizesr r rrs  cCst|jdkr@|j|_|jd|jd|jd|jdf|_tj||jrd|jj|jkrddS||j|j}||j|_|j |_ |j|_| dS)Nrrrr) rTrr_rloadr(Z load_preparer]rWr8Zload_end)rDr(r r rrfs zIcnsImageFile.loadN) rXrYrZ__doc__formatformat_descriptionr`propertyrsetterrfr r r rr[s  r[c CsFt|dr|td}dd|jdgD}d}d}xdD]}d||}tj ||d } ||kr~t || n$||| ||ft j} | | tj ||d }||d | |d |d ft j} | ||d }qFWd d dd||g} tj| tjtjd} | j| }|r8t|| WdQRXdS)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)rbr(r r r >sz_save..Z append_imagesN)rAr?rr=iz icon_{}x{}z.pngz@2x.pngrZiconutilz-cr]z-o)stdoutstderr)hasattrrltempfileTemporaryDirectoryZ encoderinforOrhospathr'shutilcopyfileresizerZLANCZOSsave subprocessPopenPIPEDEVNULLroclosewaitCalledProcessError)r(r\filenameZiconsetZprovided_imagesZlast_wZ second_pathwprefixZ first_pathZim_wZim_w2Z convert_cmdZ convert_procretcoder r r_save1s2    &   rcCs|dddkS)Nrsicnsr )xr r rar"rz.icnsdarwinz image/icns__main__rz(Syntax: python IcnsImagePlugin.py [file]rrbrIzout-%s-%s-%s.pngzout.pngZwindows)-r6rtrvrrzsysrrZPILrrrZ PIL._binaryrrqcorer4rr rrrr1r;r<r[rZ register_openrhZregister_extensionplatformZ register_saveZ register_mimerXrTargvprintexitopenr\Zimfr^rryr(Z startfiler r r rsL    * eH0