o
    i                     @   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 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(dd Z)e
*dZ+dd Z,dd Z-dd Z.dd Z/G dd dZ0dd Z1dd Z2dddd Z3d!d" Z4d#d$ Z5G d%d& d&eZ6G d'd( d(eZ7eZ8d)Z9ej:G d*d+ d+eZ;dS ),    N)BytesIO)Image)cbookfont_manager)_BackendFigureCanvasBaseFigureManagerBaseRendererBase)MixedModeRenderer)rgb2hex)UTC)Path)_path)Affine2DAffine2DBasec                 C   s(   |  dd} |  dd} |  dd} | S )N&&amp;<&lt;>&gt;replaces r   n/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/matplotlib/backends/backend_svg.py_escape_cdataE   s   r   z-(?=-)c                 C   s   t | } td| S )Nz- )r   _escape_xml_commentsubr   r   r   r   _escape_commentO   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_attribT   s   r#   c                 C   s@   d| vrdt |  d S d| vrdt |  d S dt|  d S )Nr"   r!   )r   r#   r   r   r   r   _quote_escape_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.
    f0.)rstrip)xr   r   r   _short_float_fmtc   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hasattrr,   _XMLWriter__open_XMLWriter__tags_XMLWriter__data_XMLWriter__indentation)selffiler   r   r   __init__r   s   

zXMLWriter.__init__Tc                 C   sT   | j r|r| d n| d d| _ | jr(d| j}| t| g | _d S d S )N>
r   r    )r0   r.   r2   joinr   )r4   indentdatar   r   r   Z__flush{   s   

zXMLWriter.__flushc                 K   s   |    t|}g | _| j| | | jdt| jd   | d|  i || D ]\}}|rIt|}t	|}| d| d|  q0d| _
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   r    =)_XMLWriter__flushr   r2   r1   appendr.   r3   lenitemsr$   r0   )r4   tagattribextrakvr   r   r   start   s   zXMLWriter.startc                 C   s<   |    | | jdt| j  | dt| d dS )z
        Add a comment to the output stream.

        Parameters
        ----------
        comment : str
            Comment text.
        Nz<!-- z -->
)r?   r.   r3   rA   r1   r    )r4   commentr   r   r   rI      s   	zXMLWriter.commentc                 C   s   | j | dS )z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r2   r@   )r4   textr   r   r   r;      s   	zXMLWriter.dataNc                 C   s   |r$| j sJ d| dt|| j d ks#J d| j d  d| n| j s+J d| j  }| jr9| | n| jrFd| _| d d	S |rU| | jd	t| j   | d
| 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.
        indent : bool, default: True
        zunbalanced end()zexpected end(z), got zunbalanced end()r   z/>
Nz</r7   )	r1   r   popr2   r?   r0   r.   r3   rA   )r4   rC   r:   r   r   r   end   s    

zXMLWriter.endc                 C   s,   t | j|kr|   t | j|ksdS dS )z
        Close open elements, up to (and including) the element identified
        by the given identifier.

        Parameters
        ----------
        id
            Element identifier, as returned by the :meth:`start` method.
        N)rA   r1   rN   )r4   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)rH   r;   rN   )r4   rC   rJ   rD   rE   r   r   r   element   s   
zXMLWriter.elementc                 C      dS )zFlush the output stream.Nr   r4   r   r   r   r,         zXMLWriter.flush)TNT)__name__
__module____qualname____doc__r6   r?   rH   rI   r;   rN   rP   rQ   r,   r   r   r   r   r+   k   s    
	!
r+   c              
   C   s   g }| D ]?\}}|dkr|dks$|dks$|dkr|dks$|dkr%|dkr%q|dkr2t |tr2| }|d	|d
dd |D  qd
|S )Nscale)r<   )r<   r<   	translate)r   r   rotate)r   matrixz{}({})r=   c                 s       | ]}t |V  qd S Nr*   ).0r)   r   r   r   	<genexpr>  s    z&_generate_transform.<locals>.<genexpr>)
isinstancer   Z	to_valuesr@   formatr9   )Ztransform_listpartstypevaluer   r   r   _generate_transform   s   
rh   c                 C   s   d dd |  D S )Nz; c                 s   s"    | ]\}}| d | V  qdS )z: Nr   ra   rF   rG   r   r   r   rb   
  s     z _generate_css.<locals>.<genexpr>)r9   rB   rD   r   r   r   _generate_css	  s   rk   Zsquarebuttround)Z
