a
    ضa>H                     @   s  d Z ddlZddlZddlZddlZzddlZejdk r<eW nN ey   zddl	ZW n. ey Z
 zede
W Y dZ
[
n
dZ
[
0 0 Y n0 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mZ ddlmZ dd	lmZ dd
lmZ ddlmZ ej Z!ej"dkrdd Z#ndd Z#d ddZ$dd Z%ej&ej&ej&ej&ej&ej'ej'ej'ej'ej&ej&ej&ej&ej&ej'ej'ej'ej'ej'dZ(ej)ej*ej+dZ,G dd deZ-G dd deZ.G dd dZ/G dd deZ0ej1G dd deZ2dS )!z
A Cairo backend for Matplotlib
==============================
:Author: Steve Chaplin and others

This backend depends on cairocffi or pycairo.
    N)      r   zEcairo backend requires that pycairo>=1.11.0 or cairocffi is installed   )_apicbookfont_manager)_Backend_check_savefig_extra_argsFigureCanvasBaseFigureManagerBaseGraphicsContextBaseRendererBase)ttfFontPropertyMathTextParser)Path)Affine2D	cairocffic                 C   s8   t | tjs4tjjtjdt| tj d dd} | S )Nz
cairo_t **r   T)Zincref)	
isinstancecairoContextZ_from_pointerfficastidobject__basicsize__ctx r   q/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/matplotlib/backends/backend_cairo.py_to_context,   s    r    c                 C   s   | S Nr   r   r   r   r   r    6   s    c           	      C   s   |j |d|dD ]\}}|tjkr.| j|  q|tjkrB|   q|tjkrX| j|  q|tjkrt	
|  }|d d }|dd  }| jg |d |d d  |d d |d  |R   q|tjkr| j|  qd S )NT)Zremove_nansclipr      )iter_segmentsr   ZMOVETOmove_toZ	CLOSEPOLYZ
close_pathZLINETOZline_toZCURVE3npasarrayZget_current_pointZcurve_toZCURVE4)	r   path	transformr"   pointscodecurabr   r   r   _append_path:   s     




:
r0   c                    s\    fdd}|d}t td|d  }|d}tj||dk rLtjntj}|||fS )z{
    Convert a `.FontProperties` or a `.FontEntry` to arguments that can be
    passed to `.Context.select_font_face`.
    c                    s6   zt  d|   W S  ty0   t  |  Y S 0 d S )Nget_)getattrAttributeError)fieldpropr   r   attrQ   s    z-_cairo_font_args_from_font_prop.<locals>.attrnameZFONT_SLANT_styleweighti&  )r2   r   upperr   Zweight_dictgetFONT_WEIGHT_NORMALFONT_WEIGHT_BOLD)r6   r7   r8   Zslantr:   r   r5   r   _cairo_font_args_from_font_propL   s    r?   )d      i,  i  i  iX  i  i   i  Z
ultralightlightnormalZmediumZregularZsemiboldboldZheavyZ	ultraboldblack)italicrC   Zobliquec                       s   e Zd Zededd Z fddZdd Zdd	 Z	d
d Z
d ddZd!ddZdd Zd"ddZdd Zdd Z fddZdd Zdd Z  ZS )#RendererCairoz3.4c                 C   s   t dS )NZCairor   selfr   r   r   <lambda>       zRendererCairo.<lambda>c                    s8   || _ t| d| _tttjdd| _t 	  d S )N)rendererr   )
dpiGraphicsContextCairogcr   r   ImageSurfaceFORMAT_ARGB32text_ctxsuper__init__)rI   rM   	__class__r   r   rT      s    zRendererCairo.__init__c                 C   s   t || j_d S r!   )r   r   rO   r   )rI   surfacer   r   r   set_ctx_from_surface   s    z"RendererCairo.set_ctx_from_surfacec                 C   s   || _ || _d S r!   widthheight)rI   rZ   r[   r   r   r   set_width_height   s    zRendererCairo.set_width_heightc                 C   sz   |d urn|   t|dks |r>||d |d |d | n ||d |d |d |d  |  |  |  d S )Nr$   r   r   r   )savelenset_source_rgbafill_preserverestoreZstroke)rI   r   Zfill_calphaZalpha_overridesr   r   r   _fill_and_stroke   s     zRendererCairo._fill_and_strokeNc                 C   st   |j }|d u r"| d u r"| nd }|t ddd| j }|  t|||| | 	|||
 |  d S Nr   r   )r   Z	get_hatchZclip_extentsr   scale	translater[   new_pathr0   rc   	get_alphaget_forced_alpha)rI   rO   r)   r*   rgbFacer   r"   r   r   r   	draw_path   s    

