
    G8c              
       T   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jj                  e6      Z7dZ8 G d d      Z9 e9       Z:i 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/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAZ;dB Z<dC Z= ej|                  dDdEF      dG        Z?dH Z@dI ZAdJ ZBdK ZC G dL dMe4j                        ZE G dN dOe      ZF G dP dQe      ZG ej|                  dD      dR        ZHdS ZIdT ZJd\dUZKd\dVZLd]dWZMd^dXZNeZOg dYZPej                   G dZ d[e             ZRy)_zG
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_psFc                       e Zd Zd Zy)PsBackendHelperc                     i | _         y N)_cachedselfs    @/usr/lib/python3/dist-packages/matplotlib/backends/backend_ps.py__init__zPsBackendHelper.__init__*   s	        N)__name__
__module____qualname__r$    r%   r#   r   r   )   s    r%   r   letter)      !@   legal)r+      ledger)r,      a0)Gz@@gHzgG@a1)p=
c7@r2   a2)
ףp=0@r4   a3)zGa'@r6   a4)
ףp= @r8   a5)RQ@r:   a6)Q@r<   a7)HzG@r>   a8)ffffff @r@   a9)\(\?rB   a10)gRQ?rD   b0)fffffFD@g)\L@b1))\<@rG   b2)QE4@rI   ))\,@rK   )Q8$@rL   )p=
ף@rM   ))\(@rN   )p=
ף@rO   )Gz@rP   ))\(?rQ   )g)\(?rR   )b3b4b5b6b7b8b9b10c                     t        t        j                         d      D ])  \  }\  }}|j                  d      r| |k  s!||k  s'|c S  y)NT)reverselr1   )sorted	papersizeitems
startswith)whkeypwphs        r#   _get_papertyperg   L   sM    	 14@ Xb">>#r6a"fJ	
 r%   c                  2    dj                  d | D              S )N c              3   `   K   | ]&  }|d j                  d      j                  d       ( yw)1.3f0.N)rstrip).0args     r#   	<genexpr>z_nums_to_str.<locals>.<genexpr>V   s*     Jcs4j((-44S9Js   ,.)join)argss    r#   _nums_to_strrt   U   s    88JTJJJr%   z3.6z a vendored copy of this function)alternativec                    | j                  dd      } | j                  dd      } | j                  dd      } | j                  dd      } | j                  d	d
      } t        j                  dd |       } | j                  d      S )zR
    Quote dangerous characters of S for use in a PostScript string constant.
       \s   \\   (s   \(   )s   \)   's   \251   `s   \301s   [^ -~\n]c                 :    dt        | j                               z  S )Ns   \%03o)ordgroup)xs    r#   <lambda>z!quote_ps_string.<locals>.<lambda>c   s    y3qwwy>'A r%   ascii)replaceresubdecode)ss    r#   quote_ps_stringr   Y   sv    
 	
		%!A			$A			$A			$!A			$!A
|A1EA88Gr%   c                    t        |      rGt        |      rt        | dd      nt        | d      }|5  t        j                  ||       ddd       yt        j
                  | |t        j                         y# 1 sw Y   yxY w)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rbN)copy_function)r   r   openshutilcopyfileobjmovecopyfile)srcdstfhs      r#   _move_path_to_path_or_streamr   g   su     S!&s+ 3i0T? 	  	(r3'	( 	( 	CFOO<	( 	(s   A::Bc                   
 t        | d      
|D cg c]  }
j                  |       }}dj                  
j                  d
j                  z  dj                  t        t        
j                              dj                  
fd|D              t        |      dz         }d}g }|D ]  }
j                  |t              }
j                         \  }	}|j                  d
j                  |      dj                  t        t        |j                  d	g|j                              d
z  t!        j"                  t%        |	dz  |      ddddd	g dd      j'                  d      z   dz           |dj                  |      z   |z   S c c}w )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   )hinting_factoraM  %!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
ri   c              3   ^   K   | ]$  }d j                  j                  |             & yw)z/{}N)formatget_glyph_name)ro   glyph_idfonts     r#   rq   z$_font_to_ps_type3.<locals>.<genexpr>   s-      8!) #\\$*=*=h*GH 8s   *-)	font_nameinv_units_per_embboxr   
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   lr%      cr%   Tr   zce} _d
)r   get_char_indexr   postscript_nameunits_per_EMrr   mapstrr   len
load_glyphr   get_pathappendr   horiAdvancer   convert_to_stringr   r   )	font_pathcharsc	glyph_idspreamble	postambleentriesr   gvr   s             @r#   _font_to_ps_type3r   w   s   " Ia0D167A$$Q'7I7 FT)) 1 11S$)),-HH 8-68 8)nq(  * $I& G 
OOHm4}}1%++H5S1==!*Eaff*E!FG)  %% QVQtUD!
 -d4 5;F7OD 	

( dii((944y 8s   F	c                    dj                  d |D              }t        j                  d| |       	 t        j                  | |      }t        j                  d| t        j                  |       j                  |j                         j                         t        |      }|D cg c]  }|j                  |       }}t               5 }t
        j                  j                  |d      }	t        |	d      5 }
