U
    \	aI                     @   s  d Z ddlZddlZddlZzddlZejdk r4eW nN ek
r   zddlZW n, ek
r~ Z	 zede	W 5 dZ	[	X Y nX Y nX 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Z/ej0G dd deZ1d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   E/tmp/pip-unpacked-wheel-wjyw_3jo/matplotlib/backends/backend_cairo.py_to_context+   s    r    c                 C   s   | S Nr   r   r   r   r   r    5   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|d |d d  |d d |d  |  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_path9   s$      




2
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                    s8   zt  d|   W S  tk
r2   t  |  Y S X d S )Nget_)getattrAttributeError)fieldpropr   r   attrP   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_propK   s    r?   )d      i,  i  i  iX  i  i   i  Z
ultralightlightnormalZmediumZregularZsemiboldZboldZheavyZ	ultraboldZblack)ZitalicrC   Zobliquec                       s   e Zd Zededd Zeded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.3c                 C   s   t S r!   )
_f_weightsselfr   r   r   <lambda>}       zRendererCairo.<lambda>c                 C   s   t S r!   )	_f_anglesrF   r   r   r   rH   ~   rI   z3.4c                 C   s   t dS )NZCairor   rF   r   r   r   rH      rI   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__)rG   rL   	__class__r   r   rS      s    zRendererCairo.__init__c                 C   s   t || j_d S r!   )r   r   rN   r   )rG   surfacer   r   r   set_ctx_from_surface   s    z"RendererCairo.set_ctx_from_surfacec                 C   s   || _ || _d S r!   widthheight)rG   rY   rZ   r   r   r   set_width_height   s    zRendererCairo.set_width_heightc                 C   sz   |d k	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)rG   r   Zfill_calphaZalpha_overridesr   r   r   _fill_and_stroke   s     zRendererCairo._fill_and_strokeNc                 C   st   |j }|d kr"| d kr"| nd }|t ddd| j }|  t|||| | 	|||
 |  d S Nr   r   )r   Z	get_hatchZclip_extentsr   scale	translaterZ   new_pathr0   rb   	get_alphaget_forced_alpha)rG   rN   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   rd   r   FT)Zsimplifyr#   i  )r   rg   r0   r   re   Zcopy_path_flatZfill_extentsrf   rZ   	enumerater%   r]   r\   Zappend_pathr`   rb   rh   ri   )rG   rN   Zmarker_pathZmarker_transr)   r*   rj   r   x1y1Zx2y2ZfillediZverticescodesxyr   r   r   draw_markers   sH     
      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 )Nrd   r   r      )r   Z._unmultiplied_rgba8888_to_premultiplied_argb32r   rO   Zcreate_for_dataZraveldatarP   shaper   rZ   r\   Zset_source_surfacefloatZpaintr`   )rG   rN   rr   rs   ZimrV   r   r   r   r   
draw_image   s       zRendererCairo.draw_imageFc	                 C   s   |r|  |||||| n|j}	|	  |	|| |	  |	jt|  |	| | j	 d  t
 }
|
tjd r~t
jnt
j |	|
 |r|	t|  |	| |	  d S )NH   ztext.antialiased)_draw_mathtextr   rg   r&   r\   select_font_facer?   set_font_sizeget_size_in_pointsrL   r   ZFontOptionsset_antialiasmplZrcParamsANTIALIAS_DEFAULTANTIALIAS_NONEZset_font_optionsrotater'   deg2rad	show_textr`   )rG   rN   rr   rs   sr6   angleismathmtextr   optsr   r   r   	draw_text   s$    

zRendererCairo.draw_textc                 C   s   |j }| jj|| j|\}}	}
}}|  ||| |rN|t	|  |D ]X\}}}}}|
  |||  |jtt|  ||| j d  |t| qR|D ]>\}}}}|
  ||| ||  |ddd |  q|  d S )Nrz   r   )r   