zRendererCairo.draw_pathc                 C   s<  |j }|  t|||t dd  | }| \}}	}
}|dkrj|	dkrj|
dkrj|dkrjd}d }nd}|t ddd| j }|  t	|j
|ddD ]t\}\}}t|r|dd  \}}|  ||| || |  |s |d dkr| ||| |  q|s8| ||| |  d S )	Nr   re   r   FT)Zsimplifyr#   i  )r   rh   r0   r   rf   Zcopy_path_flatZfill_extentsrg   r[   	enumerater%   r^   r]   Zappend_pathra   rc   ri   rj   )rI   rO   Zmarker_pathZmarker_transr)   r*   rk   r   x1y1Zx2y2ZfillediZverticescodesxyr   r   r   draw_markers   s<     
zRendererCairo.draw_markersc                 C   s   t |d d d }tj| jtj|jd |jd |jd d }|j	}| j
| |jd  }|  ||t|t| |  |  d S )Nre   r   r      )r   Z._unmultiplied_rgba8888_to_premultiplied_argb32r   rP   Zcreate_for_dataZraveldatarQ   shaper   r[   r]   Zset_source_surfacefloatZpaintra   )rI   rO   rs   rt   ZimrW   r   r   r   r   
draw_image   s    zRendererCairo.draw_imageFc	                 C   s   |r|  |||||| n|j}	|	  |	|| |	  |	jt|  |	| |	  t
 }
|
tjd rzt
jnt
j |	|
 |r|	t|  |	| |	  d S )Nztext.antialiased)_draw_mathtextr   rh   r&   r]   select_font_facer?   set_font_sizepoints_to_pixelsget_size_in_pointsr   ZFontOptionsset_antialiasmplZrcParamsANTIALIAS_DEFAULTANTIALIAS_NONEZset_font_optionsrotater'   deg2rad	show_textra   )rI   rO   rs   rt   sr6   angleismathmtextr   optsr   r   r   	draw_text   s$    

zRendererCairo.draw_textc                 C   s   |j }| jj|| j|\}}	}
}}|  ||| |rN|t	|  |D ]T\}}}}}|
  |||  |jtt|  || | |t| qR|D ]>\}}}}|
  ||| ||  |ddd |  q|  d S Nr   )r   
_text2pathmathtext_parserparserM   r]   rg   r   r'   r   rh   r&   r|   r?   r   r}   r~   r   chr	rectangleset_source_rgbr`   ra   )rI   rO   rs   rt   r   r6   r   r   rZ   r[   descentZglyphsZrectsfontZfontsizeidxZoxZoywhr   r   r   r{     s*    

zRendererCairo._draw_mathtextc                 C   s   | j | jfS r!   rY   rH   r   r   r   get_canvas_width_height  s    z%RendererCairo.get_canvas_width_heightc                    s   |dkrt  |||S |rB| jj|| j|^}}}}|||fS | j}|  |jt	|  |
| |  ||dd \}	}
}|  |
|||	 fS )NZTeXr   rv   )rS   get_text_width_height_descentr   r   r   rM   rR   r]   r|   r?   r}   r~   r   Ztext_extentsra   )rI   r   r6   r   rZ   r[   r   _r   Z	y_bearingr   r   rU   r   r   r   !  s    

z+RendererCairo.get_text_width_height_descentc                 C   s"   | j j  d| j _d| j _| j S )Nr   F)rO   r   r]   _alphaZ_forced_alpharH   r   r   r   new_gc9  s    zRendererCairo.new_gcc                 C   s   |d | j  S )NH   )rM   )rI   r+   r   r   r   r~   @  s    zRendererCairo.points_to_pixels)N)N)FN)__name__
__module____qualname__r   
deprecatedpropertyr   rT   rX   r\   rc   rl   ru   rz   r   r{   r   r   r   r~   __classcell__r   r   rU   r   rG   }   s"   

 
0
rG   c                       s   e Zd ZejejejdZejej	ej
dZ fddZdd Z fddZd	d
 Zdd Zdd Zdd Zdd Zd fdd	Zdd Zdd Zdd Z  ZS )rN   )ZbevelZmiterround)ZbuttZ
