vispy 0.15.0__cp313-cp313-macosx_10_13_x86_64.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 (521) 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 +1003 -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 +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -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 +162 -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 +700 -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 +594 -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 +568 -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 +1824 -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 +1046 -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 +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -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 +183 -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 +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -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 +32 -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 +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -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 +162 -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 +801 -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 +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -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 +819 -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_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-313-darwin.so +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +6 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
vispy/util/logs.py ADDED
@@ -0,0 +1,358 @@
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
+
5
+ import base64
6
+ import logging
7
+ import sys
8
+ import inspect
9
+ import re
10
+ import traceback
11
+ import json
12
+ from functools import partial
13
+
14
+ import numpy as np
15
+
16
+
17
+ ###############################################################################
18
+ # LOGGING (some adapted from mne-python)
19
+
20
+ def _get_vispy_caller():
21
+ """Helper to get vispy calling function from the stack"""
22
+ records = inspect.stack()
23
+ # first few records are vispy-based logging calls
24
+ for record in records[5:]:
25
+ module = record[0].f_globals['__name__']
26
+ if module.startswith('vispy'):
27
+ line = str(record[0].f_lineno)
28
+ func = record[3]
29
+ cls = record[0].f_locals.get('self', None)
30
+ clsname = "" if cls is None else cls.__class__.__name__ + '.'
31
+ caller = "{0}:{1}{2}({3}): ".format(module, clsname, func, line)
32
+ return caller
33
+ return 'unknown'
34
+
35
+
36
+ # class _WrapStdOut(object):
37
+ # """Class to work around how doctest captures stdout"""
38
+ # def __getattr__(self, name):
39
+ # # Even more ridiculous than this class, this must be sys.stdout (not
40
+ # # just stdout) in order for this to work (tested on OSX and Linux)
41
+ # return getattr(sys.stdout, name)
42
+
43
+
44
+ class _VispyFormatter(logging.Formatter):
45
+ """Formatter that optionally prepends caller"""
46
+
47
+ def __init__(self):
48
+ logging.Formatter.__init__(self, '%(levelname)s: %(message)s')
49
+ self._vispy_prepend_caller = False
50
+
51
+ def _vispy_set_prepend(self, prepend):
52
+ self._vispy_prepend_caller = prepend
53
+
54
+ def format(self, record):
55
+ out = logging.Formatter.format(self, record)
56
+ if self._vispy_prepend_caller:
57
+ out = _get_vispy_caller() + out
58
+ return out
59
+
60
+
61
+ class _VispyStreamHandler(logging.StreamHandler):
62
+ """Stream handler allowing matching and recording
63
+
64
+ This handler has two useful optional additions:
65
+
66
+ 1. Recording emitted messages.
67
+ 2. Performing regexp substring matching.
68
+
69
+ Prepending of traceback information is done in _VispyFormatter.
70
+ """
71
+
72
+ def __init__(self):
73
+ logging.StreamHandler.__init__(self, sys.stderr)
74
+ self._vispy_formatter = _lf
75
+ self.setFormatter(self._vispy_formatter)
76
+ self._vispy_match = None
77
+ self._vispy_emit_list = list()
78
+ self._vispy_set_emit_record(False)
79
+ self._vispy_set_match(None)
80
+ self._vispy_print_msg = True
81
+
82
+ def _vispy_emit_match_andor_record(self, record):
83
+ """Log message emitter that optionally matches and/or records"""
84
+ test = record.getMessage()
85
+ match = self._vispy_match
86
+ if (match is None or re.search(match, test) or
87
+ re.search(match, _get_vispy_caller())):
88
+ if self._vispy_emit_record:
89
+ fmt_rec = self._vispy_formatter.format(record)
90
+ self._vispy_emit_list.append(fmt_rec)
91
+ if self._vispy_print_msg:
92
+ return logging.StreamHandler.emit(self, record)
93
+ else:
94
+ return
95
+
96
+ def _vispy_set_match(self, match):
97
+ old_match = self._vispy_match
98
+ self._vispy_match = match
99
+ # Triage here to avoid a bunch of if's later (more efficient)
100
+ if match is not None or self._vispy_emit_record:
101
+ self.emit = self._vispy_emit_match_andor_record
102
+ else:
103
+ self.emit = partial(logging.StreamHandler.emit, self)
104
+ return old_match
105
+
106
+ def _vispy_set_emit_record(self, record):
107
+ self._vispy_emit_record = record
108
+ match = self._vispy_match
109
+ # Triage here to avoid a bunch of if's later (more efficient)
110
+ if match is not None or self._vispy_emit_record:
111
+ self.emit = self._vispy_emit_match_andor_record
112
+ else:
113
+ self.emit = partial(logging.StreamHandler.emit, self)
114
+
115
+ def _vispy_reset_list(self):
116
+ self._vispy_emit_list = list()
117
+
118
+
119
+ logger = logging.getLogger('vispy')
120
+ _lf = _VispyFormatter()
121
+ _lh = _VispyStreamHandler() # needs _lf to exist
122
+ logger.addHandler(_lh)
123
+
124
+ logging_types = dict(debug=logging.DEBUG, info=logging.INFO,
125
+ warning=logging.WARNING, error=logging.ERROR,
126
+ critical=logging.CRITICAL)
127
+
128
+
129
+ def set_log_level(verbose, match=None, return_old=False):
130
+ """Convenience function for setting the logging level
131
+
132
+ Parameters
133
+ ----------
134
+ verbose : bool, str, int, or None
135
+ The verbosity of messages to print. If a str, it can be either DEBUG,
136
+ INFO, WARNING, ERROR, or CRITICAL. Note that these are for
137
+ convenience and are equivalent to passing in logging.DEBUG, etc.
138
+ For bool, True is the same as 'INFO', False is the same as 'WARNING'.
139
+ match : str | None
140
+ String to match. Only those messages that both contain a substring
141
+ that regexp matches ``'match'`` (and the ``verbose`` level) will be
142
+ displayed.
143
+ return_old : bool
144
+ If True, return the old verbosity level and old match.
145
+
146
+ Notes
147
+ -----
148
+ If ``verbose=='debug'``, then the ``vispy`` method emitting the log
149
+ message will be prepended to each log message, which is useful for
150
+ debugging. If ``verbose=='debug'`` or ``match is not None``, then a
151
+ small performance overhead is added. Thus it is suggested to only use
152
+ these options when performance is not crucial.
153
+
154
+ See also
155
+ --------
156
+ vispy.util.use_log_level
157
+ """
158
+ # This method is responsible for setting properties of the handler and
159
+ # formatter such that proper messages (possibly with the vispy caller
160
+ # prepended) are displayed. Storing log messages is only available
161
+ # via the context handler (use_log_level), so that configuration is
162
+ # done by the context handler itself.
163
+ if isinstance(verbose, bool):
164
+ verbose = 'info' if verbose else 'warning'
165
+ if isinstance(verbose, str):
166
+ verbose = verbose.lower()
167
+ if verbose not in logging_types:
168
+ raise ValueError('Invalid argument "%s"' % verbose)
169
+ verbose = logging_types[verbose]
170
+ else:
171
+ raise TypeError('verbose must be a bool or string')
172
+ logger = logging.getLogger('vispy')
173
+ old_verbose = logger.level
174
+ old_match = _lh._vispy_set_match(match)
175
+ logger.setLevel(verbose)
176
+ if verbose <= logging.DEBUG:
177
+ _lf._vispy_set_prepend(True)
178
+ else:
179
+ _lf._vispy_set_prepend(False)
180
+ out = None
181
+ if return_old:
182
+ out = (old_verbose, old_match)
183
+ return out
184
+
185
+
186
+ class use_log_level(object):
187
+ """Context manager that temporarily sets logging level
188
+
189
+ Parameters
190
+ ----------
191
+ level : str
192
+ See ``set_log_level`` for options.
193
+ match : str | None
194
+ The string to match.
195
+ record : bool
196
+ If True, the context manager will keep a record of the logging
197
+ messages generated by vispy. Otherwise, an empty list will
198
+ be returned.
199
+ print_msg : bool
200
+ If False, printing of (all) messages will be suppressed. This is
201
+ mainly useful in testing. False only works in `record=True` mode, if
202
+ not recording messages, consider setting `level` appropriately.
203
+
204
+ Returns
205
+ -------
206
+ records : list
207
+ As a context manager, an empty list or the list of logging messages
208
+ will be returned (depending on the input ``record``).
209
+ """
210
+
211
+ # This method mostly wraps to set_log_level, but also takes
212
+ # care of enabling/disabling message recording in the formatter.
213
+
214
+ def __init__(self, level, match=None, record=False, print_msg=True):
215
+ self._new_level = level
216
+ self._new_match = match
217
+ self._print_msg = print_msg
218
+ self._record = record
219
+ if match is not None and not isinstance(match, str):
220
+ raise TypeError('match must be None or str')
221
+
222
+ def __enter__(self):
223
+ # set the log level
224
+ old_level, old_match = set_log_level(self._new_level,
225
+ self._new_match, return_old=True)
226
+ for key, value in logging_types.items():
227
+ if value == old_level:
228
+ old_level = key
229
+ self._old_level = old_level
230
+ self._old_match = old_match
231
+ if not self._print_msg:
232
+ _lh._vispy_print_msg = False
233
+ # set handler to record, if appropriate
234
+ _lh._vispy_reset_list()
235
+ if self._record:
236
+ _lh._vispy_set_emit_record(True)
237
+ return _lh._vispy_emit_list
238
+ else:
239
+ return list()
240
+
241
+ def __exit__(self, type, value, traceback):
242
+ # reset log level
243
+ set_log_level(self._old_level, self._old_match)
244
+ # reset handler
245
+ if self._record:
246
+ _lh._vispy_set_emit_record(False)
247
+ if not self._print_msg:
248
+ _lh._vispy_print_msg = True # set it back
249
+
250
+
251
+ def log_exception(level='warning', tb_skip=2):
252
+ """
253
+ Send an exception and traceback to the logger.
254
+
255
+ This function is used in cases where an exception is handled safely but
256
+ nevertheless should generate a descriptive error message. An extra line
257
+ is inserted into the stack trace indicating where the exception was caught.
258
+
259
+ Parameters
260
+ ----------
261
+ level : str
262
+ See ``set_log_level`` for options.
263
+ tb_skip : int
264
+ The number of traceback entries to ignore, prior to the point where
265
+ the exception was caught. The default is 2.
266
+ """
267
+ stack = "".join(traceback.format_stack()[:-tb_skip])
268
+ tb = traceback.format_exception(*sys.exc_info())
269
+ msg = tb[0] # "Traceback (most recent call last):"
270
+ msg += stack
271
+ msg += " << caught exception here: >>\n"
272
+ msg += "".join(tb[1:]).rstrip()
273
+ logger.log(logging_types[level], msg)
274
+
275
+ logger.log_exception = log_exception # make this easier to reach
276
+
277
+
278
+ def _handle_exception(ignore_callback_errors, print_callback_errors, obj,
279
+ cb_event=None, node=None):
280
+ """Helper for prining errors in callbacks
281
+
282
+ See EventEmitter._invoke_callback for a use example.
283
+ """
284
+ if not hasattr(obj, '_vispy_err_registry'):
285
+ obj._vispy_err_registry = {}
286
+ registry = obj._vispy_err_registry
287
+
288
+ if cb_event is not None:
289
+ cb, event = cb_event
290
+ exp_type = 'callback'
291
+ else:
292
+ exp_type = 'node'
293
+ type_, value, tb = sys.exc_info()
294
+ tb = tb.tb_next # Skip *this* frame
295
+ sys.last_type = type_
296
+ sys.last_value = value
297
+ sys.last_traceback = tb
298
+ del tb # Get rid of it in this namespace
299
+ # Handle
300
+ if not ignore_callback_errors:
301
+ raise
302
+ if print_callback_errors != "never":
303
+ this_print = 'full'
304
+ if print_callback_errors in ('first', 'reminders'):
305
+ # need to check to see if we've hit this yet
306
+ if exp_type == 'callback':
307
+ key = repr(cb) + repr(event)
308
+ else:
309
+ key = repr(node)
310
+ if key in registry:
311
+ registry[key] += 1
312
+ if print_callback_errors == 'first':
313
+ this_print = None
314
+ else: # reminders
315
+ ii = registry[key]
316
+ # Use logarithmic selection
317
+ # (1, 2, ..., 10, 20, ..., 100, 200, ...)
318
+ if ii == (2 ** int(np.log2(ii))):
319
+ this_print = ii
320
+ else:
321
+ this_print = None
322
+ else:
323
+ registry[key] = 1
324
+ if this_print == 'full':
325
+ logger.log_exception()
326
+ if exp_type == 'callback':
327
+ logger.error("Invoking %s for %s" % (cb, event))
328
+ else: # == 'node':
329
+ logger.error("Drawing node %s" % node)
330
+ elif this_print is not None:
331
+ if exp_type == 'callback':
332
+ logger.error("Invoking %s repeat %s"
333
+ % (cb, this_print))
334
+ else: # == 'node':
335
+ logger.error("Drawing node %s repeat %s"
336
+ % (node, this_print))
337
+
338
+
339
+ def _serialize_buffer(buffer, array_serialization=None):
340
+ """Serialize a NumPy array."""
341
+ if array_serialization == 'binary':
342
+ return buffer.ravel().tobytes()
343
+ elif array_serialization == 'base64':
344
+ return {'storage_type': 'base64',
345
+ 'buffer': base64.b64encode(buffer).decode('ascii')
346
+ }
347
+ raise ValueError("The array serialization method should be 'binary' or "
348
+ "'base64'.")
349
+
350
+
351
+ class NumPyJSONEncoder(json.JSONEncoder):
352
+ def default(self, obj):
353
+ if isinstance(obj, np.ndarray):
354
+ return _serialize_buffer(obj, array_serialization='base64')
355
+ elif isinstance(obj, np.generic):
356
+ return obj.item()
357
+
358
+ return json.JSONEncoder.default(self, obj)
@@ -0,0 +1,17 @@
1
+ import os
2
+ from . import logger
3
+
4
+
5
+ def fix_osmesa_gl_lib():
6
+ """
7
+ When using OSMesa, the gl functions (from libGL) are included
8
+ in libOSMesa.so. This function modifies the VISPY_GL_LIB env variable
9
+ so gl2 picks up libOSMesa.so as the OpenGL library.
10
+
11
+ This modification must be done before vispy.gloo is imported for the
12
+ first time.
13
+ """
14
+ if 'VISPY_GL_LIB' in os.environ:
15
+ logger.warning('VISPY_GL_LIB is ignored when using OSMesa. Use '
16
+ 'OSMESA_LIBRARY instead.')
17
+ os.environ['VISPY_GL_LIB'] = os.getenv('OSMESA_LIBRARY', 'libOSMesa.so')
vispy/util/profiler.py ADDED
@@ -0,0 +1,135 @@
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
+ # Adapted from PyQtGraph
5
+ import sys
6
+ from . import ptime
7
+ from .. import config
8
+
9
+
10
+ class Profiler(object):
11
+ """Simple profiler allowing directed, hierarchical measurement of time
12
+ intervals.
13
+
14
+ By default, profilers are disabled. To enable profiling, set the
15
+ environment variable `VISPYPROFILE` to a comma-separated list of
16
+ fully-qualified names of profiled functions.
17
+
18
+ Calling a profiler registers a message (defaulting to an increasing
19
+ counter) that contains the time elapsed since the last call. When the
20
+ profiler is about to be garbage-collected, the messages are passed to the
21
+ outer profiler if one is running, or printed to stdout otherwise.
22
+
23
+ If `delayed` is set to False, messages are immediately printed instead.
24
+
25
+ Example:
26
+ def function(...):
27
+ profiler = Profiler()
28
+ ... do stuff ...
29
+ profiler('did stuff')
30
+ ... do other stuff ...
31
+ profiler('did other stuff')
32
+ # profiler is garbage-collected and flushed at function end
33
+
34
+ If this function is a method of class C, setting `VISPYPROFILE` to
35
+ "C.function" (without the module name) will enable this profiler.
36
+
37
+ For regular functions, use the qualified name of the function, stripping
38
+ only the initial "vispy.." prefix from the module.
39
+ """
40
+
41
+ _profilers = (config['profile'].split(",") if config['profile'] is not None
42
+ else [])
43
+
44
+ _depth = 0
45
+ _msgs = []
46
+ # set this flag to disable all or individual profilers at runtime
47
+ disable = False
48
+
49
+ class DisabledProfiler(object):
50
+ def __init__(self, *args, **kwds):
51
+ pass
52
+
53
+ def __call__(self, *args):
54
+ pass
55
+
56
+ def finish(self):
57
+ pass
58
+
59
+ def mark(self, msg=None):
60
+ pass
61
+
62
+ _disabled_profiler = DisabledProfiler()
63
+
64
+ def __new__(cls, msg=None, disabled='env', delayed=True):
65
+ """Optionally create a new profiler based on caller's qualname."""
66
+ if (disabled is True or
67
+ (disabled == 'env' and len(cls._profilers) == 0)):
68
+ return cls._disabled_profiler
69
+
70
+ # determine the qualified name of the caller function
71
+ caller_frame = sys._getframe(1)
72
+ try:
73
+ caller_object_type = type(caller_frame.f_locals["self"])
74
+ except KeyError: # we are in a regular function
75
+ qualifier = caller_frame.f_globals["__name__"].split(".", 1)[1]
76
+ else: # we are in a method
77
+ qualifier = caller_object_type.__name__
78
+ func_qualname = qualifier + "." + caller_frame.f_code.co_name
79
+ if (disabled == 'env' and func_qualname not in cls._profilers and
80
+ 'all' not in cls._profilers): # don't do anything
81
+ return cls._disabled_profiler
82
+ # create an actual profiling object
83
+ cls._depth += 1
84
+ obj = super(Profiler, cls).__new__(cls)
85
+ obj._name = msg or func_qualname
86
+ obj._delayed = delayed
87
+ obj._mark_count = 0
88
+ obj._finished = False
89
+ obj._firstTime = obj._last_time = ptime.time()
90
+ obj._new_msg("> Entering " + obj._name)
91
+ return obj
92
+
93
+ def __call__(self, msg=None, *args):
94
+ """Register or print a new message with timing information."""
95
+ if self.disable:
96
+ return
97
+ if msg is None:
98
+ msg = str(self._mark_count)
99
+ self._mark_count += 1
100
+ new_time = ptime.time()
101
+ elapsed = (new_time - self._last_time) * 1000
102
+ self._new_msg(" " + msg + ": %0.4f ms", *(args + (elapsed,)))
103
+ self._last_time = new_time
104
+
105
+ def mark(self, msg=None):
106
+ self(msg)
107
+
108
+ def _new_msg(self, msg, *args):
109
+ msg = " " * (self._depth - 1) + msg
110
+ if self._delayed:
111
+ self._msgs.append((msg, args))
112
+ else:
113
+ self.flush()
114
+ print(msg % args)
115
+
116
+ def __del__(self):
117
+ self.finish()
118
+
119
+ def finish(self, msg=None):
120
+ """Add a final message; flush the message list if no parent profiler."""
121
+ if self._finished or self.disable:
122
+ return
123
+ self._finished = True
124
+ if msg is not None:
125
+ self(msg)
126
+ self._new_msg("< Exiting %s, total time: %0.4f ms",
127
+ self._name, (ptime.time() - self._firstTime) * 1000)
128
+ type(self)._depth -= 1
129
+ if self._depth < 1:
130
+ self.flush()
131
+
132
+ def flush(self):
133
+ if self._msgs:
134
+ print("\n".join([m[0] % m[1] for m in self._msgs]))
135
+ type(self)._msgs = []
vispy/util/ptime.py ADDED
@@ -0,0 +1,16 @@
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
+
5
+ """
6
+ ptime.py - Precision time function made os-independent
7
+ """
8
+
9
+ import time as systime
10
+ # get a reference starting time - initial performance counter
11
+ START_TIME = systime.time() - systime.perf_counter()
12
+
13
+
14
+ def time():
15
+ # return reference starting time + delta of performance counters
16
+ return START_TIME + systime.perf_counter()