U
    Å½„bë-  ã                
   @   s   d dl Z d dlZd dlZd dlZd dlmZmZmZmZ e 	d¡Z
e
rRd dlmZ dZdZdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ ZG dd„ dƒZG dd„ dejƒZdd„ Zdd„ Ze ejee¡ e ejd¡ e eje¡ e ejd¡ edk�rœeejƒdk �redƒ e  ¡  e!ejd dƒ�pZ"ee"ƒZ#e#j$d  D ]Z%e%e#_%e# &d!e% ¡ �q:e !ejd ¡�Z'e' &d"¡ W 5 Q R X ej(d#k�r’e )d"¡ W 5 Q R X dS )$é    N)ÚImageÚ	ImageFileÚPngImagePluginÚfeaturesZjpg_2000)ÚJpeg2KImagePlugins   icnsé   c                 C   s   t  d|  t¡¡S )Nz>4sI)ÚstructÚunpackÚreadÚ
HEADERSIZE)Úfobj© r   ú7/tmp/pip-unpacked-wheel-_wxctax1/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¡}tdƒD ]Ü}	g }
|}|dk�r|  d¡}|s®�q|d }|d@ rê|d	 }|  d¡}t|ƒD ]}|
 |¡ qØn|d }|
 |  |¡¡ ||8 }|dkr’�qq’|dk�r6td
t|ƒ› d�ƒ‚t d|d 	|
¡dddd¡}|j
 |j
|	¡ q†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 [z left]ÚLó    )r   r
   r   Ú
frombufferÚnewÚrangeÚappendr   ÚreprÚjoinÚimZputband)r   r   r   r   r   Ú
pixel_sizeÚsizesqZindatar)   Zband_ixÚdataZ	bytesleftÚbyteÚ	blocksizeÚiÚbandr   r   r   r   1   s>    
 




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+   r0   r   r   r   Úread_mk[   s    
 r2   c           	      C   sä   |\}}|   |¡ |  d¡}|d d… dkrT|   |¡ t | ¡}t |j¡ d|iS |d d… dks||d d… dks||dkrØtsˆtd	ƒ‚|   |¡ |  |¡}t	 
|¡}t |¡}t |j¡ |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PngImageFiler   Z_decompression_bomb_checkr   Úenable_jpeg2kÚ
ValueErrorÚioÚBytesIOr   ZJpeg2KImageFileÚmodeÚconvert)	r   r   r   r   r   r   r)   Z
jp2kstreamÚfr   r   r   Úread_png_or_jpeg2000e   s6    



ÿþýÿ





r<   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 )!ÚIcnsFileó   ic10ó   ic09ó   ic14ó   ic08ó   ic13ó   ic07s   it32s   t8mks   icp6ó   ic12s   ih32s   h8mks   icp5s   il32s   l8mkó   ic11s   icp4s   is32s   s8mk))é   rF   r   )rF   rF   r   )é   rG   r   )rG   rG   r   )r   r   r   )r   r   r   )é@   rH   r   )é    rI   r   )é0   rJ   r   )rI   rI   r   )é   rK   r   )rK   rK   r   c                 C   sŒ   i  | _ }|| _t|ƒ\}}t|ƒs,tdƒ‚t}||k rˆt|ƒ\}}|dkrTtdƒ‚|t7 }|t8 }||f||< | |tj¡ ||7 }q0dS )z@
        fobj is a file-like object as an icns resource
        znot an icns filer   zinvalid block headerN)	Údctr   r   Ú_acceptr   r   r   r7   ÚSEEK_CUR)Úselfr   rL   r   Úfilesizer/   r.   r   r   r   Ú__init__¢   s    
zIcnsFile.__init__c                 C   sB   g }| j  ¡ D ].\}}|D ] \}}|| jkr| |¡  qqq|S ©N)ÚSIZESÚitemsrL   r&   )rO   Úsizesr   ZfmtsÚfmtÚreaderr   r   r   Ú	itersizes·   s    