projectingrl   rm   c                 C   s(   t | tstd| dt|  dd S )NInvalid type for z metadata. Expected str, not r'   )rc   str	TypeErrorrf   )infokeyr   r   r   _check_is_str  s
   


rs   c                 C   sV   t | r| D ]}t|tstd| dt| dqd S td| dt|  d)Nrn   z) metadata. Expected iterable of str, not r'   z0 metadata. Expected str or iterable of str, not )npiterablerc   ro   rp   rf   )infosrr   rq   r   r   r   _check_is_iterable_of_str  s   





rw   c                       s>  e Zd ZdGdd fddZdd Zdd	 Zd
d Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdHddZdd Zd d! Z		dId"d#ZdHd$d%Z	dHd&d'Z fd(d)Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdHd4d5Zd6d7 Zd8d9 ZdHd:d;ZdHd<d=ZdJd?d@Z dAdB Z!dCdD Z"dEdF Z#  Z$S )KRendererSVGNH   )metadatac          	   	      s   || _ || _t|| _|| _|d u rt|dd}t|tsd}|| _i | _	t
 | _i | _i | _d| _i | _d| _d| _t   t | _t|}t|}|t | jjd| d| dd| d| d	d
ddid| _| | |   d S )Nnamer8   r   Fsvgptz0 0 r=   zhttp://www.w3.org/2000/svgz1.1zxmlns:xlinkzhttp://www.w3.org/1999/xlink)widthheightZviewBoxZxmlnsversionrD   )r~   r   r+   writer	image_dpigetattrrc   ro   basename_groupd	itertoolscount_image_counter_clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientssuperr6   dict
_glyph_mapr*   r-   	svgPrologrH   	_start_id_write_metadata_write_default_style)	r4   r~   r   Z	svgwriterr   r   rz   Z
str_heightZ	str_width	__class__r   r   r6   "  sB   





zRendererSVG.__init__c                 C   s,   |    |   | j| j | j  d S r_   )_write_clips_write_hatchesr   rP   r   r,   rS   r   r   r   finalizeH  s   zRendererSVG.finalizec                    sB  |d u ri }dddt j dd|}| j d|v r*|d }t|d  jd|d |d	d }|d urt|tr=|g}nKt|tjtj	frL|
 g}n<t|r~g }|D ]'}t|trb|| qUt|tjtj	frs||
  qUtd
t| dn
tdt| dd||d	< n*d	|vrtd}|rtjt|tjj}|jtd
 |d	< n	tj 
 |d	< d } fdd}|dd }|d ur||} jdd|id dD ]!}	||	d }
|
d ur||}t|
|	  jd|	  |
d qdD ]K}	||	d }|d u rqt|tr|g}t||	 ||} d|	   |D ]} d  jd|d  d q+ d|	   q|dd }|d urt|tr_|g}t|d ||} d  d |D ]
} jd|d qt d  d |d ur | |rt dd | d S )!Nzimage/svg+xmlz&http://purl.org/dc/dcmitype/StillImagezMatplotlib vz, https://matplotlib.org/)FormatTypeCreatorTitletitle)rJ   DatezQInvalid 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 /SOURCE_DATE_EPOCH)tzinfoc                    s:   | d ur| S   d}  j dddddd   d | S )	Nrz   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:rdfrj   zcc:Work)rH   )midr   r   r   ensure_metadata  s   


z4RendererSVG._write_metadata.<locals>.ensure_metadatar   zdc:typezrdf:resourcerj   )	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   rs   rQ   getrc   ro   datetimedate	isoformatrt   ru   r@   rp   rf   r9   osgetenvfromtimestampinttimezoneutcr   r   todayrM   lowerrw   rH   rN   rP   
ValueError)r4   rz   r   r   datesdr   r   urirr   rq   ZagentsZagentkeywordskeywordr   r   r   r   N  s   

















