a
    s=ic                     @   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*Z+ej,ddddd Z-dd Z.e
/dZ0ej,ddddd Z1dd Z2ej,ddddd Z3dd Z4dd Z5ej,dd dd!d" Z6d#d$ Z7G d%d& d&Z8d'd( Z9e,dd>d)d*Z:d+d, Z;e,dd?d-d.Z<d/d0d1d2Z=d3d4 Z>d5d6 Z?G d7d8 d8eZ@G d9d: d:eZAeZBd;ZCejDG d<d= d=eZEd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   s   t | S N)_escape_cdatas r   p/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/matplotlib/backends/backend_svg.pyescape_cdataE   s    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   s   t | S r   )_escape_attribr   r   r   r   escape_attrib^   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   r&   c   s    r&   c                 C   s@   d| vrdt |  d S d| vr0dt |  d S dt|  d S )Nr)   r(   )r   r&   r   r   r   r   _quote_escape_attribl   s    r*   z#a vendored copy of _short_float_fmtc                 C   s   t | S r   _short_float_fmtxr   r   r   short_float_fmtr   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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hasattrr5   _XMLWriter__open_XMLWriter__tags_XMLWriter__data_XMLWriter__indentation)selffiler   r   r   __init__   s    
zXMLWriter.__init__Tc                 C   sP   | j r&|r| d n
| d d| _ | jrLd| j}| t| g | _d S )Nz>
r   r    )r9   r7   r;   joinr   )r=   indentdatar   r   r   Z__flush   s    
zXMLWriter.__flushc                 K   s   |    t|}g | _| j| | | jdt| jd   | d|  i || D ].\}}|r^t|}t	|}| d||f  q^d| _
t| jd S )a&  
        Open a new element.  Attributes can be given as keyword
        arguments, or as a string/string dictionary. The method returns
        an opaque identifier that can be passed to the :meth:`close`
        method, to close all open elements up to and including this one.

        Parameters
        ----------
        tag
            Element tag.
        attrib
            Attribute dictionary.  Alternatively, attributes can be given as
            keyword arguments.

        Returns
        -------
        An element identifier.
        N   z<%sz %s=%s)_XMLWriter__flushr   r;   r:   appendr7   r<   lenitemsr*   r9   )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 -->
)rE   r7   r<   rG   r:   r"   )r=   commentr   r   r   rO      s    	zXMLWriter.commentc                 C   s   | j | dS )z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r;   rF   )r=   textr   r   r   rC      s    	zXMLWriter.dataNc                 C   s   |r@| j sJ d| t|| j d ksNJ d| j d |f n| j sNJ d| j  }| jrj| | n| jrd| _| d dS |r| | jdt| j   | d|  dS )	a  
        Close the current element (opened by the most recent call to
        :meth:`start`).

        Parameters
        ----------
        tag
            Element tag.  If given, the tag must match the start tag.  If
            omitted, the current element is closed.
        zunbalanced end(%s)zexpected end(%s), got %szunbalanced end()r   z/>
Nz</%s>
)	r:   r   popr;   rE   r9   r7   r<   rG   )r=   rI   rB   r   r   r   end   s     

zXMLWriter.endc                 C   s   t | j|kr|   q dS )z
        Close open elements, up to (and including) the element identified
        by the given identifier.

        Parameters
        ----------
        id
            Element identifier, as returned by the :meth:`start` method.
        N)rG   r:   rS   )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)rB   N)rN   rC   rS   )r=   rI   rP   rJ   rK   r   r   r   element   s    
