vispy 0.14.0__cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of vispy might be problematic. Click here for more details.

Files changed (519) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +968 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1134 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +352 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1542 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +134 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +698 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +506 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +566 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1816 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1045 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +106 -0
  274. vispy/scene/cameras/base_camera.py +538 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +308 -0
  278. vispy/scene/cameras/perspective.py +333 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +173 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +446 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +473 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +17 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +4 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +485 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +163 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +796 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +105 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +688 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +810 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_histogram.py +24 -0
  477. vispy/visuals/tests/test_image.py +390 -0
  478. vispy/visuals/tests/test_image_complex.py +36 -0
  479. vispy/visuals/tests/test_infinite_line.py +53 -0
  480. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  481. vispy/visuals/tests/test_isosurface.py +22 -0
  482. vispy/visuals/tests/test_linear_region.py +152 -0
  483. vispy/visuals/tests/test_markers.py +54 -0
  484. vispy/visuals/tests/test_mesh.py +261 -0
  485. vispy/visuals/tests/test_mesh_normals.py +218 -0
  486. vispy/visuals/tests/test_polygon.py +112 -0
  487. vispy/visuals/tests/test_rectangle.py +163 -0
  488. vispy/visuals/tests/test_regular_polygon.py +111 -0
  489. vispy/visuals/tests/test_scalable_textures.py +180 -0
  490. vispy/visuals/tests/test_sdf.py +73 -0
  491. vispy/visuals/tests/test_spectrogram.py +42 -0
  492. vispy/visuals/tests/test_text.py +95 -0
  493. vispy/visuals/tests/test_volume.py +542 -0
  494. vispy/visuals/tests/test_windbarb.py +33 -0
  495. vispy/visuals/text/__init__.py +7 -0
  496. vispy/visuals/text/_sdf_cpu.cpython-312-aarch64-linux-gnu.so +0 -0
  497. vispy/visuals/text/_sdf_cpu.pyx +110 -0
  498. vispy/visuals/text/_sdf_gpu.py +316 -0
  499. vispy/visuals/text/text.py +675 -0
  500. vispy/visuals/transforms/__init__.py +34 -0
  501. vispy/visuals/transforms/_util.py +191 -0
  502. vispy/visuals/transforms/base_transform.py +233 -0
  503. vispy/visuals/transforms/chain.py +300 -0
  504. vispy/visuals/transforms/interactive.py +98 -0
  505. vispy/visuals/transforms/linear.py +564 -0
  506. vispy/visuals/transforms/nonlinear.py +398 -0
  507. vispy/visuals/transforms/tests/__init__.py +0 -0
  508. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  509. vispy/visuals/transforms/transform_system.py +339 -0
  510. vispy/visuals/tube.py +173 -0
  511. vispy/visuals/visual.py +923 -0
  512. vispy/visuals/volume.py +1335 -0
  513. vispy/visuals/windbarb.py +291 -0
  514. vispy/visuals/xyz_axis.py +34 -0
  515. vispy-0.14.0.dist-info/LICENSE.txt +36 -0
  516. vispy-0.14.0.dist-info/METADATA +218 -0
  517. vispy-0.14.0.dist-info/RECORD +519 -0
  518. vispy-0.14.0.dist-info/WHEEL +6 -0
  519. vispy-0.14.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,513 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ """vispy backend for glfw."""
