o
    :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 n! ey@   zddl	ZW n ey= Z
 zede
dZ
[
ww Y nw 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rdd Z#ndd Z#d1ddZ$dd Z%i dej&dej&dej&dej&dej&dej'dej'dej'dej'dej&dej&dej&d ej&d!ej&d"ej'd#ej'd$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/d0 d0eZ2dS )2z
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stjjtjdt| tj d dd} | S )Nz
cairo_t **r   T)Zincref)	
isinstancecairoContextZ_from_pointerZfficastidobject__basicsize__ctx r   C/usr/lib/python3/dist-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 ]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)	r   path	transformr!   pointscodeZcurabr   r   r   _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   attrQ   s
   z-_cairo_font_args_from_font_prop.<locals>.attrnameZFONT_SLANT_Zstyleweighti&  )r/   r   upperr   Zweight_dictgetFONT_WEIGHT_NORMALFONT_WEIGHT_BOLD)r2   r3   r4   Zslantr5   r   r1   r   _cairo_font_args_from_font_propL   s   
r:   d      i,  i  i  iX  i  i   i  Z
ultralightZlightnormalZmediumZregularZsemiboldZboldZheavy)Z	ultraboldZblack)Zitalicr=   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>   s    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__)r@   rC   	__class__r   r   rJ      s   zRendererCairo.__init__c                 C   s   t || j_d S r    )r   r   rE   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restoreZstroke)r@   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	translaterR   new_pathr.   r[   	get_alphaget_forced_alpha)r@   rE   r(   r)   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)Zsimplifyr"   i  )r   r`   r.   r   r^   Zcopy_path_flatZfill_extentsr_   rR   	enumerater$   rV   rU   Zappend_pathrY   r[   ra   rb   )r@   rE   Zmarker_pathZmarker_transr(   r)   rc   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 )Nr]   r   r      )r   Z._unmultiplied_rgba8888_to_premultiplied_argb32r   rF   Zcreate_for_dataZraveldatarG   shaper   rR   rU   Zset_source_surfacefloatZpaintrY   )r@   rE   ri   rj   ZimrM   r   r   r   r   
draw_image   s   zRendererCairo.draw_imageFc	                 C   s   |r|  |||||| d S |j}	|	  |	|| |	  |	jt|  |	| |	  t
 }
|
tjd r>t
jnt
j |	|
 |rR|	t|  |	| |	  d S )Nztext.antialiased)_draw_mathtextr   r`   r%   rU   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_textrY   )r@   rE   ri   rj   sr2   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parserC   rU   r_   rz   r&   r{   r`   r%   rr   r:   r   rs   rt   r|   chr	rectangleset_source_rgbrX   rY   )r@   rE   ri   rj   r}   r2   r~   r   rQ   rR   descentZglyphsZrectsZfontZfontsizeidxZoxZoywhr   r   r   rq     s*   

zRendererCairo._draw_mathtextc                 C   s   | j | jfS r    rP   r?   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   rl   )rI   get_text_width_height_descentr   r   r   rC   rH   rU   rr   r:   rs   rt   ru   Ztext_extentsrY   )r@   r}   r2   r   rQ   rR   r   _r   Z	y_bearingr   r   rK   r   r   r   !  s   

z+RendererCairo.get_text_width_height_descentc                 C   s"   | j j  d| j _d| j _| j S )Nr   F)rE   r   rU   _alphaZ_forced_alphar?   r   r   r   new_gc9  s   zRendererCairo.new_gcc                 C   s   |d | j  S )NH   )rC   )r@   r*   r   r   r   rt   @  s   zRendererCairo.points_to_pixelsr    )FN)__name__
__module____qualname__r   Z
deprecatedpropertyr   rJ   rN   rS   r[   rd   rk   rp   r   rq   r   r   r   rt   __classcell__r   r   rK   r   r>   }   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 fdd	Zdd Zdd Zdd Z  ZS )rD   )ZbevelZmiterround)ZbuttZ
projectingr   c                    s   t    || _d S r    )rI   rJ   rB   )r@   rB   rK   r   r   rJ   R  s   

