rL i%zddlZddlZddlmZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZ ddlmZddlZddlmZmZddlZddlmZmZmZmZddlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*ddl+m,Z, dd l-m.Z.dd l.m/Z/m0Z0ejze>Z?e#jde#jde#jde#jde#jde#jde#jdiZGedZHiZIdejjzZLdZMd0dZNGdde!ZOGddeZPGdd eZQGd!d"e e jZSd#ZTejePGd$d%ejZWGd&d'e"e jZXejePGd(d)ejZZejePGd*d+ejZ\ejePGd,d-ejZ^eXZ_eSeQ_`eXeQ_aejGd.d/eZcy#e1$rqZ2e3e2d dZ4e3e4d dZ5e6e4e1rNe6e5e7rEd e8e5vr;d ejrjue jvvZJD #,,'89  7 7 C:::#,,'89  7 7 C::sA:A -A: .A77A: mpl_blit_ctj|\}}}}}|jjdd|syt j |jj t|||||y)z Thin wrapper to blit called via tkapp.call. *argsid* is a unique string identifier to fetch the correct arguments from the ``_blit_args`` dict, since arguments cannot be passed directly. infocommandsN) _blit_argspoptkcallrblit interpaddrstr)argsid photoimagedataoffsetsbbox comp_rules r,_blitr?Ts`2<1G.JgtY ==  fj* = KK ((*C OT9gc6tj|}|jdd\}}||j\\}}\} } t t j |d}tt j| |} t t j |d}tt j| |} || kDs|| kDry|| || f} t} n d|d|f} t} |||| | f} tt| }| t|< |jjt |y#tj"$r\}dt|vr|jj%t t&|jjt |Yd}~yd}~wwxYw)a Blit *aggimage* to *photoimage*. *offsets* is a tuple describing how to fill the ``offset`` field of the ``Tk_PhotoImageBlock`` struct: it should be (0, 1, 2, 3) for RGBA8888 data, (2, 1, 0, 3) for little-endian ARBG32 (i.e. GBRA8888) data and (1, 2, 3, 0) for big-endian ARGB32 (i.e. ARGB8888) data. If *bbox* is passed, it defines the region that gets blitted. That region will be composed with the previous data according to the alpha channel. Blitting will be clipped to pixels inside the canvas, including silently doing nothing if the *bbox* region is entirely outside the canvas. Tcl events must be dispatched to trigger a blit from a non-Tcl thread. Nrzinvalid command name)npasarrayshape __array__maxmathfloorminceilrrr8idr2r4r5_blit_tcl_nameTclError createcommandr?)r:aggimager<r=r;heightwidthx1y1x2y2bboxptrr>argsr9es r,r6r6bs\ ::h DJJrNMFE !^^-R(2r B # 2 & B # 2 ' Gb r2r". eQ'*  tWgy 8DD]FJv3 >62 ;;3 !Q /  ##NE: >622 3s D))Fz#TimerTk._on_timer..s DKK--dnndnnMr@)r_ri_singler^rhrarg after_idle)rbrds`r,rizTimerTk._on_timersm  || ~~!"kk//O #kk44M DKr@) __name__ __module__ __qualname____doc__r`rkrfri __classcell__rds@r,r[r[s F H r@r[ceZdZdZej dZdfd ZddZdZ dZ dZ d Z d Z d Zd Zdd ZdZdZdZdZedZedddZdZdZdZdZdZd dZdZdZxZ S)!FigureCanvasTkr4ctSr])FigureManagerTk)clss r,rpzFigureCanvasTk.s?r@Nc" t ||d|_d|_|j d\}}t j |d||dd|_t j|j|||_ |jj|dz|dz|j|_ |jjd |j|jjd |j|jjd |j|jjd |j |jjd |j"|jjd|j$|jjd|j&dD](}|jj||j(*dD](}|jj||j**dD](}|jj||j,*dD](}|jj||j.*|jj1}t3j4| t3j4| fd}|jd|d fd}|jd|d |jj7d|_d|_y)NTphysicalwhiter)master backgroundrRrQ borderwidthhighlightthickness)rrRrQrBimagez zzzz )z z z )zzz)zzz)z z cp}|}||jdy|j|S)N )unbindscroll_event_windows)eventrbrootscroll_event_windows_idweakrootweakselfs r,rz5FigureCanvasTk.__init__..scroll_event_windowss?:D|z#KK0GH,,U3 3r@r+c}|}||jdy|j|jurtd|j yy)N close_event)rwidget _tkcanvasr_process)rrbrfilter_destroy_idrrs r,filter_destroyz/FigureCanvasTk.__init__..filter_destroysV:D|z#KK ->?||t~~-=$/88:.r@r)r_r` _idle_draw_id_event_loop_idget_width_heightr4Canvasr PhotoImage_tkphoto create_image_tkcanvas_image_regionbindresize_update_device_pixel_ratio key_pressmotion_notify_evententer_notify_eventleave_notify_event key_releasebutton_press_eventbutton_dblclick_eventbutton_release_event scroll_eventwinfo_toplevelweakrefref focus_set_rubberband_rect_black_rubberband_rect_white)rbfigurerwhnamerrrrrrrrds @@@@r,r`zFigureCanvasTk.__init__s  !"$$d$31gA1D >>16 &*nn&A&A qD!Q$dmm'B'-# M4;;7 GT%D%DE GT^^4 J(@(@A It'>'>? It'>'>? ND,<,<=> ?D NN  d&=&= > ?O BD NN  d&@&@ A BO AD NN  d&?&? @ A / 9D NN  d&7&7 8 9 ~~,,.;;t$;;t$ 4#'))N3G   "&*#&*#r@cd}tjdk(r4t|jjj dddz d}n1tjdk(r|jj ddz }|E|j|r3|jd \}}|jj|| yyy) Nwin32r4scalinggUUUUUU?rBlinux1i`TrrRrQ) sysplatformroundrr4r5 winfo_fpixels_set_device_pixel_ratior configure)rbrratiorrs r,rz)FigureCanvasTk._update_device_pixel_ratios <<7 "$..++00yAWMqQE \\W $NN006;E  !=!=e!D(($(7DAq NN $ $1Q $ 7 "E r@c6|j|j}}|jj}||z }||z }|jj ||d|j j |j|jjt|t||j jt|dz t|dz |j|_td|j|jy)NF)forwardrrBr resize_event)rRrQrdpiset_size_inchesrdeleterrrintrrr draw_idle)rbrrRrQdpivalwinchhinchs r,rzFigureCanvasTk.resizes U\\v ##E5%#@ d99: c%jVE&*nn&A&A  NC O4=='B'B#ND)224 r@cjjryfd}jj|_y)NcN jd_y#d_wxYwr])drawrrXrbs r, idle_drawz+FigureCanvasTk.draw_idle..idle_draw,s" * %)"T"s $)rrrr)rbrs` r,rzFigureCanvasTk.draw_idle's-     * "^^66yAr@c|jS)z Return the Tk widget used to implement FigureCanvasTkAgg. Although the initial implementation uses a Tk canvas, this routine is intended to hide that fact. )rrjs r, get_tk_widgetzFigureCanvasTk.get_tk_widget4s~~r@c|jj|j|jjj |jj |jz fSr])rcanvasxxrr=rQcanvasyyrbrs r,_event_mpl_coordsz FigureCanvasTk._event_mpl_coords=sQ&&uww/   ''$..*@*@*IIK Kr@ctd|g|j||j||j||dj y)Nr)buttons modifiersguiEvent)rr _mpl_buttons_mpl_modifiersrrs r,rz"FigureCanvasTk.motion_notify_eventDsO($ #**51 #,,U3!007!  #$,8:r@c~td|g|j||j||djy)Nfigure_enter_eventrrrrrrrs r,rz!FigureCanvasTk.enter_notify_eventKA*D &--e4 & $ 3 3E :$ &'/hjr@c~td|g|j||j||djy)Nfigure_leave_eventrrrs r,rz!FigureCanvasTk.leave_notify_eventQrr@c"|jjt|dd}tjdk(rdddj ||}t d|g|j||||j||djy)NnumdarwinrBrBrr)dblclickrr) rrgetattrrrgetrrrr)rbrrrs r,rz!FigureCanvasTk.button_press_eventWs   "eUD) <<8 #A,""3,C' #**51 #36 #AI!007! #$,8:r@c*|j|dy)NT)r)rrs r,rz$FigureCanvasTk.button_dblclick_eventcs 5r@ct|dd}tjdk(rdddj||}t d|g|j |||j ||djy)NrrrrBrrr)rrrrrrrr)rbrrs r,rz#FigureCanvasTk.button_release_eventfsyeUD) <<8 #A,""3,C)4 #**51 #36 #!007! #$,8:r@ct|dd}|dk(rdn|dk(rdnd}td|g|j|||j||dj y) Nrrrrsteprr)rrrrr)rbrrrs r,rzFigureCanvasTk.scroll_eventosfeUD)1Hqq"a>4 #**51 #8<!007! #$,8:r@c |jj|j|j}||jk7ry|jj |j|j z }|jjj|jj|j|jz z }|jdz }td|||||j||jy)zMouseWheel event processorNxrr)rwinfo_containingx_rooty_rootrr winfo_rootxrr=rQr winfo_rootydeltarrr)rbrrrrrs r,rz#FigureCanvasTk.scroll_event_windowsws LL ) )%,, E    NN " "5<