U
    &^,                     @   s  d dl 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d dlmZm	Z	m
Z
 d dlmZ eejdZertd 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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re!ej"dk r<e#d e$  ee%ej"d d Z&e&j'd! D ](Z(e(e&_(e&)  e&j*Z*e*+d"e(  qZe%ej"d Z*e*+d# ejd$kre,d# dS )%    N)Image	ImageFilePngImagePlugin)i8Zjp2klib_version)Jpeg2KImagePlugin   c                 C   s   t d| tS )Nz>4sI)structunpackread
HEADERSIZE)fobj r   7/tmp/pip-install-a1j0c_p1/Pillow/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   sd  |\}}|  | |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t|}|d@ r|d	 }| d}t|D ]}|
| qn|d }|
| | ||8 }|dkrqq|dkr.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 [%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	bytesleftbyte	blocksizeibandr   r   r   r   2   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    
 r1   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rts|td	|  | | |}t|}t	|}|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PngImageFileenable_jpeg2k
ValueErrorioBytesIOr   ZJpeg2KImageFilemodeconvert)	r   r   r   r   r   r   r(   Z
jp2kstreamfr   r   r   read_png_or_jpeg2000f   s2    









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 )!IcnsFiles   ic10s   ic09s   ic14s   ic08s   ic13s   ic07s   it32s   t8mks   icp6s   ic12s   ih32s   h8mks   icp5s   il32s   l8mks   ic11s   icp4s   is32s   s8mk))   r=   r   )r=   r=   r   )   r>   r   )r>   r>   r   )r   r   r   )r   r   r   )@   r?   r   )    r@   r   )0   rA   r   )r@   r@   r   )   rB   r   )rB   rB   r   c                 C   s   i  | _ }|| _t|\}}|dkr,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
           icnsznot an icns filer   zinvalid block headerN)dctr   r   r   r   r   r6   SEEK_CUR)selfr   rD   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itemsrD   r&   )rF   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)rO   r   max)rF   rL   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)rJ   rD   getupdater   )rF   r   rD   coderN   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   r3   r   r0   )rQ   lenrV   rR   copyZputalphaKeyError)rF   r   Zchannelsr(   r   r   r   getimage   s    
zIcnsFile.getimage)N)__name__
__module____qualname__r;   r   r1   r   rJ   rH   rO   rQ   rV   rZ   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 )Nr3   rL   r   r   r   )	r<   fpicnsr8   rO   inforQ   	best_sizer   rF   r   r   r   _open   s    zIcnsImageFile._openc                 C   s   | j S rI   )_sizerc   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 )	NrL   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)ra   rW   indexr5   re   )rF   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rd| jj| jkrdd S |   | j| j}|  |j| _|j	| _	|j| _| 
  d S )Nr   r   r   r   )rW   r   rb   r   loadr(   Zload_preparer`   rZ   r8   Zload_end)rF   r(   r   r   r   rj     s    zIcnsImageFile.loadN)r[   r\   r]   __doc__formatformat_descriptionrd   propertyr   setterrj   r   r   r   r   r^      s   



r^   c              
   C   sB  t |dr|  td}dd | jdg D }d}d}dD ]}d||}tj	||d	 }	||kr|t
||	 n$||| ||ftj}
|
|	 tj	||d
 }||d | |d |d ftj}|| |d }qDdddd||g}tj|tjtjd}|j  | }|r4t||W 5 Q R X 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)rf   r(   r   r   r   
<dictcomp>>  s     z_save.<locals>.<dictcomp>Zappend_imagesN)rB   r@   r   r>   r=   z
icon_{}x{}z.pngz@2x.pngr   Ziconutilz-cr`   z-o)stdoutstderr)hasattrrp   tempfileTemporaryDirectoryZencoderinforR   rl   ospathr'   shutilcopyfileresizer   ZLANCZOSsave
subprocessPopenPIPEDEVNULLrs   closewaitCalledProcessError)r(   r_   filenameZiconsetZprovided_imagesZlast_wZsecond_pathwprefixZ
first_pathZim_wZim_w2Zconvert_cmdZconvert_procretcoder   r   r   _save1  s:    

&

  
r   c                 C   s   | d d dkS )Nr   rC   r   )xr   r   r   <lambda>a  r"   r   z.icnsdarwinz
image/icns__main__r   z(Syntax: python IcnsImagePlugin.py [file]r   rbrL   zout-%s-%s-%s.pngzout.pngZwindows)-r6   rx   rz   r   r~   sysrv   ZPILr   r   r   ZPIL._binaryr   ru   corer4   r   r   r   r   r   r1   r;   r<   r^   r   Zregister_openrl   Zregister_extensionplatformZregister_saveZregister_mimer[   rW   argvprintexitopenZimfra   r   rj   r(   r}   Z	startfiler   r   r   r   <module>   sN   
*
eH0

