U
    Fvf                     @   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   s   t | S N)_escape_cdatas r   C/tmp/pip-unpacked-wheel-7vhvci0g/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| krdt |  d S d| k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|  || D ].\}}|rZt|}t	|}| d||f  qZd| _
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td| t|| j d ksNtd| j d |f n| j sNt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:   AssertionErrorr   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:   rT   )r=   idr   r   r   close   s    
zXMLWriter.closec                 K   s.   | j ||f| |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   rT   )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   rT   rV   rW   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>  s     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   rb   rL   rM   r   r   r   rc   "  s     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   )Zinfosru   rt   r   r   r   _check_is_iterable_of_str3  s
    

ry   c                       s8  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dJd$d%ZdKd&d'Z fd(d)Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdLd4d5Zd6d7 Zd8d9 ZdMd:d;ZdNd<d=ZdOd?d@Z dAdB Z!dCdD Z"dEdF Z#  Z$S )PRendererSVGNH   )metadatac          	   	      s   || _ || _t|| _|| _|d k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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   rV   r   r5   rX   r   r   r   finalizee  s    zRendererSVG.finalizec                    sV  |d kri }dddt j dd|}| j d|krT|d }t|d  jd|d |d	d }|d k	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	< nXd	|kr~td}|rltjt|tjj}|jtd
 |d	< ntj 
 |d	< d } fdd}|dd }|d k	r||} jdd|id dD ]F}	||	d }
|
d k	r||}t|
|	  jd|	  |
d qdD ]}	||	d }|d kr,qt|tr>|g}t||	 ||} d|	   |D ](} d  jd|d  d qh d|	   q|dd }|d k	r&t|tr|g}t|d ||} d  d |D ]} jd|d q d  d |d k	r: | |rRt 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 k	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RelationZSourcezdc:)r   ZContributorZ	PublisherZRightszcc:Agentzdc:titleZKeywordsz
dc:subjectzrdf:Bagzrdf:liz.Unknown metadata key(s) passed to SVG writer: ,)!mpl__version__r   rv   rW   getrd   rr   datetimedate	isoformatrw   rx   rF   rs   rg   rA   osgetenvfromtimestampinttimezoneutcr!   r   todayrS   lowerry   rN   rT   rV   
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   rW   rT   )r=   r   Zdefault_styler   r   r   r     s    
z RendererSVG._write_default_stylec                 C   sb   t jd }|d krtt }t }||d |t|d d||	 d d f S )Nzsvg.hashsaltutf8z%s%s
   )
r   rcParamsrr   uuidZuuid4hashlibsha256updateencode	hexdigest)r=   rg   contentZ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k	rt |}| }|dk	r(t |}| ||f}| j|}|dk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rgbFaceZedgedictkeyoid_r   r   r   
_get_hatch  s    zRendererSVG._get_hatchc           
   
   C   s*  t | jsd S d}| j}|d | j D ]\\}}}}|jd|dddt|t|d | j|t |dd	d	|d
d}|d k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   )rU   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   rW   r   r   rm   rT   )
r=   Z
HATCH_SIZEr   r   facer   r   	path_datar   Zhatch_styler   r   r   r     sl    

      

zRendererSVG._write_hatchesc           	      C   s  i }|  }| dk	rbd| || |d< |dk	rt|dkr|d dkr|st|d |d< n^|dk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k	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+   )rb   valr   r   r   rc   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	linewidthZ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 k	r8| |}t|t|f}n6|d k	rj|j\}}}}	| j||	  }||||	f}ni S | j|}
|
d kr| 	d|}|d k	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   rU   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   clipPathrU      Fr   r   r   r   r.   r   r   r   )	rG   r   r   rN   r   r   rW   r,   rT   )r=   r   r  r   r   r   r   r.   r   r  r   r   r   r   r     s0    

  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   rT   )r=   r   r   r   r   close_group  s    zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   rX   r   r   r   option_image_nocomposite  s    z$RendererSVG.option_image_nocompositec                 C   sB   |rdd| j | jf}nd }t|||||ddddddg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 ko| d k}|jo&|}| j||||| d}| d k	rb| jdd| i | jjdd|i| 	|d| 
||i | d k	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   rW   r  r   rT   )	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 kr| d|
}|d |jd	|||	d
 |d || j|
< |jd| | | |}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   )rU   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   rW   rT   r  r   r   r   Z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  sD    




  
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 k	rX|jdd|id | |}|rt|jd| d| t|t| j| | ||d}|jd|d |r|d |d k	r&|d q&|  jd7  _d S )Nr   	   r      r   r   r   Fr   z	C%x_%x_%sr@   r   )rU   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   rW   rF   rT   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(    s    	             
    

        




z RendererSVG.draw_path_collectionc                 C   s   |  |||| d S r   )_draw_gouraud_triangle)r=   r   pointscolorsr#  r   r   r   draw_gouraud_triangle"  s    z!RendererSVG.draw_gouraud_trianglec              
   C   s  | j }| jspd| _|jddd |jdddidd	d