zXMLWriter.elementc                 C   s   dS )zFlush the output stream.Nr   r=   r   r   r   r5   	  s    zXMLWriter.flush)T)NT)__name__
__module____qualname____doc__r?   rE   rN   rO   rC   rS   rU   rV   r5   r   r   r   r   r4      s   	
!
r4   c              	   C   s   g }| D ]~\}}|dkr(|dks|dks|dkr8|dks|dkrJ|dkrJq|dkrdt |trd| }|d	|d
dd |D f  qd
|S )Nscale)rD   )rD   rD   	translate)r   r   rotate)r   matrixz%s(%s) c                 s   s   | ]}t |V  qd S r   r+   ).0r.   r   r   r   	<genexpr>      z&_generate_transform.<locals>.<genexpr>)
isinstancer   Z	to_valuesrF   rA   )transform_listpartstypevaluer   r   r   _generate_transform  s$    
ri   c                 C   s   t | pg S r   )ri   )re   r   r   r   generate_transform  s    rj   c                 C   s   d dd |  D S )Nz; c                 s   s    | ]\}}| d | V  qdS )z: Nr   ra   rL   rM   r   r   r   rb   "  rc   z _generate_css.<locals>.<genexpr>)rA   rH   rJ   r   r   r   _generate_css!  s    rm   c                 C   s   t | pi S r   )rm   rl   r   r   r   generate_css%  s    rn   Zsquarebuttround)Z
projectingro   rp   c                 C   s(   t | ts$td| dt|  dd S )NInvalid type for z metadata. Expected str, not r1   )rd   str	TypeErrorrg   )infokeyr   r   r   _check_is_str-  s    

rv   c                 C   sX   t | r:| D ](}t|tstd| dt| dqntd| dt|  dd S )Nrq   z) metadata. Expected iterable of str, not r1   z0 metadata. Expected str or iterable of str, not )npiterablerd   rr   rs   rg   )infosru   rt   r   r   r   _check_is_iterable_of_str3  s    



rz   c                       s>  e Zd ZdHd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dIddZdd Zd d! ZdJd"d#ZdKd$d%ZdLd&d'Z fd(d)Zd*d+ Zd,d- Zd.d/ Zd0d1 ZdMd2d3Zd4d5 Zd6d7 ZdNd8d9ZdOd:d;Zdd<d=d>ZdPd@dAZ dBdC Z!dDdE Z"dFdG Z#  Z$S )QRendererSVGNH   )metadatac          	   	      s   || _ || _t|| _|| _|d u r>t|dd}t|ts>d}|| _i | _	t
 | _i | _i | _d| _i | _d| _d| _t   t | _t|}t|}|t | jjdd| d| d||f dd	d
did| _| | |   d S )Nnamer@   r   Fsvgz%sptz	0 0 %s %szhttp://www.w3.org/2000/svgz1.1zxmlns:xlinkzhttp://www.w3.org/1999/xlink)widthheightZviewBoxZxmlnsversionrJ   )r   r   r4   writer	image_dpigetattrrd   rr   basename_groupd	itertoolscount_image_counter_clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientssuperr?   dict
_glyph_mapr,   r6   	svgPrologrN   	_start_id_write_metadata_write_default_style)	r=   r   r   Z	svgwriterr   r   r}   Z
str_heightZ	str_width	__class__r   r   r?   ?  sB    






zRendererSVG.__init__c                 C   s,   |    |   | j| j | j  d S r   )_write_clips_write_hatchesr   rU   r   r5   rW   r   r   r   finalizee  s    zRendererSVG.finalizec                    sP  |d u ri }dddt j dd|}| j d|v rT|d }t|d  jd|d |d	d }|d ur&t|tr||g}nt|tjtj	fr|
 g}n|t|rg }|D ]P}t|tr|| qt|tjtj	fr||
  qtd
t| dqntdt| dd||d	< nRd	|vrxtd}|rft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 ]F}	||	d }
|
d ur||}t|
|	  jd|	  |
d qdD ]}	||	d }|d u r&qt|tr8|g}t||	 ||} d|	   |D ](} d  jd|d  d qb d|	   q|dd }|d ur t|tr|g}t|d ||} d  d |D ]} jd|d q d  d |d ur4 | |rLtdd | d S )!Nzimage/svg+xmlz&http://purl.org/dc/dcmitype/StillImagezMatplotlib vz, https://matplotlib.org/)FormatTypeCreatorTitletitle)rP   DatezQInvalid type for Date metadata. Expected iterable of str, date, or datetime, not r1   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:rdfrl   zcc:Work)rN   )midr   r   r   ensure_metadata  s    


