
    gH                        d Z ddlZddlZddlZddlZ	 ddlZej                  dk  r edej                   d      	 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 ZddZd Z G d de      Z G d de      Z G d d      Z  G d de      Z!ejD                   G d de             Z#y# e$ r 	 ddl	Zn# e$ rZ
 ed      e
dZ
[
ww xY wY w xY w)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                 r    t        |      dk(  s|r | j                  g |d d |  y  | j                  |  y N   )lenset_source_rgba)ctxcoloralphaforced_alphas       ^/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/matplotlib/backends/backend_cairo.py	_set_rgbar   %   s=    
5zQ,.U2AY..U#    c                 8   |j                  |d|      D ]  \  }}|t        j                  k(  r | j                  |  *|t        j                  k(  r| j                          N|t        j                  k(  r | j                  |  q|t        j                  k(  r\t        j                  | j                               }|d d }|dd  } | j                  g |dz  |dz  dz  z   |dz  dz  |dz  z   |  |t        j                  k(  s | j                  |   y )NT)remove_nansclipr   r   )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bs	            r   _append_pathr5   ,   s   **4d + 4 "4;;CKK T^^#NNT[[ CKK T[[ **S2245Cr
ArsACLLJ37QUQY.J1q519q1u3DJJT[[ CLL&!"r   c                      fd} |d      }t        t        d |d      j                                } |d      }t        j                  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                 d    	  t        d|               S # t        $ r t        |       cY S w xY w)Nget_)getattrAttributeError)fieldprops    r   attrz-_cairo_font_args_from_font_prop.<locals>.attrC   s<    	(0744w022 	(4''	(s    //nameFONT_SLANT_styleweighti&  )r9   cairoupperr   weight_dictgetFONT_WEIGHT_NORMALFONT_WEIGHT_BOLD)r<   r=   r>   slantrA   s   `    r   _cairo_font_args_from_font_proprI   >   s    
( <DE[g)<)<)>(?@AE(^F))--ff=C &&))  r   c                   v     e Zd Z fdZd Zed        ZddZ	 ddZd Z	ddZ
d Zd	 Z fd
Zd Zd Z xZS )RendererCairoc                     || _         t        |       | _        d | _        d | _        t        j                  t        j                  t
        j                  dd            | _	        t        | -          y )N)rendererr   )dpiGraphicsContextCairogcwidthheightrB   ContextImageSurfaceFORMAT_ARGB32text_ctxsuper__init__)selfrN   	__class__s     r   rX   zRendererCairo.__init__S   sW    &5
e111a8:r   c                    |j                         }t        |d      r-t        |d      r!|j                         |j                         f}nt        |d      r)|j	                         }|j
                  |j                  f}nT|j                          |j                          |j                         ^}}|rt        d      |^}}}|j                          || j                  _        |\  | _        | _        y )N	get_width
get_heightget_extentszCannot infer surface size)
get_targethasattrr\   r]   r^   rQ   rR   save
reset_clipcopy_clip_rectangle_list	TypeErrorrestorerP   r   )rY   r   surfacesizeextrectrest_s           r   set_contextzRendererCairo.set_context\   s    .."7K(WWl-K$$&(:(:(<<DWm,%%'C99cjj(DHHJNN668KD4 ;<<KAq4KKM"&
DKr   c                     |>| j                          t        | |||       | j                          | j                          | j	                          y N)ra   r   fill_preservere   stroke)r   fill_cr   alpha_overridess       r   _fill_and_strokezRendererCairo._fill_and_stroken   s=    HHJc65/:KKM

