o
    ä¸Gf$D  ã                   @   sN  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dej› dƒ‚W n! eyG   zddl	ZW n eyD Z
 zedƒe
‚dZ
[
ww Y nw ddlmZmZmZ dd	lmZmZmZmZmZ dd
lmZ ddlmZ ddlmZ dd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   z/Cairo backend requires cairo>=1.14.0, but only z is availablezEcairo backend requires that pycairo>=1.14.0 or cairocffi is installedé   )Ú_apiÚcbookÚfont_manager)Ú_BackendÚFigureCanvasBaseÚFigureManagerBaseÚGraphicsContextBaseÚRendererBase)ÚttfFontProperty)ÚPath)ÚAffine2Dc           	      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)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)	ÚctxÚpathÚ	transformr   ÚpointsÚcodeZcurÚaÚb© r   úAlib/python3.10/site-packages/matplotlib/backends/backend_cairo.pyÚ_append_path%   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 )NZget_)ÚgetattrÚAttributeError)Zfield©Úpropr   r   Úattr<   s
   ÿz-_cairo_font_args_from_font_prop.<locals>.attrÚnameZFONT_SLANT_ZstyleÚweighti&  )r!   ÚcairoÚupperr   Zweight_dictÚgetZFONT_WEIGHT_NORMALZFONT_WEIGHT_BOLD)r$   r%   r&   Zslantr'   r   r#   r   Ú_cairo_font_args_from_font_prop7   s   ÿþ
r+   c                       s€   e Zd Z‡ f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 )ÚRendererCairoc                    sD   || _ t| d| _d | _d | _t t tjdd¡¡| _	t
ƒ  ¡  d S )N)Úrendererr   )ÚdpiÚGraphicsContextCairoÚgcÚwidthÚheightr(   ÚContextÚImageSurfaceÚFORMAT_ARGB32Útext_ctxÚsuperÚ__init__)Úselfr.   ©Ú	__class__r   r   r8   L   s   ÿzRendererCairo.__init__c                 C   s    |  ¡ }t|dƒrt|dƒr| ¡ | ¡ f}n-t|dƒr'| ¡ }|j|jf}n| ¡  | ¡  | 	¡ ^}}|r;t
dƒ‚|^}}}| ¡  || j_|\| _| _d S )NÚ	get_widthÚ
get_heightÚget_extentszCannot infer surface size)Ú
get_targetÚhasattrr<   r=   r>   r1   r2   ÚsaveZ
reset_clipZcopy_clip_rectangle_listÚ	TypeErrorÚrestorer0   r   )r9   r   ÚsurfaceÚsizeÚextZrectÚrestÚ_r   r   r   Úset_contextU   s   

zRendererCairo.set_contextc                 C   sz   |d ur7|  ¡  t|ƒdks|r| |d |d |d |¡ n| |d |d |d |d ¡ | ¡  | ¡  | ¡  d S )Nr   r   r   r   )rA   ÚlenÚset_source_rgbaÚfill_preserverC   Zstroke)r9   r   Zfill_cÚalphaZalpha_overridesr   r   r   Ú_fill_and_strokeg   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Ú	translater2   Únew_pathr    rN   Ú	get_alphaÚget_forced_alpha)r9   r0   r   r   ÚrgbFacer   r   r   r   r   Ú	draw_pathr   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   rP   r   FT)Zsimplifyr   iè  )r   rS   r    r   rQ   Zcopy_path_flatZfill_extentsrR   r2   Ú	enumerater   rJ   rA   Zappend_pathrC   rN   rT   rU   )r9   r0   Zmarker_pathZmarker_transr   r   rV   r   Úx1Úy1Zx2Zy2ZfilledÚiZverticesZ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 )NrP   r   r   é   )r   Z._unmultiplied_rgba8888_to_premultiplied_argb32r(   r4   Zcreate_for_dataZravelÚdatar5   Úshaper   r2   rA   Zset_source_surfaceÚfloatZpaintrC   )r9   r0   r\   r]   ZimrD   r   r   r   r   Ú
draw_image°   s   þzRendererCairo.draw_imageFc	                 C   s¬   |r|   ||||||¡ d S |j}	|	 ¡  |	 ||¡ |	 ¡  |	jt|ƒŽ  |	 |  | 	¡ ¡¡ t
 ¡ }
