U
    \	a                     @   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mZmZm	Z	 d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dlmZmZ d dlmZmZmZmZmZ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( d dl)m*Z* d dl+m,Z, d dlm-Z- d dl.m/Z/m0Z0 e1e2Z3ej4Z5dd Z6e7dZ8dd Z9dd Z:dd Z;G dd dZ<g fddZ=i fddZ>dd d!d"Z?G d#d$ d$eZ@G d%d& d&eZAeZBd'ZCejDG d(d) d)eZEdS )*    )OrderedDictN)BytesIOStringIOTextIOWrapper)Image)_apicbook)_Backend_check_savefig_extra_argsFigureCanvasBaseFigureManagerBaseRendererBase_no_output_draw)MixedModeRenderer)rgb2hex)UTC)findfontget_font)LOAD_NO_HINTINGMathTextParser)Path)_path)Affine2DAffine2DBasec                 C   s(   |  dd} |  dd} |  dd} | S )N&&amp;<&lt;>&gt;replaces r%   C/tmp/pip-unpacked-wheel-wjyw_3jo/matplotlib/backends/backend_svg.pyescape_cdataI   s    r'   z-(?=-)c                 C   s   t | } td| S )Nz- )r'   _escape_xml_commentsubr#   r%   r%   r&   escape_commentS   s    r*   c                 C   s@   |  dd} |  dd} |  dd} |  dd} |  d	d
} | S )Nr   r   'z&apos;"z&quot;r   r   r   r    r!   r#   r%   r%   r&   escape_attribX   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_fmta   s    r3   c                   @   sf   e Zd 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 )	XMLWriterzM
    Parameters
    ----------
    file : writable text file-like object
    c                 C   s6   |j | _t|dr|j| _d| _g | _g | _d| _d S )Nflushr   z@                                                                )write_XMLWriter__writehasattrr5   _XMLWriter__open_XMLWriter__tags_XMLWriter__data_XMLWriter__indentation)selffiler%   r%   r&   __init__p   s    
zXMLWriter.__init__Tc                 C   sP   | j r&|r| d n
| d d| _ | jrLd| j}| t| g | _d S )Nz>
r   r    )r9   r7   r;   joinr'   )r=   indentdatar%   r%   r&   Z__flushy   s    
zXMLWriter.__flushc                 K   s   |    t|}g | _| j| | | jdt| jd   | d|  t||	 D ].\}}|r^t|}t
|}| d||f  q^d| _t| jd S )a&  
        Open a new element.  Attributes can be given as keyword
        arguments, or as a string/string dictionary. The method returns
        an opaque identifier that can be passed to the :meth:`close`
        method, to close all open elements up to and including this one.

        Parameters
        ----------
        tag
            Element tag.
        attrib
            Attribute dictionary.  Alternatively, attributes can be given as
            keyword arguments.

        Returns
        -------
        An element identifier.
        N   z<%sz %s="%s")_XMLWriter__flushr'   r;   r:   appendr7   r<   lensorteditemsr-   r9   )r=   tagattribextrakvr%   r%   r&   start   s    zXMLWriter.startc                 C   s8   |    | | jdt| j  | dt|  dS )z
        Add a comment to the output stream.

        Parameters
        ----------
        comment : str
            Comment text.
        Nz<!-- %s -->
)rE   r7   r<   rG   r:   r*   )r=   commentr%   r%   r&   rP      s    	zXMLWriter.commentc                 C   s   | j | dS )z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r;   rF   )r=   textr%   r%   r&   rC      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rd| _| d dS |r| | jdt	| j   | d|  dS )	a  
        Close the current element (opened by the most recent call to
        :meth:`start`).

        Parameters
        ----------
        tag
            Element tag.  If given, the tag must match the start tag.  If
            omitted, the current element is closed.
        zunbalanced end(%s)zexpected end(%s), got %szunbalanced end()r   z/>