zIcnsFile.itersizesc                 C   s   |   ¡ }|stdƒ‚t|ƒS )NzNo 32bit icon resources found)rX   r   Úmax)rO   rU   r   r   r   ÚbestsizeÀ   s    zIcnsFile.bestsizec                 C   sD   i }| j | D ]0\}}| j |¡}|dk	r| || j||ƒ¡ q|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)rS   rL   ÚgetÚupdater   )rO   r   rL   ÚcoderW   Ú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¡ ¡ }z| |d ¡ W n tk
r€   Y nX |S )Nr   r   r   r4   r   r1   )rZ   Úlenr_   r[   ÚcopyZputalphaÚKeyError)rO   r   Zchannelsr)   r   r   r   ÚgetimageÓ   s    
zIcnsFile.getimage)N)Ú__name__Ú
__module__Ú__qualname__r<   r   r2   r   rS   rQ   rX   rZ   r_   rc   r   r   r   r   r=   …   s6   ýýýì	r=   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   s\   t | jƒ| _d| _| j ¡ | jd< | j ¡ | _| jd | jd  | jd | jd  f| _d S )Nr4   rU   r   r   r   )	r=   ÚfpÚicnsr9   rX   ÚinforZ   Ú	best_sizer   ©rO   r   r   r   Ú_openø   s    þzIcnsImageFile._openc                 C   s   | j S rR   )Ú_sizerl   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 )	NrU   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)rj   r`   Úindexr6   rn   )rO   Ú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d k	rh| jj| jkrh|S |  ¡  | j | j¡}| ¡ }|j| _|j	| _	|j| _|S )Nr   r   r   r   )
r`   r   rk   r   Úloadr)   Zload_prepareri   rc   r9   )rO   Zpxr)   r   r   r   rs     s    þzIcnsImageFile.loadN)rd   re   rf   Ú__doc__ÚformatÚformat_descriptionrm   Úpropertyr   Úsetterrs   r   r   r   r   rg   ê   s   



rg   c              	   C   sÄ  t |dƒr| ¡  dddddddddœ}d	d
„ | j dg ¡D ƒ}i }t| ¡ ƒD ]B}||krd|| n|  ||f¡}t ¡ }| 	|d¡ | 
¡ ||< qPg }	| ¡ D ]*\}
}|| }|	 |
tt|ƒ |dœ¡ q | t¡ t}|tdt|	ƒ  7 }|tdd„ |	D ƒƒ7 }| t d|¡¡ | d¡ | t dtt|	ƒt  ¡¡ |	D ]*}| |d ¡ | t d|d ¡¡ �qB|	D ]8}| |d ¡ | t d|d ¡¡ | |d ¡ �qrt |dƒ�rÀ| ¡  dS )za
    Saves the image as a series of PNG files,
    that are then combined into a .icns file.
    Úflushr   rG   rF   i   rI   rH   )rC   rA   r?   r>   rE   rD   rB   r@   c                 S   s   i | ]}|j |“qS r   )Úwidth)ro   r)   r   r   r   Ú
<dictcomp>E  s      z_save.<locals>.<dictcomp>Zappend_imagesZpng)Útyper   Ústreamr   c                 s   s   | ]}|d  V  qdS )r   Nr   )ro   Úentryr   r   r   Ú	<genexpr>]  s     z_save.<locals>.<genexpr>z>is   TOC r|   r   r}   N)Úhasattrry   Zencoderinfor[   ÚsetÚvaluesÚresizer7   r8   ÚsaveÚgetvaluerT   r&   r   r`   ÚwriteÚMAGICÚsumr   Úpack)r)   rh   ÚfilenamerU   Zprovided_imagesZsize_streamsr   ÚimageÚtempÚentriesr|   r}   Zfile_lengthr~   r   r   r   Ú_save3  sV    
ø
ÿ
ýÿ

rŽ   c                 C   s   | d d… t kS )Nr   )r‡   )Úprefixr   r   r   rM   q  s    rM   z.icnsz
image/icnsÚ__main__r   z)Syntax: python3 IcnsImagePlugin.py [file]r   ÚrbrU   zout-%s-%s-%s.pngzout.pngZwindows)*r7   Úosr   ÚsysZPILr   r   r   r   Zcheck_codecr5   r   r‡   r   r   r   r   r2   r<   r=   rg   rŽ   rM   Zregister_openru   Zregister_extensionZregister_saveZregister_mimerd   r`   ÚargvÚprintÚexitÚopenrh   Zimfrj   r   r„   r)   ÚplatformZ	startfiler   r   r   r   Ú<module>   sF   

*
 eI>