_text2pathmathtext_parserparserL   r\   rf   r   r'   r   rg   r&   r|   r?   r   r}   r   chr	rectangleset_source_rgbr_   r`   )rG   rN   rr   rs   r   r6   r   r   rY   rZ   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!   rX   rF   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	|  |
| | j d  ||dd \}	}
}|  |
|||	 fS )NZTeXrz   r   ru   )rR   get_text_width_height_descentr   r   r   rL   rQ   r\   r|   r?   r}   r~   Ztext_extentsr`   )rG   r   r6   r   rY   rZ   r   _r   Z	y_bearingr   r   rT   r   r   r   "  s    

z+RendererCairo.get_text_width_height_descentc                 C   s"   | j j  d| j _d| j _| j S )Nr   F)rN   r   r\   _alphaZ_forced_alpharF   r   r   r   new_gc<  s    zRendererCairo.new_gcc                 C   s   |d | j  S )Nrz   )rL   )rG   r+   r   r   r   points_to_pixelsC  s    zRendererCairo.points_to_pixels)N)N)FN)__name__
__module____qualname__r   
deprecatedpropertyZfontweightsZ
fontanglesr   rS   rW   r[   rb   rk   rt   ry   r   r{   r   r   r   r   __classcell__r   r   rT   r   rD   |   s&   

 
0
rD   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 )rM   )ZbevelZmiterround)ZbuttZ
projectingr   c                    s   t    || _d S r!   )rR   rS   rK   )rG   rK   rT   r   r   rS   U  s    
zGraphicsContextCairo.__init__c                 C   s   | j   d S r!   )r   r`   rF   r   r   r   r`   Y  s    zGraphicsContextCairo.restorec                    sh   t  | |  }| j}|  rB| j|d |d |d | n"| j|d |d |d |d  d S )Nr   r   r   r$   )rR   	set_alpharh   _rgbri   r   r^   )rG   ra   r   ZrgbrT   r   r   r   \  s     zGraphicsContextCairo.set_alphac                 C   s   | j |rtjntj d S r!   )r   r   r   r   r   )rG   r/   r   r   r   set_antialiasede  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)rG   csr   r   r   set_capstylei  s    z!GraphicsContextCairo.set_capstylec                 C   sR   |sd S t |j\}}}}| j}|  ||| jj| | || |  d S r!   )	r'   r   Zboundsr   rg   r   rK   rZ   r"   )rG   r   rr   rs   r   r   r   r   r   r   set_clip_rectanglem  s    z'GraphicsContextCairo.set_clip_rectanglec                 C   sX   |sd S |  \}}| j}|  |t ddd| jj }t||| |	  d S rc   )
Zget_transformed_path_and_affiner   rg   r   re   rf   rK   rZ   r0   r"   )rG   r)   ZtpathZaffiner   r   r   r   set_clip_pathv  s    z"GraphicsContextCairo.set_clip_pathc                 C   sF   ||f| _ |d kr"| jg d n | jt| jt|| d S )Nr   )Z_dashesr   Zset_dashlistrK   r   r'   r(   )rG   offsetZ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$   )rR   set_foregroundr]   r   r   r   r^   )rG   ZfgZisRGBArT   r   r   r     s    z#GraphicsContextCairo.set_foregroundc                 C   s   | j   d d S r   )r   
get_sourceZget_rgbarF   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)rG   Zjsr   r   r   set_joinstyle  s    z"GraphicsContextCairo.set_joinstylec                 C   s"   t || _| j| j| d S r!   )rx   Z
_linewidthr   Zset_line_widthrK   r   )rG   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   rS   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   rT   r   rM   H  s(   			rM   c                   @   s   e Zd Zdd ZdS )_CairoRegionc                 C   s   || _ || _d S r!   )_slices_data)rG   Zslicesrv   r   r   r   rS     s    z_CairoRegion.__init__N)r   r   r   rS   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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)	_rendererrN   r   
get_targetr   r   rO   RuntimeError	get_width
get_heightmathceilx0floorrm   rn   y0
ValueErrorslicemaxr'   
frombufferget_datauint32reshapecopyr   )rG   ZbboxrV   swshr   rm   r   rn   Zslsrv   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   rN   r   r   r   r   rO   r   flushr   r   r   r   r'   r   r   r   r   Zmark_dirty_rectanglestartstop)rG   ZregionrV   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)rG   fobjr   r   r   	print_png  s    zFigureCanvasCairo.print_pngc              	   C   s>   |   \}}|   }|tt|||df d S )Nru   )	get_width_heightr   r   writer   Z._premultiplied_argb32_to_unmultiplied_rgba8888r'   r(   r   )rG   r   rY   rZ   bufr   r   r   
print_rgba  s
    zFigureCanvasCairo.print_rgbac                 C   sN   |   \}}t| jj}||| ttj||}|| | j	| |S r!   )
r   rD   figurerL   r[   r   rO   rP   rW   draw)rG   rY   rZ   rK   rV   r   r   r   r     s    
z,FigureCanvasCairo._get_printed_image_surfacec                 O   s   | j |df||S )Npdf_saverG   r   argskwargsr   r   r   	print_pdf  s    zFigureCanvasCairo.print_pdfc                 O   s   | j |df||S )Npsr   r   r   r   r   print_ps  s    zFigureCanvasCairo.print_psc                 O   s   | j |df||S )Nsvgr   r   r   r   r   	print_svg  s    zFigureCanvasCairo.print_svgc                 O   s   | j |df||S )Nsvgzr   r   r   r   r   
print_svgz  s    zFigureCanvasCairo.print_svgzZ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	k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 )Nrz   Z	landscaper   	PSSurfacez3cairo has not been compiled with PS support enabledr   
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   )r   rL   Zget_size_incheshasattrr   r   r   r   r   strgzipGzipFiler   r   formatrD   r[   rW   rN   r   r   r'   pirf   r   Z	show_pagefinishclose)rG   fofmtr   rL   Zw_inZh_inZwidth_in_pointsZheight_in_pointsrV   rK   r   r   r   r   r     sJ     






zFigureCanvasCairo._saveN)r   r   r   r   r   r	   r   r   Z	print_rawr   r   r   r   r   r   r   r   r   r   r     s   

	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)2__doc__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>   rE   ZFONT_SLANT_ITALICZFONT_SLANT_NORMALZFONT_SLANT_OBLIQUErJ   rD   rM   r   r   exportr   r   r   r   r   <module>   sx   
 


 MU|