o
    i	                     @   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 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#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/e0Z1ej2Z3dd Z4e5dZ6dd Z7dd Z8dd Z9G 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Z?eZ@d'ZAejBG d(d) d)eZCdS )*    )OrderedDictN)BytesIOStringIOTextIOWrapper)Image)cbook)_Backend_check_savefig_extra_argsFigureCanvasBaseFigureManagerBaseRendererBase)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"   Z/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/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   r0   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hasattrr2   _XMLWriter__open_XMLWriter__tags_XMLWriter__data_XMLWriter__indentation)selffiler"   r"   r#   __init__p   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    )r6   r4   r8   joinr$   )r:   indentdatar"   r"   r#   __flushy   s   

zXMLWriter.__flushc                 K   s   |    t|}g | _| j| | | jdt| jd   | d|  ti ||	 D ]\}}|rHt|}t
|}| d||f  q1d| _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$   r8   r7   appendr4   r9   lensorteditemsr*   r6   )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 -->
)rC   r4   r9   rE   r7   r'   )r:   commentr"   r"   r#   rN      s   	zXMLWriter.commentc                 C   s   | j | dS )z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r8   rD   )r:   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>
)	r7   r$   popr8   rC   r6   r4   r9   rE   )r:   rH   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)rE   r7   rR   )r:   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)rM   r@   rR   )r:   rH   rO   rI   rJ   r"   r"   r#   element   s   
zXMLWriter.elementc                 C      dS )zFlush the output stream.Nr"   r:   r"   r"   r#   r2         zXMLWriter.flush)TNT)__name__
__module____qualname____doc__r<   rC   rM   rN   r@   rR   rT   rU   r2   r"   r"   r"   r#   r1   i   s    
	!
r1   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)rB   )rB   rB   	translate)r   r   rotate)r   matrixz%s(%s) c                 s       | ]}t |V  qd S Nr0   ).0r/   r"   r"   r#   	<genexpr>  s    z%generate_transform.<locals>.<genexpr>r=   )rE   r   
isinstancer   	to_valuesr3   r>   getvalue)transform_listoutputtypevaluer"   r"   r#   generate_transform   s   
ro   c                 C   sR   | r't  }t|  } | D ]\}}t|}t|}|d||f  q| S dS )Nz%s:%s;r=   )r   rF   rG   r*   r3   rj   )rI   rl   rK   rL   r"   r"   r#   generate_css  s   rp   squarebuttround)
projectingrr   rs   c                   @   sH  e Zd ZdLdd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dMddZd d! Zd"d# Z		dNd$d%ZdMd&d'Z	dMd(d)Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdMd4d5Zd6d7 Zd8d9 ZdMd:d;ZdMd<d=Ze !d>d?dOdAdBZ"dPdDdEZ#dFdG Z$dHdI Z%dJdK Z&dS )QRendererSVGNH   metadatac          	   	   C   s   || _ || _t|| _|| _i | _|| _t | _	t
 | _i | _d| _t
 | _d| _d| _t
 | _td| _t|  t | _t|}t|}|t | jjdd| d| d||f ddd	d
id| _| | |   d S )Nr   FSVG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versionrI   )r{   r|   r1   writer	image_dpi_groupdbasename	itertoolscount_image_counterr   _clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradients_fontsr   mathtext_parserr   r<   dict
_glyph_mapr0   r3   	svgPrologrM   	_start_id_write_metadata_write_default_style)	r:   r{   r|   	svgwriterr   r   rx   
str_height	str_widthr"   r"   r#   r<     s>   






zRendererSVG.__init__c                 C   s,   |    |   | j| j | j  d S rd   )_write_clips_write_hatchesr   rT   r   r2   rW   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/)FormatTypeCreatorTitletitle)rO   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 )	Nrx   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rI   zcc:Work)rM   )midr   r"   r#   ensure_metadataw  s   