Nz</%s>
)
r:   AssertionErrorr'   popr;   rE   r9   r7   r<   rG   )r=   rJ   rB   r%   r%   r&   end   s     

zXMLWriter.endc                 C   s   t | j|kr|   q dS )z
        Close open elements, up to (and including) the element identified
        by the given identifier.

        Parameters
        ----------
        id
            Element identifier, as returned by the :meth:`start` method.
        N)rG   r:   rU   )r=   idr%   r%   r&   close   s    
zXMLWriter.closec                 K   s.   | j ||f| |r| | | jdd dS )z
        Add an entire element.  This is the same as calling :meth:`start`,
        :meth:`data`, and :meth:`end` in sequence. The *text* argument can be
        omitted.
        F)rB   N)rO   rC   rU   )r=   rJ   rQ   rK   rL   r%   r%   r&   element   s    
zXMLWriter.elementc                 C   s   dS )zFlush the output stream.Nr%   r=   r%   r%   r&   r5      s    zXMLWriter.flush)T)NT)__name__
__module____qualname____doc__r?   rE   rO   rP   rC   rU   rW   rX   r5   r%   r%   r%   r&   r4   i   s   	
!
r4   c              	   C   s   t | rt }| D ]~\}}|dkr2|dks|dks|dkrB|dks|dkrT|dkrTq|dkrnt|trn| }|d	|d
dd |D f  q| S dS )Nscale)rD   )rD   rD   	translate)r   r   rotate)r   matrixz%s(%s) c                 s   s   | ]}t |V  qd S Nr3   ).0r2   r%   r%   r&   	<genexpr>  s     z%generate_transform.<locals>.<genexpr>r@   )rG   r   
isinstancer   Z	to_valuesr6   rA   getvalue)Ztransform_listoutputtypevaluer%   r%   r&   generate_transform   s*     
rl   c                 C   sR   | rNt  }t|  } | D ]*\}}t|}t|}|d||f  q| S dS )Nz%s:%s;r@   )r   rH   rI   r-   r6   rh   )rK   ri   rM   rN   r%   r%   r&   generate_css  s    rm   Zsquarebuttround)Z
projectingrn   ro   c                       sd  e Zd ZdOdd fddZede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dd  ZdPd!d"Zd#d$ Zd%d& ZdQd'd(ZdRd)d*ZdSd+d,Z fd-d.Zd/d0 Zd1d2 Zd3d4 Zd5d6 ZdTd7d8Zd9d: Z d;d< Z!dUd=d>Z"dVd?d@Z#e$dAdBdWdDdEZ%dXdGdHZ&dIdJ Z'dKdL Z(dMdN Z)  Z*S )YRendererSVGNH   metadatac          	   	      s   || _ || _t|| _|| _i | _|| _t | _	t
 | _i | _d| _t
 | _d| _d| _t
 | _t   t | _t|}t|}|t | jjdd| d| d||f dddd	id
