U
    ÂmœdÕÅ  ã                   @   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   úX/home/sam/Atlas/atlas_env/lib/python3.8/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| 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r„d| _|  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   )Úinfosru   rt   r   r   r   Ú_check_is_iterable_of_str3  s
    

rz   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ÚRendererSVGNéH   )Ú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Ú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ƒ   rV   r•   r5   rX   r   r   r   Úfinalizee  s    zRendererSVG.finalizec                    sP  |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}nšt|tjtj	fƒrš| 
¡ g}n|t |¡�rg }|D ]P}t|tƒrÈ| |¡ q®t|tjtj	fƒrê| | 
¡ ¡ q®td
t|ƒ› d�ƒ‚q®ntdt|ƒ› d�ƒ‚d |¡|d	< nRd	|k�rxt d¡}|�rftj t|ƒ¡}|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� �q¼dD ]š}	| |	d ¡}|d k�r&�qt|tƒ�r8|g}t||	ƒ ||ƒ}ˆ  d|	 ¡ › �¡ |D ](}ˆ  d¡ ˆ jd|d� ˆ  d¡ �qbˆ  d|	 ¡ › �¡ �q| dd ¡}|d k	�r t|tƒ�rÌ|g}t|dƒ ||ƒ}ˆ  d¡ ˆ  d¡ |D ]}ˆ jd|d� �qöˆ  d¡ ˆ  d¡ |d k	�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 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:titleÚ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ÚutcfromtimestampÚintr!   r   ÚtodayrS   Úlowerrz   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ƒ   Ú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   Ú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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Ú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 kr�d}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ÚuserSpaceOnUser0   )rU   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   rW   r¬   rÅ   rm   rT   )
r=   Z
HATCH_SIZErƒ   rì   Zfacerè   rÛ   Ú	path_datarç   Zhatch_styler   r   r   r›     sl    

  ûÿ ÿ ÿü  

üûýzRendererSVG._write_hatchesc           	      C   s¶  i }|  ¡ }| ¡ dk	rbd|  ||¡ |d< |dk	rÀt|ƒdkrÀ|d dkrÀ|sÀt|d ƒ|d< n^|dkrtd|d< nLt|dd… ƒd	kr”t|ƒ|d< t|ƒdkrÀ|d dkrÀ|sÀt|d ƒ|d< |rà| ¡ dkràt| ¡ ƒ|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�r²t| ¡  |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	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 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À   Z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�   Ú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rŽd 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ÚoperatorZ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ß   )rU   ZgradientUnitsÚx1Úy1Úx2Úy2Ústop)z
stop-colorzstop-opacity)rù   rÁ   r0   zM r«   z L ra   z Zrì   Ú
crispEdges)rº   rç   rñ   úshape-renderingrl   r	  rå   zurl(#colorMat))rè   ré   r?  r5  zurl(#GR%x_0))rº   rç   r?  zurl(#GR%x_1)zurl(#colorAdd))rº   rç   r5  r?  zurl(#GR%x_2))rƒ   r�   rN   rW   rT   rw   ZaveragerÒ   rÑ   Úranger�   r,   rm   r   )r=   r×   r2  r3  r$  rƒ   Z	avg_colorr  Ztpointsr.  r9  r:  r;  r<  Zx3Zy3Z
rgba_colorÚxbZybÚm1Úb1Úm2Úb2Údpathr   r   r   r1  &  sî    þ û
þý






  û
þýÿý
 ýþýþþþýþýþ
z"RendererSVG._draw_gouraud_trianglec                 C   sP   | j jd|  |¡Ž | ¡ }t||ƒD ]\}}|  ||||¡ q&| j  d¡ d S )Nr	  )r	  )rƒ   rN   r  ÚfrozenÚzipr1  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 rÈtƒ }t	 
|¡j|dd	� |p¨|  d
| ¡ ¡}dt | ¡ ¡ d¡ |
d< n`| jd krÚtdƒ‚d | jt| jƒ¡}t d|¡ t	 
|¡ |¡ |�pd|  d
|¡ }||
d< ||
d< |d k�r d| | j }d| | j }| jjd
tddd| ffgƒt|ƒt| j| |  ƒt|ƒt|ƒ|
d� n’| ¡ }|dk�r¾t|ƒ|
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  r0  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� qønÆ|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!  Ú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�rˆd&} | ,|g ¡ |!|" | f¡ �qÌ| -¡ D ]Œ\}}$|$ .¡  t/d'd(„ |$D ƒƒdk�rèt0|$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)Ú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~   )rq  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   )rr  rs  Úrepr)rb   Úentryr~   ©ru  r   r   Ú
<listcomp>‹  s   
 þzQRendererSVG._draw_text_as_text.<locals>._get_all_quoted_names.<locals>.<listcomp>)Z
get_family)rf  rx  r   r   Ú_get_all_quoted_names‰  s    
ÿz=RendererSVG._draw_text_as_text.<locals>._get_all_quoted_namesZpxz, ra   rl  zfont-stretchrÁ   r   ÚanchorrN   rT   Ú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,   Ú	get_stylerF   Úget_variantrr  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   re  Zmathtext_parserÚparserN   ZttfFontPropertyrÁ   ÚvariantÚweightr~   ZstretchÚ
setdefaultrH   ÚsortrG   rr   rT   )&r=   r×   r.   rà   r   rf  rg  rh  ri  rƒ   rj  rÁ   rY  rJ   Z
font_partsr’  rz  rÑ   ZaxZayZ	angle_radZdir_vertZv_offsetZha_mpl_to_svgr€   r�   ZdescentZglyphsrm  Úspansrl  rk  ZthetextZnew_xZnew_yrw  ÚcharsZysr   )ru  rq  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Å   rn  r—  rT   )
r=   r×   r.   rà   r   rf  rg  rh  ri  r0  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   )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)%rY   rZ   r[   r?   rœ   r–   r—   rÐ   rÒ   rÝ   r›   rü   rý   r  rš   r  r  r  rî   r  r&  r)  r4  r1  rJ  rL  rN  rZ  r`  r\  rn  r—  r˜  r™  rš  r›  Ú__classcell__r   r   r˜   r   r{   >  sP   ÿ&{		,-
  ÿ


 ÿ
': 
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   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   r{   Údrawrœ   )r=   rX  rž  r}   Úfhr¤  r€   r�   r  rÓ   Ú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Æ   Únumpyrw   ZPILr   Z
matplotlibr¬   r   r   r   rr  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   rz   r{   r�  ZFigureManagerSVGr”   Zexportr²  r   r   r   r   Ú<module>   sx   
)



	
        qA