o
    h8                     @   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   s/var/www/html/construction_image-detection-poc/venv/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   __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   rB   r1   r    )r4   commentr   r   r   rJ      s   	zXMLWriter.commentc                 C   s   | j | dS )z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r2   rA   )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   rB   )r4   rD   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)rB   r1   rO   )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)rI   r;   rO   )r4   rD   rK   rE   rF   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@   rI   rJ   r;   rO   rQ   rR   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   	to_valuesrA   formatr9   )transform_listpartstypevaluer   r   r   _generate_transform   s   
rk   c                 C   s   d dd |  D S )Nz; c                 s   s"    | ]\}}| d | V  qdS )z: Nr   rb   rG   rH   r   r   r   rc   
  s     z _generate_css.<locals>.<genexpr>)r9   rC   rE   r   r   r   _generate_css	  s   rn   squarebuttround)
projectingrp   rq   c                 C   s(   t | tstd| dt|  dd S )NInvalid type for z metadata. Expected str, not r'   )rd   str	TypeErrorri   )infokeyr   r   r   _check_is_str  s
   


rx   c                 C   sV   t | r| D ]}t|tstd| dt| dqd S td| dt|  d)Nrs   z) metadata. Expected iterable of str, not r'   z0 metadata. Expected str or iterable of str, not )npiterablerd   rt   ru   ri   )infosrw   rv   r   r   r   _check_is_iterable_of_str  s   





r|   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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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 | _i | _d| _i | _d| _d| _t   t | _t|}t|}|t | jjd| d| dd| d| d	d
tj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svg.idzxmlns:xlinkzhttp://www.w3.org/1999/xlink)widthheightviewBoxxmlnsversionrP   rE   )!r   r   r+   writer	image_dpigetattrrd   rt   basename_groupd	itertoolscount_image_counter_clip_path_ids_clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientssuperr6   dict
_glyph_mapr*   r-   	svgPrologrI   mplrcParams	_start_id_write_metadata_write_default_style)	r4   r   r   	svgwriterr   r   r   
str_height	str_width	__class__r   r   r6   "  sF   





	zRendererSVG.__init__c                 C   s$   || j vrt| j | j |< | j | S )a  
        Returns a stable and unique identifier for the *clippath* argument
        object within the current rendering context.

        This allows plots that include custom clip paths to produce identical
        SVG output on each render, provided that the :rc:`svg.hashsalt` config
        setting and the ``SOURCE_DATE_EPOCH`` build-time environment variable
        are set to fixed values.
        )r   rB   )r4   clippathr   r   r   _get_clippath_idJ  s   


zRendererSVG._get_clippath_idc                 C   s,   |    |   | j| j | j  d S r`   )_write_clips_write_hatchesr   rQ   r   r,   rT   r   r   r   finalizeX  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)rK   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 )	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:rdfrm   zcc:Work)rI   )midr   r   r   ensure_metadata  s   


z4RendererSVG._write_metadata.<locals>.ensure_metadatar   zdc:typezrdf:resourcerm   )	r   Coverager   Descriptionr   
IdentifierLanguageRelationSourcezdc:)r   Contributor	PublisherRightszcc:Agentzdc:titleKeywordsz
dc:subjectzrdf:Bagzrdf:liz.Unknown metadata key(s) passed to SVG writer: ,)!r   __version__r   rx   rR   getrd   rt   datetimedate	isoformatry   rz   rA   ru   ri   r9   osgetenvfromtimestampinttimezoneutcr   r   todayrN   lowerr|   rI   rO   rQ   
ValueError)r4   r   r   r   datesdr   r   urirw   rv   agentsagentkeywordskeywordr   r   r   r   ^  s   

















zRendererSVG._write_metadatac                 C   s@   | j }tddd}|d |jddd| d |d d S )	Nrq   rp   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})ri   rK   )r   rn   rI   rR   rO   )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   r   rt   uuiduuid4hashlibsha256updateencode	hexdigest)r4   ri   contentsaltmr   r   r   _make_id  s   
zRendererSVG._make_idc                 C   s   |t  ddd| j S )Nr=   rM   r   )r   r[   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 r?| d|}| |||f|f| j|< |S |\}}|S )z,
        Create a new hatch pattern
        Nh)tupleget_hatch_colorget_hatch_linewidth	get_hatchr   r   r   get_hatch_path)r4   gcrgbFaceedgelwdictkeyoid_r   r   r   
_get_hatch  s   zRendererSVG._get_hatchc              
   C   s&  t | jsd S d}| j}|d | j D ]u\\}}}}}|jd|dddt|t|d | j|t |dd	d	|d
d}|d u rId}	nt
|}	|jdddt|d t|d |	d t
|t
|t|ddd}
|d dk r|t|d |
d< |jd|t|
d |d q|d d S )Nr~   r   patternuserSpaceOnUser&   )rP   patternUnitsr)   yr   r         ?      r   Fsimplifynonerectr=   )r)   r   r   r   fillrp   miter)r  strokestroke-widthr   r      stroke-opacitypath)r   r   )rB   r   r   rI   valuesrt   _convert_pathr   r[   r\   r   rR   rn   rO   )r4   
HATCH_SIZEr   r  facer  r   r   	path_datar  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(#rL   r     r  r   fill-opacityr   )r   r   r   opacityr   c                 s   r_   r`   ra   )rb   valr   r   r   rc   G  s    
z.RendererSVG._get_style_dict.<locals>.<genexpr>zstroke-dasharrayzstroke-dashoffsetr  r  r  rq   r   rp   r   )get_forced_alphar   r   rB   r*   r   r   	get_alpha
get_dashesr9   floatget_linewidthget_rgbget_joinstyleget_capstyle_capstyle_d)	r4   r   r   rE   forced_alphaoffsetseq	linewidthrgbr   r   r   _get_style_dict-  sL    

