B
    ]”t\Î±  ã               @   sš  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Zd dl	Z
d dlmZmZmZ d dlmZmZmZmZ d dl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"m#Z#m$Z$ d dlm%Z% e &e'¡Z(eZ)dd„ Z*e +d¡Z,dd„ Z-dd„ Z.dd„ Z/G dd„ de0ƒZ1g fdd„Z2i fdd„Z3dddd œZ4G d!d"„ d"eƒZ5G d#d$„ d$eƒZ6eZ7d%Z8ej9G d&d'„ d'eƒƒZ:dS )(é    )ÚOrderedDictN)ÚcbookÚ__version__ÚrcParams)Ú_BackendÚFigureCanvasBaseÚFigureManagerBaseÚRendererBase)ÚMixedModeRenderer)Úrgb2hex)ÚfindfontÚget_font)ÚLOAD_NO_HINTING)ÚMathTextParser)ÚPath)Ú_path)ÚAffine2DÚAffine2DBase)Ú_pngc             C   s(   |   dd¡} |   dd¡} |   dd¡} | S )Nú&z&amp;ú<z&lt;ú>z&gt;)Úreplace)Ús© r   ú>lib/python3.7/site-packages/matplotlib/backends/backend_svg.pyÚescape_cdataC   s    r   z-(?=-)c             C   s   t | ƒ} t d| ¡S )Nz- )r   Ú_escape_xml_commentÚsub)r   r   r   r   Úescape_commentJ   s    r   c             C   s@   |   dd¡} |   dd¡} |   dd¡} |   dd¡} |   d	d
¡} | S )Nr   z&amp;ú'z&apos;ú"z&quot;r   z&lt;r   z&gt;)r   )r   r   r   r   Úescape_attribN   s    r"   c             C   s   d  | ¡ d¡ d¡S )zˆ
    Create a short string representation of a float, which is %f
    formatting with trailing zeros and the decimal point removed.
    z{0:f}Ú0Ú.)ÚformatÚrstrip)Úxr   r   r   Úshort_float_fmtV   s    r(   c               @   sb   e Zd Zdd„ Zddd„Zi fdd„Zdd	„ Zd
d„ Zddd„Zdd„ Z	di fdd„Z
dd„ ZdS )Ú	XMLWriterc             C   s6   |j | _t|dƒr|j| _d| _g | _g | _d| _d S )NÚflushr   z@                                                                )ÚwriteÚ_XMLWriter__writeÚhasattrr*   Ú_XMLWriter__openÚ_XMLWriter__tagsÚ_XMLWriter__dataÚ_XMLWriter__indentation)ÚselfÚfiler   r   r   Ú__init__d   s    
zXMLWriter.__init__Tc             C   sP   | j r&|r|  d¡ n
|  d¡ d| _ | jrLd | j¡}|  t|ƒ¡ g | _d S )Nz>
r   r   Ú )r.   r,   r0   Újoinr   )r2   ÚindentÚdatar   r   r   Z__flushm   s    
zXMLWriter.__flushc             K   sª   |   ¡  t|ƒ}g | _| j |¡ |  | jd t| jƒd … ¡ |  d| ¡ xFt||– 	¡ ƒD ]2\}}|dks`t|ƒ}t
|ƒ}|  d||f ¡ q`W d| _t| jƒd S )Né   z<%sr5   z %s="%s")Ú_XMLWriter__flushr   r0   r/   Úappendr,   r1   ÚlenÚsortedÚitemsr"   r.   )r2   ÚtagÚattribÚextraÚkÚvr   r   r   Ústart„   s    zXMLWriter.startc             C   s8   |   ¡  |  | jd t| jƒ… ¡ |  dt|ƒ ¡ d S )Nz<!-- %s -->
)r:   r,   r1   r<   r/   r   )r2   Úcommentr   r   r   rE   ˜   s    zXMLWriter.commentc             C   s   | j  |¡ d S )N)r0   r;   )r2   Útextr   r   r   r8   ¢   s    zXMLWriter.dataNc             C   s´   |r@| j std| ƒ‚t|ƒ| j d ksNtd| j d |f ƒ‚n| j sNtdƒ‚| j  ¡ }| jrj|  |¡ n| jr„d| _|  d¡ d S |r¢|  | jd t	| j ƒ… ¡ |  d| ¡ d S )Nzunbalanced end(%s)éÿÿÿÿzexpected end(%s), got %szunbalanced end()r   z/>
z</%s>
)
r/   ÚAssertionErrorr   Úpopr0   r:   r.   r,   r1   r<   )r2   r?   r7   r   r   r   Úend¬   s    