| _| | |   d S )Nr   Fsvgz%sptz	0 0 %s %szhttp://www.w3.org/2000/svgz1.1zxmlns:xlinkzhttp://www.w3.org/1999/xlink)widthheightviewBoxxmlnsversionrK   )ru   rv   r4   writer	image_dpi_groupdbasename	itertoolscount_image_counterr   _clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientsZ_fontssuperr?   dict
_glyph_mapr3   r6   	svgPrologrO   	_start_id_write_metadata_write_default_style)	r=   ru   rv   Z	svgwriterr}   r{   rs   Z
str_heightZ	str_width	__class__r%   r&   r?     s<    





zRendererSVG.__init__3.4c                 C   s   t dS )NZSVGr   rY   r%   r%   r&   mathtext_parser:  s    zRendererSVG.mathtext_parserc                 C   s,   |    |   | j| j | j  d S rc   )_write_clips_write_hatchesrz   rW   r   r5   rY   r%   r%   r&   finalize?  s    zRendererSVG.finalizec                    s  |d kri }dddt j dd|}| j d|krF jd|d d |d	d }|d k	rt|trn|g}nt|tjtjfr|	 g}nvt
|rg }|D ]N}t|tr|| qt|tjtjfr||	  qtd
t|qntdt|d||d	< nRd	|krdtd}|rRtjt|}|jtd	 |d	< ntj 	 |d	< d } fdd}|dd }|d k	r||} jdd|id dD ]<}|| d }	|	d k	r||} jd| |	d qdD ]}|| d }
|
d krqt|
tr|
g}
||} d|  |
D ](} d  jd|d  d q: d|  q|dd }|d k	rt|tr|g}||} d  d |D ]} jd|d q d  d |d k	r | |rtdd| d S ) Nzimage/svg+xmlz&http://purl.org/dc/dcmitype/StillImagezMatplotlib vz, https://matplotlib.org/)ZFormatTypeZCreatorZTitletitle)rQ   DatezVInvalid type for Date metadata. Expected iterable of str, date, or datetime, not {!r}.z`Invalid type for Date metadata. Expected str, date, datetime, or iterable of the same, not {!r}./SOURCE_DATE_EPOCH)tzinfoc                    s:   | d k	r| S   d}  j dddddd   d | S )	Nrs   zrdf:RDFz http://purl.org/dc/elements/1.1/zhttp://creativecommons.org/ns#z+http://www.w3.org/1999/02/22-rdf-syntax-ns#)zxmlns:dczxmlns:ccz	xmlns:rdfrK   zcc:Work)rO   )midrz   r%   r&   ensure_metadata{  s    


z4RendererSVG._write_metadata.<locals>.ensure_metadatar   zdc:typezrdf:resourcer   )	r   Zcoveragedatedescriptionr0   
identifierlanguageZrelationsourcezdc:)ZcreatorZcontributorZ	publisherZrightszcc:Agentzdc:titleZKeywordsz
dc:subjectzrdf:Bagzrdf:liz.Unknown metadata key(s) passed to SVG writer: ,)mpl__version__rz   rX   getrg   strdatetimer   	isoformatnpiterablerF   
ValueErrorr0   rj   rA   osgetenvutcfromtimestampintr"   r   todayrT   r   rO   rU   rW   )r=   rs   r   datesdr   r   urikeyinfoZagentsZagentkeywordskeywordr%   r   r&   r   E  s    
















zRendererSVG._write_metadatac                 C   s@   | j }tddd}|d |jddd| d |d d S )	Nro   rn   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})rj   rQ   )rz   rm   rO   rX   rU   )r=   rz   Zdefault_styler%   r%   r&   r     s    
z RendererSVG._write_default_stylec                 C   sb   t jd }|d krtt }t }||d |t|d d||	 d d f S )Nzsvg.hashsaltutf8z%s%s
   )
r   rcParamsr   uuidZuuid4hashlibsha256updateencode	hexdigest)r=   rj   contentZsaltmr%   r%   r&   _make_id  s    
zRendererSVG._make_idc                 C   s   |t  ddd| j S )N      ?              )r   r^   r_   rv   )r=   	transformr%   r%   r&   _make_flip_transform  s      z RendererSVG._make_flip_transformc                 C   s0   t |}t|}|  | }||d |S N      R@)r   r   clearget_size_in_pointsZset_size)r=   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_hatchr   r   r   get_hatch_path)r=   gcrgbFaceZedgedictkeyoid_r%   r%   r&   
_get_hatch  s    zRendererSVG._get_hatchc           
   
   C   s*  t | jsd S d}| j}|d | j D ]\\}}}}|jd|dddt|t|d | j|t |dd	d	|d