|
j                  |j!                                ddd       t#        t        j$                  |	      |d|       ddd       yc c}w # 1 sw Y   8xY w# 1 sw Y   yxY w# t&        $ r t        j)                  d	        w xY w)
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              3   2   K   | ]  }t        |        y wr   )chr)ro   r   s     r#   rq   z%_font_to_ps_type42.<locals>.<genexpr>   s     /AQ/   zSUBSET %s characters: %szSUBSET %s %d -> %dztmp.ttfwbN*   zDThe PostScript backend does not currently support the selected font.)rr   _logdebugr   get_glyphs_subsetosstatst_size	getbuffernbytesr   r   r   pathr   writegetvaluer   fsencodeRuntimeErrorwarning)r   r   r   
subset_strfontdatar   r   r   tmpdirtmpfiletmps              r#   _font_to_ps_type42r      sS    ///JJJ)9jA"44Y
K

'BGGI4F4N4N%%'..	0 x 5:;T((+;	;! 	GVggll695Ggt$ /		(++-./ bkk'2BIF	G 	G </ /	G 	G  )	* 		sT   A2E# #E;E# -E4 E)E=E# E# E	EE E#  E# # Fc                 B     t        j                          fd       }|S )z}
    Wrap `RendererPS` method *meth* to emit a PS comment with the method name,
    if the global flag `debugPS` is set.
    c                 z    t         r)| j                  j                  dj                   d        | g|i |S )Nz% r   )debugPS	_pswriterr   r&   )r"   rs   kwargsmeths      r#   wrapperz!_log_if_debug_on.<locals>.wrapper   s:    NN  2dmm_B!78D*4*6**r%   )	functoolswraps)r   r   s   ` r#   _log_if_debug_onr      s'    
 __T+ +
 Nr%   c                   j    e Zd ZdZ ej
                  d      ZdZd  fd	Zd Z	d!dZ
d!dZed	        Zd!d
Zed        Zd!dZd!dZd!dZd Zd Zd"dZd Zed#d       Zed#d       Ze	 d#d       Zed        Zeddd       Zed"d       Zed        Zed        Zed        Z ddddZ! xZ"S )$
RendererPSz
    The renderer handles all the drawing primitives using a graphics
    context instance that controls the colors/styles.
    z	fonts/afm	ps.useafmc                    t         |   ||       || _        t        j                  d   rd| _        g | _        || _        d | _        d | _	        d | _
        d | _        d | _        d | _        d | _        i | _        |dz  | _        i | _        d| _        t'        j(                         | _         t-        j.                  d       t0        j2                        | _        y )Ntext.usetexr   H   )superr$   r   mplrcParamstextcntpsfragimagedpicolor	linewidthlinejoinlinecaplinedashfontnamefontsize_hatchesimage_magnification_clip_paths_path_collection_idr   CharacterTracker_character_trackerr   	lru_cacher   r   _logwarn_once)r"   widthheightpswriterr   	__class__s        r#   r$   zRendererPS.__init__  s     	'!<<&DLDK  
#+b= #$ "1"B"B"D6Y006t||Dr%   c                 l    |yt        |      dk(  r#|d   dk(  ry|d   dk7  r| j                  d       yy)NT      r   r   zlThe PostScript backend does not support transparency; partially transparent artists will be rendered opaque.F)r   r   )r"   rgb_or_rgbas     r#   _is_transparentzRendererPS._is_transparent   sP    "1~"1~"""MN r%   Tc                     |||f| j                   k7  rI| j                  j                  ||cxk(  r|k(  r	n n|ddn|dd|dd|dd       |r|||f| _         y y y )Nrk   z	 setgray
ri   z setrgbcolor
)r   r   r   )r"   r   r   bstores        r#   	set_colorzRendererPS.set_color.  sx    q!9

"NN  $%KaK %&d8:!6$%d81QtHAaX^!LN AY
 	 #r%   c                     t        |      }|| j                  k7  r)| j                  j                  d|z         |r|| _        y y y )Nz%1.3f setlinewidth
)floatr   r   r   )r"   r   r	  s      r#   set_linewidthzRendererPS.set_linewidth6  sD    )$	&NN  !7)!CD!*  'r%   c                 &    ddddddd|    } | ddS )Nr   r      )miterroundbevelr   r   r  dz setlinejoin
r)   )r   s    r#   _linejoin_cmdzRendererPS._linejoin_cmd=  s-     Q1qI1^,,r%   c                     || j                   k7  r5| j                  j                  | j                  |             |r|| _         y y y r   )r   r   r   r  )r"   r   r	  s      r#   set_linejoinzRendererPS.set_linejoinD  s?    t}}$NN  !3!3H!=> (  %r%   c                 &    ddddddd|    } | ddS )Nr   r   r  )buttr  
projectingr   r   r  r  z setlinecap
r)   )r   s    r#   _linecap_cmdzRendererPS._linecap_cmdJ  s-     qaA!L!M**r%   c                     || j                   k7  r5| j                  j                  | j                  |             |r|| _         y y y r   )r   r   r   r  )r"   r   r	  s      r#   set_linecapzRendererPS.set_linecapQ  s?    dll"NN  !2!27!;<&  #r%   c                 
   | j                   +| j                   \  }}t        j                  ||      r||k(  ry | j                  j	                  |#t        |      rdt        |  dt        |       dnd       |r
||f| _         y y )N[z] z	 setdash
z[] 0 setdash
)r   nparray_equalr   r   r   rt   )r"   offsetseqr	  oldooldseqs         r#   set_linedashzRendererPS.set_linedashW  s    ==$==LD&~~c6*tv~ #CH  !s!3 4 5!!-f!5 6jB .	/ #SMDM r%   c                     ||f| j                   | j                  fk7  r5| j                  j                  d| d|dd       |r|| _         || _        y y y )N/ri   rk    selectfont
)r   r   r   r   )r"   r   r   r	  s       r#   set_fontzRendererPS.set_fontd  s[    hDMM4==#AANN  1XJam!LM ( (  Br%   c                    d}|| j                   v r| j                   |   S dt        | j                         z  }t        j                  d   }| j                  dz  }| j
                  j                  d|dd|dd|dd|dd	|d
