U
    d»{jê»  ã                   @   s’  d Z ddlZddlZddlmZ ddlZ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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 ddlmZ ddlmZmZmZmZ dd	lm Z m!Z! dd
l"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 e 5e6¡Z7dZ8dZ9G dd„ dƒZ:e:ƒ Z;ddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1œZ<d2d3„ Z=d4d5„ Z>ej?d6d7d8�d9d:„ ƒZ@d;d<„ ZAd=d>„ ZBd?d@„ ZCdAdB„ ZDG dCdD„ dDe4jEƒZFG dEdF„ dFeƒZGG dGdH„ dHeƒZHe ?d6¡dIdJ„ ƒZIdKdL„ ZJdMdN„ ZKdddPdQ„ZLdedRdS„ZMdfdTdU„ZNdgdVdW„ZOeZPdXdYdZd[d\d]d^d_d`dag
ZQejRG dbdc„ dceƒƒZSdS )hzG
A PostScript backend, which can produce both PostScript .ps and .eps.
é    N)ÚEnum)ÚStringIO)ÚTemporaryDirectory)Ú_apiÚcbookÚ_pathÚ_text_helpers)ÚAFM)Ú_BackendÚFigureCanvasBaseÚFigureManagerBaseÚRendererBase)Úis_writable_file_likeÚfile_requires_unicode)Úget_font)ÚLOAD_NO_SCALEÚFT2Font)Úconvert_ttf_to_ps)Ú	uni2type1)ÚPath)Ú
TexManager)ÚAffine2D)ÚMixedModeRendereré   )Ú_backend_pdf_pszLevel IIFc                   @   s   e Zd Zdd„ ZdS )ÚPsBackendHelperc                 C   s
   i | _ d S ©N)Ú_cached©Úself© r    ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/matplotlib/backends/backend_ps.pyÚ__init__+   s    zPsBackendHelper.__init__N)Ú__name__Ú
__module__Ú__qualname__r"   r    r    r    r!   r   *   s   r   )ç      !@é   )r&   é   )r'   é   )ç®GázŽ@@gHáz®gG@)ç¤p=
×c7@r*   )ç
×£p=Š0@r+   )çáz®Ga'@r,   )ç
×£p=Š @r-   )çR¸…ëQ@r.   )ç…ëQ¸…@r/   )çHáz®G@r0   )çffffff @r1   )ç\�Âõ(\÷?r2   )gR¸…ëQð?r3   )çfffffFD@g)\�Âõ¨L@)ç)\�Âõ¨<@r4   )ç…ëQ¸E4@r5   )ç)\�Âõ¨,@r6   )ç¸…ëQ8$@r7   )ç¤p=
×£@r8   )ç)\�Âõ(@r9   )ç¤p=
×£@r:   )ç®Gáz@r;   )ç)\�Âõ(ü?r<   )g)\�Âõ(ô?r=   )ÚletterZlegalÚledgerÚa0Za1Za2Úa3Za4Za5Za6Za7Za8Za9Za10Zb0Úb1Úb2Zb3Zb4Zb5Zb6Zb7Zb8Zb9Zb10c                 C   sF   t t ¡ dd�D ]0\}\}}| d¡r(q| |k r||k r|  S qdS )NT)ÚreverseÚlr@   )ÚsortedÚ	papersizeÚitemsÚ
startswith)ÚwÚhÚkeyÚpwÚphr    r    r!   Ú_get_papertypeM   s    

rO   c                  G   s   d  dd„ | D ƒ¡S )Nú c                 s   s"   | ]}|d ›  d¡  d¡V  qdS )ú1.3fÚ0Ú.N)Úrstrip)Ú.0Úargr    r    r!   Ú	<genexpr>W   s     z_nums_to_str.<locals>.<genexpr>)Újoin)Úargsr    r    r!   Ú_nums_to_strV   s    rZ   z3.6z a vendored copy of this function)Úalternativec                 C   sX   |   dd¡} |   dd¡} |   dd¡} |   dd¡} |   d	d
¡} t ddd„ | ¡} |  d¡S )zR
    Quote dangerous characters of S for use in a PostScript string constant.
    ó   \s   \\ó   (s   \(ó   )s   \)ó   's   \251ó   `s   \301s   [^ -~\n]c                 S   s   dt |  ¡ ƒ S )Ns   \%03o)ÚordÚgroup)Úxr    r    r!   Ú<lambda>d   ó    z!quote_ps_string.<locals>.<lambda>Úascii)ÚreplaceÚreÚsubÚdecode)Úsr    r    r!   Úquote_ps_stringZ   s    rl   c              	   C   s\   t |ƒrFt|ƒrt| ddd�nt| dƒ}|� t ||¡ W 5 Q R X ntj| |tjd� dS )zˆ
    Move the contents of file at *src* to path-or-filelike *dst*.

    If *dst* is a path, the metadata of *src* are *not* copied.
    Úrúlatin-1©ÚencodingÚrb)Úcopy_functionN)r   r   ÚopenÚshutilÚcopyfileobjÚmoveÚcopyfile)ÚsrcÚdstÚfhr    r    r!   Ú_move_path_to_path_or_streamh   s    ÿþr{   c           
         s  t | dd�‰ ‡ fdd„|D ƒ}djˆ jdˆ j d ttˆ jƒ¡d ‡ fdd„|D ƒ¡t|ƒd d	�}d
}g }|D ]„}ˆ  	|t
¡}ˆ  ¡ \}}	| dˆ  |¡d tt|jdf|j•ƒ¡dœ t t|d |	ƒddddddddddgd¡ d¡ d ¡ qp|d |¡ | S )a‰  
    Subset *chars* from the font at *font_path* into a Type 3 font.

    Parameters
    ----------
    font_path : path-like
        Path to the font to be subsetted.
    chars : str
        The characters to include in the subsetted font.

    Returns
    -------
    str
        The string representation of a Type 3 font, which can be included
        verbatim into a PostScript file.
    r   )Zhinting_factorc                    s   g | ]}ˆ   |¡‘qS r    ©Úget_char_index©rU   Úc©Úfontr    r!   Ú