zRendererSVG._write_metadatac                 C   s@   | j }tddd}|d |jddd| d |d d S )	Nrm   rl   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})rf   rJ   )r   rk   rH   rQ   rN   )r4   r   default_styler   r   r   r     s   
z RendererSVG._write_default_stylec                 C   sb   t jd }|d u rtt }t }||d |t|d | |	 d d  S )Nzsvg.hashsaltutf8
   )
r   rcParamsro   uuiduuid4hashlibsha256updateencode	hexdigest)r4   rf   contentsaltmr   r   r   _make_id  s   
zRendererSVG._make_idc                 C   s   |t  ddd| j S )Nr<   rL   r   )r   rZ   r[   r   )r4   	transformr   r   r   _make_flip_transform  s   z RendererSVG._make_flip_transformc                 C   s~   |durt |}| }|durt |}| ||f}| j|}|du r9| d|}| ||f|f| j|< |S |\}}|S )z,
        Create a new hatch pattern
        Nh)tupleZget_hatch_color	get_hatchr   r   r   get_hatch_path)r4   gcrgbFaceedgedictkeyoid_r   r   r   
_get_hatch  s   zRendererSVG._get_hatchc           
   
   C   s*  t | jsd S d}| j}|d | j D ]w\\}}}}|jd|dddt|t|d | j|t |dd	d	|d
d}|d u rHd}nt
|}|jdddt|d t|d |d t
|t
|ttjd ddd}	|d dk r~t|d |	d< |jd|t|	d |d q|d d S )Nry   r   patternuserSpaceOnUser&   )rO   ZpatternUnitsr)   yr~   r         ?      r   Fsimplifynonerectr<   )r)   r   r~   r   fillzhatch.linewidthrl   Zmiter)r   strokestroke-widthr   r      stroke-opacitypath)r   r   )rA   r   r   rH   valuesro   _convert_pathr   rZ   r[   r   rQ   r   r   rk   rN   )
r4   Z
HATCH_SIZEr   r   Zfacer   r   	path_datar   Zhatch_styler   r   r   r     sV   



zRendererSVG._write_hatchesc           	      C   s  i }|  }| dur3d| || d|d< |dur2t|dkr2|d dkr2|s2t|d |d< n/|du r<d	|d< n&t|dd d
krLt||d< t|dkrb|d dkrb|sbt|d |d< |rr| dkrrt| |d< | \}}|durd	dd |D |d< tt
||d< | }|r| }t||d< |s|d dkrt|d |d< |dkrt||d< | dkr| |d< | dkrt|  |d< |S )z=Generate a style string from the GraphicsContext and rgbFace.Nurl(#rK   r      r   r   fill-opacityr   )r   r   r   opacityr   c                 s   r^   r_   r`   )ra   valr   r   r   rb   6  s    
z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetr   r   r   rm   r   rl   r   )get_forced_alphar   r   rA   r*   r   r   	get_alphaZ
get_dashesr9   floatZget_linewidthget_rgbZget_joinstyleZget_capstyle_capstyle_d)	r4   r   r   rD   Zforced_alphaoffsetseqZ	linewidthrgbr   r   r   _get_style_dict  sL    

zRendererSVG._get_style_dictc                 C   s   t | ||S r_   )rk   r   )r4   r   r   r   r   r   
_get_styleI     zRendererSVG._get_stylec                 C   s   |  }| \}}|d ur| |}t|t|f}n|d ur5|j\}}}}	| j||	  }||||	f}ni S | j|}
|
d u r]| 	d|}|d urU||f|f| j|< n||f| j|< n|
\}
}dd| diS )Npz	clip-pathr   rK   )
Zget_clip_rectangleZget_clip_pathr   rO   ro   Zboundsr   r   r   r   )r4   r   Zcliprectclippathclippath_transr   r)   r   wr   clipr   r   r   r   _get_clip_attrsL  s$   
zRendererSVG._get_clip_attrsc                 C   s   t | jsd S | j}|d | j D ]B\}}|jd|d t |dkr9|\}}| j||dd}|jd|d n|\}}}	}
|jd	t|t|t|	t|
d
 |d q|d d S )Nr   ZclipPathrO      Fr   r   r   r   r)   r   r~   r   )	rA   r   r   rH   r   r   rQ   r*   rN   )r4   r   r  r   r  r  r   r)   r   r  r   r   r   r   r   c  s,   