d}|d krd}nt
|}|jdddt|d t|d |d t
|t
|ttjd ddd}	|d dk rt|d |	d< |jd|t|	d |d q,|d d S )Nrq   r   patternuserSpaceOnUser.   )rV   patternUnitsr2   yru   rv   r   r   r   FsimplifynonerectrD   )r2   r   ru   rv   fillzhatch.linewidthrn   Zmiter)r   strokestroke-widthr   r      stroke-opacitypath)r   r   )rG   r   rz   rO   valuesr   _convert_pathr   r^   r_   r   rX   r   r   rm   rU   )
r=   Z
HATCH_SIZErz   r   facer   r   	path_datar   Zhatch_styler%   r%   r&   r     sl    

      

zRendererSVG._write_hatchesc           	      C   s  i }|  }| dk	rbd| || |d< |dk	rt|dkr|d dkr|st|d |d< n^|dkrtd|d< nLt|dd d	krt||d< t|dkr|d dkr|st|d |d< |r| dkrt| |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rt|  |d< |S )z=Generate a style string from the GraphicsContext and rgbFace.Nurl(#%s)r      r   r   fill-opacityr   )r   r   r   opacityr   c                 s   s   | ]}t |V  qd S rc   rd   )re   valr%   r%   r&   rf   2  s    z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetr   r   r   ro   r   rn   r   )get_forced_alphar   r   rG   r3   r   r   	get_alphaZ
get_dashesrA   floatZget_linewidthget_rgbZget_joinstyleZget_capstyle_capstyle_d)	r=   r   r   rK   Zforced_alphaoffsetseqZ	linewidthZrgbr%   r%   r&   _get_style_dict  sJ     



