o
    iH                     @   sf  d 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 n! ey<   zddlZW n ey9 Z	 zede	dZ	[	ww Y nw ddl
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rzdd Zndd ZdddZ dd Z!G dd deZ"G dd deZ#G dd dZ$G dd deZ%ej&G dd deZ'dS )z
A Cairo backend for matplotlib
==============================
:Author: Steve Chaplin and others

This backend depends on cairocffi or pycairo.
    N)      r   zDcairo backend requires that pycairo>=1.11.0 or cairocffiis installed   )cbookfont_manager)_Backend_check_savefig_extra_argsFigureCanvasBaseFigureManagerBaseGraphicsContextBaseRendererBase)ttfFontProperty)MathTextParser)Path)Affine2D	cairocffic                 C   s8   t | tjstjjtjdt| tj d dd} | S )Nz
cairo_t **r   T)incref)	
isinstancecairoContext_from_pointerfficastidobject__basicsize__ctx r   \/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/matplotlib/backends/backend_cairo.py_to_context*   s   r    c                 C   s   | S Nr   r   r   r   r   r    4   s   c           	      C   s   |j |d|dD ]c\}}|tjkr| j|  q|tjkr!|   q|tjkr,| j|  q|tjkrat	
|  }|d d }|dd  }| jg |d |d d  |d d |d  |R   q|tjkrk| j|  qd S )NT)remove_nansclipr      )iter_segmentsr   MOVETOmove_to	CLOSEPOLY
close_pathLINETOline_toCURVE3npasarrayget_current_pointcurve_toCURVE4)	r   path	transformr#   pointscodecurabr   r   r   _append_path8   s$   




:

r:   c                    s\    fdd}|d}t td|d  }|d}tj||dk r&t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                    s2   z
t  d|   W S  ty   t  |  Y S w )Nget_)getattrAttributeError)fieldpropr   r   attrO   s
   z-_cairo_font_args_from_font_prop.<locals>.attrnameFONT_SLANT_styleweighti&  )r<   r   upperr   weight_dictgetFONT_WEIGHT_NORMALFONT_WEIGHT_BOLD)r@   rA   rB   slantrE   r   r?   r   _cairo_font_args_from_font_propJ   s   
rL   c                   @   s   e Zd Zededd Zededd Z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dd Zdd Zd d! ZdS )$RendererCairoz3.3c                 C   s   i dt jdt jdt jdt jdt jdt jdt jdt jd	t jd
t jdt jdt jdt jdt jdt jdt jdt jt jt jdS )Nd      i,  i  i  iX  i  i   i  
ultralightlightnormalmediumregularsemiboldboldheavy)	ultraboldblack)r   rI   rJ   selfr   r   r   fontweights_   sL   	
zRendererCairo.fontweightsc                 C   s   t jt jt jdS )N)italicrR   oblique)r   FONT_SLANT_ITALICFONT_SLANT_NORMALFONT_SLANT_OBLIQUErZ   r   r   r   
fontanglesx   s   zRendererCairo.fontanglesc                 C   sB   || _ t| d| _tttjdd| _td| _	t
|  d S )N)rendererr   Cairo)dpiGraphicsContextCairogcr   r   ImageSurfaceFORMAT_ARGB32text_ctxr   mathtext_parserr   __init__)r[   re   r   r   r   rl      s   
zRendererCairo.__init__c                 C   s   t || j_d S r!   )r   r   rg   r   )r[   surfacer   r   r   set_ctx_from_surface   s   z"RendererCairo.set_ctx_from_surfacec                 C      || _ || _d S r!   widthheight)r[   rq   rr   r   r   r   set_width_height      
zRendererCairo.set_width_heightc                 C   sz   |d ur7|   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restorestroke)r[   r   fill_calpha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   	get_hatchclip_extentsr   scale	translaterr   new_pathr:   r~   	get_alphaget_forced_alpha)r[   rg   r3   r4   rgbFacer   r#   r   r   r   	draw_path   s   zRendererCairo.draw_pathc                 C   s<  |j }|  t|||t dd  | }| \}}	}
}|dkr5|	dkr5|
dkr5|dkr5d}d }nd}|t ddd| j }|  t	|j
|ddD ]9\}\}}t|r|dd  \}}|  ||| || |  |s|d dkr| ||| |  qR|s| ||| |  d S d S )	Nr   r   r   FT)simplifyr$   i  )r   r   r:   r   r   copy_path_flatfill_extentsr   rr   	enumerater&   rv   ru   append_pathry   r~   r   r   )r[   rg   marker_pathmarker_transr3   r4   r   r   x1y1x2y2filledi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 )Nr   r   r      )r   ._unmultiplied_rgba8888_to_premultiplied_argb32r   rh   create_for_dataraveldatari   shaper   rr   ru   set_source_surfacefloatpaintry   )r[   rg   r   r   imrm   r   r   r   r   
draw_image   s   zRendererCairo.draw_imageFc	           
      C   s   |r|  |||||| d S |j}	|	  |	|| |	jt|  |	  |	| | j	 d  |r=|	
