vispy 0.14.0__cp311-cp311-macosx_11_0_arm64.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 (519) 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 +968 -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 +1134 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +352 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1542 -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 +134 -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 +698 -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 +506 -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 +566 -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 +1816 -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 +1045 -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 +106 -0
  274. vispy/scene/cameras/base_camera.py +538 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +308 -0
  278. vispy/scene/cameras/perspective.py +333 -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 +173 -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 +446 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +473 -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 +17 -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 +4 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +485 -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 +163 -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 +796 -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 +105 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +688 -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 +810 -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_histogram.py +24 -0
  477. vispy/visuals/tests/test_image.py +390 -0
  478. vispy/visuals/tests/test_image_complex.py +36 -0
  479. vispy/visuals/tests/test_infinite_line.py +53 -0
  480. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  481. vispy/visuals/tests/test_isosurface.py +22 -0
  482. vispy/visuals/tests/test_linear_region.py +152 -0
  483. vispy/visuals/tests/test_markers.py +54 -0
  484. vispy/visuals/tests/test_mesh.py +261 -0
  485. vispy/visuals/tests/test_mesh_normals.py +218 -0
  486. vispy/visuals/tests/test_polygon.py +112 -0
  487. vispy/visuals/tests/test_rectangle.py +163 -0
  488. vispy/visuals/tests/test_regular_polygon.py +111 -0
  489. vispy/visuals/tests/test_scalable_textures.py +180 -0
  490. vispy/visuals/tests/test_sdf.py +73 -0
  491. vispy/visuals/tests/test_spectrogram.py +42 -0
  492. vispy/visuals/tests/test_text.py +95 -0
  493. vispy/visuals/tests/test_volume.py +542 -0
  494. vispy/visuals/tests/test_windbarb.py +33 -0
  495. vispy/visuals/text/__init__.py +7 -0
  496. vispy/visuals/text/_sdf_cpu.cpython-311-darwin.so +0 -0
  497. vispy/visuals/text/_sdf_cpu.pyx +110 -0
  498. vispy/visuals/text/_sdf_gpu.py +316 -0
  499. vispy/visuals/text/text.py +675 -0
  500. vispy/visuals/transforms/__init__.py +34 -0
  501. vispy/visuals/transforms/_util.py +191 -0
  502. vispy/visuals/transforms/base_transform.py +233 -0
  503. vispy/visuals/transforms/chain.py +300 -0
  504. vispy/visuals/transforms/interactive.py +98 -0
  505. vispy/visuals/transforms/linear.py +564 -0
  506. vispy/visuals/transforms/nonlinear.py +398 -0
  507. vispy/visuals/transforms/tests/__init__.py +0 -0
  508. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  509. vispy/visuals/transforms/transform_system.py +339 -0
  510. vispy/visuals/tube.py +173 -0
  511. vispy/visuals/visual.py +923 -0
  512. vispy/visuals/volume.py +1335 -0
  513. vispy/visuals/windbarb.py +291 -0
  514. vispy/visuals/xyz_axis.py +34 -0
  515. vispy-0.14.0.dist-info/LICENSE.txt +36 -0
  516. vispy-0.14.0.dist-info/METADATA +218 -0
  517. vispy-0.14.0.dist-info/RECORD +519 -0
  518. vispy-0.14.0.dist-info/WHEEL +5 -0
  519. vispy-0.14.0.dist-info/top_level.txt +1 -0
