o
    :a                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dl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mZ d dl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$ d d
l%m&Z& d dlm'Z' d dl(m)Z)m*Z* e	+e,Z-ej.Z/dd Z0e1dZ2dd Z3dd Z4dd Z5dd Z6G dd dZ7g fddZ8i fddZ9ddd d!Z:G d"d# d#eZ;G d$d% d%eZ<eZ=d&Z>ej?G d'd( d(eZ@dS ))    N)BytesIOStringIO)Image)_apicbookfont_manager)_Backend_check_savefig_extra_argsFigureCanvasBaseFigureManagerBaseRendererBase)MixedModeRenderer)rgb2hex)UTCMathTextParser)Path)_path)Affine2DAffine2DBasec                 C   s(   |  dd} |  dd} |  dd} | S )N&&amp;<&lt;>&gt;replaces r    A/usr/lib/python3/dist-packages/matplotlib/backends/backend_svg.pyescape_cdataG   s   r"   z-(?=-)c                 C   s   t | } td| S )Nz- )r"   _escape_xml_commentsubr   r    r    r!   escape_commentQ   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_attribV   s   r(   c                 C   s@   d| vrdt |  d S d| vrdt |  d S dt|  d S )Nr'   r&   )r"   r(   r   r    r    r!   _quote_escape_attrib_   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_fmte   s   r/   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hasattrr1   _XMLWriter__open_XMLWriter__tags_XMLWriter__data_XMLWriter__indentation)selffiler    r    r!   __init__t   s   

zXMLWriter.__init__Tc                 C   sT   | j r|r| d n| d d| _ | jr(d| j}| t| g | _d S d S )Nz>
r   r    )r5   r3   r7   joinr"   )r9   indentdatar    r    r!   Z__flush}   s   

zXMLWriter.__flushc                 K   s   |    t|}g | _| j| | | jdt| jd   | d|  i || D ]\}}|rFt|}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"   r7   r6   appendr3   r8   lenitemsr)   r5   )r9   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 -->
)rA   r3   r8   rC   r6   r%   )r9   commentr    r    r!   rK      s   	zXMLWriter.commentc                 C   s   | j | dS )z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r7   rB   )r9   textr    r    r!   r?      s   	zXMLWriter.dataNc                 C   s   |r | j sJ d| t|| j d ksJ d| j d |f n| j s'J d| j  }| jr5| | n| jrBd| _| d dS |rQ| | 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>
)	r6   r"   popr7   rA   r5   r3   r8   rC   )r9   rE   r>   r    r    r!   end   s    

zXMLWriter.endc                 C   s,   t | j|kr|   t | j|ksdS 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)rC   r6   rO   )r9   idr    r    r!   close   s   
zXMLWriter.closec                 K   s2   | j ||fi | |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)r>   N)rJ   r?   rO   )r9   rE   rL   rF   rG   r    r    r!   element   s   
zXMLWriter.elementc                 C      dS )zFlush the output stream.Nr    r9   r    r    r!   r1         zXMLWriter.flush)TNT)__name__
__module____qualname____doc__r;   rA   rJ   rK   r?   rO   rQ   rR   r1   r    r    r    r!   r0   m   s    
	!
r0   c              	   C   s   t | rMt }| D ]?\}}|dkr|dks)|dks)|dkr!|dks)|dkr*|dkr*q	|dkr7t|tr7| }|d	|d
dd |D f  q	| S dS )Nscale)r@   )r@   r@   	translate)r   r   rotate)r   matrixz%s(%s) c                 s       | ]}t |V  qd S Nr/   ).0r.   r    r    r!   	<genexpr>  s    z%generate_transform.<locals>.<genexpr>r<   )rC   r   
isinstancer   Z	to_valuesr2   r=   getvalue)Ztransform_listoutputtypevaluer    r    r!   generate_transform   s(   
rj   c                 C   s   d dd |  D S )Nz; c                 s   s"    | ]\}}| d | V  qdS )z: Nr    rc   rH   rI   r    r    r!   rd     s     zgenerate_css.<locals>.<genexpr>)r=   rD   rF   r    r    r!   generate_css  s   rm   Zsquarebuttround)Z
projectingrn   ro   c                       sb  e Zd ZdMd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dNd!d"Zd#d$ Zd%d& Z		dOd'd(ZdNd)d*Z	dNd+d,Z fd-d.Zd/d0 Zd1d2 Zd3d4 Zd5d6 ZdNd7d8Zd9d: Z d;d< Z!dNd=d>Z"dNd?d@Z#ddAdBdCZ$dPdEdFZ%dGdH Z&dIdJ Z'dKdL Z(  Z)S )QRendererSVGNH   )metadatac          	   	      s   || _ || _t|| _|| _|d u rt|dd}t|tsd}|| _i | _	t
 | _i | _i | _d| _i | _d| _d| _t   t | _t|}t|}|t | jjdd| d| d||f dd	d
