vispy 0.15.0__cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.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-aarch64-linux-gnu.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,699 @@
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
+ # Author: Siddharth Bhat
7
+ # -----------------------------------------------------------------------------
8
+
9
+ from functools import lru_cache
10
+
11
+ import numpy as np
12
+
13
+ from . import Visual, TextVisual, CompoundVisual, _BorderVisual
14
+ # from .border import _BorderVisual
15
+ from .shaders import Function
16
+ from ..color import get_colormap
17
+
18
+ _VERTEX_SHADER = """
19
+ attribute vec2 a_position;
20
+ attribute vec2 a_texcoord;
21
+ varying vec2 v_texcoord;
22
+
23
+ void main() {
24
+ v_texcoord = a_texcoord;
25
+ gl_Position = $transform(vec4(a_position, 0, 1));
26
+ }
27
+ """ # noqa
28
+
29
+ _FRAGMENT_SHADER = """
30
+ varying vec2 v_texcoord;
31
+
32
+ void main()
33
+ {
34
+ // depending on orientation, we either use the x component or the inverted
35
+ // y component for texcoords
36
+ // (we get the texcoords inverted (with respect to the colormap)
37
+ // so let's invert it to make sure that the colorbar renders correctly)
38
+ vec4 mapped_color = $color_transform($orient_texcoord(v_texcoord));
39
+ gl_FragColor = mapped_color;
40
+ }
41
+ """ # noqa
42
+
43
+
44
+ class _CoreColorBarVisual(Visual):
45
+ """
46
+ Visual subclass that actually renders the ColorBar.
47
+
48
+ Parameters
49
+ ----------
50
+ pos : tuple (x, y)
51
+ Position where the colorbar is to be placed with
52
+ respect to the center of the colorbar
53
+ halfdim : tuple (half_width, half_height)
54
+ Half the dimensions of the colorbar measured
55
+ from the center. That way, the total dimensions
56
+ of the colorbar is (x - half_width) to (x + half_width)
57
+ and (y - half_height) to (y + half_height)
58
+ cmap : str | vispy.color.ColorMap
59
+ Either the name of the ColorMap to be used from the standard
60
+ set of names (refer to `vispy.color.get_colormap`),
61
+ or a custom ColorMap object.
62
+ The ColorMap is used to apply a gradient on the colorbar.
63
+ orientation : {'left', 'right', 'top', 'bottom'}
64
+ The orientation of the colorbar, used for rendering. The
65
+ orientation can be thought of as the position of the label
66
+ relative to the color bar.
67
+
68
+ Note
69
+ ----
70
+ This is purely internal.
71
+ Externally, the ColorBarVisual must be used.
72
+ This class was separated out to encapsulate rendering information
73
+ That way, ColorBar simply becomes a CompoundVisual
74
+
75
+ See Also
76
+ --------
77
+ vispy.visuals.ColorBarVisual
78
+ """
79
+
80
+ _shaders = {
81
+ 'vertex': _VERTEX_SHADER,
82
+ 'fragment': _FRAGMENT_SHADER,
83
+ }
84
+
85
+ def __init__(self, pos, halfdim,
86
+ cmap,
87
+ orientation,
88
+ **kwargs):
89
+
90
+ self._check_orientation(orientation)
91
+ self._cmap = get_colormap(cmap)
92
+ self._pos = pos
93
+ self._halfdim = halfdim
94
+ self._orientation = orientation
95
+
96
+ Visual.__init__(self, vcode=self._shaders['vertex'], fcode=self._shaders['fragment'])
97
+
98
+ texcoord_func = self._get_texcoord_func(orientation)
99
+ self.shared_program.frag['orient_texcoord'] = texcoord_func
100
+
101
+ tex_coords = np.array([[0, 0], [1, 0], [1, 1],
102
+ [0, 0], [1, 1], [0, 1]],
103
+ dtype=np.float32)
104
+
105
+ glsl_map_fn = Function(self._cmap.glsl_map)
106
+
107
+ self.shared_program.frag['color_transform'] = glsl_map_fn
108
+ self.shared_program['a_texcoord'] = tex_coords.astype(np.float32)
109
+
110
+ self._update()
111
+
112
+ def _update(self):
113
+ """Rebuilds the shaders, and repositions the objects that are used internally by the ColorBarVisual"""
114
+ x, y = self._pos
115
+ halfw, halfh = self._halfdim
116
+
117
+ # test that width and height are non-zero
118
+ if halfw <= 0:
119
+ raise ValueError("half-width must be positive and non-zero"
120
+ ", not %s" % halfw)
121
+ if halfh <= 0:
122
+ raise ValueError("half-height must be positive and non-zero"
123
+ ", not %s" % halfh)
124
+
125
+ # test that the given width and height is consistent
126
+ # with the orientation
127
+ if (self._orientation == "bottom" or self._orientation == "top"):
128
+ if halfw < halfh:
129
+ raise ValueError("half-width(%s) < half-height(%s) for"
130
+ "%s orientation,"
131
+ " expected half-width >= half-height" %
132
+ (halfw, halfh, self._orientation, ))
133
+ else: # orientation == left or orientation == right
134
+ if halfw > halfh:
135
+ raise ValueError("half-width(%s) > half-height(%s) for"
136
+ "%s orientation,"
137
+ " expected half-width <= half-height" %
138
+ (halfw, halfh, self._orientation, ))
139
+
140
+ # Set up the attributes that the shaders require
141
+ vertices = np.array([[x - halfw, y - halfh],
142
+ [x + halfw, y - halfh],
143
+ [x + halfw, y + halfh],
144
+ # tri 2
145
+ [x - halfw, y - halfh],
146
+ [x + halfw, y + halfh],
147
+ [x - halfw, y + halfh]],
148
+ dtype=np.float32)
149
+
150
+ self.shared_program['a_position'] = vertices
151
+
152
+ self.shared_program['texture2D_LUT'] = self._cmap.texture_lut()
153
+
154
+ @staticmethod
155
+ @lru_cache(maxsize=4)
156
+ def _get_texcoord_func(orientation):
157
+ if orientation == "top" or orientation == "bottom":
158
+ func = Function("""
159
+ float orient_texcoord(vec2 texcoord) {
160
+ return texcoord.x;
161
+ }
162
+ """)
163
+ elif orientation == "left" or orientation == "right":
164
+ func = Function("""
165
+ float orient_texcoord(vec2 texcoord) {
166
+ return 1 - texcoord.y;
167
+ }
168
+ """)
169
+ return func
170
+
171
+ @staticmethod
172
+ def _check_orientation(orientation):
173
+ if orientation not in ('top', 'bottom', 'left', 'right'):
174
+ raise ValueError("orientation must"
175
+ " be one of 'top', 'bottom', "
176
+ "'left', or 'right', "
177
+ "not '%s'" % (orientation, ))
178
+
179
+ @property
180
+ def pos(self):
181
+ return self._pos
182
+
183
+ @pos.setter
184
+ def pos(self, pos):
185
+ self._pos = pos
186
+ self._update()
187
+
188
+ @property
189
+ def halfdim(self):
190
+ return self._halfdim
191
+
192
+ @halfdim.setter
193
+ def halfdim(self, halfdim):
194
+ self._halfdim = halfdim
195
+
196
+ @property
197
+ def cmap(self):
198
+ """The colormap of the Colorbar"""
199
+ return self._cmap
200
+
201
+ @cmap.setter
202
+ def cmap(self, cmap):
203
+ self._cmap = get_colormap(cmap)
204
+ self._program.frag['color_transform'] = Function(self._cmap.glsl_map)
205
+
206
+ @staticmethod
207
+ def _prepare_transforms(view):
208
+ # figure out padding by considering the entire transform
209
+ # on the width and height
210
+ program = view.view_program
211
+ total_transform = view.transforms.get_transform()
212
+ program.vert['transform'] = total_transform
213
+
214
+ def _prepare_draw(self, view):
215
+ self._draw_mode = "triangles"
216
+ return True
217
+
218
+
219
+ class ColorBarVisual(CompoundVisual):
220
+ """Visual subclass displaying a colorbar
221
+
222
+ Parameters
223
+ ----------
224
+ cmap : str | vispy.color.ColorMap
225
+ Either the name of the ColorMap to be used from the standard
226
+ set of names (refer to `vispy.color.get_colormap`),
227
+ or a custom ColorMap object.
228
+ The ColorMap is used to apply a gradient on the colorbar.
229
+ orientation : {'left', 'right', 'top', 'bottom'}
230
+ The orientation of the colorbar, used for rendering. The
231
+ orientation can be thought of as the position of the label
232
+ relative to the color bar.
233
+
234
+ When the orientation is 'left' or 'right', the colorbar is
235
+ vertically placed. When it is 'top' or 'bottom', the colorbar is
236
+ horizontally placed.
237
+
238
+ * 'top': the colorbar is horizontal.
239
+ Color is applied from left to right.
240
+ Minimum corresponds to left and maximum to right.
241
+ Label is to the top of the colorbar
242
+
243
+ * 'bottom': Same as top, except that
244
+ label is to the bottom of the colorbar
245
+
246
+ * 'left': the colorbar is vertical.
247
+ Color is applied from bottom to top.
248
+ Minimum corresponds to bottom and maximum to top.
249
+ Label is to the left of the colorbar
250
+
251
+ * 'right': Same as left, except that the
252
+ label is placed to the right of the colorbar
253
+
254
+ size : (major_axis_length, minor_axis_length)
255
+ lengths with respect to the major and minor axes.
256
+ The minor axis is the shorter axis, while the major axis is
257
+ the longer axis with respect to the orientation
258
+
259
+ For orientations 'top' and 'bottom', the major axis is
260
+ along the length.
261
+
262
+ For orientations 'left' and 'right', the major axis is
263
+ along the breadth
264
+ pos : tuple (x, y)
265
+ Position where the colorbar is to be placed with
266
+ respect to the center of the colorbar
267
+ label : str | vispy.visuals.TextVisual
268
+ The label that is to be drawn with the colorbar
269
+ that provides information about the colorbar.
270
+ If a TextVisual object then 'label_color' is ignored.
271
+ label_color : str | vispy.color.Color
272
+ The color of the label and tick labels. This can either be a
273
+ str as the color's name or an actual instace of a vipy.color.Color
274
+ clim : tuple (min, max)
275
+ the minimum and maximum values of the data that
276
+ is given to the colorbar. This is used to draw the scale
277
+ on the side of the colorbar.
278
+ border_width : float (in px)
279
+ The width of the border the colormap should have. This measurement
280
+ is given in pixels
281
+ border_color : str | vispy.color.Color
282
+ The color of the border of the colormap. This can either be a
283
+ str as the color's name or an actual instace of a vipy.color.Color
284
+
285
+ .. versionchanged:: 0.7
286
+
287
+ Keyword argument ``label_str`` renamed to `label`.
288
+
289
+ """
290
+
291
+ # The padding multiplier that's used to place the text
292
+ # next to the Colorbar. Makes sure the text isn't
293
+ # visually "sticking" to the Colorbar
294
+ text_padding_factor = 1.05
295
+
296
+ def __init__(self, cmap, orientation, size,
297
+ pos=[0, 0],
298
+ label="",
299
+ label_color='black',
300
+ clim=(0.0, 1.0),
301
+ border_width=1.0,
302
+ border_color="black"):
303
+
304
+ _CoreColorBarVisual._check_orientation(orientation)
305
+ self._cmap = get_colormap(cmap)
306
+ self._clim = clim
307
+ self._pos = pos
308
+ self._size = size
309
+ self._orientation = orientation
310
+
311
+ if not isinstance(label, TextVisual):
312
+ label = TextVisual(label, color=label_color)
313
+ self._label = label
314
+
315
+ self._ticks = []
316
+ self._ticks.append(TextVisual(str(self._clim[0]),
317
+ color=label_color))
318
+ self._ticks.append(TextVisual(str(self._clim[1]),
319
+ color=label_color))
320
+
321
+ if orientation in ["top", "bottom"]:
322
+ (width, height) = size
323
+ elif orientation in ["left", "right"]:
324
+ (height, width) = size
325
+
326
+ self._halfdim = (width * 0.5, height * 0.5)
327
+
328
+ self._colorbar = _CoreColorBarVisual(pos, self._halfdim,
329
+ cmap, orientation)
330
+
331
+ self._border = _BorderVisual(pos, self._halfdim,
332
+ border_width, border_color)
333
+
334
+ CompoundVisual.__init__(self, [self._colorbar,
335
+ self._border,
336
+ self._ticks[0],
337
+ self._ticks[1],
338
+ self._label,
339
+ ])
340
+ self._update()
341
+
342
+ def _update(self):
343
+ """Rebuilds the shaders, and repositions the objects that are used internally by the ColorBarVisual"""
344
+ self._colorbar.halfdim = self._halfdim
345
+ self._border.halfdim = self._halfdim
346
+
347
+ self._ticks[0].text = str(self._clim[0])
348
+ self._ticks[1].text = str(self._clim[1])
349
+
350
+ self._update_positions()
351
+
352
+ self._colorbar._update()
353
+ self._border._update()
354
+
355
+ def _update_positions(self):
356
+ """Updates the positions of the colorbars and labels"""
357
+ self._colorbar.pos = self._pos
358
+ self._border.pos = self._pos
359
+
360
+ if self._orientation == "right" or self._orientation == "left":
361
+ self._label.rotation = -90
362
+
363
+ x, y = self._pos
364
+ halfw, halfh = self._halfdim
365
+
366
+ label_anchors = \
367
+ ColorBarVisual._get_label_anchors(center=self._pos,
368
+ halfdim=self._halfdim,
369
+ orientation=self._orientation,
370
+ transforms=self.label.transforms)
371
+ self._label.anchors = label_anchors
372
+
373
+ ticks_anchors = \
374
+ ColorBarVisual._get_ticks_anchors(center=self._pos,
375
+ halfdim=self._halfdim,
376
+ orientation=self._orientation,
377
+ transforms=self.label.transforms)
378
+
379
+ self._ticks[0].anchors = ticks_anchors
380
+ self._ticks[1].anchors = ticks_anchors
381
+
382
+ (label_pos, ticks_pos) = \
383
+ ColorBarVisual._calc_positions(center=self._pos,
384
+ halfdim=self._halfdim,
385
+ border_width=self.border_width,
386
+ orientation=self._orientation,
387
+ transforms=self.transforms)
388
+
389
+ self._label.pos = label_pos
390
+ self._ticks[0].pos = ticks_pos[0]
391
+ self._ticks[1].pos = ticks_pos[1]
392
+
393
+ @staticmethod
394
+ def _get_label_anchors(center, halfdim, orientation, transforms):
395
+ visual_to_doc = transforms.get_transform('visual', 'document')
396
+
397
+ doc_x = visual_to_doc.map(np.array([1, 0, 0, 0], dtype=np.float32))
398
+ doc_y = visual_to_doc.map(np.array([0, 1, 0, 0], dtype=np.float32))
399
+
400
+ if doc_x[0] < 0:
401
+ doc_x *= -1
402
+
403
+ if doc_y[1] < 0:
404
+ doc_y *= -1
405
+
406
+ # NOTE: these are in document coordinates
407
+ if orientation == "bottom":
408
+ perp_direction = doc_y
409
+ elif orientation == "top":
410
+ perp_direction = -doc_y
411
+ elif orientation == "left":
412
+ perp_direction = -doc_x
413
+ elif orientation == "right":
414
+ perp_direction = doc_x
415
+
416
+ perp_direction = np.array(perp_direction, dtype=np.float32)
417
+ perp_direction /= np.linalg.norm(perp_direction)
418
+
419
+ # rotate axes by -90 degrees to mimic label's rotation
420
+ if orientation in ["left", "right"]:
421
+ x = perp_direction[0]
422
+ y = perp_direction[1]
423
+
424
+ perp_direction[0] = -y
425
+ perp_direction[1] = x
426
+
427
+ # use the document (pixel) coord system to set text anchors
428
+ anchors = []
429
+ if perp_direction[0] < 0:
430
+ anchors.append('right')
431
+ elif perp_direction[0] > 0:
432
+ anchors.append('left')
433
+ else:
434
+ anchors.append('center')
435
+ if perp_direction[1] < 0:
436
+ anchors.append('bottom')
437
+ elif perp_direction[1] > 0:
438
+ anchors.append('top')
439
+ else:
440
+ anchors.append('middle')
441
+
442
+ return anchors
443
+
444
+ @staticmethod
445
+ def _get_ticks_anchors(center, halfdim, orientation, transforms):
446
+ visual_to_doc = transforms.get_transform('visual', 'document')
447
+
448
+ doc_x = visual_to_doc.map(np.array([1, 0, 0, 0], dtype=np.float32))
449
+ doc_y = visual_to_doc.map(np.array([0, 1, 0, 0], dtype=np.float32))
450
+
451
+ if doc_x[0] < 0:
452
+ doc_x *= -1
453
+
454
+ if doc_y[1] < 0:
455
+ doc_y *= -1
456
+
457
+ # NOTE: these are in document coordinates
458
+ if orientation == "bottom":
459
+ perp_direction = doc_y
460
+ elif orientation == "top":
461
+ perp_direction = -doc_y
462
+ elif orientation == "left":
463
+ perp_direction = -doc_x
464
+ elif orientation == "right":
465
+ perp_direction = doc_x
466
+
467
+ perp_direction = np.array(perp_direction, dtype=np.float32)
468
+ perp_direction /= np.linalg.norm(perp_direction)
469
+
470
+ # use the document (pixel) coord system to set text anchors
471
+ anchors = []
472
+ if perp_direction[0] < 0:
473
+ anchors.append('right')
474
+ elif perp_direction[0] > 0:
475
+ anchors.append('left')
476
+ else:
477
+ anchors.append('center')
478
+ if perp_direction[1] < 0:
479
+ anchors.append('bottom')
480
+ elif perp_direction[1] > 0:
481
+ anchors.append('top')
482
+ else:
483
+ anchors.append('middle')
484
+
485
+ return anchors
486
+
487
+ @staticmethod
488
+ def _calc_positions(center, halfdim, border_width,
489
+ orientation, transforms):
490
+ """
491
+ Calculate the text centeritions given the ColorBar
492
+ parameters.
493
+
494
+ Note
495
+ ----
496
+ This is static because in principle, this
497
+ function does not need access to the state of the ColorBar
498
+ at all. It's a computation function that computes coordinate
499
+ transforms
500
+
501
+ Parameters
502
+ ----------
503
+ center: tuple (x, y)
504
+ Center of the ColorBar
505
+ halfdim: tuple (halfw, halfh)
506
+ Half of the dimensions measured from the center
507
+ border_width: float
508
+ Width of the border of the ColorBar
509
+ orientation: "top" | "bottom" | "left" | "right"
510
+ Position of the label with respect to the ColorBar
511
+ transforms: TransformSystem
512
+ the transforms of the ColorBar
513
+ """
514
+ (x, y) = center
515
+ (halfw, halfh) = halfdim
516
+
517
+ visual_to_doc = transforms.get_transform('visual', 'document')
518
+ doc_to_visual = transforms.get_transform('document', 'visual')
519
+
520
+ # doc_widths = visual_to_doc.map(np.array([halfw, halfh, 0, 0],
521
+ # dtype=np.float32))
522
+
523
+ doc_x = visual_to_doc.map(np.array([halfw, 0, 0, 0], dtype=np.float32))
524
+ doc_y = visual_to_doc.map(np.array([0, halfh, 0, 0], dtype=np.float32))
525
+
526
+ if doc_x[0] < 0:
527
+ doc_x *= -1
528
+
529
+ if doc_y[1] < 0:
530
+ doc_y *= -1
531
+
532
+ # doc_halfw = np.abs(doc_widths[0])
533
+ # doc_halfh = np.abs(doc_widths[1])
534
+
535
+ if orientation == "top":
536
+ doc_perp_vector = -doc_y
537
+ elif orientation == "bottom":
538
+ doc_perp_vector = doc_y
539
+ elif orientation == "left":
540
+ doc_perp_vector = -doc_x
541
+ if orientation == "right":
542
+ doc_perp_vector = doc_x
543
+
544
+ perp_len = np.linalg.norm(doc_perp_vector)
545
+ doc_perp_vector /= perp_len
546
+ perp_len += border_width
547
+ perp_len += 5 # pixels
548
+ perp_len *= ColorBarVisual.text_padding_factor
549
+ doc_perp_vector *= perp_len
550
+
551
+ doc_center = visual_to_doc.map(np.array([x, y, 0, 0],
552
+ dtype=np.float32))
553
+ doc_label_pos = doc_center + doc_perp_vector
554
+ visual_label_pos = doc_to_visual.map(doc_label_pos)[:3]
555
+
556
+ # next, calculate tick positions
557
+ if orientation in ["top", "bottom"]:
558
+ doc_ticks_pos = [doc_label_pos - doc_x,
559
+ doc_label_pos + doc_x]
560
+ else:
561
+ doc_ticks_pos = [doc_label_pos + doc_y,
562
+ doc_label_pos - doc_y]
563
+
564
+ visual_ticks_pos = []
565
+ visual_ticks_pos.append(doc_to_visual.map(doc_ticks_pos[0])[:3])
566
+ visual_ticks_pos.append(doc_to_visual.map(doc_ticks_pos[1])[:3])
567
+
568
+ return (visual_label_pos, visual_ticks_pos)
569
+
570
+ @property
571
+ def pos(self):
572
+ """The position of the text anchor in the local coordinate frame"""
573
+ return self._pos
574
+
575
+ @pos.setter
576
+ def pos(self, pos):
577
+ self._pos = pos
578
+ self._update_positions()
579
+
580
+ @property
581
+ def cmap(self):
582
+ """The colormap of the Colorbar"""
583
+ return self._colorbar._cmap
584
+
585
+ @cmap.setter
586
+ def cmap(self, cmap):
587
+ self._colorbar.cmap = cmap
588
+
589
+ @property
590
+ def clim(self):
591
+ """The data limits of the Colorbar
592
+
593
+ Returns
594
+ -------
595
+ clim: tuple(min, max)
596
+ """
597
+ return self._clim
598
+
599
+ @clim.setter
600
+ def clim(self, clim):
601
+ self._clim = clim
602
+ self._update()
603
+
604
+ @property
605
+ def label(self):
606
+ """The vispy.visuals.TextVisual associated with the label"""
607
+ return self._label
608
+
609
+ @label.setter
610
+ def label(self, label):
611
+ if isinstance(label, TextVisual):
612
+ self._label = label
613
+ else:
614
+ self._label.text = label
615
+ self._update()
616
+
617
+ @property
618
+ def ticks(self):
619
+ """The vispy.visuals.TextVisual associated with the ticks
620
+
621
+ Returns
622
+ -------
623
+ ticks: [vispy.visual.TextVisual]
624
+ The array is of length 2
625
+ """
626
+ return self._ticks
627
+
628
+ @ticks.setter
629
+ def ticks(self, ticks):
630
+ self._ticks = ticks
631
+ self._update()
632
+
633
+ @property
634
+ def border_width(self):
635
+ """The width of the border around the ColorBar in pixels"""
636
+ return self._border.border_width
637
+
638
+ @border_width.setter
639
+ def border_width(self, border_width):
640
+ self._border.border_width = border_width
641
+ self._update()
642
+
643
+ @property
644
+ def border_color(self):
645
+ """The color of the border around the ColorBar in pixels"""
646
+ return self._border.border_color
647
+
648
+ @border_color.setter
649
+ def border_color(self, border_color):
650
+ self._border.border_color = border_color
651
+ self._update()
652
+
653
+ @property
654
+ def orientation(self):
655
+ """The orientation of the ColorBar"""
656
+ return self._orientation
657
+
658
+ @property
659
+ def size(self):
660
+ """The size of the ColorBar
661
+
662
+ Returns
663
+ -------
664
+ size: (major_axis_length, minor_axis_length)
665
+ major and minor axis are defined by the
666
+ orientation of the ColorBar
667
+ """
668
+ (halfw, halfh) = self._halfdim
669
+ if self.orientation in ["top", "bottom"]:
670
+ return (halfw * 2., halfh * 2.)
671
+ else:
672
+ return (halfh * 2., halfw * 2.)
673
+
674
+ @size.setter
675
+ def size(self, size):
676
+ if size[0] < size[1]:
677
+ raise ValueError("Major axis must be greater than or equal to "
678
+ "Minor axis. Given "
679
+ "Major axis: (%s) < Minor axis (%s)" % (size[0],
680
+ size[1]))
681
+
682
+ if self.orientation in ["top", "bottom"]:
683
+ (width, height) = size
684
+ else:
685
+ (height, width) = size
686
+
687
+ if width < 0.:
688
+ raise ValueError("width must be non-negative, not %s " % (width, ))
689
+ elif width == 0.:
690
+ raise ValueError("width must be non-zero, not %s" % (width, ))
691
+
692
+ if height < 0.:
693
+ raise ValueError("height must be non-negative, not %s " %
694
+ (height, ))
695
+ elif height == 0.:
696
+ raise ValueError("height must be non-zero, not %s" % (height, ))
697
+
698
+ self._halfdim = (width / 2., height / 2.)
699
+ self._update()