<listcomp>Š   s     z%_font_to_ps_type3.<locals>.<listcomp>aM  %!PS-Adobe-3.0 Resource-Font
%%Creator: Converted from TrueType to Type 3 by Matplotlib.
10 dict begin
/FontName /{font_name} def
/PaintType 0 def
/FontMatrix [{inv_units_per_em} 0 0 {inv_units_per_em} 0 0] def
/FontBBox [{bbox}] def
/FontType 3 def
/Encoding [{encoding}] def
/CharStrings {num_glyphs} dict dup begin
/.notdef 0 def
rP   c                 3   s   | ]}d   ˆ  |¡¡V  qdS )z/{}N)ÚformatÚget_glyph_name)rU   Úglyph_idr€   r    r!   rW   ›   s   ÿz$_font_to_ps_type3.<locals>.<genexpr>)Z	font_nameZinv_units_per_emÚbboxrp   Z
num_glyphszÿ
end readonly def

/BuildGlyph {
 exch begin
 CharStrings exch
 2 copy known not {pop /.notdef} if
 true 3 1 roll get exec
 end
} _d

/BuildChar {
 1 index /Encoding get exch get
 1 index /BuildGlyph get exec
} _d

FontName currentdict end definefont pop
z/%(name)s{%(bbox)s sc
r   )Únamer†   é@   NFó   mó   lre   ó   cTrf   zce} _dÚ
)r   rƒ   Úpostscript_nameZunits_per_EMrX   ÚmapÚstrr†   ÚlenZ
load_glyphr   Úget_pathÚappendr„   ZhoriAdvancer   Úconvert_to_stringr   rj   )
Ú	font_pathÚcharsÚ	glyph_idsÚpreambleZ	postambleÚentriesr…   ÚgÚvr   r    r€   r!   Ú_font_to_ps_type3x   sL    ÿ
ïþ      øøüóÿr›   c           	   
      sè   d  dd„ |D ƒ¡}t d| |¡ z t | |¡}t d| t | ¡j| ¡ j	¡ t
|ƒ‰ ‡ fdd„|D ƒ}tƒ �L}tj  |d¡}t|d	ƒ�}| | ¡ ¡ W 5 Q R X tt |¡|d
|ƒ W 5 Q R X W n  tk
râ   t d¡ ‚ Y nX dS )a2  
    Subset *chars* from the font at *font_path* into a Type 42 font at *fh*.

    Parameters
    ----------
    font_path : path-like
        Path to the font to be subsetted.
    chars : str
        The characters to include in the subsetted font.
    fh : file-like
        Where to write the font.
    Ú c                 s   s   | ]}t |ƒV  qd S r   )Úchrr~   r    r    r!   rW   Ö   s     z%_font_to_ps_type42.<locals>.<genexpr>zSUBSET %s characters: %szSUBSET %s %d -> %dc                    s   g | ]}ˆ   |¡‘qS r    r|   r~   r€   r    r!   r‚   ß   s     z&_font_to_ps_type42.<locals>.<listcomp>ztmp.ttfÚwbé*   zDThe PostScript backend does not currently support the selected font.N)rX   Ú_logÚdebugr   Zget_glyphs_subsetÚosÚstatÚst_sizeÚ	getbufferÚnbytesr   r   Úpathrs   ÚwriteÚgetvaluer   ÚfsencodeÚRuntimeErrorÚwarning)	r”   r•   rz   Z
subset_strZfontdatar–   ÚtmpdirÚtmpfileÚtmpr    r€   r!   Ú_font_to_ps_type42É   s&    ÿ"ÿr°   c                    s   t  ˆ ¡‡ fdd„ƒ}|S )z}
    Wrap `RendererPS` method *meth* to emit a PS comment with the method name,
    if the global flag `debugPS` is set.
    c                    s*   t r| j dˆ j› d�¡ ˆ | f|ž|ŽS )Nz% rŒ   )ÚdebugPSÚ	_pswriterr¨   r#   )r   rY   Úkwargs©Úmethr    r!   Úwrapperô   s    z!_log_if_debug_on.<locals>.wrapper)Ú	functoolsÚwraps)rµ   r¶   r    r´   r!   Ú_log_if_debug_onï   s    r¹   c                       s8  e Zd ZdZe d¡ZdZd:‡ fdd„	Zdd„ Z	d;d
d„Z
d<dd„Zedd„ ƒZd=dd„Zedd„ ƒZd>dd„Zd?dd„Zd@dd„Zdd„ Zdd„ ZdAd d!„Zd"d#„ ZedBd$d%„ƒZedCd&d'„ƒZedDd(d)„ƒZed*d+„ ƒZedd,œd-d.„ƒZedEd/d0„ƒZed1d2„ ƒZed3d4„ ƒZed5d6„ ƒZ d	d	d7œd8d9„Z!‡  Z"S )FÚ
RendererPSz€
    The renderer handles all the drawing primitives using a graphics
    context instance that controls the colors/styles.
    z	fonts/afmú	ps.useafméH   c                    s–   t ƒ  ||¡ || _tjd r*d| _g | _|| _d | _d | _	d | _
d | _d | _d | _d | _i | _|d | _i | _d| _t ¡ | _t d ¡tjƒ| _d S )Nútext.usetexr   r¼   )Úsuperr"   r²   ÚmplÚrcParamsÚtextcntÚpsfragÚimagedpiÚcolorÚ	linewidthÚlinejoinÚlinecapÚlinedashÚfontnameÚfontsizeÚ_hatchesÚimage_magnificationÚ_clip_pathsÚ_path_collection_idr   ZCharacterTrackerÚ_character_trackerr·   Ú	lru_cacher    r¬   Ú_logwarn_once)r   ÚwidthÚheightZpswriterrÃ   ©Ú	__class__r    r!   r"     s&    