zXMLWriter.endc             C   s    xt | jƒ|kr|  ¡  qW d S )N)r<   r/   rJ   )r2   Úidr   r   r   ÚcloseÄ   s    zXMLWriter.closec             K   s.   | j ||f|Ž |r|  |¡ | jdd d S )NF)r7   )rD   r8   rJ   )r2   r?   rF   r@   rA   r   r   r   ÚelementÍ   s    
zXMLWriter.elementc             C   s   d S )Nr   )r2   r   r   r   r*   Ö   s    zXMLWriter.flush)T)NT)Ú__name__Ú
__module__Ú__qualname__r4   r:   rD   rE   r8   rJ   rL   rM   r*   r   r   r   r   r)   c   s   	



		r)   c          	   C   s¤   t | ƒr t ¡ }x†| D ]~\}}|dkr6|dks|dks|dkrF|dks|dkrX|dkrXq|dkrrt|tƒrr| ¡ }| d	|d
 dd„ |D ƒ¡f ¡ qW | ¡ S dS )NÚscale)r9   )r9   r9   Ú	translate)r   r   Úrotate)r   Úmatrixz%s(%s)ú c             s   s   | ]}t |ƒV  qd S )N)r(   )Ú.0r'   r   r   r   ú	<genexpr>æ   s    z%generate_transform.<locals>.<genexpr>r5   )	r<   ÚioÚStringIOÚ
isinstancer   Z	to_valuesr+   r6   Úgetvalue)Ztransform_listÚoutputÚtypeÚvaluer   r   r   Úgenerate_transformÛ   s     r_   c             C   sX   | rTt  ¡ }t|  ¡ ƒ} x2| D ]*\}}t|ƒ}t|ƒ}| d||f ¡ qW | ¡ S dS )Nz%s:%s;r5   )rX   rY   r=   r>   r"   r+   r[   )r@   r\   rB   rC   r   r   r   Úgenerate_cssê   s    r`   ZsquareÚbuttÚround)Z
projectingra   rb   c               @   s(  e Zd ZdGdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdHdd„Zdd „ Zd!d"„ ZdId#d$„ZdJd%d&„ZdKd'd(„Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ ZdLd3d4„Zd5d6„ ZdMd7d8„ZdNd9d:„ZdOd<d=„ZdPd?d@„Z dAdB„ Z!dCdD„ Z"dEdF„ Z#dS )QÚRendererSVGNéH   c          	   C   sð   || _ || _t|ƒ| _|| _i | _td sB|d k	s6t‚|| _i | _	t
ƒ | _i | _i | _d| _i | _	t
ƒ | _d| _d| _t
ƒ | _tdƒ| _t | ¡ tƒ | _t|ƒ}t|ƒ}| t¡ | jjdd| d| d||f dd	d
did| _|  ¡  d S )Nzsvg.image_inliner   FZSVGÚsvgz%sptz	0 0 %s %szhttp://www.w3.org/2000/svgz1.1zxmlns:xlinkzhttp://www.w3.org/1999/xlink)ÚwidthÚheightZviewBoxZxmlnsÚversionr@   )rf   rg   r)   ÚwriterÚ	image_dpiÚ_groupdr   rH   ÚbasenameÚ_imagedr   Ú_clipdZ
_char_defsÚ_markersÚ_path_collection_idÚ_hatchdÚ_has_gouraudÚ_n_gradientsÚ_fontsr   Úmathtext_parserr	   r4   ÚdictÚ
_glyph_mapr(   r+   Ú	svgPrologrD   Ú	_start_idÚ_write_default_style)r2   rf   rg   Z	svgwriterrl   rj   Z
str_heightZ	str_widthr   r   r   r4   ÷   sB    




zRendererSVG.__init__c             C   s4   |   ¡  |  ¡  |  ¡  | j | j¡ | j ¡  d S )N)Ú_write_clipsÚ_write_hatchesÚ_write_svgfontsri   rL   ry   r*   )r2   r   r   r   Úfinalize  s
    zRendererSVG.finalizec             C   sR   | j }tdddœƒ}| d¡ |jddd | d| ¡ | d¡ | d¡ d S )	Nrb   ra   )zstroke-linejoinzstroke-linecapÚdefsÚstyleztext/css)r]   z*{%s}
)ri   r`   rD   r8   rJ   )r2   ri   Zdefault_styler   r   r   rz   #  s    


z RendererSVG._write_default_stylec             C   s`   t d }|d krtt ¡ ƒ}t ¡ }| | d¡¡ | t|ƒ d¡¡ d|| ¡ d d… f S )Nzsvg.hashsaltÚutf8z%s%sé
   )	r   ÚstrÚuuidZuuid4ÚhashlibZmd5ÚupdateÚencodeZ	hexdigest)r2   r]   ZcontentZsaltÚmr   r   r   Ú_make_id.  s    zRendererSVG._make_idc             C   s   |t ƒ  dd¡ d| j¡ S )Ng      ð?g      ð¿g        )r   rQ   rR   rg   )r2   Ú	transformr   r   r   Ú_make_flip_transform7  s    z RendererSVG._make_flip_transformc             C   s0   t |ƒ}t|ƒ}| ¡  | ¡ }| |d¡ |S )Ng      R@)r   r   ÚclearÚget_size_in_pointsÚset_size)r2   ÚpropÚfnameÚfontÚsizer   r   r   Ú	_get_font=  s    zRendererSVG._get_fontc             C   s|   |dk	rt |ƒ}| ¡ }|dk	r(t |ƒ}| ¡ ||f}| j |¡}|dkrp|  d|¡}| ¡ ||f|f| j|< n|\}}|S )z,
        Create a new hatch pattern
        NÚh)ÚtupleZget_hatch_colorÚ	get_hatchrq   Úgetr‰   Úget_hatch_path)r2   ÚgcÚrgbFaceZedgeÚdictkeyÚoidÚ_r   r   r   Ú