z4RendererSVG._write_metadata.<locals>.ensure_metadatar   zdc:typezrdf:resourcerl   )	r   ZCoverager   Descriptionr   Z
IdentifierZLanguageZRelationSourcezdc:)r   ZContributorZ	PublisherZRightszcc:Agentzdc:titleKeywordsz
dc:subjectzrdf:Bagzrdf:liz.Unknown metadata key(s) passed to SVG writer: ,)mpl__version__r   rv   rV   getrd   rr   datetimedate	isoformatrw   rx   rF   rs   rg   rA   osgetenvutcfromtimestampintr!   r   todayrR   lowerrz   rN   rS   rU   
ValueError)r=   r}   r   r   datesdr   r   uriru   rt   ZagentsZ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 )	Nrp   ro   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})rg   rP   )r   rm   rN   rV   rS   )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   rcParamsrr   uuiduuid4hashlibsha256updateencode	hexdigest)r=   rg   contentsaltmr   r   r   _make_id  s    
zRendererSVG._make_idc                 C   s   |t  ddd| j S )NrD   rQ   r   )r   r\   r]   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 rp| d|}| ||f|f| j|< n|\}}|S )z,
        Create a new hatch pattern
        Nh)tupleZget_hatch_color	get_hatchr   r   r   get_hatch_path)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 ]\\}}}}|jd|dddt|t|d | j|t |dd	d	|d