projectingr   c                    s   t    || _d S r!   )rS   rT   rL   )rI   rL   rU   r   r   rT   R  s    
zGraphicsContextCairo.__init__c                 C   s   | j   d S r!   )r   ra   rH   r   r   r   ra   V  s    zGraphicsContextCairo.restorec                    sh   t  | |  }| j}|  rB| j|d |d |d | n"| j|d |d |d |d  d S )Nr   r   r   r$   )rS   	set_alphari   _rgbrj   r   r_   )rI   rb   r   ZrgbrU   r   r   r   Y  s     zGraphicsContextCairo.set_alphac                 C   s   | j |rtjntj d S r!   )r   r   r   r   r   )rI   r/   r   r   r   set_antialiasedb  s    z$GraphicsContextCairo.set_antialiasedc                 C   s"   | j tj| j|d || _d S )N)Zcapstyle)r   Zset_line_capr   check_getitem_capdZ	_capstyle)rI   csr   r   r   set_capstylef  s    z!GraphicsContextCairo.set_capstylec                 C   sR   |sd S t |j\}}}}| j}|  ||| jj| | || |  d S r!   )	r'   r   Zboundsr   rh   r   rL   r[   r"   )rI   r   rs   rt   r   r   r   r   r   r   set_clip_rectanglej  s    z'GraphicsContextCairo.set_clip_rectanglec                 C   sX   |sd S |  \}}| j}|  |t ddd| jj }t||| |	  d S rd   )
Zget_transformed_path_and_affiner   rh   r   rf   rg   rL   r[   r0   r"   )rI   r)   ZtpathZaffiner   r   r   r   set_clip_paths  s    z"GraphicsContextCairo.set_clip_pathc                 C   sF   ||f| _ |d u r"| jg d n | jt| jt|| d S r   )Z_dashesr   Zset_dashlistrL   r~   r'   r(   )rI   offsetdashesr   r   r   
set_dashes~  s    
zGraphicsContextCairo.set_dashesNc                    s>   t  || t| jdkr,| jj| j  n| jj| j  d S Nr$   )rS   set_foregroundr^   r   r   r   r_   )rI   fgZisRGBArU   r   r   r     s    z#GraphicsContextCairo.set_foregroundc                 C   s   | j   d d S r   )r   
get_sourceZget_rgbarH   r   r   r   get_rgb  s    zGraphicsContextCairo.get_rgbc                 C   s"   | j tj| j|d || _d S )N)Z	joinstyle)r   Zset_line_joinr   r   _joindZ
_joinstyle)rI   Zjsr   r   r   set_joinstyle  s    z"GraphicsContextCairo.set_joinstylec                 C   s"   t || _| j| j| d S r!   )ry   Z
_linewidthr   Zset_line_widthrL   r~   )rI   r   r   r   r   set_linewidth  s    
z"GraphicsContextCairo.set_linewidth)N)r   r   r   r   ZLINE_JOIN_BEVELZLINE_JOIN_MITERZLINE_JOIN_ROUNDr   ZLINE_CAP_BUTTZLINE_CAP_SQUAREZLINE_CAP_ROUNDr   rT   ra   r   r   r   r   r   r   r   r   r   r   r   r   r   rU   r   rN   E  s(   			rN   c                   @   s   e Zd Zdd ZdS )_CairoRegionc                 C   s   || _ || _d S r!   )_slices_data)rI   Zslicesrw   r   r   r   rT     s    z_CairoRegion.__init__N)r   r   r   rT   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd Zdd Zedd Zedd ZeZd	d
 Z	eddddZ