d| j                  t        j                  |      t               j                  |      d       d|d
d| d       || j                   |<   |S )Nr   zH%dzhatch.linewidthzH  << /PatternType 1
     /PaintType 2
     /TilingType 2
     /BBox[0 0 r  ri   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.  sidelenr   r   
pageheights         r#   create_hatchzRendererPS.create_hatchk  s   DMM!==''s4==))LL!23	[[2%
 " {!GA; 'QK QK 	 
1 JJuxz''05  B CC ^ 	F - 	0  $er%   c                     | 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!   s    r#   get_image_magnificationz"RendererPS.get_image_magnification  s     '''r%   Nc           
          |r!dd| j                   dz  | j                  dz  f}nd }t        j                  ||||d dg dd      j	                  d      S )Ng        g      R@   )r   r   r%   r   s   clTr   )r   r   r   r   r   )r"   r   	transformclipr,  s        r#   r-  zRendererPS._convert_path  sZ    djj4/t1CDDD&&)T8T-t55;VG_	Er%   c           
         g }|j                         }|3|j                  dt        g |j                  |j                   z         |j                         \  }}||t        |      f}| j                  j                  |      }|[dt        | j                        z  }| j                  j                  d| d| j                  ||d       d       || j                  |<   |j                  | d       d	j                  |      S )
Nz%s clipbox
zc%dr'  z {
Fr+  z
clip
newpath
} bind def
r   r   )get_clip_rectangler   rt   sizep0get_clip_pathidr   getr   r   r   r-  rr   )r"   gcr8  rectr   trfrd   custom_clip_cmds           r#   _get_clip_cmdzRendererPS._get_clip_cmd  s   $$&KK)Ktyy)K477)KKL$$&	cC/C"..2237O&"'#d.>.>*?"?$$ * D#. / 0&  )8  %KK?+2./wwt}r%   c                    |j                   d d \  }}d}|d d dd d d df   }	|	j                         j                  dd      }
|!d}|| j                  z  }|| j                  z  }n?dj	                  t        t        |j                         j                                     }d	}d	}| j                  j                  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       y )Nr  zfalse 3 colorimager  r   z1 0 0 1 0 0ri   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   rr   r   r   frozen	to_valuesr   r   rD  )r"   r@  r   yimr7  rc   rb   imagecmddatahexdatamatrixxscaleyscales                 r#   
draw_imagezRendererPS.draw_image  sY    xx|1'$B$2A2+,,.$$T3/"F111F111FXXc#y'7'7'9'C'C'EFGFFF "B  1Qqe  

!F1: qE 1Qqe51VAa5Aa5 )	 

 	 
 	r%   c                     |d u xr |j                         d u }|j                  xr |}| j                  ||||      }| j                  |||       y )Nr8  r,  )get_hatch_pathshould_simplifyr-  _draw_ps)r"   r@  r   r7  rgbFacer8  r,  pss           r#   	draw_pathzRendererPS.draw_path  sY     $>2#4#4#6$#>''0DidXNb"g&r%   c                 \   | j                  |      rd n&|d   |d   cxk(  r|d   k(  rn nd|d   z  nd|d d z  }g d}|j                         }	|j                         st        |j	                               dk(  r|j                         n|j	                         d   }
