a
    ëÝEbÀ  ã                   @   sº  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ d dlZd dlmZmZmZ d dlmZmZmZmZmZ d dlmZ d dlm Z  d dl!m"Z" d d	l#m$Z$ d d
l%m&Z& d dlm'Z' d dl(m)Z)m*Z* e	 +e,¡Z-ej.Z/dd„ Z0e 1d¡Z2dd„ Z3dd„ Z4dd„ Z5dd„ Z6G dd„ dƒZ7g fdd„Z8i fdd„Z9ddd d!œZ:G d"d#„ d#eƒZ;G d$d%„ d%eƒZ<eZ=d&Z>ej?G d'd(„ d(eƒƒZ@dS ))é    N)ÚBytesIOÚStringIO)ÚImage)Ú_apiÚcbookÚfont_manager)Ú_BackendÚ_check_savefig_extra_argsÚFigureCanvasBaseÚFigureManagerBaseÚRendererBase)ÚMixedModeRenderer)Úrgb2hex)ÚUTC©ÚMathTextParser)ÚPath)Ú_path)ÚAffine2DÚAffine2DBasec                 C   s(   |   dd¡} |   dd¡} |   dd¡} | S )Nú&ú&amp;ú<ú&lt;ú>ú&gt;©Úreplace©Ús© r    ú_/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/matplotlib/backends/backend_svg.pyÚescape_cdataG   s    r"   z-(?=-)c                 C   s   t | ƒ} t d| ¡S )Nz- )r"   Ú_escape_xml_commentÚsubr   r    r    r!   Úescape_commentQ   s    r%   c                 C   s@   |   dd¡} |   dd¡} |   dd¡} |   dd¡} |   d	d
¡} | S )Nr   r   ú'z&apos;ú"z&quot;r   r   r   r   r   r   r    r    r!   Úescape_attribV   s    r(   c                 C   s@   d| vrdt | ƒ d S d| vr0dt | ƒ d S dt| ƒ d S )Nr'   r&   )r"   r(   r   r    r    r!   Ú_quote_escape_attrib_   s    þr)   c                 C   s   d  | ¡ d¡ d¡S )zˆ
    Create a short string representation of a float, which is %f
    formatting with trailing zeros and the decimal point removed.
    z{0:f}Ú0Ú.)ÚformatÚrstrip)Úxr    r    r!   Úshort_float_fmte   s    r/   c                   @   sf   e Zd ZdZdd„ Zddd„Zi fdd„Zd	d
„ Zdd„ Zddd„Z	dd„ Z
di fdd„Zdd„ ZdS )Ú	XMLWriterzM
    Parameters
    ----------
    file : writable text file-like object
    c                 C   s6   |j | _t|dƒr|j| _d| _g | _g | _d| _d S )NÚflushr   z@                                                                )ÚwriteÚ_XMLWriter__writeÚhasattrr1   Ú_XMLWriter__openÚ_XMLWriter__tagsÚ_XMLWriter__dataÚ_XMLWriter__indentation)ÚselfÚfiler    r    r!   Ú__init__t   s    
zXMLWriter.__init__Tc                 C   sP   | j r&|r|  d¡ n
|  d¡ d| _ | jrLd | j¡}|  t|ƒ¡ g | _d S )Nz>
r   r   Ú )r5   r3   r7   Újoinr"   )r9   Ú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"   r7   r6   Úappendr3   r8   ÚlenÚitemsr)   r5   )r9   ÚtagÚattribÚextraÚkÚvr    r    r!   ÚstartŠ   s    zXMLWriter.startc                 C   s8   |   ¡  |  | jdt| jƒ… ¡ |  dt|ƒ ¡ dS )zŒ
        Add a comment to the output stream.

        Parameters
        ----------
        comment : str
            Comment text.
        Nz<!-- %s -->
)rA   r3   r8   rC   r6   r%   )r9   Úcommentr    r    r!   rK   «   s    	zXMLWriter.commentc                 C   s   | j  |¡ dS )z�
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r7   rB   )r9   Útextr    r    r!   r?   ¸   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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>
)	r6   r"   Úpopr7   rA   r5   r3   r8   rC   )r9   rE   r>   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)rC   r6   rO   )r9   Úidr    r    r!   Úcloseß   s    
zXMLWriter.closec                 K   s2   | j ||fi |¤Ž |r"|  |¡ | jdd� dS )z³
        Add an entire element.  This is the same as calling :meth:`start`,
        :meth:`data`, and :meth:`end` in sequence. The *text* argument can be
        omitted.
        F)r>   N)rJ   r?   rO   )r9   rE   rL   rF   rG   r    r    r!   Úelementì   s    