zRendererSVG._write_clipsc                 C   sV   |r| j jd|d d S | j|dd | j|< | j jd| d| j| dd d S )Ngr  r   r<   r   r   )r   rH   r   r   )r4   r   gidr   r   r   
open_groupz  s   &zRendererSVG.open_groupc                 C   s   | j d d S )Nr
  )r   rN   )r4   r   r   r   r   close_group     zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   rS   r   r   r   option_image_nocomposite     z$RendererSVG.option_image_nocompositec              
   C   s<   |rdd| j | jf}nd }t|||||dg dddS )N           )   M   L   Q   C   zFascii)r~   r   r   Zconvert_to_stringdecode)r4   r   r   r  r   sketchr   r   r   r     s   zRendererSVG._convert_pathc           	      C   s   |  |}|d u o| d u }|jo|}| j||||| d}| d ur1| jdd| i | jjdd|i| 	|d| 
||i | d urU| jd d S d S )N)r  r   r  a
xlink:hrefr   r   r   )r   )r   r   Zshould_simplifyr   Zget_sketch_paramsget_urlr   rH   rQ   r  r   rN   )	r4   r   r   r   r   trans_and_flipr  r   r   r   r   r   	draw_path  s   


zRendererSVG.draw_pathc                 C   sl  t |jsd S | j}| j||t dd dd}| ||}	|t|	f}
| j	|
}tdd |	
 D }	|d u rX| d|
}|d |jd	|||	d
 |d || j|
< |jdi | | | |}dd| i}dd| jd | jd f}|j||ddD ]+\}}t |r|dd  \}}t||d< t||d< | |||d< |jd|d q|d d S )Nr   r   Fr   c                 S   s    i | ]\}}| d r||qS )r   )
startswithri   r   r   r   
<dictcomp>  s    z,RendererSVG.draw_markers.<locals>.<dictcomp>r   r   r   )rO   r   r   r
  r  #r   ry   )r  r   r)   r   r   userj   r
  )rA   verticesr   r   r   rZ   r   rk   r   r   rB   r   rH   rQ   rN   r  r   r~   r   iter_segmentsr*   r   )r4   r   Zmarker_pathZmarker_transr   transr   r   r   r   r   r   r  rD   r  r&  coder)   r   r   r   r   draw_markers  sB   




zRendererSVG.draw_markersc                     s  t |dkrt |d jnd}| |||||}|d|  d |d | k }|s:t |||||||||	|
|||S | j}g }|d t| |||D ]1\}\}}t	|
 dd}| j||dd	}d
| j|| d|}|jd||d || qM|d | |||||||	|
|||D ]S\}}}}}| }|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}_{}r8   r   )rO   r   r  r  rj   r
  r"  )r  r)   r   r   r$  r<   r%  )rA   r&  Z_iter_collection_uses_per_pathr   draw_path_collectionr   rH   	enumerateZ_iter_collection_raw_pathsr   Z
get_matrixrZ   r   rd   r   r   rQ   r@   rN   Z_iter_collectionr  r  r*   r   r   ) r4   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_attrsrD   r   r   r   r-    sd   	






z RendererSVG.draw_path_collectionc                 C   s   |  |||| d S r_   )_draw_gouraud_triangle)r4   r   pointscolorsr(  r   r   r   draw_gouraud_triangle  s   z!RendererSVG.draw_gouraud_trianglec              
   C   s
  | j }| js8d| _|jddd |jdddidd	d
d
d |d |jddd |jdddidd |d tj|dd}|d dkrGd S | |}||}|d t	dD ]}	||	 \}
}||	d d  \}}||	d d  \}}||	 }||kr|}|}n1||kr|
}|}n(|| ||  }|||  }d|  }|||
  }| | ||  }|| | }|jdd| j
dd|	ddt|
t|t|t|d  |jd!d
tt|t|d d"d# |jd!d$tt|d$d"d# |d qZ|d d%t|
 d& t| }|d't| d& t| 7 }|d(t| d& t| d) 7 }|jd*|t|d
