a
    ض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    o/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-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r0d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   sP   | j r&|r| d n
| d d| _ | jrLd| j}| t| g | _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 ].\}}|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"   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sNJ d| j d |f n| j sNJ 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>
)	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|   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)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   s   dS )zFlush the output stream.Nr    r9   r    r    r!   r1      s    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 | 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)r@   )r@   r@   	translate)r   r   rotate)r   matrixz%s(%s) c                 s   s   | ]}t |V  qd S Nr/   ).0r.   r    r    r!   	<genexpr>      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(    
rg   c                 C   s   d dd |  D S )Nz; c                 s   s    | ]\}}| d | V  qdS )z: Nr    r_   rH   rI   r    r    r!   r`     ra   zgenerate_css.<locals>.<genexpr>)r=   rD   rF   r    r    r!   generate_css  s    rj   Zsquarebuttround)Z
projectingrk   rl   c                       s\  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dPd)d*ZdQd+d,Z fd-d.Zd/d0 Zd1d2 Zd3d4 Zd5d6 ZdRd7d8Zd9d: Z d;d< Z!dSd=d>Z"dTd?d@Z#ddAdBdCZ$dUdEdFZ%dGdH Z&dIdJ Z'dKdL Z(  Z)S )V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heightviewBoxxmlnsversionrF   )rr   rs   r0   writer	image_dpigetattrrb   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   rr   rs   Z	svgwriterr{   rx   ro   Z
str_heightZ	str_width	__class__r    r!   r;     sB    






zRendererSVG.__init__3.4c                 C   s   t dS )NZSVGr   rS   r    r    r!   mathtext_parser:  s    zRendererSVG.mathtext_parserc                 C   s,   |    |   | j| j | j  d S r]   )_write_clips_write_hatchesrw   rQ   r   r1   rS   r    r    r!   finalize?  s    zRendererSVG.finalizec                    s  |d u ri }dddt j dd|}| j d|v rF jd|d d |d	d }|d u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	|vrdtd}|rRt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 ]}|| d }
|
d u rqt|
tr|
g}
||} d|  |
D ](} d  jd|d  d q: d|  q|dd }|d urt|tr|g}||} d  d |D ]} jd|d q d  d |d u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)rL   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 ur| S   d}  j dddddd   d | S )	Nro   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:rdfri   zcc:Work)rJ   )midrw   r    r!   ensure_metadata{  s    


z4RendererSVG._write_metadata.<locals>.ensure_metadatar   zdc:typezrdf:resourceri   )	r   Zcoveragedatedescriptionr,   
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__rw   rR   getrb   rz   datetimer   	isoformatnpiterablerB   
ValueErrorr,   re   r=   osgetenvutcfromtimestampintr   r   todayrN   r   rJ   rO   rQ   )r9   ro   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 )	Nrl   rk   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})re   rL   )rw   rj   rJ   rR   rO   )r9   rw   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   rcParamsrz   uuiduuid4hashlibsha256updateencode	hexdigest)r9   re   contentZsaltmr    r    r!   _make_id  s    
zRendererSVG._make_idc                 C   s   |t  ddd| j S )N      ?              )r   rX   rY   rs   )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 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)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 ]\\}}}}|jd|dddt|t|d | j|t |dd	d	|d
d}|d u 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 )Nrn   r   patternuserSpaceOnUser*   )rP   patternUnitsr.   yrr   rs   r   r   r   Fsimplifynonerectr@   )r.   r   rr   rs   fillzhatch.linewidthrk   Zmiter)r   strokestroke-widthr   r      stroke-opacitypath)r   r   )rC   r   rw   rJ   valuesrz   _convert_pathr   rX   rY   r   rR   r   r   rj   rO   )
r9   Z
HATCH_SIZErw   r   facer   r   	path_datar   Zhatch_styler    r    r!   r     s`    



