o
    li                     @   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 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 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*ddddd Z+dd Z,e
-dZ.ej*ddddd Z/dd Z0ej*ddddd Z1dd Z2dd Z3ej*dd dd!d" Z4d#d$ Z5G d%d& d&Z6d'd( Z7e*dd>d)d*Z8d+d, Z9e*dd>d-d.Z:d/d0d1d2Z;d3d4 Z<d5d6 Z=G d7d8 d8eZ>G d9d: d:eZ?eZ@d;ZAejBG d<d= d=eZCdS )?    N)BytesIO)Image)_apicbookfont_manager)_BackendFigureCanvasBaseFigureManagerBaseRendererBase)MixedModeRenderer)rgb2hex)UTC)Path)_path)Affine2DAffine2DBasez3.6z a vendored copy of _escape_cdata)alternativec                 C      t | S N)_escape_cdatas r   ]/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/matplotlib/backends/backend_svg.pyescape_cdataE      r   c                 C   s(   |  dd} |  dd} |  dd} | S )N&&amp;<&lt;>&gt;replacer   r   r   r   r   J   s   r   z-(?=-)z"a vendored copy of _escape_commentc                 C   s
   t | S r   )_escape_commentsubr   r   r   r   escape_commentT   s   
r&   c                 C   s   t | } td| S )Nz- )r   _escape_xml_commentr%   r   r   r   r   r$   Y   s   r$   z!a vendored copy of _escape_attribc                 C   r   r   )_escape_attribr   r   r   r   escape_attrib^   r   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   r(   c   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_attribl   s
   r,   z#a vendored copy of _short_float_fmtc                 C   r   r   _short_float_fmtxr   r   r   short_float_fmtr   r   r1   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rstripr/   r   r   r   r.   w   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hasattrr7   _XMLWriter__open_XMLWriter__tags_XMLWriter__data_XMLWriter__indentation)selffiler   r   r   __init__   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    )r;   r9   r=   joinr   )r?   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   r=   r<   appendr9   r>   lenitemsr,   r;   )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 -->
)rH   r9   r>   rJ   r<   r$   )r?   commentr   r   r   rR      s   	zXMLWriter.commentc                 C   s   | j | dS )z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r=   rI   )r?   textr   r   r   rE      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>
)	r<   r   popr=   rH   r;   r9   r>   rJ   )r?   rL   rD   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)rJ   r<   rV   )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)rD   N)rQ   rE   rV   )r?   rL   rS   rM   rN   r   r   r   element   s   
zXMLWriter.elementc                 C      dS )zFlush the output stream.Nr   r?   r   r   r   r7   	     zXMLWriter.flush)TNT)__name__
__module____qualname____doc__rA   rH   rQ   rR   rE   rV   rX   rY   r7   r   r   r   r   r6      s    
	!
r6   c              	   C   s   g }| 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r2t |tr2| }|d	|d
dd |D f  qd
|S )Nscale)rG   )rG   rG   	translate)r   r   rotate)r   matrixz%s(%s) c                 s       | ]}t |V  qd S r   r-   ).0r0   r   r   r   	<genexpr>  s    z&_generate_transform.<locals>.<genexpr>)
isinstancer   	to_valuesrI   rC   )transform_listpartstypevaluer   r   r   _generate_transform  s   

rp   c                 C   s   t | pg S r   )rp   )rl   r   r   r   generate_transform     rq   c                 C   s   d dd |  D S )Nz; c                 s   s"    | ]\}}| d | V  qdS )z: Nr   rh   rO   rP   r   r   r   ri   "  s     z _generate_css.<locals>.<genexpr>)rC   rK   rM   r   r   r   _generate_css!  s   ru   c                 C   s   t | pi S r   )ru   rt   r   r   r   generate_css%  rr   rv   squarebuttround)
projectingrx   ry   c                 C   s(   t | tstd| dt|  dd S )NInvalid type for z metadata. Expected str, not r3   )rj   str	TypeErrorrn   )infokeyr   r   r   _check_is_str-  s
   


r   c                 C   sV   t | r| D ]}t|tstd| dt| dqd S td| dt|  d)Nr{   z) metadata. Expected iterable of str, not r3   z0 metadata. Expected str or iterable of str, not )npiterablerj   r|   r}   rn   )infosr   r~   r   r   r   _check_is_iterable_of_str3  s   