|	dkD  xr |
dkD  }|rp|j                  d|	z         |j                  | j                  |j                                      |j                  | j                  |j                                      |j                  | j                  ||d	
             |r;|r|j                  d       |r|j                  |dg       |r|j                  d       |r|j                  d       |j                  ddg       |j                  |dd| j                  dz  | j                  dz  fd	      D ]/  \  }}t        |      s|dd  \  }}|j                  d||fz         1 dj!                  |      }| j#                  |||d	d	       y )Nr   r   r  z%1.3f setgrayz%1.3f %1.3f %1.3f setrgbcolorr  )z/o {gsavenewpath	translatez%.1f setlinewidthFr+  ra  fillgrestorestrokez
} bind defr   rY  z%g %g or   rd  rf  )r  get_linewidthget_forced_alphar   get_rgb	get_alphar   r  get_joinstyler  get_capstyler-  extenditer_segmentsr   r   rr   r\  )r"   r@  marker_pathmarker_transr   transr]  ps_colorps_cmdlwalpharf  verticescoder   rO  r^  s                    r#   draw_markerszRendererPS.draw_markers  s    ##G,  qzWQZ571:5 !71:-072A;> 	 ;'')S->!-C jjl1o 	 a%EAIMM-23MM$,,R-=-=-?@AMM$++BOO,=>?d((l27 ) 9 	: g&x01j)MM(#z<01"00DJJrM4;;r>: 1   	2NHd 8}}1i1a&01	2 YYvb"gE%@r%   c                    t        |      dkD  rt        |d   j                        nd}| j                  |||||      }|d|z  z   dz   |dz   |z  k  }|s"t        j                  | |||||||||	|
|||      S g }t        | j                  |||            D ]`  \  }\  }}d| j                  |fz  }| j                  ||d      }| j                  j                  d| d| d	       |j                  |       b | j                  |||||||	|
|||      D ]#  \  }}}}}d
|||fz  }| j                  |||       % | xj                  dz  c_        y )Nr   r  r  zp%d_%dFr+  r'  z {
newpath
translate
z
} bind def
z%g %g %sr   )r   rx  _iter_collection_uses_per_pathr   draw_path_collection	enumerate_iter_collection_raw_pathsr   r-  r   r   r   _iter_collectionr\  )r"   r@  master_transformpathsall_transformsoffsetsoffset_trans
facecolors
edgecolors
linewidths
linestylesantialiasedsurlsoffset_positionlen_pathuses_per_pathshould_do_optimization
path_codesir   r7  r   
path_bytesxoyopath_idgc0r]  r^  s                                r#   r}  zRendererPS.draw_path_collection  s    .1Z!^3uQx(();;>7J
D q=((1,1/MM 	%44b*E>z:Jd	! ! 
$-d.M.M %/9 %: 	$ A it77;;D++D)e+LJNN   &   	"  d#	$ .2-B-BJJ
JdO.5 	,)BGS' r2w//BMM"c7+	, 	  A% r%   )mtextc          
         | j                  |j                               ry t        | d      s*| j                  d       | j	                  ||||||d|       y | j                  ||d      \  }}	}
|j                         }d| j                  z  }d|j                         d d z  }d	d
dj                  t        j                  d   d   d      }||z  }d|d|}t        |||
z
        }| j                  j                  d||||dz  |fz         | j                  j                  d| d| d       | xj                  dz  c_        y )Nr   zThe 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-serif	monospacezfont.familyr   z{\rmfamily %s}z\color[rgb]{z} z/\psfrag{%s}[bl][bl][1][%f]{\fontsize{%f}{%f}%s}g      ?rH  z	 moveto
(z)
show
grestore
r   )r  rk  hasattrr   	draw_textget_text_width_height_descentget_size_in_pointsr   r?  r   r   rt   r   r   r   r   )r"   r@  r   rO  r   propangler  rb   rc   blr   thetextr   fontcmdtexposs                    r#   draw_texzRendererPS.draw_tex?  sn    

-tX&23
 NN2q!QeUEB55ae5L1b**,-#bjjl2A&66!2 13363||M2157H4J 	 aK',a0 1ad#>(4-B> >	? 	 " 	  	 	r%   c	                 4   | j                  |j                               ry |dk(  r| j                  ||||||      S |r| j                  ||||||      S t        j
                  d   r| j                  |      }	d|j                         z  }
g }d}d }g }|D ]w  }t        j                  t        |      dt        |      d      }	 |	j                  |      }|	j                  ||      }|}|||
z  z  }|j                  ||f       |||
z  z  }y |	j                   j#                  d	d
      j%                  d	      }|j                  ||f       n
| j'                  |      }	| j(                  j+                  |	|       g }d x}}t-        j.                  ||	      D ]  }|j0                  j                   j#                  d	d
      j%                  d	      }|j0                  |ur#|r|j                  |       |j0                  }|g g}|d   j                  |j2                  |j0                  j5                  |j6                        f        |r|j                  |        | j8                  |j                           |D ]{  \  }}| j;                  ||j                         d       dj=                  d |D              }| j>                  jA                  d| jC                  |       d|dd|dd|dd| d       } y # t        $ r d}|	j                  d      }Y @w xY w)Nr  r   gMbP?r   uni04Xquestion?r   r   r   Fr   c              3   6   K   | ]  \  }}|d d|dd  yw)r   z 0 m /r   z
 glyphshowNr)   )ro   r   r   s      r#   rq   z'RendererPS.draw_text.<locals>.<genexpr>  s-       9$+At $%Q%vd1XZ @  9s   rH  r   ri    translate
 rotate
rI  )"r  rk  r  draw_mathtextr   r   _get_font_afmr  r   r?  r}   get_width_from_char_nameKeyErrorget_width_charget_kern_dist_from_namer   r   encoder   _get_font_ttfr   trackr	   layout	ft_objectr   r   	glyph_idxr
  r)  rr   r   r   rD  )r"   r@  r   rO  r   r  r  r  r  r   r/  streamthisx	last_namexs_namesr   r   r   kernps_name	prev_fontcurr_streamitemr  s                           r#   r  zRendererPS.draw_textg  s"    

-U?==Q1dE::%%b!Q4??<<$%%d+DD3355EFEIH ' }}SVs3q6#,-?@5 99$?E 33ItD 	%.&' ++w	266'? MM7H-. %%d+D##))$2F&**I%,,Q5 
>>99"F7I6vvg >>2"k2 $I#*B-KA%%VVT^^::4>>JK
 k*

%!' 	GXMM'4#:#:#<eDii  9/7 9 9GNN   &B  1Qqe q	 
	 
" 		E   5%D //4E5s   K77LLc                 P   | j                   j                  j                  |d|      \  }}}	}
} | j                  |j	                           | j
                  j                  d|dd|dd|dd       d}|
D ]  \  }}}}}| j                  j                  ||       |j                  |f|k7  r:|j                  |f}| j
                  j                  d|j                   d| d	       t        |t              r|j                  t        |            n|j                  |j                  |            }| j
                  j                  |dd|dd
| d        |D ].  \  }}}}| j
                  j                  | d| d| d| d       0 | j
                  j                  d       y)z-Draw the math text using matplotlib.mathtext.r   rH  r   ri   r  r  Nr'  r(  z	 moveto
/z glyphshow
z
 rectfill
	grestore
)
_text2pathmathtext_parserparser
  rk  r   r   r   track_glyphr   
isinstancer
   get_name_charr   r   r   )r"   r@  r   rO  r   r  r  r   r   descentglyphsrectslastfontr   r   numoxoy
glyph_namerb   rc   s                        r#   r  zRendererPS.draw_mathtext  s    OO++11!R> 	.vw

%e1QqEQiy"	# +1 	.'D(CR##//c:$$h/8;//9$$,,-QxjFH 1;40E""3s8,##D$7$7$<=  NN  a&"Q  <|-.	. " 	BLBAqNN  B4qAaS!K!@A	B\*r%   c                 h    | j                  ||j                  d      |j                  d      |       y )N)r   r  r  )r   r  r  )draw_gouraud_trianglesreshape)r"   r@  pointscolorsrs  s        r#   draw_gouraud_trianglez RendererPS.draw_gouraud_triangle  s,    ##By(A$*NN9$=u	Fr%   c                    t        |      t        |      k(  sJ |j                  dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ |j                  dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ |j                  }|j                  |d   |d   z  df      }|j	                  |      }|j                  |d   |d   z  df      }t        j                  |d      dz
  }t        j                  |d      dz   }	t        j                  d|	|z
  z        }
|\  }}|	\  }}t        j                  |d   |d   z  g d	
      }d|d<   ||z
  |
z  |d<   |d d d df   dz  |d<   |j                         j                  dd      }| j                  j                  d|dd|dd|dd|dd| d       y )Nr  r   r  r  r   )axisi   l    ))flagsu1)r  z2>u4)r  3u1)dtyper  r  g     o@r  r   rG  zgsave
<< /ShadingType 4
   /ColorSpace [/DeviceRGB]
   /BitsPerCoordinate 32
   /BitsPerComponent 8
   /BitsPerFlag 8
   /AntiAlias true
   /Decode [ r   ri   z  0 1 0 1 0 1 ]
   /DataSource <
z
>
>>
shfill
grestore
)r   ndimrJ  r  r7  r  minmaxceilemptyrK  rL  r   r   )r"   r@  r  r  rs  rJ  flat_pointsflat_colors
points_min
points_maxfactorxminyminxmaxymaxrR  rS  s                    r#   r  z!RendererPS.draw_gouraud_triangles  s   6{c&k))){{a||A!###||A!###{{a||A!###||A!###nneAhq&91%=>ook2nneAhq&91%=>VVKa0G<
VVKa0G<
+*z*ABC
d
dxx!HuQxJL W%
2f<X$QU+e3X,,.$$T3/ " 1XQtAhaQxqa 1	 
 	r%   rh  c                   | j                   j                  }|j                         dkD  xr  | j                  |j	                                }|sd}| j                  |      rd}|j                         }|rz| j                  |j                                | j                  |j                                | j                  |j                                 | j                  |j                           |s|r  | j                  |j	                         dd    |d        || j                  |              ||j                                 |d       |r5|s|r |d        | j                  |dd ddi  |d       |s|r |d	       |r@| j!                  |      }	 |d        |d
|j#                         dd z          |d|	z         |r |d        |d	       y)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  rH  r   r	  zfill
r  z	%f %f %f z%s setpattern fill grestore
zstroke
)r   r   ri  r  rk  	get_hatchr  r  rm  r  rn  r%  
get_dashesr
  rD  stripr2  get_hatch_color)
r"   r^  r@  r]  rd  rf  r   mightstroker.  
hatch_names
             r#   r\  zRendererPS._draw_ps  s    $$'')A- B#33BJJLAA 	F(Dr//12b..01R__./Dr}}/%DNNBJJL!,-id  $%bhhjdi DNNGBQK5u5(Ol#**51J)+ 2 2 4Ra 8891J>?*lr%   )r   )T)FNr   )#r&   r'   r(   __doc__r   _get_data_path_afm_font_dir_use_afm_rc_namer$   r  r
  r  staticmethodr  r  r  r  r%  r)  r2  r4  r-  rD  r   rW  r_  rz  r}  r  r  r  r  r  r\  __classcell__r  s   @r#   r   r      s`   
 )E((5M"E6'+ - -) + +'*) D(E,  @ ' ' FJ2A 2Ah *& *&X :> % %N D DL + +4 F F + +Z 15T 1 1r%   r   c                   (    e Zd Z ed      \  ZZd Zy)_Orientationr  c                 4    | j                   dk(  r|d d d   S |S )N	landscaperF  )r   )r"   rJ  s     r#   swap_if_landscapez_Orientation.swap_if_landscape3  s     "ii;6uTrT{AEAr%   N)r&   r'   r(   rangeportraitr   r  r)   r%   r#   r  r  0  s    (HiBr%   r  c                        e Zd ZdZdddZd Z ej                  dd      ddd	d
d       ZdddZ	dddZ
 ej                  ed      Z ej                  ed      Z fdZ xZS )FigureCanvasPSr   
PostscriptzEncapsulated Postscript)r^  epsc                      y)Nr^  r)   r!   s    r#   get_default_filetypez#FigureCanvasPS.get_default_filetype<  s    r%   z3.5rs   Nr  )metadata	papertypeorientationc                   | j                   j                  }d| j                   _        i }	t        |t        t        j
                  f      rCt        j                  |      j                  }