did| _| | |   d S )Nnamer<   r   F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versionrF   )ru   rv   r0   writer	image_dpigetattrre   strbasename_groupd	itertoolscount_image_counter_clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientssuperr;   dict
_glyph_mapr/   r2   	svgPrologrJ   	_start_id_write_metadata_write_default_style)	r9   ru   rv   Z	svgwriterr|   ry   rr   Z
str_heightZ	str_width	__class__r    r!   r;     sB   






zRendererSVG.__init__3.4c                 C   s   t dS )NZSVGr   rT   r    r    r!   mathtext_parser:  s   zRendererSVG.mathtext_parserc                 C   s,   |    |   | j| j | j  d S ra   )_write_clips_write_hatchesrx   rQ   r   r1   rT   r    r    r!   finalize?  s   zRendererSVG.finalizec                    s  |d u ri }dddt j dd|}| j d|v r# jd|d d |d	d }|d urt|tr6|g}nIt|tjtjfrE|	 g}n:t
|rvg }|D ]&}t|tr[|| qNt|tjtjfrl||	  qNtd
t|n	tdt|d||d	< n'd	|vrtd}|rtjt|}|jtd	 |d	< n	tj 	 |d	< d } fdd}|dd }|d ur||} jdd|id dD ]}|| d }	|	d ur||} jd| |	d qdD ]C}|| d }
|
d u rqt|
tr|
g}
||} d|  |
D ]} d  jd|d  d q d|  q|dd }|d urkt|trF|g}||} d  d |D ]
} jd|d qV d  d |d uru | |rt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)rL   Z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)Ztzinfoc                    s:   | d ur| S   d}  j dddddd   d | S )	Nrr   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:rdfrl   zcc:Work)rJ   )midrx   r    r!   ensure_metadata{  s   


z4RendererSVG._write_metadata.<locals>.ensure_metadatar   zdc:typezrdf:resourcerl   )	r   Zcoveragedatedescriptionr,   Z
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__rx   rR   getre   r{   datetimer   Z	isoformatnpiterablerB   
ValueErrorr,   rh   r=   osgetenvZutcfromtimestampintr   r   ZtodayrN   r   rJ   rO   rQ   )r9   rr   r   Zdatesdr   r   Z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})rh   rL   )rx   rm   rJ   rR   rO   )r9   rx   Zdefault_styler    r    r!   r     s   
z RendererSVG._write_default_stylec                 C   sb   t jd }|d u rtt }t }||d |t|d d||	 d d f S )Nzsvg.hashsaltutf8z%s%s
   )
r   rcParamsr{   uuidZuuid4hashlibZsha256updateencodeZ	hexdigest)r9   rh   Z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   )r9   	transformr    r    r!   _make_flip_transform  s
   
z RendererSVG._make_flip_transformc                 C   s4   t |}t |}|  | }||d |S N      R@)fmZfindfontZget_fontclearget_size_in_pointsZset_size)r9   propfnamefontsizer    r    r!   	_get_font  s   

zRendererSVG._get_fontc                 C   s~   |durt |}| }|durt |}| ||f}| j|}|du r9| d|}| ||f|f| j|< |S |\}}|S )z,
        Create a new hatch pattern
        Nh)tupleZget_hatch_color	get_hatchr   r   r   get_hatch_path)r9   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 ]w\\}}}}|jd|dddt|t|d | j|t |dd	d	|d