r   c                       s>  e Zd ZdGdd f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dHddZdd Zd d! Z		dId"d#ZdHd$d%Z	dHd&d'Z fd(d)Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdHd4d5Zd6d7 Zd8d9 ZdHd:d;ZdHd<d=ZdJd?d@Z dAdB Z!dCdD Z"dEdF Z#  Z$S )K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namerB   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versionrM   )r   r   r6   writer	image_dpigetattrrj   r|   basename_groupd	itertoolscount_image_counter_clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientssuperrA   dict
_glyph_mapr.   r8   	svgPrologrQ   	_start_id_write_metadata_write_default_style)	r?   r   r   	svgwriterr   r   r   
str_height	str_width	__class__r   r   rA   ?  sB   






zRendererSVG.__init__c                 C   s,   |    |   | j| j | j  d S r   )_write_clips_write_hatchesr   rX   r   r7   r[   r   r   r   finalizee  s   zRendererSVG.finalizec                    sB  |d u ri }dddt j dd|}| j d|v r*|d }t|d  jd|d |d	d }|d urt|tr=|g}nKt|tjtj	frL|
 g}n<t|r~g }|D ]'}t|trb|| qUt|tjtj	frs||
  qUtd
t| dn
tdt| dd||d	< n*d	|vrtd}|rtjt|tjj}|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||}t|
|	  jd|	  |
d qdD ]K}	||	d }|d u rqt|tr|g}t||	 ||} d|	   |D ]} d  jd|d  d q+ d|	   q|dd }|d urt|tr_|g}t|d ||} d  d |D ]
} jd|d qt d  d |d ur | |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)rS   DatezQInvalid type for Date metadata. Expected iterable of str, date, or datetime, not r3   z[Invalid type for Date metadata. Expected str, date, datetime, or iterable of the same, not /SOURCE_DATE_EPOCH)tzinfoc                    s:   | d ur| S   d}  j dddddd   d | S )	Nr   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:rdfrt   zcc:Work)rQ   )midr   r   r   ensure_metadata  s   


z4RendererSVG._write_metadata.<locals>.ensure_metadatar   zdc:typezrdf:resourcert   )	r   Coverager   Descriptionr   
IdentifierLanguageRelationSourcezdc:)r   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   r   rY   getrj   r|   datetimedate	isoformatr   r   rI   r}   rn   rC   osgetenvfromtimestampinttimezoneutcr#   r   todayrU   lowerr   rQ   rV   rX   
ValueError)r?   r   r   r   datesdr   r   urir   r~   agentsagentkeywordskeywordr   r   r   r   k  s   

















zRendererSVG._write_metadatac                 C   s@   | j }tddd}|d |jddd| d |d d S )	Nry   rx   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})rn   rS   )r   ru   rQ   rY   rV   )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sha256updateencode	hexdigest)r?   rn   contentsaltmr   r   r   _make_id  s   
zRendererSVG._make_idc                 C   s   |t  ddd| j S )NrG   rT   r   )r   rb   rc   r   )r?   	transformr   r   r   _make_flip_transform  s   z RendererSVG._make_flip_transformc                 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 )Nr   r   patternuserSpaceOnUser2   )rW   patternUnitsr0   yr   r         ?      r   FsimplifynonerectrG   )r0   r   r   r   fillzhatch.linewidthrx   miter)r  strokestroke-widthr   r      stroke-opacitypath)r   r   )rJ   r   r   rQ   valuesr|   _convert_pathr   rb   rc   r   rY   r   r   ru   rV   )
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.Nzurl(#%s)r     r  r   fill-opacityr  )r   r   r   opacityr   c                 s   rg   r   r-   )rh   valr   r   r   ri   S  s    
z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetr  r	  r  ry   r   rx   r   )get_forced_alphar   r   rJ   r.   r   r   	get_alpha
get_dashesrC   floatget_linewidthget_rgbget_joinstyleget_capstyle_capstyle_d)	r?   r   r   rM   forced_alphaoffsetseq	linewidthrgbr   r   r   _get_style_dict9  sL    

