B
    ³è0\C.  ã               @   s¶  d dl mZmZmZ d dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
d dlZeejdƒZerld dl mZ dZdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ dejƒZdd„ Ze ejedd„ ¡ e ejd¡ e
jdkre eje¡ e ejd¡ e dkr²e!e
j"ƒdk r6e#dƒ e
 $¡  ee%e
j"d d ƒƒZ&x6e&j'd! D ](Z(e(e&_(e& )¡  e&j*Z*e* +d"e( ¡ qVW e %e
j"d ¡Z*e* +d#¡ e
jd$kr²e ,d#¡ dS )%é    )ÚImageÚ	ImageFileÚPngImagePlugin)Úi8NZjp2klib_version)ÚJpeg2KImagePluginé   c             C   s   t  d|  t¡¡S )Nz>4sI)ÚstructZunpackÚreadÚ
HEADERSIZE)Úfobj© r   ú2lib/python3.7/site-packages/PIL/IcnsImagePlugin.pyÚ
nextheader"   s    r   c             C   sD   |\}}|   |¡ |  d¡}|dkr,tdƒ‚t| |d |d f|ƒS )Né   s       z'Unknown signature, expecting 0x00000000)Úseekr	   ÚSyntaxErrorÚread_32)r   Ústart_lengthÚsizeÚstartÚlengthÚsigr   r   r   Úread_32t&   s    

r   c          
   C   sl  |\}}|   |¡ |d |d  |d |d  f}|d |d  }||d krp|  |¡}t d||dddd¡}nôt d|d¡}xätdƒD ]Ø}	g }
|}xˆ|dkr|  d¡}|s°P t|ƒ}|d@ rð|d	 }|  d¡}x4t|ƒD ]}|
 |¡ qÜW n|d }|
 |  |¡¡ ||8 }|dkr–P q–W |dkr4td
| ƒ‚t d|d 	|
¡dddd¡}|j
 |j
|	¡ qˆW d|iS )zn
    Read a 32bit RGB icon resource.  Seems to be either uncompressed or
    an RLE packbits-like scheme.
    r   é   é   é   ÚRGBÚrawNé€   é}   zError reading channel [%r left]ÚLó    )r   r	   r   Ú
frombufferÚnewÚranger   Úappendr   ÚjoinÚimZputband)r   r   r   r   r   Ú
pixel_sizeÚsizesqZindatar'   Zband_ixÚdataZ	bytesleftZbyteÚ	blocksizeÚiÚbandr   r   r   r   0   sB    
 




r   c          	   C   sf   |d }|   |¡ |d |d  |d |d  f}|d |d  }t d||  |¡dddd¡}d|iS )Nr   r   r   r    r   ÚA)r   r   r"   r	   )r   r   r   r   r(   r)   r-   r   r   r   Úread_mk^   s    
 r/   c       	      C   sÌ   |\}}|   |¡ |  d¡}|d d… dkrH|   |¡ t | ¡}d|iS |d d… dksp|d d… dksp|dkrÀts|td	ƒ‚|   |¡ |  |¡}t |¡}t 	|¡}|j
dkr¸| d¡}d|iS td
ƒ‚d S )Né   r   s   ‰PNG

ÚRGBAr   s   ÿOÿQs   
‡
s      jP  
‡
zQUnsupported icon subimage format (rebuild PIL with JPEG 2000 support to fix this)z Unsupported icon subimage format)r   r	   r   ZPngImageFileÚenable_jpeg2kÚ
ValueErrorÚioÚBytesIOr   ZJpeg2KImageFileÚmodeZconvert)	r   r   r   r   r   r   r'   Z
jp2kstreamÚfr   r   r   Úread_png_or_jpeg2000j   s(    









r8   c               @   sÆ   e Zd Zdefgdefgdefgdefgdefgdefdefdefgd	efgd
efgdefdefgdefdefdefgdefgdefdefdefgdœZdd„ Zdd„ Z	dd„ Z
dd„ Zd dd„ZdS )!ÚIcnsFiles   ic10s   ic09s   ic14s   ic08s   ic13s   ic07s   it32s   t8mks   icp6s   ic12s   ih32s   h8mks   icp5s   il32s   l8mks   ic11s   icp4s   is32s   s8mk))i   i   r   )i   i   r   )é   r:   r   )r:   r:   r   )r   r   r   )r   r   r   )é@   r;   r   )é    r<   r   )é0   r=   r   )r<   r<   r   )é   r>   r   )r>   r>   r   c             C   sŽ   i  | _ }|| _t|ƒ\}}|dkr,tdƒ‚t}xX||k rˆt|ƒ\}}|dkrVtdƒ‚|t7 }|t8 }||f||< | |d¡ ||7 }q2W dS )z@
        fobj is a file-like object as an icns resource
        s   icnsznot an icns filer   zinvalid block headerr   N)Údctr   r   r   r
   r   )Úselfr   r?   r   Zfilesizer,   r+   r   r   r   Ú__init__´   s    

zIcnsFile.__init__c             C   sH   g }x>| j  ¡ D ]0\}}x&|D ]\}}|| jkr| |¡ P qW qW |S )N)ÚSIZESÚitemsr?   r%   )r@   Úsizesr   ZfmtsZfmtÚreaderr   r   r   Ú	itersizesÉ   s    