d}|d u rd}nt
|}|jdddt|d t|d |d t
|t
|ttjd ddd}	|d dk rt|d |	d< |jd|t|	d |d q,|d d S )Nr|   r   patternuserSpaceOnUser0   )rT   ZpatternUnitsr.   yr   r         ?      r   FsimplifynonerectrD   )r.   r   r   r   fillzhatch.linewidthro   Zmiter)r   strokestroke-widthr   r      stroke-opacitypath)r   r   )rG   r   r   rN   valuesrr   _convert_pathr   r\   r]   r   rV   r   r   rm   rS   )
r=   Z
HATCH_SIZEr   r   Zfacer   r   	path_datar   Zhatch_styler   r   r   r     s`    



zRendererSVG._write_hatchesc           	      C   s  i }|  }| durbd| || |d< |durt|dkr|d dkr|st|d |d< n^|du rtd|d< nLt|dd d	krt||d< t|dkr|d dkr|st|d |d< |r| dkrt| |d
< | \}}|durd	dd |D |d< tt
||d< | }|r| }t||d< |sd|d dkrdt|d |d< |dkrzt||d< | dkr| |d< | dkrt|  |d< |S )z=Generate a style string from the GraphicsContext and rgbFace.Nzurl(#%s)r      r   r   fill-opacityr   )r   r   r   opacityr   c                 s   s   | ]}t |V  qd S r   r+   )ra   valr   r   r   rb   S  s   z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetr   r   r   rp   r   ro   r   )get_forced_alphar   r   rG   r,   r   r   	get_alphaZ
get_dashesrA   floatZget_linewidthget_rgbZget_joinstyleZget_capstyle_capstyle_d)	r=   r   r   rJ   Zforced_alphaoffsetseqZ	linewidthrgbr   r   r   _get_style_dict9  sJ     



zRendererSVG._get_style_dictc                 C   s   t | ||S r   )rm   r   )r=   r   r   r   r   r   
_get_stylef  s    zRendererSVG._get_stylec                 C   s   |  }| \}}|d ur8| |}t|t|f}n6|d urj|j\}}}}	| j||	  }||||	f}ni S | j|}
|
d u r| 	d|}|d ur||f|f| j|< q||f| j|< n|
\}
}dd| diS )Npz	clip-pathzurl(#))
Zget_clip_rectangleZget_clip_pathr   rT   rr   Zboundsr   r   r   r   )r=   r   Zcliprectclippathclippath_transr   r.   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 ]\}}|jd|d t |dkrr|\}}| j||dd}|jd|d n0|\}}}	}
|jd	t|t|t|	t|
d
 |d q(|d d S )Nr   ZclipPathrT      Fr   r   r   r   r.   r   r   r   )	rG   r   r   rN   r   r   rV   r,   rS   )r=   r   r  r   r  r  r   r.   r   r  r   r   r   r   r     s,    

zRendererSVG._write_clipsc                 C   sP   |r| j jd|d n6| j|dd | j|< | j jdd|| j| f d d S )Ngr  r   rD   z%s_%d)r   rN   r   r   )r=   r   gidr   r   r   
open_group  s    zRendererSVG.open_groupc                 C   s   | j d d S )Nr
  )r   rS   )r=   r   r   r   r   close_group  s    zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   rW   r   r   r   option_image_nocomposite  s    z$RendererSVG.option_image_nocompositec              
   C   s<   |rdd| j | jf}nd }t|||||dg dddS )N           )   M   L   Q   C   zFascii)r   r   r   Z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rb| jdd| i | jjdd|i| 	|d| 
||i | d ur| jd d S )N)r  r   r  a
xlink:hrefr   r   r   )r   )r   r   Zshould_simplifyr   Zget_sketch_paramsget_urlr   rN   rV   r  r   rS   )	r=   r   r   r   r   trans_and_flipr  r   r   r   r   r   	draw_path  s    


zRendererSVG.draw_pathc                 C   sn  t |jsd S | j}| j||t dd dd}| ||}	|t|	f}
| j	|
}tdd |	
 D }	|d u r| d|
}|d |jd	|||	d
 |d || j|
< |jdi | | | |}dd| i}dd| jd | jd f}|j||ddD ]Z\}}t |r|dd  \}}t||d< t||d< | |||d< |jd|d q|d d S )Nr   r   Fr   c                 S   s    i | ]\}}| d r||qS )r   )
startswithrk   r   r   r   
<dictcomp>  s   
z,RendererSVG.draw_markers.<locals>.<dictcomp>r   r   r   )rT   r   r   r
  r  #%sr   r|   )r  r   r.   r   r   userl   )r
  )rG   verticesr   r   r   r\   r   rm   r   r   rH   r   rN   rV   rS   r  r   r   r   iter_segmentsr,   r   )r=   r   Zmarker_pathZmarker_transr   transr   r   r   r   r   r   r  rJ   r  r#  coder.   r   r   r   r   draw_markers  s@    





zRendererSVG.draw_markersc                     s  t |dkrt |d jnd}| |||||}|d|  d |d | k }|stt |||||||||	|
|||S | j}g }|d t| |||D ]b\}\}}t	|
 dd}| j||dd	}d
| j|| d|f }|jd||d || q|d | |||||||	|
|||D ]\}}}}}| }|d urX|jdd|id | |}|rx|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   )rT   r   r  r  rl   r
  r   )r  r.   r   r   r"  rD   )r
  )rG   r#  Z_iter_collection_uses_per_pathr   draw_path_collectionr   rN   	enumerateZ_iter_collection_raw_pathsr   Z
get_matrixr\   r   r   r   rV   rF   rS   Z_iter_collectionr  r  r,   r   r   ) r=   r   Zmaster_transformpathsZall_transformsoffsetsZoffset_transZ
facecolorsZ
edgecolorsZ
linewidthsZ
linestylesZantialiasedsurlsZoffset_positionZlen_pathZuses_per_pathZshould_do_optimizationr   Z
path_codesir   r   r   r   ZxoZyoZpath_idZgc0r   url
clip_attrsrJ   r   r   r   r*    sb    	







z RendererSVG.draw_path_collectionc              
   C   s  | j }| jspd| _|jddd |jdddidd	d
d
d |d |jddd |jdddidd |d tj|dd}|d dkrd S | |}||}|d t	dD ]8}	||	 \}
}||	d d  \}}||	d d  \}}||	 }||kr
|}|}nd||kr|
}|}nP|| ||  }|||  }d|  }|||
  }| | ||  }|| | }|jdd| j
|	f dt|
t|t|t|d |jdd
tt|t|d dd  |jdd!tt|d!dd  |d q|d d"t|
 d# t| }|d$t| d# t| 7 }|d%t| d# t| d& 7 }|jd'|t|d
d(d)d* |jd+d,d!d(d-d.d* |jd'|d/| j
 d(d0d* |jd'|d1| j
 d2d(d3d* |jd'|d4| j
 d2d(d3d* |d+ |  j
d7  _
d S )5NTfilterZcolorAddr  ZfeCompositeinZSourceGraphicZBackgroundImageZ
arithmetic1)rJ   Zin2operatork2Zk3ZcolorMatZfeColorMatrixrg   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 )rJ   r   r   )ZaxisrQ   r   r   rD   r  r   ZlinearGradientzGR%x_%dr   )rT   ZgradientUnitsx1y1x2y2stop)z
stop-colorzstop-opacity)r   r   r0   zM r   z L r`   z Zr   
crispEdges)r   r   r   shape-renderingrl   r
  r   zurl(#colorMat))r   r   r=  r2  zurl(#GR%x_0))r   r   r=  zurl(#GR%x_1)zurl(#colorAdd))r   r   r2  r=  zurl(#GR%x_2))r   r   rN   rV   rS   rw   Zaverager   r   ranger   r,   rm   r   )r=   r   Zpointscolorsr%  r   Z	avg_colorr  Ztpointsr/  r7  r8  r9  r:  Zx3Zy3Z
rgba_colorxbZybm1b1m2b2dpathr   r   r   draw_gouraud_triangle"  s    









 
z!RendererSVG.draw_gouraud_trianglec                 C   sT   | j jdi | | | }t||D ]\}}| |||| q*| j d d S )Nr
  )r
  )r   rN   r  frozenziprF  rS   )r=   r   Ztriangles_arrayZcolors_arrayr   Ztricolr   r   r   draw_gouraud_triangles  s
    z"RendererSVG.draw_gouraud_trianglesc                 C   s   dS NTr   rW   r   r   r   option_scale_image  s    zRendererSVG.option_scale_imagec                 C   s
   | j d S )N      R@)r   rW   r   r   r   get_image_magnification  s    z#RendererSVG.get_image_magnificationc              	   C   sb  |j d d \}}|dks"|dkr&d S | |}|rF| jjdi | | }	|	d urj| jjdd|	id i }