|
 | ¡ ¡ |	 |
¡ |rK|	 t | ¡¡ |	 |¡ |	 ¡  d S ©N)Ú_draw_mathtextr   rS   r   rA   Úselect_font_facer+   Úset_font_sizeÚpoints_to_pixelsÚget_size_in_pointsr(   ZFontOptionsÚset_antialiasÚget_antialiasedZset_font_optionsÚrotater   Údeg2radÚ	show_textrC   )r9   r0   r\   r]   Úsr$   ÚangleÚismathZmtextr   Zoptsr   r   r   Ú	draw_text½   s   

zRendererCairo.draw_textc                 C   sø   |j }| jj || j|¡\}}	}
}}| ¡  | ||¡ |r'| t 	| ¡¡ |D ]*\}}}}}| 
¡  | || ¡ |jtt|ƒƒŽ  | |  |¡¡ | t|ƒ¡ q)|D ]\}}}}| 
¡  | || || ¡ | ddd¡ | ¡  qV| ¡  d S ©Nr   )r   Ú
_text2pathÚmathtext_parserÚparser.   rA   rR   rl   r   rm   rS   r   rf   r+   r   rg   rh   rn   ÚchrÚ	rectangleÚset_source_rgbrL   rC   )r9   r0   r\   r]   ro   r$   rp   r   r1   r2   ÚdescentZglyphsZrectsZfontZfontsizeÚidxZoxZoyÚwÚhr   r   r   re   Õ   s*   ÿ
ÿ
zRendererCairo._draw_mathtextc                 C   s   | j | jfS rd   )r1   r2   ©r9   r   r   r   Úget_canvas_width_heightï   s   z%RendererCairo.get_canvas_width_heightc                    s    |dkrt ƒ  |||¡S |r!| jj || j|¡^}}}}|||fS | j}| ¡  |jt	|ƒŽ  | 
|  | ¡ ¡¡ | |¡dd… \}	}
}| ¡  |
|||	 fS )NZTeXr   r_   )r7   Úget_text_width_height_descentrt   ru   rv   r.   r6   rA   rf   r+   rg   rh   ri   Ztext_extentsrC   )r9   ro   r$   rq   r1   r2   rz   rH   r   Z	y_bearingr|   r}   r:   r   r   r€   ó   s   
ÿ
z+RendererCairo.get_text_width_height_descentc                 C   s"   | j j ¡  d| j _d| j _| j S )Nr   F)r0   r   rA   Ú_alphaZ_forced_alphar~   r   r   r   Únew_gc  s   zRendererCairo.new_gcc                 C   s   |d | j  S )NéH   )r.   )r9   r   r   r   r   rh     s   zRendererCairo.points_to_pixelsrd   )FN)Ú__name__Ú
__module__Ú__qualname__r8   rI   rN   rW   r^   rc   rr   re   r   r€   r‚   rh   Ú__classcell__r   r   r:   r   r,   K   s    	

ÿ0
r,   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d„ Zd‡ fdd„	Zdd„ Zdd„ Zdd„ Z‡  ZS )r/   )ZbevelZmiterÚround)ZbuttZ
projectingrˆ   c                    s   t ƒ  ¡  || _d S rd   )r7   r8   r-   )r9   r-   r:   r   r   r8   $  s   

