U
    ڲg.                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dlmZ ddlm	Z	m
Z
mZmZ edZerjd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dddddZdd d!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 rBe#d( e$  e%ej"d d)Z&ee&Z'e'j(d* D ]4Z)e) \Z*Z+Z,e'_)e'-d+e* d,e+ d,e, d- qfe	%ej"d Z.e.-d. W 5 Q R X ej/d/kre0d. W 5 Q R X dS )0    )annotationsN)IO   )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-xela2va7/PIL/IcnsImagePlugin.py
nextheader%   s    r   c                 C  sH   |\}}|  | | d}|dkr0d}t|t| |d |d f|S )N   s       z'Unknown signature, expecting 0x00000000)seekr   SyntaxErrorread_32)r   start_lengthsizestartlengthsigmsgr   r   r   read_32t)   s    

r   c              
   C  sp  |\}}|  | |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r:d
t| d}t|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      r      RGBrawN   }   zError reading channel [z left]L    )r   r   r   
frombuffernewrangeappendreprr   joinimZputband)r   r   r   r   r   
pixel_sizesizesqZindatar,   Zband_ixdataZ	bytesleftbyte	blocksizeir   bandr   r   r   r   4   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.   r3   r   r   r   read_mk_   s    
 r5   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sd	}t||  | | |}t	
|}	t|	}t|j |jdkr|d}d|iS d
}t|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,   r   Z
jp2kstreamfr   r   r   read_png_or_jpeg2000i   s8    









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))   rI   r   )rI   rI   r   )   rJ   r   )rJ   rJ   r   )r"   r"   r   )r"   r"   r   )@   rK   r   )    rL   r   )0   rM   r   )rL   rL   r   )   rN   r   )rN   rN   r   c                 C  s   i  | _ }|| _t|\}}t|s0d}t|t}||k rt|\}}|dkr\d}t||t7 }|t8 }||f||< ||tj ||7 }q4d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   r:   SEEK_CUR)selfr   rO   r   filesizer   r2   r1   r   r   r   __init__   s"    
zIcnsFile.__init__c                 C  sB   g }| j  D ].\}}|D ] \}}|| jkr||  qqq|S N)SIZESitemsrO   r)   )rR   sizesr   Zfmtsfmtreaderr   r   r   	itersizes   s    

zIcnsFile.itersizesc                 C  s    |   }|sd}t|t|S )NzNo 32bit icon resources found)r[   r   max)rR   rX   r   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)rV   rO   getupdater   )rR   r   rO   coderZ   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   r7   r    r4   )r]   lenrb   r^   copyZputalphaKeyError)rR   r   Zchannelsr,   r   r   r   getimage   s    
zIcnsFile.getimage)N)__name__
__module____qualname__r?   r   r5   r   rV   rT   r[   r]   rb   rf   r   r   r   r   r@      s6   	r@   c                   @  sH   e Zd ZdZdZdZdd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 resourceNone)returnc                 C  s\   t | j| _d| _| j | jd< | j | _| jd | jd  | jd | jd  f| _d S )Nr7   rX   r   r   r   )	r@   fpicns_moder[   infor]   	best_sizer   rR   r   r   r   _open   s    zIcnsImageFile._openc                 C  s   | j S rU   )_sizerr   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rd}t||| _d S )	NrX   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)rp   rc   indexr9   rt   )rR   valueZ	info_sizeZsimple_sizesr   r   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   )rc   r   rq   r   loadr,   Zload_preparern   rf   r<   ro   )rR   Zpxr,   r   r   r   ry   "  s    zIcnsImageFile.loadN)rg   rh   ri   __doc__formatformat_descriptionrs   propertyr   setterry   r   r   r   r   rj      s   



rj   zImage.Imagez	IO[bytes]zstr | bytesrk   )r,   rm   filenamerl   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| |f 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  q@|	D ]8}||d  |td|d  ||d  qpt |dr|  dS )za
    Saves the image as a series of PNG files,
    that are then combined into a .icns file.
    flushr"   rJ   rI   i   rL   rK   )rF   rD   rB   rA   rH   rG   rE   rC   c                 S  s   i | ]}|j |qS r   )width)ru   r,   r   r   r   
<dictcomp>N  s      z_save.<locals>.<dictcomp>Zappend_imagesZpngr
   c                 s  s   | ]}|d  V  qdS )r   Nr   )ru   entryr   r   r   	<genexpr>d  s     z_save.<locals>.<genexpr>z>is   TOC r   r   r   N)hasattrr   Zencoderinfor^   setvaluesresizer:   r;   savegetvaluerW   r)   r   rc   writeMAGICsumr   pack)r,   rm   r   rX   Zprovided_imagesZsize_streamsr   imagetempentriestypestreamZfile_lengthr   r   r   r   _save<  sR    




r   bytesbool)prefixrl   c                 C  s   | d d t kS )Nr   )r   )r   r   r   r   rP   x  s    rP   z.icnsz
image/icns__main__r   z)Syntax: python3 IcnsImagePlugin.py [file]rbrX   zout--z.pngzout.pngZwindows)1
__future__r   r:   osr   systypingr    r   r   r   r   Zcheck_codecr8   r	   r   r   r   r   r   r5   r?   r@   rj   r   rP   Zregister_openr{   Zregister_extensionZregister_saveZregister_mimerg   rc   argvprintexitopenrm   Zimfrp   r   r   heightZscaler   r,   platformZ	startfiler   r   r   r   <module>   sJ   
+
"gJ<
"