zGraphicsContextCairo.__init__c                 C   s   | j   d S r    )r   rY   r?   r   r   r   rY   V  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#   )rI   	set_alphara   _rgbrb   r   rW   )r@   rZ   r   ZrgbrK   r   r   r   Y  s   "&zGraphicsContextCairo.set_alphac                 C   s"   | j |rtj d S tj d S r    )r   rv   r   rx   ry   )r@   r-   r   r   r   set_antialiasedb  s
   z$GraphicsContextCairo.set_antialiasedc                 C   "   | j tj| j|d || _d S )N)Zcapstyle)r   Zset_line_capr   check_getitem_capdZ	_capstyle)r@   csr   r   r   set_capstylef     
z!GraphicsContextCairo.set_capstylec                 C   sR   |sd S t |j\}}}}| j}|  ||| jj| | || |  d S r    )	r&   r   Zboundsr   r`   r   rB   rR   r!   )r@   r   ri   rj   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 r\   )
Zget_transformed_path_and_affiner   r`   r   r^   r_   rB   rR   r.   r!   )r@   r(   ZtpathZaffiner   r   r   r   set_clip_paths  s   z"GraphicsContextCairo.set_clip_pathc                 C   sH   ||f| _ |d u r| jg d d S | jt| jt|| d S r   )Z_dashesr   Zset_dashlistrB   rt   r&   r'   )r@   offsetZdashesr   r   r   
set_dashes~  s   
zGraphicsContextCairo.set_dashesNc                    s@   t  || t| jdkr| jj| j  d S | jj| j  d S Nr#   )rI   set_foregroundrV   r   r   r   rW   )r@   ZfgZisRGBArK   r   r   r     s   z#GraphicsContextCairo.set_foregroundc                 C   s   | j   d d S r   )r   
get_sourceZget_rgbar?   r   r   r   get_rgb  s   zGraphicsContextCairo.get_rgbc                 C   r   )N)Z	joinstyle)r   Zset_line_joinr   r   _joindZ
_joinstyle)r@   Zjsr   r   r   set_joinstyle  r   z"GraphicsContextCairo.set_joinstylec                 C   s"   t || _| j| j| d S r    )ro   Z
_linewidthr   Zset_line_widthrB   rt   )r@   r   r   r   r   set_linewidth  s   
z"GraphicsContextCairo.set_linewidthr    )r   r   r   r   ZLINE_JOIN_BEVELZLINE_JOIN_MITERZLINE_JOIN_ROUNDr   ZLINE_CAP_BUTTZLINE_CAP_SQUAREZLINE_CAP_ROUNDr   rJ   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   r   rD   E  s*    			rD   c                   @   s   e Zd Zdd ZdS )_CairoRegionc                 C   rO   r    )_slices_data)r@   Zslicesrm   r   r   r   rJ     rT   z_CairoRegion.__init__N)r   r   r   rJ   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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)	_rendererrE   r   
get_targetr   r   rF   RuntimeError	get_width
get_heightmathZceilx0Zfloorrf   rg   y0
ValueErrorslicemaxr&   
frombufferget_datauint32reshapecopyr   )r@   ZbboxrM   swshr   rf   r   rg   Zslsrm   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   rE   r   r   r   r   rF   r   flushr   r   r   r   r&   r   r   r   r   Zmark_dirty_rectanglestartstop)r@   ZregionrM   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)r@   fobjr   r   r   	print_png  s   zFigureCanvasCairo.print_pngc              	   C   s>   |   \}}|   }|tt|||df d S )Nrl   )	get_width_heightr   r   writer   Z._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   r>   figurerC   rS   r   rF   rG   rN   draw)r@   rQ   rR   rB   rM   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|t| j j}
|
|| |
|	 |
jj}|dkr|tjd  |d|  | 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   rC   Zget_size_incheshasattrr   r   r   r   r   strgzipZGzipFiler   r   formatr>   rS   rN   rE   r   rz   r&   Zpir_   r   Z	show_pageZfinishclose)r@   Zfmtr   r   rC   Zw_inZh_inZwidth_in_pointsZheight_in_pointsrM   rB   r   r   r   r   _save  sJ   




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   r    )3__doc__r   r   r   Znumpyr&   r   version_infoImportErrorr   errZ
matplotlibrw    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   r.   r:   r8   r9   Z
_f_weightsZFONT_SLANT_ITALICZFONT_SLANT_NORMALZFONT_SLANT_OBLIQUEZ	_f_anglesr>   rD   r   r   Zexportr   r   r   r   r   <module>   s    
 



	
 IUu