3
齠hL-                 @   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j	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jejee ejejd ejeje ejejd edkreejdk red ej   e!ejd dtZ"ee"Z#x(e#j$d  D ]Z%e%e#_%e#j&d!e%  q<W ej!ejd Z'e'j&d" W dQ R X ej(d#krej)d" W dQ R X dS )$    N)Image	ImageFilePngImagePluginfeaturesZjpg_2000)Jpeg2KImagePlugins   icns   c             C   s   t jd| jtS )Nz>4sI)structunpackread
HEADERSIZE)fobj r   5/tmp/pip-build-7iwl8md4/pillow/PIL/IcnsImagePlugin.py
nextheader#   s    r   c             C   sD   |\}}| j | | j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   sv  |\}}| j | |d |d  |d |d  f}|d |d  }||d krr| j|}tjd||dddd} ntjd|d}xtdD ]}	g }
|}x|dkr| jd}|sP |d }|d@ r|d	 }| jd}x4t|D ]}|
j| qW n|d }|
j| j| ||8 }|dkrP qW |dkr>td
t| dtjd|dj	|
dddd}|j
j|j
|	 qW 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	bytesleftZbyte	blocksizeibandr   r   r   r   1   s>    
 



r   c             C   sf   |d }| j | |d |d  |d |d  f}|d |d  }tjd|| j|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   |\}}| j | | jd}|d d dkrT| j | tj| }tj|j d|iS |d d dks||d d dks||dkrtstd	| j | | j|}t	j
|}tj|}tj|j |jdkr|j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modeconvert)	r   r   r   r   r   r   r)   Z
jp2kstreamfr   r   r   read_png_or_jpeg2000e   s.    









r;   c               @   s   e Zd Zd(defgd)defgd*defgd+defgd,d
efgd-defdefdefgd.defgd/defgd0defdefgd1defdefdefgd2defgd3defdefdefgiZdd Zdd  Z	d!d" Z
d#d$ Zd4d&d'Zd%S )5IcnsFile   r   s   ic10r   s   ic09   s   ic14s   ic08r   s   ic13s   ic07s   it32s   t8mk@   s   icp6    s   ic120   s   ih32s   h8mks   icp5s   il32s   l8mk   s   ic11s   icp4s   is32s   s8mkc             C   s   i  | _ }|| _t|\}}|tkr,tdt}xZ||k rt|\}}|dkrVtd|t7 }|t8 }||f||< |j|tj ||7 }q2W dS )z@
        fobj is a file-like object as an icns resource
        znot an icns filer   zinvalid block headerN)	dctr   r   MAGICr   r   r   r6   SEEK_CUR)selfr   rC   r   filesizer.   r-   r   r   r   __init__   s    

zIcnsFile.__init__c             C   sH   g }x>| j j D ]0\}}x&|D ]\}}|| jkr|j| P qW qW |S )N)SIZESitemsrC   r&   )rF   sizesr   Zfmtsfmtreaderr   r   r   	itersizes   s    


zIcnsFile.itersizesc             C   s   | j  }|stdt|S )NzNo 32bit icon resources found)rN   r   max)rF   rK   r   r   r   bestsize   s    zIcnsFile.bestsizec             C   sH   i }x>| j | D ]0\}}| jj|}|dk	r|j|| 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)rI   rC   getupdater   )rF   r   rC   coderM   descr   r   r   dataforsize   s    zIcnsFile.dataforsizeNc             C   s   |d kr| j  }t|dkr.|d |d df}| j|}|jdd }|rL|S |jdj }y|j|d  W n tk
r   Y nX |S )Nr   r   r   r3   r   r0   )rP   lenrU   rQ   copyZputalphaKeyError)rF   r   Zchannelsr)   r   r   r   getimage   s    
zIcnsFile.getimage)r=   r=   r   )r=   r=   r   )r>   r>   r   )r>   r>   r   )r   r   r   )r   r   r   )r?   r?   r   )r@   r@   r   )rA   rA   r   )r@   r@   r   )rB   rB   r   )rB   rB   r   )N)__name__
__module____qualname__r;   r   r1   r   rI   rH   rN   rP   rU   rY   r   r   r   r   r<      s4   







	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 | jd< | jj | _| jd | jd  | jd | jd  f| _d S )Nr3   rK   r   r   r   )	r<   fpicnsr8   rN   inforP   	best_sizer   )rF   r   r   r   _open   s    zIcnsImageFile._openc             C   s   | j S )N)_size)rF   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| }|| j d krtd|| _d S )	NrK   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)r`   rV   indexr5   rc   )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|  | jrd| jj| jkrdd S | j  | jj| j}|j  |j| _|j	| _	|j| _| j
  d S )Nr   r   r   r   )rV   r   ra   r   loadr)   Zload_preparer_   rY   r8   Zload_end)rF   r)   r   r   r   rh     s    zIcnsImageFile.loadN)rZ   r[   r\   __doc__formatformat_descriptionrb   propertyr   setterrh   r   r   r   r   r]      s   	
r]   c          	   C   s  t |dr|j  ddddddddd}d	d
 | jjdg D }i }xRt|j D ]B}||krf|| n| j||f}tj }|j	|d |j
 ||< qRW g }	x2|j D ]&\}
}|| }|	j|
t||d qW |jt |jtjdtdd |	D  |jd |jtjdtt|	t   x6|	D ].}|j|d  |jtjdt|d   q(W xD|	D ]<}|j|d  |jtjdt|d   |j|d  q`W t |dr|j  dS )za
    Saves the image as a series of PNG files,
    that are then combined into a .icns file.
    flushr   r>   i   i   r@   r?   )s   ic07s   ic08s   ic09s   ic10s   ic11s   ic12s   ic13s   ic14c             S   s   i | ]}||j qS r   )width)rd   r)   r   r   r   
<dictcomp>D  s    z_save.<locals>.<dictcomp>Zappend_imagesZpng)typer   streamz>ic             s   s   | ]}|d  V  qdS )r   Nr   )rd   entryr   r   r   	<genexpr>X  s    z_save.<locals>.<genexpr>s   TOC rq   r   rr   N)hasattrrn   ZencoderinforQ   setvaluesresizer6   r7   savegetvaluerJ   r&   rV   writerD   r   packsumr   )r)   r^   filenamerK   Zprovided_imagesZsize_streamsr   imagetempentriesrq   rr   rs   r   r   r   _save2  sF    

 

 
r   c             C   s   | d d t kS )Nr   )rD   )prefixr   r   r   _acceptk  s    r   z.icnsz
image/icns__main__r   z)Syntax: python3 IcnsImagePlugin.py [file]r   rbrK   zout-%s-%s-%s.pngzout.pngZwindows)*r6   osr   sysZPILr   r   r   r   Zcheck_codecr4   r   rD   r   r   r   r   r1   r;   r<   r]   r   r   Zregister_openrj   Zregister_extensionZregister_saveZregister_mimerZ   rV   argvprintexitopenr^   Zimfr`   r   ry   r)   platformZ	startfiler   r   r   r   <module>   sF   

*
 eH9