d
d |d |jddd |jdddidd |d tj|dd}|d dkrd S | |}||}|d t	dD ]8}	||	 \}
}||	d d  \}}||	d d  \}}||	 }||kr
|}|}nd||kr|
}|}nP|| ||  }|||  }d|  }|||
  }| | ||  }|| | }|jdd| j
|	f dt|
t|t|t|d |jdd
tt|t|d dd  |jdd!tt|d!dd  |d q|d d"t|
 d# t| }|d$t| d# t| 7 }|d%t| d# t| d& 7 }|jd'|t|d
d(d)d* |jd+d,d!d(d-d.d* |jd'|d/| j
 d(d0d* |jd'|d1| j
 d2d(d3d* |jd'|d4| j
 d2d(d3d* |d+ |  j
d7  _
d S )5NTfilterZcolorAddr  feCompositeinZSourceGraphicZBackgroundImageZ
arithmetic1)rJ   Zin2operatorZk2Zk3ZcolorMat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   linearGradientzGR%x_%dr   )rU   gradientUnitsx1y1x2y2stop)z
stop-colorzstop-opacity)r   r   r0   zM r   z L ra   z Zr   Z
crispEdges)r   r   r   shape-renderingrl   r	  r   zurl(#colorMat))r   r   rA  r4  zurl(#GR%x_0))r   r   rA  zurl(#GR%x_1)zurl(#colorAdd))r   r   r4  rA  zurl(#GR%x_2))r   r   rN   rW   rT   rw   Zaverager   r   ranger   r,   rm   r   )r=   r   r1  r2  r#  r   Z	avg_colorr  Ztpointsr-  r<  r=  r>  r?  Zx3Zy3Z
rgba_colorxbZybm1Zb1m2Zb2dpathr   r   r   r0  &  s     







  

 
z"RendererSVG._draw_gouraud_trianglec                 C   sP   | j jd| | | }t||D ]\}}| |||| q&| j d d S )Nr	  )r	  )r   rN   r  frozenzipr0  rT   )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   rX   r   r   r   option_scale_image  s    zRendererSVG.option_scale_imagec                 C   s
   | j d S )N      R@)r   rX   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 | |}|rB| jjd| | }	|	d k	rf| jjdd|	id i }
| }tjd rt }t	
|j|dd	 |p| d
| }dt| d |
d< n`| jd krtdd| jt| j}td| t	
|| |pd| d
| }||
d< ||
d< |d k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 k	rH| j"d |rZ| 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_rU   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   rW   ri   r,   r   r   r   r]   r^   rG  rT   )r=   r   r.   r   Zimr   r   r  r/  r.  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      ?)rU   r   r   N)r   rN   rH   _adjust_char_idr   r   rW   ri   rT   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 )N#000000r   r   rD   r   r^   r_   r]   r   r   r	  rl   T)	glyph_mapZreturn_new_glyphs_onlyr  r  r  r.   r   r!  ZTeX)r   rJ   Fr   r   r  )r   rO   r   
_text2pathr   r   Zget_size_in_pointsr   r   r,   Z
FONT_SCALErm   ri   rN   Z	_get_fontZget_glyphs_with_fontr`  rW   Zget_glyphs_texZget_glyphs_mathtextr\  r   r   rT   ) 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  s    




   




      






zRendererSVG._draw_text_as_pathc	           &   	      s  | j }	t| }
i }|
dkr&|
|d< | r6| n
| d }|dkrVt||d< |shi }g }| dkr~||  | dkr||  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< |r4|dksX| dkr4| }|| \}}| 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r2||#j)  |t| d|#j*g dd|i}|#j+dkrr|#j+|d< t|}| d%krd&} |,|g |!|" | f q|- D ]\}}$|$.  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 ]8\}}}}|	j d0t|t| d t|t|d1 qJ|	1d# d S )2Nra  r   r   rD   r   normali  c                 S   s   | dkrdS | S )N)Zsansz
sans serifz
sans-serifr   )r}   r   r   r   _normalize_sansz  s    z7RendererSVG._draw_text_as_text.<locals>._normalize_sansc                 3   s8    | } | t jkr.t j| D ]} |V  q| V  d S r   )fmfont_family_aliasesZFontManagerZ_expand_aliases)fnr}   )ro  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kr"|nt|qqS r   )rp  rq  repr)rb   entryr}   rs  r   r   
<listcomp>  s   
 zQRendererSVG._draw_text_as_text.<locals>._get_all_quoted_names.<locals>.<listcomp>)Z