zRendererPS.__init__c                 C   sJ   |d krdS t |ƒdkrB|d dkr(dS |d dkr>|  d¡ dS dS d S )NTé   é   r   r   zlThe PostScript backend does not support transparency; partially transparent artists will be rendered opaque.F)r�   rÑ   )r   Zrgb_or_rgbar    r    r!   Ú_is_transparent!  s    ÿzRendererPS._is_transparentTc                 C   sl   |||f| j krh| j ||  kr*|kr:n n|d›d�n|d›d|d›d|d›d�¡ |rh|||f| _ d S )NrQ   z	 setgray
rP   z setrgbcolor
)rÄ   r²   r¨   )r   rm   r™   ÚbÚstorer    r    r!   Ú	set_color/  s     ÿÿþzRendererPS.set_colorc                 C   s0   t |ƒ}|| jkr,| j d| ¡ |r,|| _d S )Nz%1.3f setlinewidth
)ÚfloatrÅ   r²   r¨   )r   rÅ   rÚ   r    r    r!   Úset_linewidth7  s
    
zRendererPS.set_linewidthc                 C   s"   dddddddœ|  } | d›d�S )Nr   r   é   )ZmiterÚroundZbevelr   r   rÞ   Údz setlinejoin
r    )rÆ   r    r    r!   Ú_linejoin_cmd>  s    ÿzRendererPS._linejoin_cmdc                 C   s*   || j kr&| j |  |¡¡ |r&|| _ d S r   )rÆ   r²   r¨   rá   )r   rÆ   rÚ   r    r    r!   Úset_linejoinE  s    
zRendererPS.set_linejoinc                 C   s"   dddddddœ|  } | d›d�S )Nr   r   rÞ   )Zbuttrß   Z
projectingr   r   rÞ   rà   z setlinecap
r    )rÇ   r    r    r!   Ú_linecap_cmdK  s    ÿzRendererPS._linecap_cmdc                 C   s*   || j kr&| j |  |¡¡ |r&|| _ d S r   )rÇ   r²   r¨   rã   )r   rÇ   rÚ   r    r    r!   Úset_linecapR  s    
zRendererPS.set_linecapc                 C   st   | j d k	r,| j \}}t ||¡r,||kr,d S | j |d k	r\t|ƒr\dt|Ž › dt|ƒ› d�nd¡ |rp||f| _ d S )Nú[z] z	 setdash
z[] 0 setdash
)rÈ   ÚnpZarray_equalr²   r¨   r�   rZ   )r   ÚoffsetÚseqrÚ   ZoldoZoldseqr    r    r!   Úset_linedashX  s    

þþýzRendererPS.set_linedashc                 C   sD   ||f| j | jfkr@| j d|› d|d›d�¡ |r@|| _ || _d S )Nú/rP   rQ   ú selectfont
)rÉ   rÊ   r²   r¨   )r   rÉ   rÊ   rÚ   r    r    r!   Úset_fonte  s
    zRendererPS.set_fontc                 C   s¬   d}|| j kr| j | S dt| j ƒ }tjd }| jd }| j d|d›d|d›d|d›d|d›d	|d
›d| jt 	|¡t
ƒ  |¡dd�› d|d
›d|› d�¡ || j |< |S )Nr¼   zH%dzhatch.linewidthzH  << /PatternType 1
     /PaintType 2
     /TilingType 2
     /BBox[0 0 rà   rP   z]
     /XStep z
     /YStep z(

     /PaintProc {
        pop
        r™   z setlinewidth
F©Úsimplifyz]
        gsave
        fill
        grestore
        stroke
     } bind
   >>
   matrix
   0 z translate
   makepattern
   /z
 exch def
)rË   r�   r¿   rÀ   rÓ   r²   r¨   Ú_convert_pathr   Úhatchr   Úscale)r   rð   Zsidelenr‡   rÅ   Z
pageheightr    r    r!   Úcreate_hatchl  s"    



0 
 ÿõê

zRendererPS.create_hatchc                 C   s   | j S )z­
        Get the factor by which to magnify images passed to draw_image.
        Allows a backend to have images at a different resolution to other
        artists.
        )rÌ   r   r    r    r!   Úget_image_magnificationŽ  s    z"RendererPS.get_image_magnificationFNc                 C   sJ   |rdd| j d | jd f}nd }t ||||d ddddddgd	¡ d
¡S )Ng        g      R@é   r‰   rŠ   re   r‹   s   clTrf   )rÒ   rÓ   r   r“   rj   )r   r§   Ú	transformÚcliprî   r    r    r!   rï   –  s          þþzRendererPS._convert_pathc              
   C   sº   g }|  ¡ }|d k	r.| dt|j|jžŽ  ¡ | ¡ \}}|d k	r°|t|ƒf}| j |¡}|d kr dt	| jƒ }| j
 d|› d| j||dd�› d�¡ || j|< | |› d�¡ d	 |¡S )
Nz%s clipbox
zc%drê   z {
Frí   z
clip
newpath
} bind def
rŒ   rœ   )Zget_clip_rectangler’   rZ   ÚsizeÚp0Zget_clip_pathÚidrÍ   Úgetr�   r²   r¨   rï   rX   )r   Úgcrö   Úrectr§   ZtrfrL   Zcustom_clip_cmdr    r    r!   Ú_get_clip_cmdŸ  s$    ÿþ

zRendererPS._get_clip_cmdc                 C   s  |j d d… \}}d}|d d d…d d …d d…f }	|	 ¡  dd¡}
|d krdd}|| j }|| j }n d tt| ¡  ¡ ƒ¡}d	}d	}| j	 
d
|  |¡› d|d›d|d›d|› d|d›d|d›d|d›d|d›d|d›d|d›d|d›d|d›d|› d|
› d�¡ d S )NrÞ   zfalse 3 colorimageéÿÿÿÿr×   rŒ   éÀÿÿÿz1 0 0 1 0 0rP   g      ð?úgsave
r™   z translate
[z	] concat
z scale
/DataString rà   z string def
z 8 [ z 0 0 -z 0 z5 ]
{
currentfile DataString readhexstring pop
} bind ú