z4RendererSVG._write_metadata.<locals>.ensure_metadatar   zdc:typezrdf:resourcer   )	r   coveragedatedescriptionr-   
identifierlanguagerelationsourcezdc:)creatorcontributor	publisherrightszcc:Agentzdc:titleKeywordsz
dc:subjectzrdf:Bagzrdf:liz.Unknown metadata key(s) passed to SVG writer: ,)mpl__version__r   rU   getrh   strdatetimer   	isoformatnpiterablerD   
ValueErrorr-   rm   r>   osgetenvutcfromtimestampintr   r   todayrQ   r   rM   rR   rT   )r:   rx   r   datesdr   r   urikeyinfoagentsagentkeywordskeywordr"   r   r#   r   A  s   













zRendererSVG._write_metadatac                 C   s@   | j }tddd}|d |jddd| d |d d S )	Nrs   rr   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})rm   rO   )r   rp   rM   rU   rR   )r:   r   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   uuiduuid4hashlibmd5updateencode	hexdigest)r:   rm   contentsaltmr"   r"   r#   _make_id  s   
zRendererSVG._make_idc                 C   s   |t  ddd| j S )N      ?              )r   r^   r_   r|   )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_pointsset_size)r:   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)tupleget_hatch_color	get_hatchr   r   r   get_hatch_path)r:   gcrgbFace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 )Nrv   r   patternuserSpaceOnUser+   )rS   patternUnitsr/   yr{   r|   r   r   r   FsimplifynonerectrB   )r/   r   r{   r|   fillzhatch.linewidthrr   miter)r  strokestroke-widthr   r      stroke-opacitypath)r   r   )rE   r   r   rM   valuesr   _convert_pathr   r^   r_   r   rU   r   r   rp   rR   )
r:   
HATCH_SIZEr   r  facer  r   	path_datar  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.Nurl(#%s)r     r  r   fill-opacityr   )r   r   r   opacityr   c                 s   rc   rd   re   )rf   valr"   r"   r#   rg   .  s    
z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetr  r  r  rs   r   rr   r   )get_forced_alphar   r   rE   r0   r   r   	get_alpha
get_dashesr>   floatget_linewidthget_rgbget_joinstyleget_capstyle_capstyle_d)	r:   r   r   rI   forced_alphaoffsetseq	linewidthrgbr"   r"   r#   _get_style_dict  sL    

zRendererSVG._get_style_dictc                 C   s   t | ||S rd   )rp   r"  )r:   r   r   r"   r"   r#   
_get_styleA  s   zRendererSVG._get_stylec                 C   s   |  }| \}}|d ur| |}t|t|f}n|d ur5|j\}}}}	| j||	  }||||	f}nd S | j|}
|
d u r_| 	d|}|d urV||f|f| j|< |S ||f| j|< |S |
\}
}|S )Np)
get_clip_rectangleget_clip_pathr   rS   r   boundsr|   r   r   r   )r:   r   cliprectclippathclippath_transr   r/   r   wr   clipr   r"   r"   r#   	_get_clipD  s(   
zRendererSVG._get_clipc                 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   clipPathrS      Fr   r  r   r  r/   r   r{   r|   )	rE   r   r   rM   r	  r
  rU   r0   rR   )r:   r   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   rB   z%s_%d)r   rM   r   r   )r:   r!   gidr"   r"   r#   
open_groups  s   "zRendererSVG.open_groupc                 C   s   | j d d S )Nr3  )r   rR   )r:   r!   r"   r"   r#   close_group{     zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   rW   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)r{   r|   r   convert_to_stringdecode)r:   r  r   r,  r   sketchr"   r"   r#   r
    s   zRendererSVG._convert_pathc                 C   s   |  |}|d u o| d u }|jo|}| j||||| d}i }	| |||	d< | |}
|
d ur9d|
 |	d< | d urJ| j	dd| i | jj