zRendererSVG._get_style_dictc                 C   s   t | ||S r   )ru   r#  )r?   r   r   r   r   r   
_get_stylef     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   rW   r|   boundsr   r   r   r   )r?   r   cliprectclippathclippath_transr   r0   r   wr   clipr   r   r   r   _get_clip_attrsi  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rW      Fr   r
  r   r  r0   r   r   r   )	rJ   r   r   rQ   r  r  rY   r.   rV   )r?   r   r/  r   r,  r-  r  r0   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gr2  r   rG   z%s_%d)r   rQ   r   r   )r?   r   gidr   r   r   
open_group  s   "zRendererSVG.open_groupc                 C   s   | j d d S )Nr6  )r   rV   )r?   r   r   r   r   close_group     zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   r[   r   r   r   option_image_nocomposite  rr   z$RendererSVG.option_image_nocompositec              
   C   s<   |rdd| j | jf}nd }t|||||dg dddS )N           )   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}| d ur1| jdd| i | jjdd|i| 	|d| 
||i | d urU| jd d S d S )N)r/  r  rF  a
xlink:hrefr
  r   r   )r
  )r   r   should_simplifyr  get_sketch_paramsget_urlr   rQ   rY   r0  r$  rV   )	r?   r   r
  r   r   trans_and_flipr/  r  r  r   r   r   	draw_path  s   


zRendererSVG.draw_pathc                 C   sj  t |jsd S | j}| j||t dd dd}| ||}	|t|	f}
| j	|
}tdd |	
 D }	|d u rX| d|
}|d |jd	|||	d
 |d || j|
< |jdi | | | |}dd| i}dd| jd | jd f}|j||ddD ]+\}}t |r|dd  \}}t||d< t||d< | |||d< |jd|d q|d d S )Nr   r   Fr   c                 S   s    i | ]\}}| d r||qS )r  )
startswithrs   r   r   r   
<dictcomp>  s    z,RendererSVG.draw_markers.<locals>.<dictcomp>r   r   r
  )rW   r   r   r6  rH  #%sr   r   )r/  r  r0   r   r   usert   r6  )rJ   verticesr   r  r   rb   r#  ru   r   r   rK   r   rQ   rY   rV   r0  r   r   r   iter_segmentsr.   r$  )r?   r   marker_pathmarker_transr
  transr   r   r  r   r   r   rL  rM   r/  rT  coder0   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_%srB   r
  )rW   r   rG  rH  rt   r6  rP  )rH  r0   r   r   rR  rG   rS  )rJ   rT  _iter_collection_uses_per_pathr   draw_path_collectionr   rQ   	enumerate_iter_collection_raw_pathsr   
get_matrixrb   r  r   r   rY   rI   rV   _iter_collectionrK  r0  r.   r   r$  ) r?   r   master_transformpathsall_transformsoffsetsoffset_trans
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_attrsrM   r   r   r   r^    sd   	






z RendererSVG.draw_path_collectionc                 C   s   |  |||| d S r   )_draw_gouraud_triangle)r?   r   pointscolorsrX  r   r   r   draw_gouraud_triangle"  s   z!RendererSVG.draw_gouraud_trianglec              
   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colorAddr2  feCompositeinSourceGraphicBackgroundImage
arithmetic1)rM   in2operatork2k3colorMatfeColorMatrixrn   re   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 )rM   r  r   )axisrT   r   r  rG   r3  r   linearGradientzGR%x_%dr   )rW   gradientUnitsx1y1x2y2stop)z
stop-colorzstop-opacity)r  r   r2   zM r   z L rf   z Zr
  
crispEdges)r   r  r  shape-renderingrt   r6  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   rQ   rY   rV   r   averager   r   ranger   r.   ru   r   )r?   r   r{  r|  rX  r   	avg_colorrL  tpointsrs  r  r  r  r  x3y3
rgba_colorxbybm1b1m2b2dpathr   r   r   rz  &  s   







 
z"RendererSVG._draw_gouraud_trianglec                 C   sT   | j jdi | | | }t||D ]\}}| |||| q| j d d S )Nr6  rS  )r   rQ   r0  frozenziprz  rV   )r?   r   triangles_arraycolors_arrayr   tricolr   r   r   draw_gouraud_triangles  s
   z"RendererSVG.draw_gouraud_trianglesc                 C   rZ   r]   r   r[   r   r   r   option_scale_image  r\   zRendererSVG.option_scale_imagec                 C   s
   | j d S )N      R@)r   r[   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 ) Nr3  r   r6  rG  rH  rt   zsvg.image_inlinepng)r4   imagezdata:image/png;base64,