get_family)re  rv  r   r   _get_all_quoted_names  s    
z=RendererSVG._draw_text_as_text.<locals>._get_all_quoted_namesZpxz, ra   rk  zfont-stretchr   r   anchorrN   rT   Zmiddle)leftrightcenterztext-anchorr.   r   r_   r   r^   rP   rl   r{   r	  rb         c                 S   s   h | ]\}}}|qS r   r   )rb   r.   r   tr   r   r   	<setcomp>  s     z1RendererSVG._draw_text_as_text.<locals>.<setcomp>c                 s   s   | ]}t |d  V  qdS )rD   N)rr   rb   cr   r   r   rc     s     z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c                 s   s   | ]}t |d  V  qdS )r   Nr+   r  r   r   r   rc     s     )r   r.   r   Ztspanr@   c                 s   s   | ]}t |d  V  qdS )r  N)chrr  r   r   r   rc     s     r   r  )2r   r   r   r   r   r,   Z	get_stylerF   Zget_variantrp  Zweight_dictZ
get_weightextendget_sizerA   r   fromkeysZget_stretchrm   Zget_rotation_modeZget_transformr   Zget_unitless_positionr   rw   Zdeg2radarraysincosdotZget_hari   rW   rO   rd  Zmathtext_parserparserN   ZttfFontPropertyr   variantweightr}   Zstretch
setdefaultrH   sortrG   rr   rT   )&r=   r   r.   r   r   re  rf  rg  rh  r   ri  r   rY  rJ   Z
font_partsr  rx  r   ZaxZayZ	angle_radZdir_vertZv_offsetZha_mpl_to_svgr   r   ZdescentZglyphsrl  Zspansrk  rj  ZthetextZnew_xZnew_yru  charsZysr   )rs  ro  r   _draw_text_as_textb  s    














zRendererSVG._draw_text_as_textFc	           
   
   C   s   |  |}	|	r| jjd|	 | d k	r>| jdd| i tjd dkrf| |||||||| n| |||||||| | d k	r| jd |	r| jd d S )Nr	  r  r  zsvg.fonttyper   )r	  )	r  r   rN   r  r   r   rm  r  rT   )
r=   r   r.   r   r   re  rf  rg  rh  r/  r   r   r   	draw_text  s    
zRendererSVG.draw_textc                 C   s   dS rK  r   rX   r   r   r   flipy  s    zRendererSVG.flipyc                 C   s   | j | jfS r   )r   r   rX   r   r   r   get_canvas_width_height  s    z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S r   )rd  get_text_width_height_descent)r=   r   re  rg  r   r   r   r  #  s    z)RendererSVG.get_text_width_height_descent)Nr{   )N)NNNN)N)N)N)N)N)FN)%rY   rZ   r[   r?   r   r   r   r   r   r   r   r   r   r  r   r  r  r  r   r  r%  r(  r3  r0  rJ  rL  rN  rZ  r`  r\  rm  r  r  r  r  r  __classcell__r   r   r   r   rz   >  sP   &{		,-
  


 
': 
O
F
 #
rz   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~   Zsvgzr{   N)bbox_inches_restorer|   c                C   s   t j|ddd}t |s*td|}| jj}d| j_| j \}}|d |d  }}	t| j|||t	||	|||d|d}
| j
|
 |
  W 5 Q R X 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   rz   drawr   )r=   rX  r  r|   fhr  r   r   r  r   Zrendererr   r   r   	print_svg.  s"     
   zFigureCanvasSVG.print_svgc                 K   sX   t |dB}tjd|d(}| j|f|W  5 Q R  W  5 Q R  S Q R X W 5 Q R X d S )Nwbr  )modefileobj)r   r  gzipGzipFiler  )r=   rX  kwargsr  Z
gzipwriterr   r   r   
print_svgz\  s
    zFigureCanvasSVG.print_svgzc                 C   s   dS )Nr~   r   rX   r   r   r   get_default_filetypea  s    z$FigureCanvasSVG.get_default_filetypec                    s   | j   t  S r   )r  Zdraw_without_renderingr   r  rX   r   r   r   r  d  s    
zFigureCanvasSVG.draw)
rY   rZ   r[   	filetypesZ	fixed_dpir  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jZeZdS )_BackendSVGN)rY   rZ   r[   r   r   Zbackend_versionr  ZFigureCanvasr   r   r   r   r  s  s   r  )N)N)DrS  r  r   r  r   ior   r   loggingr   rer   Znumpyrw   ZPILr   Z
matplotlibr   r   r   r   rp  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   	getLoggerrY   rV  
deprecatedr   r   compiler%   r$   r"   r'   r&   r*   r/   r,   r4   ri   rj   rm   rn   r   rv   ry   rz   r  ZFigureManagerSVGr   exportr  r   r   r   r   <module>   sx   
)



	
        qA