d}|d u rHd}nt
|}|jdddt|d t|d |d t
|t
|ttjd ddd}	|d dk r~t|d |	d< |jd|t|	d |d q|d d S )Nrq   r   patternuserSpaceOnUser*   )rP   ZpatternUnitsr.   yru   rv   r   r   r   Fsimplifynonerectr@   )r.   r   ru   rv   fillzhatch.linewidthrn   Zmiter)r   strokestroke-widthr   r      stroke-opacitypath)r   r   )rC   r   rx   rJ   valuesr{   _convert_pathr   r[   r\   r   rR   r   r   rm   rO   )
r9   Z
HATCH_SIZErx   r   Zfacer   r   	path_datar   Zhatch_styler    r    r!   r     sV   



zRendererSVG._write_hatchesc           	      C   s  i }|  }| dur1d| || |d< |dur0t|dkr0|d dkr0|s0t|d |d< n/|du r:d|d< n&t|dd d	krJt||d< t|dkr`|d dkr`|s`t|d |d< |rp| dkrpt| |d
< | \}}|durd	dd |D |d< tt
||d< | }|r| }t||d< |s|d dkrt|d |d< |dkrt||d< | dkr| |d< | dkrt|  |d< |S )z=Generate a style string from the GraphicsContext and rgbFace.Nzurl(#%s)r      r   r   fill-opacityr   )r   r   r   opacityr   c                 s   r`   ra   rb   )rc   valr    r    r!   rd   2  s    
z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetr   r   r   ro   r   rn   r   )get_forced_alphar   r   rC   r/   r   r   	get_alphaZ
get_dashesr=   floatZget_linewidthget_rgbZget_joinstyleZget_capstyle_capstyle_d)	r9   r   r   rF   Zforced_alphaoffsetseqZ	linewidthZrgbr    r    r!   _get_style_dict  sL    

zRendererSVG._get_style_dictc                 C   s   t | ||S ra   )rm   r   )r9   r   r   r    r    r!   
_get_styleE  s   zRendererSVG._get_stylec                 C   s   |  }| \}}|d ur| |}t|t|f}n|d ur5|j\}}}}	| j||	  }||||	f}ni S | j|}
|
d u r]| 	d|}|d urU||f|f| j|< n||f| j|< n|
\}
}dd| diS )Npz	clip-pathzurl(#))
Zget_clip_rectangleZget_clip_pathr   rP   r{   Zboundsrv   r   r   r   )r9   r   Zcliprectclippathclippath_transr   r.   r   wr   clipr   r    r    r!   _get_clip_attrsH  s$   
zRendererSVG._get_clip_attrsc                 C   s   t | jsd S | j}|d | j D ]B\}}|jd|d t |dkr9|\}}| j||dd}|jd|d n|\}}}	}
|jd	t|t|t|	t|
d
 |d q|d d S )Nr   ZclipPathrP      Fr   r   r   r   r.   r   ru   rv   )	rC   r   rx   rJ   r   r   rR   r/   rO   )r9   rx   r   r   r   r   r   r.   r   r   r   r    r    r!   r   _  s,   

zRendererSVG._write_clipsc                 C   sR   |r| j jd|d d S | j|dd | j|< | j jdd|| j| f d d S )Ngr   r   r@   z%s_%d)rx   rJ   r}   r   )r9   r   gidr    r    r!   
open_groupv  s   "zRendererSVG.open_groupc                 C   s   | j d d S )Nr   )rx   rO   )r9   r   r    r    r!   close_group~     zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   rT   r    r    r!   option_image_nocomposite     z$RendererSVG.option_image_nocompositec              
   C   s<   |rdd| j | jf}nd }t|||||dg dddS )Nr      )   M   L   Q   C   zFascii)ru   rv   r   Zconvert_to_stringdecode)r9   r   r   r   r   sketchr    r    r!   r     s   zRendererSVG._convert_pathc           	      C   s   |  |}|d u o| d u }|jo|}| j||||| d}| d ur1| jdd| i | jjdd|i| 	|d| 
||i | d urU| jd d S d S )N)r   r   r  a
xlink:hrefr   r   r   )r   )r   r   Zshould_simplifyr   Zget_sketch_paramsget_urlrx   rJ   rR   r   r   rO   )	r9   r   r   r   r   trans_and_flipr   r   r   r    r    r!   	draw_path  s   


zRendererSVG.draw_pathc                 C   sj  t |jsd S | j}| j||t dd dd}| ||}	|t|	f}
| j	|
}tdd |	
 D }	|d u rX| d|
}|d |jd	|||	d
 |d || j|
< |jdi | | | |}dd| i}dd| jd | jd f}|j||ddD ]+\}}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   )
startswithrk   r    r    r!   
<dictcomp>  s    z,RendererSVG.draw_markers.<locals>.<dictcomp>r   r   r   )rP   r   r   r   r  #%sr   rq   )r   r   r.   r   r   userl   r   )rC   verticesrx   r   r   r[   r   rm   r   r   rD   r   rJ   rR   rO   r   r   ru   rv   Ziter_segmentsr/   r   )r9   r   Zmarker_pathZmarker_transr   transr   rx   r   r   r   r   r  rF   r   r  coder.   r   r    r    r!   draw_markers  sB   




