U
    ڲg?                     @  s8  U d dl mZ d dlZd dl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 ddlmZ ddlmZ edZed	Zdad
ed< daddddZd&ddZG dd dZdddddZG dd dejZd'dddddd d!d"Zeejee e eje e!ejd#d$g e"ejd% dS )(    )annotationsN)IO   )Image	ImageFile)i32le)	deprecatez^%%([^:]*):[ \t]*(.*)[ \t]*$z^%[%!\w]([^:]*)[ \t]*$zstr | bool | None	gs_binaryboolreturnc                  C  s   t d krtjdrNtd krHdd l} dD ]}| |d k	r(|a qHq(data n6ztjddgtj	d da W n t
k
r   da Y nX t dk	S )Nwinr   )Zgswin32cZgswin64cgsFr   z	--version)stdout)r	   sysplatform
startswithgs_windows_binaryshutilwhich
subprocess
check_callDEVNULLOSError)r   binary r   6/tmp/pip-unpacked-wheel-xela2va7/PIL/EpsImagePlugin.pyhas_ghostscript.   s     
r   Fc                 C  s\  t  sd}t|| d \}} }}|\}	}
t|p4d}|d | }|d | }d| |
d |
d   }d| |
d |
d   }t \}}t| d}t|drtj	|j
r|j
}nt \}}t| |}t|d	h}|dtj | }|d |}|dkr@|t|d
}|s&q@|t|8 }|| qW 5 Q R X |rTdnd}tdd|dd|dd|dd|ddddd| d| d|
d   d|
d   dd|ddg}zNd}tjdrt }| jtjO  _tj||d t|}|  W 5 zt| |r*t| W n tk
rB   Y nX X |j ! }|  |S )z!Render an image using Ghostscriptz%Unable to locate Ghostscript on pathsr   r   g      R@      Nnamewbi  ZpngalphaZppmrawz-qz-gdxz-rfz-dBATCHz	-dNOPAUSEz-dSAFERz	-sDEVICE=z-sOutputFile=z-c z
 translatez-fZshowpager   )startupinfo)"r   r   inttempfilemkstemposclosehasattrpathexistsr    openseekioSEEK_ENDtellreadminlenwriter	   unlinkr   r   r   r   ZSTARTUPINFOZdwFlagsZSTARTF_USESHOWWINDOWr   r   loadimcopy)tilesizefpscaletransparencymsgdecoderoffsetdatalengthZbboxwidthheightZres_xZres_yZout_fdoutfileZinfile_tempinfileZin_fdr$   fsizeZ
lengthfilesZdevicecommandr&   Zout_imr:   r   r   r   GhostscriptE   s~    






rM   c                   @  s4   e Zd ZdZdd ZejfddZdddd	Zd
S )PSFilez
    Wrapper for bytesio object that treats either CR or LF as end of line.
    This class is no longer used internally, but kept for backwards compatibility.
    c                 C  s   t dddd || _d | _d S )NrN      zSIf you need the functionality of this class you will need to implement it yourself.)action)r   r>   char)selfr>   r   r   r   __init__   s    zPSFile.__init__c                 C  s   d | _ | j|| d S N)rQ   r>   r0   )rR   rC   whencer   r   r   r0      s    zPSFile.seekstrr   c                 C  st   | j pdg}d | _ | jd}|dkrFt|rF|| | jd}q| jd| _ | j dkrdd | _ d|dS )N    r      
latin-1)rQ   r>   r4   r6   appendjoindecode)rR   rK   cr   r   r   readline   s    

zPSFile.readlineN)	__name__
__module____qualname____doc__rS   r1   SEEK_SETr0   r^   r   r   r   r   rN      s   
rN   bytes)prefixr   c                 C  s(   | d d dkp&t | dko&t| dkS )N      %!PS   P )r6   i32)re   r   r   r   _accept   s    rj   c                   @  sV   e Zd ZdZdZdZdddddZd	d
ddZdd ZdddZ	dd	dddZ
dS )EpsImageFilez.EPS File Parser for the Python Imaging LibraryZEPSzEncapsulated PostscriptLZLABRGBCMYK)r   r   r   rf   Noner   c                   s   j\ j d_d _td}t|}d}d}ddddfdd	}d
dd fdd}jd}|dkr|dkr|r|  qnb|dkr|dkrqvnN|dkr|d tdkrd}t	|n|r|  d}d}|d ||< |d7 }qv|r|d tdks.|d d dkr:|  d}qvt
|d | d}	||	st|	}
|
r|
d}|d d dkr|dd  jd< n
dj|< n|	d dkrnd}t|n|d d dkrb|d| d d}dd  |d d! D \}}}}|dkrd"_n>|dkrzj| _W n tk
rL   Y qY nX nq||f_d S |d d# d$krzqn>rrt
|d | d}	||	 n|d d d%krdd}qvjsd&}t|d S )'Nrm      r   TFro   r   c                    s0   d j krd} t| d j kr,d} t| dS )z
            The EPS specification requires that some headers exist.
            This should be checked when the header comments formally end,
            when image data starts, or when the file ends, whichever comes first.
            PS-Adobez'EPS header missing "%!PS-Adobe" commentBoundingBoxz*EPS header missing "%%BoundingBox" commentN)infoSyntaxError)rA   )rR   r   r   check_required_header_comments   s    