r   c                    |j                   }| |j                         |j                         nd }|t               j	                  dd      j                  d| j                        z   }|j                          t        ||||       |Z|j                          t        |||j                         |j                                |j                          |j                          |j                         }|rt!        | j"                        }|j%                         j'                  t(        j*                  j,                  ||      }	t)        j.                  |	      }
t        |
|t               j	                  ||       j                  d|      d        |
j1                  | j3                  |j5                                       |
j6                  |j9                           |
j                          |
j;                          t)        j<                  |	      }|j?                  t(        j@                  jB                         |j                          |jE                  |       |j                          |j                          |j;                          y Nr   r   )#r   	get_hatchclip_extentsr   scale	translaterR   new_pathr5   ra   r   	get_alphaget_forced_alpharo   re   get_hatch_pathintrN   r_   create_similarrB   ContentCOLOR_ALPHArS   set_line_widthpoints_to_pixelsget_hatch_linewidthr   get_hatch_colorrp   SurfacePattern
set_extendExtendREPEAT
set_source)rY   rP   r.   r/   rgbFacer   r   
hatch_pathrN   hatch_surface	hatch_ctxhatch_patterns               r   	draw_pathzRendererCairo.draw_pathw   s   ff ?r||~'=   " 	 z''2.88DKKHI	S$	40HHJc7BLLNB4G4G4IJKKM&&(
dhh-CNN,;;))35Mm4IJ!))#t4>>q#F $$T%:%:2;Q;Q;S%TU%I%%r'9'9';<##%!00?M$$U\\%8%89HHJNN=)KKM

r   c           	      r   |j                   }|j                          t        |||t               j	                  dd      z          |j                         }|j                         \  }}	}
}|dk(  r|	dk(  r|
dk(  r
|dk(  rd}d }nd}|t               j	                  dd      j                  d| j                        z   }|j                          t        |j                  |d            D ]  \  }\  }}t        |      s|dd  \  }}|j                          |j                  ||       |j                  |       |j                          |s	|dz  dk(  sk| j                  |||j!                         |j#                                 |s1| j                  |||j!                         |j#                                y y )	Nr   rv   r   FT)simplifyr    i  )r   r{   r5   r   ry   copy_path_flatfill_extentsrz   rR   	enumerater!   r   ra   append_pathre   rs   r|   r}   )rY   rP   marker_pathmarker_transr.   r/   r   r   x1y1x2y2fillediverticescodesxys                     r   draw_markerszRendererCairo.draw_markers   s    ffS+|hj6F6Fq"6M'MN((* ))+BB7rQw27rQwFGFz''2.88DKKHI	 	$-""9u"=%? 	M A %8}}1
 a#, QX]))Wbllnb6I6I6KM#	M* !!Wbllnb.A.A.CE r   c                     t        j                  |d d d         }t        j                  j	                  |j                         j                  t        j                  |j                  d   |j                  d   |j                  d   dz        }|j                  }| j                  |z
  |j                  d   z
  }|j                          |j                  |t        |      t        |             |j                          |j                          y )Nrv   r   r      )r   ._unmultiplied_rgba8888_to_premultiplied_argb32rB   rT   create_for_dataraveldatarU   shaper   rR   ra   set_source_surfacefloatpaintre   )rY   rP   r   r   imrf   r   s          r   
draw_imagezRendererCairo.draw_image   s    AA"TrT(K$$44HHJOOU00HHQK!bhhqkAo7 ffKK!Obhhqk)
wa%(;		r   c	                 V   |r| j                  ||||||       y |j                  }	|	j                          |	j                  ||       |	j	                           |	j
                  t        |        |	j                  | j                  |j                                      t        j                         }
|
j                  |j                                |	j                  |
       |r%|	j                  t!        j"                  |              |	j%                  |       |	j'                          y rn   )_draw_mathtextr   r{   r#   ra   select_font_facerI   set_font_sizer   get_size_in_pointsrB   FontOptionsset_antialiasget_antialiasedset_font_optionsrotater)   deg2rad	show_textre   )rY   rP   r   r   sr<   angleismathmtextr   optss              r   	draw_textzRendererCairo.draw_text   s    
 Aq!T59 &&CLLNKK1HHJ C  "A$"GHd33D4K4K4MNO$$&Dr1134  &