|
j                  dd      j                  d      |	d<   |xs i j                  ddt        j                   d      |	d<   t	        j                  d      }|r7t        j                  j!                  t#        |            j%                  d	      nt'        j(                         |	d
<   dj+                  d |	j-                         D              }	|t        j.                  d   }|j1                         }t3        j4                  dgt6        |       t3        j8                  t:        |j1                               }t        j.                  d   r| j<                  n| j>                  } |||f||	||d| y )Nr   r   r   TitleCreatorzMatplotlib vz, https://matplotlib.org/SOURCE_DATE_EPOCHz%a %b %d %H:%M:%S %YCreationDater   c              3   2   K   | ]  \  }}d | d|   yw)z%%z: Nr)   )ro   kr   s      r#   rq   z+FigureCanvasPS._print_ps.<locals>.<genexpr>W  s%      !<"ab2aSM!<r   zps.papersizeauto)r  )r  r   )dpidsc_commentsr  r  ) figurer  r  r   r   PathLikepathlibr   r   r  r   r?  r   __version__getenvdatetimeutcfromtimestampintstrftimetimectimerr   r`   r   lowerr   check_in_listr_   check_getitemr  _print_figure_tex_print_figure)r"   fmtoutfiler
  r  r  rs   r   r  r  filenamesource_date_epochprinters                r#   	_print_pszFigureCanvasPS._print_ps?  s    kkoogR[[12||G,11H3::7C !#+>r"6"63??++DE#GY II&9: ! ..%&((01G(H	 	^$
 yy !<&2&8&8&:!< < ^4IOO%	F/Y/9E((k&7&7&9; ll=1 ))%% 	 	W 	H#L'9	H@F	Hr%   bbox_inches_restorec                H    |dk(  t        |t        t        j                  f      st	        |      st        d       j                  j                         \  dk(  rt        j                  f       j                  t                 \  }}	t        j                  d   r>|kD  s|	kD  r4t        j                  f       j                  t                 \  }}	d|z
  z  d|	z
  z  }
}|
 j                  j                  j                  z   }| j                  j                  j                  z   }dt         j"                  u r||
