vispy 0.15.0__cp313-cp313-win_amd64.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.cp313-win_amd64.pyd +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 +5 -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
@@ -0,0 +1,57 @@
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
+ import os
5
+ from packaging.version import Version
6
+
7
+ from vispy.util import use_log_level
8
+
9
+
10
+ def has_matplotlib(version='1.2'):
11
+ """Determine if mpl is a usable version"""
12
+ try:
13
+ import matplotlib
14
+ except Exception:
15
+ has_mpl = False
16
+ else:
17
+ if Version(matplotlib.__version__) >= Version(version):
18
+ has_mpl = True
19
+ else:
20
+ has_mpl = False
21
+ return has_mpl
22
+
23
+
24
+ def has_skimage(version='0.11'):
25
+ """Determine if scikit-image is a usable version"""
26
+ try:
27
+ import skimage
28
+ except ImportError:
29
+ return False
30
+ sk_version = Version(skimage.__version__)
31
+ return sk_version >= Version(version)
32
+
33
+
34
+ def has_backend(backend, has=(), capable=(), out=()):
35
+ from ..app.backends import BACKENDMAP
36
+ using = os.getenv('_VISPY_TESTING_APP', None)
37
+ if using is not None and using != backend:
38
+ # e.g., we are on a 'pyglet' run but the test requires PyQt4
39
+ ret = (False,) if len(out) > 0 else False
40
+ for o in out:
41
+ ret += (None,)
42
+ return ret
43
+
44
+ # let's follow the standard code path
45
+ module_name = BACKENDMAP[backend.lower()][1]
46
+ with use_log_level('warning', print_msg=False):
47
+ mod = __import__('app.backends.%s' % module_name, globals(), level=2)
48
+ mod = getattr(mod.backends, module_name)
49
+ good = mod.testable
50
+ for h in has:
51
+ good = (good and getattr(mod, 'has_%s' % h))
52
+ for cap in capable:
53
+ good = (good and mod.capability[cap])
54
+ ret = (good,) if len(out) > 0 else good
55
+ for o in out:
56
+ ret += (getattr(mod, o),)
57
+ return ret
vispy/util/config.py ADDED
@@ -0,0 +1,490 @@
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
+ """Vispy configuration functions."""
6
+
7
+ import io
8
+ import os
9
+ from os import path as op
10
+ import inspect
11
+ import json
12
+ import sys
13
+ import platform
14
+ import getopt
15
+ import traceback
16
+ import tempfile
17
+ import atexit
18
+ from shutil import rmtree
19
+
20
+ import numpy as np
21
+
22
+ from .event import EmitterGroup, EventEmitter, Event
23
+ from .logs import logger, set_log_level, use_log_level
24
+
25
+ file_types = [io.TextIOWrapper, io.BufferedRandom]
26
+ try:
27
+ file_types += [tempfile._TemporaryFileWrapper] # Py3k Windows this happens
28
+ except Exception:
29
+ pass
30
+ file_types = tuple(file_types)
31
+
32
+ config = None
33
+ _data_path = None
34
+ _allowed_config_keys = None
35
+
36
+
37
+ def _init():
38
+ """Create global Config object, parse command flags."""
39
+ global config, _data_path, _allowed_config_keys
40
+
41
+ app_dir = _get_vispy_app_dir()
42
+ if app_dir is not None:
43
+ _data_path = op.join(app_dir, 'data')
44
+ _test_data_path = op.join(app_dir, 'test_data')
45
+ else:
46
+ _data_path = _test_data_path = None
47
+
48
+ # All allowed config keys and the types they may have
49
+ _allowed_config_keys = {
50
+ 'data_path': (str,),
51
+ 'default_backend': (str,),
52
+ 'gl_backend': (str,),
53
+ 'gl_debug': (bool,),
54
+ 'glir_file': (str,) + file_types,
55
+ 'include_path': list,
56
+ 'logging_level': (str,),
57
+ 'qt_lib': (str,),
58
+ 'dpi': (int, type(None)),
59
+ 'profile': (str, type(None),),
60
+ 'audit_tests': (bool,),
61
+ 'test_data_path': (str, type(None),),
62
+ }
63
+
64
+ # Default values for all config options
65
+ default_config_options = {
66
+ 'data_path': _data_path,
67
+ 'default_backend': '',
68
+ 'gl_backend': 'gl2',
69
+ 'gl_debug': False,
70
+ 'glir_file': '',
71
+ 'include_path': [],
72
+ 'logging_level': 'warning',
73
+ 'qt_lib': 'any',
74
+ 'dpi': None,
75
+ 'profile': None,
76
+ 'audit_tests': False,
77
+ 'test_data_path': _test_data_path,
78
+ }
79
+
80
+ config = Config(**default_config_options)
81
+
82
+ try:
83
+ config.update(**_load_config())
84
+ except Exception as err:
85
+ raise Exception('Error while reading vispy config file "%s":\n %s' %
86
+ (_get_config_fname(), str(err)))
87
+ set_log_level(config['logging_level'])
88
+
89
+ _parse_command_line_arguments()
90
+
91
+
92
+ ###############################################################################
93
+ # Command line flag parsing
94
+
95
+ VISPY_HELP = """
96
+ VisPy command line arguments:
97
+
98
+ --vispy-backend=(qt|pyqt4|pyqt5|pyqt6|pyside|pyside2|pyside6|glfw|pyglet|sdl2|wx)
99
+ Selects the backend system for VisPy to use. This will override the default
100
+ backend selection in your configuration file.
101
+
102
+ --vispy-log=(debug|info|warning|error|critical)[,search string]
103
+ Sets the verbosity of logging output. The default is 'warning'. If a search
104
+ string is given, messages will only be displayed if they match the string,
105
+ or if their call location (module.class:method(line) or
106
+ module:function(line)) matches the string.
107
+
108
+ --vispy-dpi=resolution
109
+ Force the screen resolution to a certain value (in pixels per inch). By
110
+ default, the OS is queried to determine the screen DPI.
111
+
112
+ --vispy-fps
113
+ Print the framerate (in Frames Per Second) in the console.
114
+
115
+ --vispy-gl-debug
116
+ Enables error checking for all OpenGL calls.
117
+
118
+ --vispy-glir-file
119
+ Export glir commands to specified file.
120
+
121
+ --vispy-profile=locations
122
+ Measure performance at specific code locations and display results.
123
+ *locations* may be "all" or a comma-separated list of method names like
124
+ "SceneCanvas.draw_visual".
125
+
126
+ --vispy-cprofile
127
+ Enable profiling using the built-in cProfile module and display results
128
+ when the program exits.
129
+
130
+ --vispy-audit-tests
131
+ Enable user auditing of image test results.
132
+
133
+ --vispy-help
134
+ Display this help message.
135
+
136
+ """
137
+
138
+
139
+ def _parse_command_line_arguments():
140
+ """Transform vispy specific command line args to vispy config.
141
+ Put into a function so that any variables dont leak in the vispy namespace.
142
+ """
143
+ global config
144
+ # Get command line args for vispy
145
+ argnames = ['vispy-backend=', 'vispy-gl-debug', 'vispy-glir-file=',
146
+ 'vispy-log=', 'vispy-help', 'vispy-profile=', 'vispy-cprofile',
147
+ 'vispy-dpi=', 'vispy-audit-tests']
148
+ try:
149
+ opts, args = getopt.getopt(sys.argv[1:], '', argnames)
150
+ except getopt.GetoptError:
151
+ opts = []
152
+ # Use them to set the config values
153
+ for o, a in opts:
154
+ if o.startswith('--vispy'):
155
+ if o == '--vispy-backend':
156
+ config['default_backend'] = a
157
+ logger.info('vispy backend: %s', a)
158
+ elif o == '--vispy-gl-debug':
159
+ config['gl_debug'] = True
160
+ elif o == '--vispy-glir-file':
161
+ config['glir_file'] = a
162
+ elif o == '--vispy-log':
163
+ if ',' in a:
164
+ verbose, match = a.split(',')
165
+ else:
166
+ verbose = a
167
+ match = None
168
+ config['logging_level'] = a
169
+ set_log_level(verbose, match)
170
+ elif o == '--vispy-profile':
171
+ config['profile'] = a
172
+ elif o == '--vispy-cprofile':
173
+ _enable_profiling()
174
+ elif o == '--vispy-help':
175
+ print(VISPY_HELP)
176
+ elif o == '--vispy-dpi':
177
+ config['dpi'] = int(a)
178
+ elif o == '--vispy-audit-tests':
179
+ config['audit_tests'] = True
180
+ else:
181
+ logger.warning("Unsupported vispy flag: %s" % o)
182
+
183
+
184
+ ###############################################################################
185
+ # CONFIG
186
+
187
+ # Adapted from pyzolib/paths.py:
188
+ # https://bitbucket.org/pyzo/pyzolib/src/tip/paths.py
189
+ def _get_vispy_app_dir():
190
+ """Helper to get the default directory for storing vispy data"""
191
+ # Define default user directory
192
+ user_dir = os.path.expanduser('~')
193
+
194
+ # Get system app data dir
195
+ path = None
196
+ if sys.platform.startswith('win'):
197
+ path1, path2 = os.getenv('LOCALAPPDATA'), os.getenv('APPDATA')
198
+ path = path1 or path2
199
+ elif sys.platform.startswith('darwin'):
200
+ path = os.path.join(user_dir, 'Library', 'Application Support')
201
+ # On Linux and as fallback
202
+ if not (path and os.path.isdir(path)):
203
+ path = user_dir
204
+
205
+ # Maybe we should store things local to the executable (in case of a
206
+ # portable distro or a frozen application that wants to be portable)
207
+ prefix = sys.prefix
208
+ if getattr(sys, 'frozen', None): # See application_dir() function
209
+ prefix = os.path.abspath(os.path.dirname(sys.path[0]))
210
+ for reldir in ('settings', '../settings'):
211
+ localpath = os.path.abspath(os.path.join(prefix, reldir))
212
+ if os.path.isdir(localpath):
213
+ try:
214
+ open(os.path.join(localpath, 'test.write'), 'wb').close()
215
+ os.remove(os.path.join(localpath, 'test.write'))
216
+ except IOError:
217
+ pass # We cannot write in this directory
218
+ else:
219
+ path = localpath
220
+ break
221
+
222
+ # Get path specific for this app
223
+ appname = '.vispy' if path == user_dir else 'vispy'
224
+ path = os.path.join(path, appname)
225
+ return path
226
+
227
+
228
+ class ConfigEvent(Event):
229
+ """Event indicating a configuration change.
230
+
231
+ This class has a 'changes' attribute which is a dict of all name:value
232
+ pairs that have changed in the configuration.
233
+ """
234
+
235
+ def __init__(self, changes):
236
+ Event.__init__(self, type='config_change')
237
+ self.changes = changes
238
+
239
+
240
+ class Config(object):
241
+ """Container for global settings used application-wide in vispy.
242
+
243
+ Events:
244
+
245
+ - Config.events.changed - Emits ConfigEvent whenever the configuration changes.
246
+
247
+ """
248
+
249
+ def __init__(self, **kwargs):
250
+ self.events = EmitterGroup(source=self)
251
+ self.events['changed'] = EventEmitter(
252
+ event_class=ConfigEvent,
253
+ source=self)
254
+ self._config = {}
255
+ self.update(**kwargs)
256
+ self._known_keys = get_config_keys()
257
+
258
+ def __getitem__(self, item):
259
+ return self._config[item]
260
+
261
+ def __setitem__(self, item, val):
262
+ self._check_key_val(item, val)
263
+ self._config[item] = val
264
+ # inform any listeners that a configuration option has changed
265
+ self.events.changed(changes={item: val})
266
+
267
+ def _check_key_val(self, key, val):
268
+ global _allowed_config_keys
269
+ # check values against acceptable ones
270
+ known_keys = _allowed_config_keys
271
+ if key not in known_keys:
272
+ raise KeyError('key "%s" not in known keys: "%s"'
273
+ % (key, known_keys))
274
+ if not isinstance(val, known_keys[key]):
275
+ raise TypeError('Value for key "%s" must be one of %s, not %s.'
276
+ % (key, known_keys[key], type(val)))
277
+
278
+ def update(self, **kwargs):
279
+ for key, val in kwargs.items():
280
+ self._check_key_val(key, val)
281
+ self._config.update(kwargs)
282
+ self.events.changed(changes=kwargs)
283
+
284
+ def __repr__(self):
285
+ return repr(self._config)
286
+
287
+
288
+ def get_config_keys():
289
+ """The config keys known by vispy and their allowed data types.
290
+
291
+ Returns
292
+ -------
293
+ keys : dict
294
+ Dict of {key: (types,)} pairs.
295
+ """
296
+ global _allowed_config_keys
297
+ return _allowed_config_keys.copy()
298
+
299
+
300
+ def _get_config_fname():
301
+ """Helper for the vispy config file"""
302
+ directory = _get_vispy_app_dir()
303
+ if directory is None:
304
+ return None
305
+ fname = op.join(directory, 'vispy.json')
306
+ if os.environ.get('_VISPY_CONFIG_TESTING', None) is not None:
307
+ fname = op.join(_TempDir(), 'vispy.json')
308
+ return fname
309
+
310
+
311
+ def _load_config():
312
+ """Helper to load prefs from ~/.vispy/vispy.json"""
313
+ fname = _get_config_fname()
314
+ if fname is None or not op.isfile(fname):
315
+ return dict()
316
+ with open(fname, 'r') as fid:
317
+ config = json.load(fid)
318
+ return config
319
+
320
+
321
+ def save_config(**kwargs):
322
+ """Save configuration keys to vispy config file
323
+
324
+ Parameters
325
+ ----------
326
+ **kwargs : keyword arguments
327
+ Key/value pairs to save to the config file.
328
+ """
329
+ if kwargs == {}:
330
+ kwargs = config._config
331
+ current_config = _load_config()
332
+ current_config.update(**kwargs)
333
+ # write to disk
334
+ fname = _get_config_fname()
335
+ if fname is None:
336
+ raise RuntimeError('config filename could not be determined')
337
+ if not op.isdir(op.dirname(fname)):
338
+ os.mkdir(op.dirname(fname))
339
+ with open(fname, 'w') as fid:
340
+ json.dump(current_config, fid, sort_keys=True, indent=0)
341
+
342
+
343
+ def set_data_dir(directory=None, create=False, save=False):
344
+ """Set vispy data download directory
345
+
346
+ Parameters
347
+ ----------
348
+ directory : str | None
349
+ The directory to use.
350
+ create : bool
351
+ If True, create directory if it doesn't exist.
352
+ save : bool
353
+ If True, save the configuration to the vispy config.
354
+ """
355
+ if directory is None:
356
+ directory = _data_path
357
+ if _data_path is None:
358
+ raise IOError('default path cannot be determined, please '
359
+ 'set it manually (directory != None)')
360
+ if not op.isdir(directory):
361
+ if not create:
362
+ raise IOError('directory "%s" does not exist, perhaps try '
363
+ 'create=True to create it?' % directory)
364
+ os.mkdir(directory)
365
+ config.update(data_path=directory)
366
+ if save:
367
+ save_config(data_path=directory)
368
+
369
+
370
+ def _enable_profiling():
371
+ """Start profiling and register callback to print stats when the program
372
+ exits.
373
+ """
374
+ import cProfile
375
+ import atexit
376
+ global _profiler
377
+ _profiler = cProfile.Profile()
378
+ _profiler.enable()
379
+ atexit.register(_profile_atexit)
380
+
381
+
382
+ _profiler = None
383
+
384
+
385
+ def _profile_atexit():
386
+ global _profiler
387
+ _profiler.print_stats(sort='cumulative')
388
+
389
+
390
+ def sys_info(fname=None, overwrite=False):
391
+ """Get relevant system and debugging information
392
+
393
+ Parameters
394
+ ----------
395
+ fname : str | None
396
+ Filename to dump info to. Use None to simply print.
397
+ overwrite : bool
398
+ If True, overwrite file (if it exists).
399
+
400
+ Returns
401
+ -------
402
+ out : str
403
+ The system information as a string.
404
+ """
405
+ if fname is not None and op.isfile(fname) and not overwrite:
406
+ raise IOError('file exists, use overwrite=True to overwrite')
407
+
408
+ out = 'Platform: %s\n' % platform.platform()
409
+ out += 'Python: %s\n' % str(sys.version).replace('\n', ' ')
410
+ out += 'NumPy: %s\n' % (np.__version__,)
411
+ try:
412
+ # Nest all imports here to avoid any circular imports
413
+ from ..app import use_app, Canvas
414
+ from ..app.backends import BACKEND_NAMES
415
+ from ..gloo import gl
416
+ from .check_environment import has_backend
417
+ # get default app
418
+ with use_log_level('warning'):
419
+ app = use_app(call_reuse=False) # suppress messages
420
+ out += 'Backend: %s\n' % app.backend_name
421
+ for backend in BACKEND_NAMES:
422
+ if backend.startswith('ipynb_'):
423
+ continue
424
+ with use_log_level('warning', print_msg=False):
425
+ which = has_backend(backend, out=['which'])[1]
426
+ out += '{0:<9} {1}\n'.format(backend + ':', which)
427
+ out += '\n'
428
+ # We need an OpenGL context to get GL info
429
+ canvas = Canvas('Test', (10, 10), show=False, app=app)
430
+ canvas._backend._vispy_set_current()
431
+ out += 'GL version: %r\n' % (gl.glGetParameter(gl.GL_VERSION),)
432
+ x_ = gl.GL_MAX_TEXTURE_SIZE
433
+ out += 'MAX_TEXTURE_SIZE: %r\n' % (gl.glGetParameter(x_),)
434
+ out += 'Extensions: %r\n' % (gl.glGetParameter(gl.GL_EXTENSIONS),)
435
+ canvas.close()
436
+ except Exception: # don't stop printing info
437
+ out += 'App info-gathering error:\n%s' % traceback.format_exc()
438
+ pass
439
+ if fname is not None:
440
+ with open(fname, 'w') as fid:
441
+ fid.write(out)
442
+ return out
443
+
444
+
445
+ class _TempDir(str):
446
+ """Class for creating and auto-destroying temp dir
447
+
448
+ This is designed to be used with testing modules.
449
+
450
+ We cannot simply use __del__() method for cleanup here because the rmtree
451
+ function may be cleaned up before this object, so we use the atexit module
452
+ instead.
453
+ """
454
+
455
+ def __new__(self):
456
+ new = str.__new__(self, tempfile.mkdtemp())
457
+ return new
458
+
459
+ def __init__(self):
460
+ self._path = self.__str__()
461
+ atexit.register(self.cleanup)
462
+
463
+ def cleanup(self):
464
+ rmtree(self._path, ignore_errors=True)
465
+
466
+
467
+ # initialize config options
468
+ _init()
469
+
470
+
471
+ if hasattr(inspect, 'signature'): # py35
472
+ def _get_args(function, varargs=False):
473
+ params = inspect.signature(function).parameters
474
+ args = [key for key, param in params.items()
475
+ if param.kind not in (param.VAR_POSITIONAL, param.VAR_KEYWORD)]
476
+ if varargs:
477
+ varargs = [param.name for param in params.values()
478
+ if param.kind == param.VAR_POSITIONAL]
479
+ if len(varargs) == 0:
480
+ varargs = None
481
+ return args, varargs
482
+ else:
483
+ return args
484
+ else:
485
+ def _get_args(function, varargs=False):
486
+ out = inspect.getargspec(function) # args, varargs, keywords, defaults
487
+ if varargs:
488
+ return out[:2]
489
+ else:
490
+ return out[0]
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+ """The dpi module enables querying the OS for the screen DPI."""
7
+
8
+ import sys
9
+
10
+ __all__ = ['get_dpi']
11
+
12
+ if sys.platform.startswith('linux'):
13
+ from ._linux import get_dpi
14
+ elif sys.platform == 'darwin':
15
+ from ._quartz import get_dpi
16
+ elif sys.platform.startswith('win'):
17
+ from ._win32 import get_dpi # noqa, analysis:ignore
18
+ else:
19
+ raise NotImplementedError('unknown system %s' % sys.platform)
@@ -0,0 +1,69 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ import os
8
+ import re
9
+ from subprocess import CalledProcessError
10
+
11
+ from ..logs import logger
12
+ from ..wrappers import run_subprocess
13
+
14
+
15
+ def _get_dpi_from(cmd, pattern, func):
16
+ """Match pattern against the output of func, passing the results as
17
+ floats to func. If anything fails, return None.
18
+ """
19
+ try:
20
+ out, _ = run_subprocess([cmd])
21
+ except (OSError, CalledProcessError):
22
+ pass
23
+ else:
24
+ match = re.search(pattern, out)
25
+ if match:
26
+ return func(*map(float, match.groups()))
27
+
28
+
29
+ def _xrandr_calc(x_px, y_px, x_mm, y_mm):
30
+ if x_mm == 0 or y_mm == 0:
31
+ logger.warning("'xrandr' output has screen dimension of 0mm, " +
32
+ "can't compute proper DPI")
33
+ return 96.
34
+ return 25.4 * (x_px / x_mm + y_px / y_mm) / 2
35
+
36
+
37
+ def get_dpi(raise_error=True):
38
+ """Get screen DPI from the OS
39
+
40
+ Parameters
41
+ ----------
42
+ raise_error : bool
43
+ If True, raise an error if DPI could not be determined.
44
+
45
+ Returns
46
+ -------
47
+ dpi : float
48
+ Dots per inch of the primary screen.
49
+ """
50
+ # If we are running without an X server (e.g. OSMesa), use a fixed DPI
51
+ if 'DISPLAY' not in os.environ:
52
+ return 96.
53
+
54
+ from_xdpyinfo = _get_dpi_from(
55
+ 'xdpyinfo', r'(\d+)x(\d+) dots per inch',
56
+ lambda x_dpi, y_dpi: (x_dpi + y_dpi) / 2)
57
+ if from_xdpyinfo is not None:
58
+ return from_xdpyinfo
59
+
60
+ from_xrandr = _get_dpi_from(
61
+ 'xrandr', r'(\d+)x(\d+).*?(\d+)mm x (\d+)mm',
62
+ _xrandr_calc)
63
+ if from_xrandr is not None:
64
+ return from_xrandr
65
+ if raise_error:
66
+ raise RuntimeError('could not determine DPI')
67
+ else:
68
+ logger.warning('could not determine DPI')
69
+ return 96
@@ -0,0 +1,26 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ from ...ext.cocoapy import quartz
8
+
9
+
10
+ def get_dpi(raise_error=True):
11
+ """Get screen DPI from the OS
12
+
13
+ Parameters
14
+ ----------
15
+ raise_error : bool
16
+ If True, raise an error if DPI could not be determined.
17
+
18
+ Returns
19
+ -------
20
+ dpi : float
21
+ Dots per inch of the primary screen.
22
+ """
23
+ display = quartz.CGMainDisplayID()
24
+ mm = quartz.CGDisplayScreenSize(display)
25
+ px = quartz.CGDisplayBounds(display).size
26
+ return (px.width/mm.width + px.height/mm.height) * 0.5 * 25.4
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ from ...ext.gdi32plus import (gdi32, user32, HORZSIZE, VERTSIZE,
8
+ HORZRES, VERTRES)
9
+
10
+
11
+ def get_dpi(raise_error=True):
12
+ """Get screen DPI from the OS
13
+
14
+ Parameters
15
+ ----------
16
+ raise_error : bool
17
+ If True, raise an error if DPI could not be determined.
18
+
19
+ Returns
20
+ -------
21
+ dpi : float
22
+ Dots per inch of the primary screen.
23
+ """
24
+ try:
25
+ user32.SetProcessDPIAware()
26
+ except AttributeError:
27
+ pass # not present on XP
28
+ dc = user32.GetDC(0)
29
+ h_size = gdi32.GetDeviceCaps(dc, HORZSIZE)
30
+ v_size = gdi32.GetDeviceCaps(dc, VERTSIZE)
31
+ h_res = gdi32.GetDeviceCaps(dc, HORZRES)
32
+ v_res = gdi32.GetDeviceCaps(dc, VERTRES)
33
+ user32.ReleaseDC(None, dc)
34
+ return (h_res/float(h_size) + v_res/float(v_size)) * 0.5 * 25.4
File without changes