o
    tBh                     @   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    v/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/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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!   __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 -->
)rB   r3   r8   rD   r6   r%   )r9   commentr    r    r!   rL      s   	zXMLWriter.commentc                 C   s   | j | dS )z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r7   rC   )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   rB   r5   r3   r8   rD   )r9   rF   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)rD   r6   rP   )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)rK   r?   rP   )r9   rF   rM   rG   rH   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;   rB   rK   rL   r?   rP   rR   rS   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)rA   )rA   rA   	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<   )rD   r   
isinstancer   	to_valuesr2   r=   getvalue)transform_listoutputtypevaluer    r    r!   generate_transform   s   
rm   c                 C   s   d dd |  D S )Nz; c                 s   s"    | ]\}}| d | V  qdS )z: Nr    rd   rI   rJ   r    r    r!   re     s     zgenerate_css.<locals>.<genexpr>)r=   rE   rG   r    r    r!   generate_css  s   rp   squarebuttround)
projectingrr   rs   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heightviewBoxxmlnsversionrG   )rz   r{   r0   writer	image_dpigetattrrf   strbasename_groupd	itertoolscount_image_counter_clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientssuperr;   dict
_glyph_mapr/   r2   	svgPrologrK   	_start_id_write_metadata_write_default_style)	r9   rz   r{   	svgwriterr   r   rw   
str_height	str_width	__class__r    r!   r;     sB   






zRendererSVG.__init__3.4c                 C   s   t dS )NSVGr   rU   r    r    r!   mathtext_parser:  s   zRendererSVG.mathtext_parserc                 C   s,   |    |   | j| j | j  d S rb   )_write_clips_write_hatchesr   rR   r   r1   rU   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)rM   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 )	Nrw   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:rdfro   zcc:Work)rK   )midr   r    r!   ensure_metadata{  s   


z4RendererSVG._write_metadata.<locals>.ensure_metadatar   zdc:typezrdf:resourcero   )	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   rS   getrf   r   datetimer   	isoformatnpiterablerC   
ValueErrorr,   rk   r=   osgetenvutcfromtimestampintr   r   todayrO   r   rK   rP   rR   )r9   rw   r   datesdr   r   urikeyinfoagents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 )	Nrs   rr   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})rk   rM   )r   rp   rK   rS   rP   )r9   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sha256updateencode	hexdigest)r9   rk   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{   )r9   	transformr    r    r!   _make_flip_transform  s
   
z RendererSVG._make_flip_transformc                 C   s4   t |}t |}|  | }||d |S N      R@)fmfindfontget_fontclearget_size_in_points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)tupleget_hatch_color	get_hatchr   r   r   get_hatch_path)r9   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*   )rQ   patternUnitsr.   yrz   r{   r   r   r   FsimplifynonerectrA   )r.   r  rz   r{   fillzhatch.linewidthrr   miter)r  strokestroke-widthr   r      stroke-opacitypath)r   r   )rD   r   r   rK   valuesr   _convert_pathr   r\   r]   r   rS   r   r   rp   rP   )
r9   
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.Nzurl(#%s)r     r  r   fill-opacityr  )r   r   r   opacityr   c                 s   ra   rb   rc   )rd   valr    r    r!   re   2  s    
z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetr
  r  r  rs   r   rr   r   )get_forced_alphar   r   rD   r/   r   r   	get_alpha
get_dashesr=   floatget_linewidthget_rgbget_joinstyleget_capstyle_capstyle_d)	r9   r   r   rG   forced_alphaoffsetseq	linewidthrgbr    r    r!   _get_style_dict  sL    

zRendererSVG._get_style_dictc                 C   s   t | ||S rb   )rp   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(#))
get_clip_rectangleget_clip_pathr   rQ   r   boundsr{   r   r   r   )r9   r   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   clipPathrQ      Fr  r  r   r  r.   r  rz   r{   )	rD   r   r   rK   r  r  rS   r/   rP   )r9   r   r2  r   r/  r0  r  r.   r  r1  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gr5  r   rA   z%s_%d)r   rK   r   r   )r9   r   gidr    r    r!   
open_groupv  s   "zRendererSVG.open_groupc                 C   s   | j d d S )Nr9  )r   rP   )r9   r   r    r    r!   close_group~     zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   rU   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)rz   r{   r   convert_to_stringdecode)r9   r  r   r2  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)r2  r  rI  a
xlink:hrefr  r   r   )r  )r   r   should_simplifyr  get_sketch_paramsget_urlr   rK   rS   r3  r(  rP   )	r9   r   r  r   r   trans_and_flipr2  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
  )