ee
dZee
dZee
dZee
dZdS )FigureCanvasCairoc                 C   s  | j jj }t|tjs"td| }|	 }t
|j}t
|j}t
||j }t
||j }d|kr||kr|j|jkrd|kr||kr|j|jkstdt||t|| d t||t|| d f}	t| tj||f|	  }
t|	|
S )Nz;copy_from_bbox only works when rendering to an ImageSurfacer   zInvalid bbox)	_rendererrO   r   
get_targetr   r   rP   RuntimeError	get_width
get_heightmathceilx0floorrn   ro   y0
ValueErrorslicemaxr'   
frombufferget_datauint32reshapecopyr   )rI   ZbboxrW   swshr   rn   r   ro   Zslsrw   r   r   r   copy_from_bbox  s4    
0z FigureCanvasCairo.copy_from_bboxc                 C   s   | j jj }t|tjs"td|  |	 }|
 }|j\}}|jt| tj||f||f< ||j|j|j|j |j|j  d S )Nz;restore_region only works when rendering to an ImageSurface)r   rO   r   r   r   r   rP   r   flushr   r   r   r   r'   r   r   r   r   Zmark_dirty_rectanglestartstop)rI   ZregionrW   r   r   ZslyZslxr   r   r   restore_region  s$    
z FigureCanvasCairo.restore_regionc                 C   s   |   | d S r!   )_get_printed_image_surfaceZwrite_to_png)rI   fobjr   r   r   	print_png  s    zFigureCanvasCairo.print_pngc              	   C   s>   |   \}}|   }|tt|||df d S )Nrv   )	get_width_heightr   r   writer   Z._premultiplied_argb32_to_unmultiplied_rgba8888r'   r(   r   )rI   r   rZ   r[   bufr   r   r   
print_rgba  s
    zFigureCanvasCairo.print_rgbac                 C   sN   |   \}}t| jj}||| ttj||}|| | j	| |S r!   )
r   rG   figurerM   r\   r   rP   rQ   rX   draw)rI   rZ   r[   rL   rW   r   r   r   r     s    
z,FigureCanvasCairo._get_printed_image_surfaceZportrait)orientationc                C   s~  d}|| j _| j  \}}|| ||  }}|dkr>|| }}|dkrhttdsXtdt|||}	n|dkrttdstdt|||}	nh|d	v rttd
std|dkrt|t	rt
|d}nt
jd d|d}t|||}	ntd|t| j j}
|
|| |
|	 |
jj}|dkrL|tjd  |d|  | j |
 |  |	  |dkrz|  d S )Nr   Z	landscapeps	PSSurfacez3cairo has not been compiled with PS support enabledpdf
PDFSurfacez4cairo has not been compiled with PDF support enabled)svgsvgz
SVGSurfacez4cairo has not been compiled with SVG support enabledr   wb)fileobjzUnknown format: {!r}r   r   )r   rM   Zget_size_incheshasattrr   r   r   r   r   strgzipGzipFiler   r   formatrG   r\   rX   rO   r   r   r'   pirg   r   Z	show_pagefinishclose)rI   fmtr   r   rM   Zw_inZh_inZwidth_in_pointsZheight_in_pointsrW   rL   r   r   r   r   _save  sH    






zFigureCanvasCairo._saver   r   r   r   N)r   r   r   r   r   r	   r   r   Z	print_rawr   r   	functoolspartialmethodZ	print_pdfZprint_psZ	print_svgZ
print_svgzr   r   r   r   r     s   

	5r   c                   @   s   e Zd ZeZeZdS )_BackendCairoN)r   r   r   r   ZFigureCanvasr   ZFigureManagerr   r   r   r   r     s   r   )N)3__doc__r   r   r   Znumpyr'   r   version_infoImportErrorr   errZ
matplotlibr    r   r   r   Zmatplotlib.backend_basesr   r	   r
   r   r   r   Zmatplotlib.font_managerr   Zmatplotlib.mathtextr   Zmatplotlib.pathr   Zmatplotlib.transformsr   versionZbackend_versionr   r    r0   r?   r=   r>   Z
_f_weightsZFONT_SLANT_ITALICZFONT_SLANT_NORMALZFONT_SLANT_OBLIQUEZ	_f_anglesrG   rN   r   r   Zexportr   r   r   r   r   <module>   sz   
 


 IUu