zGraphicsContextCairo.__init__c                 C   s   | j  ¡  d S rd   )r   rC   r~   r   r   r   rC   (  s   zGraphicsContextCairo.restorec                    sj   t ƒ  |¡ |  ¡ }| j}|  ¡ r"| j |d |d |d |¡ d S | j |d |d |d |d ¡ d S )Nr   r   r   r   )r7   Ú	set_alpharT   Ú_rgbrU   r   rK   )r9   rM   r   Zrgbr:   r   r   r‰   +  s   "&zGraphicsContextCairo.set_alphac                 C   s"   | j  |rtj¡ d S tj¡ d S rd   )r   rj   r(   ZANTIALIAS_DEFAULTZANTIALIAS_NONE)r9   r   r   r   r   Úset_antialiased4  s
   ÿÿz$GraphicsContextCairo.set_antialiasedc                 C   s
   | j  ¡ S rd   )r   Zget_antialiasr~   r   r   r   rk   8  s   
z$GraphicsContextCairo.get_antialiasedc                 C   ó"   | j  tj| j|d¡ || _d S )N)Zcapstyle)r   Zset_line_capr   Úcheck_getitemÚ_capdZ	_capstyle)r9   Úcsr   r   r   Úset_capstyle;  ó   
z!GraphicsContextCairo.set_capstylec                 C   sR   |sd S t  |j¡\}}}}| j}| ¡  | || jj| | ||¡ | ¡  d S rd   )	r   rˆ   Zboundsr   rS   rx   r-   r2   r   )r9   rx   r\   r]   r|   r}   r   r   r   r   Úset_clip_rectangle?  s   z'GraphicsContextCairo.set_clip_rectanglec                 C   sX   |sd S |  ¡ \}}| j}| ¡  |tƒ  dd¡ d| jj¡ }t|||ƒ | 	¡  d S rO   )
Zget_transformed_path_and_affiner   rS   r   rQ   rR   r-   r2   r    r   )r9   r   ZtpathZaffiner   r   r   r   Úset_clip_pathH  s   ÿz"GraphicsContextCairo.set_clip_pathc                 C   sH   ||f| _ |d u r| j g d¡ d S | j t| j t |¡¡ƒ|¡ d S rs   )Z_dashesr   Zset_dashÚlistr-   rh   r   r   )r9   ÚoffsetZdashesr   r   r   Ú
set_dashesS  s   
þzGraphicsContextCairo.set_dashesNc                    s@   t ƒ  ||¡ t| jƒdkr| jj| jŽ  d S | jj| jŽ  d S ©Nr   )r7   Úset_foregroundrJ   rŠ   r   ry   rK   )r9   ZfgZisRGBAr:   r   r   r˜   \  s   z#GraphicsContextCairo.set_foregroundc                 C   s   | j  ¡  ¡ d d… S r—   )r   Ú
get_sourceZget_rgbar~   r   r   r   Úget_rgbc  s   zGraphicsContextCairo.get_rgbc                 C   rŒ   )N)Z	joinstyle)r   Zset_line_joinr   r   Ú_joindZ
_joinstyle)r9   Zjsr   r   r   Úset_joinstylef  r‘   z"GraphicsContextCairo.set_joinstylec                 C   s"   t |ƒ| _| j | j |¡¡ d S rd   )rb   Z
_linewidthr   Zset_line_widthr-   rh   )r9   r|   r   r   r   Úset_linewidthj  s   
z"GraphicsContextCairo.set_linewidthrd   )r„   r…   r†   r(   ZLINE_JOIN_BEVELZLINE_JOIN_MITERZLINE_JOIN_ROUNDr›   ZLINE_CAP_BUTTZLINE_CAP_SQUAREZLINE_CAP_ROUNDrŽ   r8   rC   r‰   r‹   rk   r   r’   r“   r–   r˜   rš   rœ   r   r‡   r   r   r:   r   r/     s,    ýý			r/   c                   @   s   e Zd Zdd„ ZdS )Ú_CairoRegionc                 C   s   || _ || _d S rd   )Ú_slicesÚ_data)r9   Zslicesr`   r   r   r   r8   p  s   
z_CairoRegion.__init__N)r„   r…   r†   r8   r   r   r   r   rž   o  s    rž   c                   @   sŠ   e Zd Zedd„ ƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	e	Z
dd„ Z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   t | dƒst| jjƒ| _| jS )NÚ_cached_renderer)r@   r,   Úfigurer.   r¢   r~   r   r   r   Ú	_rendererv  s   
zFigureCanvasCairo._rendererc                 C   s   | j S rd   )r¤   r~   r   r   r   Úget_renderer€  s   zFigureCanvasCairo.get_rendererc                 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)r¤   r0   r   r?   Ú
isinstancer(   r4   ÚRuntimeErrorr<   r=   ÚmathZceilÚx0ZfloorrY   rZ   Úy0Ú
ValueErrorÚsliceÚmaxr   Ú
frombufferÚget_dataÚuint32ÚreshapeÚcopyrž   )r9   ZbboxrD   ÚswÚshr©   rY   rª   rZ   Z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¤   r0   r   r?   r¦   r(   r4   r§   Úflushr<   r=   rŸ   r    r   r®   r¯   r°   r±   Zmark_dirty_rectangleÚstartÚstop)r9   ZregionrD   r³   r´   ZslyZslxr   r   r   Úrestore_region–  s    ÿ
ÿÿÿz FigureCanvasCairo.restore_regionc                 C   s   |   ¡  |¡ d S rd   )Ú_get_printed_image_surfaceZwrite_to_png)r9   Úfobjr   r   r   Ú	print_png¤  s   zFigureCanvasCairo.print_pngc              	   C   s>   |   ¡ \}}|  ¡  ¡ }| t t |¡ ||df¡¡¡ d S )Nr_   )	Úget_width_heightrº   r¯   Úwriter   Z._premultiplied_argb32_to_unmultiplied_rgba8888r   r   r±   )r9   r»   r1   r2   Úbufr   r   r   Ú
print_rgba§  s
   