zXMLWriter.elementc                 C   s   dS )zFlush the output stream.Nr    ©r9   r    r    r!   r1   ÷   s    zXMLWriter.flush)T)NT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   rA   rJ   rK   r?   rO   rQ   rR   r1   r    r    r    r!   r0   m   s   	
!
r0   c              	   C   sž   t | ƒrštƒ }| D ]~\}}|dkr2|dks|dks|dkrB|dks|dkrT|dkrTq|dkrnt|tƒrn| ¡ }| d	|d
 dd„ |D ƒ¡f ¡ q| ¡ S dS )NÚscale)r@   )r@   r@   Ú	translate)r   r   Úrotate)r   Úmatrixz%s(%s)ú c                 s   s   | ]}t |ƒV  qd S ©N©r/   )Ú.0r.   r    r    r!   Ú	<genexpr>  ó    z%generate_transform.<locals>.<genexpr>r<   )rC   r   Ú
isinstancer   Z	to_valuesr2   r=   Úgetvalue)Ztransform_listÚoutputÚtypeÚvaluer    r    r!   Úgenerate_transformü   s(    ÿÿþþÿ
rg   c                 C   s   d  dd„ |  ¡ D ƒ¡S )Nz; c                 s   s    | ]\}}|› d |› �V  qdS )z: Nr    ©r_   rH   rI   r    r    r!   r`     ra   zgenerate_css.<locals>.<genexpr>)r=   rD   ©rF   r    r    r!   Úgenerate_css  s    rj   ZsquareÚbuttÚround)Z
projectingrk   rl   c                       s\  e Zd ZdMddœ‡ fdd„Ze d¡edd„ ƒƒZd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ ZdNd!d"„Zd#d$„ Zd%d&„ ZdOd'd(„ZdPd)d*„ZdQd+d,„Z‡ fd-d.„Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ ZdRd7d8„Zd9d:„ Z d;d<„ Z!dSd=d>„Z"dTd?d@„Z#ddAœdBdC„Z$dUdEdF„Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(‡  Z)S )VÚRendererSVGNéH   )Úmetadatac          	   	      sê   || _ || _t|ƒ| _|| _|d u r>t|ddƒ}t|tƒs>d}|| _i | _	t
 ¡ | _i | _i | _d| _i | _d| _d| _tƒ  ¡  tƒ | _t|ƒ}t|ƒ}| t¡ | jjdd| d| d||f dd	d
did�| _|  |¡ |  ¡  d S )NÚnamer<   r   FÚsvgz%sptz	0 0 %s %szhttp://www.w3.org/2000/svgz1.1zxmlns:xlinkzhttp://www.w3.org/1999/xlink)ÚwidthÚheightÚviewBoxÚxmlnsÚversionrF   )rr   rs   r0   ÚwriterÚ	image_dpiÚgetattrrb   ÚstrÚbasenameÚ_groupdÚ	itertoolsÚcountÚ_image_counterÚ_clipdÚ_markersÚ_path_collection_idÚ_hatchdÚ_has_gouraudÚ_n_gradientsÚsuperr;   ÚdictÚ
_glyph_mapr/   r2   Ú	svgPrologrJ   Ú	_start_idÚ_write_metadataÚ_write_default_style)	r9   rr   rs   Z	svgwriterr{   rx   ro   Z
str_heightZ	str_width©Ú	__class__r    r!   r;     sB    





ù
zRendererSVG.__init__ú3.4c                 C   s   t dƒS )NZSVGr   rS   r    r    r!   Úmathtext_parser:  s    zRendererSVG.mathtext_parserc                 C   s,   |   ¡  |  ¡  | j | j¡ | j ¡  d S r]   )Ú_write_clipsÚ_write_hatchesrw   rQ   rŠ   r1   rS   r    r    r!   Úfinalize?  s    zRendererSVG.finalizec                    s  |d u ri }dddt j› d�dœ|¥}| j‰ d|v rFˆ jd|d d� | d	d ¡}|d u�rt|tƒrn|g}n”t|tjtjfƒrŒ| 	¡ g}nvt
 |¡rðg }|D ]N}t|tƒr¸| |¡ qžt|tjtjfƒrÚ| | 	¡ ¡ qžtd
 t|ƒ¡ƒ‚qžntd t|ƒ¡ƒ‚d |¡|d	< nRd	|v�rdt d¡}|�rRtj t|ƒ¡}|jtd� 	¡ |d	< ntj ¡  	¡ |d	< d }‡ fdd„}| dd ¡}|d u�r¤||ƒ}ˆ jdd|id� dD ]<}| | ¡ d ¡}	|	d u�r¨||ƒ}ˆ jd|› �|	d� �q¨dD ]Œ}| | ¡ d ¡}
|
d u �r�qêt|
tƒ�r|
g}
||ƒ}ˆ  d|› �¡ |
D ](}ˆ  d¡ ˆ jd|d� ˆ  d¡ �q:ˆ  d|› �¡ �qê| dd ¡}|d u�rêt|tƒ�r |g}||ƒ}ˆ  d¡ ˆ  d¡ |D ]}ˆ jd|d� �qÀˆ  d¡ ˆ  d¡ |d u�rþˆ  |¡ |�rtdd |¡ ƒ‚d S ) Nzimage/svg+xmlz&http://purl.org/dc/dcmitype/StillImagezMatplotlib vz, https://matplotlib.org/)ZFormatÚTypeZCreatorZTitleÚtitle)rL   ÚDatezVInvalid type for Date metadata. Expected iterable of str, date, or datetime, not {!r}.z`Invalid type for Date metadata. Expected str, date, datetime, or iterable of the same, not {!r}.ú/ÚSOURCE_DATE_EPOCH)Útzinfoc                    s:   | d ur| S ˆ   d¡} ˆ j dddddœd� ˆ   d¡ | S )	Nro   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:rdfri   zcc:Work)rJ   )Úmid©rw   r    r!   Úensure_metadata{  s    
ý

z4RendererSVG._write_metadata.<locals>.ensure_metadatar”   zdc:typezrdf:resourceri   )	r•   ZcoverageÚdateÚdescriptionr,   Ú
identifierÚlanguageZrelationÚsourcezdc:)ZcreatorZcontributorZ	publisherZrightszcc:Agentzdc:titleZKeywordsz
dc:subjectzrdf:Bagzrdf:liz.Unknown metadata key(s) passed to SVG writer: ú,)ÚmplÚ__version__rw   rR   Úgetrb   rz   Údatetimer�   Ú	isoformatÚnpÚiterablerB   Ú
ValueErrorr,   re   r=   ÚosÚgetenvÚutcfromtimestampÚintr   r   ÚtodayrN   r•   rJ   rO   rQ   )r9   ro   r�   ÚdatesÚdrš   rœ   ÚuriÚkeyÚinfoZagentsZagentÚkeywordsÚkeywordr    r›   r!   r‹   E  s     üû