d||	d | d ura| jd d S d S )	N)r,  r   rC  r   r  	clip-patha
xlink:hrefr  )r   rI   )r   r   should_simplifyr
  get_sketch_paramsr#  r-  get_urlr   rM   rU   rR   )r:   r   r  r   r   trans_and_flipr,  r   r  rI   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 u rX| d|
}|d |jd	|||	d
 |d || j|
< i }| |}|d urid| |d< |jd|d | |}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  )
startswith)rf   rK   rL   r"   r"   r#   
<dictcomp>  s    z,RendererSVG.draw_markers.<locals>.<dictcomp>r   r   r  )rS   r   r   r  rD  r3  r   rF  #%sr   rv   )r,  r   r/   r   r   use)rE   verticesr   r
  r   r^   r"  rp   r   r   rG   r   rM   rU   rR   r-  r   r{   r|   iter_segmentsr0   r#  )r:   r   marker_pathmarker_transr  transr   r   r  r   r   r   rI   rK  rJ  r,  rR  coder/   r   r"   r"   r#   draw_markers  sJ   





zRendererSVG.draw_markersc                  C   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 ]Y\}}}}}| |}| }|d ur|jdd|id |d ur|jddd| id d| t|t| j| | ||d}|jd|d |d ur|d |d ur|d q|  jd7  _d S )Nr   	   r     r   r   r   Fr   z	C%x_%x_%sr=   r  rS   r   rE  rF  r   r3  rD  r  rO  )rF  r/   r   r   rQ  rB   )rE   rR  _iter_collection_uses_per_pathr   draw_path_collectionr   rM   	enumerate_iter_collection_raw_pathsr   
get_matrixr^   r
  r   r   rU   rD   rR   _iter_collectionr-  rI  r0   r|   r#  ) r:   r   master_transformpathsall_transformsoffsetsoffsetTrans
facecolors
edgecolors
linewidths
linestylesantialiasedsurlsoffset_positionlen_pathuses_per_pathshould_do_optimizationr   
path_codesir  r   r   r   xoyopath_idgc0r   rK  urlrI   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filtercolorAddr/  feCompositeinSourceGraphicBackgroundImage
arithmetic1)rI   in2operatork2k3colorMatfeColorMatrixrm   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 )rI   r	  r   )axisrP   r   r  rB   r0  r   linearGradientzGR%x_%dr   )rS   gradientUnitsx1y1x2y2stop)z
stop-colorzstop-opacity)r  r   r+   zM r   z L rb   z Zr  
crispEdges)r   r  r  shape-renderingr   r3  r   zurl(#colorMat))r  r  r  rx  zurl(#GR%x_0))r   r  r  zurl(#GR%x_1)zurl(#colorAdd))r   r  rx  r  zurl(#GR%x_2))r   r   rM   rU   rR   r   averager   r   ranger   r0   rp   r   )r:   r   pointscolorsrV  r   	avg_colorrJ  tpointsrr  r  r  r  r  x3y3
rgba_colorxbybm1b1m2b2dpathr"   r"   r#   draw_gouraud_triangle	  s   







 
z!RendererSVG.draw_gouraud_trianglec           	      C   sn   i }|  |}|d urd| |d< | jjd|d | }t||D ]\}}| |||| q"| jd d S )Nr  rD  r3  r   )r-  r   rM   frozenzipr  rR   )	r:   r   triangles_arraycolors_arrayr   rI   rK  tricolr"   r"   r#   draw_gouraud_triangles  s   
z"RendererSVG.draw_gouraud_trianglesc                 C   rV   rY   r"   rW   r"   r"   r#   option_scale_image  rX   zRendererSVG.option_scale_imagec                 C   s
   | j d S r   )r   rW   r"   r"   r#   get_image_magnification  s   