zRendererSVG._get_style_dictc                 C   s   t | ||S rc   )rm   r   )r=   r   r   r%   r%   r&   
_get_styleE  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   rV   r   Zboundsrv   r   r   r   )r=   r   Zcliprectclippathclippath_transr   r2   r   wr   clipr   r%   r%   r&   	_get_clipH  s$    
zRendererSVG._get_clipc                 C   s   t | jsd S | j}|d | j D ]\}}|jd|d t |dkrr|\}}| j||dd}|jd|d n0|\}}}	}
|jd	t|t|t|	t|
d
 |d q(|d d S )Nr   clipPathrV      Fr   r   r   r   r2   r   ru   rv   )	rG   r   rz   rO   r   r   rX   r3   rU   )r=   rz   r  r   r  r  r   r2   r   r  r   r%   r%   r&   r   `  s0    

  zRendererSVG._write_clipsc                 C   sP   |r| j jd|d n6| j|dd | j|< | j jdd|| j| f d d S )Ngr	  r   rD   z%s_%d)rz   rO   r|   r   )r=   r$   gidr%   r%   r&   
open_groupw  s    zRendererSVG.open_groupc                 C   s   | j d d S )Nr  )rz   rU   )r=   r$   r%   r%   r&   close_group  s    zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   rY   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 )
Nr         M   L   Q   C   zFascii)ru   rv   r   Zconvert_to_stringdecode)r=   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   r   	clip-patha
xlink:hrefr   )r   rK   )r   r   Zshould_simplifyr   Zget_sketch_paramsr  r  get_urlrz   rO   rX   rU   )r=   r   r   r   r   trans_and_flipr  r   r   rK   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	rd| |d< |jd|d | |}dd| i}dd| jd | jd f}|j||ddD ]Z\}}t |r|dd  \}}t||d< t||d< | |||d< |jd|d q|d d S )Nr   r   Fr   c                 S   s    i | ]\}}| d r||qS )r   )
startswith)re   rM   rN   r%   r%   r&   
<dictcomp>  s    
 z,RendererSVG.draw_markers.<locals>.<dictcomp>r   r   r   )rV   r   r   r   r  r  r   r  #%sr   rq   )r  r   r2   r   r   use)rG   verticesrz   r   r   r^   r   rm   r   r   rI   r   rO   rX   rU   r  r   ru   rv   Ziter_segmentsr3   r  )r=   r   Zmarker_pathZmarker_transr   transr   rz   r   r   r   r   rK   r   r  r  r'  coder2   r   r%   r%   r&   draw_markers  sL    





  
zRendererSVG.draw_markersc                     s  t |dkrt |d jnd}| |||||}|d|  d |d | k }|stt |||||||||	|
|||S | j}g }|d t| |||D ]b\}\}}t	|
 dd}| j||dd	}d
| j|| d|f }|jd||d || q|d | |||||||||	|
|||D ]\}}}}}| |}| }|d k	rf|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	r*|d q*|  jd7  _d S )Nr   	   r      r   r   r   Fr   z	C%x_%x_%sr@   r   )rV   r   r  r  r   r  r  r   r$  )r  r2   r   r   r&  rD   )rG   r'  Z_iter_collection_uses_per_pathr   draw_path_collectionrz   rO   	enumerateZ_iter_collection_raw_pathsr   Z
get_matrixr^   r   r   r   rX   rF   rU   Z_iter_collectionr  r  r3   rv   r  ) r=   r   Zmaster_transformpathsZall_transformsoffsetsZoffsetTransZ
facecolorsZ
edgecolorsZ
linewidthsZ
linestylesZantialiasedsurlsZoffset_positionZlen_pathZuses_per_pathZshould_do_optimizationrz   Z
path_codesir   r   r   r   ZxoZyoZpath_idZgc0r   r   urlrK   r   r%   r&   r-    s    	             
    

          






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krd S | |}||}|d t	dD ]8}	||	 \}
}||	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|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-d.d* |jd'|d/| j
 d(d0d* |jd'|d1| j
 d2d(d3d* |jd'|d4| j
 d2d(d3d* |d+ |  j
d7  _
d S )5NTfilterZcolorAddr	  feCompositeinZSourceGraphicZBackgroundImageZ
arithmetic1)rK   Zin2operatorZk2Zk3ZcolorMatfeColorMatrixrj   ra   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 )rK   r   r   )ZaxisrR   r   r   rD   r
  r   linearGradientzGR%x_%dr   )rV   gradientUnitsx1y1x2y2stop)z
stop-colorzstop-opacity)r   r   r.   zM r   z L rb   z Zr   Z
crispEdges)r   r   r   shape-renderingr   r  r   zurl(#colorMat))r   r   rA  r4  zurl(#GR%x_0))r   r   rA  zurl(#GR%x_1)zurl(#colorAdd))r   r   r4  rA  zurl(#GR%x_2))rz   r   rO   rX   rU   r   Zaverager   r   ranger   r3   rm   r   )r=   r   Zpointscolorsr(  rz   Z	avg_colorr  Ztpointsr2  r<  r=  r>  r?  Zx3Zy3Z
rgba_colorxbZybm1Zb1m2Zb2dpathr%   r%   r&   draw_gouraud_triangle  s     







  

 
z!RendererSVG.draw_gouraud_trianglec           	      C   sn   i }|  |}|d k	r"d| |d< | jjd|d | }t||D ]\}}| |||| qD| jd d S )Nr   r  r  r   )r  rz   rO   frozenziprH  rU   )	r=   r   Ztriangles_arrayZcolors_arrayr   rK   r   Ztricolr%   r%   r&   draw_gouraud_triangles  s    
z"RendererSVG.draw_gouraud_trianglesc                 C   s   dS NTr%   rY   r%   r%   r&   option_scale_image  s    zRendererSVG.option_scale_imagec                 C   s
   | j d S r   )r{   rY   r%   r%   r&   get_image_magnification  s    z#RendererSVG.get_image_magnificationc              	   C   sp  |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jd	 rt }t	
|j|d
d |
p| d| }
dt| d |d< n`| jd krtdd| jt| j}td| t	
|| |
p,d| d| }
||d< |
|d< |d krd| | j }d| | j }| jjdtddd| ffgt|t| j| |  t|t||d n| }|dkrt||d< t d| d| | t  ||dd d| j }td|! fg|d< d|d< | jjdt|t||d  |d k	rV| j"d |	d k	rl| j"d d S )!Nr
  r   r  r  r   r   r  r  zsvg.image_inlineZpng)r0   imagezdata:image/png;base64,