_get_hatchE  s    zRendererSVG._get_hatchc       	      C   s  t | jƒsd S d}| j}| d¡ xÚ| j ¡ D ]Ì\\}}}}|jd|dddt|ƒt|ƒd | j|tƒ  |¡ dd¡ 	d	|¡d
d}|d kr’d}nt
|ƒ}|jdddt|d ƒt|d ƒ|d |jd|tt
|ƒt
|ƒttd ƒdddœƒd | d¡ q.W | d¡ d S )Nrd   r   ÚpatternÚuserSpaceOnUser#   )rK   ZpatternUnitsr'   Úyrf   rg   g      ð?g      ð¿r   F)ÚsimplifyÚnoneÚrectr9   )r'   r¡   rf   rg   ÚfillÚpathzhatch.linewidthra   Zmiter)r¥   Ústrokezstroke-widthzstroke-linecapzstroke-linejoin)Údr€   )r<   rq   ri   rD   Úvaluesrƒ   Ú_convert_pathr   rQ   rR   r   rM   r`   r   rJ   )	r2   Z
HATCH_SIZEri   r¦   Zfacer§   rœ   Ú	path_datar¥   r   r   r   r|   W  sF    




zRendererSVG._write_hatchesc       	      C   s¶  i }|  ¡ }| ¡ dk	rbd|  ||¡ |d< |dk	rÀt|ƒdkrÀ|d dkrÀ|sÀt|d ƒ|d< n^|dkrtd|d< nLt|dd… ƒd	kr”t|ƒ|d< t|ƒdkrÀ|d dkrÀ|sÀt|d ƒ|d< |rà| ¡ dkràt| ¡ ƒ|d
< | ¡ \}}|dk	rd 	dd„ |D ƒ¡|d< tt
|ƒƒ|d< | ¡ }|r²| ¡ }t|ƒ|d< |sd|d dkrdt|d ƒ|d< |dkrzt|ƒ|d< | ¡ dkr”| ¡ |d< | ¡ dkr²t| ¡  |d< |S )zk
        return the style string.  style is generated from the
        GraphicsContext and rgbFace
        Nzurl(#%s)r¥   é   é   g      ð?zfill-opacityr£   )r   r   r   Úopacityú,c             S   s   g | ]}t |ƒ‘qS r   )r(   )rV   Úvalr   r   r   ú
<listcomp>š  s    z/RendererSVG._get_style_dict.<locals>.<listcomp>zstroke-dasharrayzstroke-dashoffsetr§   zstroke-opacityzstroke-widthrb   zstroke-linejoinra   zstroke-linecap)Úget_forced_alphar–   rž   r<   r(   r•   r   Ú	get_alphaZ
get_dashesr6   ÚfloatZget_linewidthÚget_rgbZget_joinstyleZget_capstyleÚ_capstyle_d)	r2   r™   rš   r@   Zforced_alphaÚoffsetÚseqZ	linewidthZrgbr   r   r   Ú_get_style_dict  s>    $