| }tjd rt }t	
|j|dd	 |p| d
| }dt| d |
d< n`| jd u rtdd| jt| j}td| t	
|| |p"d| d
| }||
d< ||
d< |d u rd| | j }d| | j }| jjd
tddd| ffgt|t| j| |  t|t||
d n| }|dkrt||
d< t d| d| | t  ||dd d| j }td|! fg|
d< d|
d< | jjd
t|t||
d |	d urL| j"d |r^| j"d d S ) Nr  r   r
  r  r  rl   zsvg.image_inlineZpng)r2   imagezdata:image/png;base64,
r  zLCannot save image data to filesystem when writing SVG to an in-memory bufferz{}.image{}.pngz$Writing image file for inclusion: %sZIm_rT   rM  )r\   )rD   rQ   r]   )r   r.   r   r   r   rJ   r   r   r   r  r_   r   z5image-rendering:crisp-edges;image-rendering:pixelatedr   )r   r   rJ   )r
  )#shaper  r   rN   r  Zget_gidr   r   r   r   Z	fromarraysaver   getvaluebase64	b64encoder  r   r   r2   nextr   _logrt   r   rV   ri   r,   r   r   r   r\   r]   rG  rS   )r=   r   r.   r   Zimr   r   r  r1  r0  rJ   r   buffilenamealphaZflippedr   r   r   
draw_image  s    



	

zRendererSVG.draw_imagec                 C   s~   | j }|rz|d | D ]F\}\}}| |}| jt|d |dd}|jd||tdgd q|d | j	
| dS )	zn
        Emit definitions for not-yet-defined glyphs, and record them as having
        been defined.
        r   @   Fr   r   )r\   )g      ?)rT   r   r   N)r   rN   rH   _adjust_char_idr   r   rV   ri   rS   r   r   )r=   glyph_map_newr   char_idr#  codesr   r   r   r   _update_glyph_map_defs  s    


z"RendererSVG._update_glyph_map_defsc                 C   s   | ddS )Nz%20r   r    )r=   r^  r   r   r   r\    s    zRendererSVG._adjust_char_idc	                  C   s"  | j }	|	| | j}
| j}t| }| }i }|dkrD||d< | rT| n
| d }|dkrtt	||d< ||j
 }t|td||ffd| ffd|| ffgd	}|	jd
|d |sN||}|j|||
dd}|\}}}| | |D ]R\}}}}dd| i}|dkr&t	||d< |dkr<t	||d< |	jd|d qn|dkrl|j|||
dd}n|j|||
dd}|\}}}| | |D ]F\}}}}| |}|	jdtd||ffd|ffgdd| id q|D ]0\}}t||}| j|dd}|	jd|d q|	d
 dS )a]  
        Draw the text by converting them to paths using the textpath module.

        Parameters
        ----------
        s : str
            text to be converted
        prop : `matplotlib.font_manager.FontProperties`
            font property
        ismath : bool
            If True, use mathtext parser. If "TeX", use *usetex* mode.
        #000000r   r   rD   r   r]   r^   r\   r   r   r
  rl   T)	glyph_mapZreturn_new_glyphs_onlyr  r   r  r.   r   r"  TeX)r   rJ   Fr   r   r  N)r   rO   r   
_text2pathr   r   Zget_size_in_pointsr   r   r,   Z
FONT_SCALErm   ri   rN   Z	_get_fontZget_glyphs_with_fontr`  rV   Zget_glyphs_texZget_glyphs_mathtextr\  r   r   rS   ) r=   r   r.   r   r   propangleismathmtextr   rc  Z	text2pathcolorfontsizer   rY  Z
font_scalerJ   fontZ_glyphsZ
glyph_infor]  rectsZglyph_idZ	xpositionZ	ypositionr\   r^  Zvertsr_  r   r   r   r   r   _draw_text_as_path  sv    
