grestore
)ÚshapeÚtobytesÚhexrÌ   rX   rŽ   r�   ÚfrozenZ	to_valuesr²   r¨   rý   )r   rû   rc   ÚyZimrõ   rK   rJ   ZimagecmdÚdataÚhexdataÚmatrixZxscaleZyscaler    r    r!   Ú
draw_imageµ  s(    
þüD
öõzRendererPS.draw_imagec                 C   sB   |d ko|  ¡ d k}|jo|}| j||||d�}|  |||¡ d S )N©rö   rî   )Zget_hatch_pathZshould_simplifyrï   Ú_draw_ps)r   rû   r§   rõ   ÚrgbFacerö   rî   Úpsr    r    r!   Ú	draw_pathÖ  s    
zRendererPS.draw_pathc                 C   sÄ  |   |¡rd n>|d |d   kr.|d kr>n nd|d  nd|d d…  }ddd	d
g}| ¡ }	| ¡ szt| ¡ ƒdkr‚| ¡ n
| ¡ d }
|	dkoœ|
dk}|rØ| d|	 ¡ | |  | ¡ ¡¡ | |  	| 
¡ ¡¡ | | j||dd�¡ |�r(|�r| d¡ |�r| |dg¡ |�r(| d¡ |�r8| d¡ | ddg¡ |j|dd| jd | jd fdd�D ]6\}}t|ƒ�rj|dd … \}}| d||f ¡ �qjd |¡}| j|||ddd� d S )Nr   r   rÞ   z%1.3f setgrayz%1.3f %1.3f %1.3f setrgbcolorr×   z/o {ZgsaveÚnewpathÚ	translatez%.1f setlinewidthFrí   ÚfillZgrestoreÚstrokez
} bind defr¼   r  éþÿÿÿz%g %g orŒ   ©r  r  )rØ   Úget_linewidthZget_forced_alphar�   Úget_rgbZ	get_alphar’   rá   Úget_joinstylerã   Úget_capstylerï   ÚextendÚiter_segmentsrÒ   rÓ   rX   r  )r   rû   Zmarker_pathZmarker_transr§   Útransr  Zps_colorZps_cmdZlwÚalphar  ÚverticesÚcoderc   r  r  r    r    r!   Údraw_markersÞ  sZ    ÿ ÿÿû
ÿÿ

þÿ


ý

zRendererPS.draw_markersc                 C   s6  t |ƒdkrt |d jƒnd}|  |||||¡}|d|  d |d | k }|stt | |||||||||	|
|||¡S g }t|  |||¡ƒD ]N\}\}}d| j|f }| j||dd�}| j	 
d|› d|› d	�¡ | |¡ qŠ|  |||||||	|
|||¡D ]*\}}}}}d
|||f }|  |||¡ qø|  jd7  _d S )Nr   r×   rÞ   zp%d_%dFrí   rê   z {
newpath
translate
z
} bind def
z%g %g %sr   )r�   r  Z_iter_collection_uses_per_pathr   Údraw_path_collectionÚ	enumerateZ_iter_collection_raw_pathsrÎ   rï   r²   r¨   r’   Z_iter_collectionr  )r   rû   Zmaster_transformÚpathsZall_transformsÚoffsetsZoffset_transZ
facecolorsZ
edgecolorsZ
linewidthsZ
linestylesZantialiasedsÚurlsZoffset_positionZlen_pathZuses_per_pathZshould_do_optimizationZ
path_codesÚir§   rõ   r‡   Z
path_bytesÚxoÚyoZpath_idZgc0r  r  r    r    r!   r!    sr    
    ÿÿ          ü  ÿÿü
        ýzRendererPS.draw_path_collection)Úmtextc             
   C   s  |   | ¡ ¡rd S t| dƒsB|  d¡ |  ||||||d|¡ d S | j||dd�\}}	}
| ¡ }d| j }d| ¡ d d…  }d	d
dœ t	j
d d d¡}|| }d||f }t|||
 ƒ}| j d||||d |f ¡ | j d|› d|› d�¡ |  jd7  _d S )NrÂ   zÆThe PS backend determines usetex status solely based on rcParams['text.usetex'] and does not support having usetex=True only for some elements; this element will thus be rendered as if usetex=False.FÚTeX)Úismathz
psmarker%dz%1.3f,%1.3f,%1.3fr×   z{\sffamily %s}z{\ttfamily %s})z
sans-serifZ	monospacezfont.familyr   z{\rmfamily %s}z\color[rgb]{%s} %sz/\psfrag{%s}[bl][bl][1][%f]{\fontsize{%f}{%f}%s}g      ô?r   z	 moveto
(z)
show
grestore
r   )rØ   r  ÚhasattrrÑ   Ú	draw_textZget_text_width_height_descentÚget_size_in_pointsrÁ   rú   r¿   rÀ   rZ   rÂ   r’   r²   r¨   )r   rû   rc   r  rk   ÚpropÚangler)  rJ   rK   ÚblrÊ   ÚthetextrÄ   ZfontcmdÚtexÚposr    r    r!   Údraw_tex@  sH    
ÿ
ÿ þ    ÿÿþý
zRendererPS.draw_texc	                 C   sJ  |   | ¡ ¡rd S |dkr.|  ||||||¡S |rF|  ||||||¡S tjd �r*|  |¡}	d| ¡  }
g }d}d }g }|D ]ˆ}t 	t
|ƒdt
|ƒd›�¡}z|	 |¡}W n" tk
rÌ   d}|	 d¡}Y nX |	 ||¡}|}|||
 7 }| ||f¡ |||
 7 }q||	j d	d
¡ d	¡}| ||f¡ n |  |¡}	| j |	|¡ g }d  }}t ||	¡D ]d}|jj d	d
¡ d	¡}|j|k	�rž|�r�| |¡ |j}|g g}|d  |j|j |j¡f¡ �qZ| |¡ | j| ¡ Ž  |D ]h\}}|  || ¡ d¡ d dd„ |D ƒ¡}| j  d|  !|¡› d|d›d|d›d|d›d|› d�¡ �qÜd S )Nr*  r»   gü©ñÒMbP?r   ÚuniZ04XÚquestionú?rf   rg   r   FrŒ   c                 s   s&   | ]\}}|d ›d|d›d�V  qdS )r™   z 0 m /rk   z
 glyphshowNr    )rU   rc   r‡   r    r    r!   rW   £  s   ÿz'RendererPS.draw_text.<locals>.<genexpr>r   r™   rP   ú translate