z#RendererSVG.get_image_magnificationc              	   C   sn  |j d d \}}|dks|dkrd S i }| |}	|	d ur*| jjddd|	 id | }
| }|d ur@| jjdd|id tjd	 rkt }t	
|j|d
d |
p[| d| }
dt| d |d< n/| jd u rtt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 |	d ur5| j"d d S d S )!Nr0  r   r3  rD  r  r   rE  rF  zsvg.image_inline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: %sIm_rS   r   )r^   )rB   rP   r_   )r   r/   r   r{   r|   rI   r   r  r   r   ra   r   z5image-rendering:crisp-edges;image-rendering:pixelatedr   )r{   r|   rI   )#shaper-  r   rM   get_gidrI  r   r   r   r   	fromarraysaver   rj   base64	b64encoderB  r   r   r-   nextr   _logr   r   rU   ro   r0   r|   r  r   r^   r_   r  rR   )r:   r   r/   r   imr   r   r+  rI   rK  r   rw  buffilenamealphaflippedr"   r"   r#   
draw_image  s   


	


zRendererSVG.draw_imagec                 C   sv   | j }|r9|d | D ]\}\}}| |}| jt||dd}|jd||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[  N)
r   rM   rG   _adjust_char_idr
  r   rU   rR   r   r   )r:   glyph_map_newr   char_idrR  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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 )aW  
        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  rB   r  r_   r`   r^   )r   r   r3  r   T)	glyph_mapreturn_new_glyphs_onlyrF  rO  r   r/   r   rQ  TeX)r   rI   Fr   r  r1  N)r   rN   r   
_text2pathr   r  r   r  r  r0   
FONT_SCALErp   ro   rM   r   get_glyphs_with_fontr  rU   get_glyphs_texget_glyphs_mathtextr  r   r
  rR   ) r:   r   r/   r   r!   r   angleismathmtextr   r  	text2pathcolorfontsizer   r  
font_scalerI   r   _glyphs
glyph_infor  rectsglyph_id	xposition	ypositionr^   r  vertsr  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| |}|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 d S td||ffd| ffg|d< |	jd||d d S |	| | j !|d|\}}}}}|j"}|j#}i }t||d< td||ffd| ffg|d< |	j$d|d |	$d t% }|D ]1\}}}} }!}"tt|d |j
|j& |j& d }|d!krtd"}|'|g (| |! |f qQ|) 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|	-d t+|r|D ]\}}}}|	jd-t|t| | t|t|d. q|	-d d S )/Nr  r  r  rB   r  r   )flagsfont-familyfont-weightzfont-stretch
font-stylepx	font-sizer   r   anchorrM   rR   middle)leftrightcenterztext-anchorr/   r   zrotate(%s, %s, %s)r   rO   r   r_   r`   rv   r3  )r  r  r  r         c                 S   s   h | ]\}}}|qS r"   r"   )rf   r/   r   tr"   r"   r#   	<setcomp>  s    z1RendererSVG._draw_text_as_text.<locals>.<setcomp>rb   c                 s       | ]	}t |d  V  qdS )rB   N)r   rf   cr"   r"   r#   rg         z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c                 s   r  )r   Nre   r  r"   r"   r#   rg     r  )r   r/   r   tspanr=   c                 s   r  )r0  N)chrr  r"   r"   r#   rg     r  r  r2  ).r   r   r  r  r  r0   r   set_textr   r   family_name
get_weightlowerget_stretch	get_styleget_sizerp   get_rotation_modeget_transformr   get_unitless_positionr|   r   deg2radarraysincosdotget_harU   ro   rN   r   parse
svg_glyphs	svg_rectsrM   r   
style_name
setdefaultrD   rG   sortrE   r>   rR   )%r:   r   r/   r   r!   r   r  r  r  r   r  r   r  r   rI   r   axay	angle_raddir_vertv_offsetha_mpl_to_svgr{   r|   descentsvg_elementsused_charactersr  r  spansr  thetextnew_xnew_ymetricscharsysr"   r"   r#   _draw_text_as_textW  s   

















zRendererSVG._draw_text_as_textz3.3r  TeX!c	           	   	   C   s   | j ||||||dd d S )Nr  )r  )r  )	r:   r   r/   r   r!   r   r  r  r  r"   r"   r#   draw_tex  s   zRendererSVG.draw_texFc	           
   
   C   s   |  |}	|	d ur| jjddd|	 id | d ur&| jdd| i tjd dkr:| |||||||| n| |||||||| | d urR| jd |	d ur^| jd d S d S )	Nr3  rD  r  r   rE  rF  zsvg.fonttyper  )	r-  r   rM   rI  r   r   r  r  rR   )
