B
    ]”t\ˆQ  ã               @   s  d Z ddlZddlZddlZddlZddlZyddlZW nX e	k
r   yddlZW n e	k
rp   e	dƒ‚Y nX ej
dk rŒe	d ej¡ƒ‚Y nX ejZddl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lmZ ejdkrdd„ Zndd„ Ze  d¡G dd„ dƒƒZ!ej"de#dZ$ej%e$ej&< ej'e$ej(< ej)e$ej*< ej+e$ej,< ej"de#dZ-de-ej%< de-ej'< de-ej)< de-ej+< d&dd„Z.d'dd„Z/ejdkr¾e/ne.Z0d(dd„Z1G dd„ deƒZ2G d d!„ d!eƒZ3G d"d#„ d#eƒZ4ej5G d$d%„ d%eƒƒZ6dS ))z
A Cairo backend for matplotlib
==============================
:Author: Steve Chaplin and others

This backend depends on cairocffi or pycairo.
é    Nz=cairo backend requires that cairocffi or pycairo is installed)é   é   r   z0cairo {} is installed; cairo>=1.11.0 is requiredé   )Úcbook)Ú_BackendÚ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   ú@lib/python3.7/site-packages/matplotlib/backends/backend_cairo.pyÚ_to_context/   s    r   c             C   s   | S )Nr   )r   r   r   r   r   9   s    z3.0c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚArrayWrapperz“Thin wrapper around numpy ndarray to expose the interface
       expected by cairocffi. Basically replicates the
       array.array interface.
    c             C   s*   || _ |jj| _t| ¡ ƒ| _|j| _d S )N)Z_ArrayWrapper__arrayZctypesÚdataÚ_ArrayWrapper__dataÚlenZflattenÚ_ArrayWrapper__sizeÚitemsize)ÚselfZmyarrayr   r   r   Ú__init__C   s    
zArrayWrapper.__init__c             C   s   | j | jfS )N)r   r    )r"   r   r   r   Úbuffer_infoI   s    zArrayWrapper.buffer_infoN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r$   r   r   r   r   r   =   s   r   éP   )Zdtypeé   r   c             C   sð   xêt ||ƒD ]Ü\}}xÒ|j|d|dD ]¾\}}|tjkrD| j|Ž  q&|tjkrX|  ¡  q&|tjkrn| j|Ž  q&|tj	krÐt
 |  ¡ ¡}|d d… }	|dd … }
| j|d |	d d  |	d d |
d  |
žŽ  q&|tjkr&| j|Ž  q&W qW d S )NT)Úremove_nansÚclipr   éþÿÿÿé   )ÚzipÚiter_segmentsr   ÚMOVETOÚmove_toÚ	CLOSEPOLYZ
close_pathÚLINETOZline_toZCURVE3ÚnpÚasarrayZget_current_pointZcurve_toÚCURVE4)r   ÚpathsÚ
transformsr,   ÚpathÚ	transformÚpointsÚcodeZcurÚaÚbr   r   r   Ú_append_paths_slow[   s     




2
r@   c                sv  t j}‡ fdd„t||ƒD ƒ}t dd„ |D ƒ¡}t dd„ |D ƒ¡}||tjk|tjk@  }||tjk }t| }t	| }t 
t |¡dd¡}	|	d }
|	d d… }	t |
d tj¡}t |jtj¡}||d d d… |	< ||d	d d… |	< t |jtj¡}t |t¡}d
 |d d d… |	< |d	d d… |	< | ¡ ||< | d¡}t j|_| d| |¡¡|_|
