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,195 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from vispy.testing import run_tests_if_main, assert_raises
4
+
5
+ from vispy import gloo
6
+ from vispy.gloo import FrameBuffer, RenderBuffer
7
+
8
+
9
+ def test_renderbuffer():
10
+
11
+ # Set with no args
12
+ assert_raises(ValueError, RenderBuffer)
13
+
14
+ # Set shape only
15
+ R = RenderBuffer((10, 20))
16
+ assert R.shape == (10, 20)
17
+ assert R.format is None
18
+
19
+ # Set both shape and format
20
+ R = RenderBuffer((10, 20), 'color')
21
+ assert R.shape == (10, 20)
22
+ assert R.format == 'color'
23
+ #
24
+ glir_cmds = R._glir.clear()
25
+ assert len(glir_cmds) == 2
26
+ assert glir_cmds[0][0] == 'CREATE'
27
+ assert glir_cmds[1][0] == 'SIZE'
28
+
29
+ # Orther formats
30
+ assert RenderBuffer((10, 20), 'depth').format == 'depth'
31
+ assert RenderBuffer((10, 20), 'stencil').format == 'stencil'
32
+
33
+ # Test reset size and format
34
+ R.resize((9, 9), 'depth')
35
+ assert R.shape == (9, 9)
36
+ assert R.format == 'depth'
37
+ R.resize((8, 8), 'stencil')
38
+ assert R.shape == (8, 8)
39
+ assert R.format == 'stencil'
40
+
41
+ # Wrong formats
42
+ assert_raises(ValueError, R.resize, (9, 9), 'no_format')
43
+ assert_raises(ValueError, R.resize, (9, 9), [])
44
+
45
+ # Resizable
46
+ R = RenderBuffer((10, 20), 'color', False)
47
+ assert_raises(RuntimeError, R.resize, (9, 9), 'color')
48
+
49
+ # Attaching sets the format
50
+ F = FrameBuffer()
51
+ #
52
+ R = RenderBuffer((9, 9))
53
+ F.color_buffer = R
54
+ assert F.color_buffer is R
55
+ assert R.format == 'color'
56
+ #
57
+ F.depth_buffer = RenderBuffer((9, 9))
58
+ assert F.depth_buffer.format == 'depth'
59
+ #
60
+ F.stencil_buffer = RenderBuffer((9, 9))
61
+ assert F.stencil_buffer.format == 'stencil'
62
+
63
+
64
+ def test_framebuffer():
65
+
66
+ # Test init with no args
67
+ F = FrameBuffer()
68
+ glir_cmds = F._glir.clear()
69
+ assert len(glir_cmds) == 1
70
+ glir_cmds[0][0] == 'CREATE'
71
+
72
+ # Activate / deactivate
73
+ F.activate()
74
+ glir_cmd = F._glir.clear()[-1]
75
+ assert glir_cmd[0] == 'FRAMEBUFFER'
76
+ assert glir_cmd[2] is True
77
+ #
78
+ F.deactivate()
79
+ glir_cmd = F._glir.clear()[-1]
80
+ assert glir_cmd[0] == 'FRAMEBUFFER'
81
+ assert glir_cmd[2] is False
82
+ #
83
+ with F:
84
+ pass
85
+ glir_cmds = F._glir.clear()
86
+ assert len(glir_cmds) == 2
87
+ assert glir_cmds[0][0] == 'FRAMEBUFFER'
88
+ assert glir_cmds[1][0] == 'FRAMEBUFFER'
89
+ assert glir_cmds[0][2] is True and glir_cmds[1][2] is False
90
+
91
+ # Init with args
92
+ R = RenderBuffer((3, 3))
93
+ F = FrameBuffer(R)
94
+ assert F.color_buffer is R
95
+ #
96
+ R2 = RenderBuffer((3, 3))
97
+ F.color_buffer = R2
98
+ assert F.color_buffer is R2
99
+
100
+ # Wrong buffers
101
+ F = FrameBuffer()
102
+ assert_raises(TypeError, FrameBuffer.color_buffer.fset, F, 'FOO')
103
+ assert_raises(TypeError, FrameBuffer.color_buffer.fset, F, [])
104
+ assert_raises(TypeError, FrameBuffer.depth_buffer.fset, F, 'FOO')
105
+ assert_raises(TypeError, FrameBuffer.stencil_buffer.fset, F, 'FOO')
106
+ color_buffer = RenderBuffer((9, 9), 'color')
107
+ assert_raises(ValueError, FrameBuffer.depth_buffer.fset, F, color_buffer)
108
+ # But None is allowed!
109
+ F.color_buffer = None
110
+
111
+ # Shape
112
+ R1 = RenderBuffer((3, 3))
113
+ R2 = RenderBuffer((3, 3))
114
+ R3 = RenderBuffer((3, 3))
115
+ F = FrameBuffer(R1, R2, R3)
116
+ assert F.shape == R1.shape
117
+ assert R1.format == 'color'
118
+ assert R2.format == 'depth'
119
+ assert R3.format == 'stencil'
120
+ # Resize
121
+ F.resize((10, 10))
122
+ assert F.shape == (10, 10)
123
+ assert F.shape == R1.shape
124
+ assert F.shape == R2.shape
125
+ assert F.shape == R3.shape
126
+ assert R1.format == 'color'
127
+ assert R2.format == 'depth'
128
+ assert R3.format == 'stencil'
129
+ # Shape from any buffer
130
+ F.color_buffer = None
131
+ assert F.shape == (10, 10)
132
+ F.depth_buffer = None
133
+ assert F.shape == (10, 10)
134
+ F.stencil_buffer = None
135
+ assert_raises(RuntimeError, FrameBuffer.shape.fget, F)
136
+
137
+ # Also with Texture luminance
138
+ T = gloo.Texture2D((20, 30))
139
+ R = RenderBuffer(T.shape)
140
+ assert T.format == 'luminance'
141
+ F = FrameBuffer(T, R)
142
+ assert F.shape == T.shape[:2]
143
+ assert F.shape == R.shape
144
+ assert T.format == 'luminance'
145
+ assert R.format == 'depth'
146
+ # Resize
147
+ F.resize((10, 10))
148
+ assert F.shape == (10, 10)
149
+ assert T.shape == (10, 10, 1)
150
+ assert F.shape == R.shape
151
+ assert T.format == 'luminance'
152
+ assert R.format == 'depth'
153
+
154
+ # Also with Texture RGB
155
+ T = gloo.Texture2D((20, 30, 3))
156
+ R = RenderBuffer(T.shape)
157
+ assert T.format == 'rgb'
158
+ F = FrameBuffer(T, R)
159
+ assert F.shape == T.shape[:2]
160
+ assert F.shape == R.shape
161
+ assert T.format == 'rgb'
162
+ assert R.format == 'depth'
163
+ # Resize
164
+ F.resize((10, 10))
165
+ assert F.shape == (10, 10)
166
+ assert T.shape == (10, 10, 3)
167
+ assert F.shape == R.shape
168
+ assert T.format == 'rgb'
169
+ assert R.format == 'depth'
170
+
171
+ # Also with Texture for depth
172
+ T1 = gloo.Texture2D((20, 30, 3))
173
+ T2 = gloo.Texture2D((20, 30, 1))
174
+ assert T1.format == 'rgb'
175
+ assert T2.format == 'luminance'
176
+ F = FrameBuffer(T1, T2)
177
+ assert F.shape == T1.shape[:2]
178
+ assert F.shape == T2.shape[:2]
179
+ assert T1.format == 'rgb'
180
+ assert T2.format == 'luminance'
181
+ # Resize
182
+ F.resize((10, 10))
183
+ assert F.shape == (10, 10)
184
+ assert T1.shape == (10, 10, 3)
185
+ assert T2.shape == (10, 10, 1)
186
+ assert T1.format == 'rgb'
187
+ assert T2.format == 'luminance'
188
+
189
+ # Wrong shape in resize
190
+ assert_raises(ValueError, F. resize, (9, 9, 1))
191
+ assert_raises(ValueError, F. resize, (9,))
192
+ assert_raises(ValueError, F. resize, 'FOO')
193
+
194
+
195
+ run_tests_if_main()
@@ -0,0 +1,307 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ import json
4
+ import tempfile
5
+ from unittest import mock
6
+
7
+ from vispy import config
8
+ from vispy.app import Canvas
9
+ from vispy.gloo import glir
10
+ from vispy.testing import requires_application, requires_pyopengl, run_tests_if_main
11
+
12
+ import numpy as np
13
+
14
+
15
+ def test_queue():
16
+ q = glir.GlirQueue()
17
+ parser = glir.GlirParser()
18
+
19
+ # Test adding commands and clear
20
+ N = 5
21
+ for i in range(N):
22
+ q.command('FOO', 'BAR', i)
23
+ cmds = q.clear()
24
+ for i in range(N):
25
+ assert cmds[i] == ('FOO', 'BAR', i)
26
+
27
+ # Test filter 1
28
+ cmds1 = [('DATA', 1), ('SIZE', 1), ('FOO', 1), ('SIZE', 1), ('FOO', 1),
29
+ ('DATA', 1), ('DATA', 1)]
30
+ cmds2 = [c[0] for c in q._shared._filter(cmds1, parser)]
31
+ assert cmds2 == ['FOO', 'SIZE', 'FOO', 'DATA', 'DATA']
32
+
33
+ # Test filter 2
34
+ cmds1 = [('DATA', 1), ('SIZE', 1), ('FOO', 1), ('SIZE', 2), ('SIZE', 2),
35
+ ('DATA', 2), ('SIZE', 1), ('FOO', 1), ('DATA', 1), ('DATA', 1)]
36
+ cmds2 = q._shared._filter(cmds1, parser)
37
+ assert cmds2 == [('FOO', 1), ('SIZE', 2), ('DATA', 2), ('SIZE', 1),
38
+ ('FOO', 1), ('DATA', 1), ('DATA', 1)]
39
+
40
+ # Define shader
41
+ shader1 = """
42
+ precision highp float;uniform mediump vec4 u_foo;uniform vec4 u_bar;
43
+ """.strip().replace(';', ';\n')
44
+ # Convert for desktop
45
+ shader2 = glir.convert_shader('desktop', shader1)
46
+ assert 'highp' not in shader2
47
+ assert 'mediump' not in shader2
48
+ assert 'precision' not in shader2
49
+
50
+ # Convert for es2
51
+ shader3 = glir.convert_shader('es2', shader2)
52
+ # make sure precision float is still in the shader
53
+ # it may not be the first (precision int might be there)
54
+ assert 'precision highp float;' in shader3
55
+ # precisions must come before code
56
+ assert shader3.startswith('precision')
57
+
58
+ # Define shader with version number
59
+ shader4 = """
60
+ #version 100; precision highp float;uniform mediump vec4 u_foo;uniform vec4 u_bar;
61
+ """.strip().replace(';', ';\n')
62
+ shader5 = glir.convert_shader('es2', shader4)
63
+ assert 'precision highp float;' in shader5
64
+ # make sure that precision is first (version is removed)
65
+ # precisions must come before code
66
+ assert shader3.startswith('precision')
67
+
68
+
69
+ @requires_application()
70
+ def test_log_parser():
71
+ """Test GLIR log parsing"""
72
+ glir_file = tempfile.TemporaryFile(mode='r+')
73
+
74
+ config.update(glir_file=glir_file)
75
+ with Canvas() as c:
76
+ c.context.set_clear_color('white')
77
+ c.context.clear()
78
+
79
+ glir_file.seek(0)
80
+ lines = glir_file.read().split(',\n')
81
+
82
+ assert lines[0][0] == '['
83
+ lines[0] = lines[0][1:]
84
+
85
+ assert lines[-1][-1] == ']'
86
+ lines[-1] = lines[-1][:-1]
87
+
88
+ i = 0
89
+
90
+ # The FBO argument may be anything based on the backend.
91
+ expected = json.dumps(['CURRENT', 0, 1])
92
+ assert len(lines[i]) >= len(expected)
93
+ expected = expected.split('1')
94
+ assert lines[i].startswith(expected[0])
95
+ assert lines[i].endswith(expected[1])
96
+ assert int(lines[i][len(expected[0]):-len(expected[1])]) is not None
97
+
98
+ # The 'CURRENT' command may have been called multiple times
99
+ while lines[i].startswith('["CURRENT",'):
100
+ i += 1
101
+ if lines[i] == json.dumps(['FUNC', 'colorMask', False, False, False, True]):
102
+ # Qt workaround, see #2040
103
+ i += 4
104
+
105
+ assert lines[i] == json.dumps(['FUNC', 'clearColor', 1.0, 1.0, 1.0, 1.0])
106
+ i += 1
107
+ assert lines[i] == json.dumps(['FUNC', 'clear', 17664])
108
+ i += 1
109
+ assert lines[i] == json.dumps(['FUNC', 'finish'])
110
+ i += 1
111
+
112
+ config.update(glir_file='')
113
+ glir_file.close()
114
+
115
+
116
+ @requires_application()
117
+ def test_capabilities():
118
+ """Test GLIR capability reporting"""
119
+ with Canvas() as c:
120
+ capabilities = c.context.shared.parser.capabilities
121
+ assert capabilities['max_texture_size'] is not None
122
+ assert capabilities['gl_version'] != 'unknown'
123
+
124
+
125
+ @requires_pyopengl()
126
+ @mock.patch('vispy.gloo.glir._check_pyopengl_3D')
127
+ @mock.patch('vispy.gloo.glir.gl')
128
+ def test_texture1d_alignment(gl, check3d):
129
+ """Test that textures set unpack alignment properly.
130
+
131
+ See https://github.com/vispy/vispy/pull/1758
132
+
133
+ """
134
+ from ..glir import GlirTexture1D
135
+ check3d.return_value = check3d
136
+ t = GlirTexture1D(mock.MagicMock(), 3)
137
+
138
+ shape = (393, 1)
139
+ t.set_size(shape, 'luminance', 'luminance')
140
+ t.set_data((0,), np.zeros(shape, np.float32))
141
+ # number of elements doesn't matter, only data type
142
+ gl.glPixelStorei.assert_not_called()
143
+ gl.glPixelStorei.reset_mock()
144
+
145
+ # now with bytes
146
+ t.set_data((0,), np.zeros(shape, np.uint8))
147
+ gl.glPixelStorei.assert_has_calls([
148
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 1),
149
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
150
+ ])
151
+ gl.glPixelStorei.reset_mock()
152
+
153
+ # different shape
154
+ shape = (394, 1)
155
+ t.set_size(shape, 'luminance', 'luminance')
156
+ t.set_data((0,), np.zeros(shape, np.float32))
157
+ # number of elements doesn't matter, only data type
158
+ gl.glPixelStorei.assert_not_called()
159
+ gl.glPixelStorei.reset_mock()
160
+
161
+ t.set_data((0,), np.zeros(shape, np.uint8))
162
+ gl.glPixelStorei.assert_has_calls([
163
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 1),
164
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
165
+ ])
166
+ gl.glPixelStorei.reset_mock()
167
+
168
+
169
+ @requires_pyopengl()
170
+ @mock.patch('vispy.gloo.glir._check_pyopengl_3D')
171
+ @mock.patch('vispy.gloo.glir.gl')
172
+ def test_texture2d_alignment(gl, check3d):
173
+ """Test that textures set unpack alignment properly.
174
+
175
+ See https://github.com/vispy/vispy/pull/1758
176
+
177
+ """
178
+ from ..glir import GlirTexture2D
179
+ check3d.return_value = gl
180
+ t = GlirTexture2D(mock.MagicMock(), 3)
181
+
182
+ shape = (296, 393, 1)
183
+ t.set_size(shape, 'luminance', 'luminance')
184
+ t.set_data((0, 0), np.zeros(shape, np.float32))
185
+ # alignment should have been 4 which is the default
186
+ gl.glPixelStorei.assert_not_called()
187
+ gl.glPixelStorei.reset_mock()
188
+
189
+ # now with bytes
190
+ t.set_data((0, 0), np.zeros(shape, np.uint8))
191
+ gl.glPixelStorei.assert_has_calls([
192
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 1),
193
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
194
+ ])
195
+ gl.glPixelStorei.reset_mock()
196
+
197
+ # different shape
198
+ shape = (296, 394, 1)
199
+ t.set_size(shape, 'luminance', 'luminance')
200
+ t.set_data((0, 0), np.zeros(shape, np.float32))
201
+ gl.glPixelStorei.assert_has_calls([
202
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 8),
203
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
204
+ ])
205
+ gl.glPixelStorei.reset_mock()
206
+
207
+ t.set_data((0, 0), np.zeros(shape, np.uint8))
208
+ gl.glPixelStorei.assert_has_calls([
209
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 2),
210
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
211
+ ])
212
+ gl.glPixelStorei.reset_mock()
213
+
214
+
215
+ @requires_pyopengl()
216
+ @mock.patch('vispy.gloo.glir._check_pyopengl_3D')
217
+ @mock.patch('vispy.gloo.glir.gl')
218
+ def test_texture3d_alignment(gl, check3d):
219
+ """Test that textures set unpack alignment properly.
220
+
221
+ See https://github.com/vispy/vispy/pull/1758
222
+
223
+ """
224
+ from ..glir import GlirTexture3D
225
+ check3d.return_value = gl
226
+ t = GlirTexture3D(mock.MagicMock(), 3)
227
+
228
+ shape = (68, 296, 393, 1)
229
+ t.set_size(shape, 'luminance', 'luminance')
230
+ t.set_data((0, 0, 0), np.zeros(shape, np.float32))
231
+ # alignment should have been 4 which is the default
232
+ gl.glPixelStorei.assert_not_called()
233
+ gl.glPixelStorei.reset_mock()
234
+
235
+ # now with bytes
236
+ t.set_data((0, 0, 0), np.zeros(shape, np.uint8))
237
+ gl.glPixelStorei.assert_has_calls([
238
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 1),
239
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
240
+ ])
241
+ gl.glPixelStorei.reset_mock()
242
+
243
+ # different shape
244
+ shape = (68, 296, 394, 1)
245
+ t.set_size(shape, 'luminance', 'luminance')
246
+ t.set_data((0, 0, 0), np.zeros(shape, np.float32))
247
+ gl.glPixelStorei.assert_has_calls([
248
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 8),
249
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
250
+ ])
251
+ gl.glPixelStorei.reset_mock()
252
+
253
+ t.set_data((0, 0, 0), np.zeros(shape, np.uint8))
254
+ gl.glPixelStorei.assert_has_calls([
255
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 2),
256
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
257
+ ])
258
+ gl.glPixelStorei.reset_mock()
259
+
260
+
261
+ @requires_pyopengl()
262
+ @mock.patch('vispy.gloo.glir._check_pyopengl_3D')
263
+ @mock.patch('vispy.gloo.glir.gl')
264
+ def test_texture_cube_alignment(gl, check3d):
265
+ """Test that textures set unpack alignment properly.
266
+
267
+ See https://github.com/vispy/vispy/pull/1758
268
+
269
+ """
270
+ from ..glir import GlirTextureCube
271
+ check3d.return_value = gl
272
+ t = GlirTextureCube(mock.MagicMock(), 3)
273
+
274
+ shape = (68, 296, 393, 1)
275
+ t.set_size(shape, 'luminance', 'luminance')
276
+ t.set_data((0, 0, 0), np.zeros(shape, np.float32))
277
+ # alignment should have been 4 which is the default
278
+ gl.glPixelStorei.assert_not_called()
279
+ gl.glPixelStorei.reset_mock()
280
+
281
+ # now with bytes
282
+ t.set_data((0, 0, 0), np.zeros(shape, np.uint8))
283
+ gl.glPixelStorei.assert_has_calls([
284
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 1),
285
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
286
+ ])
287
+ gl.glPixelStorei.reset_mock()
288
+
289
+ # different shape
290
+ shape = (68, 296, 394, 1)
291
+ t.set_size(shape, 'luminance', 'luminance')
292
+ t.set_data((0, 0, 0), np.zeros(shape, np.float32))
293
+ gl.glPixelStorei.assert_has_calls([
294
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 8),
295
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
296
+ ])
297
+ gl.glPixelStorei.reset_mock()
298
+
299
+ t.set_data((0, 0, 0), np.zeros(shape, np.uint8))
300
+ gl.glPixelStorei.assert_has_calls([
301
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 2),
302
+ mock.call(gl.GL_UNPACK_ALIGNMENT, 4),
303
+ ])
304
+ gl.glPixelStorei.reset_mock()
305
+ # The rest is basically tested via our examples
306
+
307
+ run_tests_if_main()
@@ -0,0 +1,35 @@
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
+
7
+ from vispy.testing import run_tests_if_main
8
+ from vispy.gloo.globject import GLObject
9
+
10
+
11
+ def test_globject():
12
+ """Test gl object uinique id and GLIR CREATE command"""
13
+ objects = [GLObject() for i in range(10)]
14
+ ids = [ob.id for ob in objects]
15
+
16
+ # Verify that each id is unique (test should not care how)
17
+ assert len(set(ids)) == len(objects)
18
+
19
+ # Verify that glir commands have been created
20
+ commands = []
21
+ for ob in objects:
22
+ commands.extend(ob._glir.clear())
23
+ assert len(commands) == len(objects)
24
+ for cmd in commands:
25
+ assert cmd[0] == 'CREATE'
26
+
27
+ # Delete
28
+ ob = objects[-1]
29
+ q = ob._glir # get it now, because its gone after we delete it
30
+ ob.delete()
31
+ cmd = q.clear()[-1]
32
+ assert cmd[0] == 'DELETE'
33
+
34
+
35
+ run_tests_if_main()