rC  zLCannot save image data to filesystem when writing SVG to an in-memory bufferz{}.image{}.pngz$Writing image file for inclusion: %sIm_rW   r  )rb   )rG   rT   rc   )r   r0   r   r   r   rM   r   r  r   r<  re   r   z5image-rendering:crisp-edges;image-rendering:pixelatedr   )r   r   rM   rS  )#shaper0  r   rQ   rK  get_gidr   r   r   r   	fromarraysaver   getvaluebase64	b64encoderE  r   r   r4   nextr   _logr~   r   rY   rp   r.   r   r  r   rb   rc   r  rV   )r?   r   r0   r   imr   r   r.  ry  rx  rM   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
  )rb   )g      ?)rW   r   r   N)r   rQ   rK   _adjust_char_idr  r   rY   rp   rV   r   r   )r?   glyph_map_newr   char_idrT  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 )N#000000r  r  rG   r  rc   rd   rb   r   r   r6  rt   T)	glyph_mapreturn_new_glyphs_onlyrH  rP  r<  r0   r   rR  TeX)r   rM   Fr   r
  r4  )r   rR   r   
_text2pathr   r  get_size_in_pointsr  r  r.   
FONT_SCALEru   rp   rQ   	_get_fontget_glyphs_with_fontr  rY   get_glyphs_texget_glyphs_mathtextr  r   r  rV   ) r?   r   r0   r   r   propangleismathmtextr   r  	text2pathcolorfontsizer   r  
font_scalerM   font_glyphs
glyph_infor  rectsglyph_id	xposition	ypositionrb   r  vertsr  r
  r  r   r   r   _draw_text_as_path  sx   






	





zRendererSVG._draw_text_as_pathc	           &   	      s  | j }	t| }
i }|
dkr|
|d< | r| n| d }|dkr+t||d< |s2i }g }| dkr?||  | dkrL||  t	j
|  }|dkr]||  dd	 fd
d  fdd}|t|  ddt||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< td| ||ffg|d< n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r~||#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 qd|- D ]F\}}$|$.  t/d'd( |$D dkrt0|$d d }%n
dd)d* |$D }%|dd+d* |$D |%d,}|	j d-d.d/d* |$D |d! q|	1d  |D ]\}}}}|	j d0t|t| d t|t|d1 q#|	1d# d S )2Nr  r  r  rG   r  normali  c                 S   s   | dv rdS | S )N)sansz
sans serifz
sans-serifr   )r   r   r   r   _normalize_sansz  r%  z7RendererSVG._draw_text_as_text.<locals>._normalize_sansc                 3   s:     | } | t jv rt j| D ]} |V  q| V  d S r   )fmfont_family_aliasesFontManager_expand_aliases)fnr   )r  r   r   _expand_family_entry}  s   

z<RendererSVG._draw_text_as_text.<locals>._expand_family_entryc                    s    fdd|   D S )Nc                    s0   g | ]} |D ]}|t jv r|nt|qqS r   )r  r  repr)rh   entryr   r  r   r   
<listcomp>  s    zQRendererSVG._draw_text_as_text.<locals>._get_all_quoted_names.<locals>.<listcomp>)
get_family)r  r  r   r   _get_all_quoted_names  s   
z=RendererSVG._draw_text_as_text.<locals>._get_all_quoted_namespxz, rf   r  zfont-stretchr   r   anchorrQ   rV   middle)leftrightcenterztext-anchorr0   r   rd   r   rc   rS   rt   r   r6  r         c                 S   s   h | ]\}}}|qS r   r   )rh   r0   r   tr   r   r   	<setcomp>  s    z1RendererSVG._draw_text_as_text.<locals>.<setcomp>c                 s       | ]	}t |d  V  qdS )rG   N)r|   rh   cr   r   r   ri         z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c                 s   r  )r   Nr-   r  r   r   r   ri     r  )r   r0   r   tspanrB   c                 s   r  )r3  N)chrr  r   r   r   ri     r  r  r5  )2r   r   r  r  r  r.   	get_stylerI   get_variantr  weight_dict
get_weightextendget_sizerC   r   fromkeysget_stretchru   get_rotation_modeget_transformr   get_unitless_positionr   r   deg2radarraysincosdotget_harp   rY   rR   r  mathtext_parserparserQ   ttfFontPropertyr   variantweightr   stretch
setdefaultrK   sortrJ   r|   rV   )&r?   r   r0   r   r   r  r  r  r  r   r  r   r  rM   
font_partsr  r  r   axay	angle_raddir_vertv_offsetha_mpl_to_svgr   r   descentglyphsr  spansr  r  thetextnew_xnew_yr  charsysr   )r  r  r   _draw_text_as_textb  s   