2::uf-.MM!KKMr   c                    |j                   }| j                  j                  j                  || j                  |      \  }}	}
}}|j                          |j                  ||       |r%|j                  t        j                  |              |D ]  \  }}}}}|j                          |j                  ||         |j                  t        t        |              |j                  | j!                  |             |j#                  t%        |              |D ]P  \  }}}}|j                          |j'                  || ||        |j)                  ddd       |j+                          R |j-                          y Nr   )r   
_text2pathmathtext_parserparserN   ra   rz   r   r)   r   r{   r#   r   rI   r   r   r   r   chr	rectangleset_source_rgbro   re   )rY   rP   r   r   r   r<   r   r   rQ   rR   descentglyphsrectsfontfontsizeidxoxoywhs                       r   r   zRendererCairo._draw_mathtext   sH   ffOO++11!TXXtD 	.vw 	
aJJrzz5&)*+1 	$'D(CRLLNKKRC  C  01FGId33H=>MM#c(#	$ " 	 LBAqLLNMM"rc1qb)q!Q'		  	r   c                 2    | j                   | j                  fS rn   )rQ   rR   rY   s    r   get_canvas_width_heightz%RendererCairo.get_canvas_width_height  s    zz4;;&&r   c                    |dk(  rt         |   |||      S |r:| j                  j                  j	                  || j
                  |      ^}}}}|||fS | j                  }|j                           |j                  t        |        |j                  | j                  |j                                      |j                  |      dd \  }	}
}|j                          |
|||	z   fS )NTeXr   r   )rW   get_text_width_height_descentr   r   r   rN   rV   ra   r   rI   r   r   r   text_extentsre   )rY   r   r<   r   rQ   rR   r   rk   r   	y_bearingr   r   rZ   s               r   r   z+RendererCairo.get_text_width_height_descent  s     U?78D&II//55a4H 'E67Q&'))mm 	
=dCD$//0G0G0IJK**1-a2	1a!Q]""r   c                     | j                   j                  j                          d| j                   _        d| j                   _        d | j                   _        | j                   S )Nr   F)rP   r   ra   _alpha_forced_alpha_hatchr   s    r   new_gczRendererCairo.new_gc'  sC    
  %wwr   c                 &    |dz  | j                   z  S )NH   )rN   )rY   r0   s     r   r   zRendererCairo.points_to_pixels3  s    {TXX%%r   rn   )FN)__name__
__module____qualname__rX   rl   staticmethodrs   r   r   r   r   r   r   r   r   r   __classcell__rZ   s   @r   rK   rK   R   sV    '$  #L ".E`04'#0
&r   rK   c                        e Zd Zej                  ej
                  ej                  dZej                  ej                  ej                  dZ fdZd Z fdZd Zd Zd Zd	 Zd
 Zd Zd fd	Zd Zd Zd Z xZS )rO   )bevelmiterround)butt
projectingr   c                 0    t         |           || _        y rn   )rW   rX   rM   )rY   rM   rZ   s     r   rX   zGraphicsContextCairo.__init__E  s     r   c                 8    | j                   j                          y rn   )r   re   r   s    r   re   zGraphicsContextCairo.restoreI  s    r   c                     t         |   |       t        | j                  | j                  | j                         | j                                y rn   )rW   	set_alphar   r   _rgbr|   r}   )rY   r   rZ   s     r   r   zGraphicsContextCairo.set_alphaL  s:    % HHdii!143H3H3J	Lr   c                     | j                   j                  |rt        j                         y t        j                         y rn   )r   r   rB   ANTIALIAS_DEFAULTANTIALIAS_NONE)rY   r4   s     r   set_antialiasedz$GraphicsContextCairo.set_antialiasedQ  s/    '(E##	D.3.B.B	Dr   c                 6    | j                   j                         S rn   )r   get_antialiasr   s    r   r   z$GraphicsContextCairo.get_antialiasedU  s    xx%%''r   c                     | j                   j                  t        j                  | j                  |             || _        y )N)capstyle)r   set_line_capr   check_getitem_capd	_capstyle)rY   css     r   set_capstylez!GraphicsContextCairo.set_capstyleX  s,    d00bIJr   c                    |sy t        j                  |j                        \  }}}}| j                  }|j	                          |j                  || j                  j                  |z
  |z
  ||       |j                          y rn   )	r)   r   boundsr   r{   r   rM   rR   r   )rY   r   r   r   r   r   r   s          r   set_clip_rectanglez'GraphicsContextCairo.set_clip_rectangle\  se    XXi../