d+d,d- |jd.d/d$d+d0d1d- |jd*|d2| j
dd3d+d4d- |jd*|d2| j
dd5d6d+d7d- |jd*|d2| j
dd8d6d+d7d- |d. |  j
d7  _
d S )9NTfilterZcolorAddr  ZfeCompositeinZSourceGraphicZBackgroundImageZ
arithmetic1)rD   Zin2operatorZk2Zk3ZcolorMatZfeColorMatrixrf   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 )rD   r   r   )ZaxisrL   r   r   r<   r  r   ZlinearGradientZGRr)   r   r   r   )rO   ZgradientUnitsx1y1x2y2stop)z
stop-colorzstop-opacity)r   r   r&   zM r   z L r=   z Zr   
crispEdges)r   r   r   shape-renderingrj   r
  r   zurl(#colorMat))r   r   rC  r9  zurl(#GRz_0))r   r   rC  z_1)zurl(#colorAdd))r   r   r9  rC  z_2))r   r   rH   rQ   rN   rt   Zaverager   r   ranger   r*   rk   r   )r4   r   r6  r7  r(  r   Z	avg_colorr  Ztpointsr2  r=  r>  r?  r@  Zx3Zy3Z
rgba_colorxbZybm1b1m2b2dpathr   r   r   r5  	  s   







 
z"RendererSVG._draw_gouraud_trianglec                 C   sT   | j jdi | | | }t||D ]\}}| |||| q| j d d S )Nr
  r%  )r   rH   r  frozenzipr5  rN   )r4   r   Ztriangles_arrayZcolors_arrayr   Ztricolr   r   r   draw_gouraud_triangles  s
   z"RendererSVG.draw_gouraud_trianglesc                 C   rR   rU   r   rS   r   r   r   option_scale_image  rT   zRendererSVG.option_scale_imagec                 C   s
   | j d S )N      R@)r   rS   r   r   r   get_image_magnification  s   
z#RendererSVG.get_image_magnificationc              	   C   sd  |j d d \}}|dks|dkrd S | |}|r#| jjd i | | }	|	d ur5| jjdd|	id i }
| }tjd rft }t	
|j|dd	 |pV| d
| }dt| d |
d< n1| jd u rotd| j dt| j d}td| t	
|| |pd| d
| }||
d< ||
d< |d u rd| | j }d| | j }| jjd
tddd| ffgt|t| j| |  t|t||
d nH| }|dkrt||
d< t d| d| | t ||ddd| j }td|  fg|
d< d|
d< | jjd
t|t||
d |	d ur%| j!d |r0| j!d d S d S )!Nr  r   r
  r  r  rj   zsvg.image_inlineZpng)rd   imagezdata:image/png;base64,
r  zLCannot save image data to filesystem when writing SVG to an in-memory bufferz.imagez.pngz$Writing image file for inclusion: %sZIm_rO   rP  )rZ   )r<   rL   r[   )r   r)   r   r~   r   rD   r   r   r   r  r]   r   z5image-rendering:crisp-edges;image-rendering:pixelatedr   )r~   r   rD   r%  )"shaper  r   rH   r  Zget_gidr   r   r   r   Z	fromarraysaver   getvaluebase64	b64encoder  r   r   nextr   _logrq   r   rQ   rh   r*   r   r   r   rZ   r[   rK  rN   )r4   r   r)   r   Zimr   r   r  r4  r3  rD   r   buffilenamealphaZflippedr   r   r   
draw_image  s   


	

zRendererSVG.draw_imagec                 C   s   | j }|r?|d | D ]#\}\}}| |}| jt|d |dd}|jd||tdgd q|d | j	
| dS dS )	zn
        Emit definitions for not-yet-defined glyphs, and record them as having
        been defined.
        r   @   Fr   r   )rZ   )g      ?)rO   r   r   N)r   rH   rB   _adjust_char_idr   r   rQ   rh   rN   r   r   )r4   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   )r4   ra  r   r   r   r_    s   zRendererSVG._adjust_char_idc	                  C   s  | j }	|	| | j}
| j}t| }| }i }|dkr"||d< | r*| n| d }|dkr:t	||d< ||j
 }t|td||ffd| ffd|| ffgd	}|	jd