ú rotate
r  )"rØ   r  r5  Údraw_mathtextr¿   rÀ   Z_get_font_afmr.  r   rú   ra   Zget_width_from_char_nameÚKeyErrorZget_width_charZget_kern_dist_from_namer’   r�   Úencoderj   Z_get_font_ttfrÏ   Útrackr   ZlayoutZ	ft_objectrc   r„   Z	glyph_idxrÛ   rì   rX   r²   r¨   rý   )r   rû   rc   r  rk   r/  r0  r+  r)  r�   rñ   ÚstreamZthisxÚ	last_nameZxs_namesr   r‡   rÒ   ÚkernZps_nameZ	prev_fontZcurr_streamÚitemr2  r    r    r!   r-  h  s~    
 ÿÿ
 ÿÿ
ÿ

ÿþûzRendererPS.draw_textc                 C   s:  | j j |d|¡\}}}	}
}| j| ¡ Ž  | j d|d›d|d›d|d›d�¡ d}|
D ]š\}}}}}| j ||¡ |j	|f|kr¨|j	|f}| j d|j	› d|› d	�¡ t
|tƒrÀ| t|ƒ¡n| | |¡¡}| j |d›d|d›d
|› d�¡ qX|D ]0\}}}}| j |› d|› d|› d|› d�¡ qø| j d¡ dS )z-Draw the math text using matplotlib.mathtext.r¼   r   r™   rP   r9  r:  Nrê   rë   z	 moveto
/z glyphshow
z
 rectfill
ú	grestore
)Z
_text2pathZmathtext_parserÚparserÛ   r  r²   r¨   rÏ   Ztrack_glyphr�   Ú
isinstancer	   Zget_name_charr�   r„   r}   )r   rû   rc   r  rk   r/  r0  rÒ   rÓ   ZdescentZglyphsZrectsZlastfontr�   rÊ   ÚnumÚoxZoyZ
glyph_namerJ   rK   r    r    r!   r;  ®  s.    ÿÿ
ÿþÿ&zRendererPS.draw_mathtextc                 C   s    |   || d¡| d¡|¡ d S )N)r   r×   rÞ   )r   r×   rÖ   )Údraw_gouraud_trianglesÚreshape)r   rû   ÚpointsÚcolorsr  r    r    r!   Údraw_gouraud_triangleÉ  s     ÿz RendererPS.draw_gouraud_trianglec                 C   sž  t |ƒt |ƒkst‚|jdks"t‚|jd dks4t‚|jd dksFt‚|jdksTt‚|jd dksft‚|jd dksxt‚|j}| |d |d  df¡}| |¡}| |d |d  df¡}tj|dd�d }tj|dd�d }	t 	d|	|  ¡}
|\}}|	\}}tj
|d |d  d	d
dgd�}d|d< || |
 |d< |d d …d d…f d |d< | ¡  dd¡}| j d|d›d|d›d|d›d|d›d|› d�¡ d S )Nr×   r   rÞ   rÖ   r   )Zaxisi   l   ÿÿ )ÚflagsÚu1)rJ  z2>u4)rK  Z3u1)ZdtyperM  rJ  g     ào@rK  rŒ   rÿ   z–gsave
<< /ShadingType 4
   /ColorSpace [/DeviceRGB]
   /BitsPerCoordinate 32
   /BitsPerComponent 8
   /BitsPerFlag 8
   /AntiAlias true
   /Decode [ r™   rP   z  0 1 0 1 0 1 ]
   /DataSource <
z
>
>>
shfill
grestore
)r�   ÚAssertionErrorÚndimr  rI  rõ   ræ   ÚminÚmaxÚceilÚemptyr  r  r²   r¨   )r   rû   rJ  rK  r  r  Zflat_pointsZflat_colorsZ
points_minZ
points_maxÚfactorZxminZyminZxmaxZymaxr  r  r    r    r!   rH  Î  s6    
þ(
öz!RendererPS.draw_gouraud_trianglesr  c          
      C   sf  | j j}| ¡ dko"|  | ¡ ¡ }|s,d}|  |¡r:d}| ¡ }|r~|  | ¡ ¡ |  | ¡ ¡ |  	| 
¡ ¡ | j| ¡ Ž  |s†|rœ| j| ¡ dd… Ž  |dƒ ||  |¡ƒ || ¡ ƒ |dƒ |�r|sÔ|rÜ|dƒ | j|dd… ddiŽ |dƒ |�s|�r|d	ƒ |�rL|  |¡}	|dƒ |d
| ¡ dd…  ƒ |d|	 ƒ |�rZ|dƒ |d	ƒ dS )at  
        Emit the PostScript snippet *ps* with all the attributes from *gc*
        applied.  *ps* must consist of PostScript commands to construct a path.

        The *fill* and/or *stroke* kwargs can be set to False if the *ps*
        string already includes filling and/or stroking, in which case
        `_draw_ps` is just supplying properties and clipping.
        r   FNr×   r   rŒ   rÚ   zfill
rC  z	%f %f %f z%s setpattern fill grestore
zstroke
)r²   r¨   r  rØ   r  Z	get_hatchrÝ   râ   r  rä   r  ré   Z
get_dashesrÛ   rý   Ústriprò   Zget_hatch_color)
r   r  rû   r  r  r  r¨   Zmightstrokerð   Z
hatch_namer    r    r!   r  ü  sF    	ÿ

zRendererPS._draw_ps)r¼   )T)T)T)T)T)T)FN)N)N)N)FN)#r#   r$   r%   Ú__doc__r   Z_get_data_pathZ_afm_font_dirZ_use_afm_rc_namer"   rØ   rÛ   rÝ   Ústaticmethodrá   râ   rã   rä   ré   rì   rò   ró   rï   rý   r¹   r
  r  r   r!  r5  r-  r;  rL  rH  r  Ú__classcell__r    r    rÔ   r!   rº   ý   sN   