|_t j  | j|¡ d S )Nc                s    g | ]\}}|j |d ˆ d‘qS )T)r+   r,   )Úcleaned)Ú.0r:   r;   )r,   r   r   ú
<listcomp>z   s   z&_append_paths_fast.<locals>.<listcomp>c             S   s   g | ]
}|j ‘qS r   )Úvertices)rB   rA   r   r   r   rC   |   s    c             S   s   g | ]
}|j ‘qS r   )Úcodes)rB   rA   r   r   r   rC   }   s    r   éÿÿÿÿé   r*   r   Fr   zcairo_path_t *zcairo_path_data_t *)r   r   r/   r5   Zconcatenater   ZSTOPr3   Ú_MPL_TO_CAIRO_PATH_TYPEÚ_CAIRO_PATH_TYPE_SIZESÚinsertZcumsumÚemptyZuint8Z
frombufferr   Zint32Zfloat64Z	ones_likeÚboolÚravelÚnewZSTATUS_SUCCESSZstatusr   Zfrom_bufferZnum_dataZcairo_append_pathZ_pointer)r   r8   r9   r,   r   ZcleanedsrD   rE   Zcairo_type_sizesZcairo_type_positionsZcairo_num_dataÚbufZas_intZas_floatÚmaskZptrr   )r,   r   Ú_append_paths_fastn   s2    
$
rQ   c             C   s   t | |g|g|ƒS )N)Ú_append_paths)r   r:   r;   r,   r   r   r   Ú_append_path¢   s    rS   c               @   sö   e Z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
dd„ Zdd„ Zdd„ Zd	d
„ Zee d¡d"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 )&ÚRendererCairo)éd   éÈ   i,  i  iô  iX  i¼  i   i„  Z
ultralightZlightÚnormalZmediumZregularZsemiboldZboldZheavyZ	ultraboldZblack)ZitalicrW   Zobliquec             C   sB   || _ t| d| _t t tjdd¡¡| _tdƒ| _	t
 | ¡ d S )N)Úrendererr   ZCairo)ÚdpiÚGraphicsContextCairoÚgcr   r   ÚImageSurfaceÚFORMAT_ARGB32Útext_ctxr   Úmathtext_parserr
   r#   )r"   rY   r   r   r   r#   Ã   s    
zRendererCairo.__init__c             C   s   t  |¡| j_d S )N)r   r   r[   r   )r"   Úsurfacer   r   r   Úset_ctx_from_surfaceË   s    z"RendererCairo.set_ctx_from_surfacec             C   s   || _ || _d S )N)ÚwidthÚheight)r"   rb   rc   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   )Úsaver   Ú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_strokez3.0Nc             C   s   t | |||ƒ d S )N)rS   )r   r:   r;   r,   r   r   r   Úconvert_pathá   s    zRendererCairo.convert_pathc             C   st   |j }|d kr"| ¡ d kr"| ¡ nd }|tƒ  dd¡ d| j¡ }| ¡  t||||ƒ |  	||| 
¡ | ¡ ¡ d S )Nr   rF   r   )r   Z	get_hatchZclip_extentsr   ÚscaleÚ	translaterc   Únew_pathrS   rj   Ú	get_alphaÚget_forced_alpha)r"   r[   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¡ }| ¡  xŠt	|j
|ddƒD ]t\}\}}t|ƒr¦|dd … \}}| ¡  | ||¡ | |¡ | ¡  |s|d dkr¦|  ||| ¡ | ¡ ¡ q¦W |s<|  ||| ¡ | ¡ ¡ d S )	Nr   rF   r   FT)Zsimplifyr-   iè  )r   rn   rS   r   rl   Zcopy_path_flatZfill_extentsrm   rc   Ú	enumerater0   r   re   Zappend_pathrh   rj   ro   rp   )r"   r[   Zmarker_pathZmarker_transr:   r;   rq   r   Zx1Zy1Zx2Zy2ZfilledÚirD   rE   ÚxÚyr   r   r   Údraw_markersó   s4     
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 )NrF   r   r   r*   )r   Z._unmultiplied_rgba8888_to_premultiplied_argb32r   r\   Zcreate_for_datarM   r   r]   Úshaper   rc   re   Zset_source_surfaceÚfloatZpaintrh   )r"   r[   ru   rv   Zimr`   r   r   r   r   Ú
draw_image"  s     zRendererCairo.draw_imageFc	             C   sª   |r|   ||||||¡ nŒ|j}	|	 ¡  |	 ||¡ |	 | ¡ | j| ¡  | j| 	¡  ¡ | 
¡ | j d }
|	 ¡  |rŠ|	 t | ¡¡ |	 |
¡ |	 |¡ |	 ¡  d S )Ng      R@)Ú_draw_mathtextr   rn   r2   Úselect_font_faceÚget_nameÚ
fontanglesÚ	get_styleÚfontweightsÚ
get_weightÚget_size_in_pointsrY   re   Úrotater5   Údeg2radÚset_font_sizeÚ	show_textrh   )r"   r[   ru   rv   ÚsÚpropÚangleÚismathZmtextr   Úsizer   r   r   Ú	draw_text/  s    


zRendererCairo.draw_textc             C   s  |j }| j || j|¡\}}	}
}}| ¡  | ||¡ |rL| t | ¡¡ xt|D ]l\}}}}}| 	¡  | 
||¡ t|ƒ}| |j| j|j | j|j ¡ || j d }| |¡ | |¡ qRW xB|D ]:\}}}}| 	¡  | ||||¡ | ddd¡ | ¡  qÈW | ¡  d S )Ng      R@r   )r   r_   ÚparserY   re   rm   rƒ   r5   r„   rn   r2   r   r|   Únamer~   Zstyler€   Zweightr…   r†   Ú	rectangleÚset_source_rgbrg   rh   )r"   r[   ru   rv   r‡   rˆ   r‰   r   rb   rc   ÚdescentZglyphsZrectsZfontZfontsizeZoxZoyZfontPropr‹   ÚwÚhr   r   r   r{   G  s.    