zRendererSVG._get_style_dictc             C   s   t |  ||¡ƒS )N)r`   r¹   )r2   r™   rš   r   r   r   Ú
_get_style¬  s    zRendererSVG._get_stylec             C   sÆ   |  ¡ }| ¡ \}}|d k	r8|  |¡}t|ƒt|ƒf}n6|d k	rj|j\}}}}	| j||	  }||||	f}nd S | j |¡}
|
d krº|  	d|¡}|d k	rª||f|f| j|< qÂ||f| j|< n|
\}
}|S )NÚp)
Zget_clip_rectangleZget_clip_pathr‹   rK   rƒ   Zboundsrg   rn   r—   r‰   )r2   r™   ZcliprectÚclippathÚclippath_transr›   r'   r¡   Úwr”   Úcliprœ   r   r   r   Ú	_get_clip¯  s$    
zRendererSVG._get_clipc             C   sÀ   t | jƒsd S | j}| d¡ x’| j ¡ D ]„\}}|jd|d t |ƒdkrt|\}}| j||dd}|jd|d n0|\}}}	}
|jd	t|ƒt|ƒt|	ƒt|
ƒd
 | d¡ q*W | d¡ d S )Nr   ZclipPath)rK   é   F)r¢   r¦   )r¨   r¤   )r'   r¡   rf   rg   )	r<   rn   ri   rD   r©   rª   rM   r(   rJ   )r2   ri   r¿   rœ   r¼   r½   r«   r'   r¡   r¾   r”   r   r   r   r{   Ç  s&    

zRendererSVG._write_clipsc          
   C   s  t d dksd S | j}| d¡ xæ| j ¡ D ]Ø\}}t|ƒ}| dd¡ | ¡ }|jd|d  d¡d |j	d	|j
|j ¡ d
d dd„ |jD ƒ¡dœd x^|D ]V}|j|td}| ¡ \}}	t||	ƒ}
|  |
¡}|j	d|t|ƒt|jd ƒdœd q W | d¡ q,W | d¡ d S )Nzsvg.fonttypeÚsvgfontr   rd   r‘   )r9   r   r   r¬   Ú	mac_roman)rK   z	font-faceZ72rU   c             s   s   | ]}t |d  ƒV  qdS )g      P@N)r(   )rV   r'   r   r   r   rW   ï  s    z.RendererSVG._write_svgfonts.<locals>.<genexpr>)zfont-familyz
font-stylezunits-per-emÚbbox)r@   )ÚflagsÚglyphg      ð@)Zunicodezhoriz-adv-x)r¨   r@   )r   ri   rD   rt   r>   r   rŽ   Zget_sfntÚdecoderM   Úfamily_nameÚ
style_nameÚlowerr6   rÄ   Z	load_charr   Zget_pathr   rª   Úchrr(   ZlinearHoriAdvancerJ   )r2   ri   Z
font_fnameÚcharsr‘   ZsfntÚcharrÆ   ÚvertsÚcodesr¦   r«   r   r   r   r}   Ý  s8    



zRendererSVG._write_svgfontsc             C   sP   |r| j jd|d n6| j |d¡d | j|< | j jdd|| j| f d dS )zv
        Open a grouping element with label *s*. If *gid* is given, use
        *gid* as the id of the group.
        Úg)rK   r   r9   z%s_%dN)ri   rD   rk   r—   )r2   r   Úgidr   r   r   Ú
open_group  s    zRendererSVG.open_groupc             C   s   | j  d¡ d S )NrÐ   )ri   rJ   )r2   r   r   r   r   Úclose_group  s    zRendererSVG.close_groupc             C   s
   t d  S )zl
        return whether to generate a composite image from multiple images on
        a set of axes
        zimage.composite_image)r   )r2   r   r   r   Úoption_image_nocomposite  s    z$RendererSVG.option_image_nocompositec             C   sB   |rdd| j | jf}nd }t |||||ddddddgd¡ d	¡S )
Ng        é   ó   Mó   Ló   Qó   Có   zFÚascii)rf   rg   r   Zconvert_to_stringrÇ   )r2   r¦   rŠ   r¿   r¢   Úsketchr   r   r   rª     s    zRendererSVG._convert_pathc             C   sÂ   |   |¡}|d ko| ¡ d k}|jo&|}| j||||| ¡ d}i }	|  ||¡|	d< |  |¡}
|
d k	rrd|
 |	d< | ¡ d k	r”| j 	dd| ¡ i¡ | jj
d||	d | ¡ d k	r¾| j d¡ d S )	N)r¿   r¢   rÜ   r€   zurl(#%s)z	clip-pathÚaz
xlink:hrefr¦   )r¨   r@   )r‹   r˜   Zshould_simplifyrª   Zget_sketch_paramsrº   rÀ   Úget_urlri   rD   rM   rJ   )r2   r™   r¦   rŠ   rš   Útrans_and_flipr¿   r¢   r«   r@   Úclipidr   r   r   Ú	draw_path   s     


zRendererSVG.draw_pathc             C   sŒ  t |jƒsd S | j}| j||tƒ  dd¡ dd}|  ||¡}	|t|	ƒf}
| j 	|
¡}tdd„ |	 
¡ D ƒƒ}	|d kr°|  d|
¡}| d¡ |jd	|||	d
 | d¡ || j|
< i }|  |¡}|d k	rÒd| |d< |jd|d |  |¡}dd| i}dd| jd | jd f}xn|j||ddD ]Z\}}t |ƒr |dd … \}}t|ƒ|d< t|ƒ|d< |  ||¡|d< |jd|d q W | d¡ d S )Ng      ð?g      ð¿F)r¢   c             S   s    i | ]\}}|  d ¡r||“qS )r§   )Ú
startswith)rV   rB   rC   r   r   r   ú
<dictcomp>A  s    z,RendererSVG.draw_markers.<locals>.<dictcomp>rˆ   r   r¦   )rK   r¨   r€   zurl(#%s)z	clip-pathrÐ   )r@   z
xlink:hrefz#%sr   rd   )r¿   r¢   éþÿÿÿr'   r¡   r€   Úuse)r<   Úverticesri   rª   r   rQ   r¹   r`   ro   r—   r>   r‰   rD   rM   rJ   rÀ   r‹   rf   rg   Ziter_segmentsr(   rº   )r2   r™   Zmarker_pathZmarker_transr¦   Útransrš   ri   r«   r€   r›   rœ   r@   rà   rß   r¿   ræ   Úcoder'   r¡   r   r   r   Údraw_markers5  sD    