||f\  }
}}}d|	z  z
  cd|
|||ft%                _        t)         j&                  |	      t+         j                  ||
      } j                  j-                  |        fd}t        j                  d   rt/               5 }t        j0                  j3                  |d      }t5        |dd      5 } ||       ddd       t        j                  d   dk(  rt7        t8        |       n*t        j                  d   dk(  rt7        t:        |       t=        ||       ddd       yt?        j@                  |dd      5 }tC        |      s tE        jF                  d      |      } ||       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w# 1 sw Y   yxY w)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 objectr  ps.usedistillerg      B@r   r   Z   r   r-  c           	         rt        d|        nt        d
 dd|        t         d	j                   dt              d	    d
d|        t        t              }t        d|        t
        j                  d   s"|t        j                  j                        z  }t        d|z  |        t        d|        t        dj                  t              |        t
        j                  d   sj                  j                  j                         D ]i  \  }}|s	t
        j                  d   }t        |      dkD  rd}| j                          |dk(  r| j                  t        ||             ]t        |||        k t        d|        t        d|        st        d|        t        d|        t        dt              z  |        rt        dz  |        t        dt        dz  dz  d	d	      z  |        t        j                   j#                         |        t        d|        t        d|        st        d|        | j                          y )Nz%!PS-Adobe-3.0 EPSF-3.0)filez%%!PS-Adobe-3.0