zRendererSVG._write_hatchesc           	      C   s  i }|  }| durbd| || |d< |durt|dkr|d dkr|st|d |d< n^|du 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u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.Nzurl(#%s)r      r   r   fill-opacityr   )r   r   r   opacityr   c                 s   s   | ]}t |V  qd S r]   r^   )r_   valr    r    r!   r`   2  s   z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetr   r   r   rl   r   rk   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  sJ     



zRendererSVG._get_style_dictc                 C   s   t | ||S r]   )rj   r   )r9   r   r   r    r    r!   
_get_styleE  s    zRendererSVG._get_stylec                 C   s   |  }| \}}|d ur8| |}t|t|f}n6|d urj|j\}}}}	| j||	  }||||	f}ni S | j|}
|
d u r| 	d|}|d ur||f|f| j|< q||f| j|< n|
\}
}dd| diS )Npz	clip-pathzurl(#))
Zget_clip_rectangleZget_clip_pathr   rP   rz   Zboundsrs   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 ]\}}|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rP      Fr   r   r   r   r.   r   rr   rs   )	rC   r   rw   rJ   r   r   rR   r/   rO   )r9   rw   r  r   r  r  r   r.   r   r  r   r    r    r!   r   _  s,    

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   r@   z%s_%d)rw   rJ   r|   r   )r9   r   gidr    r    r!   
open_groupv  s    zRendererSVG.open_groupc                 C   s   | j d d S )Nr  )rw   rO   )r9   r   r    r    r!   close_group~  s    zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   rS   r    r    r!   option_image_nocomposite  s    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)rr   rs   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rb| jdd| i | jjdd|i| 	|d| 
||i | d ur| jd d S )N)r  r   r  a
xlink:hrefr   r   r   )r   )r   r   Zshould_simplifyr   Zget_sketch_paramsget_urlrw   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   sn  t |jsd S | j}| j||t dd dd}| ||}	|t|	f}
| j	|
}tdd |	
 D }	|d u r| d|
}|d |jd	|||	d
 |d || j|
< |jdi | | | |}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   )
startswithrh   r    r    r!   
<dictcomp>  s   
z,RendererSVG.draw_markers.<locals>.<dictcomp>r   r   r   )rP   r   r   r  r  #%sr   rn   )r  r   r.   r   r   useri   )r  )rC   verticesrw   r   r   rX   r   rj   r   r   rD   r   rJ   rR   rO   r  r   rr   rs   Ziter_segmentsr/   r   )r9   r   Zmarker_pathZmarker_transr   transr   rw   r   r   r   r   r  rF   r  r$  coder.   r   r    r    r!   draw_markers  s@    





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 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  ri   r  r!  )r  r.   r   r   r#  r@   )r  )rC   r$  Z_iter_collection_uses_per_pathr   draw_path_collectionrw   rJ   	enumerateZ_iter_collection_raw_pathsr   Z
get_matrixrX   r   r   r   rR   rB   rO   Z_iter_collectionr  r  r/   rs   r   ) r9   r   Zmaster_transformpathsZall_transformsoffsetsZoffsetTransZ
facecolorsZ
edgecolorsZ
linewidthsZ
linestylesZantialiasedsurlsZoffset_positionZlen_pathZuses_per_pathZshould_do_optimizationrw   Z
path_codesir   r   r   r   ZxoZyoZpath_idZgc0r   url
clip_attrsrF   r   r    r!   r*    sb    	









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)rF   Zin2operatorZk2Zk3ZcolorMatfeColorMatrixre   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   linearGradientzGR%x_%dr   )rP   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-renderingri   r  r   zurl(#colorMat))r   r   r?  r2  zurl(#GR%x_0))r   r   r?  zurl(#GR%x_1)zurl(#colorAdd))r   r   r2  r?  zurl(#GR%x_2))rw   r   rJ   rR   rO   r   Zaverager   r   ranger   r/   rj   r   )r9   r   Zpointscolorsr%  rw   Z	avg_colorr  Ztpointsr/  r:  r;  r<  r=  Zx3Zy3Z
rgba_colorxbZybm1b1m2b2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  )rw   rJ   r  frozenziprH  rO   )r9   r   Ztriangles_arrayZcolors_arrayr   Ztricolr    r    r!   draw_gouraud_triangles  s
    z"RendererSVG.draw_gouraud_trianglesc                 C   s   dS NTr    rS   r    r    r!   option_scale_image  s    zRendererSVG.option_scale_imagec                 C   s
   | j d S r   )rx   rS   r    r    r!   get_image_magnification  s    z#RendererSVG.get_image_magnificationc              	   C   sb  |j d d \}}|dks"|dkr&d S | |}|rF| jjdi | | }	|	d urj| jjdd|	id i }
