U
    ڲgF'                  	   @  s  d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
 ddlmZmZ dddd	d
ZddddddgZdddddZdddddZG dd dejZd9dddddZdd d!d"d#Zdd$d%d&d'd(d)Zdd$d%d&d'd*d+Zeeje eeje ed,kreejd-k r2ed. e  ejd ZeesVed/ e  e eZ!ed0e!  ed1e!j  ed2e!j"  ed3e!j#  ed4d5d6 ee!$  eejd-krejd- Z%e!&ej'j(Z!ed7ej)*e d8e% d5 e!+e%ej W 5 Q R X dS ):    )annotationsN)IOTYPE_CHECKINGAnyTuplecast   )Image	ImageFiler   int)freturnc              	   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   r   )r   
ValueErrorOverflowError)r   i r   9/tmp/pip-unpacked-wheel-xela2va7/PIL/SpiderImagePlugin.pyisInt-   s    
r      iiiiztuple[float, ...])tr   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)r   hr   iformlabreclabbytlenbytr   r   r   isSpiderHeaderA   s    r$   str)filenamer   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$   )r&   fpr   r   hdrlenr   r   r   isSpiderImageU   s    r/   c                   @  s   e Zd ZdZdZdZddddZeddd	d
ZeddddZ	ddddZ
dddddZddddddZerddlmZ ddddZdS )SpiderImageFileZSPIDERzSpider 2D imageFNone)r   c           
   
   C  s  d}| j |}zTd| _td|}t|}|dkrNd| _td|}t|}|dkrbd}t|W n2 tjk
r } zd}t||W 5 d }~X Y nX d| }t|d }|dkrd	}t|t|d
 t|d f| _	t|d | _
t|d | _| j
dkr| jdkr|}	d| _n| j
dkrt| jdkrtt|d
 t|d  d | _|| _t|d | _|d }	d| _n6| j
dkr| jdkr|| j }	d| _
nd}t|| jrd| _nd| _d| _dd| j |	| jddffg| _| j | _d S )Nl   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_fp)
selfnr   r   r.   msger   r    offsetr   r   r   _opene   sX    
zSpiderImageFile._openr   c                 C  s   | j S Nr?   rF   r   r   r   n_frames   s    zSpiderImageFile.n_framesboolc                 C  s
   | j dkS Nr   rM   rN   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   )r>   rN   r   r   r   tell   s    
zSpiderImageFile.tell)framer   c                 C  s^   | j dkrd}t|| |s$d S | j|| j| j   | _| j| _| j| j | 	  d S )Nr   z#attempt to seek in a non-stack file)
r=   EOFErrorZ_seek_checkr.   r@   rA   rE   r-   seekrK   )rF   rT   rH   r   r   r   rV      s    

zSpiderImageFile.seek   Image.Image)depthr   c                   sl   |   }t|d tstttttf |\}}d||krH|||   |  |  fdddS )Nr   r   c                   s   |    S rL   r   )r   bmr   r   <lambda>       z.SpiderImageFile.convert2byte.<locals>.<lambda>L)
getextrema
isinstancefloatAssertionErrorr   r   Zpointconvert)rF   rY   ZextremaZminimummaximumr   rZ   r   convert2byte   s    
zSpiderImageFile.convert2byter   ImageTkzImageTk.PhotoImagec                 C  s   ddl m} |j|  ddS )Nr   rg      )Zpalette) rh   Z
PhotoImagerf   )rF   rh   r   r   r   tkPhotoImage   s    zSpiderImageFile.tkPhotoImageN)rW   )__name__
__module____qualname__formatformat_descriptionZ!_close_exclusive_fp_after_loadingrK   propertyrO   rR   rS   rV   rf   r   rj   rh   rk   r   r   r   r   r0   `   s   ;
r0   zlist[str] | Nonezlist[SpiderImageFile] | None)filelistr   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	|st| 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)   rf   	Exceptionr/   infoappend)rr   Zimglistimgimr   r   r   loadImageSeries   s"    

r}   rX   zlist[bytes])r|   r   c                 C  s   | j \}}|d }td| }d| dkr2|d7 }|| }t|d }|dk rRg S dg| }d|d< t||d< t||d	< d|d
< t||d< t||d< t||d< t||d< |dd  }|d dd |D S )Nr5   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>)rD   r   rb   rz   )r|   ZnsamZnrowr#   r!   r"   Znvalueshdrr   r   r   makeSpiderHeader   s*    


r   z	IO[bytes]zstr | bytesr1   )r|   r-   r&   r   c              
   C  sn   | j d dkr| d} t| }t|dk r8d}t||| d}t| |dd| j d|ddffg d S )	Nr   r7   ri   zError creating Spider headerzF;32NFr8   r9   r   )	moderd   r   rs   OSError
writelinesr
   _saverD   )r|   r-   r&   r   rH   rB   r   r   r   r     s    

r   c                 C  sD   t j|d }t|tr"| n|}ttj	| t
| || d S rQ   )rt   ru   splitextra   bytesdecoder	   Zregister_extensionr0   ro   r   )r|   r-   r&   Zfilename_ext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),
__future__r   rt   r+   systypingr   r   r   r   r   rj   r	   r
   r   r   r$   r/   r0   r}   r   r   r   Zregister_openro   Zregister_saverl   rs   argvrw   exitr&   r)   r|   rD   r   r`   outfileZ	transposeZ	TransposeZFLIP_LEFT_RIGHTru   basenamesaver   r   r   r   <module>#   sL   	t