ÿzFigureCanvasCairo.print_rgbac                 C   sL   | j j| j_|  ¡ \}}t tj||¡}| j t |¡¡ | j  	| j¡ |S rd   )
r£   r.   r¤   r½   r(   r4   r5   rI   r3   Údraw)r9   r1   r2   rD   r   r   r   rº   ¯  s   z,FigureCanvasCairo._get_printed_image_surfaceZ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|›ƒ‚| j j| j_| j t |	¡¡ | jjj}
|dkr¤|
 tjd ¡ |
 d| ¡ | j  | j¡ |
 ¡  |	 ¡  |dkr½| ¡  d S 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)ZfileobjzUnknown format: r   r   )r£   r.   Zget_size_inchesr@   r(   r§   rÄ   rÆ   r¦   ÚstrÚgzipZGzipFilerÉ   r«   r¤   rI   r3   r0   r   rl   r   ZpirR   rÁ   Z	show_pageZfinishÚclose)r9   Zfmtr»   rÂ   r.   Zw_inZh_inZwidth_in_pointsZheight_in_pointsrD   r   r   r   r   Ú_save·  sH   ÿ




ÿzFigureCanvasCairo._saverÅ   rÃ   rÇ   rÈ   N)r„   r…   r†   Úpropertyr¤   r¥   rµ   r¹   r¼   rÀ   Z	print_rawrº   rÎ   Ú	functoolsÚpartialmethodZ	print_pdfZprint_psZ	print_svgZ
print_svgzr   r   r   r   r¡   u  s    
	3r¡   c                   @   s   e Zd ZejZeZeZ	dS )Ú_BackendCairoN)
r„   r…   r†   r(   ÚversionZbackend_versionr¡   ZFigureCanvasr
   ZFigureManagerr   r   r   r   rÒ   ð  s    rÒ   rd   )#Ú__doc__rÐ   rÌ   r¨   Znumpyr   r(   Úversion_infoÚImportErrorZ	cairocffiÚerrÚ r   r   r   Zmatplotlib.backend_basesr   r	   r
   r   r   Zmatplotlib.font_managerr   Zmatplotlib.pathr   Zmatplotlib.transformsr   r    r+   r,   r/   rž   r¡   ZexportrÒ   r   r   r   r   Ú<module>   sN    

ÿÿÿþ€ÿÿþ
 MX{