zRendererSVG._draw_text_as_pathc	           %      C   sx  | j }	t| }
i }|
dkr&|
|d< | r6| n
| d }|dkrVt||d< |sNi }g }| dkr~||  | dkr||  t	j
|  }|dkr||  |t|  dd	d
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< td| ||ffg|d< n td||ffd| ffg|d< |	jd||d n&|	 | | j!j"#|d|\}}}}}|	j$dt|td||ffd| ffgd  |	$d i }|D ]\}}}} }!t	%|}"g }|"j&dkr||"j& |"j'dkr||"j' |"j(dkr||"j(  |t| d|"j)g dd|i}|"j*dkrX|"j*|d< t|}|d!krnd"}|+|g | |! |f q|, D ]\}}#|#-  t.d#d$ |#D dkrt/|#d d }$ndd%d |#D }$|dd&d |#D |$d'}|	jd(d)d*d |#D |d q|	0d |D ]8\}}}}|	jd+t|t| d t|t|d, q0|	0d d S )-Nra  r   r   rD   r   normali  Zpxz, c                 s   s   | ]}t |V  qd S r   )repr)ra   fr   r   r   rb     rc   z1RendererSVG._draw_text_as_text.<locals>.<genexpr>r`   rl  zfont-stretchr   r   anchorrN   rS   middle)leftrightcenterztext-anchorr.   r   r^   r   r]   rP   rl   r|   r
  rb         c                 S   s   h | ]\}}}|qS r   r   )ra   r.   r   tr   r   r   	<setcomp>  rc   z1RendererSVG._draw_text_as_text.<locals>.<setcomp>c                 s   s   | ]}t |d  V  qdS )rD   N)rr   ra   cr   r   r   rb     rc   c                 s   s   | ]}t |d  V  qdS )r   Nr+   r{  r   r   r   rb     rc   )r   r.   r   Ztspanr@   c                 s   s   | ]}t |d  V  qdS )r  N)chrr{  r   r   r   rb     rc   r   r	  )1r   r   r   r   r   r,   	get_stylerF   get_variantfmZweight_dictZ
get_weightextendget_sizerA   Z
get_familyZget_stretchrm   Zget_rotation_modeZget_transformr   Zget_unitless_positionr   rw   Zdeg2radarraysincosdotZget_hari   rV   rO   re  Zmathtext_parserparserN   ZttfFontPropertyr   variantweightr~   Zstretch
setdefaultrH   sortrG   rr   rS   )%r=   r   r.   r   r   rf  rg  rh  ri  r   rj  r   rY  rJ   Z
font_partsr  r   axZayZ	angle_radZdir_vertZv_offsetZha_mpl_to_svgr   r   ZdescentZglyphsrm  spansrl  rk  ZthetextZnew_xZnew_yentrycharsZysr   r   r   _draw_text_as_textk  s    














zRendererSVG._draw_text_as_text)ri  c             	   C   s   | j ||||||dd d S )Nrd  )rh  )rn  )r=   r   r.   r   r   rf  rg  ri  r   r   r   draw_tex  s    zRendererSVG.draw_texFc	           
   
   C   s   |  |}	|	r | jjdi |	 | d urB| jdd| i tjd dkrj| |||||||| n| |||||||| | d ur| jd |	r| jd d S )Nr
  r  r  zsvg.fonttyper   )r
  )	r  r   rN   r  r   r   rn  r  rS   )