startswithrn   r    r    r!   
<dictcomp>  s    z,RendererSVG.draw_markers.<locals>.<dictcomp>r   r   r  )rQ   r   r   r9  rK  #%sr   rv   )r2  r  r.   r  r   usero   r9  )rD   verticesr   r  r   r\   r'  rp   r   r   rE   r   rK   rS   rP   r3  r   rz   r{   iter_segmentsr/   r(  )r9   r   marker_pathmarker_transr  transr   r   r  r   r   r   rO  rG   r2  rW  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  )rQ   r   rJ  rK  ro   r9  rS  )rK  r.   r  r   rU  rA   rV  )rD   rW  _iter_collection_uses_per_pathr   draw_path_collectionr   rK   	enumerate_iter_collection_raw_pathsr   
get_matrixr\   r  r   r   rS   rC   rP   _iter_collectionrN  r3  r/   r{   r(  ) r9   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   url
clip_attrsrG   r   r    r!   ra    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colorAddr5  feCompositeinSourceGraphicBackgroundImage
arithmetic1)rG   in2operatork2k3colorMatfeColorMatrixrk   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 )rG   r  r   )axisrN   r   r  rA   r6  r   linearGradientzGR%x_%dr  )rQ   gradientUnitsx1y1x2y2stop)z
stop-colorzstop-opacity)r#  r   r*   zM r   z L r`   z Zr  
crispEdges)r   r  r  shape-renderingro   r9  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))r   r   rK   rS   rP   r   averager   r   ranger   r/   rp   r   )r9   r   pointscolorsr[  r   	avg_colorrO  tpointsrv  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   sT   | j jdi | | | }t||D ]\}}| |||| q| j d d S )Nr9  rV  )r   rK   r3  frozenzipr  rP   )r9   r   triangles_arraycolors_arrayr   tricolr    r    r!   draw_gouraud_triangles  s
   z"RendererSVG.draw_gouraud_trianglesc                 C   rT   rW   r    rU   r    r    r!   option_scale_image  rV   zRendererSVG.option_scale_imagec                 C   s
   | j d S r   )r   rU   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 ) Nr6  r   r9  rJ  rK  ro   zsvg.image_inlinepng)r,   imagezdata:image/png;base64,
