U
    0[c-                  
   @   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re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re)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)structZunpackread
HEADERSIZE)fobj r   2lib/python3.8/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}ntd|d}tdD ]}	g }
|}|dkr| d}|sq|d }|d@ r|d	 }| d}t|D ]}|
| qn|d }|
| | ||8 }|dkrqq|dkr6td
t| dtd|d	|
dddd}|j
|j
|	 qd|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	bytesleftZ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*   r.   r   r   r   read_mk[   s    
 r0   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rtstd	|  | | |}t	
|}t|}t|j |jdkr|d}d|iS td
d S )N   r   s   PNG

RGBAr   s   OQs   

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modeZconvert)	r   r   r   r   r   r   r(   Z
jp2kstreamfr   r   r   read_png_or_jpeg2000e   s6    









r9   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))   rC   r   )rC   rC   r   )   rD   r   )rD   rD   r   )r   r   r   )r   r   r   )@   rE   r   )    rF   r   )0   rG   r   )rF   rF   r   )   rH   r   )rH   rH   r   c                 C   s   i  | _ }|| _t|\}}t|s,tdt}||k rt|\}}|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   r5   SEEK_CUR)selfr   rI   r   Z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itemsrI   r%   )rL   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)rS   r   max)rL   rQ   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)rO   rI   getupdater   )rL   r   rI   coderR   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 }z||d  W n tk
r   Y nX |S )Nr   r   r   r2   r   r/   )rU   lenrY   rV   copyZputalphaKeyError)rL   r   Zchannelsr(   r   r   r   getimage   s    
zIcnsFile.getimage)N)__name__
__module____qualname__r9   r   r0   r   rO   rM   rS   rU   rY   r]   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 )Nr2   rQ   r   r   r   )	r:   fpicnsr7   rS   inforU   	best_sizer   rL   r   r   r   _open   s    zIcnsImageFile._openc                 C   s   | j S rN   )_sizerf   r   r   r   r     s    zIcnsImageFile.sizec                 C   s   |}|| j d kr0t|dkr0|d |d df}|| j d krt|dkr|d dkrdd | j d D }||kr| j d || }|| j d krtd|| _d S )	NrQ   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)rd   rZ   indexr4   rh   )rL   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   )
rZ   r   re   r   loadr(   Zload_preparerc   r]   r7   )rL   Zpxr(   r   r   r   rm     s    zIcnsImageFile.loadN)r^   r_   r`   __doc__formatZformat_descriptionrg   propertyr   setterrm   r   r   r   r   ra      s   



ra   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   rD   rC   i   rF   rE   )r@   r>   r<   r;   rB   rA   r?   r=   c                 S   s   i | ]}|j |qS r   )width)ri   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   )ri   entryr   r   r   	<genexpr>]  s     z_save.<locals>.<genexpr>z>is   TOC ru   r   rv   N)hasattrrr   ZencoderinforV   setvaluesZresizer5   r6   savegetvaluerP   r%   r
   rZ   writeMAGICsumr   Zpack)r(   rb   filenamerQ   Zprovided_imagesZsize_streamsr   ZimageZtempentriesru   rv   Zfile_lengthrw   r   r   r   _save3  sV    




r   c                 C   s   | d d t kS )Nr   )r   )prefixr   r   r   rJ   q  s    rJ   z.icnsz
image/icns__main__r   z)Syntax: python3 IcnsImagePlugin.py [file]r   rbrQ   zout-%s-%s-%s.pngzout.pngZwindows)*r5   osr   sysZPILr   r   r   r   Zcheck_codecr3   r   r   r
   r   r   r   r0   r9   r:   ra   r   rJ   Zregister_openro   Zregister_extensionZregister_saveZregister_mimer^   rZ   argvprintexitopenrb   Zimfrd   r   r|   r(   platformZ	startfiler   r   r   r   <module>   sF   

*
 eI>