t|  |	| |	  d S NH   )_draw_mathtextr   r   r(   select_font_facerL   ru   set_font_sizeget_size_in_pointsre   rotater.   deg2rad	show_textry   )
r[   rg   r   r   sr@   angleismathmtextr   r   r   r   	draw_text   s   
zRendererCairo.draw_textc                 C   s   |j }| j|| j|\}}	}
}}|  ||| |r&|t|  |D ])\}}}}}|	  |
|| |jtt|  ||| j d  || q(|D ]\}}}}|	  ||||| |ddd |  qT|  d S )Nr   r   )r   rk   parsere   ru   r   r   r.   r   r   r(   r   rL   r   r   r   	rectangleset_source_rgbrx   ry   )r[   rg   r   r   r   r@   r   r   rq   rr   descentglyphsrectsfontfontsizeoxoywhr   r   r   r      s,   

zRendererCairo._draw_mathtextc                 C   s   | j | jfS r!   rp   rZ   r   r   r   get_canvas_width_height  s   z%RendererCairo.get_canvas_width_heightc                 C   s   |r| j || j|\}}}}}|||fS | j}	|	  |	jt|  |	| | j d  |		|dd \}
}}|	
  ||||
 fS )Nr   r   r   )rk   r   re   rj   ru   r   rL   r   r   text_extentsry   )r[   r   r@   r   rq   rr   r   fontsused_charactersr   	y_bearingr   r   r   r   r   get_text_width_height_descent  s   
z+RendererCairo.get_text_width_height_descentc                 C   s"   | j j  d| j _d| j _| j S )Nr   F)rg   r   ru   _alpha_forced_alpharZ   r   r   r   new_gc5  s   zRendererCairo.new_gcc                 C   s   |d | j  S r   )re   )r[   r5   r   r   r   points_to_pixels<  s   zRendererCairo.points_to_pixelsr!   )FN)__name__
__module____qualname__r   
deprecatedpropertyr\   rb   rl   rn   rs   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   ^   s*    

0
rM   c                   @   s   e Zd ZejejejdZejej	ej
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dZdd Zdd Zdd ZdS )rf   )bevelmiterround)butt
projectingr   c                 C   s   t |  || _d S r!   )r   rl   rc   )r[   rc   r   r   r   rl   N  s   

zGraphicsContextCairo.__init__c                 C   s   | j   d S r!   )r   ry   rZ   r   r   r   ry   R  s   zGraphicsContextCairo.restorec                 C   sj   t | | |  }| j}|  r"| j|d |d |d | d S | j|d |d |d |d  d S )Nr   r   r   r%   )r   	set_alphar   _rgbr   r   rw   )r[   r|   r   rgbr   r   r   r   U  s   "&zGraphicsContextCairo.set_alphac                 C   "   | j tj| j|d || _d S )N)capstyle)r   set_line_capr   _check_getitem_capd	_capstyle)r[   csr   r   r   set_capstyleb     
z!GraphicsContextCairo.set_capstylec                 C   sR   |sd S t |j\}}}}| j}|  ||| jj| | || |  d S r!   )	r.   r   boundsr   r   r   rc   rr   r#   )r[   r   r   r   r   r   r   r   r   r   set_clip_rectanglef  s   z'GraphicsContextCairo.set_clip_rectanglec                 C   sX   |sd S |  \}}| j}|  |t ddd| jj }t||| |	  d S r   )
get_transformed_path_and_affiner   r   r   r   r   rc   rr   r:   r#   )r[   r3   tpathaffiner   r   r   r   set_clip_patho  s   z"GraphicsContextCairo.set_clip_pathc                 C   sH   ||f| _ |d u r| jg d d S | jt| jt|| d S )Nr   )_dashesr   set_dashlistrc   r   r.   r/   )r[   offsetdashesr   r   r   
set_dashesz  s   
zGraphicsContextCairo.set_dashesNc                 C   s@   t | || t| jdkr| jj| j  d S | jj| j  d S Nr%   )r   set_foregroundrv   r   r   r   rw   )r[   fgisRGBAr   r   r   r     s   z#GraphicsContextCairo.set_foregroundc                 C   s   | j   d d S r   )r   
get_sourceget_rgbarZ   r   r   r   get_rgb  s   zGraphicsContextCairo.get_rgbc                 C   r   )N)	joinstyle)r   set_line_joinr   r   _joind
_joinstyle)r[   jsr   r   r   set_joinstyle  r   z"GraphicsContextCairo.set_joinstylec                 C   s"   t || _| j| j| d S r!   )r   
_linewidthr   set_line_widthrc   r   )r[   r   r   r   r   set_linewidth  s   
z"GraphicsContextCairo.set_linewidthr!   )r   r   r   r   LINE_JOIN_BEVELLINE_JOIN_MITERLINE_JOIN_ROUNDr   LINE_CAP_BUTTLINE_CAP_SQUARELINE_CAP_ROUNDr   rl   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   rf   A  s(    	
	rf   c                   @   s   e Zd Zdd ZdS )_CairoRegionc                 C   ro   r!   )_slices_data)r[   slicesr   r   r   r   rl     rt   z_CairoRegion.__init__N)r   r   r   rl   r   r   r   r   r    s    r  c                   @   sr   e Zd Zdd Zdd Zedd Zedd ZeZd	d
 Z	dd Z
