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,164 @@
1
+ """Tests to quickly see if the backends look good.
2
+ This tests only to see if all the necessary methods are implemented,
3
+ whether all the right events are mentioned, and whether the keymap
4
+ contains all keys that should be supported.
5
+
6
+ This test basically checks whether nothing was forgotten, not that the
7
+ implementation is corect.
8
+
9
+ """
10
+
11
+ import vispy
12
+ from vispy import keys
13
+ from vispy.testing import (requires_application, assert_in, run_tests_if_main,
14
+ assert_raises)
15
+ from vispy.app import use_app, Application
16
+ from vispy.app.backends import _template
17
+ from vispy.util import _get_args
18
+
19
+
20
+ class DummyApplication(Application):
21
+ def _use(self, backend_namd):
22
+ pass
23
+
24
+
25
+ def _test_module_properties(_module=None):
26
+ """Test application module"""
27
+ if _module is None:
28
+ app = use_app()
29
+ _module = app.backend_module
30
+
31
+ # Test that the keymap contains all keys supported by vispy.
32
+ module_fname = _module.__name__.split('.')[-1]
33
+ if module_fname not in ('_egl', '_osmesa'): # skip keys for EGL, osmesa
34
+ keymap = _module.KEYMAP
35
+ vispy_keys = keymap.values()
36
+ for keyname in dir(keys):
37
+ if keyname.upper() != keyname:
38
+ continue
39
+ key = getattr(keys, keyname)
40
+ assert_in(key, vispy_keys)
41
+
42
+ # For Qt backend, we have a common implementation
43
+ alt_modname = ''
44
+ if module_fname in ('_pyside', '_pyqt4', '_pyqt5', '_pyqt6', '_pyside2', '_pyside6'):
45
+ alt_modname = _module.__name__.rsplit('.', 1)[0] + '._qt'
46
+
47
+ # Test that all _vispy_x methods are there.
48
+ exceptions = (
49
+ '_vispy_get_native_canvas',
50
+ '_vispy_get_native_timer',
51
+ '_vispy_get_native_app',
52
+ '_vispy_reuse',
53
+ '_vispy_mouse_move',
54
+ '_vispy_mouse_press',
55
+ '_vispy_mouse_release',
56
+ '_vispy_mouse_double_click',
57
+ '_vispy_detect_double_click',
58
+ '_vispy_get_fb_bind_location',
59
+ '_vispy_get_geometry',
60
+ '_vispy_get_physical_size',
61
+ '_vispy_sleep',
62
+ '_process_backend_kwargs') # defined in base class
63
+
64
+ class KlassRef(vispy.app.base.BaseCanvasBackend):
65
+ def __init__(self, *args, **kwargs):
66
+ pass # Do not call the base class, since it will check for Canvas
67
+ Klass = _module.CanvasBackend
68
+ base = KlassRef()
69
+ for key in dir(KlassRef):
70
+ if not key.startswith('__'):
71
+ method = getattr(Klass, key)
72
+ if key not in exceptions:
73
+ print(key)
74
+ args = [None] * (len(_get_args(method)) - 1)
75
+ assert_raises(NotImplementedError, getattr(base, key), *args)
76
+ if hasattr(method, '__module__'):
77
+ mod_str = method.__module__ # Py3k
78
+ else:
79
+ mod_str = method.im_func.__module__
80
+ assert_in(mod_str, (_module.__name__, alt_modname),
81
+ "Method %s.%s not defined in %s"
82
+ % (Klass, key, _module.__name__))
83
+
84
+ Klass = _module.TimerBackend
85
+ KlassRef = vispy.app.timer.TimerBackend
86
+ for key in dir(KlassRef):
87
+ if not key.startswith('__'):
88
+ method = getattr(Klass, key)
89
+ if key not in exceptions:
90
+ if hasattr(method, '__module__'):
91
+ # Py3k
92
+ assert_in(method.__module__,
93
+ (_module.__name__, alt_modname))
94
+ else:
95
+ t = method.im_func.__module__ == _module.__name__
96
+ assert t
97
+
98
+ Klass = _module.ApplicationBackend
99
+ KlassRef = vispy.app.application.ApplicationBackend
100
+ for key in dir(KlassRef):
101
+ if not key.startswith('__'):
102
+ method = getattr(Klass, key)
103
+ if key not in exceptions:
104
+ if hasattr(method, '__module__'):
105
+ # Py3k
106
+ assert_in(method.__module__,
107
+ (_module.__name__, alt_modname))
108
+ else:
109
+ t = method.im_func.__module__ == _module.__name__
110
+ assert t
111
+
112
+ # Test that all events seem to be emitted.
113
+ # Get text
114
+ fname = _module.__file__.rstrip('c') # "strip" will break windows!
115
+ with open(fname, 'rb') as fid:
116
+ text = fid.read().decode('utf-8')
117
+
118
+ canvas = vispy.app.Canvas(create_native=False, app=DummyApplication())
119
+ # Stylus and touch are ignored because they are not yet implemented.
120
+ # Mouse events are emitted from the CanvasBackend base class.
121
+ ignore = set(['stylus', 'touch', 'mouse_press', 'paint',
122
+ 'mouse_move', 'mouse_release', 'mouse_double_click',
123
+ 'detect_double_click', 'close'])
124
+ if module_fname in ('_egl', '_osmesa'):
125
+ ignore = ignore.union(['mouse_wheel', 'key_release', 'key_press'])
126
+ eventNames = set(canvas.events._emitters.keys()) - ignore
127
+
128
+ if not alt_modname: # Only check for non-proxy modules
129
+ for name in eventNames:
130
+ assert_in('events.%s' % name, text,
131
+ 'events.%s does not appear in %s' % (name, fname))
132
+
133
+
134
+ def test_template():
135
+ """Test application module template"""
136
+ _test_module_properties(_template)
137
+ assert_raises(NotImplementedError, _template._set_config, dict())
138
+ a = _template.ApplicationBackend()
139
+ print(a._vispy_get_backend_name())
140
+ for method in (a._vispy_process_events, a._vispy_run, a._vispy_quit,
141
+ a._vispy_get_native_app):
142
+ assert_raises(NotImplementedError, method)
143
+
144
+ class TemplateCanvasBackend(_template.CanvasBackend):
145
+ def __init__(self, *args, **kwargs):
146
+ pass # Do not call the base class, since it will check for Canvas
147
+ c = TemplateCanvasBackend() # _template.CanvasBackend(None)
148
+ print(c._vispy_get_native_canvas())
149
+ for method in (c._vispy_set_current, c._vispy_swap_buffers, c._vispy_close,
150
+ c._vispy_update, c._vispy_get_size, c._vispy_get_position):
151
+ assert_raises(NotImplementedError, method)
152
+ for method in (c._vispy_set_title, c._vispy_set_visible):
153
+ assert_raises(NotImplementedError, method, 0)
154
+ for method in (c._vispy_set_size, c._vispy_set_position):
155
+ assert_raises(NotImplementedError, method, 0, 0)
156
+
157
+
158
+ @requires_application()
159
+ def test_actual():
160
+ """Test actual application module"""
161
+ _test_module_properties(None)
162
+
163
+
164
+ run_tests_if_main()
@@ -0,0 +1,122 @@
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
+ from vispy.app import Canvas, MouseEvent
6
+ from vispy.visuals import ImageVisual
7
+ from vispy.testing import requires_application
8
+ from vispy.visuals.transforms import STTransform
9
+ from vispy import gloo
10
+
11
+ import numpy as np
12
+ import pytest
13
+
14
+
15
+ @requires_application()
16
+ @pytest.mark.parametrize(
17
+ 'blend_func',
18
+ [
19
+ ('src_alpha', 'one_minus_src_alpha', 'one', 'one_minus_src_alpha'),
20
+ ('src_alpha', 'one_minus_src_alpha'),
21
+ None,
22
+ ])
23
+ def test_canvas_render(blend_func):
24
+ """Test rendering a canvas to an array.
25
+
26
+ Different blending functions are used to test what various Visuals may
27
+ produce without actually using different types of Visuals.
28
+
29
+ """
30
+ with Canvas(size=(125, 125), show=True, title='run') as c:
31
+ im1 = np.zeros((100, 100, 4)).astype(np.float32)
32
+ im1[:, :, 0] = 1
33
+ im1[:, :, 3] = 1
34
+
35
+ im2 = np.zeros((50, 50, 4)).astype(np.float32)
36
+ im2[:, :, 1] = 1
37
+ im2[:, :, 3] = 0.4
38
+
39
+ # Create the image
40
+ image1 = ImageVisual(im1)
41
+ image1.transform = STTransform(translate=(20, 20, 0))
42
+ image1.transforms.configure(canvas=c, viewport=(0, 0, 125, 125))
43
+ image2 = ImageVisual(im2)
44
+ image2.transform = STTransform(translate=(0, 0, -1))
45
+ image2.transforms.configure(canvas=c, viewport=(0, 0, 125, 125))
46
+ if blend_func:
47
+ image1.set_gl_state(preset='translucent', blend_func=blend_func)
48
+ image2.set_gl_state(preset='translucent', blend_func=blend_func)
49
+
50
+ @c.events.draw.connect
51
+ def on_draw(ev):
52
+ gloo.clear('black')
53
+ gloo.set_viewport(0, 0, *c.physical_size)
54
+ image1.draw()
55
+ image2.draw()
56
+
57
+ rgba_result = c.render()
58
+ rgb_result = c.render(alpha=False)
59
+
60
+ # the results should be the same except for alpha
61
+ np.testing.assert_allclose(rgba_result[..., :3], rgb_result)
62
+ # the image should have something drawn in it
63
+ assert not np.allclose(rgba_result[..., :3], 0)
64
+ # the alpha should not be completely transparent
65
+ assert not np.allclose(rgba_result[..., 3], 0)
66
+ if blend_func is None or 'one' in blend_func:
67
+ # no transparency
68
+ np.testing.assert_allclose(rgba_result[..., 3], 255)
69
+ else:
70
+ # the alpha should have some transparency
71
+ # this part of this test fails on macOS 12 at the moment
72
+ # see https://github.com/vispy/vispy/pull/2324#issuecomment-1163350672
73
+ assert (rgba_result[..., 3] != 255).any()
74
+
75
+
76
+ @requires_application()
77
+ @pytest.mark.parametrize(
78
+ 'preset',
79
+ [
80
+ 'opaque', 'additive', 'translucent',
81
+ ])
82
+ def test_blend_presets(preset):
83
+ """Test blending presets a canvas to an array.
84
+
85
+ Different blending presets are used to test that they properly set
86
+ blend equations.
87
+
88
+ """
89
+ with Canvas(size=(125, 125), show=True, title='run') as c:
90
+ im1 = np.zeros((100, 100, 4)).astype(np.float32)
91
+ im1[:, :, 1] = 1
92
+ im1[:, :, 3] = .4
93
+ # Create the image
94
+ image1 = ImageVisual(im1)
95
+ image1.transform = STTransform(translate=(20, 20, -1))
96
+ image1.transforms.configure(canvas=c, viewport=(0, 0, 125, 125))
97
+
98
+ gloo.set_state(blend_equation='min')
99
+ image1.set_gl_state(preset)
100
+
101
+ @c.events.draw.connect
102
+ def on_draw(ev):
103
+ gloo.clear('black')
104
+ gloo.set_viewport(0, 0, *c.physical_size)
105
+ image1.draw()
106
+
107
+ rgba_result = c.render()
108
+ assert not np.allclose(rgba_result[..., :3], 0)
109
+
110
+
111
+ @requires_application()
112
+ @pytest.mark.parametrize("mouse_event_type, button, buttons, expected_button, expected_buttons", [
113
+ ('mouse_press', 1, [], 1, [1]),
114
+ ('mouse_release', 1, [1], 1, [1]),
115
+ # left click pressed and held, followed by a right click
116
+ ('mouse_press', 2, [1], 2, [1, 2]),
117
+ ('mouse_release', 2, [1, 2], 2, [1, 2]),
118
+ ])
119
+ def test_mouse_event(mouse_event_type, button, buttons, expected_button, expected_buttons):
120
+ mev = MouseEvent(type=mouse_event_type, button=button, buttons=buttons)
121
+ assert mev.buttons == expected_buttons
122
+ assert mev.button == expected_button
@@ -0,0 +1,92 @@
1
+ import sys
2
+
3
+ import pytest
4
+
5
+ from vispy.testing import (requires_application, SkipTest, run_tests_if_main,
6
+ assert_raises, IS_CI)
7
+ from vispy.app import Canvas, use_app
8
+ from vispy.gloo import get_gl_configuration, Program
9
+ from vispy.gloo.gl import check_error
10
+
11
+
12
+ @requires_application()
13
+ def test_context_properties():
14
+ """Test setting context properties"""
15
+ a = use_app()
16
+ if a.backend_name.lower() == 'pyglet':
17
+ return # cannot set more than once on Pyglet
18
+ if a.backend_name.lower() == 'osmesa':
19
+ return # cannot set config on OSMesa
20
+ if 'pyqt5' in a.backend_name.lower() or 'pyqt6' in a.backend_name.lower() or 'pyside2' in a.backend_name.lower() or 'pyside6' in a.backend_name.lower():
21
+ pytest.xfail("Context sharing is not supported in PyQt5, PyQt6, PySide2, or PySide6 at this time.")
22
+
23
+ # stereo, double buffer won't work on every sys
24
+ configs = [dict(samples=4), dict(stencil_size=8),
25
+ dict(samples=4, stencil_size=8)]
26
+ if a.backend_name.lower() != 'glfw': # glfw *always* double-buffers
27
+ configs.append(dict(double_buffer=False, samples=4))
28
+ configs.append(dict(double_buffer=False))
29
+ else:
30
+ assert_raises(RuntimeError, Canvas, app=a,
31
+ config=dict(double_buffer=False))
32
+ if a.backend_name.lower() == 'sdl2' and IS_CI:
33
+ raise SkipTest('Travis SDL cannot set context')
34
+ for config in configs:
35
+ n_items = len(config)
36
+ with Canvas(config=config):
37
+ if IS_CI:
38
+ # Travis and Appveyor cannot handle obtaining these values
39
+ props = config
40
+ else:
41
+ props = get_gl_configuration()
42
+ assert len(config) == n_items
43
+ for key, val in config.items():
44
+ # XXX knownfail for windows samples, and wx/tkinter (all platforms)
45
+ if key == 'samples':
46
+ will_fail_backend = a.backend_name.lower() in ('wx', 'tkinter')
47
+ if not (sys.platform.startswith('win') or will_fail_backend):
48
+ assert val == props[key], key
49
+ assert_raises(TypeError, Canvas, config='foo')
50
+ assert_raises(KeyError, Canvas, config=dict(foo=True))
51
+ assert_raises(TypeError, Canvas, config=dict(double_buffer='foo'))
52
+
53
+
54
+ @requires_application()
55
+ def test_context_sharing():
56
+ """Test context sharing"""
57
+ with Canvas() as c1:
58
+ vert = "attribute vec4 pos;\nvoid main (void) {gl_Position = pos;}"
59
+ frag = "void main (void) {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}"
60
+ program = Program(vert, frag)
61
+ program['pos'] = [(1, 2, 3, 1), (4, 5, 6, 1)]
62
+ program.draw('points')
63
+
64
+ def check():
65
+ # Do something to program and see if it worked
66
+ program['pos'] = [(1, 2, 3, 1), (4, 5, 6, 1)] # Do command
67
+ program.draw('points')
68
+ check_error()
69
+
70
+ # Check while c1 is active
71
+ check()
72
+
73
+ # pyqt5 does not currently support context sharing, pyside6 seg faults on app tests
74
+ if 'pyqt5' in c1.app.backend_name.lower() or 'pyqt6' in c1.app.backend_name.lower() or 'pyside2' in c1.app.backend_name.lower() or 'pyside6' in c1.app.backend_name.lower():
75
+ pytest.xfail("Context sharing is not supported in PyQt5, PyQt6, PySide2, or PySide6 at this time.")
76
+
77
+ # Tkinter does not currently support context sharing
78
+ if 'tk' in c1.app.backend_name.lower():
79
+ pytest.xfail("Context sharing is not supported in Tkinter at this time.")
80
+
81
+ # Check while c2 is active (with different context)
82
+ with Canvas() as c2:
83
+ # pyglet always shares
84
+ if 'pyglet' not in c2.app.backend_name.lower():
85
+ assert_raises(Exception, check)
86
+
87
+ # Check while c2 is active (with *same* context)
88
+ with Canvas(shared=c1.context) as c2:
89
+ assert c1.context.shared is c2.context.shared # same object
90
+ check()
91
+
92
+ run_tests_if_main()
@@ -0,0 +1,47 @@
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
+ from os import path as op
6
+ import warnings
7
+
8
+ from vispy.testing import requires_application
9
+
10
+
11
+ @requires_application('pyqt4', has=['uic'])
12
+ def test_qt_designer():
13
+ """Embed Canvas via Qt Designer"""
14
+ from PyQt4 import QtGui, uic
15
+ app = QtGui.QApplication.instance()
16
+ if app is None:
17
+ app = QtGui.QApplication([])
18
+
19
+ fname = op.join(op.dirname(__file__), 'qt-designer.ui')
20
+ with warnings.catch_warnings(record=True): # pyqt4 deprecation warning
21
+ WindowTemplate, TemplateBaseClass = uic.loadUiType(fname)
22
+
23
+ class MainWindow(TemplateBaseClass):
24
+ def __init__(self):
25
+ TemplateBaseClass.__init__(self)
26
+
27
+ self.ui = WindowTemplate()
28
+ self.ui.setupUi(self)
29
+
30
+ win = MainWindow()
31
+
32
+ try:
33
+ canvas = win.ui.canvas
34
+ # test we can access properties of the internal canvas:
35
+ canvas.central_widget.add_view()
36
+ win.show()
37
+ app.processEvents()
38
+ finally:
39
+ win.close()
40
+
41
+ return win
42
+
43
+
44
+ # Don't use run_tests_if_main(), because we want to show the win
45
+ if __name__ == '__main__':
46
+ win = test_qt_designer()
47
+ win.show()
@@ -0,0 +1,134 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ import sys
4
+ from time import sleep
5
+
6
+ import pytest
7
+ import numpy as np
8
+ from numpy.testing import assert_allclose
9
+
10
+ from vispy.app import use_app, Canvas, Timer
11
+ from vispy.testing import requires_application, SkipTest, run_tests_if_main, IS_TRAVIS_CI
12
+ from vispy.util.ptime import time
13
+ from vispy.gloo import gl
14
+ from vispy.gloo.util import _screenshot
15
+
16
+ _win_size = (200, 50)
17
+
18
+
19
+ def _update_process_check(canvas, val, draw=True):
20
+ """Update, process, and check result"""
21
+ if draw:
22
+ canvas.update()
23
+ canvas.app.process_events()
24
+ canvas.app.process_events()
25
+ sleep(0.03) # give it time to swap (Qt?)
26
+ canvas._backend._vispy_set_current()
27
+ print(' check %s' % val)
28
+ # check screenshot to see if it's all one color
29
+ ss = _screenshot()
30
+ try:
31
+ assert_allclose(ss.shape[:2], _win_size[::-1])
32
+ except Exception:
33
+ print('!!!!!!!!!! FAIL bad size %s' % list(ss.shape[:2]))
34
+ raise
35
+ goal = val * np.ones(ss.shape)
36
+ try:
37
+ # Get rid of the alpha value before testing
38
+ # It can be off by 1 due to rounding
39
+ assert_allclose(ss[:, :, :3], goal[:, :, :3], atol=1)
40
+ except Exception:
41
+ print('!!!!!!!!!! FAIL %s' % np.unique(ss))
42
+ raise
43
+
44
+
45
+ @pytest.mark.xfail(IS_TRAVIS_CI and 'darwin' in sys.platform,
46
+ reason='Travis OSX causes segmentation fault on this test for an unknown reason.')
47
+ @requires_application()
48
+ def test_multiple_canvases():
49
+ """Testing multiple canvases"""
50
+ n_check = 3
51
+ app = use_app()
52
+ with Canvas(app=app, size=_win_size, title='same_0') as c0:
53
+ with Canvas(app=app, size=_win_size, title='same_1') as c1:
54
+ ct = [0, 0]
55
+
56
+ @c0.events.draw.connect
57
+ def draw0(event):
58
+ ct[0] += 1
59
+ c0.update()
60
+
61
+ @c1.events.draw.connect # noqa, analysis:ignore
62
+ def draw1(event):
63
+ ct[1] += 1
64
+ c1.update()
65
+
66
+ c0.show() # ensure visible
67
+ c1.show()
68
+ c0.update() # force first draw
69
+ c1.update()
70
+
71
+ timeout = time() + 2.0
72
+ while (ct[0] < n_check or ct[1] < n_check) and time() < timeout:
73
+ app.process_events()
74
+ print((ct, n_check))
75
+ assert n_check <= ct[0] <= n_check + 20 # be quite lenient
76
+ assert n_check <= ct[1] <= n_check + 20
77
+
78
+ # check timer
79
+ global timer_ran
80
+ timer_ran = False
81
+
82
+ def on_timer(_):
83
+ global timer_ran
84
+ timer_ran = True
85
+ t = Timer(0.1, app=app, connect=on_timer, iterations=1, # noqa
86
+ start=True)
87
+ app.process_events()
88
+ sleep(0.5) # long for slow systems
89
+ app.process_events()
90
+ app.process_events()
91
+ assert timer_ran
92
+
93
+ if app.backend_name.lower() == 'wx':
94
+ raise SkipTest('wx fails test #2') # XXX TODO Fix this
95
+
96
+ kwargs = dict(app=app, autoswap=False, size=_win_size,
97
+ show=True)
98
+ with Canvas(title='0', **kwargs) as c0:
99
+ with Canvas(title='1', **kwargs) as c1:
100
+ bgcolors = [None] * 2
101
+
102
+ @c0.events.draw.connect
103
+ def draw00(event):
104
+ print(' {0:7}: {1}'.format('0', bgcolors[0]))
105
+ if bgcolors[0] is not None:
106
+ gl.glViewport(0, 0, *list(_win_size))
107
+ gl.glClearColor(*bgcolors[0])
108
+ gl.glClear(gl.GL_COLOR_BUFFER_BIT)
109
+ gl.glFinish()
110
+
111
+ @c1.events.draw.connect
112
+ def draw11(event):
113
+ print(' {0:7}: {1}'.format('1', bgcolors[1]))
114
+ if bgcolors[1] is not None:
115
+ gl.glViewport(0, 0, *list(_win_size))
116
+ gl.glClearColor(*bgcolors[1])
117
+ gl.glClear(gl.GL_COLOR_BUFFER_BIT)
118
+ gl.glFinish()
119
+
120
+ for ci, canvas in enumerate((c0, c1)):
121
+ print('draw %s' % canvas.title)
122
+ bgcolors[ci] = [0.5, 0.5, 0.5, 1.0]
123
+ _update_process_check(canvas, 127)
124
+
125
+ for ci, canvas in enumerate((c0, c1)):
126
+ print('test')
127
+ _update_process_check(canvas, 127, draw=False)
128
+ bgcolors[ci] = [1., 1., 1., 1.]
129
+ _update_process_check(canvas, 255)
130
+ bgcolors[ci] = [0.25, 0.25, 0.25, 0.25]
131
+ _update_process_check(canvas, 64)
132
+
133
+
134
+ run_tests_if_main()