þÿþ












ÿzRendererSVG._write_metadatac                 C   s@   | j }tdddœƒ}| d¡ |jddd| d� | d¡ d S )	Nrl   rk   )ústroke-linejoinústroke-linecapÚdefsÚstyleztext/cssz*{%s})re   rL   )rw   rj   rJ   rR   rO   )r9   rw   Ú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£   ÚrcParamsrz   ÚuuidÚuuid4ÚhashlibÚsha256ÚupdateÚencodeÚ	hexdigest)r9   re   ÚcontentÚsaltÚmr    r    r!   Ú_make_idÃ  s    
zRendererSVG._make_idc                 C   s   |t ƒ  dd¡ d| j¡ S )Nç      ð?ç      ð¿ç        )r   rX   rY   rs   )r9   Ú	transformr    r    r!   Ú_make_flip_transformÌ  s    ÿþÿz RendererSVG._make_flip_transformc                 C   s4   t  |¡}t  |¡}| ¡  | ¡ }| |d¡ |S ©Nç      R@)ÚfmZfindfontZget_fontÚclearÚget_size_in_pointsZset_size)r9   ÚpropÚfnameÚfontÚsizer    r    r!   Ú	_get_fontÒ  s    

zRendererSVG._get_fontc                 C   s|   |durt |ƒ}| ¡ }|dur(t |ƒ}| ¡ ||f}| j |¡}|du 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)r9   ÚgcÚrgbFaceÚedgeÚdictkeyÚoidÚ_r    r    r!   Ú
_get_hatchÚ  s    zRendererSVG._get_hatchc           
   
   C   s*  t | jƒsd S d}| j}| d¡ | j ¡ D ]î\\}}}}|jd|dddt|ƒt|ƒd� | j|tƒ  |¡ dd¡ 	d	|¡d