dd Zdd Zdd Zeddd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rQ||krQ|j|jkrQd|krQ||krQ|j|jksUt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)	_rendererrg   r   
get_targetr   r   rh   RuntimeError	get_width
get_heightmathceilx0floorr   r   y0
ValueErrorslicemaxr.   
frombufferget_datauint32reshapecopyr  )r[   bboxrm   swshr  r   r  r   slsr   r   r   r   copy_from_bbox  s*   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  rg   r   r	  r   r   rh   r
  flushr  r  r  r  r.   r  r  r  r  mark_dirty_rectanglestartstop)r[   regionrm   r  r  slyslxr   r   r   restore_region  s    
z FigureCanvasCairo.restore_regionc                 C   s   |   | d S r!   )_get_printed_image_surfacewrite_to_png)r[   fobjr   r   r   	print_png  s   zFigureCanvasCairo.print_pngc              	   C   s>   |   \}}|   }|tt|||df d S )Nr   )	get_width_heightr'  r  writer   ._premultiplied_argb32_to_unmultiplied_rgba8888r.   r/   r  )r[   r)  rq   rr   bufr   r   r   
print_rgba  s
   
zFigureCanvasCairo.print_rgbac                 C   sN   |   \}}t| jj}||| ttj||}|| | j	| |S r!   )
r+  rM   figurere   rs   r   rh   ri   rn   draw)r[   rq   rr   rc   rm   r   r   r   r'    s   
z,FigureCanvasCairo._get_printed_image_surfacec                 O      | j |dg|R i |S )Npdf_saver[   r)  argskwargsr   r   r   	print_pdf     zFigureCanvasCairo.print_pdfc                 O   r2  )Npsr4  r6  r   r   r   print_ps  r:  zFigureCanvasCairo.print_psc                 O   r2  )Nsvgr4  r6  r   r   r   	print_svg  r:  zFigureCanvasCairo.print_svgc                 O   r2  )Nsvgzr4  r6  r   r   r   
print_svgz  r:  zFigureCanvasCairo.print_svgzportrait)orientationc                C   s~  d}|| j _| j  \}}|| || }}|dkr||}}|dkr4ttds,tdt|||}	nI|dkrIttdsAtdt|||}	n4|d	v rvttd
sVtd|dkrnt|t	rft
|d}nt
jd d|d}t|||}	ntd|t| j j}
|
|| |
|	 |
jj}|dkr|tjd  |d|  | j |
 |  |	  |dkr|  d S d S )Nr   	landscaper;  	PSSurfacez3cairo has not been compiled with PS support enabledr3  
PDFSurfacez4cairo has not been compiled with PDF support enabled)r=  r?  
SVGSurfacez4cairo has not been compiled with SVG support enabledr?  wb)fileobjzUnknown format: {!r}r   r   )r0  re   get_size_incheshasattrr   r
  rD  rE  r   strgzipGzipFilerF  r  formatrM   rs   rn   rg   r   r   r.   pir   r1  	show_pagefinishclose)r[   fofmtrB  re   w_inh_inwidth_in_pointsheight_in_pointsrm   rc   r   r   r   r   r5    sJ   




zFigureCanvasCairo._saveN)r   r   r   r  r&  r   r*  r/  	print_rawr'  r9  r<  r>  r@  r5  r   r   r   r   r    s    

	r  c                   @   s   e Zd ZeZeZdS )_BackendCairoN)r   r   r   r  FigureCanvasr
   FigureManagerr   r   r   r   rZ    s    rZ  r!   )(__doc__rL  r  numpyr.   r   version_infoImportErrorr   err r   r   matplotlib.backend_basesr   r   r	   r
   r   r   matplotlib.font_managerr   matplotlib.mathtextr   matplotlib.pathr   matplotlib.transformsr   versionbackend_versionr   r    r:   rL   rM   rf   r  r  exportrZ  r   r   r   r   <module>   sR    
 



 dU|