U
    EvfÁ=  ã                   @  s  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	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„ Zddd„ZG dd„ dƒZdd„ ZG dd„ de
j
ƒZ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é   )ÚImageÚ	ImageFile)Úi32le)Ú	deprecatez^%%([^:]*):[ \t]*(.*)[ \t]*$z^%[%!\w]([^:]*)[ \t]*$zstr | bool | NoneÚ	gs_binaryc                  C  sŒ   t d kr„t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-ciywl2yd/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ƒr¸tj 	|j
¡r¸|j
}n’t ¡ \}}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¡rêt ¡ }| 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_imr6   r   r   r   ÚGhostscriptD   s~    



ï


rI   c                   @  s.   e Zd ZdZdd„ Zejfdd„Z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 )NrJ   é   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)rM   r:   r,   )rN   r?   Úwhencer   r   r   r,   ±   s    zPSFile.seekc                 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)rM   r:   r0   r2   ÚappendÚjoinÚdecode)rN   rG   Úcr   r   r   Úreadlineµ   s    

zPSFile.readlineN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__rO   r-   ÚSEEK_SETr,   rY   r   r   r   r   rJ   ¡   s   
rJ   c                 C  s(   | d d… dkp&t | ƒdko&t| ƒdkS )Né   ó   %!PSì   ÅP§ )r2   Úi32)Úprefixr   r   r   Ú_acceptÆ   s    rd   c                   @  sH   e Zd ZdZdZdZdddddœZd	d
„ Zdd„ Zddd„Z	dd„ Z
dS )ÚEpsImageFilez.EPS File Parser for the Python Imaging LibraryZEPSzEncapsulated PostscriptÚLZLABÚRGBÚCMYK)r   r   r   r_   c                   sÄ  ˆ  ˆj¡\‰ ‰ˆj ˆ¡ dˆ_d ˆ_tdƒ}t|ƒ}d}d}d‰d‰‡fdd„}‡ ‡‡‡‡fdd	„}ˆj d
¡}|dkrŠ|dkrìq¦nb|dkrž|dkrìqhnN|dkrÖ|d tdƒkrÄd}t	|ƒ‚n|rÒ|ƒ  d}d}|d ||< |d
7 }qh|r¨|d tdƒks|d d… dkr"|ƒ  d}qht
|d |… dƒ}	||	ƒs t |	¡}
|
rŠ|
 d
¡}|d d… dkr~|dd … ˆjd< n
dˆj|< n|	d dkršnd}t|ƒ‚nø|d d… dkrJ|d|…  d d¡}dd„ |d d… D ƒ\}}}}|d
krþdˆ_n>|dkr¦zˆj| ˆ_W n tk
r4   Y q¦Y nX nq¦||fˆ_d S |d d… dkrbq¦n>ˆrŠˆrŠt
|d |… dƒ}	||	ƒ n|d d… d kr d‰d}qh|ƒ  ˆjsÀd!}t|ƒ‚d S )"Nrg   éÿ   r   TFc                    s0   dˆ j krd} t| ƒ‚dˆ j kr,d} t| ƒ‚d S )NúPS-Adobez'EPS header missing "%!PS-Adobe" commentÚBoundingBoxz*EPS header missing "%%BoundingBox" comment)ÚinfoÚSyntaxError)r=   )rN   r   r   Úcheck_required_header_commentsç   s    

z:EpsImageFile._open.<locals>.check_required_header_commentsc              
     sô   zt  | ¡}W n2 tjk
r@ } zd}t|ƒ|‚W 5 d }~X Y nX |rð| dd¡\}}|ˆj|< |dkrì|dkrvd‰nvˆjr„ˆrìˆrìzRdd„ |  ¡ D ƒ}|d |d	  |d
 |d  fˆ_ddˆj ˆˆ |ffgˆ_	W n t
k
rê   Y nX dS d S )Núnot an EPS filer   r   rk   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Úerrorrm   Úgrouprl   Ú_sizer9   r8   Ú	Exception)rG   ÚmÚer=   ÚkÚvZbox©rA   r?   Zreading_trailer_commentsrN   Ztrailer_reachedr   r   Ú_read_commentï   s0    
ÿÿ"ÿ
z)EpsImageFile._open.<locals>._read_commentr   rR   rS   ú%ro   é   s   %%EndCommentsrT   é   rj   é	   Ú zbad EPS headerrK   s   %ImageData:é   c                 s  s   | ]}t |ƒV  qd S rP   )r#   )rq   Úvaluer   r   r   Ú	<genexpr>W  s    z%EpsImageFile._open.<locals>.<genexpr>r_   Ú1é   s   %%EOFs	   %%Trailerz!cannot determine EPS bounding box)Ú_find_offsetr:   r,   Ú_moder{   Ú	bytearrayÚ
memoryviewr0   Úordrm   ÚstrÚfieldrw   rz   rl   r   rv   Úmode_mapÚ
ValueError)rN   Zbyte_arrZbytes_mvÚ
bytes_readZreading_header_commentsrn   r‚   Úbyter=   rG   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 )Nr_   r`   r   ra   r…   ro   )r0   r,   r-   r.   r/   rb   rm   )rN   r:   rG   rA   r?   r=   r   r   r   r   w  s    

zEpsImageFile._find_offsetr   Fc                 C  sD   | j r8t| j | j| j||ƒ| _| jj| _| jj| _g | _ tj 	| ¡S rP   )
r8   rI   r9   r:   r6   ÚmoderŽ   r{   r   r5   )rN   r;   r<   r   r   r   r5   Ž  s    

zEpsImageFile.loadc                 C  s   d S rP   r   )rN   Úposr   r   r   Ú	load_seek—  s    zEpsImageFile.load_seekN)r   F)rZ   r[   r\   r]   ÚformatÚformat_descriptionr”   r™   r   r5   rœ   r   r   r   r   re   Ï   s    !
	re   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.rf   )r…   r   s   imagerg   )r…   r   s   false 3 colorimagerh   )r…   r_   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   ó   
Úflushrt   ru   Ns   
%%%%EndBinary
s   grestore end
)	r5   rš   r•   r3   r9   r(   r    r   Ú_save)r6   r:   Úfilenamert   Úoperatorr=   r   r   r   r¡      sB    









&


r¡   z.psz.epszapplication/postscript)r   F)r   )!Ú
__future__r   r-   r&   rx   r   r   r$   r‡   r   r   Ú_binaryr   rb   Z
_deprecater   Úcompilerv   r“   r   Ú__annotations__r   r   rI   rJ   rd   re   r¡   Zregister_openr   Zregister_saveZregister_extensionsZregister_mimer   r   r   r   Ú<module>   s2    


]%	 R
4