zRendererSVG.draw_markersc                     s  t |dkrt |d jnd}| |||||}|d|  d |d | k }|s:t |||||||||	|
|||S | j}g }|d t| |||D ]1\}\}}t	|
 dd}| j||dd	}d
| j|| d|f }|jd||d || qM|d | |||||||||	|
|||D ]R\}}}}}| }|d ur|jdd|id | |}|r|jdi | d| t|t| j| | ||d}|jd|d |r|d |d ur|d q|  jd7  _d S )Nr   	   r      r   r   r   Fr   z	C%x_%x_%sr<   r   )rP   r   r  r  rl   r   r  )r  r.   r   r   r  r@   r  )rC   r  Z_iter_collection_uses_per_pathr   draw_path_collectionrx   rJ   	enumerateZ_iter_collection_raw_pathsr   Z
get_matrixr[   r   r   r   rR   rB   rO   Z_iter_collectionr  r   r/   rv   r   ) r9   r   Zmaster_transformpathsZall_transformsZoffsetsZoffsetTransZ
facecolorsZ
edgecolorsZ
linewidthsZ
linestylesZantialiasedsZurlsZoffset_positionZlen_pathZuses_per_pathZshould_do_optimizationrx   Z
path_codesir   r   r   r   ZxoZyoZpath_idZgc0r   url
clip_attrsrF   r   r    r!   r    sd   	








z RendererSVG.draw_path_collectionc              
   C   s  | j }| js8d| _|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rGd S | |}||}|d t	dD ]}	||	 \}
}||	d d  \}}||	d d  \}}||	 }||kr|}|}n1||kr|
}|}n(|| ||  }|||  }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 qZ|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   ZfeCompositeinZSourceGraphicZBackgroundImageZ
arithmetic1)rF   Zin2operatorZk2Zk3ZcolorMatZfeColorMatrixrh   r^   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 )rF   r   r   )ZaxisrM   r   r   r@   r   r   ZlinearGradientzGR%x_%dr   )rP   ZgradientUnitsx1y1x2y2stop)z
stop-colorzstop-opacity)r   r   r*   zM r   z L r_   z Zr   Z
crispEdges)r   r   r   shape-renderingrl   r   r   zurl(#colorMat))r   r   r.  r%  zurl(#GR%x_0))r   r   r.  zurl(#GR%x_1)zurl(#colorAdd))r   r   r%  r.  zurl(#GR%x_2))rx   r   rJ   rR   rO   r   Zaverager   r   ranger   r/   rm   r   )r9   r   ZpointsZcolorsr  rx   Z	avg_colorr  Ztpointsr"  r)  r*  r+  r,  Zx3Zy3Z
rgba_colorxbZybZm1Zb1Zm2Zb2Zdpathr    r    r!   draw_gouraud_triangle  s   







 
z!RendererSVG.draw_gouraud_trianglec                 C   sT   | j jdi | | | }t||D ]\}}| |||| q| j d d S )Nr   r  )rx   rJ   r   frozenzipr1  rO   )r9   r   Ztriangles_arrayZcolors_arrayr   Ztricolr    r    r!   draw_gouraud_triangles  s
   z"RendererSVG.draw_gouraud_trianglesc                 C   rS   rV   r    rT   r    r    r!   option_scale_image  rU   zRendererSVG.option_scale_imagec                 C   s
   | j d S r   )ry   rT   r    r    r!   get_image_magnification  s   
z#RendererSVG.get_image_magnificationc              	   C   s`  |j d d \}}|dks|dkrd S | |}|r#| jjdi | | }	|	d ur5| jjdd|	id i }
| }tjd rft }t	
|j|dd	 |pV| d
| }dt| d |
d< n/| jd u rotdd| jt| j}td| t	
|| |pd| d
| }||
d< ||
d< |d u rd| | j }d| | j }| jjd
tddd| ffgt|t| j| |  t|t||
d nH| }|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 ur#| j"d |r.| j"d d S d S ) Nr   r   r   r  r  rl   zsvg.image_inlineZpng)r,   Z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_rP   r   )r[   )r@   rM   r\   )r   r.   r   ru   rv   rF   r   r   r   r   r^   r   z5image-rendering:crisp-edges;image-rendering:pixelatedr   )ru   rv   rF   r  )#shaper   rx   rJ   r  Zget_gidr   r   r   r   Z	fromarrayZsaver   rf   base64Z	b64encoder  r|   r   r,   nextr   _logr   ry   rR   rj   r/   rv   r   r   r[   r\   r2  rO   )r9   r   r.   r   Zimr   r   r   r$  r#  rF   r   buffilenamealphaZflippedr    r    r!   
draw_image  s   


	