zRendererSVG.draw_markersc              C   s  t |ƒdkrt |d jƒnd}|  |||||¡}|d|  d |d | k }|stt | |||||||||	|
|||¡S | j}g }| d¡ xxt|  |||¡ƒD ]b\}\}}t	| 
¡ ƒ dd¡}| j||dd	}d
| j||  d|¡f }|jd||d | |¡ qœW | d¡ xâ|  |||||||||	|
|||¡D ]¼\}}}}}|  |¡}| ¡ }|d k	rl|jdd|id |d k	rŒ|jddd| id d| t|ƒt| j| ƒ|  ||¡dœ}|jd|d |d k	rÖ| d¡ |d k	r0| d¡ q0W |  jd7  _d S )Nr   é	   r­   é   r   g      ð?g      ð¿F)r¢   z	C%x_%x_%sr5   r¦   )rK   r¨   rÝ   z
xlink:href)r@   rÐ   z	clip-pathzurl(#%s)z#%s)z
xlink:hrefr'   r¡   r€   rå   r9   )r<   ræ   Z_iter_collection_uses_per_pathr	   Údraw_path_collectionri   rD   Ú	enumerateZ_iter_collection_raw_pathsr   Z
get_matrixrQ   rª   rp   r‰   rM   r;   rJ   Z_iter_collectionrÀ   rÞ   r(   rg   rº   ) r2   r™   Zmaster_transformÚpathsZall_transformsZoffsetsZoffsetTransZ
facecolorsZ
edgecolorsZ
linewidthsZ
linestylesZantialiasedsZurlsZoffset_positionZlen_pathZuses_per_pathZshould_do_optimizationri   Z
path_codesÚir¦   rŠ   r¨   rœ   ZxoZyoZpath_idZgc0rš   rà   Úurlr@   r   r   r   rì   ^  sT    	










z RendererSVG.draw_path_collectionc          
   C   s  | j }| jspd| _|jddd |jdddidd	d
d
d | d¡ |jddd |jdddidd | d¡ tj|d d …d d …f ddd }|d dkr¢d S |  |¡}| |¡}| d¡ xNt	dƒD ]@}	||	 \}
}||	d d  \}}||	d d  \}}||	 d d … }||kr*|}|}nd||kr>|
}|}nP|| ||  }|||  }d|  }|||
  }| | ||  }|| | }|jdd| j
|	f dt|
ƒt|ƒt|ƒt|ƒd |jd d
tt|ƒt|d ƒd!œƒd" |jd d#tt|ƒd#d!œƒd" | d¡ qÌW | d¡ d$t|
ƒ d% t|ƒ }|d&t|ƒ d% t|ƒ 7 }|d't|ƒ d% t|ƒ d( 7 }|jd)|t|ƒd
d*d+œd, |jd-d.d#d*d/d0œd, |jd)|d1| j
 d*d2œd, |jd)|d3| j
 d4d*d5œd, |jd)|d6| j
 d4d*d5œd, | d-¡ |  j
d7  _
d S )7NTÚfilterZcolorAdd)rK   ZfeCompositeÚinZSourceGraphicZBackgroundImageZ
arithmeticÚ1)r@   Zin2ÚoperatorZk2Zk3ZcolorMatZfeColorMatrixr]   rT   z61 0 0 0 0 
0 1 0 0 0 
0 0 1 0 0 
1 1 1 1 0 
0 0 0 0 1 )r@   r©   r   )Zaxisg      @rG   g        r   r­   r9   rÁ   g      ð?ZlinearGradientzGR%x_%dr    )rK   ZgradientUnitsÚx1Úy1Úx2Úy2Ústop)z
stop-colorzstop-opacity)r·   r€   r#   zM r¯   z L rU   z Zr¦   Z
crispEdges)r¨   r¥   zfill-opacityzshape-rendering)r@   rÐ   r£   zurl(#colorMat))r§   zstroke-widthzshape-renderingrñ   zurl(#GR%x_0))r¨   r¥   zshape-renderingzurl(#GR%x_1)zurl(#colorAdd))r¨   r¥   rñ   zshape-renderingzurl(#GR%x_2))ri   rr   rD   rM   rJ   ÚnpÚsumr‹   rŠ   Úrangers   r(   r`   r   )r2   r™   ZpointsZcolorsrç   ri   Z	avg_colorrß   Ztpointsrï   rõ   rö   r÷   rø   Zx3Zy3ÚcZxbZybZm1Zb1Zm2Zb2Zdpathr   r   r   Údraw_gouraud_triangle˜  sÀ    


"






 
z!RendererSVG.draw_gouraud_trianglec       	      C   sr   i }|   |¡}|d k	r"d| |d< | jjd|d | ¡ }x&t||ƒD ]\}}|  ||||¡ qFW | j d¡ d S )Nzurl(#%s)z	clip-pathrÐ   )r@   )rÀ   ri   rD   ÚfrozenÚziprþ   rJ   )	r2   r™   Ztriangles_arrayZcolors_arrayrŠ   r@   rà   ZtriÚcolr   r   r   Údraw_gouraud_triangles  s    
z"RendererSVG.draw_gouraud_trianglesc             C   s   dS )NTr   )r2   r   r   r   Úoption_scale_image(  s    zRendererSVG.option_scale_imagec             C   s
   | j d S )Ng      R@)rj   )r2   r   r   r   Úget_image_magnification+  s    z#RendererSVG.get_image_magnificationc          	   C   sh  |j d d… \}}|dks"|dkr&d S i }|  |¡}	|	d k	rT| jjddd|	 id | ¡ }