vispy/gloo/wrappers.py ADDED
@@ -0,0 +1,762 @@
1
+ # -*- coding: utf-8 -*-
2
+ # -----------------------------------------------------------------------------
3
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
4
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
5
+ # -----------------------------------------------------------------------------
6
+
7
+ import numpy as np
8
+ from copy import deepcopy
9
+
10
+ from . import gl
11
+ from ..color import Color
12
+ from ..util import logger
13
+
14
+
15
+ __all__ = ('set_viewport', 'set_depth_range', 'set_front_face', # noqa
16
+ 'set_cull_face', 'set_line_width', 'set_polygon_offset', # noqa
17
+ 'clear', 'set_clear_color', 'set_clear_depth', 'set_clear_stencil', # noqa
18
+ 'set_blend_func', 'set_blend_color', 'set_blend_equation', # noqa
19
+ 'set_scissor', 'set_stencil_func', 'set_stencil_mask', # noqa
20
+ 'set_stencil_op', 'set_depth_func', 'set_depth_mask', # noqa
21
+ 'set_color_mask', 'set_sample_coverage', # noqa
22
+ 'get_state_presets', 'set_state', 'finish', 'flush', # noqa
23
+ 'read_pixels', 'set_hint', # noqa
24
+ 'get_gl_configuration', '_check_valid',
25
+ 'GL_PRESETS',
26
+ 'GlooFunctions', 'global_gloo_functions', )
27
+
28
+ _setters = [s[4:] for s in __all__
29
+ if s.startswith('set_') and s != 'set_state']
30
+
31
+ # NOTE: If these are updated to have things beyond glEnable/glBlendFunc
32
+ # calls, set_state will need to be updated to deal with it.
33
+ #: Some OpenGL state presets for common use cases: 'opaque', 'translucent',
34
+ #: 'additive'.
35
+ #:
36
+ #: To be used in :func:`.set_state`.
37
+ GL_PRESETS = {
38
+ 'opaque': dict(
39
+ depth_test=True,
40
+ cull_face=False,
41
+ blend=False),
42
+ 'translucent': dict(
43
+ depth_test=True,
44
+ cull_face=False,
45
+ blend=True,
46
+ blend_func=('src_alpha', 'one_minus_src_alpha', 'zero', 'one'),
47
+ blend_equation='func_add'),
48
+ 'additive': dict(
49
+ depth_test=False,
50
+ cull_face=False,
51
+ blend=True,
52
+ blend_func=('src_alpha', 'one'),
53
+ blend_equation='func_add'),
54
+ }
55
+
56
+
57
+ def get_current_canvas():
58
+ """Proxy for context.get_current_canvas to avoud circular import.
59
+ This function replaces itself with the real function the first
60
+ time it is called. (Bah)
61
+ """
62
+ from .context import get_current_canvas
63
+ globals()['get_current_canvas'] = get_current_canvas
64
+ return get_current_canvas()
65
+
66
+
67
+ # Helpers that are needed for efficient wrapping
68
+
69
+ def _check_valid(key, val, valid):
70
+ """Helper to check valid options"""
71
+ if val not in valid:
72
+ raise ValueError('%s must be one of %s, not "%s"'
73
+ % (key, valid, val))
74
+
75
+
76
+ def _to_args(x):
77
+ """Convert to args representation"""
78
+ if not isinstance(x, (list, tuple, np.ndarray)):
79
+ x = [x]
80
+ return x
81
+
82
+
83
+ def _check_conversion(key, valid_dict):
84
+ """Check for existence of key in dict, return value or raise error"""
85
+ if key not in valid_dict and key not in valid_dict.values():
86
+ # Only show users the nice string values
87
+ keys = [v for v in valid_dict.keys() if isinstance(v, str)]
88
+ raise ValueError('value must be one of %s, not %s' % (keys, key))
89
+ return valid_dict[key] if key in valid_dict else key
90
+
91
+
92
+ class BaseGlooFunctions(object):
93
+ """Class that provides a series of GL functions that do not fit
94
+ in the object oriented part of gloo. An instance of this class is
95
+ associated with each canvas.
96
+ """
97
+
98
+ ##########################################################################
99
+ # PRIMITIVE/VERTEX
100
+
101
+ #
102
+ # Viewport, DepthRangef, CullFace, FrontFace, LineWidth, PolygonOffset
103
+ #
104
+
105
+ def set_viewport(self, *args):
106
+ """Set the OpenGL viewport
107
+
108
+ This is a wrapper for gl.glViewport.
109
+
110
+ Parameters
111
+ ----------
112
+ *args : tuple
113
+ X and Y coordinates, plus width and height. Can be passed in as
114
+ individual components, or as a single tuple with four values.
115
+ """
116
+ x, y, w, h = args[0] if len(args) == 1 else args
117
+ self.glir.command('FUNC', 'glViewport', int(x), int(y), int(w), int(h))
118
+
119
+ def set_depth_range(self, near=0., far=1.):
120
+ """Set depth values
121
+
122
+ Parameters
123
+ ----------
124
+ near : float
125
+ Near clipping plane.
126
+ far : float
127
+ Far clipping plane.
128
+ """
129
+ self.glir.command('FUNC', 'glDepthRange', float(near), float(far))
130
+
131
+ def set_front_face(self, mode='ccw'):
132
+ """Set which faces are front-facing
133
+
134
+ Parameters
135
+ ----------
136
+ mode : str
137
+ Can be 'cw' for clockwise or 'ccw' for counter-clockwise.
138
+ """
139
+ self.glir.command('FUNC', 'glFrontFace', mode)
140
+
141
+ def set_cull_face(self, mode='back'):
142
+ """Set front, back, or both faces to be culled
143
+
144
+ Parameters
145
+ ----------
146
+ mode : str
147
+ Culling mode. Can be "front", "back", or "front_and_back".
148
+ """
149
+ self.glir.command('FUNC', 'glCullFace', mode)
150
+
151
+ def set_line_width(self, width=1.):
152
+ """Set line width
153
+
154
+ Parameters
155
+ ----------
156
+ width : float
157
+ The line width.
158
+ """
159
+ width = float(width)
160
+ if width < 0:
161
+ raise RuntimeError('Cannot have width < 0')
162
+ self.glir.command('FUNC', 'glLineWidth', width)
163
+
164
+ def set_polygon_offset(self, factor=0., units=0.):
165
+ """Set the scale and units used to calculate depth values
166
+
167
+ Parameters
168
+ ----------
169
+ factor : float
170
+ Scale factor used to create a variable depth offset for
171
+ each polygon.
172
+ units : float
173
+ Multiplied by an implementation-specific value to create a
174
+ constant depth offset.
175
+ """
176
+ self.glir.command('FUNC', 'glPolygonOffset', float(factor),
177
+ float(units))
178
+
179
+ ##########################################################################
180
+ # FRAGMENT/SCREEN
181
+
182
+ #
183
+ # glClear, glClearColor, glClearDepthf, glClearStencil
184
+ #
185
+
186
+ def clear(self, color=True, depth=True, stencil=True):
187
+ """Clear the screen buffers
188
+
189
+ This is a wrapper for gl.glClear.
190
+
191
+ Parameters
192
+ ----------
193
+ color : bool | str | tuple | instance of Color
194
+ Clear the color buffer bit. If not bool, ``set_clear_color`` will
195
+ be used to set the color clear value.
196
+ depth : bool | float
197
+ Clear the depth buffer bit. If float, ``set_clear_depth`` will
198
+ be used to set the depth clear value.
199
+ stencil : bool | int
200
+ Clear the stencil buffer bit. If int, ``set_clear_stencil`` will
201
+ be used to set the stencil clear index.
202
+ """
203
+ bits = 0
204
+ if isinstance(color, np.ndarray) or bool(color):
205
+ if not isinstance(color, bool):
206
+ self.set_clear_color(color)
207
+ bits |= gl.GL_COLOR_BUFFER_BIT
208
+ if depth:
209
+ if not isinstance(depth, bool):
210
+ self.set_clear_depth(depth)
211
+ bits |= gl.GL_DEPTH_BUFFER_BIT
212
+ if stencil:
213
+ if not isinstance(stencil, bool):
214
+ self.set_clear_stencil(stencil)
215
+ bits |= gl.GL_STENCIL_BUFFER_BIT
216
+ self.glir.command('FUNC', 'glClear', bits)
217
+
218
+ def set_clear_color(self, color='black', alpha=None):
219
+ """Set the screen clear color
220
+
221
+ This is a wrapper for gl.glClearColor.
222
+
223
+ Parameters
224
+ ----------
225
+ color : str | tuple | instance of Color
226
+ Color to use. See vispy.color.Color for options.
227
+ alpha : float | None
228
+ Alpha to use.
229
+ """
230
+ self.glir.command('FUNC', 'glClearColor', *Color(color, alpha).rgba)
231
+
232
+ def set_clear_depth(self, depth=1.0):
233
+ """Set the clear value for the depth buffer
234
+
235
+ This is a wrapper for gl.glClearDepth.
236
+
237
+ Parameters
238
+ ----------
239
+ depth : float
240
+ The depth to use.
241
+ """
242
+ self.glir.command('FUNC', 'glClearDepth', float(depth))
243
+
244
+ def set_clear_stencil(self, index=0):
245
+ """Set the clear value for the stencil buffer
246
+
247
+ This is a wrapper for gl.glClearStencil.
248
+
249
+ Parameters
250
+ ----------
251
+ index : int
252
+ The index to use when the stencil buffer is cleared.
253
+ """
254
+ self.glir.command('FUNC', 'glClearStencil', int(index))
255
+
256
+ # glBlendFunc(Separate), glBlendColor, glBlendEquation(Separate)
257
+
258
+ def set_blend_func(self, srgb='one', drgb='zero',
259
+ salpha=None, dalpha=None):
260
+ """Specify pixel arithmetic for RGB and alpha
261
+
262
+ Parameters
263
+ ----------
264
+ srgb : str
265
+ Source RGB factor.
266
+ drgb : str
267
+ Destination RGB factor.
268
+ salpha : str | None
269
+ Source alpha factor. If None, ``srgb`` is used.
270
+ dalpha : str
271
+ Destination alpha factor. If None, ``drgb`` is used.
272
+ """
273
+ salpha = srgb if salpha is None else salpha
274
+ dalpha = drgb if dalpha is None else dalpha
275
+ self.glir.command('FUNC', 'glBlendFuncSeparate',
276
+ srgb, drgb, salpha, dalpha)
277
+
278
+ def set_blend_color(self, color):
279
+ """Set the blend color
280
+
281
+ Parameters
282
+ ----------
283
+ color : str | tuple | instance of Color
284
+ Color to use. See vispy.color.Color for options.
285
+ """
286
+ self.glir.command('FUNC', 'glBlendColor', *Color(color).rgba)
287
+
288
+ def set_blend_equation(self, mode_rgb, mode_alpha=None):
289
+ """Specify the equation for RGB and alpha blending
290
+
291
+ Parameters
292
+ ----------
293
+ mode_rgb : str
294
+ Mode for RGB.
295
+ mode_alpha : str | None
296
+ Mode for Alpha. If None, ``mode_rgb`` is used.
297
+
298
+ Notes
299
+ -----
300
+ See ``set_blend_equation`` for valid modes.
301
+ """
302
+ mode_alpha = mode_rgb if mode_alpha is None else mode_alpha
303
+ self.glir.command('FUNC', 'glBlendEquationSeparate',
304
+ mode_rgb, mode_alpha)
305
+
306
+ # glScissor, glStencilFunc(Separate), glStencilMask(Separate),
307
+ # glStencilOp(Separate),
308
+
309
+ def set_scissor(self, x, y, w, h):
310
+ """Define the scissor box
311
+
312
+ Parameters
313
+ ----------
314
+ x : int
315
+ Left corner of the box.
316
+ y : int
317
+ Lower corner of the box.
318
+ w : int
319
+ The width of the box.
320
+ h : int
321
+ The height of the box.
322
+ """
323
+ self.glir.command('FUNC', 'glScissor', int(x), int(y), int(w), int(h))
324
+
325
+ def set_stencil_func(self, func='always', ref=0, mask=8,
326
+ face='front_and_back'):
327
+ """Set front or back function and reference value
328
+
329
+ Parameters
330
+ ----------
331
+ func : str
332
+ See set_stencil_func.
333
+ ref : int
334
+ Reference value for the stencil test.
335
+ mask : int
336
+ Mask that is ANDed with ref and stored stencil value.
337
+ face : str
338
+ Can be 'front', 'back', or 'front_and_back'.
339
+ """
340
+ self.glir.command('FUNC', 'glStencilFuncSeparate',
341
+ face, func, int(ref), int(mask))
342
+
343
+ def set_stencil_mask(self, mask=8, face='front_and_back'):
344
+ """Control the front or back writing of individual bits in the stencil
345
+
346
+ Parameters
347
+ ----------
348
+ mask : int
349
+ Mask that is ANDed with ref and stored stencil value.
350
+ face : str
351
+ Can be 'front', 'back', or 'front_and_back'.
352
+ """
353
+ self.glir.command('FUNC', 'glStencilMaskSeparate', face, int(mask))
354
+
355
+ def set_stencil_op(self, sfail='keep', dpfail='keep', dppass='keep',
356
+ face='front_and_back'):
357
+ """Set front or back stencil test actions
358
+
359
+ Parameters
360
+ ----------
361
+ sfail : str
362
+ Action to take when the stencil fails. Must be one of
363
+ 'keep', 'zero', 'replace', 'incr', 'incr_wrap',
364
+ 'decr', 'decr_wrap', or 'invert'.
365
+ dpfail : str
366
+ Action to take when the stencil passes.
367
+ dppass : str
368
+ Action to take when both the stencil and depth tests pass,
369
+ or when the stencil test passes and either there is no depth
370
+ buffer or depth testing is not enabled.
371
+ face : str
372
+ Can be 'front', 'back', or 'front_and_back'.
373
+ """
374
+ self.glir.command('FUNC', 'glStencilOpSeparate',
375
+ face, sfail, dpfail, dppass)
376
+
377
+ # glDepthFunc, glDepthMask, glColorMask, glSampleCoverage
378
+
379
+ def set_depth_func(self, func='less'):
380
+ """Specify the value used for depth buffer comparisons
381
+
382
+ Parameters
383
+ ----------
384
+ func : str
385
+ The depth comparison function. Must be one of 'never', 'less',
386
+ 'equal', 'lequal', 'greater', 'gequal', 'notequal', or 'always'.
387
+ """
388
+ self.glir.command('FUNC', 'glDepthFunc', func)
389
+
390
+ def set_depth_mask(self, flag):
391
+ """Toggle writing into the depth buffer
392
+
393
+ Parameters
394
+ ----------
395
+ flag : bool
396
+ Whether depth writing should be enabled.
397
+ """
398
+ self.glir.command('FUNC', 'glDepthMask', bool(flag))
399
+
400
+ def set_color_mask(self, red, green, blue, alpha):
401
+ """Toggle writing of frame buffer color components
402
+
403
+ Parameters
404
+ ----------
405
+ red : bool
406
+ Red toggle.
407
+ green : bool
408
+ Green toggle.
409
+ blue : bool
410
+ Blue toggle.
411
+ alpha : bool
412
+ Alpha toggle.
413
+ """
414
+ self.glir.command('FUNC', 'glColorMask', bool(red), bool(green),
415
+ bool(blue), bool(alpha))
416
+
417
+ def set_sample_coverage(self, value=1.0, invert=False):
418
+ """Specify multisample coverage parameters
419
+
420
+ Parameters
421
+ ----------
422
+ value : float
423
+ Sample coverage value (will be clamped between 0. and 1.).
424
+ invert : bool
425
+ Specify if the coverage masks should be inverted.
426
+ """
427
+ self.glir.command('FUNC', 'glSampleCoverage', float(value),
428
+ bool(invert))
429
+
430
+ ##########################################################################
431
+ # STATE
432
+
433
+ #
434
+ # glEnable/Disable
435
+ #
436
+
437
+ def get_state_presets(self):
438
+ """The available GL state :data:`presets <.GL_PRESETS>`.
439
+
440
+ Returns
441
+ -------
442
+ presets : dict
443
+ The dictionary of presets usable with :func:`.set_state`.
444
+ """
445
+ return deepcopy(GL_PRESETS)
446
+
447
+ def set_state(self, preset=None, **kwargs):
448
+ """Set the OpenGL rendering state, optionally using a preset.
449
+
450
+ Parameters
451
+ ----------
452
+ preset : {'opaque', 'translucent', 'additive'}, optional
453
+ A named state :data:`preset <.GL_PRESETS>` for typical use cases.
454
+
455
+ **kwargs : keyword arguments
456
+ Other supplied keyword arguments will override any preset defaults.
457
+ Options to be enabled or disabled should be supplied as booleans
458
+ (e.g., ``'depth_test=True'``, ``cull_face=False``), non-boolean
459
+ entries will be passed as arguments to ``set_*`` functions (e.g.,
460
+ ``blend_func=('src_alpha', 'one')`` will call :func:`.set_blend_func`).
461
+
462
+ Notes
463
+ -----
464
+ This serves three purposes:
465
+
466
+ 1. Set GL state using reasonable presets.
467
+ 2. Wrapping glEnable/glDisable functionality.
468
+ 3. Convienence wrapping of other ``gloo.set_*`` functions.
469
+
470
+ For example, one could do the following:
471
+
472
+ >>> from vispy import gloo
473
+ >>> gloo.set_state('translucent', depth_test=False, clear_color=(1, 1, 1, 1)) # noqa, doctest:+SKIP
474
+
475
+ This would take the preset defaults for 'translucent', turn
476
+ depth testing off (which would normally be on for that preset),
477
+ and additionally set the glClearColor parameter to be white.
478
+
479
+ Another example to showcase glEnable/glDisable wrapping:
480
+
481
+ >>> gloo.set_state(blend=True, depth_test=True, polygon_offset_fill=False) # noqa, doctest:+SKIP
482
+
483
+ This would be equivalent to calling
484
+
485
+ >>> from vispy.gloo import gl
486
+ >>> gl.glDisable(gl.GL_BLEND)
487
+ >>> gl.glEnable(gl.GL_DEPTH_TEST)
488
+ >>> gl.glEnable(gl.GL_POLYGON_OFFSET_FILL)
489
+
490
+ Or here's another example:
491
+
492
+ >>> gloo.set_state(clear_color=(0, 0, 0, 1), blend=True, blend_func=('src_alpha', 'one')) # noqa, doctest:+SKIP
493
+
494
+ Thus arbitrary GL state components can be set directly using
495
+ ``set_state``. Note that individual functions are exposed e.g.,
496
+ as ``set_clear_color``, with some more informative docstrings
497
+ about those particular functions.
498
+ """
499
+ kwargs = deepcopy(kwargs)
500
+
501
+ # Load preset, if supplied
502
+ if preset is not None:
503
+ _check_valid('preset', preset, tuple(list(GL_PRESETS.keys())))
504
+ for key, val in GL_PRESETS[preset].items():
505
+ # only overwrite user input with preset if user's input is None
506
+ if key not in kwargs:
507
+ kwargs[key] = val
508
+
509
+ # cull_face is an exception because GL_CULL_FACE, glCullFace both exist
510
+ if 'cull_face' in kwargs:
511
+ cull_face = kwargs.pop('cull_face')
512
+ if isinstance(cull_face, bool):
513
+ funcname = 'glEnable' if cull_face else 'glDisable'
514
+ self.glir.command('FUNC', funcname, 'cull_face')
515
+ else:
516
+ self.glir.command('FUNC', 'glEnable', 'cull_face')
517
+ self.set_cull_face(*_to_args(cull_face))
518
+
519
+ # Line width needs some special care ...
520
+ if 'line_width' in kwargs:
521
+ line_width = kwargs.pop('line_width')
522
+ self.glir.command('FUNC', 'glLineWidth', line_width)
523
+ if 'line_smooth' in kwargs:
524
+ line_smooth = kwargs.pop('line_smooth')
525
+ funcname = 'glEnable' if line_smooth else 'glDisable'
526
+ line_smooth_enum_value = 2848 # int(GL.GL_LINE_SMOOTH)
527
+ self.glir.command('FUNC', funcname, line_smooth_enum_value)
528
+
529
+ # Iterate over kwargs
530
+ for key, val in kwargs.items():
531
+ if key in _setters:
532
+ # Setter
533
+ args = _to_args(val)
534
+ # these actually need tuples
535
+ if key in ('blend_color', 'clear_color') and \
536
+ not isinstance(args[0], str):
537
+ args = [args]
538
+ getattr(self, 'set_' + key)(*args)
539
+ else:
540
+ # Enable / disable
541
+ funcname = 'glEnable' if val else 'glDisable'
542
+ self.glir.command('FUNC', funcname, key)
543
+
544
+ #
545
+ # glFinish, glFlush, glReadPixels, glHint
546
+ #
547
+
548
+ def finish(self):
549
+ """Wait for GL commands to to finish
550
+
551
+ This creates a GLIR command for glFinish and then processes the
552
+ GLIR commands. If the GLIR interpreter is remote (e.g. WebGL), this
553
+ function will return before GL has finished processing the commands.
554
+ """
555
+ if hasattr(self, 'flush_commands'):
556
+ context = self
557
+ else:
558
+ context = get_current_canvas().context
559
+ context.glir.command('FUNC', 'glFinish')
560
+ context.flush_commands() # Process GLIR commands
561
+
562
+ def flush(self):
563
+ """Flush GL commands
564
+
565
+ This is a wrapper for glFlush(). This also flushes the GLIR
566
+ command queue.
567
+ """
568
+ if hasattr(self, 'flush_commands'):
569
+ context = self
570
+ else:
571
+ context = get_current_canvas().context
572
+ context.glir.command('FUNC', 'glFlush')
573
+ context.flush_commands() # Process GLIR commands
574
+
575
+ def set_hint(self, target, mode):
576
+ """Set OpenGL drawing hint
577
+
578
+ Parameters
579
+ ----------
580
+ target : str
581
+ The target, e.g. 'fog_hint', 'line_smooth_hint',
582
+ 'point_smooth_hint'.
583
+ mode : str
584
+ The mode to set (e.g., 'fastest', 'nicest', 'dont_care').
585
+ """
586
+ if not all(isinstance(tm, str) for tm in (target, mode)):
587
+ raise TypeError('target and mode must both be strings')
588
+ self.glir.command('FUNC', 'glHint', target, mode)
589
+
590
+
591
+ class GlooFunctions(BaseGlooFunctions):
592
+
593
+ @property
594
+ def glir(self):
595
+ """The GLIR queue corresponding to the current canvas"""
596
+ canvas = get_current_canvas()
597
+ if canvas is None:
598
+ msg = ("If you want to use gloo without vispy.app, " +
599
+ "use a gloo.context.FakeCanvas.")
600
+ raise RuntimeError('Gloo requires a Canvas to run.\n' + msg)
601
+ return canvas.context.glir
602
+
603
+
604
+ # Create global functions object and inject names here
605
+
606
+ # GlooFunctions without queue: use queue of canvas that is current at call-time
607
+ global_gloo_functions = GlooFunctions()
608
+
609
+ for name in dir(global_gloo_functions):
610
+ if name.startswith('_') or name in ('glir'):
611
+ continue
612
+ fun = getattr(global_gloo_functions, name)
613
+ if callable(fun):
614
+ globals()[name] = fun
615
+
616
+
617
+ # Functions that do not use the glir queue
618
+
619
+
620
+ def read_pixels(viewport=None, alpha=True, mode='color', out_type='unsigned_byte'):
621
+ """Read pixels from the currently selected buffer.
622
+
623
+ Under most circumstances, this function reads from the front buffer.
624
+ Unlike all other functions in vispy.gloo, this function directly executes
625
+ an OpenGL command.
626
+
627
+ Parameters
628
+ ----------
629
+ viewport : array-like | None
630
+ 4-element list of x, y, w, h parameters. If None (default),
631
+ the current GL viewport will be queried and used.
632
+ alpha : bool
633
+ If True (default), the returned array has 4 elements (RGBA).
634
+ If False, it has 3 (RGB). This only effects the color mode.
635
+ mode : str
636
+ Type of buffer data to read. Can be one of 'colors', 'depth',
637
+ or 'stencil'. See returns for more information.
638
+ out_type : str | dtype
639
+ Can be 'unsigned_byte' or 'float'. Note that this does not
640
+ use casting, but instead determines how values are read from
641
+ the current buffer. Can also be numpy dtypes ``np.uint8``,
642
+ ``np.ubyte``, or ``np.float32``.
643
+
644
+ Returns
645
+ -------
646
+ pixels : array
647
+ 3D array of pixels in np.uint8 or np.float32 format.
648
+ The array shape is (h, w, 3) or (h, w, 4) for colors mode,
649
+ with the top-left corner of the framebuffer at index [0, 0] in the
650
+ returned array. If 'mode' is depth or stencil then the last dimension
651
+ is 1.
652
+ """
653
+ _check_valid('mode', mode, ['color', 'depth', 'stencil'])
654
+
655
+ # Check whether the GL context is direct or remote
656
+ context = get_current_canvas().context
657
+ if context.shared.parser.is_remote():
658
+ raise RuntimeError('Cannot use read_pixels() with remote GLIR parser')
659
+
660
+ finish() # noqa - finish first, also flushes GLIR commands
661
+ type_dict = {'unsigned_byte': gl.GL_UNSIGNED_BYTE,
662
+ np.uint8: gl.GL_UNSIGNED_BYTE,
663
+ 'float': gl.GL_FLOAT,
664
+ np.float32: gl.GL_FLOAT}
665
+ type_ = _check_conversion(out_type, type_dict)
666
+ if viewport is None:
667
+ viewport = gl.glGetParameter(gl.GL_VIEWPORT)
668
+ viewport = np.array(viewport, int)
669
+ if viewport.ndim != 1 or viewport.size != 4:
670
+ raise ValueError('viewport should be 1D 4-element array-like, not %s'
671
+ % (viewport,))
672
+ x, y, w, h = viewport
673
+ gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 1) # PACK, not UNPACK
674
+ if mode == 'depth':
675
+ fmt = gl.GL_DEPTH_COMPONENT
676
+ shape = (h, w, 1)
677
+ elif mode == 'stencil':
678
+ fmt = gl.GL_STENCIL_INDEX8
679
+ shape = (h, w, 1)
680
+ elif alpha:
681
+ fmt = gl.GL_RGBA
682
+ shape = (h, w, 4)
683
+ else:
684
+ fmt = gl.GL_RGB
685
+ shape = (h, w, 3)
686
+ im = gl.glReadPixels(x, y, w, h, fmt, type_)
687
+ gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 4)
688
+ # reshape, flip, and return
689
+ if not isinstance(im, np.ndarray):
690
+ np_dtype = np.uint8 if type_ == gl.GL_UNSIGNED_BYTE else np.float32
691
+ im = np.frombuffer(im, np_dtype)
692
+
693
+ im.shape = shape
694
+ im = im[::-1, ...] # flip the image
695
+ return im
696
+
697
+
698
+ def get_gl_configuration():
699
+ """Read the current gl configuration
700
+
701
+ This function uses constants that are not in the OpenGL ES 2.1
702
+ namespace, so only use this on desktop systems.
703
+
704
+ Returns
705
+ -------
706
+ config : dict
707
+ The currently active OpenGL configuration.
708
+ """
709
+ # XXX eventually maybe we can ask `gl` whether or not we can access these
710
+ gl.check_error('pre-config check')
711
+ config = dict()
712
+ canvas = get_current_canvas()
713
+ fbo = 0 if canvas is None else canvas._backend._vispy_get_fb_bind_location()
714
+ gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, fbo)
715
+ fb_param = gl.glGetFramebufferAttachmentParameter
716
+ # copied since they aren't in ES:
717
+ GL_FRONT_LEFT = 1024
718
+ GL_DEPTH = 6145
719
+ GL_STENCIL = 6146
720
+ GL_SRGB = 35904
721
+ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 33296
722
+ GL_STEREO = 3123
723
+ GL_DOUBLEBUFFER = 3122
724
+ sizes = dict(red=(GL_FRONT_LEFT, 33298),
725
+ green=(GL_FRONT_LEFT, 33299),
726
+ blue=(GL_FRONT_LEFT, 33300),
727
+ alpha=(GL_FRONT_LEFT, 33301),
728
+ depth=(GL_DEPTH, 33302),
729
+ stencil=(GL_STENCIL, 33303))
730
+ for key, val in sizes.items():
731
+ try:
732
+ param = fb_param(gl.GL_FRAMEBUFFER, val[0], val[1])
733
+ gl.check_error('post-config check')
734
+ except RuntimeError as exp:
735
+ logger.warning('Failed to get size %s: %s' % (key, exp))
736
+ else:
737
+ config[key + '_size'] = param
738
+
739
+ try:
740
+ val = fb_param(gl.GL_FRAMEBUFFER, GL_FRONT_LEFT,
741
+ GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING)
742
+ gl.check_error('post-config check')
743
+ except RuntimeError as exp:
744
+ logger.warning('Failed to get sRGB: %s' % (exp,))
745
+ else:
746
+ if val not in (gl.GL_LINEAR, GL_SRGB):
747
+ logger.warning('unknown value for SRGB: %s' % val)
748
+ else:
749
+ config['srgb'] = (val == GL_SRGB)
750
+
751
+ for key, enum in (('stereo', GL_STEREO),
752
+ ('double_buffer', GL_DOUBLEBUFFER)):
753
+ val = gl.glGetParameter(enum)
754
+ try:
755
+ gl.check_error('post-config check')
756
+ except RuntimeError as exp:
757
+ logger.warning('Failed to get %s: %s' % (key, exp))
758
+ else:
759
+ config[key] = bool(val)
760
+ config['samples'] = gl.glGetParameter(gl.GL_SAMPLES)
761
+ gl.check_error('post-config check')
762
+ return config