d�}|d u 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 )Nrn   r¹   ÚpatternÚuserSpaceOnUser*   )rP   ÚpatternUnitsr.   Úyrr   rs   rÊ   rË   r   F©ÚsimplifyÚnoneÚrectr@   )r.   rç   rr   rs   Úfillzhatch.linewidthrk   Zmiter)rì   Ústrokeústroke-widthr¸   r·   é   ústroke-opacityÚpath)r±   rº   )rC   rƒ   rw   rJ   Úvaluesrz   Ú_convert_pathr   rX   rY   r   rR   r£   r¾   rj   rO   )
r9   Z
HATCH_SIZErw   rñ   Úfacerí   rá   Ú	path_datarì   Zhatch_styler    r    r!   r’   ì  s`    


ûÿÿÿü
üûýzRendererSVG._write_hatchesc           	      C   s¶  i }|  ¡ }| ¡ durbd|  ||¡ |d< |durÀt|ƒdkrÀ|d dkrÀ|sÀt|d ƒ|d< n^|du 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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�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^   )r_   Úvalr    r    r!   r`   2  s   z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetrí   rð   rî   rl   r·   rk   r¸   )Úget_forced_alpharÛ   rã   rC   r/   rÚ   r   Ú	get_alphaZ
get_dashesr=   ÚfloatZget_linewidthÚget_rgbZget_joinstyleZget_capstyleÚ_capstyle_d)	r9   rÝ   rÞ   rF   Zforced_alphaÚoffsetÚseqZ	linewidthÚrgbr    r    r!   Ú_get_style_dict  sJ     ÿ
ÿ

ÿ
zRendererSVG._get_style_dictc                 C   s   t |  ||¡ƒS r]   )rj   r  )r9   rÝ   rÞ   r    r    r!   Ú
_get_styleE  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Î   rP   rz   Zboundsrs   r€   r¥   rÉ   )r9   rÝ   ZcliprectÚclippathÚclippath_transrà   r.   rç   ÚwrÙ   Úcliprá   r    r    r!   Ú_get_clip_attrsH  s$    
zRendererSVG._get_clip_attrsc                 C   s¼   t | jƒsd S | j}| d¡ | j ¡ D ]„\}}|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©rP   é   Frè   rñ   ©r±   rë   ©r.   rç   rr   rs   )	rC   r€   rw   rJ   rò   ró   rR   r/   rO   )r9   rw   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   r@   z%s_%d)rw   rJ   r|   r¥   )r9   r   Úgidr    r    r!   Ú
open_groupv  s    zRendererSVG.open_groupc                 C   s   | j  d¡ d S )Nr  )rw   rO   )r9   r   r    r    r!   Úclose_group~  s    zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r£   r¾   rS   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 )NrÌ   é   )ó   Mó   Ló   Qó   Có   zFÚascii)rr   rs   r   Zconvert_to_stringÚdecode)r9   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_urlrw   rJ   rR   r
  r  rO   )	r9   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í   )Ú
startswithrh   r    r    r!   Ú
<dictcomp>¯  s   
ÿz,RendererSVG.draw_markers.<locals>.<dictcomp>rÈ   r¹   rñ   )rP   r±   rº   r  r  ú#%sr   rn   )r	  ré   éþÿÿÿr.   rç   rº   Úuseri   )r  )rC   Úverticesrw   ró   r   rX   r  rj   r�   r¥   rD   rÉ   rJ   rR   rO   r
  rÎ   rr   rs   Úiter_segmentsr/   r  )r9   rÝ   Zmarker_pathZmarker_transrñ   ÚtransrÞ   rw   rõ   rº   rà   rá   r!  rF   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�r\|jdd|id� |  |¡}|�r||jdi |¤Ž d| t|ƒt| j| ƒ|  ||¡dœ}|jd|d� |�rÂ| d¡ |d u�r*| d¡ �q*|  jd7  _d S )Nr   é	   rï   é   r¹   rÊ   rË   Frè   z	C%x_%x_%sr<   rñ   )rP   r±   r  r  ri   r  r%  )r  r.   rç   rº   r'  r@   )r  )rC   r(  Z_iter_collection_uses_per_pathr†   Údraw_path_collectionrw   rJ   Ú	enumerateZ_iter_collection_raw_pathsr   Z