%%DocumentPaperSizes: z
%%Pages: 1
r   )endr4  z
%%Orientation: r   r   z
%%EndComments
z%%BeginPrologr   z/mpldict %d dict defzmpldict beginzps.fonttype   r   r  r5  z%%EndPrologz%%Page: 1 1z%s translatez	%d rotatez
%s clipboxr   showpagez%%EOF)printr   get_bbox_headerr   psDefsr   r   r   usedrr   r`   flushr   r   r   rt   r   r   )r   Ndictr   r   fonttyper   r  r   is_epsr  r  ps_rendererrotationr"   r   r  r  s        r#   print_figure_implz7FigureCanvasPS._print_figure.<locals>.print_figure_impl  s*   /b9 //8k :%& 2' \N #$$/$4$4#5R$T*1-. /$% r	# KE/+<<,[;;@@AA(50r:/+$))F#"-<<,&99>>DDFA$Iu  "||M:H5zC'#%HHJ1}!29e!DE*9eR@A %b!-b)m"-/+.<B#77bAkH,26,eBhr	1a!HH $..))+"5 %b!*2&gB'HHJr%   tmp.psrb   r   r   Nghostscript)ptyper   xpdf)$r  r   r   r  r   
ValueErrorr  get_size_inchesrg   r  r_   r   r   r   r   r   r  r   r   r   r   r   drawr   r   rr   r   _try_distill
gs_distillxpdf_distillr   r   open_file_cmr   codecs	getwriter)r"   r'  r(  r  r  r  r  r.  paper_widthpaper_heightllxllyurxuryrendererrB  r   r   r   r4  r   r   r?  r@  rA  r   r  r  s   `   ```             @@@@@@@@r#   r&  zFigureCanvasPS._print_figureh  s    7S"++$67(1KLL 335v&..v?AI$/$A$Ai %"!\ <<)*{"f|&;* 22E6?CE	,7,I,Ii(-*)\ u,-./DKK$$***DKK$$+++,000!$c3!3Cc3,&+RFBHS#s#! !M$KK[ 35 	"9	 9	v <<)* $% 
?'',,vx8'3; *r%b)*<< 12mC !(&	N\\"34> !(&	N,Wg>
? 
? ##GS9E (,T266++I6t<D!$'( (* *
? 
?( (s1   /L5	L >A)L/L L		LLL!c                &   |dk(  }| j                   j                         \  }	}
d}d}|}|}|| j                   j                  j                  z   }|| j                   j                  j                  z   }||||f}t               | _        t        |	|
| j                  |      }t        | j                   |	|
|||      }| j                   j                  |       t               5 }t        j                  |d      }|j                  d| dt        |      d    dt        t                d	d
j#                  t                dt%        ||       dt%        |	dz  |
dz         d| j                  j'                          dd       |t(        j*                  u r
|
|	}
}	||||f}|r-|j-                  | j                   j                               \  }}n|dk(  rt/        |	|
      }t0        |   \  }}t3        ||j4                  |||j6                        }t8        j:                  d   dk(  st8        j:                  d   rt=        t>        |||||       n+t8        j:                  d   dk(  rt=        t@        |||||       tC        ||       ddd       y# 1 sw Y   yxY w)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   r2  r-  rC  z%!PS-Adobe-3.0 EPSF-3.0
r   z&
%%EndComments
%%BeginProlog
/mpldict z dict def
mpldict begin
r   z
end
%%EndProlog
mpldict begin
r  r   z 0 0 clipbox
z
end
showpage
r   r   r  r0  rD  r   )rE  r   rotatedrF  N)"r  rH  r   r   r   r   r   r   r   rI  r   r  r   
write_textr9  r   r:  rr   rt   r   r  r   r  rg   r_   _convert_psfragsr   r   r   r   rJ  rK  rL  r   )r"   r'  r(  r  r  r  r  r.  r?  r   r   r  r  rR  rS  rT  rU  r   r@  rV  r   tmppathrP  rQ  psfrag_rotateds                            r#   r%  z FigureCanvasPS._print_figure_tex  s    335vDKK$$***DKK$$+++S#s#! !M$T[[%*FC9LN 	"  ! 4	;Vll684G q  
 f+    b"  eBhr	" # $  $ #'  $* l444 &vS#s+
 ,7,I,IKK//1-3)\ & .uf =I,5i,@)\-++[,  "N ./=@||M2Z$fID%35 /0F:\$fID%35 )':i4	; 4	; 4	;s   FJJr^  r  c                 T    | j                   j                          t        |          S r   )r  draw_without_renderingr   rI  )r"   r  s    r#   rI  zFigureCanvasPS.drawL  s    **,w|~r%   )r&   r'   r(   	fixed_dpi	filetypesr	  r   delete_parameterr,  r&  r%  r   partialmethodprint_ps	print_epsrI  r  r  s   @r#   r  r  7  s    I#13I T5&) Tz&H *&HV !%G(X !%V;p 'y&&y$7H'	''	59I r%   r  c                 F    t        t        j                  |       ||||      S r   )rZ  r  r   )r   psfragsfont_preamblecustom_preamblerP  rQ  r  s          r#   convert_psfragsri  Q  s'     Ww\;P Pr%   c           	      L   t        j                  dt         j                  d   t         j                  j	                  d      z   t         j                  j	                  d      z   t         j                  j	                  d      z   d||dz  z   i      5  t               j                  ddj                  |      |d	k(  rd
nd| j                         j                         dz  d      }ddd       t               5 }t        j                  j                  |d      }t        j                  dddd|gt               t!        j"                  ||        ddd       t%        |       5 }d|j'                  d      v }	ddd       |	S # 1 sw Y   xY w# 1 sw Y   >xY w# 1 sw Y   	S xY w)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   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   r1  r   )rf  r  epsfile
   )r   NrC  dvipsz-qz-R0z-o	Landscapei  )r   
rc_contextr   
texmanager_usepackage_if_not_loadedr   make_dvirr   resolveas_posixr   r   r   r   _check_and_log_subprocessr   r   r   r   read)
r[  rf  rP  rQ  r  dvifiler   psfiler   r\  s
             r#   rZ  rZ  X  s    
!LL./NN44W=>NN44Z@A NN44X>? J#|<=	= 
  ,''  99W-*k9q"??,557
  ( . 
	 %fh/''dE494	AFG$	% 
g 6"$56M .% %6s&   AF9AF#FF
FF#c                     	  | t        |      g|i | y # t        j                  $ r }t        j	                  d|       Y d }~y d }~ww xY w)Nz%s.  Distillation step skipped.)r   r   ExecutableNotFoundErrorr   r   )funcr[  rs   r   excs        r#   rJ  rJ    sE    =S\+D+F+&& =6<<=s    AAAc           
      J   |rd}nd|z  }| dz   }t         j                  d   }t        j                  t        j                  d      j
                  ddd|z  d	|d
|z  | gt               t        j                  |        t        j                  ||        |rt        | ||       yy)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rX  N)r   r   r   rv  _get_executable_info
executabler   r   remover   r   pstoeps)r   r  rE  r   rX  paper_optionry  r  s           r#   rK  rK    s     "'%/u_F
,,)
*C	##		!	!$	'	2	2	K#/B	(617	< 		 IIg
KK   	w/ r%   c                    t        j                  d       t        j                  d       t               5 }t        j                  |d      }t        j                  |d      }t        j                  ddddd	d
|rdnd|z  | |g	t               t        j                  dddd||gt               t        j                  ||        ddd       |rt        |        yy# 1 sw Y   xY w)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  pdftopsztmp.pdfrC  ps2pdfz-dAutoFilterColorImages#falsez-dAutoFilterGrayImages#falsez-sAutoRotatePages#Nonez-sGrayImageFilter#FlateEncodez-sColorImageFilter#FlateEncoder  z-sPAPERSIZE#%sz-papermatchz-level2N)r   r  r   r  r   r   rv  r   r   r   r  )r   r  rE  r   rX  r   tmppdftmppss           r#   rL  rL    s     T"Y'		 $fi0VX. 	'',+%,-[%5%=f  $	% 	'''9feDd	LE7#!$"  #$ $s   BCC"c                     | \  }}}}|rd||z   dfz  }nd}d||t        j                  |      t        j                  |      fz  }d||||fz  }dj                  ||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  r  rr   )	lbrtrX  r]   r  r   trotate	bbox_infohires_bbox_infos	            r#   r9  r9    s     JAq!Q1QqS!H<.!Q
BGGAJ1OOIA	1aE O 99i12F::r%   c                    |rt        ||      \  }}nd\  }}| dz   }t        |d      5 }t        | d      5 }|j                  }|D ]  }	|	j                  d      r& |d       |s ||j	                  d      d	z          :|	j                  d
      r. ||	        |d       |r ||j	                  d      d	z           n|r|	j                  d      r ||	        |D ]6  }	|	j                  d      r	 |d       |	j                  d      r/ ||	       8 	 ddd       ddd       t        j                  |        t        j                  ||        y# 1 sw Y   =xY w# 1 sw Y   AxY w)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   r   s   %!PSs   %!PS-Adobe-3.0 EPSF-3.0
r      
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)	r9  r   r   ra   r  r   r  r   r   )
r   r   rX  r  r  rl  epshtmphr   lines
             r#   r  r    st    +D'B	6&	6G	gt	 )d7D&9 )T

 	Dw'23)**73e;<!12d & ' &--0589$// +K Ld/	6  	Dx( ! " !56d	=) )V IIg
KK!Y) ) ) )s)   E!-E%B3EE!E	E!!E*)
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                       e Zd ZdZeZy)
_BackendPSzLevel IIN)r&   r'   r(   backend_versionr  FigureCanvasr)   r%   r#   r  r  T  s     O!Lr%   r  )Fr*   NF)F)NF)Sr  rN  r  enumr   r   ior   loggingr   r  r   r   tempfiler   r   numpyr  
matplotlibr   r   r   r   r	   matplotlib._afmr
   matplotlib.backend_basesr   r   r   r   matplotlib.cbookr   r   matplotlib.font_managerr   matplotlib.ft2fontr   r   matplotlib._ttconvr   matplotlib._mathtext_datar   matplotlib.pathr   matplotlib.texmanagerr   matplotlib.transformsr   !matplotlib.backends.backend_mixedr   r   r   	getLoggerr&   r   r   r   ps_backend_helperr_   rg   rt   
deprecatedr   r   r   r   r   RendererPDFPSBaser   r  r  ri  rZ  rJ  rK  rL  r9  r  FigureManagerPSr:  exportr  r)   r%   r#   <module>r     sj         	  	  '    8 8 A A I , 5 0 /   , * ?  w"
 
 $% "Xy "i"x" >" >	"
 >" >" =" <" <" <" <" <" L" >" >"  >!"" "!  1"	6K $FG
 H
= N5b#Lq22 qhB4 BW% Wt P P.b=0D>;$:"z $"
J 
" " "r%   