U
    Å½„bR%  ã                	   @   s¶  d dl Z d dlZd dlZd dlmZmZ dd„ Zddddd	d
gZdd„ Zdd„ Z	G dd„ dejƒZ
d&dd„Zdd„ Zdd„ Zdd„ Ze e
je
¡ e e
je¡ edk�r²eejƒdk rÈedƒ e ¡  ejd Ze	eƒsêedƒ e ¡  e e¡�¸Zedeeƒ ƒ edeejƒ ƒ edeejƒ ƒ ed eejƒ ƒ ed!d"d#� ee ¡ ƒ eejƒdk�r¨ejd Ze ej j!¡Zed$e j" #e¡› d%e› d"�ƒ e $ee
j¡ W 5 Q R X dS )'é    N)ÚImageÚ	ImageFilec              	   C   sD   z$t | ƒ}| | dkrW dS W dS W n ttfk
r>   Y dS X d S )Nr   é   )ÚintÚ
ValueErrorÚOverflowError)ÚfÚi© r
   ú9/tmp/pip-unpacked-wheel-_wxctax1/PIL/SpiderImagePlugin.pyÚisInt*   s    
r   r   é   iõÿÿÿiôÿÿÿiëÿÿÿiêÿÿÿc                 C   st   d|  }dD ]}t || ƒs dS qt|d ƒ}|tkr<dS t|d ƒ}t|d ƒ}t|d ƒ}||| krpdS |S )N©éc   )r   é   é   é   é   é   é   r   r   r   r   r   )r   r   Úiforms)ÚtÚhr	   ÚiformÚlabrecÚlabbytÚlenbytr
   r
   r   ÚisSpiderHeader>   s    r   c              	   C   sT   t | dƒ�}| d¡}W 5 Q R X t d|¡}t|ƒ}|dkrPt d|¡}t|ƒ}|S )NÚrbé\   z>23fr   z<23f)ÚopenÚreadÚstructÚunpackr   )ÚfilenameÚfpr   r   Úhdrlenr
   r
   r   ÚisSpiderImageR   s    r'   c                   @   sb   e Zd ZdZdZdZdd„ Zedd„ ƒZedd	„ ƒZ	d
d„ Z
dd„ Zddd„Zdd„ Zdd„ ZdS )ÚSpiderImageFileZSPIDERzSpider 2D imageFc           	   
   C   sà  d}| j  |¡}zPd| _t d|¡}t|ƒ}|dkrNd| _t d|¡}t|ƒ}|dkr^tdƒ‚W n. tjk
rŽ } ztdƒ|‚W 5 d }~X Y nX d| }t|d ƒ}|dkr´td	ƒ‚t|d
 ƒt|d ƒf| _	t|d ƒ| _
t|d ƒ| _| j
dk�r| jdk�r|}d| _nŒ| j
dk�rh| jdk�rht|d
 ƒt|d ƒ d | _|| _t|d ƒ| _|d }d| _n2| j
dk�r’| jdk�r’|| j }d| _
ntdƒ‚| j�rªd| _nd| _d| _dd| j || jddffg| _| j | _d S )Nél   r   z>27fr   z<27fznot a valid Spider filer   r   znot a Spider 2D imager   r   é   é   é   é   z inconsistent stack header valueszF;32BFzF;32FÚFÚraw©r   r   )r%   r!   Z	bigendianr"   r#   r   ÚSyntaxErrorÚerrorr   Ú_sizeÚistackÚ	imgnumberÚ_nimagesÚimgbytesr&   Ú	stkoffsetÚrawmodeÚmodeÚsizeZtileÚ_SpiderImageFile__fp)	ÚselfÚnr   r   r&   Úer   r   Úoffsetr
   r
   r   Ú_openc   sP    
zSpiderImageFile._openc                 C   s   | j S ©N©r6   ©r=   r
   r
   r   Ún_framesš   s    zSpiderImageFile.n_framesc                 C   s
   | j dkS ©Nr   rC   rD   r
   r
   r   Úis_animatedž   s    zSpiderImageFile.is_animatedc                 C   s   | j dk rdS | j d S d S )Nr   r   )r5   rD   r
   r
   r   Útell£   s    
zSpiderImageFile.tellc                 C   sZ   | j dkrtdƒ‚|  |¡s d S | j|| j| j   | _| j| _| j | j¡ |  	¡  d S )Nr   z#attempt to seek in a non-stack file)
r4   ÚEOFErrorZ_seek_checkr&   r7   r8   r<   r%   ÚseekrA   )r=   Úframer
   r
   r   rJ   ©   s    