zRendererCairo._draw_mathtextc             C   s   | j | jfS )N)rb   rc   )r"   r   r   r   Úget_canvas_width_heightf  s    z%RendererCairo.get_canvas_width_heightc             C   s¨   |r*| j  || j|¡\}}}}}|||fS | j}	|	 ¡  |	 | ¡ | j| ¡  | j	| 
¡  ¡ | ¡ | j d }
|	 |
¡ |	 |¡dd… \}}}|	 ¡  |||| fS )NéH   r   r*   )r_   r   rY   r^   re   r|   r}   r~   r   r€   r   r‚   r…   Ztext_extentsrh   )r"   r‡   rˆ   rŠ   rb   rc   r‘   ZfontsZused_charactersr   r‹   Z	y_bearingr’   r“   r   r   r   Úget_text_width_height_descenti  s    


z+RendererCairo.get_text_width_height_descentc             C   s"   | j j ¡  d| j _d| j _| j S )Nr   F)r[   r   re   Ú_alphaZ_forced_alpha)r"   r   r   r   Únew_gcƒ  s    zRendererCairo.new_gcc             C   s   |d | j  S )Nr•   )rY   )r"   r<   r   r   r   Úpoints_to_pixels‰  s    zRendererCairo.points_to_pixels)N)N)N)FN)r%   r&   r'   r   ZFONT_WEIGHT_NORMALZFONT_WEIGHT_BOLDr€   ZFONT_SLANT_ITALICZFONT_SLANT_NORMALZFONT_SLANT_OBLIQUEr~   r#   ra   rd   rj   Ústaticmethodr   Ú
deprecatedrk   rr   rw   rz   rŒ   r{   r”   r–   r˜   r™   r   r   r   r   rT   ¦   sL   



.
rT   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 )rZ   )ÚbevelÚmiterÚround)ÚbuttÚ
projectingrž   c             C   s   t  | ¡ || _d S )N)r	   r#   rX   )r"   rX   r   r   r   r#   š  s    
zGraphicsContextCairo.__init__c             C   s   | j  ¡  d S )N)r   rh   )r"   r   r   r   rh   ž  s    zGraphicsContextCairo.restorec             C   sh   t  | |¡ |  ¡ }| j}|  ¡ rB| j |d |d |d |¡ n"| j |d |d |d |d ¡ d S )Nr   r   r   r.   )r	   Ú	set_alpharo   Ú_rgbrp   r   rf   )r"   ri   r—   Zrgbr   r   r   r¡   ¡  s     zGraphicsContextCairo.set_alphac             C   s2   |dkr"|| _ | j | j| ¡ ntd| ƒ‚d S )N)rŸ   rž   r    z!Unrecognized cap style.  Found %s)Z	_capstyler   Zset_line_capÚ_capdÚ
ValueError)r"   Zcsr   r   r   Úset_capstyle®  s    z!GraphicsContextCairo.set_capstylec             C   sR   |sd S t  |j¡\}}}}| j}| ¡  | || jj| | ||¡ | ¡  d S )N)	r5   rž   Zboundsr   rn   r   rX   rc   r,   )r"   r   ru   rv   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 )Nr   rF   r   )
Zget_transformed_path_and_affiner   rn   r   rl   rm   rX   rc   rS   r,   )r"   r:   ZtpathZaffiner   r   r   r   Úset_clip_path¾  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ÚlistrX   r™   r5   r6   )r"   ÚoffsetZdashesr   r   r   Ú
set_dashesÉ  s    
zGraphicsContextCairo.set_dashesNc             C   s>   t  | ||¡ t| jƒdkr,| jj| jŽ  n| jj| jŽ  d S )Nr.   )r	   Úset_foregroundr   r¢   r   r   rf   )r"   ZfgZisRGBAr   r   r   r«   Ò  s    z#GraphicsContextCairo.set_foregroundc             C   s   | j  ¡  ¡ d d… S )Nr.   )r   Ú
get_sourceZget_rgba)r"   r   r   r   Úget_rgbÙ  s    zGraphicsContextCairo.get_rgbc             C   s2   |dkr"|| _ | j | j| ¡ ntd| ƒ‚d S )N)r   rž   rœ   z"Unrecognized join style.  Found %s)Z
_joinstyler   Zset_line_joinÚ_joindr¤   )r"   Zjsr   r   r   Úset_joinstyleÜ  s    z"GraphicsContextCairo.set_joinstylec             C   s"   t |ƒ| _| j | j |¡¡ d S )N)ry   Z
_linewidthr   Zset_line_widthrX   r™   )r"   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£   r#   rh   r¡   r¥   r¦   r§   rª   r«   r­   r¯   r°   r   r   r   r   rZ     s"   

		
rZ   c               @   sT   e Zd ZdZdd„ Zdd„ ZeZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚFigureCanvasCairoFc             O   s   |   ¡  |¡ d S )N)Ú_get_printed_image_surfaceZwrite_to_png)r"   ÚfobjÚargsÚkwargsr   r   r   Ú	print_pngë  s    zFigureCanvasCairo.print_pngc          	   O   s>   |   ¡ \}}|  ¡  ¡ }| t t |¡ ||df¡¡¡ d S )Nr*   )	Úget_width_heightr²   Úget_dataÚwriter   Z._premultiplied_argb32_to_unmultiplied_rgba8888r5   r6   Zreshape)r"   r³   r´   rµ   rb   rc   rO   r   r   r   Ú
print_rgbaî  s    zFigureCanvasCairo.print_rgbac             C   sN   |   ¡ \}}t| jjƒ}| ||¡ t tj||¡}| |¡ | j 	|¡ |S )N)
r·   rT   ÚfigurerY   rd   r   r\   r]   ra   Údraw)r"   rb   rc   rX   r`   r   r   r   r²   ö  s    
z,FigureCanvasCairo._get_printed_image_surfacec             O   s   | j |df|ž|ŽS )NÚpdf)Ú_save)r"   r³   r´   rµ   r   r   r   Ú	print_pdfÿ  s    zFigureCanvasCairo.print_pdfc             O   s   | j |df|ž|ŽS )NÚps)r¾   )r"   r³   r´   rµ   r   r   r   Úprint_ps  s    zFigureCanvasCairo.print_psc             O   s   | j |df|ž|ŽS )NÚsvg)r¾   )r"   r³   r´   rµ   r   r   r   Ú	print_svg  s    zFigureCanvasCairo.print_svgc             O   s   | j |df|ž|ŽS )NÚsvgz)r¾   )r"   r³   r´   rµ   r   r   r   Ú
print_svgz  s    zFigureCanvasCairo.print_svgzc             K   s’  |  dd¡}d}|| j_| j ¡ \}}|| ||  }}	|dkrJ|	| }}	|dkrtttdƒsdtdƒ‚t |||	¡}
nš|dkržttd	ƒsŽtd
ƒ‚t |||	¡}
np|dkrøttdƒs¸tdƒ‚|dkrèt	|t
ƒrØt |d¡}ntjd d|d}t |||	¡}
ntjd| dd d S t| jjƒ}| ||	¡ | |
¡ |jj}|dkr`| tjd ¡ | d|	 ¡ | j |¡ | ¡  |
 ¡  |dkrŽ| ¡  d S )NÚorientationZportraitr•   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)Zfileobjzunknown format: %sr   )Ú
stacklevelr   )Úgetr»   rY   Zget_size_inchesÚhasattrr   ÚRuntimeErrorrÇ   rÈ   r   ÚstrÚgzipZGzipFilerÉ   ÚwarningsÚwarnrT   rd   ra   r[   r   rƒ   r5   Zpirm   r¼   Z	show_pageZfinishÚclose)r"   ZfoZfmtrµ   rÆ   rY   Zw_inZh_inZwidth_in_pointsZheight_in_pointsr`   rX   r   r   r   r   r¾     sJ    







zFigureCanvasCairo._saveN)r%   r&   r'   Zsupports_blitr¶   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Ô   C  s   rÔ   )N)N)N)7r(   ÚcopyrÐ   ÚsysrÑ   Znumpyr5   r   r   ÚImportErrorÚversion_infoÚformatÚversionZbackend_versionÚ r   Zmatplotlib.backend_basesr   r   r   r	   r
   Zmatplotlib.font_managerr   Zmatplotlib.mathtextr   Zmatplotlib.pathr   Zmatplotlib.transformsr   r%   r   r›   r   ZzerosÚintrH   ZPATH_MOVE_TOr1   ZPATH_LINE_TOr4   ZPATH_CURVE_TOr7   ZPATH_CLOSE_PATHr3   rI   r@   rQ   rR   rS   rT   rZ   r±   ZexportrÔ   r   r   r   r   Ú<module>   s`   








0
 h[[