|d |s||}|j|||
dd}|\}}}| | |D ](\}}}}dd| i}|dkrt	||d< |dkrt	||d< |	jd|d q{na|dkr|j|||
dd}n	|j|||
dd}|\}}}| | |D ]#\}}}}| |}|	jdtd||ffd|ffgdd| id q|D ]\}}t||}| j|dd}|	jd|d q|	d
 d S )N#000000r   r   r<   r   r[   r\   rZ   r   r   r
  rj   T)	glyph_mapZreturn_new_glyphs_onlyr  r"  r  r)   r   r$  TeX)r   rD   Fr   r   r  )r   rI   r   
_text2pathr   r   Zget_size_in_pointsr   r   r*   Z
FONT_SCALErk   rh   rH   Z	_get_fontZget_glyphs_with_fontrc  rQ   Zget_glyphs_texZget_glyphs_mathtextr_  r   r   rN   ) r4   r   r)   r   r   propangleismathmtextr   rf  Z	text2pathcolorfontsizer   r\  Z
font_scalerD   fontZ_glyphsZ
glyph_infor`  rectsZglyph_idZ	xpositionZ	ypositionrZ   ra  Zvertsrb  r   r   r   r   r   _draw_text_as_path  sx   






	




zRendererSVG._draw_text_as_pathc	           &   	      s  | j }	t| }
i }|
dkr|
|d< | r| n| d }|dkr+t||d< |s2i }g }| dkr?||  | dkrL||  t	j
|  }|dkr]||  dd	 fd
d  fdd}|t|  ddt||g d||d< | dkr| |d< t||d< |r|dks| dkr| }|| \}}| j| }t|}tt|t|g}t||| || g}|||d   }|||d   }dddd}||  |d< t||d< t||d< t||d< td| ||ffg|d< ntd||ffd| ffg|d< |	j d ||d! d S |	!| | j"j#$|d"|\}}}}}|	j%d#t|td||ffd| ffgd$ |	%d  i }|D ]l\}}} }!}"t	&|}#g }|#j'dkr~||#j' |#j(dkr||#j( |#j)dkr||#j)  |t| d|#j*g dd|i}|#j+dkr|#j+|d< t|}| d%krd&} |,|g |!|" | f qd|- D ]F\}}$|$.  t/d'd( |$D dkrt0|$d d }%n
dd)d* |$D }%|dd+d* |$D |%d,}|	j d-d.d/d* |$D |d! q|	1d  |D ]\}}}}|	j d0t|t| d t|t|d1 q#|	1d# d S )2Nrd  r   r   r<   r   normali  c                 S   s   | dv rdS | S )N)sansz
sans serifz
sans-serifr   )r{   r   r   r   _normalize_sans\  r   z7RendererSVG._draw_text_as_text.<locals>._normalize_sansc                 3   s:     | } | t jv rt j| D ]} |V  q| V  d S r_   )fmfont_family_aliasesZFontManagerZ_expand_aliases)fnr{   )rt  r   r   _expand_family_entry_  s   

z<RendererSVG._draw_text_as_text.<locals>._expand_family_entryc                    s    fdd|   D S )Nc                    s0   g | ]} |D ]}|t jv r|nt|qqS r   )ru  rv  repr)ra   entryr{   rx  r   r   
<listcomp>m  s    zQRendererSVG._draw_text_as_text.<locals>._get_all_quoted_names.<locals>.<listcomp>)Z
get_family)ri  r{  r   r   _get_all_quoted_namesk  s   
z=RendererSVG._draw_text_as_text.<locals>._get_all_quoted_namesZpxz, r=   ro  zfont-stretchr   r   anchorrH   rN   middle)leftrightcenterztext-anchorr)   r   r\   r   r[   rJ   rj   ry   r
  re         c                 S   s   h | ]\}}}|qS r   r   )ra   r)   r   tr   r   r   	<setcomp>  s    z1RendererSVG._draw_text_as_text.<locals>.<setcomp>c                 s       | ]	}t |d  V  qdS )r<   N)ro   ra   cr   r   r   rb         z1RendererSVG._draw_text_as_text.<locals>.<genexpr>c                 s   r  )r   Nr`   r  r   r   r   rb     r  )r   r)   r   Ztspanr8   c                 s   r  )r  N)chrr  r   r   r   rb     r  r   r	  )2r   r   r   r   r   r*   	get_styler@   get_variantru  Zweight_dictZ
