vispy 0.15.0__cp313-cp313-macosx_10_13_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of vispy might be problematic. Click here for more details.

Files changed (521) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +1003 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +162 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +700 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +594 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +568 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1824 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1046 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +183 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +32 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +162 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +801 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +819 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-313-darwin.so +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +6 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,187 @@
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 sys
7
+
8
+ import numpy as np
9
+ from numpy.testing import assert_allclose
10
+ import pytest
11
+
12
+ from vispy.app import Canvas
13
+ from vispy.gloo import (Texture2D, Texture3D, Program, FrameBuffer,
14
+ RenderBuffer, set_viewport, clear)
15
+ from vispy.gloo.util import draw_texture, _screenshot
16
+ from vispy.testing import (requires_application, has_pyopengl,
17
+ run_tests_if_main,
18
+ assert_raises, assert_equal, IS_TRAVIS_CI)
19
+
20
+
21
+ @requires_application()
22
+ def test_use_textures():
23
+ """Test using textures and FBO"""
24
+ assert_raises(ValueError, Texture2D, np.zeros((2, 2, 3), np.float32),
25
+ format='rgba') # format and data size mismatch
26
+
27
+
28
+ @requires_application()
29
+ def test_use_framebuffer():
30
+ """Test drawing to a framebuffer"""
31
+ shape = (100, 300) # for some reason Windows wants a tall window...
32
+ data = np.random.rand(*shape).astype(np.float32)
33
+ use_shape = shape + (3,)
34
+ with Canvas(size=shape[::-1]) as c:
35
+ c.app.process_events()
36
+ c.set_current()
37
+ if c.app.backend_name.lower() == 'pyqt5':
38
+ # PyQt5 on OSX for some reason sets this to 1024x768...
39
+ c.size = shape[::-1]
40
+ c.app.process_events()
41
+ orig_tex = Texture2D(data)
42
+ fbo_tex = Texture2D(use_shape, format='rgb')
43
+ rbo = RenderBuffer(shape, 'color')
44
+ fbo = FrameBuffer(color=fbo_tex)
45
+ c.context.glir.set_verbose(True)
46
+ assert c.size == shape[::-1]
47
+ c.set_current()
48
+ set_viewport((0, 0) + c.size)
49
+ with fbo:
50
+ draw_texture(orig_tex)
51
+ draw_texture(fbo_tex)
52
+ out_tex = _screenshot()[::-1, :, 0].astype(np.float32)
53
+ assert out_tex.shape == c.size[::-1]
54
+ assert_raises(TypeError, FrameBuffer.color_buffer.fset, fbo, 1.)
55
+ assert_raises(TypeError, FrameBuffer.depth_buffer.fset, fbo, 1.)
56
+ assert_raises(TypeError, FrameBuffer.stencil_buffer.fset, fbo, 1.)
57
+ fbo.color_buffer = rbo
58
+ fbo.depth_buffer = RenderBuffer(shape)
59
+ fbo.stencil_buffer = None
60
+ print((fbo.color_buffer, fbo.depth_buffer, fbo.stencil_buffer))
61
+ clear(color='black')
62
+ with fbo:
63
+ clear(color='black')
64
+ draw_texture(orig_tex)
65
+ out_rbo = _screenshot()[:, :, 0].astype(np.float32)
66
+ assert_allclose(data * 255., out_tex, atol=1)
67
+ assert_allclose(data * 255., out_rbo, atol=1)
68
+
69
+
70
+ @requires_application()
71
+ def test_use_texture3D():
72
+ """Test using a 3D texture"""
73
+ vals = [0, 200, 100, 0, 255, 0, 100]
74
+ d, h, w = len(vals), 3, 5
75
+ data = np.zeros((d, h, w), np.float32)
76
+
77
+ VERT_SHADER = """
78
+ attribute vec2 a_pos;
79
+ varying vec2 v_pos;
80
+
81
+ void main (void)
82
+ {
83
+ v_pos = a_pos;
84
+ gl_Position = vec4(a_pos, 0., 1.);
85
+ }
86
+ """
87
+
88
+ FRAG_SHADER = """
89
+ uniform sampler3D u_texture;
90
+ varying vec2 v_pos;
91
+ uniform float i;
92
+ void main()
93
+ {
94
+ gl_FragColor = texture3D(u_texture,
95
+ vec3((v_pos.y+1.)/2., (v_pos.x+1.)/2., i));
96
+ gl_FragColor.a = 1.;
97
+ }
98
+ """
99
+ # populate the depth "slices" with different gray colors in the bottom left
100
+ for ii, val in enumerate(vals):
101
+ data[ii, :2, :3] = val / 255.
102
+ with Canvas(size=(100, 100)) as c:
103
+ if not has_pyopengl():
104
+ t = Texture3D(data)
105
+ assert_raises(ImportError, t.glir.flush, c.context.shared.parser)
106
+ return
107
+ program = Program(VERT_SHADER, FRAG_SHADER)
108
+ program['a_pos'] = [[-1., -1.], [1., -1.], [-1., 1.], [1., 1.]]
109
+ tex = Texture3D(data, interpolation='nearest')
110
+ assert_equal(tex.width, w)
111
+ assert_equal(tex.height, h)
112
+ assert_equal(tex.depth, d)
113
+ program['u_texture'] = tex
114
+ for ii, val in enumerate(vals):
115
+ set_viewport(0, 0, w, h)
116
+ clear(color='black')
117
+ iii = (ii + 0.5) / float(d)
118
+ print(ii, iii)
119
+ program['i'] = iii
120
+ program.draw('triangle_strip')
121
+ out = _screenshot()[:, :, 0].astype(int)[::-1]
122
+ expected = np.zeros_like(out)
123
+ expected[:2, :3] = val
124
+ assert_allclose(out, expected, atol=1./255.)
125
+
126
+
127
+ @pytest.mark.xfail(IS_TRAVIS_CI and 'darwin' in sys.platform,
128
+ reason='Travis OSX causes segmentation fault on this test for an unknown reason.')
129
+ @requires_application()
130
+ def test_use_uniforms():
131
+ """Test using uniform arrays"""
132
+ VERT_SHADER = """
133
+ attribute vec2 a_pos;
134
+ varying vec2 v_pos;
135
+
136
+ void main (void)
137
+ {
138
+ v_pos = a_pos;
139
+ gl_Position = vec4(a_pos, 0., 1.);
140
+ }
141
+ """
142
+
143
+ FRAG_SHADER = """
144
+ varying vec2 v_pos;
145
+ uniform vec3 u_color[2];
146
+
147
+ void main()
148
+ {
149
+ gl_FragColor = vec4((u_color[0] + u_color[1]) / 2., 1.);
150
+ }
151
+ """
152
+ shape = (500, 500)
153
+ with Canvas(size=shape) as c:
154
+ c.set_current()
155
+ c.context.glir.set_verbose(True)
156
+ assert_equal(c.size, shape[::-1])
157
+ shape = (3, 3)
158
+ set_viewport((0, 0) + shape)
159
+ program = Program(VERT_SHADER, FRAG_SHADER)
160
+ program['a_pos'] = [[-1., -1.], [1., -1.], [-1., 1.], [1., 1.]]
161
+ program['u_color'] = np.ones((2, 3))
162
+ c.context.clear('k')
163
+ c.set_current()
164
+ program.draw('triangle_strip')
165
+ out = _screenshot()
166
+ assert_allclose(out[:, :, 0] / 255., np.ones(shape), atol=1. / 255.)
167
+
168
+ # now set one element
169
+ program['u_color[1]'] = np.zeros(3, np.float32)
170
+ c.context.clear('k')
171
+ program.draw('triangle_strip')
172
+ out = _screenshot()
173
+ assert_allclose(out[:, :, 0] / 255., 127.5 / 255. * np.ones(shape),
174
+ atol=1. / 255.)
175
+
176
+ # and the other
177
+ assert_raises(ValueError, program.__setitem__, 'u_color',
178
+ np.zeros(3, np.float32))
179
+ program['u_color'] = np.zeros((2, 3), np.float32)
180
+ program['u_color[0]'] = np.ones(3, np.float32)
181
+ c.context.clear((0.33,) * 3)
182
+ program.draw('triangle_strip')
183
+ out = _screenshot()
184
+ assert_allclose(out[:, :, 0] / 255., 127.5 / 255. * np.ones(shape),
185
+ atol=1. / 255.)
186
+
187
+ run_tests_if_main()
@@ -0,0 +1,60 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from vispy.gloo import util
4
+
5
+ from vispy.testing import run_tests_if_main, assert_raises
6
+
7
+
8
+ def test_check_enum():
9
+ from vispy.gloo import gl
10
+
11
+ # Test enums
12
+ assert util.check_enum(gl.GL_RGB) == 'rgb'
13
+ assert util.check_enum(gl.GL_TRIANGLE_STRIP) == 'triangle_strip'
14
+
15
+ # Test strings
16
+ assert util.check_enum('RGB') == 'rgb'
17
+ assert util.check_enum('Triangle_STRIp') == 'triangle_strip'
18
+
19
+ # Test wrong input
20
+ assert_raises(ValueError, util.check_enum, int(gl.GL_RGB))
21
+ assert_raises(ValueError, util.check_enum, int(gl.GL_TRIANGLE_STRIP))
22
+ assert_raises(ValueError, util.check_enum, [])
23
+
24
+ # Test with test
25
+ util.check_enum('RGB', 'test', ('rgb', 'alpha')) == 'rgb'
26
+ util.check_enum(gl.GL_ALPHA, 'test', ('rgb', 'alpha')) == 'alpha'
27
+ #
28
+ assert_raises(ValueError, util.check_enum, 'RGB', 'test', ('a', 'b'))
29
+ assert_raises(ValueError, util.check_enum, gl.GL_ALPHA, 'test', ('a', 'b'))
30
+
31
+ # Test PyOpenGL enums
32
+ try:
33
+ from OpenGL import GL
34
+ except ImportError:
35
+ return # we cannot test PyOpenGL
36
+ #
37
+ assert util.check_enum(GL.GL_RGB) == 'rgb'
38
+ assert util.check_enum(GL.GL_TRIANGLE_STRIP) == 'triangle_strip'
39
+
40
+
41
+ def test_check_identifier():
42
+
43
+ # Tests check_identifier()
44
+ assert util.check_identifier('foo') is None
45
+ assert util.check_identifier('_fooBarBla') is None
46
+ assert util.check_identifier('_glPosition') is None
47
+
48
+ # Wrong identifier
49
+ assert util.check_identifier('__').startswith('Identifier')
50
+ assert util.check_identifier('gl_').startswith('Identifier')
51
+ assert util.check_identifier('GL_').startswith('Identifier')
52
+ assert util.check_identifier('double').startswith('Identifier')
53
+
54
+ # Test check_variable()
55
+ assert util.check_variable('foo') is None
56
+ assert util.check_variable('a' * 30) is None
57
+ assert util.check_variable('a' * 32)
58
+
59
+
60
+ run_tests_if_main()
@@ -0,0 +1,261 @@
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 numpy as np
7
+ from numpy.testing import assert_array_equal, assert_allclose
8
+
9
+ from vispy import gloo
10
+ from vispy.gloo import gl
11
+ from vispy.app import Canvas
12
+ from vispy.testing import (requires_application, run_tests_if_main,
13
+ assert_true, assert_equal, assert_raises)
14
+ from vispy.gloo import read_pixels
15
+ from vispy.gloo.glir import GlirQueue
16
+ from vispy.gloo import wrappers
17
+
18
+
19
+ # Dummy queue
20
+ dummy_glir = GlirQueue()
21
+ dummy_glir.context = dummy_glir
22
+ dummy_glir.glir = dummy_glir
23
+
24
+
25
+ def install_dummy_glir():
26
+ wrappers.get_current_canvas = lambda x=None: dummy_glir
27
+ dummy_glir.clear()
28
+ return dummy_glir
29
+
30
+
31
+ def reset_glir():
32
+ wrappers.get_current_canvas = gloo.get_current_canvas
33
+
34
+
35
+ def teardown_module():
36
+ reset_glir()
37
+
38
+
39
+ def test_wrappers_basic_glir():
40
+ """Test that basic gloo wrapper functions emit right GLIR command"""
41
+ glir = install_dummy_glir()
42
+
43
+ funcs = [('viewport', 0, 0, 10, 10),
44
+ ('depth_range', 0, 1),
45
+ ('front_face', 'ccw'),
46
+ ('cull_face', 'back'),
47
+ ('line_width', 1),
48
+ ('polygon_offset', 0, 0),
49
+ ('clear_color', ),
50
+ ('clear_depth', ),
51
+ ('clear_stencil', ),
52
+ ('blend_func', ),
53
+ ('blend_color', 'red'),
54
+ ('blend_equation', 'X'),
55
+ ('scissor', 0, 0, 10, 10),
56
+ ('stencil_func', ),
57
+ ('stencil_mask', ),
58
+ ('stencil_op', ),
59
+ ('depth_func', ),
60
+ ('depth_mask', 'X'),
61
+ ('color_mask', False, False, False, False),
62
+ ('sample_coverage', ),
63
+ ('hint', 'foo', 'bar'),
64
+ # not finish and flush, because that would flush the glir queue
65
+ ]
66
+
67
+ for func in funcs:
68
+ name, args = func[0], func[1:]
69
+ f = getattr(gloo, 'set_' + name)
70
+ f(*args)
71
+
72
+ cmds = glir.clear()
73
+ assert len(cmds) == len(funcs)
74
+ for i, func in enumerate(funcs):
75
+ cmd = cmds[i]
76
+ nameparts = [a.capitalize() for a in func[0].split('_')]
77
+ name = 'gl' + ''.join(nameparts)
78
+ assert cmd[0] == 'FUNC'
79
+ if cmd[1].endswith('Separate'):
80
+ assert cmd[1][:-8] == name
81
+ else:
82
+ assert cmd[1] == name
83
+
84
+ reset_glir()
85
+
86
+
87
+ def test_wrappers_glir():
88
+ """Test that special wrapper functions do what they must do"""
89
+ glir = install_dummy_glir()
90
+
91
+ # Test clear() function
92
+ gloo.clear()
93
+ cmds = glir.clear()
94
+ assert len(cmds) == 1
95
+ assert cmds[0][0] == 'FUNC'
96
+ assert cmds[0][1] == 'glClear'
97
+ #
98
+ gloo.clear(True, False, False)
99
+ cmds = glir.clear()
100
+ assert len(cmds) == 1
101
+ assert cmds[0][0] == 'FUNC'
102
+ assert cmds[0][1] == 'glClear'
103
+ assert cmds[0][2] == gl.GL_COLOR_BUFFER_BIT
104
+ #
105
+ gloo.clear('red')
106
+ cmds = glir.clear()
107
+ assert len(cmds) == 2
108
+ assert cmds[0][0] == 'FUNC'
109
+ assert cmds[0][1] == 'glClearColor'
110
+ assert cmds[1][0] == 'FUNC'
111
+ assert cmds[1][1] == 'glClear'
112
+ #
113
+ gloo.clear('red', 4, 3)
114
+ cmds = glir.clear()
115
+ assert len(cmds) == 4
116
+ assert cmds[0][1] == 'glClearColor'
117
+ assert cmds[1][1] == 'glClearDepth'
118
+ assert cmds[2][1] == 'glClearStencil'
119
+ assert cmds[3][1] == 'glClear'
120
+
121
+ # Test set_state() function
122
+ gloo.set_state(foo=True, bar=False)
123
+ cmds = set(glir.clear())
124
+ assert len(cmds) == 2
125
+ assert ('FUNC', 'glEnable', 'foo') in cmds
126
+ assert ('FUNC', 'glDisable', 'bar') in cmds
127
+ #
128
+ gloo.set_state(viewport=(0, 0, 10, 10), clear_color='red')
129
+ cmds = sorted(glir.clear())
130
+ assert len(cmds) == 2
131
+ assert cmds[0][1] == 'glClearColor'
132
+ assert cmds[1][1] == 'glViewport'
133
+ #
134
+ presets = gloo.get_state_presets()
135
+ a_preset = list(presets.keys())[0]
136
+ gloo.set_state(a_preset)
137
+ cmds = sorted(glir.clear())
138
+ assert len(cmds) == len(presets[a_preset])
139
+
140
+ reset_glir()
141
+
142
+
143
+ def assert_cmd_raises(E, fun, *args, **kwargs):
144
+ gloo.flush() # no error here
145
+ fun(*args, **kwargs)
146
+ assert_raises(E, gloo.flush)
147
+
148
+
149
+ @requires_application()
150
+ def test_wrappers():
151
+ """Test gloo wrappers"""
152
+ with Canvas():
153
+ gl.use_gl('gl2 debug')
154
+ gloo.clear('#112233') # make it so that there's something non-zero
155
+ # check presets
156
+ assert_raises(ValueError, gloo.set_state, preset='foo')
157
+ for state in gloo.get_state_presets().keys():
158
+ gloo.set_state(state)
159
+ assert_raises(ValueError, gloo.set_blend_color, (0., 0.)) # bad color
160
+ assert_raises(TypeError, gloo.set_hint, 1, 2) # need strs
161
+ # this doesn't exist in ES 2.0 namespace
162
+ assert_cmd_raises(ValueError, gloo.set_hint, 'fog_hint', 'nicest')
163
+ # test bad enum
164
+ assert_raises(RuntimeError, gloo.set_line_width, -1)
165
+
166
+ # check read_pixels
167
+ x = gloo.read_pixels()
168
+ assert_true(isinstance(x, np.ndarray))
169
+ assert_true(isinstance(gloo.read_pixels((0, 0, 1, 1)), np.ndarray))
170
+ assert_raises(ValueError, gloo.read_pixels, (0, 0, 1)) # bad port
171
+ y = gloo.read_pixels(alpha=False, out_type=np.ubyte)
172
+ assert_equal(y.shape, x.shape[:2] + (3,))
173
+ assert_array_equal(x[..., :3], y)
174
+ y = gloo.read_pixels(out_type='float')
175
+ assert_allclose(x/255., y)
176
+
177
+ # now let's (indirectly) check our set_* functions
178
+ viewport = (0, 0, 1, 1)
179
+ blend_color = (0., 0., 0.)
180
+ _funs = dict(viewport=viewport, # checked
181
+ hint=('generate_mipmap_hint', 'nicest'),
182
+ depth_range=(1., 2.),
183
+ front_face='cw', # checked
184
+ cull_face='front',
185
+ line_width=1.,
186
+ polygon_offset=(1., 1.),
187
+ blend_func=('zero', 'one'),
188
+ blend_color=blend_color,
189
+ blend_equation='func_add',
190
+ scissor=(0, 0, 1, 1),
191
+ stencil_func=('never', 1, 2, 'back'),
192
+ stencil_mask=4,
193
+ stencil_op=('zero', 'zero', 'zero', 'back'),
194
+ depth_func='greater',
195
+ depth_mask=True,
196
+ color_mask=(True, True, True, True),
197
+ sample_coverage=(0.5, True))
198
+ gloo.set_state(**_funs)
199
+ gloo.clear((1., 1., 1., 1.), 0.5, 1)
200
+ gloo.flush()
201
+ gloo.finish()
202
+ # check some results
203
+ assert_array_equal(gl.glGetParameter(gl.GL_VIEWPORT), viewport)
204
+ assert_equal(gl.glGetParameter(gl.GL_FRONT_FACE), gl.GL_CW)
205
+ assert_equal(gl.glGetParameter(gl.GL_BLEND_COLOR), blend_color + (1,))
206
+
207
+
208
+ @requires_application()
209
+ def test_read_pixels():
210
+ """Test read_pixels to ensure that the image is not flipped"""
211
+ # Create vertices
212
+ vPosition = np.array(
213
+ [[-1, 1, 0.0], [0, 1, 0.5], # For drawing a square to top left
214
+ [-1, 0, 0.0], [0, 0, 0.5]], np.float32)
215
+
216
+ VERT_SHADER = """ // simple vertex shader
217
+ attribute vec3 a_position;
218
+ void main (void) {
219
+ gl_Position = vec4(a_position, 1.0);
220
+ }
221
+ """
222
+
223
+ FRAG_SHADER = """ // simple fragment shader
224
+ void main()
225
+ {
226
+ gl_FragColor = vec4(1,1,1,1);
227
+ }
228
+ """
229
+
230
+ with Canvas() as c:
231
+ c.set_current()
232
+ gloo.set_viewport(0, 0, *c.size)
233
+ gloo.set_state(depth_test=True)
234
+ c._program = gloo.Program(VERT_SHADER, FRAG_SHADER)
235
+ c._program['a_position'] = gloo.VertexBuffer(vPosition)
236
+ gloo.clear(color='black')
237
+ c._program.draw('triangle_strip')
238
+
239
+ # Check if the return of read_pixels is the same as our drawing
240
+ img = read_pixels(alpha=False)
241
+ assert_equal(img.shape[:2], c.size[::-1])
242
+ top_left = sum(img[0, 0])
243
+ assert_true(top_left > 0) # Should be > 0 (255*4)
244
+ # Sum of the pixels in top right + bottom left + bottom right corners
245
+ corners = sum(img[0, -1] + img[-1, 0] + img[-1, -1])
246
+ assert_true(corners == 0) # Should be all 0
247
+ gloo.flush()
248
+ gloo.finish()
249
+
250
+ # Check that we can read the depth buffer
251
+ img = read_pixels(mode='depth')
252
+ assert_equal(img.shape[:2], c.size[::-1])
253
+ assert_equal(img.shape[2], 1)
254
+ unique_img = np.unique(img)
255
+ # we should have quite a few different depth values
256
+ assert unique_img.shape[0] > 50
257
+ assert unique_img.max() == 255
258
+ assert unique_img.min() > 0
259
+
260
+
261
+ run_tests_if_main()