| }tjd rt }t	
|j|dd	 |p| d
| }dt| d |
d< n`| jd u rtdd| jt| j}td| t	
|| |p"d| 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 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 urL| j"d |r^| j"d d S ) Nr	  r   r  r  r  ri   zsvg.image_inlineZpng)r,   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   )rX   )r@   rM   rY   )r   r.   r   rr   rs   rF   r   r   r   r   r[   r   z5image-rendering:crisp-edges;image-rendering:pixelatedr   )rr   rs   rF   )r  )#shaper  rw   rJ   r  Zget_gidr   r   r   r   Z	fromarraysaver   rc   base64	b64encoder  r{   r   r,   nextr   _logr   rx   rR   rg   r/   rs   r   r   rX   rY   rI  rO   )r9   r   r.   r   Zimr   r   r  r1  r0  rF   r   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   )rX   )g      ?)rP   r   r   N)rw   rJ   rD   _adjust_char_idr   r   rR   rg   rO   r   r   )r9   glyph_map_newrw   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   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   r@   r   rY   rZ   rX   r   r   r  ri   T)	glyph_mapZreturn_new_glyphs_onlyr  r!  r   r.   r   r#  TeX)r   rF   Fr   r   r
  N)rw   rK   r   
_text2pathr   r   r   r   r   r/   Z
FONT_SCALErj   rg   rJ   r   Zget_glyphs_with_fontr`  rR   Zget_glyphs_texZget_glyphs_mathtextr\  r   r   rO   ) r9   r   r.   r   r   r   angleismathmtextrw   rc  Z	text2pathcolorfontsizer   rY  Z
font_scalerF   r   Z_glyphsZ
glyph_infor]  rectsZglyph_idZ	xpositionZ	ypositionrX   r^  Zvertsr_  r   r   r    r    r!   _draw_text_as_path  sv    
















zRendererSVG._draw_text_as_pathc	           %      C   s  | j }	t| }
i }|
dkr&|
|d< | r6| n
| d }|dkrVt||d< |sXi }g }| dkr~||  | dkr||  t	j
|  }|dkr||  |t|  d| d	 g d
||d< | dkr| |d< t||d< |r$|d	ks2| 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 i }|D ]\}}}} }!t	%|}"g }|"j&dkr||"j& |"j'dkr||"j' |"j(dkr"||"j(  |t| d|"j)g dd
|i}|"j*dkrb|"j*|d< t|}|dkrxd }|+|g | |! |f q|, D ]\}}#|#-  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 ]8\}}}}|	jd*t|t| d t|t|d+ q:|	0d d S ),Nra  r   r   r@   r   normali  Zpxr   r\   r   zfont-stretchr   anchorrJ   rO   Zmiddle)leftrightcenterztext-anchorr.   r   zrotate(%s, %s, %s)r   rL   ri   rY   rZ   rn   r  rb         c                 S   s   h | ]\}}}|qS r    r    )r_   r.   r   tr    r    r!   	<setcomp>  ra   z1RendererSVG._draw_text_as_text.<locals>.<setcomp>c                 s   s   | ]}t |d  V  qdS )r@   N)rz   r_   cr    r    r!   r`     ra   z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c                 s   s   | ]}t |d  V  qdS )r   Nr^   rv  r    r    r!   r`     ra   )r   r.   r   Ztspanr<   c                 s   s   | ]}t |d  V  qdS )r	  N)chrrv  r    r    r!   r`     ra   r   r  )1rw   r   r   r   r   r/   Z	get_stylerB   Zget_variantr   Zweight_dictZ
get_weightextendget_sizeZ
get_familyr=   Zget_stretchrj   Zget_rotation_modeZget_transformr   Zget_unitless_positionrs   r   Zdeg2radarraysincosdotZget_harR   rg   rK   re  r   parserJ   ZttfFontPropertyr   variantweightrp   Zstretch
setdefaultrD   sortrC   rz   rO   )%r9   r   r.   r   r   r   rf  rg  rh  rw   ri  r   rY  rF   Z
font_partsr  r   axZayZ	angle_radZdir_vertZv_offsetZha_mpl_to_svgrr   rs   ZdescentZglyphsrk  Zspansr   rj  ZthetextZnew_xZnew_yentrycharsZysr    r    r!   _draw_text_as_textJ  s    