get_matrixrX   ró   r‚   rÉ   rR   rB   rO   Z_iter_collectionr   r
  r/   rs   r  ) r9   rÝ   Zmaster_transformÚpathsZall_transformsÚoffsetsZoffsetTransZ
facecolorsZ
edgecolorsZ
linewidthsZ
linestylesZantialiasedsÚurlsZoffset_positionZlen_pathZuses_per_pathZshould_do_optimizationrw   Z
path_codesÚirñ   rÍ   r±   rá   ZxoZyoZpath_idZgc0rÞ   ÚurlÚ
clip_attrsrF   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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  ÚfeCompositeÚinZSourceGraphicZBackgroundImageZ
arithmeticÚ1)rF   Zin2ÚoperatorZk2Zk3ZcolorMatÚfeColorMatrixre   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 )rF   rò   r   )ZaxisrM   r¹   rï   r@   r  rÊ   ÚlinearGradientzGR%x_%drå   )rP   ÚgradientUnitsÚx1Úy1Úx2Úy2Ústop)z
stop-colorzstop-opacity)rÿ   rº   r*   zM r¢   z L r\   z Zrñ   Z
crispEdges)r±   rì   r÷   úshape-renderingri   r  rê   zurl(#colorMat))rí   rî   rD  r7  zurl(#GR%x_0))r±   rì   rD  zurl(#GR%x_1)zurl(#colorAdd))r±   rì   r7  rD  zurl(#GR%x_2))rw   r„   rJ   rR   rO   r¨   ZaveragerÎ   rÍ   Úranger…   r/   rj   r   )r9   rÝ   ZpointsÚcolorsr*  rw   Z	avg_colorr!  Ztpointsr4  r?  r@  rA  rB  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  )rw   rJ   r
  ÚfrozenÚziprM  rO   )r9   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    rS   r    r    r!   Úoption_scale_image�  s    zRendererSVG.option_scale_imagec                 C   s
   | j d S rÏ   )rx   rS   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 rÌtƒ }t	 