zRendererSVG._get_style_dictc                 C   s   t | ||S r`   )rn   r"  )r4   r   r   r   r   r   
_get_styleZ     zRendererSVG._get_stylec                 C   s   |  }| \}}|d ur| |}| |t|f}n|d ur6|j\}}}}	| j||	  }||||	f}ni S | j|}
|
d u r^| 	d|}|d urV||f|f| j|< n||f| j|< n|
\}}dd| diS )Npz	clip-pathr  rL   )
get_clip_rectangleget_clip_pathr   r   rt   boundsr   r   r   r   )r4   r   cliprectr   clippath_transr   r)   r   wr   clipr   r   r   r   r   _get_clip_attrs]  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   clipPathrP      Fr   r  r   r  r)   r   r   r   )	rB   r   r   rI   r	  r
  rR   r*   rO   )r4   r   r,  r   r   r*  r  r)   r   r+  r   r   r   r   r   t  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   rI   r   r   )r4   r   gidr   r   r   
open_group  s   &zRendererSVG.open_groupc                 C   s   | j d d S )Nr3  )r   rO   )r4   r   r   r   r   close_group     zRendererSVG.close_groupc                 C   s   t jd  S )Nzimage.composite_image)r   r   rT   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   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   rD  a
xlink:hrefr  r   r   )r  )r   r   should_simplifyr
  get_sketch_paramsget_urlr   rI   rR   r-  r#  rO   )	r4   r   r  r   r   trans_and_flipr,  r   r  r   r   r   	draw_path  s   


zRendererSVG.draw_pathc                 C   s  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 urt| jd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 ur| jd |d d S )Nr   r   Fr   c                 S   s    i | ]\}}| d r||qS )r  )
startswithrl   r   r   r   
<dictcomp>  s    z,RendererSVG.draw_markers.<locals>.<dictcomp>r   r   r  )rP   r   r   r3  rE  rF  #r   r~   )r,  r   r)   r   r   userm   r3  )rB   verticesr   r
  r   r[   r"  rn   r   r   rC   r   rI   rR   rO   r-  rI  r   r   r   iter_segmentsr*   r#  )r4   r   marker_pathmarker_transr  transr   r   r  r   r   r   rJ  rE   r,  rR  coder)   r   r   r   r   draw_markers  sJ   




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  )rP   r   rE  rF  rm   r3  rN  )rF  r)   r   r   rP  r=   rQ  )rB   rR  _iter_collection_uses_per_pathr   draw_path_collectionr   rI   	enumerate_iter_collection_raw_pathsr   
get_matrixr[   r
  rf   r   r   rR   rA   rO   _iter_collectionrI  r-  r*   r   r#  ) r4   r   master_transformpathsall_transformsoffsetsoffset_trans
facecolors
edgecolors
linewidths
linestylesantialiasedsurlsoffset_positionlen_pathuses_per_pathshould_do_optimizationr   
path_codesir  r   r   r   xoyopath_idgc0r   url
clip_attrsrE   r   r   r   r\    sd   	






z RendererSVG.draw_path_collectionc                 C   sz  t j|dd}|d dkrd S | j}|d tdD ]}|| \}}||d d  \}}	||d d  \}
}|| }||
krD|}|}n1|	|krM|}|	}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	 q|
d dt| dt| dt| dt|	 dt|
 dt| d}|jd|t	|dddd |jddddd d!d |jd|d"| jdd#dd$d |jd|d"| jdd%d&dd'd |jd|d"| jdd(d&dd'd |
d |  jd7  _d S ))Nr   )axisrM   r   r  r=   r0  r   linearGradientGRr)   r   r   r   )rP   gradientUnitsx1y1x2y2stop1)z
stop-colorzstop-opacity)r  r   r&   zM r   z L r>   z Zr  
crispEdges)r   r  r  shape-renderingrm   r3  r   zurl(#colorMat))r  r  r  filterzurl(#GRz_0))r   r  r  z_1)zurl(#colorAdd))r   r  r  r  z_2))ry   averager   rI   ranger   r*   rR   rn   r   rO   )r4   transformed_pointscolors	avg_colorr   rq  r|  r}  r~  r  x3y3
rgba_colorxbybm1b1m2b2dpathr   r   r   _draw_gouraud_triangle  s   




z"RendererSVG._draw_gouraud_trianglec           	      C   s   | j }|jdi | | | }| |}| jsLd| _|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||D ]\}}| 	|
|| qQ|d d S )Nr3  Tr  colorAddr/  feCompositeinSourceGraphicBackgroundImage
arithmeticr  )rE   in2operatork2k3colorMatfeColorMatrixri   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 )rE   r	  rQ  )r   rI   r-  frozenr   r   rR   rO   zipr  r   )	r4   r   triangles_arraycolors_arrayr   r   rJ  pointsr  r   r   r   draw_gouraud_triangles  s>   


z"RendererSVG.draw_gouraud_trianglesc                 C   rS   rV   r   rT   r   r   r   option_scale_image  rU   zRendererSVG.option_scale_imagec                 C   s
   | j d S )N      R@)r   rT   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 )!Nr0  r   r3  rE  rF  rm   zsvg.image_inlinepng)rf   imagezdata:image/png;base64,
rA  zLCannot save image data to filesystem when writing SVG to an in-memory bufferz.imagez.pngz$Writing image file for inclusion: %sIm_rP   r  )r[   )r=   rM   r\   )r   r)   r   r   r   rE   r   r  r   r:  r^   r   z5image-rendering:crisp-edges;image-rendering:pixelatedr   )r   r   rE   rQ  )"shaper-  r   rI   rI  get_gidr   r   r   r   	fromarraysaver   getvaluebase64	b64encoderC  r   r   nextr   _logrv   r   rR   rk   r*   r   r  r   r[   r\   r  rO   )r4   r   r)   r   imr   r   r+  rw  rv  rE   r   buffilenamealpha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  )r[   )g      ?)rP   r   r   N)r   rI   rC   _adjust_char_idr
  r   rR   rk   rO   r   r   )r4   glyph_map_newr   char_idrR  codesr  r   r   r   _update_glyph_map_defs  s   


z"RendererSVG._update_glyph_map_defsc                 C   s   | ddS )Nz%20r   r   )r4   r  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 ]\}}}}|	jdtd||ffd|ffgdd| i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]   r[   r   r   r3  rm   T)	glyph_mapreturn_new_glyphs_onlyrP  rF  rN  )r   rE   TeXFr   r  r1  )r   rJ   r   
_text2pathr   r  get_size_in_pointsr  r  r*   
FONT_SCALErn   rk   rI   	_get_fontget_glyphs_with_fontr  rR   get_glyphs_texget_glyphs_mathtextr  r   r
  rO   ) r4   r   r)   r   r   propangleismathmtextr   r  	text2pathcolorfontsizer   r  
font_scalerE   font_glyphs
glyph_infor  rectsglyph_id	xposition	ypositionr[   r  vertsr  r  r  r   r   r   _draw_text_as_path  s|   













zRendererSVG._draw_text_as_pathc	           '   	      sB  | j }	t| }
i }i }|
dkr|
|d< | r| n| d }|dkr-t||d< |s1i }| dkr>| |d< | dkrJ| |d< tj	|
  }|d	krZ| |d
< dd fdd  fdd}t|  d|d< dt|||d< | dkr| |d< ti |||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i |||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i ||td"||ffd | ffgd' |	#d# i }|D ]g\}}} }!}"t$|}#i }|#j%dkr|#j%|d< |#j&dkr|#j&|d< |#j'd	kr|#j' |d
< t| d|d< |#j(|d< |#j)dkr|#j)|d< ti ||}$| d(krd)} |*|$g +|!|" | f qg|, D ]"\}$}%|%-  |%D ]\}}}&|	jd*t.|&t|t||$d+ qݐq|	/d# |D ]\}}}}|	jd,t|t| d t|t|d- q|	/d& d S ).Nr  r  r  r=   r  normalz
font-stylezfont-varianti  zfont-weightc                 S   s   | dv rdS | S )N)sansz
sans serifz
sans-serifr   )r   r   r   r   _normalize_sanss  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_aliasesFontManager_expand_aliases)fnr   )r  r   r   _expand_family_entryv  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   )r  r  repr)rb   entryr   r  r   r   
<listcomp>  s    zQRendererSVG._draw_text_as_text.<locals>._get_all_quoted_names.<locals>.<listcomp>)
get_family)r  r  r   r   _get_all_quoted_names  s   
z=RendererSVG._draw_text_as_text.<locals>._get_all_quoted_namespxz	font-sizez, zfont-familyzfont-stretchr   r   anchorrI   rO   middle)leftrightcenterztext-anchorr)   r   r]   r   r\   rK   rm   r~   r3  r         tspan)r)   r   r   r  r2  )0r   r   r  r  r  r*   	get_styleget_variantr  weight_dict
get_weightget_sizer9   r   fromkeysget_stretchrn   get_rotation_modeget_transformr   get_unitless_positionr   ry   deg2radarraysincosdotget_hark   rR   rJ   r  mathtext_parserparserI   ttfFontPropertyr   variantweightr   stretch
setdefaultrA   rC   sortchrrO   )'r4   r   r)   r   r   r  r  r  r  r   r  
font_stylecolor_styler  rE   r  r  r   axay	angle_raddir_vertv_offsetha_mpl_to_svgr   r   descentglyphsr  spansr  r  thetextnew_xnew_yr  r   charstr   )r  r  r   _draw_text_as_textU  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 )Nr3  rE  rF  zsvg.fonttyper  rQ  )	r-  r   rI   rI  r   r   r  r   rO   )
r4   r   r)   r   r   r  r  r  r  rw  r   r   r   	draw_text  s   
zRendererSVG.draw_textc                 C   rS   rV   r   rT   r   r   r   flipy	  rU   zRendererSVG.flipyc                 C   s   | j | jfS r`   )r   r   rT   r   r   r   get_canvas_width_height  r9  z#RendererSVG.get_canvas_width_heightc                 C   s   | j |||S r`   )r  get_text_width_height_descent)r4   r   r  r  r   r   r   r$    r7  z)RendererSVG.get_text_width_height_descent)Nr~   r`   )NNNN)FN)%rW   rX   rY   r6   r   r   r   r   r   r   r   r   r"  r#  r-  r   r5  r6  r8  r
  rK  rX  r\  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  __classcell__r   r   r   r   r}   !  sP    ({		,-




+:h!
N

G 
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   svgzr~   N)bbox_inches_restorer   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)encodingr~   )r   r   )r(  N)r   open_file_cmfile_requires_unicodecodecs	getwriterfiguredpiget_size_inchesr
   r}   drawr   )r4   r  r(  r   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GzipFiler4  )r4   r  kwargsr2  
gzipwriterr   r   r   
print_svgzJ  s   RzFigureCanvasSVG.print_svgzc                 C   rS   )Nr   r   rT   r   r   r   get_default_filetypeO  s   z$FigureCanvasSVG.get_default_filetypec                    s   | j   t  S r`   )r.  draw_without_renderingr   r1  rT   r   r   r   r1  R  s   

zFigureCanvasSVG.draw)
rW   rX   rY   	filetypes	fixed_dpir4  r<  r=  r1  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)rW   rX   rY   r   r   backend_versionr&  FigureCanvasr   r   r   r   rA  a  s    rA  )<r  r,  r   r8  r   ior   r   loggingr   rer   numpyry   PILr   
matplotlibr   r   r   r  matplotlib.backend_basesr   r   r   r	   !matplotlib.backends.backend_mixedr
   matplotlib.colorsr   matplotlib.datesr   matplotlib.pathr   r   matplotlib.transformsr   r   	getLoggerrW   r  r   compiler   r    r#   r$   r*   r+   rk   rn   r  rx   r|   r}   r&  FigureManagerSVGr   exportrA  r   r   r   r   <module>   sb    
)
	        |A