1ahha--1A5q!<
r   c                 $   |sy |j                         \  }}| j                  }|j                          |t               j	                  dd      j                  d| j                  j                        z   }t        |||       |j                          y ru   )
get_transformed_path_and_affiner   r{   r   ry   rz   rM   rR   r5   r   )rY   r.   tpathaffiner   s        r   set_clip_pathz"GraphicsContextCairo.set_clip_pathe  su    <<>vhhJ$$Q+55a9M9MNOS%(
r   c           	          ||f| _         || j                  j                  g d       y | j                  j                  t        | j                  j                  t        j                  |                  |       y r   )_dashesr   set_dashlistrM   r   r)   r*   )rY   offsetdashess      r   
set_dasheszGraphicsContextCairo.set_dashesp  s[    v~>HHb!$HHT]]33BJJv4FGHr   c                     t         |   ||       t        | j                        dk(  r$ | j                  j
                  | j                    y  | j                  j                  | j                    y r   )rW   set_foregroundr   r   r   r   r   )rY   fgisRGBArZ   s      r   r  z#GraphicsContextCairo.set_foregroundy  sR    r6*tyy>Q#DHH##TYY/$DHH$$dii0r   c                 X    | j                   j                         j                         d d S r   )r   
get_sourceget_rgbar   s    r   get_rgbzGraphicsContextCairo.get_rgb  s%    xx""$--/33r   c                     | j                   j                  t        j                  | j                  |             || _        y )N)	joinstyle)r   set_line_joinr   r   _joind
_joinstyle)rY   jss     r   set_joinstylez"GraphicsContextCairo.set_joinstyle  s,    t11$++LMr   c                     t        |      | _        | j                  j                  | j                  j                  |             y rn   )r   
_linewidthr   r   rM   r   )rY   r   s     r   set_linewidthz"GraphicsContextCairo.set_linewidth  s.    ( > >q ABr   rn   )r   r   r   rB   LINE_JOIN_BEVELLINE_JOIN_MITERLINE_JOIN_ROUNDr  LINE_CAP_BUTTLINE_CAP_SQUARELINE_CAP_ROUNDr   rX   re   r   r   r   r  r  r
  r  r  r  r   r#  r   r   s   @r   rO   rO   8  s    ''''''F **,,++E!L