"
	  ÿ4
,'E


-rº   c                   @   s    e Zd Zedƒ\ZZdd„ ZdS )Ú_OrientationrÞ   c                 C   s   | j dkr|d d d… S |S )NÚ	landscaperþ   )r‡   )r   r  r    r    r!   Úswap_if_landscape3  s    z_Orientation.swap_if_landscapeN)r#   r$   r%   ÚrangeÚportraitr[  r\  r    r    r    r!   rZ  0  s   rZ  c                       s„   e Zd ZdZdddœZdd„ Ze dd¡d	d	d
dœdd„ƒZd	dœdd„Z	d	dœdd„Z
e ed¡Ze ed¡Z‡ fdd„Z‡  ZS )ÚFigureCanvasPSr¼   Z
PostscriptzEncapsulated Postscript)r  Úepsc                 C   s   dS )Nr  r    r   r    r    r!   Úget_default_filetype<  s    z#FigureCanvasPS.get_default_filetypez3.5rY   Nr^  )ÚmetadataÚ	papertypeÚorientationc                O   s   | j j}d| j _i }	t|ttjfƒrFt |¡j}
|
 	dd¡ 
d¡|	d< |pLi  ddtj› d�¡|	d< t d¡}|rˆtj t|ƒ¡ d	¡nt ¡ |	d
< d dd„ |	 ¡ D ƒ¡}	|d kr¾tjd }| ¡ }tjdt•|d� tjt| ¡ d�}tjd rú| jn| j}|||f||	||dœ|—Ž d S )Nr¼   rf   rg   ZTitleZCreatorzMatplotlib vz, https://matplotlib.org/ÚSOURCE_DATE_EPOCHz%a %b %d %H:%M:%S %YZCreationDaterŒ   c                 s   s"   | ]\}}d |› d|› �V  qdS )z%%z: Nr    )rU   Úkrš   r    r    r!   rW   W  s    z+FigureCanvasPS._print_ps.<locals>.<genexpr>zps.papersizeÚauto)rc  )rd  r½   )ÚdpiÚdsc_commentsrd  rc  )rg  ) Úfigurerh  rE  r�   r¢   ÚPathLikeÚpathlibr   r‡   r=  rj   rú   r¿   Ú__version__ÚgetenvÚdatetimeÚutcfromtimestampÚintÚstrftimeÚtimeÚctimerX   rH   rÀ   Úlowerr   Zcheck_in_listrG   Zcheck_getitemrZ  Ú_print_figure_texÚ_print_figure)r   ÚfmtÚoutfilerb  rc  rd  rY   r³   rh  ri  ÚfilenameÚsource_date_epochÚprinterr    r    r!   Ú	_print_ps?  sR    ÿþ
þÿÿü
ÿ
 ÿÿþ ÿÿzFigureCanvasPS._print_ps©Úbbox_inches_restorec                   s`  |dk‰t |ttjfƒs(t|ƒs(tdƒ‚ˆj ¡ \‰	‰ˆdkrPtˆ 	ˆ	ˆf¡Ž ‰ˆ 	t
ˆ ¡\}}	tjd r ˆ	|ks|ˆ|	kr tˆ 	ˆ	ˆf¡Ž ‰ˆ 	t
ˆ ¡\}}	d|ˆ	  ‰
d|	ˆ  ‰ˆ
}
ˆ}|
ˆjjj }|ˆjjj }d‰ˆtjk�r||
||f\}
}}}d|	 ˆ ˆ
 ‰
‰d‰|
|||f‰ tƒ ˆ_tˆ	ˆˆj|d	�‰tˆjˆ	ˆ|ˆ|d
�}ˆj |¡ ‡ ‡‡‡‡‡‡‡‡‡	‡
‡fdd„}tjd �r tƒ �†}tj |d¡}t|ddd��}||ƒ W 5 Q R X tjd dk�rètt|ˆˆˆ d� n"tjd dk�r
tt|ˆˆˆ d� t||ƒ W 5 Q R X n<tj |ddd��&}t!|ƒ�sJt" #d¡|ƒ}||ƒ W 5 Q R X dS )a+  
        Render the figure to a filesystem path or a file-like object.

        Parameters are as for `.print_figure`, except that *dsc_comments* is a
        all string containing Document Structuring Convention comments,
        generated from the *metadata* parameter to `.print_figure`.
        r`  z,outfile must be a path or a file-like objectrg  úps.usedistillerg      B@r   r¼   éZ   ©rÃ   r~  c                    sì  ˆrt d| d� nt dˆ› d�d| d� t ˆ› dˆj› dtˆ ƒd	 › d
�d| d� ttƒ}t d| d� tjd s€|tˆjjƒ7 }t d| | d� t d| d� t d 	t¡| d� tjd �s ˆjj 
¡ D ]X\}}|sÔqÆtjd }t|ƒdkrîd}|  ¡  |dk�r|  t||ƒ¡ qÆt||| ƒ qÆt d| d� t d| d� ˆ�sJt d| d� t d| d� t dtˆ
ˆƒ | d� ˆ�r‚t dˆ | d� t dtˆ	d ˆd d	d	ƒ | d� t ˆj ¡ | d� t d| d� t d| d� ˆ�sàt d| d� |  ¡  d S )Nz%!PS-Adobe-3.0 EPSF-3.0)Úfilez%%!PS-Adobe-3.0
%%DocumentPaperSizes: z
%%Pages: 1
rœ   )Úendrƒ  z
%%Orientation: rŒ   r   z
%%EndComments
z%%BeginPrologr»   z/mpldict %d dict defzmpldict beginzps.fonttypeéÿ   rŸ   r×   r„  z%%EndPrologz%%Page: 1 1z%s translatez	%d rotatez
%s clipboxr¼   Zshowpagez%%EOF)Úprintr‡   Úget_bbox_headerr�   ÚpsDefsr¿   rÀ   rÏ   ÚusedrX   rH   Úflushr¨   r›   r°   rZ   r²   r©   )rz   ZNdictr”   r•   Zfonttype©r†   ri  rÓ   Úis_epsrd  rc  Úps_rendererZrotationr   rÒ   r'  r(  r    r!   Úprint_figure_impl¡  s\     ý  ü