zIcnsFile.itersizesc             C   s   |   ¡ }|stdƒ‚t|ƒS )NzNo 32bit icon resources found)rF   r   Úmax)r@   rD   r   r   r   ÚbestsizeÒ   s    zIcnsFile.bestsizec             C   sH   i }x>| j | D ]0\}}| j |¡}|dk	r| || j||ƒ¡ qW |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)rB   r?   ÚgetÚupdater   )r@   r   r?   ÚcoderE   Zdescr   r   r   ÚdataforsizeØ   s    zIcnsFile.dataforsizeNc             C   s†   |d kr|   ¡ }t|ƒdkr.|d |d df}|  |¡}| dd ¡}|rL|S | d¡ ¡ }y| |d ¡ W n tk
r€   Y nX |S )Nr   r   r   r1   r   r.   )rH   ÚlenrL   rI   ÚcopyZputalphaÚKeyError)r@   r   Zchannelsr'   r   r   r   Úgetimageå   s    
zIcnsFile.getimage)N)Ú__name__Ú
__module__Ú__qualname__r8   r   r/   r   rB   rA   rF   rH   rL   rP   r   r   r   r   r9   „   s0   	r9   c               @   sB   e Zd ZdZdZdZdd„ Zedd„ ƒZej	dd„ ƒZd	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.
    ZICNSzMac OS icns resourcec             C   sb   t | jƒ| _d| _| j ¡ | jd< | j ¡ | _| jd | jd  | jd | jd  f| _d| _	d S )Nr1   rD   r   r   r   )Ú )
r9   ÚfpÚicnsr6   rF   ÚinforH   Ú	best_sizer   Útile)r@   r   r   r   Ú_open	  s    zIcnsImageFile._openc             C   s   | j S )N)Ú_size)r@   r   r   r   r     s    zIcnsImageFile.sizec             C   s¦   |}|| j d kr0t|ƒdkr0|d |d df}|| j d kr†t|ƒdkr†|d dkr†dd„ | j d D ƒ}||kr†| j d | |¡ }|| j d krœtdƒ‚|| _d S )	NrD   r   r   r   r   c             S   s,   g | ]$}|d  |d  |d |d  f‘qS )r   r   r   r   )Ú.0r   r   r   r   ú
<listcomp>  s   z&IcnsImageFile.size.<locals>.<listcomp>z2This is not one of the allowed sizes of this image)rX   rM   Úindexr3   r\   )r@   ÚvalueZ	info_sizeZsimple_sizesr   r   r   r     s    c             C   sº   t | jƒdkr@| j| _| jd | jd  | jd | jd  f| _tj | ¡ | jsVd S |  ¡  | j | j¡}| ¡  |j	| _	|j
| _
|j| _| jrœ| j ¡  d | _d | _d| _|  ¡  d S )Nr   r   r   r   r   )rM   r   rY   r   ÚloadrZ   Zload_preparerW   rP   r'   r6   Z_exclusive_fprV   ÚcloseZload_end)r@   r'   r   r   r   ra   '  s&    
zIcnsImageFile.loadN)rQ   rR   rS   Ú__doc__ÚformatZformat_descriptionr[   Úpropertyr   Úsetterra   r   r   r   r   rT   û   s   	
rT   c          	   C   sf  t |dƒr| ¡  t d¡}dd„ | j dg ¡D ƒ}d}d}x®dD ]¦}d ||¡}tj 	||d	 ¡}	||krzt
 ||	¡ n$| ||  ||ftj¡¡}
|
 |	¡ tj 	||d
 ¡}| |d |  |d |d ftj¡¡}| |¡ |d }qBW ddlm}m}m} dddd||g}ttjdƒ}||||d}W dQ R X |j ¡  | ¡ }t
 |¡ |rb|||ƒ‚dS )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.iconsetc             S   s   i | ]}||j “qS r   )Úwidth)r]   r'   r   r   r   ú
<dictcomp>O  s   z_save.<locals>.<dictcomp>Zappend_imagesN)r>   r<   r   r:   i   z
icon_{}x{}z.pngz@2x.pngr   r   )ÚPopenÚPIPEÚCalledProcessErrorZiconutilz-crW   z-oÚwb)ÚstdoutÚstderr)Úhasattrrg   ÚtempfileZmkdtempZencoderinforI   rd   ÚosÚpathr&   ÚshutilZcopyfileZresizer   ZLANCZOSÚsaveÚ
subprocessrj   rk   rl   ÚopenÚdevnullrn   rb   ÚwaitZrmtree)r'   rV   ÚfilenameZiconsetZprovided_imagesZlast_wZsecond_pathÚwÚprefixZ
first_pathZim_wZim_w2rj   rk   rl   Zconvert_cmdrx   Zconvert_procZretcoder   r   r   Ú_saveB  s6    



&


r}   c             C   s   | d d… dkS )Nr   s   icnsr   )Úxr   r   r   Ú<lambda>u  s    r   z.icnsÚdarwinz
image/icnsÚ__main__r   z(Syntax: python IcnsImagePlugin.py [file]r   ÚrbrD   zout-%s-%s-%s.pngzout.pngZwindows)-ZPILr   r   r   ZPIL._binaryr   r4   rr   rt   r   Úsysrq   rp   Zcorer2   r   r
   r   r   r   r/   r8   Úobjectr9   rT   r}   Zregister_openrd   Zregister_extensionÚplatformZregister_saveZregister_mimerQ   rM   ÚargvÚprintÚexitrw   ZimfrX   r   ra   r'   ru   Z	startfiler   r   r   r   Ú<module>   sN   
.wG2