zRendererSVG._draw_text_as_text)rh  c             	   C   s   | j ||||||dd d S )Nrd  )rg  )rl  )r9   r   r.   r   r   r   rf  rh  r    r    r!   draw_tex  s    zRendererSVG.draw_texFc	           
   
   C   s   |  |}	|	r | jjdi |	 | d urB| jdd| i tjd dkrj| |||||||| n| |||||||| | d ur| jd |	r| jd d S )Nr  r  r  zsvg.fonttyper   )r  )	r  rw   rJ   r  r   r   rl  r  rO   )
r9   r   r.   r   r   r   rf  rg  rh  r1  r    r    r!   	draw_text  s    
zRendererSVG.draw_textc                 C   s   dS rM  r    rS   r    r    r!   flipy  s    zRendererSVG.flipyc                 C   s   | j | jfS r]   )rr   rs   rS   r    r    r!   get_canvas_width_height  s    z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S r]   )re  get_text_width_height_descent)r9   r   r   rg  r    r    r!   r    s    z)RendererSVG.get_text_width_height_descent)Nrn   )N)NNNN)N)N)N)N)N)FN)*rT   rU   rV   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  r  r  r  r  r  __classcell__r    r    r   r!   rm     sX   &u		,-
  


 
': 
O
Q
 
rm   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)rq   Zsvgzrn   r   dpiz3.5argsN)r  bbox_inches_restorero   c                G   s   t j|ddd}t |s*td|}|du r<| j }| jd | j \}}|d |d  }	}
t	| j|||t
|	|
|||d|d}| j| |  W d   n1 s0    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)encodingNrn   )rx   ro   )r  )r   open_file_cmZfile_requires_unicodecodecs	getwriterfigureZget_dpiZset_dpiZget_size_inchesr   rm   drawr   )r9   rX  r  r  ro   r  fhrr   rs   r  r   Zrendererr    r    r!   	print_svg  s    $


zFigureCanvasSVG.print_svgc              	   O   s~   t |d^}tjd|d0}| j|fi |W  d    W  d    S 1 sR0    Y  W d    n1 sp0    Y  d S )Nwbr  )modefileobj)r   r  gzipGzipFiler  )r9   rX  r  kwargsr  Z
gzipwriterr    r    r!   
print_svgz8  s
    zFigureCanvasSVG.print_svgzc                 C   s   dS )Nrq   r    rS   r    r    r!   get_default_filetype>  s    z$FigureCanvasSVG.get_default_filetypec                    s   | j   t  S r]   )r  Zdraw_without_renderingr   r  rS   r   r    r!   r  A  s    
zFigureCanvasSVG.draw)rT   rU   rV   	filetypesZ	fixed_dpir	   r   Zdelete_parameterr  r  r  r  r  r    r    r   r!   r    s   

0

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)rT   rU   rV   r  ZFigureCanvasr    r    r    r!   r  P  s   r  )ArS  r  r   r  r   ior   r   r}   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   	getLoggerrT   rV  r   Zbackend_versionr"   compiler#   r%   r(   r)   r/   r0   rg   rj   r   rm   r  ZFigureManagerSVGr   Zexportr  r    r    r    r!   <module>   s`   
(
	        sG