o
    f.                     @  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r5d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d3d d!Zd4d%d&Ze	ejee e	ejd' e	eje e	ejd( e d)kre!ej"d*k re#d+ e$  e%ej"d d,[Z&ee&Z'e'j(d- D ]Z)e) \Z*Z+Z,e'_)e'-d.e* d/e+ d/e, d0 qe	%ej"d Z.e.-d1 W d   n1 sw   Y  ej/d2kre0d1 W d   dS W d   dS 1 sw   Y  dS dS )5    )annotationsN)IO   )Image	ImageFilePngImagePluginfeaturesjpg_2000)Jpeg2KImagePlugins   icns   c                 C  s   t d| tS )Nz>4sI)structunpackread
HEADERSIZE)fobj r   L/home/ubuntu/webapp/venv/lib/python3.10/site-packages/PIL/IcnsImagePlugin.py
nextheader%   s   r   c                 C  sH   |\}}|  | | d}|dkrd}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  st  |\}}|  | |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 ]o}	g }
|}|dkr| d}|sXn7|d }|d@ rv|d	 }| d}t|D ]}|
| qmn|d }|
| | ||8 }|dkrn|dksP|dkrd
t| d}t|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      r      RGBrawN   }   zError reading channel [z left]L    )r   r   r   
frombuffernewrangeappendreprr   joinimputband)r   r   r   r   r   
pixel_sizesizesqindatar-   band_ixdata	bytesleftbyte	blocksizeir   bandr   r   r   r   4   sF   
 


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/   r0   r8   r   r   r   read_mk_   s   
 r:   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rntsFd	}t||  | | |}t	
|}	t|	}t|j |jdkrj|d}d|iS d
}t|)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-   r   
jp2kstreamfr   r   r   read_png_or_jpeg2000i   s2   









rH   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))   rR   r   )rR   rR   r   )   rS   r   )rS   rS   r   )r#   r#   r   )r#   r#   r   )@   rT   r   )    rU   r   )0   rV   r   )rU   rU   r   )   rW   r   )rW   rW   r   c                 C  s   i  | _ }|| _t|\}}t|sd}t|t}||k rMt|\}}|dkr.d}t||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   _acceptr   r   r   rA   SEEK_CUR)selfr   rX   r   filesizer   r7   r6   r   r   r   __init__   s$   
zIcnsFile.__init__c                 C  sB   g }| j  D ]\}}|D ]\}}|| jv r||  nqq|S N)SIZESitemsrX   r*   )r[   sizesr   fmtsfmtreaderr   r   r   	itersizes   s   

zIcnsFile.itersizesc                 C  s    |   }|sd}t|t|S )NzNo 32bit icon resources found)re   r   max)r[   ra   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_   rX   getupdater   )r[   r   rX   coderd   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   r<   r!   r9   )rg   lenrl   rh   copyputalphaKeyError)r[   r   channelsr-   r   r   r   getimage   s    
zIcnsFile.getimager^   )__name__
__module____qualname__rH   r   r:   r   r_   r]   re   rg   rl   rr   r   r   r   r   rI      s8    	rI   c                   @  sD   e Zd ZdZdZdZ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.
    ICNSzMac OS icns resourcereturnNonec                 C  s\   t | j| _d| _| j | jd< | j | _| jd | jd  | jd | jd  f| _d S )Nr<   ra   r   r   r   )	rI   fpicns_modere   inforg   	best_sizer   r[   r   r   r   _open   s   
zIcnsImageFile._openc                 C  s   | j S r^   )_sizer   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rPd}t||| _d S )	Nra   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}   rm   indexr@   r   )r[   value	info_size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 ur4| jj| jkr4|S |   | j| j}| }|j| _|j	| _
|j| _|S )Nr    r   r   r   )rm   r   r~   r   loadr-   load_preparer{   rr   rD   r|   )r[   pxr-   r   r   r   r   "  s   zIcnsImageFile.loadN)rx   ry   )rs   rt   ru   __doc__formatformat_descriptionr   propertyr   setterr   r   r   r   r   rv      s    




rv   r-   Image.Imagerz   	IO[bytes]filenamestr | bytesrx   ry   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| |f 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#   rS   rR   i   rU   rT   )rO   rM   rK   rJ   rQ   rP   rN   rL   c                 S  s   i | ]}|j |qS r   )width)r   r-   r   r   r   
<dictcomp>N  s    z_save.<locals>.<dictcomp>append_imagespngr   c                 s  s    | ]}|d  V  qdS )r   Nr   )r   entryr   r   r   	<genexpr>d  s    z_save.<locals>.<genexpr>z>is   TOC r   r   r   N)hasattrr   encoderinforh   setvaluesresizerA   rB   savegetvaluer`   r*   r   rm   writeMAGICsumr   pack)r-   rz   r   ra   provided_imagessize_streamsr   imagetempentriestypestreamfile_lengthr   r   r   r   _save<  sT   




r   prefixbytesboolc                 C  s   | d d t kS )Nr   )r   )r   r   r   r   rY   x  s   rY   z.icnsz
image/icns__main__r   z)Syntax: python3 IcnsImagePlugin.py [file]rbra   zout--z.pngzout.pngwindows)r-   r   rz   r   r   r   rx   ry   )r   r   rx   r   )1
__future__r   rA   osr   systypingr    r   r   r   r   check_codecr?   r
   r   r   r   r   r   r:   rH   rI   rv   r   rY   register_openr   register_extensionregister_saveregister_mimers   rm   argvprintexitopenrz   imfr}   r   r   heightscaler   r-   platform	startfiler   r   r   r   <module>   sV   
+
"g
J
<
 
"