zRendererSVG.draw_imagec                 C   s   | j }|r?|d | D ]#\}\}}| |}| jt|d |dd}|jd||tdgd q|d | j	
| dS dS )	zn
        Emit definitions for not-yet-defined glyphs, and record them as having
        been defined.
        r   @   Fr   r   )r[   )g      ?)rP   r   r   N)rx   rJ   rD   _adjust_char_idr   r   rR   rj   rO   r   r   )r9   glyph_map_newrx   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   )r9   rC  r    r    r!   rA    s   zRendererSVG._adjust_char_idc	                  C   s  | j }	|	| | j}
| j}t| }| }i }|dkr"||d< | r*| n| d }|dkr:t	||d< ||j
 }t|td||ffd| ffd|| ffgd	}|	jd
|d |s||}|j|||
dd}|\}}}| | |D ]'\}}}}dd| i}|dkrt	||d< |dkrt	||d< |	jd|d q{n`|dkr|j|||
dd}n	|j|||
dd}|\}}}| | |D ]"\}}}}| |}|	jdtd||ffd|ffgdd| id q|D ]\}}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   r@   r   r\   r]   r[   r   r   r   rl   T)	glyph_mapZreturn_new_glyphs_onlyr  r  r   r.   r   r  TeX)r   rF   Fr   r   r   N)rx   rK   r   
_text2pathr   r   r   r   r   r/   Z
FONT_SCALErm   rj   rJ   r   Zget_glyphs_with_fontrE  rR   Zget_glyphs_texZget_glyphs_mathtextrA  r   r   rO   ) r9   r   r.   r   r   r   angleismathmtextrx   rH  Z	text2pathcolorfontsizer   r>  Z
font_scalerF   r   Z_glyphsZ
glyph_inforB  rectsZglyph_idZ	xpositionZ	ypositionr[   rC  ZvertsrD  r   r   r    r    r!   _draw_text_as_path  sx   






	





zRendererSVG._draw_text_as_pathc	           %      C   s  | j }	t| }
i }|
dkr|
|d< | r| n| d }|dkr+t||d< |s+i }g }| dkr?||  | dkrL||  t	j
|  }|dkr]||  |t|  d| d	 g d
||d< | dkr| |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 d S td||ffd| ffg|d< |	jd||d d S |	 | | j!j"#|d|\}}}}}|	j$dt|td||ffd| ffgd |	$d i }|D ]l\}}}} }!t	%|}"g }|"j&dkrw||"j& |"j'dkr||"j' |"j(dkr||"j(  |t| d|"j)g dd
|i}|"j*dkr|"j*|d< t|}|dkrd }|+|g | |! |f q]|, D ]F\}}#|#-  t.d!d" |#D dkrt/|#d	 d }$n
d
d#d$ |#D }$|d
d%d$ |#D |$d&}|	jd'd(d)d$ |#D |d q|	0d |D ]\}}}}|	jd*t|t| d t|t|d+ q|	0d d S ),NrF  r   r   r@   r   Znormali  Zpxr   r_   r   zfont-stretchr   ZanchorrJ   rO   Zmiddle)leftrightcenterztext-anchorr.   r   zrotate(%s, %s, %s)r   rL   rl   r\   r]   rq   r   rG         c                 S   s   h | ]\}}}|qS r    r    )rc   r.   r   tr    r    r!   	<setcomp>  s    z1RendererSVG._draw_text_as_text.<locals>.<setcomp>c                 s       | ]	}t |d  V  qdS )r@   N)r{   rc   cr    r    r!   rd         z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c                 s   rY  )r   Nrb   rZ  r    r    r!   rd     r\  )r   r.   r   Ztspanr<   c                 s   rY  )r   N)chrrZ  r    r    r!   rd     r\  r   r   )1rx   r   r   r   r   r/   Z	get_stylerB   Zget_variantr   Zweight_dictZ
get_weightextendZget_sizeZ
get_familyr=   Zget_stretchrm   Zget_rotation_modeZget_transformr   Zget_unitless_positionrv   r   Zdeg2radZarrayZsinZcosdotZget_harR   rj   rK   rJ  r   parserJ   ZttfFontPropertyr   Zvariantweightrs   Zstretch
setdefaultrD   sortrC   r{   rO   )%r9   r   r.   r   r   r   rK  rL  rM  rx   rN  r   r>  rF   Z
font_partsra  r   ZaxZayZ	angle_radZdir_vertZv_offsetZha_mpl_to_svgru   rv   ZdescentZglyphsrP  Zspansr   rO  ZthetextZnew_xZnew_yentrycharsZysr    r    r!   _draw_text_as_textJ  s   