|¡j|dd	� |p¬|  d
| ¡ ¡}dt | ¡ ¡ d¡ |
d< n`| jd u rÞtdƒ‚d | jt| jƒ¡}t d|¡ t	 
|¡ |¡ |�p"d|  d
|¡ }||
d< ||
d< |d u �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 u�rL| j "d¡ |�r^| j "d¡ d S ) Nr  r   r  r  r  ri   zsvg.image_inlineZpng)r,   Ú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_rP   rÐ   )rX   )r@   rM   rY   )rÍ   r.   rç   rr   rs   rF   rÊ   rø   rË   rÌ   r[   rÍ   z5image-rendering:crisp-edges;image-rendering:pixelatedrº   )rr   rs   rF   )r  )#Úshaper
  rw   rJ   r   Zget_gidr£   r¾   r   r   Z	fromarrayÚsaverÉ   rc   Úbase64Ú	b64encoder  r{   rª   r,   Únextr   Ú_logr´   rx   rR   rg   r/   rs   rû   r   rX   rY   rN  rO   )r9   rÝ   r.   rç   ZimrÍ   rÙ   r  r6  r5  rF   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ñ   )rX   )g      �?)rP   r±   rÍ   N)rw   rJ   rD   Ú_adjust_char_idró   r   rR   rg   rO   rˆ   rÃ   )r9   Úglyph_map_newrw   Ú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   )r9   rc  r    r    r!   ra  ö  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 )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ï   r@   rø   rY   rZ   rX   ©rº   rÍ   r  ri   T)Ú	glyph_mapZreturn_new_glyphs_onlyr  r%  rÌ   r.   rç   r'  ÚTeX)rÍ   rF   Frè   rñ   r  N)rw   rK   rˆ   Ú
_text2pathr   rý   rÓ   rú   rû   r/   Z
FONT_SCALErj   rg   rJ   rØ   Zget_glyphs_with_fontre  rR   Zget_glyphs_texZget_glyphs_mathtextra  r   ró   rO   ) r9   rÝ   r.   rç   r   rÔ   ÚangleÚismathÚmtextrw   rh  Z	text2pathÚcolorÚfontsizerº   r^  Z
font_scalerF   rÖ   Z_glyphsZ
glyph_inforb  ÚrectsZglyph_idZ	xpositionZ	ypositionrX   rc  Zvertsrd  rñ   rõ   r    r    r!   Ú_draw_text_as_pathù  sv    



ýþ
ÿ




ÿÿ



þ
ú

zRendererSVG._draw_text_as_pathc	           %      C   s‚  | j }	t| ¡ ƒ}
i }|
dkr&|
|d< | ¡ r6| ¡ n
| ¡ d }|dkrVt|ƒ|d< |�sXi }g }| ¡ dkr~| | ¡ ¡ | ¡ dkr˜| | ¡ ¡ t	j
| ¡  }|dkrº| |› ¡ | t| ¡ ƒ› d�| ¡ d	 ›g¡ d
 |¡|d< | ¡ dk�r| ¡ |d< t|ƒ|d< |�r$|d	k�s2| ¡ dk�r$| ¡ }| | ¡ ¡\}}| j| }t |¡}t t |¡t |¡g¡}t ||| || g¡}|||d	   }|||d   }ddddœ}|| ¡  |d< t|ƒ|d< t|ƒ|d< t|ƒ|d< dt| ƒt|ƒt|ƒf |d< |	jd||d� n0t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�rb|"j*|d< t|ƒ}|dk�rxd }| +|g ¡ | |! |f¡ �q¼| ,¡ D ]Œ\}}#|# -¡  t.d!d"„ |#D ƒƒdk�rØt/|#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+� �q:|	 0d¡ d S ),Nrf  rì   rï   r@   rø   Únormali�  Zpxr   r\   rÖ   zfont-stretchrº   ÚanchorrJ   rO   Úmiddle)ÚleftÚrightÚcenterztext-anchorr.   rç   zrotate(%s, %s, %s)rÍ   rL   ri   rY   rZ   rn   r  rg  é    é    c                 S   s   h | ]\}}}|’qS r    r    )r_   r.   rç   Útr    r    r!   Ú	<setcomp>º  ra   z1RendererSVG._draw_text_as_text.<locals>.<setcomp>c                 s   s   | ]}t |d  ƒV  qdS )r@   N)rz   ©r_   Úcr    r    r!   r`   ½  ra   z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c                 s   s   | ]}t |d  ƒV  qdS )r   Nr^   r|  r    r    r!   r`   Á  ra   )rº   r.   rç   Ztspanr<   c                 s   s   | ]}t |d  ƒV  qdS )r  N)Úchrr|  r    r    r!   r`   Ç  ra   rë   r  )1rw   r   rý   rú   rû   r/   Ú	get_stylerB   Úget_variantrÑ   Zweight_dictZ
get_weightÚextendÚget_sizeZ
get_familyr=   Zget_stretchrj   Zget_rotation_modeZget_transformrÍ   Zget_unitless_positionrs   r¨   Zdeg2radÚarrayÚsinÚcosÚdotZget_harR   rg   rK   rj  r�   ÚparserJ   ZttfFontPropertyrº   ÚvariantÚweightrp   ZstretchÚ
setdefaultrD   ÚsortrC   rz   rO   )%r9   rÝ   r.   rç   r   rÔ   rk  rl  rm  rw   rn  rº   r^  rF   Z
font_partsr‰  rÍ   ÚaxZayZ	angle_radZdir_vertZv_offsetZha_mpl_to_svgrr   rs   ZdescentZglyphsrp  ÚspansrÖ   ro  ZthetextZnew_xZnew_yÚentryÚcharsZysr    r    r!   Ú_draw_text_as_textJ  sÚ    þ

ÿý


þ

ÿ

þþ

þ

ýý

