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,558 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) 2014, Nicolas P. Rougier. All rights reserved.
4
+ # Distributed under the terms of the new BSD License.
5
+ # -----------------------------------------------------------------------------
6
+ import unittest
7
+ import numpy as np
8
+
9
+ from vispy.testing import run_tests_if_main
10
+ from vispy.gloo.buffer import (Buffer, DataBuffer, DataBufferView,
11
+ VertexBuffer, IndexBuffer)
12
+
13
+
14
+ # -----------------------------------------------------------------------------
15
+ class BufferTest(unittest.TestCase):
16
+
17
+ # Default init
18
+ # ------------
19
+ def test_init_default(self):
20
+ """Test buffer init"""
21
+ # No data
22
+ B = Buffer()
23
+ assert B.nbytes == 0
24
+ glir_cmd = B._glir.clear()[-1]
25
+ assert glir_cmd[0] == 'CREATE'
26
+
27
+ # With data
28
+ data = np.zeros(100)
29
+ B = Buffer(data=data)
30
+ assert B.nbytes == data.nbytes
31
+ glir_cmd = B._glir.clear()[-1]
32
+ assert glir_cmd[0] == 'DATA'
33
+
34
+ # With nbytes
35
+ B = Buffer(nbytes=100)
36
+ assert B.nbytes == 100
37
+ glir_cmd = B._glir.clear()[-1]
38
+ assert glir_cmd[0] == 'SIZE'
39
+
40
+ # Wrong data
41
+ self.assertRaises(ValueError, Buffer, data, 4)
42
+ self.assertRaises(ValueError, Buffer, data, data.nbytes)
43
+
44
+ # Check setting the whole buffer clear pending operations
45
+ # -------------------------------------------------------
46
+ def test_set_whole_data(self):
47
+ data = np.zeros(100)
48
+ B = Buffer(data=data)
49
+ B._glir.clear()
50
+ B.set_data(data=data)
51
+ glir_cmds = B._glir.clear()
52
+ assert len(glir_cmds) == 2
53
+ assert glir_cmds[0][0] == 'SIZE'
54
+ assert glir_cmds[1][0] == 'DATA'
55
+
56
+ # And sub data
57
+ B.set_subdata(data[:50], 20)
58
+ glir_cmds = B._glir.clear()
59
+ assert len(glir_cmds) == 1
60
+ assert glir_cmds[0][0] == 'DATA'
61
+ assert glir_cmds[0][2] == 20 # offset
62
+
63
+ # And sub data
64
+ B.set_subdata(data)
65
+ glir_cmds = B._glir.clear()
66
+ assert glir_cmds[-1][0] == 'DATA'
67
+
68
+ # Wrong ways to set subdata
69
+ self.assertRaises(ValueError, B.set_subdata, data[:50], -1) # neg
70
+ self.assertRaises(ValueError, B.set_subdata, data, 10) # no fit
71
+
72
+ # Check stored data is data
73
+ # -------------------------
74
+ def test_data_storage(self):
75
+ data = np.zeros(100)
76
+ B = Buffer(data=data)
77
+ B.set_data(data=data[:50], copy=False)
78
+ glir_cmd = B._glir.clear()[-1]
79
+ assert glir_cmd[-1].base is data
80
+
81
+ # Check setting oversized data
82
+ # ----------------------------
83
+ def test_oversized_data(self):
84
+ data = np.zeros(10)
85
+ B = Buffer(data=data)
86
+ # with self.assertRaises(ValueError):
87
+ # B.set_data(np.ones(20))
88
+ self.assertRaises(ValueError, B.set_subdata, np.ones(20), offset=0)
89
+
90
+ # Check negative offset
91
+ # ---------------------
92
+ def test_negative_offset(self):
93
+ data = np.zeros(10)
94
+ B = Buffer(data=data)
95
+ # with self.assertRaises(ValueError):
96
+ # B.set_data(np.ones(1), offset=-1)
97
+ self.assertRaises(ValueError, B.set_subdata, np.ones(1), offset=-1)
98
+
99
+ # Check offlimit offset
100
+ # ---------------------
101
+ def test_offlimit_offset(self):
102
+ data = np.zeros(10)
103
+ B = Buffer(data=data)
104
+ # with self.assertRaises(ValueError):
105
+ # B.set_data(np.ones(1), offset=10 * data.dtype.itemsize)
106
+ self.assertRaises(ValueError, B.set_subdata,
107
+ np.ones(1), offset=10 * data.dtype.itemsize)
108
+
109
+ # Buffer size
110
+ # -----------
111
+ def test_buffer_size(self):
112
+ data = np.zeros(10)
113
+ B = Buffer(data=data)
114
+ assert B.nbytes == data.nbytes
115
+
116
+ # Resize
117
+ # ------
118
+ def test_buffer_resize(self):
119
+ data = np.zeros(10)
120
+ B = Buffer(data=data)
121
+ data = np.zeros(20)
122
+ B.set_data(data)
123
+ assert B.nbytes == data.nbytes
124
+
125
+
126
+ # -----------------------------------------------------------------------------
127
+ class DataBufferTest(unittest.TestCase):
128
+
129
+ # Default init
130
+ # ------------
131
+ def test_default_init(self):
132
+ # Check default storage and copy flags
133
+ data = np.ones(100)
134
+ B = DataBuffer(data)
135
+ assert B.nbytes == data.nbytes
136
+ assert B.offset == 0
137
+ assert B.size == 100
138
+ assert B.itemsize == data.itemsize
139
+ assert B.stride == data.itemsize
140
+ assert B.dtype == data.dtype
141
+
142
+ # Given data must be actual numeric data
143
+ self.assertRaises(TypeError, DataBuffer, 'this is not nice data')
144
+
145
+ # Default init with structured data
146
+ # ---------------------------------
147
+ def test_structured_init(self):
148
+ # Check structured type
149
+ dtype = np.dtype([('position', np.float32, 3),
150
+ ('texcoord', np.float32, 2),
151
+ ('color', np.float32, 4)])
152
+ data = np.zeros(10, dtype=dtype)
153
+ B = DataBuffer(data)
154
+ assert B.nbytes == data.nbytes
155
+ assert B.offset == 0
156
+ assert B.size == 10
157
+ assert B.itemsize == data.itemsize
158
+ assert B.stride == data.itemsize
159
+ assert B.dtype == data.dtype
160
+
161
+ # No CPU storage
162
+ # --------------
163
+ def test_no_storage_copy(self):
164
+ data = np.ones(100, np.float32)
165
+ B = DataBuffer(data)
166
+ assert B.stride == 4
167
+
168
+ # Wrong storage
169
+ # -------------
170
+ def test_non_contiguous_storage(self):
171
+ # Ask to have CPU storage and to use data as storage
172
+ # Not possible since data[::2] is not contiguous
173
+ data = np.ones(100, np.float32)
174
+ data_given = data[::2]
175
+
176
+ B = DataBuffer(data_given)
177
+ assert B.stride == 4*2
178
+
179
+ # Get buffer field
180
+ # ----------------
181
+ def test_getitem_field(self):
182
+ dtype = np.dtype([('position', np.float32, 3),
183
+ ('texcoord', np.float32, 2),
184
+ ('color', np.float32, 4)])
185
+ data = np.zeros(10, dtype=dtype)
186
+ B = DataBuffer(data)
187
+
188
+ Z = B["position"]
189
+ assert Z.nbytes == 10 * 3 * np.dtype(np.float32).itemsize
190
+ assert Z.offset == 0
191
+ assert Z.size == 10
192
+ assert Z.itemsize == 3 * np.dtype(np.float32).itemsize
193
+ assert Z.stride == (3 + 2 + 4) * np.dtype(np.float32).itemsize
194
+ assert Z.dtype == (np.float32, 3)
195
+
196
+ Z = B["texcoord"]
197
+ assert Z.nbytes == 10 * 2 * np.dtype(np.float32).itemsize
198
+ assert Z.offset == 3 * np.dtype(np.float32).itemsize
199
+ assert Z.size == 10
200
+ assert Z.itemsize == 2 * np.dtype(np.float32).itemsize
201
+ assert Z.stride == (3 + 2 + 4) * np.dtype(np.float32).itemsize
202
+ assert Z.dtype == (np.float32, 2)
203
+
204
+ Z = B["color"]
205
+ assert Z.nbytes == 10 * 4 * np.dtype(np.float32).itemsize
206
+ assert Z.offset == (2 + 3) * np.dtype(np.float32).itemsize
207
+ assert Z.size == 10
208
+ assert Z.itemsize == 4 * np.dtype(np.float32).itemsize
209
+ assert Z.stride == (3 + 2 + 4) * np.dtype(np.float32).itemsize
210
+ assert Z.dtype == (np.float32, 4)
211
+
212
+ # Get view via index
213
+ # ------------------
214
+ def test_getitem_index(self):
215
+ dtype = np.dtype([('position', np.float32, 3),
216
+ ('texcoord', np.float32, 2),
217
+ ('color', np.float32, 4)])
218
+ data = np.zeros(10, dtype=dtype)
219
+ B = DataBuffer(data)
220
+ Z = B[0:1]
221
+ assert Z.base == B
222
+ assert Z.id == B.id
223
+ assert Z.nbytes == 1 * (3 + 2 + 4) * np.dtype(np.float32).itemsize
224
+ assert Z.offset == 0
225
+ assert Z.size == 1
226
+ assert Z.itemsize == (3 + 2 + 4) * np.dtype(np.float32).itemsize
227
+ assert Z.stride == (3 + 2 + 4) * np.dtype(np.float32).itemsize
228
+ assert Z.dtype == B.dtype
229
+ assert 'DataBufferView' in repr(Z)
230
+
231
+ # There's a few things we cannot do with a view
232
+ self.assertRaises(RuntimeError, Z.set_data, data)
233
+ self.assertRaises(RuntimeError, Z.set_subdata, data)
234
+ self.assertRaises(RuntimeError, Z.resize_bytes, 20)
235
+ self.assertRaises(RuntimeError, Z.__getitem__, 3)
236
+ self.assertRaises(RuntimeError, Z.__setitem__, 3, data)
237
+
238
+ # View get invalidated when base is resized
239
+ # -----------------------------------------
240
+ def test_invalid_view_after_resize(self):
241
+ dtype = np.dtype([('position', np.float32, 3),
242
+ ('texcoord', np.float32, 2),
243
+ ('color', np.float32, 4)])
244
+ data = np.zeros(10, dtype=dtype)
245
+ B = DataBuffer(data)
246
+ Y = B['position']
247
+ Z = B[5:]
248
+ B.resize_bytes(5)
249
+ assert Y._valid is False
250
+ assert Z._valid is False
251
+
252
+ # View get invalidated after setting oversized data
253
+ # -------------------------------------------------
254
+ def test_invalid_view_after_set_data(self):
255
+ dtype = np.dtype([('position', np.float32, 3),
256
+ ('texcoord', np.float32, 2),
257
+ ('color', np.float32, 4)])
258
+ data = np.zeros(10, dtype=dtype)
259
+ B = DataBuffer(data)
260
+ Z = B[5:]
261
+ B.set_data(np.zeros(15, dtype=dtype))
262
+ assert Z._valid is False
263
+
264
+ # Set data on base buffer : ok
265
+ # ----------------------------
266
+ def test_set_data_base(self):
267
+ dtype = np.dtype([('position', np.float32, 3),
268
+ ('texcoord', np.float32, 2),
269
+ ('color', np.float32, 4)])
270
+ data = np.zeros(10, dtype=dtype)
271
+ B = DataBuffer(data)
272
+ B.set_data(data)
273
+ last_cmd = B._glir.clear()[-1]
274
+ assert last_cmd[0] == 'DATA'
275
+
276
+ # Extra kwargs are caught
277
+ self.assertRaises(TypeError, B.set_data, data, foo=4)
278
+
279
+ # Check set_data using offset in data buffer
280
+ # ------------------------------------------
281
+ def test_set_data_offset(self):
282
+ data = np.zeros(100, np.float32)
283
+ subdata = data[:10]
284
+
285
+ B = DataBuffer(data)
286
+ B.set_subdata(subdata, offset=10)
287
+ last_cmd = B._glir.clear()[-1]
288
+ offset = last_cmd[2]
289
+ assert offset == 10*4
290
+
291
+ def test_getitem(self):
292
+ dtype = np.dtype([('position', np.float32, 3),
293
+ ('texcoord', np.float32, 2),
294
+ ('color', np.float32, 4)])
295
+ data = np.zeros(10, dtype=dtype)
296
+ B = DataBuffer(data)
297
+ assert B[1].dtype == dtype
298
+ assert B[1].size == 1
299
+ assert B[-1].dtype == dtype
300
+ assert B[-1].size == 1
301
+
302
+ self.assertRaises(IndexError, B.__getitem__, +999)
303
+ self.assertRaises(IndexError, B.__getitem__, -999)
304
+
305
+ def test_setitem(self):
306
+ dtype = np.dtype([('position', np.float32, 3),
307
+ ('texcoord', np.float32, 2),
308
+ ('color', np.float32, 4)])
309
+ data = np.zeros(10, dtype=dtype)
310
+ B = DataBuffer(data)
311
+ B[1] = data[0]
312
+ B[-1] = data[0]
313
+ B[:5] = data[:5]
314
+ B[5:0] = data[:5] # Weird, but we apparently support this
315
+ # the below is no longer supported starting with NumPy 1.14.0
316
+ # this used to be converted to a single element array of the above
317
+ # dtype filled with 0s. This is no longer supported.
318
+ # B[1] = b'' # Gets converted into array of dtype. Lists do not work
319
+ # the below doesn't work on all systems (I guess?)
320
+ # B[1] = 0
321
+ B[1] = ([0, 0, 0], [0, 0], [0, 0, 0, 0],)
322
+
323
+ self.assertRaises(IndexError, B.__setitem__, +999, data[0])
324
+ self.assertRaises(IndexError, B.__setitem__, -999, data[0])
325
+ self.assertRaises(TypeError, B.__setitem__, [], data[0])
326
+
327
+ # Setitem + broadcast
328
+ # ------------------------------------------------------
329
+ def test_setitem_broadcast(self):
330
+ dtype = np.dtype([('position', np.float32, 3),
331
+ ('texcoord', np.float32, 2),
332
+ ('color', np.float32, 4)])
333
+ data = np.zeros(10, dtype=dtype)
334
+ B = DataBuffer(data)
335
+ self.assertRaises(ValueError, B.__setitem__, 'position', (1, 2, 3))
336
+
337
+ # Set every 2 item
338
+ # ------------------------------------------------------
339
+ def test_setitem_strided(self):
340
+ dtype = np.dtype([('position', np.float32, 3),
341
+ ('texcoord', np.float32, 2),
342
+ ('color', np.float32, 4)])
343
+ data1 = np.zeros(10, dtype=dtype)
344
+ data2 = np.ones(10, dtype=dtype)
345
+ B = DataBuffer(data1)
346
+ s = slice(None, None, 2)
347
+ self.assertRaises(ValueError, B.__setitem__, s, data2[::2])
348
+
349
+ # Set half the array
350
+ # ------------------------------------------------------
351
+ def test_setitem_half(self):
352
+ dtype = np.dtype([('position', np.float32, 3),
353
+ ('texcoord', np.float32, 2),
354
+ ('color', np.float32, 4)])
355
+ data1 = np.zeros(10, dtype=dtype)
356
+ data2 = np.ones(10, dtype=dtype)
357
+ B = DataBuffer(data1)
358
+ B._glir.clear()
359
+ B[:5] = data2[:5]
360
+ glir_cmds = B._glir.clear()
361
+ assert len(glir_cmds) == 1
362
+ set_data = glir_cmds[0][-1]
363
+ assert np.allclose(set_data['position'], data2['position'][:5])
364
+ assert np.allclose(set_data['texcoord'][:5], data2['texcoord'][:5])
365
+ assert np.allclose(set_data['color'][:5], data2['color'][:5])
366
+
367
+ # Set field without storage: error
368
+ # --------------------------------
369
+ def test_setitem_field_no_storage(self):
370
+ dtype = np.dtype([('position', np.float32, 3),
371
+ ('texcoord', np.float32, 2),
372
+ ('color', np.float32, 4)])
373
+ data = np.zeros(10, dtype=dtype)
374
+ B = DataBuffer(data)
375
+ self.assertRaises(ValueError, B.__setitem__, 'position', (1, 2, 3))
376
+
377
+ # Set every 2 item without storage: error
378
+ # ----------------------------------------
379
+ def test_every_two_item_no_storage(self):
380
+ dtype = np.dtype([('position', np.float32, 3),
381
+ ('texcoord', np.float32, 2),
382
+ ('color', np.float32, 4)])
383
+ data = np.zeros(10, dtype=dtype)
384
+ B = DataBuffer(data)
385
+ # with self.assertRaises(ValueError):
386
+ # B[::2] = data[::2]
387
+ s = slice(None, None, 2)
388
+ self.assertRaises(ValueError, B.__setitem__, s, data[::2])
389
+
390
+ # Resize
391
+ # ------
392
+ def test_resize(self):
393
+ data = np.zeros(10)
394
+ B = DataBuffer(data=data)
395
+ data = np.zeros(20)
396
+ B.set_data(data)
397
+ assert B.nbytes == data.nbytes
398
+
399
+ # Resize now allowed using ellipsis
400
+ # -----------------------------
401
+ def test_no_resize_ellipsis(self):
402
+ data = np.zeros(10)
403
+ B = DataBuffer(data=data)
404
+ data = np.zeros(30)
405
+ self.assertRaises(ValueError, B.__setitem__, Ellipsis, data)
406
+
407
+ # Broadcast when using ellipses
408
+ def test_broadcast_ellipsis(self):
409
+ data = np.zeros(10)
410
+ B = DataBuffer(data=data)
411
+ data = np.zeros(5)
412
+ B[Ellipsis] = data
413
+ glir_cmd = B._glir.clear()[-1]
414
+ assert glir_cmd[-1].shape == (10,)
415
+
416
+
417
+ class DataBufferViewTest(unittest.TestCase):
418
+
419
+ def test_init_view(self):
420
+ data = np.zeros(10)
421
+ B = DataBuffer(data=data)
422
+
423
+ V = DataBufferView(B, 1)
424
+ assert V.size == 1
425
+
426
+ V = DataBufferView(B, slice(0, 5))
427
+ assert V.size == 5
428
+
429
+ V = DataBufferView(B, slice(5, 0))
430
+ assert V.size == 5
431
+
432
+ V = DataBufferView(B, Ellipsis)
433
+ assert V.size == 10
434
+
435
+ self.assertRaises(TypeError, DataBufferView, B, [])
436
+ self.assertRaises(ValueError, DataBufferView, B, slice(0, 10, 2))
437
+
438
+
439
+ # -----------------------------------------------------------------------------
440
+ class VertexBufferTest(unittest.TestCase):
441
+
442
+ # VertexBuffer allowed base types
443
+ # -------------------------------
444
+ def test_init_allowed_dtype(self):
445
+ for dtype in (np.uint8, np.int8, np.uint16, np.int16, np.float32):
446
+ V = VertexBuffer(np.zeros((10, 3), dtype=dtype))
447
+ names = V.dtype.names
448
+ assert V.dtype[names[0]].base == dtype
449
+ assert V.dtype[names[0]].shape == (3,)
450
+ for dtype in (np.float64, np.int64):
451
+ self.assertRaises(TypeError, VertexBuffer,
452
+ np.zeros((10, 3), dtype=dtype))
453
+
454
+ # Tuple/list is also allowed
455
+ V = VertexBuffer([1, 2, 3])
456
+ assert V.size == 3
457
+ assert V.itemsize == 4
458
+ #
459
+ V = VertexBuffer([[1, 2], [3, 4], [5, 6]])
460
+ assert V.size == 3
461
+ assert V.itemsize == 2 * 4
462
+
463
+ # Convert
464
+ data = np.zeros((10,), 'uint8')
465
+ B = VertexBuffer(data)
466
+ assert B.dtype[0].base == np.uint8
467
+ assert B.dtype[0].itemsize == 1
468
+ #
469
+ data = np.zeros((10, 2), 'uint8')
470
+ B = VertexBuffer(data)
471
+ assert B.dtype[0].base == np.uint8
472
+ assert B.dtype[0].itemsize == 2
473
+ B.set_data(data, convert=True)
474
+ assert B.dtype[0].base == np.float32
475
+ assert B.dtype[0].itemsize == 8
476
+ B = VertexBuffer(data[::2].copy())
477
+
478
+ # This is converted to 1D
479
+ B = VertexBuffer([[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]])
480
+ assert B.size == 10
481
+
482
+ # Not allowed
483
+ self.assertRaises(TypeError, VertexBuffer, dtype=np.float64)
484
+ # self.assertRaises(TypeError, VertexBuffer, [[1,2,3,4,5],[1,2,3,4,5]])
485
+
486
+ # VertexBuffer not allowed base types
487
+ # -----------------------------------
488
+ def test_init_not_allowed_dtype(self):
489
+ for dtype in (np.uint32, np.int32, np.float64):
490
+ # with self.assertRaises(TypeError):
491
+ # V = VertexBuffer(dtype=dtype)
492
+ self.assertRaises(TypeError, VertexBuffer, dtype=dtype)
493
+
494
+ def test_glsl_type(self):
495
+
496
+ data = np.zeros((10,), np.float32)
497
+ B = VertexBuffer(data)
498
+ C = B[1:]
499
+ assert B.glsl_type == ('attribute', 'float')
500
+ assert C.glsl_type == ('attribute', 'float')
501
+
502
+ data = np.zeros((10, 2), np.float32)
503
+ B = VertexBuffer(data)
504
+ C = B[1:]
505
+ assert B.glsl_type == ('attribute', 'vec2')
506
+ assert C.glsl_type == ('attribute', 'vec2')
507
+
508
+ data = np.zeros((10, 4), np.float32)
509
+ B = VertexBuffer(data)
510
+ C = B[1:]
511
+ assert B.glsl_type == ('attribute', 'vec4')
512
+ assert C.glsl_type == ('attribute', 'vec4')
513
+
514
+
515
+ # -----------------------------------------------------------------------------
516
+ class IndexBufferTest(unittest.TestCase):
517
+
518
+ # IndexBuffer allowed base types
519
+ # ------------------------------
520
+ def test_init_allowed_dtype(self):
521
+
522
+ # allowed dtypes
523
+ for dtype in (np.uint8, np.uint16, np.uint32):
524
+ b = IndexBuffer(np.zeros(10, dtype=dtype))
525
+ b.dtype == dtype
526
+
527
+ # no data => no dtype
528
+ V = IndexBuffer()
529
+ V.dtype is None
530
+
531
+ # Not allowed dtypes
532
+ for dtype in (np.int8, np.int16, np.int32,
533
+ np.float16, np.float32, np.float64):
534
+ # with self.assertRaises(TypeError):
535
+ # V = IndexBuffer(dtype=dtype)
536
+ data = np.zeros(10, dtype=dtype)
537
+ self.assertRaises(TypeError, IndexBuffer, data)
538
+
539
+ # Prepare some data
540
+ dtype = np.dtype([('position', np.float32, 3),
541
+ ('texcoord', np.float32, 2), ])
542
+ sdata = np.zeros(10, dtype=dtype)
543
+
544
+ # Normal data is
545
+ data = np.zeros([1, 2, 3], np.uint8)
546
+ B = IndexBuffer(data)
547
+ assert B.dtype == np.uint8
548
+
549
+ # We can also convert
550
+ B.set_data(data, convert=True)
551
+ assert B.dtype == np.uint32
552
+
553
+ # Structured data not allowed
554
+ self.assertRaises(TypeError, IndexBuffer, dtype=dtype)
555
+ self.assertRaises(TypeError, B.set_data, sdata)
556
+
557
+
558
+ run_tests_if_main()
@@ -0,0 +1,119 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ import gc
4
+
5
+ from vispy.testing import (assert_in, run_tests_if_main, assert_raises,
6
+ assert_equal, assert_not_equal)
7
+
8
+ from vispy import gloo
9
+ from vispy.gloo import (GLContext, get_default_config)
10
+
11
+
12
+ class DummyCanvas(object):
13
+
14
+ @property
15
+ def glir(self):
16
+ return self
17
+
18
+ def command(self, *args):
19
+ pass
20
+
21
+
22
+ class DummyCanvasBackend(object):
23
+
24
+ def __init__(self):
25
+ self.set_current = False
26
+ self._vispy_canvas = DummyCanvas()
27
+
28
+ def _vispy_set_current(self):
29
+ self.set_current = True
30
+
31
+
32
+ def test_context_config():
33
+ """Test GLContext handling of config dict"""
34
+ default_config = get_default_config()
35
+
36
+ # Pass default config unchanged
37
+ c = GLContext(default_config)
38
+ assert_equal(c.config, default_config)
39
+ # Must be deep copy
40
+ c.config['double_buffer'] = False
41
+ assert_not_equal(c.config, default_config)
42
+
43
+ # Passing nothing should yield default config
44
+ c = GLContext()
45
+ assert_equal(c.config, default_config)
46
+ # Must be deep copy
47
+ c.config['double_buffer'] = False
48
+ assert_not_equal(c.config, default_config)
49
+
50
+ # This should work
51
+ c = GLContext({'red_size': 4, 'double_buffer': False})
52
+ assert_equal(c.config.keys(), default_config.keys())
53
+
54
+ # Passing crap should raise
55
+ assert_raises(KeyError, GLContext, {'foo': 3})
56
+ assert_raises(TypeError, GLContext, {'double_buffer': 'not_bool'})
57
+
58
+ # Capabilites are passed on
59
+ assert 'gl_version' in c.capabilities
60
+
61
+
62
+ def test_context_taking():
63
+ """Test GLContext ownership and taking"""
64
+ def get_canvas(c):
65
+ return c.shared.ref
66
+
67
+ cb = DummyCanvasBackend()
68
+ c = GLContext()
69
+
70
+ # Context is not taken and cannot get backend_canvas
71
+ assert c.shared.name is None
72
+ assert_raises(RuntimeError, get_canvas, c)
73
+ assert_in('None backend', repr(c.shared))
74
+
75
+ # Take it
76
+ c.shared.add_ref('test-foo', cb)
77
+ assert c.shared.ref is cb
78
+ assert_in('test-foo backend', repr(c.shared))
79
+
80
+ # Now we can take it again
81
+ c.shared.add_ref('test-foo', cb)
82
+ assert len(c.shared._refs) == 2
83
+ # assert_raises(RuntimeError, c.take, 'test', cb)
84
+
85
+ # Canvas backend can delete (we use a weak ref)
86
+ cb = DummyCanvasBackend() # overwrite old object
87
+ gc.collect()
88
+
89
+ # No more refs
90
+ assert_raises(RuntimeError, get_canvas, c)
91
+
92
+
93
+ def test_gloo_without_app():
94
+ """Test gloo without vispy.app (with FakeCanvas)"""
95
+ # Create dummy parser
96
+ class DummyParser(gloo.glir.BaseGlirParser):
97
+ def __init__(self):
98
+ self.commands = []
99
+
100
+ def parse(self, commands):
101
+ self.commands.extend(commands)
102
+
103
+ p = DummyParser()
104
+
105
+ # Create fake canvas and attach our parser
106
+ c = gloo.context.FakeCanvas()
107
+ c.context.shared.parser = p
108
+
109
+ # Do some commands
110
+ gloo.clear()
111
+ c.flush()
112
+ gloo.clear()
113
+ c.flush()
114
+
115
+ assert len(p.commands) in (2, 3) # there may be a CURRENT command
116
+ assert p.commands[-1][1] == 'glClear'
117
+
118
+
119
+ run_tests_if_main()