zRendererSVG._draw_text_as_text)rM  c             	   C   s   | j ||||||dd d S )NrI  )rL  )rQ  )r9   r   r.   r   r   r   rK  rM  r    r    r!   draw_tex  s   zRendererSVG.draw_texFc	           
   
   C   s   |  |}	|	r| jjdi |	 | d ur!| jdd| i tjd dkr5| |||||||| n| |||||||| | d urM| jd |	rW| jd d S d S )Nr   r  r  zsvg.fonttyper   r  )	r   rx   rJ   r  r   r   rQ  rf  rO   )
r9   r   r.   r   r   r   rK  rL  rM  r$  r    r    r!   	draw_text  s   
zRendererSVG.draw_textc                 C   rS   rV   r    rT   r    r    r!   flipy  rU   zRendererSVG.flipyc                 C   s   | j | jfS ra   )ru   rv   rT   r    r    r!   get_canvas_width_height  r  z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S ra   )rJ  get_text_width_height_descent)r9   r   r   rL  r    r    r!   rk    r  z)RendererSVG.get_text_width_height_descent)Nrq   ra   )NNNN)FN)*rW   rX   rY   r;   r   Z
deprecatedpropertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r  r  r1  r5  r6  r7  r?  rE  rA  rQ  rf  rg  rh  ri  rj  rk  __classcell__r    r    r   r!   rp     sZ    &u		,-




': 
O

Q 
rp   c                       st   e Zd ZdddZdZeeddedddddd	d
dZedddd Z	dd Z
 fddZ  ZS )FigureCanvasSVGzScalable Vector Graphics)rt   Zsvgzrq   r   dpiz3.5argsN)ro  bbox_inches_restorerr   c                G   s   t j|dddP}t |std|}|du r| j }| jd | j \}}|d |d }	}
t	| j|||t
|	|
|||d|d}| j| |  W d   dS 1 s[w   Y  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)encodingNrq   )ry   rr   )rq  )r   open_file_cmZfile_requires_unicodecodecs	getwriterfigureZget_dpiZset_dpiZget_size_inchesr   rp   drawr   )r9   r=  ro  rq  rr   rp  fhru   rv   r   r   Zrendererr    r    r!   	print_svg  s    $



"zFigureCanvasSVG.print_svgc              	   O   s   t |d0}tjd|d}| j|fi |W  d    W  d    S 1 s)w   Y  W d    d S 1 s9w   Y  d S )Nwbr   )modeZfileobj)r   rs  gzipZGzipFilery  )r9   r=  rp  kwargsrx  Z
gzipwriterr    r    r!   
print_svgz8  s   RzFigureCanvasSVG.print_svgzc                 C   rS   )Nrt   r    rT   r    r    r!   get_default_filetype>  s   z$FigureCanvasSVG.get_default_filetypec                    s   | j   t  S ra   )rv  Zdraw_without_renderingr   rw  rT   r   r    r!   rw  A  s   

zFigureCanvasSVG.draw)rW   rX   rY   Z	filetypesZ	fixed_dpir	   r   Zdelete_parameterry  r~  r  rw  rm  r    r    r   r!   rn    s    


0
rn  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)rW   rX   rY   rn  ZFigureCanvasr    r    r    r!   r  P  s    r  )Ar9  rt  r   r|  r   ior   r   r~   Zloggingr   rer   Znumpyr   ZPILr   Z
matplotlibr   r   r   r   r   Zmatplotlib.backend_basesr   r	   r
   r   r   Z!matplotlib.backends.backend_mixedr   Zmatplotlib.colorsr   Zmatplotlib.datesr   Zmatplotlib.mathtextr   Zmatplotlib.pathr   r   Zmatplotlib.transformsr   r   Z	getLoggerrW   r;  r   Zbackend_versionr"   compiler#   r%   r(   r)   r/   r0   rj   rm   r   rp   rn  ZFigureManagerSVGr   Zexportr  r    r    r    r!   <module>   sb    
(
	        sG