5
+
6
+ # To install GLFW on Ubuntu, use sudo apt-get install libglfw3.
7
+ # On OSX, consider using brew.
8
+
9
+ from __future__ import division
10
+
11
+ import atexit
12
+ from time import sleep
13
+ import gc
14
+ import os
15
+
16
+ from ..base import BaseApplicationBackend, BaseCanvasBackend, BaseTimerBackend
17
+ from ...util import keys, logger
18
+ from ...util.ptime import time
19
+ from ... import config
20
+
21
+ USE_EGL = config['gl_backend'].lower().startswith('es')
22
+
23
+
24
+ # -------------------------------------------------------------------- init ---
25
+
26
+ glfw = None
27
+ try:
28
+ import glfw
29
+ except ImportError:
30
+ why_not = "Could not import glfw, you may need to `pip install glfw` first."
31
+ available, testable, why_not, which = False, False, why_not, None
32
+ except Exception as err:
33
+ why_not = "Error importing glfw: " + str(err)
34
+ available, testable, why_not, which = False, False, why_not, None
35
+ else:
36
+ if USE_EGL:
37
+ available, testable, why_not = False, False, 'EGL not supported'
38
+ which = 'glfw ' + str(glfw.__version__)
39
+ else:
40
+ available, testable, why_not = True, True, None
41
+ which = 'glfw ' + str(glfw.__version__)
42
+
43
+ if glfw:
44
+ # Map native keys to vispy keys
45
+ KEYMAP = {
46
+ glfw.KEY_LEFT_SHIFT: keys.SHIFT,
47
+ glfw.KEY_RIGHT_SHIFT: keys.SHIFT,
48
+ glfw.KEY_LEFT_CONTROL: keys.CONTROL,
49
+ glfw.KEY_RIGHT_CONTROL: keys.CONTROL,
50
+ glfw.KEY_LEFT_ALT: keys.ALT,
51
+ glfw.KEY_RIGHT_ALT: keys.ALT,
52
+ glfw.KEY_LEFT_SUPER: keys.META,
53
+ glfw.KEY_RIGHT_SUPER: keys.META,
54
+
55
+ glfw.KEY_LEFT: keys.LEFT,
56
+ glfw.KEY_UP: keys.UP,
57
+ glfw.KEY_RIGHT: keys.RIGHT,
58
+ glfw.KEY_DOWN: keys.DOWN,
59
+ glfw.KEY_PAGE_UP: keys.PAGEUP,
60
+ glfw.KEY_PAGE_DOWN: keys.PAGEDOWN,
61
+
62
+ glfw.KEY_INSERT: keys.INSERT,
63
+ glfw.KEY_DELETE: keys.DELETE,
64
+ glfw.KEY_HOME: keys.HOME,
65
+ glfw.KEY_END: keys.END,
66
+
67
+ glfw.KEY_ESCAPE: keys.ESCAPE,
68
+ glfw.KEY_BACKSPACE: keys.BACKSPACE,
69
+
70
+ glfw.KEY_F1: keys.F1,
71
+ glfw.KEY_F2: keys.F2,
72
+ glfw.KEY_F3: keys.F3,
73
+ glfw.KEY_F4: keys.F4,
74
+ glfw.KEY_F5: keys.F5,
75
+ glfw.KEY_F6: keys.F6,
76
+ glfw.KEY_F7: keys.F7,
77
+ glfw.KEY_F8: keys.F8,
78
+ glfw.KEY_F9: keys.F9,
79
+ glfw.KEY_F10: keys.F10,
80
+ glfw.KEY_F11: keys.F11,
81
+ glfw.KEY_F12: keys.F12,
82
+
83
+ glfw.KEY_SPACE: keys.SPACE,
84
+ glfw.KEY_ENTER: keys.ENTER,
85
+ '\r': keys.ENTER,
86
+ glfw.KEY_TAB: keys.TAB,
87
+ }
88
+
89
+ BUTTONMAP = {glfw.MOUSE_BUTTON_LEFT: 1,
90
+ glfw.MOUSE_BUTTON_RIGHT: 2,
91
+ glfw.MOUSE_BUTTON_MIDDLE: 3
92
+ }
93
+
94
+ MOD_KEYS = [keys.SHIFT, keys.ALT, keys.CONTROL, keys.META]
95
+ _GLFW_INITIALIZED = False
96
+ _VP_GLFW_ALL_WINDOWS = []
97
+
98
+
99
+ def _get_glfw_windows():
100
+ wins = list()
101
+ for win in _VP_GLFW_ALL_WINDOWS:
102
+ if isinstance(win, CanvasBackend):
103
+ wins.append(win)
104
+ return wins
105
+
106
+
107
+ # -------------------------------------------------------------- capability ---
108
+
109
+ capability = dict( # things that can be set by the backend
110
+ title=True,
111
+ size=True,
112
+ position=True,
113
+ show=True,
114
+ vsync=True,
115
+ resizable=True,
116
+ decorate=True,
117
+ fullscreen=True,
118
+ context=True,
119
+ multi_window=True,
120
+ scroll=True,
121
+ parent=False,
122
+ always_on_top=True,
123
+ )
124
+
125
+
126
+ # ------------------------------------------------------- set_configuration ---
127
+
128
+ def _set_config(c):
129
+ """Set gl configuration for GLFW."""
130
+ glfw.window_hint(glfw.RED_BITS, c['red_size'])
131
+ glfw.window_hint(glfw.GREEN_BITS, c['green_size'])
132
+ glfw.window_hint(glfw.BLUE_BITS, c['blue_size'])
133
+ glfw.window_hint(glfw.ALPHA_BITS, c['alpha_size'])
134
+
135
+ glfw.window_hint(glfw.ACCUM_RED_BITS, 0)
136
+ glfw.window_hint(glfw.ACCUM_GREEN_BITS, 0)
137
+ glfw.window_hint(glfw.ACCUM_BLUE_BITS, 0)
138
+ glfw.window_hint(glfw.ACCUM_ALPHA_BITS, 0)
139
+
140
+ glfw.window_hint(glfw.DEPTH_BITS, c['depth_size'])
141
+ glfw.window_hint(glfw.STENCIL_BITS, c['stencil_size'])
142
+ # glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, c['major_version'])
143
+ # glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, c['minor_version'])
144
+ # glfw.window_hint(glfw.SRGB_CAPABLE, c['srgb'])
145
+ glfw.window_hint(glfw.SAMPLES, c['samples'])
146
+ glfw.window_hint(glfw.STEREO, c['stereo'])
147
+ if not c['double_buffer']:
148
+ raise RuntimeError('GLFW must double buffer, consider using a '
149
+ 'different backend, or using double buffering')
150
+
151
+
152
+ # ------------------------------------------------------------- application ---
153
+
154
+
155
+ _glfw_errors = []
156
+
157
+
158
+ def _error_callback(num, descr):
159
+ _glfw_errors.append('Error %s: %s' % (num, descr))
160
+
161
+
162
+ class ApplicationBackend(BaseApplicationBackend):
163
+
164
+ def __init__(self):
165
+ BaseApplicationBackend.__init__(self)
166
+ self._timers = list()
167
+
168
+ def _add_timer(self, timer):
169
+ if timer not in self._timers:
170
+ self._timers.append(timer)
171
+
172
+ def _vispy_get_backend_name(self):
173
+ return 'Glfw'
174
+
175
+ def _vispy_process_events(self):
176
+ glfw.poll_events()
177
+ for timer in self._timers:
178
+ timer._tick()
179
+ wins = _get_glfw_windows()
180
+ for win in wins:
181
+ if win._needs_draw:
182
+ win._needs_draw = False
183
+ win._on_draw()
184
+
185
+ def _vispy_run(self):
186
+ wins = _get_glfw_windows()
187
+ while any(w._id is not None and not glfw.window_should_close(w._id)
188
+ for w in wins):
189
+ self._vispy_process_events()
190
+ self._vispy_quit() # to clean up
191
+
192
+ def _vispy_quit(self):
193
+ # Close windows
194
+ wins = _get_glfw_windows()
195
+ for win in wins:
196
+ if win._vispy_canvas is not None:
197
+ win._vispy_canvas.close()
198
+ # tear down timers
199
+ for timer in self._timers:
200
+ timer._vispy_stop()
201
+ self._timers = []
202
+
203
+ def _vispy_get_native_app(self):
204
+ global _GLFW_INITIALIZED
205
+ if not _GLFW_INITIALIZED:
206
+ cwd = os.getcwd()
207
+ glfw.set_error_callback(_error_callback)
208
+ try:
209
+ if not glfw.init(): # only ever call once
210
+ raise OSError('Could not init glfw:\n%r' % _glfw_errors)
211
+ finally:
212
+ os.chdir(cwd)
213
+ glfw.set_error_callback(None)
214
+ atexit.register(glfw.terminate)
215
+ _GLFW_INITIALIZED = True
216
+ return glfw
217
+
218
+
219
+ # ------------------------------------------------------------------ canvas ---
220
+
221
+ class CanvasBackend(BaseCanvasBackend):
222
+ """Glfw backend for Canvas abstract class."""
223
+
224
+ def __init__(self, vispy_canvas, **kwargs):
225
+ BaseCanvasBackend.__init__(self, vispy_canvas)
226
+ p = self._process_backend_kwargs(kwargs)
227
+ self._initialized = False
228
+
229
+ # Deal with config
230
+ _set_config(p.context.config)
231
+ # Deal with context
232
+ p.context.shared.add_ref('glfw', self)
233
+ if p.context.shared.ref is self:
234
+ share = None
235
+ else:
236
+ share = p.context.shared.ref._id
237
+
238
+ glfw.window_hint(glfw.REFRESH_RATE, 0) # highest possible
239
+ glfw.window_hint(glfw.RESIZABLE, int(p.resizable))
240
+ glfw.window_hint(glfw.DECORATED, int(p.decorate))
241
+ glfw.window_hint(glfw.VISIBLE, 0) # start out hidden
242
+ glfw.window_hint(glfw.FLOATING, int(p.always_on_top))
243
+ if p.fullscreen is not False:
244
+ self._fullscreen = True
245
+ if p.fullscreen is True:
246
+ monitor = glfw.get_primary_monitor()
247
+ else:
248
+ monitor = glfw.get_monitors()
249
+ if p.fullscreen >= len(monitor):
250
+ raise ValueError('fullscreen must be <= %s'
251
+ % len(monitor))
252
+ monitor = monitor[p.fullscreen]
253
+ use_size = glfw.get_video_mode(monitor)[0][:2]
254
+ if use_size != tuple(p.size):
255
+ logger.debug('Requested size %s, will be ignored to '
256
+ 'use fullscreen mode %s' % (p.size, use_size))
257
+ size = use_size
258
+ else:
259
+ self._fullscreen = False
260
+ monitor = None
261
+ size = p.size
262
+
263
+ self._id = glfw.create_window(width=size[0], height=size[1],
264
+ title=p.title, monitor=monitor,
265
+ share=share)
266
+ if not self._id:
267
+ raise RuntimeError('Could not create window')
268
+
269
+ glfw.make_context_current(self._id)
270
+ glfw.swap_interval(1 if p.vsync else 0) # needs a valid context
271
+
272
+ _VP_GLFW_ALL_WINDOWS.append(self)
273
+ self._mod = list()
274
+
275
+ # Register callbacks
276
+ glfw.set_window_refresh_callback(self._id, self._on_draw)
277
+ glfw.set_window_size_callback(self._id, self._on_resize)
278
+ glfw.set_key_callback(self._id, self._on_key_press)
279
+ glfw.set_char_callback(self._id, self._on_key_char)
280
+ glfw.set_mouse_button_callback(self._id, self._on_mouse_button)
281
+ glfw.set_scroll_callback(self._id, self._on_mouse_scroll)
282
+ glfw.set_cursor_pos_callback(self._id, self._on_mouse_motion)
283
+ glfw.set_window_close_callback(self._id, self._on_close)
284
+ self._vispy_canvas_ = None
285
+ self._needs_draw = False
286
+ self._vispy_canvas.set_current()
287
+ if p.position is not None:
288
+ self._vispy_set_position(*p.position)
289
+ if p.show:
290
+ glfw.show_window(self._id)
291
+
292
+ # Init
293
+ self._initialized = True
294
+ self._next_key_events = []
295
+ self._next_key_text = {}
296
+ self._vispy_canvas.set_current()
297
+ self._vispy_canvas.events.initialize()
298
+ self._on_resize(self._id, size[0], size[1])
299
+
300
+ def _vispy_warmup(self):
301
+ etime = time() + 0.25
302
+ while time() < etime:
303
+ sleep(0.01)
304
+ self._vispy_canvas.set_current()
305
+ self._vispy_canvas.app.process_events()
306
+
307
+ def _vispy_set_current(self):
308
+ if self._id is None:
309
+ return
310
+ # Make this the current context
311
+ glfw.make_context_current(self._id)
312
+
313
+ def _vispy_swap_buffers(self):
314
+ if self._id is None:
315
+ return
316
+ # Swap front and back buffer
317
+ glfw.swap_buffers(self._id)
318
+
319
+ def _vispy_set_title(self, title):
320
+ if self._id is None:
321
+ return
322
+ # Set the window title. Has no effect for widgets
323
+ glfw.set_window_title(self._id, title)
324
+
325
+ def _vispy_set_size(self, w, h):
326
+ if self._id is None:
327
+ return
328
+ # Set size of the widget or window
329
+ glfw.set_window_size(self._id, w, h)
330
+
331
+ def _vispy_set_position(self, x, y):
332
+ if self._id is None:
333
+ return
334
+ # Set position of the widget or window. May have no effect for widgets
335
+ glfw.set_window_pos(self._id, x, y)
336
+
337
+ def _vispy_set_visible(self, visible):
338
+ # Show or hide the window or widget
339
+ if self._id is None:
340
+ return
341
+ if visible:
342
+ glfw.show_window(self._id)
343
+ # this ensures that the show takes effect
344
+ self._vispy_update()
345
+ else:
346
+ glfw.hide_window(self._id)
347
+
348
+ def _vispy_set_fullscreen(self, fullscreen):
349
+ logger.warn('Cannot change fullscreen mode for GLFW backend')
350
+
351
+ def _vispy_update(self):
352
+ # Invoke a redraw, passing it on to the canvas
353
+ if self._vispy_canvas is None or self._id is None:
354
+ return
355
+ # Mark that this window wants to be drawn on the next loop iter
356
+ self._needs_draw = True
357
+
358
+ def _vispy_close(self):
359
+ # Force the window or widget to shut down
360
+ if self._id is not None:
361
+ self._vispy_canvas = None
362
+ # glfw.set_window_should_close() # Does not really cause a close
363
+ self._vispy_set_visible(False)
364
+ self._id, id_ = None, self._id
365
+ glfw.destroy_window(id_)
366
+ gc.collect() # help ensure context gets destroyed
367
+
368
+ def _vispy_get_size(self):
369
+ if self._id is None:
370
+ return
371
+ w, h = glfw.get_window_size(self._id)
372
+ return w, h
373
+
374
+ def _vispy_get_physical_size(self):
375
+ if self._id is None:
376
+ return
377
+ w, h = glfw.get_framebuffer_size(self._id)
378
+ return w, h
379
+
380
+ def _vispy_get_position(self):
381
+ if self._id is None:
382
+ return
383
+ x, y = glfw.get_window_pos(self._id)
384
+ return x, y
385
+
386
+ def _vispy_get_fullscreen(self):
387
+ return self._fullscreen
388
+
389
+ ##########################################
390
+ # Notify vispy of events triggered by GLFW
391
+ def _on_resize(self, _id, w, h):
392
+ if self._vispy_canvas is None:
393
+ return
394
+ self._vispy_canvas.events.resize(
395
+ size=(w, h), physical_size=self._vispy_get_physical_size())
396
+
397
+ def _on_close(self, _id):
398
+ if self._vispy_canvas is None:
399
+ return
400
+ self._vispy_canvas.close()
401
+
402
+ def _on_draw(self, _id=None):
403
+ if self._vispy_canvas is None or self._id is None:
404
+ return
405
+ self._vispy_canvas.set_current()
406
+ self._vispy_canvas.events.draw(region=None) # (0, 0, w, h))
407
+
408
+ def _on_mouse_button(self, _id, button, action, mod):
409
+ if self._vispy_canvas is None and self._id is not None:
410
+ return
411
+ pos = glfw.get_cursor_pos(self._id)
412
+ if button < 3:
413
+ # Mouse click event
414
+ button = BUTTONMAP.get(button, 0)
415
+ if action == glfw.PRESS:
416
+ fun = self._vispy_mouse_press
417
+ elif action == glfw.RELEASE:
418
+ fun = self._vispy_mouse_release
419
+ else:
420
+ return
421
+ fun(pos=pos, button=button, modifiers=self._mod)
422
+
423
+ def _on_mouse_scroll(self, _id, x_off, y_off):
424
+ if self._vispy_canvas is None and self._id is not None:
425
+ return
426
+ pos = glfw.get_cursor_pos(self._id)
427
+ delta = (float(x_off), float(y_off))
428
+ self._vispy_canvas.events.mouse_wheel(pos=pos, delta=delta,
429
+ modifiers=self._mod)
430
+
431
+ def _on_mouse_motion(self, _id, x, y):
432
+ if self._vispy_canvas is None:
433
+ return
434
+ self._vispy_mouse_move(pos=(x, y), modifiers=self._mod)
435
+
436
+ def _on_key_press(self, _id, key, scancode, action, mod):
437
+ if self._vispy_canvas is None:
438
+ return
439
+ key, text = self._process_key(key)
440
+ if action == glfw.PRESS:
441
+ fun = self._vispy_canvas.events.key_press
442
+ down = True
443
+ elif action == glfw.RELEASE:
444
+ fun = self._vispy_canvas.events.key_release
445
+ down = False
446
+ else:
447
+ return
448
+ self._process_mod(key, down=down)
449
+
450
+ # NOTE: GLFW only provides localized characters via _on_key_char, so if
451
+ # this event contains a character we store all other data and dispatch
452
+ # it once the final unicode character is sent shortly after.
453
+ if text != '' and action == glfw.PRESS:
454
+ self._next_key_events.append((fun, key, self._mod))
455
+ else:
456
+ if key in self._next_key_text:
457
+ text = self._next_key_text[key]
458
+ del self._next_key_text[key]
459
+ fun(key=key, text=text, modifiers=self._mod)
460
+
461
+ def _on_key_char(self, _id, text):
462
+ # Repeat strokes (frequency configured at OS) are sent here only,
463
+ # no regular _on_key_press events. Currently ignored!
464
+ if len(self._next_key_events) == 0:
465
+ return
466
+
467
+ (fun, key, mod) = self._next_key_events.pop(0)
468
+ fun(key=key, text=chr(text), modifiers=mod)
469
+ self._next_key_text[key] = text
470
+
471
+ def _process_key(self, key):
472
+ if 32 <= key <= 127:
473
+ return keys.Key(chr(key)), chr(key)
474
+ elif key in KEYMAP:
475
+ return KEYMAP[key], ''
476
+ else:
477
+ return None, ''
478
+
479
+ def _process_mod(self, key, down):
480
+ """Process (possible) keyboard modifiers
481
+
482
+ GLFW provides "mod" with many callbacks, but not (critically) the
483
+ scroll callback, so we keep track on our own here.
484
+ """
485
+ if key in MOD_KEYS:
486
+ if down:
487
+ if key not in self._mod:
488
+ self._mod.append(key)
489
+ elif key in self._mod:
490
+ self._mod.pop(self._mod.index(key))
491
+ return self._mod
492
+
493
+
494
+ # ------------------------------------------------------------------- timer ---
495
+
496
+ class TimerBackend(BaseTimerBackend):
497
+
498
+ def __init__(self, vispy_timer):
499
+ BaseTimerBackend.__init__(self, vispy_timer)
500
+ vispy_timer._app._backend._add_timer(self)
501
+ self._vispy_stop()
502
+
503
+ def _vispy_start(self, interval):
504
+ self._interval = interval
505
+ self._next_time = time() + self._interval
506
+
507
+ def _vispy_stop(self):
508
+ self._next_time = float('inf')
509
+
510
+ def _tick(self):
511
+ if time() >= self._next_time:
512
+ self._vispy_timer._timeout()
513
+ self._next_time = time() + self._interval