zRendererSVG._draw_text_as_textFc	           
   
   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 )Nr6  rG  rH  zsvg.fonttyper
  rS  )	r0  r   rQ   rK  r   r   r  r*  rV   )
r?   r   r0   r   r   r  r  r  r  ry  r   r   r   	draw_text  s   
zRendererSVG.draw_textc                 C   rZ   r]   r   r[   r   r   r   flipy  r\   zRendererSVG.flipyc                 C   s   | j | jfS r   )r   r   r[   r   r   r   get_canvas_width_height  rr   z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S r   )r  get_text_width_height_descent)r?   r   r  r  r   r   r   r.  #  r:  z)RendererSVG.get_text_width_height_descent)Nr   r   )NNNN)FN)%r^   r_   r`   rA   r   r   r   r   r   r   r   r#  r$  r0  r   r8  r9  r;  r  rM  rZ  r^  r}  rz  r  r  r  r  r  r  r  r*  r+  r,  r-  r.  __classcell__r   r   r   r   r   >  sR    &{		,-




': 
O

F 
#r   c                       sJ   e Zd ZdddZdZdddddZdd	 Zd
d Z fddZ  Z	S )FigureCanvasSVGzScalable Vector Graphics)r   svgzr   N)bbox_inches_restorer   c                C   s   t j|dddI}t |std|}| jj}d| j_| j \}}|d |d }}	t| j|||t	||	|||d|d}
| j
|
 |
  W d   dS 1 sTw   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)encodingr   )r   r   )r2  N)r   open_file_cmfile_requires_unicodecodecs	getwriterfiguredpiget_size_inchesr   r   drawr   )r?   r  r2  r   fhr9  r   r   r.  r   rendererr   r   r   	print_svg.  s    


"zFigureCanvasSVG.print_svgc              	   K   s   t |d0}tjd|d}| j|fi |W  d    W  d    S 1 s)w   Y  W d    d S 1 s9w   Y  d S )Nwbr.  )modefileobj)r   r4  gzipGzipFiler>  )r?   r  kwargsr<  
gzipwriterr   r   r   
print_svgz\  s   RzFigureCanvasSVG.print_svgzc                 C   rZ   )Nr   r   r[   r   r   r   get_default_filetypea  s   z$FigureCanvasSVG.get_default_filetypec                    s   | j   t  S r   )r8  draw_without_renderingr   r;  r[   r   r   r   r;  d  s   

zFigureCanvasSVG.draw)
r^   r_   r`   	filetypes	fixed_dpir>  rF  rG  r;  r/  r   r   r   r   r0  (  s    .r0  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jZeZdS )_BackendSVGN)r^   r_   r`   r   r   backend_versionr0  FigureCanvasr   r   r   r   rK  s  s    rK  r   )Dr  r6  r   rB  r   ior   r   loggingr   rer   numpyr   PILr   
matplotlibr   r   r   r   r  matplotlib.backend_basesr   r   r	   r
   !matplotlib.backends.backend_mixedr   matplotlib.colorsr   matplotlib.datesr   matplotlib.pathr   r   matplotlib.transformsr   r   	getLoggerr^   r  
deprecatedr   r   compiler'   r&   r$   r)   r(   r,   r1   r.   r6   rp   rq   ru   rv   r  r   r   r   r0  FigureManagerSVGr   exportrK  r   r   r   r   <module>   sz    
)



	
        qA