| ¡ }|d k	r€| jjdd|id td	 rÎt ¡ }t	 
||¡ |
p®|  d
| ¡ ¡}
dt | ¡ ¡ d¡ |d< nh| j | jd¡d | j| j< d| j| j| j f }t d|¡ t	 
||¡ |
p,d|  d
|¡ }
||d< |
|d< |d kr®d| | j }d| | j }| jjd
tddd| ffgƒt|ƒt| j| |  ƒt|ƒt|ƒ|d nŠ| ¡ }|dkrÌt|ƒ|d< tƒ  d| d| ¡| tƒ  ||¡ dd¡ d| j¡ }td| ¡ fgƒ|d< | jjd
t|ƒt|ƒ|d |d k	rN| j d¡ |	d k	rd| j d¡ d S )NrÁ   r   rÐ   z	clip-pathzurl(#%s))r@   rÝ   z
xlink:hrefzsvg.image_inlineZimagezdata:image/png;base64,
rÛ   r9   z%s.image%d.pngz$Writing image file for inclusion: %sZIm_rK   g      R@)rQ   )r9   rG   rR   )rŠ   r'   r¡   rf   rg   r@   g      ð?r®   g      ð¿g        rT   rŠ   )rf   rg   r@   ) ÚshaperÀ   ri   rD   Zget_gidrÞ   r   rX   ÚBytesIOr   Z	write_pngr‰   r[   Úbase64Z	b64encoderÇ   rm   r—   rl   Ú_logÚinforj   rM   r_   r(   rg   r³   r   rQ   rR   rÿ   rJ   )r2   r™   r'   r¡   ZimrŠ   r”   r¾   r@   rà   rœ   rð   ZbytesioÚfilenameÚalphaZflippedr   r   r   Ú
draw_image.  sj    





zRendererSVG.draw_imagec             C   s   |  dd¡S )Nz%20r   )r   )r2   Úchar_idr   r   r   Ú_adjust_char_idv  s    zRendererSVG._adjust_char_idc	       !      C   sd  | j }	|	 |¡ | j}
| j}t| ¡ ƒ}| ¡ }i }|dkrD||d< | ¡ rT| ¡ n
| ¡ d }|dkrtt	|ƒ|d< |s¾| 
|¡}|j|||
dd}|\}}}|rþ|	 d¡ x:| ¡ D ].\}}t|Ž }| j|d	d
}|	jd||d q¸W |	 d¡ |
 |¡ i }t|ƒ|d< ||j }td||ffd| ffd|| ffgƒ|d< |	jd|d x\|D ]T\}}}}dd| i}|dkr†t	|ƒ|d< |dkrœt	|ƒ|d< |	jd|d qXW |	 d¡ n¢|dkrÜ|j|||
dd}n|j|||
dd}|\}}}|rx|	 d¡ xZ| ¡ D ]N\}}|  |¡}t|d ƒs8d}nt|Ž }| j|d	d
}|	jd||d qW |	 d¡ |
 |¡ i }||j }t|ƒ|d< td||ffd| ffd|| ffgƒ|d< |	jd|d xN|D ]F\}}}}|  |¡}|	jdtd||ffd|ffgƒdd| id qÒW x8|D ]0\}} t|| ƒ}| j|d	d
}|	jd|d q"W |	 d¡ dS ) aœ  
        draw the text by converting them to paths using textpath module.

        Parameters
        ----------
        prop : `matplotlib.font_manager.FontProperties`
          font property

        s : str
          text to be converted

        usetex : bool
          If True, use matplotlib usetex mode.

        ismath : bool
          If True, use mathtext parser. If "TeX", use *usetex* mode.

        z#000000r¥   r­   r9   r®   T)Ú	glyph_mapZreturn_new_glyphs_onlyr   F)r¢   r¦   )rK   r¨   r€   rR   rS   rQ   rŠ   rÐ   )r@   z