r  zLCannot save image data to filesystem when writing SVG to an in-memory bufferz{}.image{}.pngz$Writing image file for inclusion: %sZIm_rV   r   )r^   )rD   rR   r_   )r   r2   r   ru   rv   rK   r   r   r   r   ra   r   z5image-rendering:crisp-edges;image-rendering:pixelatedr   )ru   rv   rK   )#shaper  rz   rO   Zget_gidr  r   r   r   r   Z	fromarraysaver   rh   base64	b64encoder  r}   r   r0   nextr   _logr   r{   rX   rl   r3   rv   r   r   r^   r_   rI  rU   )r=   r   r2   r   Zimr   r   r  rK   r   r   r3  buffilenamealphaZflippedr%   r%   r&   
draw_image  s    


 
  	
    

zRendererSVG.draw_imagec                 C   s~   | j }|rz|d | D ]F\}\}}| |}| jt|d |dd}|jd||tdgd q|d | j	
| dS )	zn
        Emit definitions for not-yet-defined glyphs, and record them as having
        been defined.
        r   @   Fr   r   )r^   )g      ?)rV   r   r   N)rz   rO   rI   _adjust_char_idr   r   rX   rl   rU   r   r   )r=   glyph_map_newrz   char_idr'  codesr   r%   r%   r&   _update_glyph_map_defs  s"    

   
z"RendererSVG._update_glyph_map_defsc                 C   s   | ddS )Nz%20r   r!   )r=   r^  r%   r%   r&   r\  
  s    zRendererSVG._adjust_char_idc	                  C   s"  | j }	|	| | j}
| j}t| }| }i }|dkrD||d< | rT| n
| d }|dkrtt	||d< ||j
 }t|td||ffd| ffd|| ffgd	}|	jd
|d |sN||}|j|||
dd}|\}}}| | |D ]R\}}}}dd| i}|dkr&t	||d< |dkr<t	||d< |	jd|d qn|dkrl|j|||
dd}n|j|||
dd}|\}}}| | |D ]F\}}}}| |}|	jdtd||ffd|ffgdd| id q|D ]0\}}t||}| j|dd}|	jd|d q|	d
 dS )a]  
        Draw the text by converting them to paths using the textpath module.

        Parameters
        ----------
        s : str
            text to be converted
        prop : `matplotlib.font_manager.FontProperties`
            font property
        ismath : bool
            If True, use mathtext parser. If "TeX", use *usetex* mode.
        #000000r   r   rD   r   r_   r`   r^   r   r   r  r   T)	glyph_mapZreturn_new_glyphs_onlyr  r$  r   r2   r   r&  TeX)r   rK   Fr   r   r  N)rz   rP   r   