rF  zLCannot save image data to filesystem when writing SVG to an in-memory bufferz{}.image{}.pngz$Writing image file for inclusion: %sIm_rQ   r   )r\   )rA   rN   r]   )r   r.   r  rz   r{   rG   r   r  r   r   r_   r   z5image-rendering:crisp-edges;image-rendering:pixelatedr   )rz   r{   rG   rV  )#shaper3  r   rK   rN  get_gidr   r   r   r   	fromarraysaver   rh   base64	b64encoderH  r   r   r,   nextr   _logr   r   rS   rm   r/   r{   r  r   r\   r]   r  rP   )r9   r   r.   r  imr   r   r1  r|  r{  rG   r   buffilenamealpha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      ?)rQ   r   r   N)r   rK   rE   _adjust_char_idr  r   rS   rm   rP   r   r   )r9   glyph_map_newr   char_idrW  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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  rA   r  r]   r^   r\   r   r   r9  ro   T)	glyph_mapreturn_new_glyphs_onlyrK  rS  r   r.   r  rU  TeX)r   rG   Fr  r  r7  N)r   rL   r   
_text2pathr   r  r   r  r  r/   
FONT_SCALErp   rm   rK   r   get_glyphs_with_fontr  rS   get_glyphs_texget_glyphs_mathtextr  r   r  rP   ) r9   r   r.   r  r   r   angleismathmtextr   r  	text2pathcolorfontsizer   r  
font_scalerG   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+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 ),Nr  r  r  rA   r  normali  pxr   r`   r   zfont-stretchr   anchorrK   rP   middle)leftrightcenterztext-anchorr.   r  zrotate(%s, %s, %s)r   rM   ro   r]   r^   rv   r9  r         c                 S   s   h | ]\}}}|qS r    r    )rd   r.   r  tr    r    r!   	<setcomp>  s    z1RendererSVG._draw_text_as_text.<locals>.<setcomp>c                 s       | ]	}t |d  V  qdS )rA   N)r   rd   cr    r    r!   re         z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c                 s   r  )r   Nrc   r  r    r    r!   re     r  )r   r.   r  tspanr<   c                 s   r  )r6  N)chrr  r    r    r!   re     r  r  r8  )1r   r   r  r  r  r/   	get_stylerC   get_variantr   weight_dict
get_weightextendget_size
get_familyr=   get_stretchrp   get_rotation_modeget_transformr   get_unitless_positionr{   r   deg2radarraysincosdotget_harS   rm   rL   r  r   parserK   ttfFontPropertyr   variantweightrx   stretch
setdefaultrE   sortrD   r   rP   )%r9   r   r.   r  r   r   r  r  r  r   r  r   r  rG   
font_partsr  r   axay	angle_raddir_vertv_offsetha_mpl_to_svgrz   r{   descentglyphsr  spansr   r  thetextnew_xnew_yentrycharsysr    r    r!   _draw_text_as_textJ  s   















zRendererSVG._draw_text_as_text)r  c             	   C   s   | j ||||||dd d S )Nr  )r  )r  )r9   r   r.   r  r   r   r  r  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 )Nr9  rJ  rK  zsvg.fonttyper  rV  )	r3  r   rK   rN  r   r   r  r  rP   )
r9   r   r.   r  r   r   r  r  r  r|  r    r    r!   	draw_text  s   
zRendererSVG.draw_textc                 C   rT   rW   r    rU   r    r    r!   flipy  rV   zRendererSVG.flipyc                 C   s   | j | jfS rb   )rz   r{   rU   r    r    r!   get_canvas_width_height  r?  z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S rb   )r  get_text_width_height_descent)r9   r   r   r  r    r    r!   r    r=  z)RendererSVG.get_text_width_height_descent)Nrv   rb   )NNNN)FN)*rX   rY   rZ   r;   r   
deprecatedpropertyr   r   r   r   r   r   r   r   r   r'  r(  r3  r   r;  r<  r>  r  rP  r]  ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  __classcell__r    r    r   r!   ru     sZ    &u		,-




': 
O

Q 
ru   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)ry   svgzrv   r   dpiz3.5argsN)r#  bbox_inches_restorerw   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_
        r1  zutf-8)encodingNrv   )r   rw   )r%  )r   open_file_cmfile_requires_unicodecodecs	getwriterfigureget_dpiset_dpiget_size_inchesr   ru   drawr   )r9   r  r#  r%  rw   r$  fhrz   r{   r1  r   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wbr1  )modefileobj)r   r'  gzipGzipFiler2  )r9   r  r$  kwargsr0  
gzipwriterr    r    r!   
print_svgz8  s   RzFigureCanvasSVG.print_svgzc                 C   rT   )Nry   r    rU   r    r    r!   get_default_filetype>  s   z$FigureCanvasSVG.get_default_filetypec                    s   | j   t  S rb   )r+  draw_without_renderingr   r/  rU   r   r    r!   r/  A  s   

zFigureCanvasSVG.draw)rX   rY   rZ   	filetypes	fixed_dpir	   r   delete_parameterr2  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)rX   rY   rZ   r!  FigureCanvasr    r    r    r!   r@  P  s    r@  )Ar  r)  r   r6  r   ior   r   r   loggingr   rer   numpyr   PILr   
matplotlibr   r   r   r   r   matplotlib.backend_basesr   r	   r
   r   r   !matplotlib.backends.backend_mixedr   matplotlib.colorsr   matplotlib.datesr   matplotlib.mathtextr   matplotlib.pathr   r   matplotlib.transformsr   r   	getLoggerrX   r  r   backend_versionr"   compiler#   r%   r(   r)   r/   r0   rm   rp   r!  ru   r!  FigureManagerSVGr   exportr@  r    r    r    r!   <module>   sb    
(
	        sG