ÿ


ÿz7FigureCanvasPS._print_figure.<locals>.print_figure_implútmp.psrJ   rn   ro   Úghostscript)Úptyper†   ÚxpdfN)$rE  r�   r¢   rk  r   Ú
ValueErrorrj  Úget_size_inchesrO   r\  rG   r¿   rÀ   r†   rÒ   rÓ   rZ  r[  r   r²   rº   r   Údrawr   r§   rX   rs   Ú_try_distillÚ
gs_distillÚxpdf_distillr{   r   Zopen_file_cmr   ÚcodecsÚ	getwriter)r   rx  ry  rh  ri  rd  rc  r  Úpaper_widthÚpaper_heightÚllxÚllyÚurxÚuryÚrendererrŽ  r­   r®   rz   rƒ  r    r‹  r!   rw  h  sŠ    ÿÿÿ
ÿÿ    þ";   ÿ   ÿ
zFigureCanvasPS._print_figurec                C   sæ  |dk}| j  ¡ \}	}
d}d}|}|}|| j jj }|| j jj }||||f}tƒ | _t|	|
| j|d�}t| j |	|
|||d�}| j  	|¡ t
ƒ ��J}t |d¡}|jd|› dt|ƒd › dttƒ› d	d
 t¡› dt||ƒ› dt|	d |
d ƒ› d| j ¡ › d�dd� |tjk�r(|
|	 }	}
||||f}|�rD| | j  ¡ ¡\}}n |dk�rXt|	|
ƒ}t| \}}t||j|||jƒ}tjd dk�s”tjd �rªtt|||||d� n$tjd dk�rÎtt |||||d� t!||ƒ W 5 Q R X dS )a(  
        If :rc:`text.usetex` is True, a temporary pair of tex/eps files
        are created to allow tex to manage the text layout via the PSFrags
        package. These files are processed to yield the final ps or eps file.

        The rest of the behavior is as for `._print_figure`.
        r`  r   r‚  r~  r�  z%!PS-Adobe-3.0 EPSF-3.0
rŒ   z&
%%EndComments
%%BeginProlog
/mpldict z dict def
mpldict begin
rœ   z
end
%%EndProlog
mpldict begin
r9  r¼   z 0 0 clipbox
z
end
showpage
rn   ro   rg  r€  r�  r½   )r‘  r†   Úrotatedr’  N)"rj  r”  r†   rÒ   rÓ   r   r²   rº   r   r•  r   rl  r   Ú
write_textr‡  r�   rˆ  rX   rZ   r©   rZ  r[  r\  rO   rG   Ú_convert_psfragsrÂ   r‡   r¿   rÀ   r–  r—  r˜  r{   )r   rx  ry  rh  ri  rd  rc  r  rŒ  rÒ   rÓ   r'  r(  r�  rž  rŸ  r   r†   r�  r¡  r­   Útmppathr›  rœ  Úpsfrag_rotatedr    r    r!   rv  ñ  s–       þ
þ
ýúøôóòí
ÿ


   þÿ   þ   þz FigureCanvasPS._print_figure_texr  r`  c                    s   | j  ¡  tƒ  ¡ S r   )rj  Zdraw_without_renderingr¾   r•  r   rÔ   r    r!   r•  L  s    
zFigureCanvasPS.draw)r#   r$   r%   Z	fixed_dpiÚ	filetypesra  r   Zdelete_parameterr}  rw  rv  r·   ÚpartialmethodZprint_psZ	print_epsr•  rY  r    r    rÔ   r!   r_  7  s$   ÿ
  þ+ý ýXr_  c                 C   s   t t | ¡||||ƒS r   )r¤  rl  r   )r®   ÚpsfragsZfont_preambleZcustom_preambler›  rœ  rd  r    r    r!   Úconvert_psfragsQ  s        ÿrª  c           
   	   C   sò   t  dt jd t j d¡ t j d¡ t j d¡ d||dœ  i¡�< tƒ jdd |¡|d	krdd
nd|  ¡  	¡ dœ dd�}W 5 Q R X t
ƒ �8}tj |d¡}t dddd||gt¡ t || ¡ W 5 Q R X t| ƒ�}d| d¡k}	W 5 Q R X |	S )aj  
    When we want to use the LaTeX backend with postscript, we write PSFrag tags
    to a temporary postscript file, each one marking a position for LaTeX to
    render some text. convert_psfrags generates a LaTeX document containing the
    commands to convert those tags to text. LaTeX/dvips produces the postscript
    file that includes the actual text.
    ztext.latex.preamblerÄ   ZgraphicxrÂ   z:\geometry{papersize={%(width)sin,%(height)sin},margin=0in})rÒ   rÓ   zt
\begin{figure}
  \centering\leavevmode
  %(psfrags)s
  \includegraphics*[angle=%(angle)s]{%(epsfile)s}
\end{figure}rŒ   r[  r�  r   )r©  r0  Úepsfileé
   )rÊ   r�  Zdvipsz-qz-R0z-oZ	Landscapeiè  )r¿   Z
rc_contextrÀ   Z
texmanagerZ_usepackage_if_not_loadedr   Zmake_dvirX   ÚresolveÚas_posixr   r¢   r§   r   Ú_check_and_log_subprocessr    rt   rv   rs   Úread)
r¥  r©  r›  rœ  rd  Zdvifiler­   Úpsfilerz   r¦  r    r    r!   r¤  X  sB    
ÿ
þ
ýÿüþ	
ýúô ÿ	
r¤  c              
   O   sN   z| t |ƒf|ž|Ž W n0 tjk
rH } zt d|¡ W 5 d }~X Y nX d S )Nz%s.  Distillation step skipped.)r�   r¿   ZExecutableNotFoundErrorr    r¬   )Úfuncr¥  rY   r³   Úexcr    r    r!   r–  ‰  s    r–  r>   c              
   C   s|   |r