D(	14Cr   rO   c                       e Zd Zd Zy)_CairoRegionc                      || _         || _        y rn   )_slices_data)rY   slicesr   s      r   rX   z_CairoRegion.__init__  s    
r   N)r   r   r   rX    r   r   r+  r+    s    r   r+  c                       e Zd Zed        Zd Zd Zd Zd Zd Z	e	Z
d Zdd	d
Z ej                  ed      Z ej                  ed      Z ej                  ed      Z ej                  ed      Zy)FigureCanvasCairoc                 z    t        | d      s$t        | j                  j                        | _        | j                  S )N_cached_renderer)r`   rK   figurerN   r4  r   s    r   	_rendererzFigureCanvasCairo._renderer  s0     t/0$1$++//$BD!$$$r   c                     | j                   S rn   )r6  r   s    r   get_rendererzFigureCanvasCairo.get_renderer  s    ~~r   c           	         | j                   j                  j                  j                         }t	        |t
        j                        st        d      |j                         }|j                         }t        j                  |j                        }t        j                  |j                        }t        j                  ||j                  z
        }t        j                  ||j                   z
        }d|k  rA||k  r<|j                  |j                  k  r#d|k  r||k  r|j                   |j                  k  st#        d      t%        ||t'        ||z
  d      z         t%        ||t'        ||z
  d      z         f}	t)        j*                  |j-                         t(        j.                        j1                  ||f      |	   j3                         }
t5        |	|
      S )Nz;copy_from_bbox only works when rendering to an ImageSurfacer   zInvalid bbox)r6  rP   r   r_   
isinstancerB   rT   RuntimeErrorr\   r]   mathceilx0floorr   r   y0
ValueErrorslicemaxr)   
frombufferget_datauint32reshapecopyr+  )rY   bboxrf   swshr>  r   r@  r   slsr   s              r   copy_from_bboxz FigureCanvasCairo.copy_from_bbox  sp   ..##''224'5#5#56MO O !YYtwwZZ YYrDGG|$ZZTWW%RB"HDGG);GbTWW-?^,,BSb!_,-uRc"r'1o9M/NNg..0"))<"b"3((, 	C&&r   c                 x   | j                   j                  j                  j                         }t	        |t
        j                        st        d      |j                          |j                         }|j                         }|j                  \  }}|j                  t        j                  |j                         t        j                         j#                  ||f      ||f<   |j%                  |j&                  |j&                  |j(                  |j&                  z
  |j(                  |j&                  z
         y )Nz;restore_region only works when rendering to an ImageSurface)r6  rP   r   r_   r:  rB   rT   r;  flushr\   r]   r-  r.  r)   rD  rE  rF  rG  mark_dirty_rectanglestartstop)rY   regionrf   rJ  rK  slyslxs          r   restore_regionz FigureCanvasCairo.restore_region  s    ..##''224'5#5#56MO O !>>S)/ 
w'')299	5
'2r(
CH
&$$IIsyy#((SYY"63998L	Nr   c                 B    | j                         j                  |       y rn   )_get_printed_image_surfacewrite_to_png)rY   fobjs     r   	print_pngzFigureCanvasCairo.print_png  s    '')66t<r   c           	          | j                         \  }}| j                         j                         }|j                  t	        j
                  t        j                  |      j                  ||df                   y )Nr   )	get_width_heightrX  rE  writer   ._premultiplied_argb32_to_unmultiplied_rgba8888r)   r*   rG  )rY   rZ  rQ   rR   bufs        r   
print_rgbazFigureCanvasCairo.print_rgba  sa    --/v--/88:

5GGJJsO##UFA$679 	:r   c                 f   | j                   j                  | j                  _        | j                         \  }}t	        j
                  t        j                  ||      }| j                  j                  t	        j                  |             | j                   j                  | j                         |S rn   )
r5  rN   r6  r]  rB   rT   rU   rl   rS   draw)rY   rQ   rR   rf   s       r   rX  z,FigureCanvasCairo._get_printed_image_surface  sx    ![[__--/v$$U%8%8%H""5==#9:(r   portrait)orientationc                   d}|| j                   _        | j                   j                         \  }}||z  ||z  }}|dk(  r||}}|dk(  r3t        t        d      st        d      t	        j                  |||      }	n|dk(  r3t        t        d      st        d      t	        j                  |||      }	n|d	v rwt        t        d
      st        d      |dk(  r?t        |t              rt        j                  |d      }nt        j                  d d|      }t	        j                  |||      }	nt        d|      | j                   j                  | j                  _        | j                  j                  t	        j                   |	             | j                  j"                  j$                  }
|dk(  r5|
j'                  t(        j*                  dz         |
j-                  d|        | j                   j/                  | j                         |
j1                          |	j3                          |dk(  r|j5                          y y )Nr   	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 enabledrm  wb)fileobjzUnknown format: r   r   )r5  rN   get_size_inchesr`   rB   r;  ri  rk  r:  strgzipGzipFilern  rA  r6  rl   rS   rP   r   r   r)   pirz   rc  	show_pagefinishclose)rY   fmtrZ  re  rN   w_inh_inwidth_in_pointsheight_in_pointsrf   r   s              r   _savezFigureCanvasCairo._save  s    [[002
d,03Js
)+% / .O $;5+." $5 6 6oodO=MNGE\5,/" $5 6 6&&t_>NOGO#5,/" $5 6 6f}dC(==t4D==tTBD&&t_>NOG/w788![[__""5==#9:nn##+%JJruuqy!MM!../ 	(&=JJL r   rj  rh  rl  rm  N)r   r   r   propertyr6  r8  rM  rV  r[  ra  	print_rawrX  r~  	functoolspartialmethod	print_pdfprint_ps	print_svg
print_svgzr0  r   r   r2  r2    s    % %'&N=: I /9 1f (	''u5I&y&&ud3H'	''u5I(((7Jr   r2  c                   ,    e Zd Zej                  ZeZeZ	y)_BackendCairoN)
r   r   r   rB   versionbackend_versionr2  FigureCanvasr   FigureManagerr0  r   r   r  r    s    mmO$L%Mr   r  rn   )$__doc__r  rs  r<  numpyr)   rB   version_infoImportError	cairocffierr r   r   r   matplotlib.backend_basesr	   r
   r   r   r   matplotlib.font_managerr   matplotlib.pathr   matplotlib.transformsr   r   r5   rI   rK   rO   r+  r2  exportr  r0  r   r   <module>r     s%      %J& &&+&8&8%9H I 	I ' ) (  4   *$"$(c&L c&LQC. QCh x8( x8v 
&H & &u  %%! %!$	%% 	"%s5   )B8 8C>CCC	CCCC