z:EpsImageFile._open.<locals>.check_required_header_commentsrV   r
   )rK   r   c              
     s   zt | }W n2 tjk
r@ } zd}t||W 5 d }~X Y nX |sJdS |dd\}}|j|< |dkr|dkrzdnvjrrrzRdd	 |  D }|d |d
  |d |d  f_ddj  |ffg_	W n t
k
r   Y nX dS )Nnot an EPS fileFr   r   rr   z(atend)Tc                 S  s   g | ]}t t|qS r   )r'   float).0ir   r   r   
<listcomp>
  s     z=EpsImageFile._open.<locals>._read_comment.<locals>.<listcomp>r   r   epsr   r   )splitmatchreerrorrt   grouprs   _sizer=   r<   	Exception)rK   merA   kvZboxrE   rC   Zreading_trailer_commentsrR   Ztrailer_reachedr   r   _read_comment   s(    
"z)EpsImageFile._open.<locals>._read_commentr   rW   rX   %rv      s   %%EndCommentsrY      rq   	    zbad EPS headerrO   s   %ImageData:   c                 s  s   | ]}t |V  qd S rT   )r'   )rx   valuer   r   r   	<genexpr>]  s    z%EpsImageFile._open.<locals>.<genexpr>rf   1   s   %%EOFs	   %%Trailerz!cannot determine EPS bounding box)_find_offsetr>   r0   _moder   	bytearray
memoryviewr4   ordrt   rV   fieldr~   r   rs   r   r}   mode_map
ValueError)rR   Zbyte_arrZbytes_mv
bytes_readZreading_header_commentsru   r   byterA   rK   r   r   Zimage_data_valuescolumnsZrowsZ	bit_depthZmode_idr   r   r   _open   s    
$








zEpsImageFile._openc                 C  sl   | d}|dkr.|dtj | }d}n6t|dkrX| d}t|}t|d}nd}t|||fS )Nrf   rg   r   rh   r   rv   )r4   r0   r1   r2   r3   ri   rt   )rR   r>   rK   rE   rC   rA   r   r   r   r   {  s    

zEpsImageFile._find_offsetr   Fc                 C  sD   | j r8t| j | j| j||| _| jj| _| jj| _g | _ tj	| S rT   )
r<   rM   r=   r>   r:   moder   r   r   r9   )rR   r?   r@   r   r   r   r9     s    

zEpsImageFile.loadr'   )posr   c                 C  s   d S rT   r   )rR   r   r   r   r   	load_seek  s    zEpsImageFile.load_seekN)r   F)r_   r`   ra   rb   formatformat_descriptionr   r   r   r9   r   r   r   r   r   rk      s    $
	rk   zImage.Imagez	IO[bytes]zstr | bytesr'   ro   )r:   r>   filenamer{   r   c                 C  s  |    | jdkrd}n,| jdkr(d}n| jdkr8d}nd}t||r|d |d	 |d
| j  |d |d |d |d| j  |d|  |d |d |d| jd |d    |d| j  |d| j  |d| jd | jd | jd f  |d ||d d  t|drN|  t| |dd| j ddfg |d |d  t|dr|  dS )!z*EPS Writer for the Python Imaging Library.rl   )r   r   s   imagerm   )r   r   s   false 3 colorimagern   )r   rf   s   false 4 colorimagezimage mode is not supporteds   %!PS-Adobe-3.0 EPSF-3.0
s   %%Creator: PIL 0.1 EpsEncode
s   %%%%BoundingBox: 0 0 %d %d
s   %%Pages: 1
s   %%EndComments
s   %%Page: 1 1
s   %%ImageData: %d %d s   %d %d 0 1 1 "%s"
s   gsave
s   10 dict begin
s   /buf %d string def
r   r   s   %d %d scale
s   %d %d 8
s   [%d 0 0 -%d 0 %d]
s+   { currentfile buf readhexstring pop } bind
r      
flushr{   r|   Ns   
%%%%EndBinary
s   grestore end
)	r9   r   r   r7   r=   r,   r   r   _save)r:   r>   r   r{   operatorrA   r   r   r   r     sB    









&


r   z.psz.epszapplication/postscript)r   F)r   )#
__future__r   r1   r*   r   r   r   r(   typingr   r   r   r   _binaryr   ri   Z
_deprecater   compiler}   r   r	   __annotations__r   r   rM   rN   rj   rk   r   Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   <module>   s4    


]%	 U4