r=   r   r.   r   r   rf  rg  rh  ri  r1  r   r   r   	draw_text  s    
zRendererSVG.draw_textc                 C   s   dS rK  r   rW   r   r   r   flipy  s    zRendererSVG.flipyc                 C   s   | j | jfS r   )r   r   rW   r   r   r   get_canvas_width_height  s    z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S r   )re  get_text_width_height_descent)r=   r   rf  rh  r   r   r   r    s    z)RendererSVG.get_text_width_height_descent)Nr|   )N)NNNN)N)N)N)N)N)FN)%rX   rY   rZ   r?   r   r   r   r   r   r   r   r   r   r  r   r  r  r  r   r  r'  r*  rF  rJ  rL  rN  rZ  r`  r\  rn  r  r  r  r  r  r  __classcell__r   r   r   r   r{   >  sP   &{		,-
  


 
': 
O
Q
 
r{   c                       sb   e Zd ZdddZdZe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)r   Zsvgzr|   z3.5argsN)bbox_inches_restorer}   c                G   s   t j|ddd}t |s*td|}| jj}d| j_| j \}}|d |d  }	}
t| j|||t	|	|
|||d|d}| j
| |  W d   n1 s0    Y  dS )a  
        Parameters
        ----------
        filename : str or path-like or file-like
            Output target; if a string, a file will be opened for writing.

        metadata : dict[str, Any], optional
            Metadata in the SVG file defined as key-value pairs of strings,
            datetimes, or lists of strings, e.g., ``{'Creator': 'My software',
            'Contributor': ['Me', 'My Friend'], 'Title': 'Awesome'}``.

            The standard keys and their value types are:

            * *str*: ``'Coverage'``, ``'Description'``, ``'Format'``,
              ``'Identifier'``, ``'Language'``, ``'Relation'``, ``'Source'``,
              ``'Title'``, and ``'Type'``.
            * *str* or *list of str*: ``'Contributor'``, ``'Creator'``,
              ``'Keywords'``, ``'Publisher'``, and ``'Rights'``.
            * *str*, *date*, *datetime*, or *tuple* of same: ``'Date'``. If a
              non-*str*, then it will be formatted as ISO 8601.

            Values have been predefined for ``'Creator'``, ``'Date'``,
            ``'Format'``, and ``'Type'``. They can be removed by setting them
            to `None`.

            Information is encoded as `Dublin Core Metadata`__.

            .. _DC: https://www.dublincore.org/specifications/dublin-core/

            __ DC_
        r  zutf-8)encodingr|   )r   r}   )r  N)r   open_file_cmZfile_requires_unicodecodecs	getwriterfiguredpiZget_size_inchesr   r{   drawr   )r=   rX  r  r}   r  fhr  r   r   r  r   rendererr   r   r   	print_svg%  s    "

zFigureCanvasSVG.print_svgc              	   O   s~   t |d^}tjd|d0}| j|fi |W  d    W  d    S 1 sR0    Y  W d    n1 sp0    Y  d S )Nwbr  )modefileobj)r   r  gzipGzipFiler  )r=   rX  r  kwargsr  Z
gzipwriterr   r   r   
print_svgzU  s
    zFigureCanvasSVG.print_svgzc                 C   s   dS )Nr   r   rW   r   r   r   get_default_filetype[  s    z$FigureCanvasSVG.get_default_filetypec                    s   | j   t  S r   )r  Zdraw_without_renderingr   r  rW   r   r   r   r  ^  s    
zFigureCanvasSVG.draw)rX   rY   rZ   	filetypesZ	fixed_dpir   Zdelete_parameterr  r  r  r  r  r   r   r   r   r    s   
/

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  ZFigureCanvasr   r   r   r   r  m  s   r  )N)N)FrS  r  r   r  r   ior   r   loggingr   rer   numpyrw   ZPILr   Z
matplotlibr   r   r   r   r  Zmatplotlib.backend_basesr   r   r	   r
   Z!matplotlib.backends.backend_mixedr   Zmatplotlib.colorsr   Zmatplotlib.datesr   Zmatplotlib.pathr   r   Zmatplotlib.transformsr   r   	getLoggerrX   rV  r   Zbackend_version
deprecatedr   r   compiler%   r$   r"   r'   r&   r*   r/   r,   r4   ri   rj   rm   rn   r   rv   rz   r{   r  ZFigureManagerSVGr   exportr  r   r   r   r   <module>   sz   
(



	
        hD