zSpiderImageFile.seekéÿ   c                 C   sH   |   ¡ \}}d}||kr$|||  }| | }|  ||fdd„¡ d¡S )Nr   c                 S   s   | | | S rB   r
   )r	   ÚmÚbr
   r
   r   Ú<lambda>º   ó    z.SpiderImageFile.convert2byte.<locals>.<lambda>ÚL)Ú
getextremaZpointÚconvert)r=   ÚdepthZminimumÚmaximumrM   rN   r
   r
   r   Úconvert2byte´   s    
zSpiderImageFile.convert2bytec                 C   s   ddl m} |j|  ¡ dd�S )Nr   )ÚImageTké   )Zpalette)ÚPILrW   Z
PhotoImagerV   )r=   rW   r
   r
   r   ÚtkPhotoImage½   s    zSpiderImageFile.tkPhotoImagec                 C   sB   z4z| j | jkr| j  ¡  W n tk
r0   Y nX W 5 d | _ X d S rB   )r<   r%   ÚcloseÚAttributeErrorrD   r
   r
   r   Ú
_close__fpÂ   s    
zSpiderImageFile._close__fpN)rL   )Ú__name__Ú
__module__Ú__qualname__ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingrA   ÚpropertyrE   rG   rH   rJ   rV   rZ   r]   r
   r
   r
   r   r(   ]   s   7


	r(   c              
   C   sª   | dkst | ƒdk rdS g }| D ]„}tj |¡s@td|› �ƒ q z"t |¡�}| ¡ }W 5 Q R X W n, tk
rŽ   t	|ƒs†t|d ƒ Y q Y nX ||j
d< | |¡ q |S )zJcreate a list of :py:class:`~PIL.Image.Image` objects for use in a montageNr   zunable to find z is not a Spider image filer$   )ÚlenÚosÚpathÚexistsÚprintr   r    rV   Ú	Exceptionr'   ÚinfoÚappend)ÚfilelistZimglistÚimgÚimr
   r
   r   ÚloadImageSeriesÐ   s"    

ro   c           	      C   sê   | j \}}|d }td| ƒ}d| dkr2|d7 }|| }t|d ƒ}|dk rRg S g }t|ƒD ]}| d¡ q^d|d< t|ƒ|d< t|ƒ|d	< d|d
< t|ƒ|d< t|ƒ|d< t|ƒ|d< t|ƒ|d< |dd … }| d¡ dd„ |D ƒS )Nr,   i   r   r   r   g        g      ð?r   r   r   r   r   r   c                 S   s   g | ]}t  d |¡‘qS )r   )r"   Úpack)Ú.0Úvr
   r
   r   Ú
<listcomp>  s     z$makeSpiderHeader.<locals>.<listcomp>)r;   r   Úrangerk   Úfloat)	rn   ZnsamZnrowr   r   r   ZnvaluesÚhdrr	   r
   r
   r   ÚmakeSpiderHeaderê   s.    

rw   c              
   C   sj   | j d dkr|  d¡} t| ƒ}t|ƒdk r4tdƒ‚| |¡ d}t | |dd| j d|ddffg¡ d S )	Nr   r.   rX   zError creating Spider headerzF;32NFr/   r0   r   )	r:   rS   rw   rd   ÚOSErrorÚ
writelinesr   Ú_saver;   )rn   r%   r$   rv   r9   r
   r
   r   rz   
  s    

rz   c                 C   s.   t j |¡d }t tj|¡ t| ||ƒ d S rF   )re   rf   Úsplitextr   Zregister_extensionr(   ra   rz   )rn   r%   r$   Úextr
   r
   r   Ú_save_spider  s    r}   Ú__main__r   z7Syntax: python3 SpiderImagePlugin.py [infile] [outfile]z$input image must be in Spider formatzimage: zformat: zsize: zmode: z
max, min: ú )Úendzsaving a flipped version of z as )N)%re   r"   ÚsysrY   r   r   r   r   r   r'   r(   ro   rw   rz   r}   Zregister_openra   Zregister_saver^   rd   Úargvrh   Úexitr$   r    rn   Ústrr;   r:   rR   ÚoutfileZ	transposeZ	TransposeZFLIP_LEFT_RIGHTrf   ÚbasenameÚsaver
   r
   r
   r   Ú<module>#   sH   	s
 



ÿ