get_weightextendget_sizer9   r   fromkeysZget_stretchrk   Zget_rotation_modeZget_transformr   Zget_unitless_positionr   rt   Zdeg2radarraysincosdotZget_harh   rQ   rI   rh  Zmathtext_parserparserH   ZttfFontPropertyr   variantweightr{   Zstretch
setdefaultrB   sortrA   ro   rN   )&r4   r   r)   r   r   ri  rj  rk  rl  r   rm  r   r\  rD   Z
font_partsr  r}  r   axZayZ	angle_radZdir_vertZv_offsetZha_mpl_to_svgr~   r   ZdescentZglyphsrp  spansro  rn  ZthetextZnew_xZnew_yrz  charsZysr   )rx  rt  r   _draw_text_as_textD  s   














zRendererSVG._draw_text_as_textFc	           
   
   C   s   |  |}	|	r| jjdi |	 | d ur!| jdd| i tjd dkr5| |||||||| n| |||||||| | d urM| jd |	rW| jd d S d S )Nr
  r  r  zsvg.fonttyper   r%  )	r  r   rH   r  r   r   rq  r  rN   )
r4   r   r)   r   r   ri  rj  rk  rl  r4  r   r   r   	draw_text  s   
zRendererSVG.draw_textc                 C   rR   rU   r   rS   r   r   r   flipy  rT   zRendererSVG.flipyc                 C   s   | j | jfS r_   )r~   r   rS   r   r   r   get_canvas_width_height  r  z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S r_   )rh  get_text_width_height_descent)r4   r   ri  rk  r   r   r   r    r  z)RendererSVG.get_text_width_height_descent)Nry   r_   )NNNN)FN)%rV   rW   rX   r6   r   r   r   r   r   r   r   r   r   r  r   r  r  r  r   r  r*  r-  r8  r5  rN  rO  rQ  r]  rc  r_  rq  r  r  r  r  r  __classcell__r   r   r   r   rx   !  sR    &{		,-




': 
N

F 
#rx   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svgzry   N)bbox_inches_restorerz   c                C   s   t j|dddI}t |std|}| jj}d| j_| j \}}|d |d }}	t| j|||t	||	|||d|d}
| j
|
 |
  W d   dS 1 sTw   Y  dS )a  
        Parameters
        ----------
        filename : str or path-like or file-like
            Output target; if a string, a file will be opened for writing.

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

            The standard keys and their value types are:

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

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

            Information is encoded as `Dublin Core Metadata`__.

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

            __ DC_
        r  zutf-8)encodingry   )r   rz   )r  N)r   open_file_cmZfile_requires_unicodecodecs	getwriterfiguredpiZget_size_inchesr
   rx   drawr   )r4   r[  r  rz   fhr  r~   r   r  r   rendererr   r   r   	print_svg  s    


"zFigureCanvasSVG.print_svgc              	   K   s   t |d0}tjd|d}| j|fi |W  d    W  d    S 1 s)w   Y  W d    d S 1 s9w   Y  d S )Nwbr  )modefileobj)r   r  gzipGzipFiler  )r4   r[  kwargsr  Z
gzipwriterr   r   r   
print_svgz>  s   RzFigureCanvasSVG.print_svgzc                 C   rR   )Nr|   r   rS   r   r   r   get_default_filetypeC  s   z$FigureCanvasSVG.get_default_filetypec                    s   | j   t  S r_   )r  Zdraw_without_renderingr   r  rS   r   r   r   r  F  s   

zFigureCanvasSVG.draw)
rV   rW   rX   	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)rV   rW   rX   r   r   Zbackend_versionr  ZFigureCanvasr   r   r   r   r  U  s    r  )<rV  r  r   r  r   ior   r   loggingr   rer   numpyrt   ZPILr   Z
matplotlibr   r   r   ru  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   	getLoggerrV   rY  r   compiler   r    r#   r$   r*   r+   rh   rk   r   rs   rw   rx   r  ZFigureManagerSVGr   Zexportr  r   r   r   r   <module>   sb    
)
	        pA