xlink:hrefz#%sg        r'   r¡   rå   ÚTeXr   r5   )rŠ   r@   )r¨   N)ri   rE   rw   Ú
_text2pathr   rµ   r   r²   r³   r(   r“   Zget_glyphs_with_fontrD   r>   r   rª   rM   rJ   r†   r`   Z
FONT_SCALEr_   Zget_glyphs_texZget_glyphs_mathtextr  r<   )!r2   r™   r'   r¡   r   r   ÚangleÚismathÚmtextri   r  Z	text2pathÚcolorÚfontsizer€   r  r‘   Z_glyphsZ
glyph_infoZglyph_map_newZrectsr  Z
glyph_pathr¦   r«   r@   Z
font_scaleZglyph_idZ	xpositionZ	ypositionrQ   rÎ   rÏ   r   r   r   Ú_draw_text_as_pathy  s¢    

























zRendererSVG._draw_text_as_pathc	       ,      C   sÈ  | j }	t| ¡ ƒ}
i }|
dkr&|
|d< | ¡ r6| ¡ n
| ¡ d }|dkrVt|ƒ|d< |s\|  |¡}|j|dtd | 	¡ }|j
}| ¡ }i }t|ƒd |d	< t|ƒ|d
< | ¡  ¡ |d< t| ¡ ƒ ¡ |d< t|ƒ|d< |rê|dksø| ¡ dkrê| ¡ }| | ¡ ¡\}}| j| }t |¡}t t |¡t |¡g¡}t ||| || g¡}|||d   }|||d   }ddddœ}|| ¡  |d< t|ƒ|d< t|ƒ|d< t|ƒ|d< dt| ƒt|ƒt|ƒf |d< |	jd||d n0td||ffd| ffgƒ|d< |	jd||d td dkrÄ| j  |j!t"ƒ ¡}x|D ]}| #t$|ƒ¡ q@W nh|	 %|¡ | j& '|d|¡\}}}}}|j(} |j)}!i }t|ƒ|d< td||ffd| ffgƒ|d< |	j*d |d |	 *d¡ t+ƒ }"xj| D ]b\}}}#}$}%}&tt|ƒd |j
|j, ¡ |j, ¡ d!œƒ}|#d"kr&d#}#|"  |g ¡ -|$|% |#f¡ qàW td dkrŒx6| D ].\}}}#}$}%}&| j  |j!t"ƒ ¡}| #|#¡ qZW xÖ|" .¡ D ]Ê\}}'|' /¡  d$}(t0|'ƒdkrö|'d d })x0t1dt0|'ƒƒD ]}*|'|* d |)krÔd%}(P qÔW |(rt|'d d ƒ}+nd& 2d'd(„ |'D ƒ¡}+|d& 2d)d(„ |'D ƒ¡|+d*œ}|	jd+d, 2d-d(„ |'D ƒ¡|d q–W |	 3d¡ t0|!ƒrºx@|!D ]8\}}}}|	jd.t|ƒt| | ƒt|ƒt|ƒd/ q~W |	 3d ¡ d S )0Nz#000000r¥   r­   r9   r®   g        )rÅ   Zpxz	font-sizezfont-familyz
font-stylezfont-weightr€   r   ZanchorrD   rJ   Zmiddle)ÚleftÚrightÚcenterztext-anchorr'   r¡   zrotate(%s, %s, %s)rŠ   rF   )r@   rR   rS   zsvg.fonttyperÂ   rd   rÐ   )z	font-sizezfont-familyz
font-stylezfont-weighté    é    TFrU   c             s   s   | ]}t |d  ƒV  qdS )r9   N)rƒ   )rV   rý   r   r   r   rW   q  s    z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c             s   s   | ]}t |d  ƒV  qdS )r   N)r(   )rV   rý   r   r   r   rW   u  s    )r€   r'   r¡   Ztspanr5   c             s   s   | ]}t |d  ƒV  qdS )rÁ   N)rË   )rV   rý   r   r   r   rW   {  s    r¤   )r'   r¡   rf   rg   )4ri   r   rµ   r²   r³   r(   r“   Zset_textr   r   rÈ   Z	get_stylerƒ   rÊ   Z
get_weightr`   Zget_rotation_modeZget_transformZtransform_pointZget_positionrg   rú   Zdeg2radZarrayZsinZcosÚdotZget_harM   r_   r   rt   Ú
setdefaultr   ÚsetÚaddÚordrE   ru   ÚparseÚ
svg_glyphsÚ	svg_rectsrD   r   rÉ   r;   r>   Úsortr<   rü   r6   rJ   ),r2   r™   r'   r¡   r   r   r  r  r  ri   r  r€   r  r‘   r  Z
fontfamilyZ	fontstyler@   rŠ   ZaxZayZ	angle_radZdir_vertZv_offsetZha_mpl_to_svgZfontsetrý   rf   rg   ZdescentZsvg_elementsZused_charactersr#  r$  ZspansZthetextZnew_xZnew_yZmetricsrÌ   Zsame_yZlast_yrï   Zysr   r   r   Ú_draw_text_as_textù  sÌ    









 