_text2pathr   r   r   r   r   r3   Z
FONT_SCALErm   rl   rO   r   Zget_glyphs_with_fontr`  rX   Zget_glyphs_texZget_glyphs_mathtextr\  r   r   rU   ) r=   r   r2   r   r$   r   angleismathmtextrz   rc  Z	text2pathcolorfontsizer   rY  Z
font_scalerK   r   Z_glyphsZ
glyph_infor]  rectsZglyph_idZ	xpositionZ	ypositionr^   r^  Zvertsr_  r   r   r%   r%   r&   _draw_text_as_path  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 i }t	|j
|d< t	|  |d	< t	|  |d
< |  |d< t| d |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 n|	| | j j!"|d|\}}}}}|	j#dt|td||ffd| ffgd  |	#d t$ }|D ]`\}}}}}tt|d |j
|j% |j% d!}|d"krd#}|&|g '|| |f q|( D ]\}} | )  t*d$d% | D dkr,t	| d d }!nd&+d'd( | D }!|d&+d)d( | D |!d*}|	jd+d,+d-d( | D |d q|	,d |D ]8\}}}}|	jd.t|t| d t|t|d/ q|	,d d S )0Nra  r   r   rD   r   r   )flagsfont-familyfont-weightzfont-stretch
font-styleZpx	font-sizer   r   anchorrO   rU   Zmiddle)leftrightcenterztext-anchorr2   r   zrotate(%s, %s, %s)r   rQ   r   r_   r`   rq   r  rb  )rq  rn  rp  ro         c                 S   s   h | ]\}}}|qS r%   r%   )re   r2   r   tr%   r%   r&   	<setcomp>  s     z1RendererSVG._draw_text_as_text.<locals>.<setcomp>rb   c                 s   s   | ]}t |d  V  qdS )rD   N)r   re   cr%   r%   r&   rf     s     z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c                 s   s   | ]}t |d  V  qdS )r   Nrd   rz  r%   r%   r&   rf     s     )r   r2   r   Ztspanr@   c                 s   s   | ]}t |d  V  qdS )r
  N)chrrz  r%   r%   r&   rf     s     r   r  )-rz   r   r   r   r   r3   r   Zset_textr   r   Zfamily_nameZ
get_weightlowerZget_stretchZ	get_styleget_sizerm   Zget_rotation_modeZget_transformr   Zget_unitless_positionrv   r   Zdeg2radarraysincosdotZget_harX   rl   rP   re  r   parserO   r   Z
style_name
setdefaultrF   rI   sortrG   rA   rU   )"r=   r   r2   r   r$   r   rf  rg  rh  rz   ri  r   rY  r   rK   r   ZaxZayZ	angle_radZdir_vertZv_offsetZha_mpl_to_svgru   rv   ZdescentZglyphsrk  Zspansrj  ZthetextZnew_xZnew_ycharsZysr%   r%   r&   _draw_text_as_text^  s    















zRendererSVG._draw_text_as_textz3.3rg  TeX!c	           	   	   C   s   | j ||||||dd d S )Nrd  )rg  )rl  )	r=   r   r2   r   r$   r   rf  rg  rh  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jd dkrt| |||||||| n| |||||||| | d k	r| jd |	d k	r| jd d S )	Nr  r  r   r   r  r  zsvg.fonttyper   )	r  rz   rO   r  r   r   rl  r  rU   )
r=   r   r2   r   r$   r   rf  rg  rh  r   r%   r%   r&   	draw_text  s    
 
zRendererSVG.draw_textc                 C   s   dS rM  r%   rY   r%   r%   r&   flipy  s    zRendererSVG.flipyc                 C   s   | j | jfS rc   )ru   rv   rY   r%   r%   r&   get_canvas_width_height  s    z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S rc   )re  get_text_width_height_descent)r=   r$   r   rg  r%   r%   r&   r    s    z)RendererSVG.get_text_width_height_descent)Nrq   )N)NNNN)N)N)N)N)N)r  N)FN)+rZ   r[   r\   r?   r   
deprecatedpropertyr   r   r   r   r   r   r   r   r   r   r  r  r   r  r  r  r   r!  r*  r-  rH  rL  rN  rO  rZ  r`  r\  rl  r  delete_parameterr  r  r  r  r  __classcell__r%   r%   r   r&   rp     sX   "u		,-
  


 
,: 
P
Q
{

rp   c                       sd   e Zd ZdddZdZdd Zdd Zee	dd	d
d
d
dddZ
dd Z fddZ  ZS )FigureCanvasSVGzScalable Vector Graphics)rt   Zsvgzrq   c              	   O   st   t j|dddZ}t|dd}t|ts,d}t |r<d}nt|d}d}| j||f| |rf|  W 5 Q R X dS )	a  
        Parameters
        ----------
        filename : str or path-like or file-like
            Output target; if a string, a file will be opened for writing.

        metadata : dict[str, Any], optional
            Metadata in the SVG file defined as key-value pairs of strings,
            datetimes, or lists of strings, e.g., ``{'Creator': 'My software',
            'Contributor': ['Me', 'My Friend'], 'Title': 'Awesome'}``.

            The standard keys and their value types are:

            * *str*: ``'Coverage'``, ``'Description'``, ``'Format'``,
              ``'Identifier'``, ``'Language'``, ``'Relation'``, ``'Source'``,
              ``'Title'``, and ``'Type'``.
            * *str* or *list of str*: ``'Contributor'``, ``'Creator'``,
              ``'Keywords'``, ``'Publisher'``, and ``'Rights'``.
            * *str*, *date*, *datetime*, or *tuple* of same: ``'Date'``. If a
              non-*str*, then it will be formatted as ISO 8601.

            Values have been predefined for ``'Creator'``, ``'Date'``,
            ``'Format'``, and ``'Type'``. They can be removed by setting them
            to `None`.

            Information is encoded as `Dublin Core Metadata`__.

            .. _DC: https://www.dublincore.org/specifications/dublin-core/

            __ DC_
        r  zutf-8)encodingnamer@   FTN)	r   open_file_cmgetattrrg   r   Zfile_requires_unicoder   