û
zRendererSVG._draw_text_as_text)rm  c             	   C   s   | j ||||||dd� d S )Nri  )rl  )rq  )r9   rÝ   r.   rç   r   rÔ   rk  rm  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
  rw   rJ   r   r£   r¾   rq  r�  rO   )
r9   rÝ   r.   rç   r   rÔ   rk  rl  rm  r6  r    r    r!   Ú	draw_textÛ  s    
zRendererSVG.draw_textc                 C   s   dS rR  r    rS   r    r    r!   Úflipyò  s    zRendererSVG.flipyc                 C   s   | j | jfS r]   )rr   rs   rS   r    r    r!   Úget_canvas_width_heightö  s    z#RendererSVG.get_canvas_width_heightc                 C   s   | j  |||¡S r]   )rj  Úget_text_width_height_descent)r9   r   rÔ   rl  r    r    r!   r•  ú  s    z)RendererSVG.get_text_width_height_descent)Nrn   )N)NNNN)N)N)N)N)N)FN)*rT   rU   rV   r;   r   Ú
deprecatedÚpropertyr�   r“   r‹   rŒ   rÉ   rÎ   rØ   rã   r’   r  r  r
  r‘   r  r  r  ró   r"  r,  r/  rM  rQ  rS  rT  r_  re  ra  rq  r�  r‘  r’  r“  r”  r•  Ú__classcell__r    r    r�   r!   rm     sX   ÿ&u		,-
  ÿ


 ÿ
': 
O
Q
 
rm   c                       st   e Zd ZdddœZdZee dd¡e dd¡dddd	œd
d„ƒƒƒZe dd¡dd„ ƒZ	dd„ Z
‡ fdd„Z‡  ZS )ÚFigureCanvasSVGzScalable Vector Graphics)rq   Zsvgzrn   r�   Údpiz3.5ÚargsN)rš  Úbbox_inches_restorero   c                G   sÂ   t j|ddd��ž}t  |¡s*t d¡|ƒ}|du r<| j ¡ }| j d¡ | j ¡ \}}|d |d  }	}
t	| j|||t
|	|
|||d�|d�}| j |¡ | ¡  W d  ƒ n1 s´0    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)ÚencodingNrn   )rx   ro   )rœ  )r   Úopen_file_cmZfile_requires_unicodeÚcodecsÚ	getwriterÚfigureZget_dpiZset_dpiZget_size_inchesr   rm   Údrawr“   )r9   r]  rš  rœ  ro   r›  Úfhrr   rs   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¥  )r9   r]  r›  Úkwargsr£  Z
gzipwriterr    r    r!   Ú
print_svgz8  s
    ÿzFigureCanvasSVG.print_svgzc                 C   s   dS )Nrq   r    rS   r    r    r!   Úget_default_filetype>  s    z$FigureCanvasSVG.get_default_filetypec                    s   | j  ¡  tƒ  ¡ S r]   )r¡  Zdraw_without_renderingr†   r¢  rS   r�   r    r!   r¢  A  s    
zFigureCanvasSVG.draw)rT   rU   rV   Ú	filetypesZ	fixed_dpir	   r   Zdelete_parameterr¥  r¬  r­  r¢  r˜  r    r    r�   r!   r™  ÿ  s   ÿ

ÿ0

r™  zœ<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
c                   @   s   e Zd ZeZdS )Ú_BackendSVGN)rT   rU   rV   r™  ZFigureCanvasr    r    r    r!   r¯  P  s   r¯  )ArX  rŸ  r¦   r©  rÁ   Úior   r   r}   Úloggingr«   Úrer¿   Únumpyr¨   ZPILr   Z
matplotlibr£   r   r   r   rÑ   Zmatplotlib.backend_basesr   r	   r
   r   r   Z!matplotlib.backends.backend_mixedr   Zmatplotlib.colorsr   Zmatplotlib.datesr   Zmatplotlib.mathtextr   Zmatplotlib.pathr   r   Zmatplotlib.transformsr   r   Ú	getLoggerrT   r[  r¤   Zbackend_versionr"   Úcompiler#   r%   r(   r)   r/   r0   rg   rj   rþ   rm   r™  ZFigureManagerSVGr‰   Zexportr¯  r    r    r    r!   Ú<module>   s`   
(
	        sG