zRendererSVG._draw_text_as_textúTeX!c	       	   	   C   s   | j ||||||dd d S )Nr  )r  )r  )	r2   r™   r'   r¡   r   r   r  r  r  r   r   r   Údraw_texŒ  s    zRendererSVG.draw_texFc	       
   
   C   sº   |   |¡}	|	d k	r*| jjddd|	 id | ¡ d k	rL| j dd| ¡ i¡ td dkrr|  ||||||||¡ n|  ||||||||¡ | ¡ d k	r¢| j d¡ |	d k	r¶| j d¡ d S )	NrÐ   z	clip-pathzurl(#%s))r@   rÝ   z
xlink:hrefzsvg.fonttyper¦   )rÀ   ri   rD   rÞ   r   r  r&  rJ   )
r2   r™   r'   r¡   r   r   r  r  r  rà   r   r   r   Ú	draw_text  s    
zRendererSVG.draw_textc             C   s   dS )NTr   )r2   r   r   r   Úflipy¥  s    zRendererSVG.flipyc             C   s   | j | jfS )N)rf   rg   )r2   r   r   r   Úget_canvas_width_height¨  s    z#RendererSVG.get_canvas_width_heightc             C   s   | j  |||¡S )N)r  Úget_text_width_height_descent)r2   r   r   r  r   r   r   r,  «  s    z)RendererSVG.get_text_width_height_descent)Nrd   )N)NNNN)N)N)N)N)N)r'  N)FN)$rN   rO   rP   r4   r~   rz   r‰   r‹   r“   rž   r|   r¹   rº   rÀ   r{   r}   rÒ   rÓ   rÔ   rª   rá   ré   rì   rþ   r  r  r  r  r  r  r&  r(  r)  r*  r+  r,  r   r   r   r   rc   ö   sJ   
%	(-$
 
	

): 
H
 
 

rc   c               @   sB   e Zd ZdddœZdZdd„ Zdd„ Zddd	œd
d„Zdd„ ZdS )ÚFigureCanvasSVGzScalable Vector Graphics)re   Zsvgzrd   c          	   O   sv   t j|ddd\}t|ddƒ}t|tƒs,d}t  |¡r<d}nt |d¡}d}| j||f|Ž}|rh| 	¡  W d Q R X |S )Nr¾   zutf-8)ÚencodingÚnamer5   FT)
r   Úopen_file_cmÚgetattrrZ   rƒ   Zfile_requires_unicoderX   ÚTextIOWrapperÚ
_print_svgÚdetach)r2   r
  ÚargsÚkwargsÚfhr4  Úresultr   r   r   Ú	print_svgµ  s    

zFigureCanvasSVG.print_svgc          
   O   s<   t  |d¡&}tjd|d}|  |¡S Q R X W d Q R X d S )NÚwbr¾   )ÚmodeZfileobj)r   r0  ÚgzipZGzipFiler9  )r2   r
  r5  r6  r7  Z
gzipwriterr   r   r   Ú
print_svgzË  s    zFigureCanvasSVG.print_svgzN)ÚdpiÚbbox_inches_restorec            K   sf   | j  d¡ | j  ¡ \}}|d |d  }}	t| j |||t||	|||ƒ|d}
| j  |
¡ |
 ¡  d S )Ng      R@rd   )r?  )ZfigureZset_dpiZget_size_inchesr
   rc   Zdrawr~   )r2   r
  r7  r>  r?  r6  rf   rg   r¾   r”   Zrendererr   r   r   r3  Ð  s    
zFigureCanvasSVG._print_svgc             C   s   dS )Nre   r   )r2   r   r   r   Úget_default_filetypeÞ  s    z$FigureCanvasSVG.get_default_filetype)	rN   rO   rP   Z	filetypesZ	fixed_dpir9  r=  r3  r@  r   r   r   r   r-  ¯  s   r-  z×<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with matplotlib (https://matplotlib.org/) -->
c               @   s   e Zd ZeZdS )Ú_BackendSVGN)rN   rO   rP   r-  ZFigureCanvasr   r   r   r   rA  í  s   rA  );Úcollectionsr   r  r<  r…   rX   ZloggingÚrer„   Znumpyrú   Z
matplotlibr   r   r   Zmatplotlib.backend_basesr   r   r   r	   Z!matplotlib.backends.backend_mixedr
   Zmatplotlib.colorsr   Zmatplotlib.font_managerr   r   Zmatplotlib.ft2fontr   Zmatplotlib.mathtextr   Zmatplotlib.pathr   r   Zmatplotlib.transformsr   r   r   Z	getLoggerrN   r  Zbackend_versionr   Úcompiler   r   r"   r(   Úobjectr)   r_   r`   r¶   rc   r-  ZFigureManagerSVGrx   ZexportrA  r   r   r   r   Ú<module>   sV   
'
x       @3