o
    _#a-                  	   @   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
r)d 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 red e   e!ejd dNZ"ee"Z#e#j$d  D ]Z%e%e#_%e#&d!e%  qe!ejd Z'e'&d" W d   n1 sw   Y  ej(d#kre)d" W d   dS W d   dS 1 sw   Y  dS dS )$    N)Image	ImageFilePngImagePluginfeaturesjpg_2000)Jpeg2KImagePlugins   icns   c                 C   s   t d| tS )Nz>4sI)structunpackread
HEADERSIZE)fobj r   5/usr/lib/python3/dist-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   sp  |\}}|  | |d |d  |d |d  f}|d |d  }||d kr;| |}td||dddd}d|iS td|d}tdD ]m}	g }
|}|dkr| d}|sXn7|d }|d@ rv|d	 }| d}t|D ]}|
| qmn|d }|
| | ||8 }|dkrn|dksP|dkrtd
t| dtd|d	|
dddd}|j
|j
|	 qFd|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imputband)r   r   r   r   r   
pixel_sizesizesqindatar*   band_ixdata	bytesleftbyte	blocksizeibandr   r   r   r   1   sD   
 


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-   r5   r   r   r   read_mk[   s   
 r7   c           	      C   s   |\}}|  | | d}|d d dkr*|  | t| }t|j d|iS |d d dks>|d d dks>|dkrltsDtd	|  | | |}t	
|}t|}t|j |jdkrh|d}d|iS td
)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   PngImageFiler   _decompression_bomb_checkr   enable_jpeg2k
ValueErrorioBytesIOr   Jpeg2KImageFilemodeconvert)	r   r   r   r   r   r   r*   
jp2kstreamfr   r   r   read_png_or_jpeg2000e   s0   









rE   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))   rO   r   )rO   rO   r   )   rP   r   )rP   rP   r   )r    r    r   )r    r    r   )@   rQ   r   )    rR   r   )0   rS   r   )rR   rR   r   )   rT   r   )rT   rT   r   c                 C   s   i  | _ }|| _t|\}}|tkrtdt}||k rIt|\}}|dkr*td|t7 }|t8 }||f||< ||tj ||7 }||k sdS 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   r>   SEEK_CUR)selfr   rU   r   filesizer4   r3   r   r   r   __init__   s    
zIcnsFile.__init__c                 C   sB   g }| j  D ]\}}|D ]\}}|| jv r||  nqq|S N)SIZESitemsrU   r'   )rX   sizesr   fmtsfmtreaderr   r   r   	itersizes   s   

zIcnsFile.itersizesc                 C   s   |   }|s
tdt|S )NzNo 32bit icon resources found)rb   r   max)rX   r^   r   r   r   bestsize   s   zIcnsFile.bestsizec                 C   sD   i }| j | D ]\}}| j|}|du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)r\   rU   getupdater   )rX   r   rU   codera   descr   r   r   dataforsize   s   zIcnsFile.dataforsizeNc                 C   s   |d u r|   }t|dkr|d |d df}| |}|dd }|r&|S |d }z
||d  W |S  tyA   Y |S w )Nr   r   r   r9   r   r6   )rd   lenri   re   copyputalphaKeyError)rX   r   channelsr*   r   r   r   getimage   s    
zIcnsFile.getimager[   )__name__
__module____qualname__rE   r   r7   r   r\   rZ   rb   rd   ri   ro   r   r   r   r   rF      s8    	rF   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.
    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 )Nr9   r^   r   r   r   )	rF   fpicnsrA   rb   inford   	best_sizer   rX   r   r   r   _open   s   
zIcnsImageFile._openc                 C   s   | j S r[   )_sizery   r   r   r   r     s   zIcnsImageFile.sizec                 C   s   |}|| j d vrt|dkr|d |d df}|| j d vrCt|dkrC|d dkrCdd | j d D }||v rC| j d || }|| j d vrNtd|| _d S )	Nr^   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)rw   rj   indexr=   r{   )rX   value	info_size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r2| jj| jkr2d S |   | j| j}|  |j| _|j	| _	|j| _| 
  d S )Nr   r   r   r   )rj   r   rx   r   loadr*   load_preparerv   ro   rA   load_end)rX   r*   r   r   r   r     s   zIcnsImageFile.loadN)rp   rq   rr   __doc__formatformat_descriptionrz   propertyr   setterr   r   r   r   r   rs      s    



rs   c              	   C   s  t |dr	|  ddddddddd}d	d
 | jdg D }i }t| D ]!}||v r2|| n| ||f}t }|	|d |
 ||< q(g }	| D ]\}
}|| }|	|
tt| |d qP|t t}|tdt|	  7 }|tdd |	D 7 }|td| |d |tdtt|	t   |	D ]}||d  |td|d  q|	D ]}||d  |td|d  ||d  qt |dr|  dS dS )za
    Saves the image as a series of PNG files,
    that are then combined into a .icns file.
    flushr    rP   rO   i   rR   rQ   )rL   rJ   rH   rG   rN   rM   rK   rI   c                 S   s   i | ]}|j |qS r   )width)r|   r*   r   r   r   
<dictcomp>D  s    z_save.<locals>.<dictcomp>append_imagespng)typer   streamr   c                 s   s    | ]}|d  V  qdS )r   Nr   )r|   entryr   r   r   	<genexpr>\  s    z_save.<locals>.<genexpr>z>is   TOC r   r   r   N)hasattrr   encoderinfore   setvaluesresizer>   r?   savegetvaluer]   r'   r   rj   writerV   sumr	   pack)r*   ru   filenamer^   provided_imagessize_streamsr   imagetempentriesr   r   file_lengthr   r   r   r   _save2  sX   




r   c                 C   s   | d d t kS )Nr   )rV   )prefixr   r   r   _acceptp  s   r   z.icnsz
image/icns__main__r   z)Syntax: python3 IcnsImagePlugin.py [file]r   rbr^   zout-%s-%s-%s.pngzout.pngwindows)*r>   osr	   sysPILr   r   r   r   check_codecr<   r   rV   r   r   r   r   r7   rE   rF   rs   r   r   register_openr   register_extensionregister_saveregister_mimerp   rj   argvprintexitopenru   imfrw   r   r   r*   platform	startfiler   r   r   r   <module>   sR   

*
 eH>
"