_print_svgdetach)r=   rX  argskwargsfhr  r%   r%   r&   	print_svg	  s     


zFigureCanvasSVG.print_svgc                 O   sT   t |d>}tjd|d$}| |W  5 Q R  W  5 Q R  S Q R X W 5 Q R X d S )Nwbr  )modefileobj)r   r  gzipGzipFiler  )r=   rX  r  r  r  Z
gzipwriterr%   r%   r&   
print_svgz<  s
    zFigureCanvasSVG.print_svgzr   dpiN)r  bbox_inches_restorers   c                C   s|   |d kr| j  }| j d | j  \}}|d |d  }}	t| j |||t||	||||d|d}
| j |
 |
  d S )Nrq   rr   )r  )figureZget_dpiZset_dpiZget_size_inchesr   rp   drawr   )r=   rX  r  r  r  rs   ru   rv   r  r   Zrendererr%   r%   r&   r  A  s    
   zFigureCanvasSVG._print_svgc                 C   s   dS )Nrt   r%   rY   r%   r%   r&   get_default_filetypeS  s    z$FigureCanvasSVG.get_default_filetypec                    s   t | j t  S rc   )r   r  r   r  rY   r   r%   r&   r  V  s    
zFigureCanvasSVG.draw)rZ   r[   r\   	filetypesZ	fixed_dpir  r  r
   r   r  r  r  r  r  r%   r%   r   r&   r    s   3
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">
c                   @   s   e Zd ZeZdS )_BackendSVGN)rZ   r[   r\   r  ZFigureCanvasr%   r%   r%   r&   r  e  s   r  )Fcollectionsr   rS  r   r  r   ior   r   r   r~   loggingr   rer   Znumpyr   ZPILr   Z
matplotlibr   r   r   Zmatplotlib.backend_basesr	   r
   r   r   r   r   Z!matplotlib.backends.backend_mixedr   Zmatplotlib.colorsr   Zmatplotlib.datesr   Zmatplotlib.font_managerr   r   Zmatplotlib.ft2fontr   Zmatplotlib.mathtextr   Zmatplotlib.pathr   r   Zmatplotlib.transformsr   r   	getLoggerrZ   rV  r   Zbackend_versionr'   compiler(   r*   r-   r3   r4   rl   rm   r   rp   r  ZFigureManagerSVGr   exportr  r%   r%   r%   r&   <module>   sb    
(
	        sX