d}nd| }| d }t jd }t t  d¡jddd| d	|d
| | gt¡ t | ¡ t	 
|| ¡ |rxt| ||d� dS )zÔ
    Use ghostscript's pswrite or epswrite device to distill a file.
    This yields smaller files without illegal encapsulated postscript
    operators. The output is low-level, converting text to outlines.
    ú	-dEPSCropz-sPAPERSIZE=%sz.pszps.distiller.resÚgsz-dBATCHz	-dNOPAUSEz-r%dz-sDEVICE=ps2writez-sOutputFile=%s©r¢  N)r¿   rÀ   r   r¯  Ú_get_executable_infoÚ
executabler    r¢   Úremovert   rv   Úpstoeps)r®   r`  r‘  r†   r¢  Zpaper_optionr±  rh  r    r    r!   r—  �  s*    

     þü
r—  c                 C   sœ   t  d¡ t  d¡ tƒ �l}t |d¡}t |d¡}t ddddd	d
|rLdnd| | |g	t¡ t dddd||gt¡ t 	|| ¡ W 5 Q R X |r˜t
| ƒ dS )a
  
    Use ghostscript's ps2pdf and xpdf's/poppler's pdftops to distill a file.
    This yields smaller files without illegal encapsulated postscript
    operators. This distiller is preferred, generating high-level postscript
    output that treats text as text.
    rµ  Zpdftopsztmp.pdfr�  Zps2pdfz-dAutoFilterColorImages#falsez-dAutoFilterGrayImages#falsez-sAutoRotatePages#Nonez-sGrayImageFilter#FlateEncodez-sColorImageFilter#FlateEncoder´  z-sPAPERSIZE#%sz-paperÚmatchz-level2N)r¿   r·  r   rl  r   r   r¯  r    rt   rv   rº  )r®   r`  r‘  r†   r¢  r­   ZtmppdfZtmppsr    r    r!   r˜  ²  s2    

 ùø	 ÿr˜  c           	      C   sd   | \}}}}|r"d|| df }nd}d||t  |¡t  |¡f }d||||f }d ||g¡|fS )zx
    Return a postscript header string for the given bbox lbrt=(l, b, r, t).
    Optionally, return rotate command.
    z%.2f %.2f translate
90 rotater   rœ   z%%%%BoundingBox: %d %d %d %dz)%%%%HiResBoundingBox: %.6f %.6f %.6f %.6frŒ   )ræ   rS  rX   )	Zlbrtr¢  rE   rÙ   rm   ÚtÚrotateÚ	bbox_infoZhires_bbox_infor    r    r!   r‡  Ñ  s       ÿr‡  c           
   
   C   s&  |rt ||d�\}}nd\}}| d }t|dƒ�Ö}t| dƒ�À}|j}|D ]|}	|	 d¡rv|dƒ |rÄ|| d¡d	 ƒ qH|	 d
¡r¬||	ƒ |dƒ |r¦|| d¡d	 ƒ  qÆqH|r¼|	 d¡r¼qH||	ƒ qH|D ],}	|	 d¡râ|dƒ qÊ|	 d¡rîqÊ||	ƒ qÊW 5 Q R X W 5 Q R X t | ¡ t || ¡ dS )z´
    Convert the postscript to encapsulated postscript.  The bbox of
    the eps file will be replaced with the given *bbox* argument. If
    None, original bbox will be used.
    r¶  )NNz.epsrž   rq   s   %!PSs   %!PS-Adobe-3.0 EPSF-3.0
rf   ó   
s   %%EndCommentssp   %%BeginProlog
save
countdictstack
mark
newpath
/showpage {} def
/setpagedevice {pop} def
%%EndProlog
%%Page 1 1
)s   %%Bounds   %%HiResBounds   %%DocumentMedias   %%Pagess   %%EOFsJ   cleartomark
countdictstack
exch sub { end } repeat
restore
showpage
%%EOF
s   %%PageBoundingBoxN)	r‡  rs   r¨   rI   r=  r¢   r¹  rt   rv   )
r®   r†   r¢  r¾  r½  r«  ZepshZtmphr¨   Úliner    r    r!   rº  ã  s8    

	




rº  z/_d { bind def } bind defz/m { moveto } _dz/l { lineto } _dz/r { rlineto } _dz/c { curveto } _dz/cl { closepath } _dz/ce { closepath eofill } _dzO/box {
      m
      1 index 0 r
      0 exch r
      neg 0 r
      cl
    } _dz6/clipbox {
      box
      clip
      newpath
    } _dz/sc { setcachedevice } _dc                   @   s   e Zd ZeZdS )Ú
_BackendPSN)r#   r$   r%   r_  ZFigureCanvasr    r    r    r!   rÁ  T  s   rÁ  )Fr>   NF)Fr>   NF)F)NF)TrW  r™  ro  Úenumr   r·   Úior   Úloggingr¢   rl  rh   rt   Útempfiler   rs  Únumpyræ   Z
matplotlibr¿   r   r   r   r   Zmatplotlib._afmr	   Zmatplotlib.backend_basesr
   r   r   r   Zmatplotlib.cbookr   r   Zmatplotlib.font_managerr   Zmatplotlib.ft2fontr   r   Zmatplotlib._ttconvr   Zmatplotlib._mathtext_datar   Zmatplotlib.pathr   Zmatplotlib.texmanagerr   Zmatplotlib.transformsr   Z!matplotlib.backends.backend_mixedr   rœ   r   Ú	getLoggerr#   r    Zbackend_versionr±   r   Zps_backend_helperrG   rO   rZ   Ú
deprecatedrl   r{   r›   r°   r¹   ZRendererPDFPSBaserº   rZ  r_  rª  r¤  r–  r—  r˜  r‡  rº  ZFigureManagerPSrˆ  ZexportrÁ  r    r    r    r!   Ú<module>   sÂ   
è	
Q&    7  
1
"


=ß%