r:   r   r/   r   r!   r   r  r  r  rK  r"   r"   r#   	draw_text  s   
zRendererSVG.draw_textc                 C   rV   rY   r"   rW   r"   r"   r#   flipy  rX   zRendererSVG.flipyc                 C   s   | j | jfS rd   )r{   r|   rW   r"   r"   r#   get_canvas_width_height  r9  z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S rd   )r  get_text_width_height_descent)r:   r!   r   r  r"   r"   r#   r    r7  z)RendererSVG.get_text_width_height_descent)Nrv   rd   )NNNN)r  N)FN)'rZ   r[   r\   r<   r   r   r   r   r   r   r   r   r"  r#  r-  r   r5  r6  r8  r
  rL  rX  r]  r  r  r  r  r  r  r  r  r  r   _delete_parameterr  r  r  r  r  r"   r"   r"   r#   ru     sT    #u		,-




,: 
P

Q

ru   c                   @   sH   e Zd ZdddZdZdd Zdd Zedddd	d
dZdd Z	dS )FigureCanvasSVGzScalable Vector Graphics)rz   svgzrv   c                 O   s   t j|ddd=}t|dd}t|tsd}t |rd}nt|d}d}| j||fi | |r=|  W d   dS W d   dS 1 sHw   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)encodingnamer=   FTN)	r   open_file_cmgetattrrh   r   file_requires_unicoder   
_print_svgdetach)r:   r  argskwargsfhr#  r"   r"   r#   	print_svg  s   



"zFigureCanvasSVG.print_svgc              	   O   sx   t |d,}tjd|d}| |W  d    W  d    S 1 s%w   Y  W d    d S 1 s5w   Y  d S )Nwbr+  )modefileobj)r   r  gzipGzipFiler'  )r:   r  r$  r%  r&  
gzipwriterr"   r"   r#   
print_svgz8  s   RzFigureCanvasSVG.print_svgzN)dpibbox_inches_restorerx   c                C   sj   | j d | j  \}}|d |d }}	t| j |||t||	||||d|d}
| j |
 |
  d S )Nr   rv   rw   )r0  )figureset_dpiget_size_inchesr   ru   drawr   )r:   r  r&  r/  r0  rx   r{   r|   r+  r   rendererr"   r"   r#   r"  =  s   
zFigureCanvasSVG._print_svgc                 C   rV   )Nrz   r"   rW   r"   r"   r#   get_default_filetypeL  s   z$FigureCanvasSVG.get_default_filetype)
rZ   r[   r\   	filetypes	fixed_dpir'  r.  r	   r"  r6  r"   r"   r"   r#   r     s    2r  z<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with matplotlib (https://matplotlib.org/) -->
c                   @   s   e Zd ZeZdS )_BackendSVGN)rZ   r[   r\   r  FigureCanvasr"   r"   r"   r#   r9  [  s    r9  )Dcollectionsr   r  r   r+  r   ior   r   r   r   loggingr   rer   numpyr   PILr   
matplotlibr   r   matplotlib.backend_basesr   r	   r
   r   r   !matplotlib.backends.backend_mixedr   matplotlib.colorsr   matplotlib.datesr   matplotlib.font_managerr   r   matplotlib.ft2fontr   matplotlib.mathtextr   matplotlib.pathr   r   matplotlib.transformsr   r   	getLoggerrZ   r  r   backend_versionr$   compiler%   r'   r*   r0   r1   ro   rp   r  ru   r  FigureManagerSVGr   exportr9  r"   r"   r"   r#   <module>   sd    
(
	        pP