vispy 0.15.0__cp313-cp313-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 (521) hide show
  1. vispy/__init__.py +33 -0
  2. vispy/app/__init__.py +15 -0
  3. vispy/app/_default_app.py +76 -0
  4. vispy/app/_detect_eventloop.py +148 -0
  5. vispy/app/application.py +263 -0
  6. vispy/app/backends/__init__.py +52 -0
  7. vispy/app/backends/_egl.py +264 -0
  8. vispy/app/backends/_glfw.py +513 -0
  9. vispy/app/backends/_jupyter_rfb.py +278 -0
  10. vispy/app/backends/_offscreen_util.py +121 -0
  11. vispy/app/backends/_osmesa.py +235 -0
  12. vispy/app/backends/_pyglet.py +451 -0
  13. vispy/app/backends/_pyqt4.py +36 -0
  14. vispy/app/backends/_pyqt5.py +36 -0
  15. vispy/app/backends/_pyqt6.py +40 -0
  16. vispy/app/backends/_pyside.py +37 -0
  17. vispy/app/backends/_pyside2.py +52 -0
  18. vispy/app/backends/_pyside6.py +53 -0
  19. vispy/app/backends/_qt.py +1003 -0
  20. vispy/app/backends/_sdl2.py +444 -0
  21. vispy/app/backends/_template.py +244 -0
  22. vispy/app/backends/_test.py +8 -0
  23. vispy/app/backends/_tk.py +800 -0
  24. vispy/app/backends/_wx.py +476 -0
  25. vispy/app/backends/tests/__init__.py +0 -0
  26. vispy/app/backends/tests/test_offscreen_util.py +52 -0
  27. vispy/app/backends/tests/test_rfb.py +77 -0
  28. vispy/app/base.py +294 -0
  29. vispy/app/canvas.py +828 -0
  30. vispy/app/qt.py +92 -0
  31. vispy/app/tests/__init__.py +0 -0
  32. vispy/app/tests/qt-designer.ui +58 -0
  33. vispy/app/tests/test_app.py +442 -0
  34. vispy/app/tests/test_backends.py +164 -0
  35. vispy/app/tests/test_canvas.py +122 -0
  36. vispy/app/tests/test_context.py +92 -0
  37. vispy/app/tests/test_qt.py +47 -0
  38. vispy/app/tests/test_simultaneous.py +134 -0
  39. vispy/app/timer.py +174 -0
  40. vispy/color/__init__.py +17 -0
  41. vispy/color/_color_dict.py +193 -0
  42. vispy/color/color_array.py +447 -0
  43. vispy/color/color_space.py +181 -0
  44. vispy/color/colormap.py +1213 -0
  45. vispy/color/tests/__init__.py +0 -0
  46. vispy/color/tests/test_color.py +378 -0
  47. vispy/conftest.py +12 -0
  48. vispy/ext/__init__.py +0 -0
  49. vispy/ext/cocoapy.py +1522 -0
  50. vispy/ext/cubehelix.py +138 -0
  51. vispy/ext/egl.py +375 -0
  52. vispy/ext/fontconfig.py +118 -0
  53. vispy/ext/gdi32plus.py +206 -0
  54. vispy/ext/osmesa.py +105 -0
  55. vispy/geometry/__init__.py +23 -0
  56. vispy/geometry/_triangulation_debugger.py +171 -0
  57. vispy/geometry/calculations.py +162 -0
  58. vispy/geometry/curves.py +399 -0
  59. vispy/geometry/generation.py +643 -0
  60. vispy/geometry/isocurve.py +175 -0
  61. vispy/geometry/isosurface.py +465 -0
  62. vispy/geometry/meshdata.py +700 -0
  63. vispy/geometry/normals.py +78 -0
  64. vispy/geometry/parametric.py +56 -0
  65. vispy/geometry/polygon.py +137 -0
  66. vispy/geometry/rect.py +210 -0
  67. vispy/geometry/tests/__init__.py +0 -0
  68. vispy/geometry/tests/test_calculations.py +23 -0
  69. vispy/geometry/tests/test_generation.py +56 -0
  70. vispy/geometry/tests/test_meshdata.py +106 -0
  71. vispy/geometry/tests/test_triangulation.py +594 -0
  72. vispy/geometry/torusknot.py +142 -0
  73. vispy/geometry/triangulation.py +876 -0
  74. vispy/gloo/__init__.py +56 -0
  75. vispy/gloo/buffer.py +505 -0
  76. vispy/gloo/context.py +272 -0
  77. vispy/gloo/framebuffer.py +257 -0
  78. vispy/gloo/gl/__init__.py +234 -0
  79. vispy/gloo/gl/_constants.py +332 -0
  80. vispy/gloo/gl/_es2.py +986 -0
  81. vispy/gloo/gl/_gl2.py +1365 -0
  82. vispy/gloo/gl/_proxy.py +499 -0
  83. vispy/gloo/gl/_pyopengl2.py +362 -0
  84. vispy/gloo/gl/dummy.py +24 -0
  85. vispy/gloo/gl/es2.py +62 -0
  86. vispy/gloo/gl/gl2.py +98 -0
  87. vispy/gloo/gl/glplus.py +168 -0
  88. vispy/gloo/gl/pyopengl2.py +97 -0
  89. vispy/gloo/gl/tests/__init__.py +0 -0
  90. vispy/gloo/gl/tests/test_basics.py +282 -0
  91. vispy/gloo/gl/tests/test_functionality.py +568 -0
  92. vispy/gloo/gl/tests/test_names.py +246 -0
  93. vispy/gloo/gl/tests/test_use.py +71 -0
  94. vispy/gloo/glir.py +1824 -0
  95. vispy/gloo/globject.py +101 -0
  96. vispy/gloo/preprocessor.py +67 -0
  97. vispy/gloo/program.py +543 -0
  98. vispy/gloo/tests/__init__.py +0 -0
  99. vispy/gloo/tests/test_buffer.py +558 -0
  100. vispy/gloo/tests/test_context.py +119 -0
  101. vispy/gloo/tests/test_framebuffer.py +195 -0
  102. vispy/gloo/tests/test_glir.py +307 -0
  103. vispy/gloo/tests/test_globject.py +35 -0
  104. vispy/gloo/tests/test_program.py +302 -0
  105. vispy/gloo/tests/test_texture.py +732 -0
  106. vispy/gloo/tests/test_use_gloo.py +187 -0
  107. vispy/gloo/tests/test_util.py +60 -0
  108. vispy/gloo/tests/test_wrappers.py +261 -0
  109. vispy/gloo/texture.py +1046 -0
  110. vispy/gloo/util.py +129 -0
  111. vispy/gloo/wrappers.py +762 -0
  112. vispy/glsl/__init__.py +42 -0
  113. vispy/glsl/antialias/antialias.glsl +7 -0
  114. vispy/glsl/antialias/cap-butt.glsl +31 -0
  115. vispy/glsl/antialias/cap-round.glsl +29 -0
  116. vispy/glsl/antialias/cap-square.glsl +30 -0
  117. vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
  118. vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
  119. vispy/glsl/antialias/cap.glsl +67 -0
  120. vispy/glsl/antialias/caps.glsl +67 -0
  121. vispy/glsl/antialias/filled.glsl +50 -0
  122. vispy/glsl/antialias/outline.glsl +40 -0
  123. vispy/glsl/antialias/stroke.glsl +43 -0
  124. vispy/glsl/arrowheads/angle.glsl +99 -0
  125. vispy/glsl/arrowheads/arrowheads.frag +60 -0
  126. vispy/glsl/arrowheads/arrowheads.glsl +12 -0
  127. vispy/glsl/arrowheads/arrowheads.vert +83 -0
  128. vispy/glsl/arrowheads/curved.glsl +48 -0
  129. vispy/glsl/arrowheads/inhibitor.glsl +26 -0
  130. vispy/glsl/arrowheads/stealth.glsl +46 -0
  131. vispy/glsl/arrowheads/triangle.glsl +97 -0
  132. vispy/glsl/arrowheads/util.glsl +13 -0
  133. vispy/glsl/arrows/angle-30.glsl +12 -0
  134. vispy/glsl/arrows/angle-60.glsl +12 -0
  135. vispy/glsl/arrows/angle-90.glsl +12 -0
  136. vispy/glsl/arrows/arrow.frag +39 -0
  137. vispy/glsl/arrows/arrow.vert +49 -0
  138. vispy/glsl/arrows/arrows.glsl +17 -0
  139. vispy/glsl/arrows/common.glsl +187 -0
  140. vispy/glsl/arrows/curved.glsl +63 -0
  141. vispy/glsl/arrows/stealth.glsl +50 -0
  142. vispy/glsl/arrows/triangle-30.glsl +12 -0
  143. vispy/glsl/arrows/triangle-60.glsl +12 -0
  144. vispy/glsl/arrows/triangle-90.glsl +12 -0
  145. vispy/glsl/arrows/util.glsl +98 -0
  146. vispy/glsl/build_spatial_filters.py +660 -0
  147. vispy/glsl/collections/agg-fast-path.frag +20 -0
  148. vispy/glsl/collections/agg-fast-path.vert +78 -0
  149. vispy/glsl/collections/agg-glyph.frag +60 -0
  150. vispy/glsl/collections/agg-glyph.vert +33 -0
  151. vispy/glsl/collections/agg-marker.frag +35 -0
  152. vispy/glsl/collections/agg-marker.vert +48 -0
  153. vispy/glsl/collections/agg-path.frag +55 -0
  154. vispy/glsl/collections/agg-path.vert +166 -0
  155. vispy/glsl/collections/agg-point.frag +21 -0
  156. vispy/glsl/collections/agg-point.vert +35 -0
  157. vispy/glsl/collections/agg-segment.frag +32 -0
  158. vispy/glsl/collections/agg-segment.vert +75 -0
  159. vispy/glsl/collections/marker.frag +38 -0
  160. vispy/glsl/collections/marker.vert +48 -0
  161. vispy/glsl/collections/raw-path.frag +15 -0
  162. vispy/glsl/collections/raw-path.vert +24 -0
  163. vispy/glsl/collections/raw-point.frag +14 -0
  164. vispy/glsl/collections/raw-point.vert +31 -0
  165. vispy/glsl/collections/raw-segment.frag +18 -0
  166. vispy/glsl/collections/raw-segment.vert +26 -0
  167. vispy/glsl/collections/raw-triangle.frag +13 -0
  168. vispy/glsl/collections/raw-triangle.vert +26 -0
  169. vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
  170. vispy/glsl/collections/sdf-glyph.frag +80 -0
  171. vispy/glsl/collections/sdf-glyph.vert +59 -0
  172. vispy/glsl/collections/tick-labels.vert +71 -0
  173. vispy/glsl/colormaps/autumn.glsl +20 -0
  174. vispy/glsl/colormaps/blues.glsl +20 -0
  175. vispy/glsl/colormaps/color-space.glsl +17 -0
  176. vispy/glsl/colormaps/colormaps.glsl +24 -0
  177. vispy/glsl/colormaps/cool.glsl +20 -0
  178. vispy/glsl/colormaps/fire.glsl +21 -0
  179. vispy/glsl/colormaps/gray.glsl +20 -0
  180. vispy/glsl/colormaps/greens.glsl +20 -0
  181. vispy/glsl/colormaps/hot.glsl +22 -0
  182. vispy/glsl/colormaps/ice.glsl +20 -0
  183. vispy/glsl/colormaps/icefire.glsl +23 -0
  184. vispy/glsl/colormaps/parse.py +40 -0
  185. vispy/glsl/colormaps/reds.glsl +20 -0
  186. vispy/glsl/colormaps/spring.glsl +20 -0
  187. vispy/glsl/colormaps/summer.glsl +20 -0
  188. vispy/glsl/colormaps/user.glsl +22 -0
  189. vispy/glsl/colormaps/util.glsl +41 -0
  190. vispy/glsl/colormaps/wheel.glsl +21 -0
  191. vispy/glsl/colormaps/winter.glsl +20 -0
  192. vispy/glsl/lines/agg.frag +320 -0
  193. vispy/glsl/lines/agg.vert +241 -0
  194. vispy/glsl/markers/arrow.glsl +12 -0
  195. vispy/glsl/markers/asterisk.glsl +16 -0
  196. vispy/glsl/markers/chevron.glsl +14 -0
  197. vispy/glsl/markers/clover.glsl +20 -0
  198. vispy/glsl/markers/club.glsl +31 -0
  199. vispy/glsl/markers/cross.glsl +17 -0
  200. vispy/glsl/markers/diamond.glsl +12 -0
  201. vispy/glsl/markers/disc.glsl +9 -0
  202. vispy/glsl/markers/ellipse.glsl +67 -0
  203. vispy/glsl/markers/hbar.glsl +9 -0
  204. vispy/glsl/markers/heart.glsl +15 -0
  205. vispy/glsl/markers/infinity.glsl +15 -0
  206. vispy/glsl/markers/marker-sdf.frag +74 -0
  207. vispy/glsl/markers/marker-sdf.vert +41 -0
  208. vispy/glsl/markers/marker.frag +36 -0
  209. vispy/glsl/markers/marker.vert +46 -0
  210. vispy/glsl/markers/markers.glsl +24 -0
  211. vispy/glsl/markers/pin.glsl +18 -0
  212. vispy/glsl/markers/ring.glsl +11 -0
  213. vispy/glsl/markers/spade.glsl +28 -0
  214. vispy/glsl/markers/square.glsl +10 -0
  215. vispy/glsl/markers/tag.glsl +11 -0
  216. vispy/glsl/markers/triangle.glsl +14 -0
  217. vispy/glsl/markers/vbar.glsl +9 -0
  218. vispy/glsl/math/circle-through-2-points.glsl +30 -0
  219. vispy/glsl/math/constants.glsl +48 -0
  220. vispy/glsl/math/double.glsl +114 -0
  221. vispy/glsl/math/functions.glsl +20 -0
  222. vispy/glsl/math/point-to-line-distance.glsl +31 -0
  223. vispy/glsl/math/point-to-line-projection.glsl +29 -0
  224. vispy/glsl/math/signed-line-distance.glsl +27 -0
  225. vispy/glsl/math/signed-segment-distance.glsl +30 -0
  226. vispy/glsl/misc/regular-grid.frag +244 -0
  227. vispy/glsl/misc/spatial-filters.frag +1407 -0
  228. vispy/glsl/misc/viewport-NDC.glsl +20 -0
  229. vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
  230. vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
  231. vispy/glsl/transforms/hammer.glsl +44 -0
  232. vispy/glsl/transforms/identity.glsl +6 -0
  233. vispy/glsl/transforms/identity_forward.glsl +23 -0
  234. vispy/glsl/transforms/identity_inverse.glsl +23 -0
  235. vispy/glsl/transforms/linear-scale.glsl +127 -0
  236. vispy/glsl/transforms/log-scale.glsl +126 -0
  237. vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
  238. vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
  239. vispy/glsl/transforms/panzoom.glsl +10 -0
  240. vispy/glsl/transforms/polar.glsl +41 -0
  241. vispy/glsl/transforms/position.glsl +44 -0
  242. vispy/glsl/transforms/power-scale.glsl +139 -0
  243. vispy/glsl/transforms/projection.glsl +7 -0
  244. vispy/glsl/transforms/pvm.glsl +13 -0
  245. vispy/glsl/transforms/rotate.glsl +45 -0
  246. vispy/glsl/transforms/trackball.glsl +15 -0
  247. vispy/glsl/transforms/translate.glsl +35 -0
  248. vispy/glsl/transforms/transverse_mercator.glsl +38 -0
  249. vispy/glsl/transforms/viewport-clipping.glsl +14 -0
  250. vispy/glsl/transforms/viewport-transform.glsl +16 -0
  251. vispy/glsl/transforms/viewport.glsl +50 -0
  252. vispy/glsl/transforms/x.glsl +24 -0
  253. vispy/glsl/transforms/y.glsl +19 -0
  254. vispy/glsl/transforms/z.glsl +14 -0
  255. vispy/io/__init__.py +20 -0
  256. vispy/io/_data/spatial-filters.npy +0 -0
  257. vispy/io/datasets.py +94 -0
  258. vispy/io/image.py +231 -0
  259. vispy/io/mesh.py +122 -0
  260. vispy/io/stl.py +167 -0
  261. vispy/io/tests/__init__.py +0 -0
  262. vispy/io/tests/test_image.py +47 -0
  263. vispy/io/tests/test_io.py +121 -0
  264. vispy/io/wavefront.py +350 -0
  265. vispy/plot/__init__.py +36 -0
  266. vispy/plot/fig.py +58 -0
  267. vispy/plot/plotwidget.py +522 -0
  268. vispy/plot/tests/__init__.py +0 -0
  269. vispy/plot/tests/test_plot.py +46 -0
  270. vispy/scene/__init__.py +43 -0
  271. vispy/scene/cameras/__init__.py +27 -0
  272. vispy/scene/cameras/_base.py +38 -0
  273. vispy/scene/cameras/arcball.py +105 -0
  274. vispy/scene/cameras/base_camera.py +551 -0
  275. vispy/scene/cameras/fly.py +474 -0
  276. vispy/scene/cameras/magnify.py +163 -0
  277. vispy/scene/cameras/panzoom.py +311 -0
  278. vispy/scene/cameras/perspective.py +338 -0
  279. vispy/scene/cameras/tests/__init__.py +0 -0
  280. vispy/scene/cameras/tests/test_cameras.py +27 -0
  281. vispy/scene/cameras/tests/test_link.py +53 -0
  282. vispy/scene/cameras/tests/test_perspective.py +122 -0
  283. vispy/scene/cameras/turntable.py +183 -0
  284. vispy/scene/canvas.py +639 -0
  285. vispy/scene/events.py +85 -0
  286. vispy/scene/node.py +644 -0
  287. vispy/scene/subscene.py +20 -0
  288. vispy/scene/tests/__init__.py +0 -0
  289. vispy/scene/tests/test_canvas.py +119 -0
  290. vispy/scene/tests/test_node.py +142 -0
  291. vispy/scene/tests/test_visuals.py +141 -0
  292. vispy/scene/visuals.py +276 -0
  293. vispy/scene/widgets/__init__.py +18 -0
  294. vispy/scene/widgets/anchor.py +25 -0
  295. vispy/scene/widgets/axis.py +88 -0
  296. vispy/scene/widgets/colorbar.py +176 -0
  297. vispy/scene/widgets/console.py +351 -0
  298. vispy/scene/widgets/grid.py +509 -0
  299. vispy/scene/widgets/label.py +50 -0
  300. vispy/scene/widgets/tests/__init__.py +0 -0
  301. vispy/scene/widgets/tests/test_colorbar.py +47 -0
  302. vispy/scene/widgets/viewbox.py +199 -0
  303. vispy/scene/widgets/widget.py +478 -0
  304. vispy/testing/__init__.py +51 -0
  305. vispy/testing/_runners.py +448 -0
  306. vispy/testing/_testing.py +416 -0
  307. vispy/testing/image_tester.py +494 -0
  308. vispy/testing/rendered_array_tester.py +85 -0
  309. vispy/testing/tests/__init__.py +0 -0
  310. vispy/testing/tests/test_testing.py +20 -0
  311. vispy/util/__init__.py +32 -0
  312. vispy/util/bunch.py +15 -0
  313. vispy/util/check_environment.py +57 -0
  314. vispy/util/config.py +490 -0
  315. vispy/util/dpi/__init__.py +19 -0
  316. vispy/util/dpi/_linux.py +69 -0
  317. vispy/util/dpi/_quartz.py +26 -0
  318. vispy/util/dpi/_win32.py +34 -0
  319. vispy/util/dpi/tests/__init__.py +0 -0
  320. vispy/util/dpi/tests/test_dpi.py +16 -0
  321. vispy/util/eq.py +41 -0
  322. vispy/util/event.py +774 -0
  323. vispy/util/fetching.py +276 -0
  324. vispy/util/filter.py +44 -0
  325. vispy/util/fonts/__init__.py +14 -0
  326. vispy/util/fonts/_freetype.py +73 -0
  327. vispy/util/fonts/_quartz.py +192 -0
  328. vispy/util/fonts/_triage.py +36 -0
  329. vispy/util/fonts/_vispy_fonts.py +20 -0
  330. vispy/util/fonts/_win32.py +105 -0
  331. vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
  332. vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
  333. vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
  334. vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
  335. vispy/util/fonts/tests/__init__.py +0 -0
  336. vispy/util/fonts/tests/test_font.py +45 -0
  337. vispy/util/fourier.py +69 -0
  338. vispy/util/frozen.py +25 -0
  339. vispy/util/gallery_scraper.py +268 -0
  340. vispy/util/keys.py +91 -0
  341. vispy/util/logs.py +358 -0
  342. vispy/util/osmesa_gl.py +17 -0
  343. vispy/util/profiler.py +135 -0
  344. vispy/util/ptime.py +16 -0
  345. vispy/util/quaternion.py +229 -0
  346. vispy/util/svg/__init__.py +18 -0
  347. vispy/util/svg/base.py +20 -0
  348. vispy/util/svg/color.py +219 -0
  349. vispy/util/svg/element.py +51 -0
  350. vispy/util/svg/geometry.py +478 -0
  351. vispy/util/svg/group.py +66 -0
  352. vispy/util/svg/length.py +81 -0
  353. vispy/util/svg/number.py +25 -0
  354. vispy/util/svg/path.py +332 -0
  355. vispy/util/svg/shapes.py +57 -0
  356. vispy/util/svg/style.py +59 -0
  357. vispy/util/svg/svg.py +40 -0
  358. vispy/util/svg/transform.py +223 -0
  359. vispy/util/svg/transformable.py +28 -0
  360. vispy/util/svg/viewport.py +73 -0
  361. vispy/util/tests/__init__.py +0 -0
  362. vispy/util/tests/test_config.py +58 -0
  363. vispy/util/tests/test_docstring_parameters.py +123 -0
  364. vispy/util/tests/test_emitter_group.py +262 -0
  365. vispy/util/tests/test_event_emitter.py +743 -0
  366. vispy/util/tests/test_fourier.py +35 -0
  367. vispy/util/tests/test_gallery_scraper.py +112 -0
  368. vispy/util/tests/test_import.py +127 -0
  369. vispy/util/tests/test_key.py +22 -0
  370. vispy/util/tests/test_logging.py +45 -0
  371. vispy/util/tests/test_run.py +14 -0
  372. vispy/util/tests/test_transforms.py +42 -0
  373. vispy/util/tests/test_vispy.py +48 -0
  374. vispy/util/transforms.py +201 -0
  375. vispy/util/wrappers.py +155 -0
  376. vispy/version.py +21 -0
  377. vispy/visuals/__init__.py +50 -0
  378. vispy/visuals/_scalable_textures.py +487 -0
  379. vispy/visuals/axis.py +678 -0
  380. vispy/visuals/border.py +208 -0
  381. vispy/visuals/box.py +79 -0
  382. vispy/visuals/collections/__init__.py +30 -0
  383. vispy/visuals/collections/agg_fast_path_collection.py +219 -0
  384. vispy/visuals/collections/agg_path_collection.py +197 -0
  385. vispy/visuals/collections/agg_point_collection.py +52 -0
  386. vispy/visuals/collections/agg_segment_collection.py +142 -0
  387. vispy/visuals/collections/array_list.py +401 -0
  388. vispy/visuals/collections/base_collection.py +482 -0
  389. vispy/visuals/collections/collection.py +253 -0
  390. vispy/visuals/collections/path_collection.py +23 -0
  391. vispy/visuals/collections/point_collection.py +19 -0
  392. vispy/visuals/collections/polygon_collection.py +25 -0
  393. vispy/visuals/collections/raw_path_collection.py +119 -0
  394. vispy/visuals/collections/raw_point_collection.py +113 -0
  395. vispy/visuals/collections/raw_polygon_collection.py +77 -0
  396. vispy/visuals/collections/raw_segment_collection.py +112 -0
  397. vispy/visuals/collections/raw_triangle_collection.py +78 -0
  398. vispy/visuals/collections/segment_collection.py +19 -0
  399. vispy/visuals/collections/triangle_collection.py +16 -0
  400. vispy/visuals/collections/util.py +168 -0
  401. vispy/visuals/colorbar.py +699 -0
  402. vispy/visuals/cube.py +41 -0
  403. vispy/visuals/ellipse.py +162 -0
  404. vispy/visuals/filters/__init__.py +10 -0
  405. vispy/visuals/filters/base_filter.py +242 -0
  406. vispy/visuals/filters/clipper.py +60 -0
  407. vispy/visuals/filters/clipping_planes.py +122 -0
  408. vispy/visuals/filters/color.py +181 -0
  409. vispy/visuals/filters/markers.py +28 -0
  410. vispy/visuals/filters/mesh.py +801 -0
  411. vispy/visuals/filters/picking.py +60 -0
  412. vispy/visuals/filters/tests/__init__.py +3 -0
  413. vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
  414. vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
  415. vispy/visuals/glsl/__init__.py +1 -0
  416. vispy/visuals/glsl/antialiasing.py +133 -0
  417. vispy/visuals/glsl/color.py +63 -0
  418. vispy/visuals/graphs/__init__.py +1 -0
  419. vispy/visuals/graphs/graph.py +240 -0
  420. vispy/visuals/graphs/layouts/__init__.py +55 -0
  421. vispy/visuals/graphs/layouts/circular.py +49 -0
  422. vispy/visuals/graphs/layouts/force_directed.py +211 -0
  423. vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
  424. vispy/visuals/graphs/layouts/random.py +52 -0
  425. vispy/visuals/graphs/tests/__init__.py +1 -0
  426. vispy/visuals/graphs/tests/test_layouts.py +139 -0
  427. vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
  428. vispy/visuals/graphs/util.py +120 -0
  429. vispy/visuals/gridlines.py +161 -0
  430. vispy/visuals/gridmesh.py +98 -0
  431. vispy/visuals/histogram.py +58 -0
  432. vispy/visuals/image.py +701 -0
  433. vispy/visuals/image_complex.py +130 -0
  434. vispy/visuals/infinite_line.py +199 -0
  435. vispy/visuals/instanced_mesh.py +152 -0
  436. vispy/visuals/isocurve.py +213 -0
  437. vispy/visuals/isoline.py +241 -0
  438. vispy/visuals/isosurface.py +113 -0
  439. vispy/visuals/line/__init__.py +6 -0
  440. vispy/visuals/line/arrow.py +289 -0
  441. vispy/visuals/line/dash_atlas.py +90 -0
  442. vispy/visuals/line/line.py +545 -0
  443. vispy/visuals/line_plot.py +135 -0
  444. vispy/visuals/linear_region.py +199 -0
  445. vispy/visuals/markers.py +819 -0
  446. vispy/visuals/mesh.py +373 -0
  447. vispy/visuals/mesh_normals.py +159 -0
  448. vispy/visuals/plane.py +54 -0
  449. vispy/visuals/polygon.py +145 -0
  450. vispy/visuals/rectangle.py +196 -0
  451. vispy/visuals/regular_polygon.py +56 -0
  452. vispy/visuals/scrolling_lines.py +197 -0
  453. vispy/visuals/shaders/__init__.py +17 -0
  454. vispy/visuals/shaders/compiler.py +206 -0
  455. vispy/visuals/shaders/expression.py +99 -0
  456. vispy/visuals/shaders/function.py +788 -0
  457. vispy/visuals/shaders/multiprogram.py +145 -0
  458. vispy/visuals/shaders/parsing.py +140 -0
  459. vispy/visuals/shaders/program.py +161 -0
  460. vispy/visuals/shaders/shader_object.py +162 -0
  461. vispy/visuals/shaders/tests/__init__.py +0 -0
  462. vispy/visuals/shaders/tests/test_function.py +486 -0
  463. vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
  464. vispy/visuals/shaders/tests/test_parsing.py +57 -0
  465. vispy/visuals/shaders/variable.py +272 -0
  466. vispy/visuals/spectrogram.py +169 -0
  467. vispy/visuals/sphere.py +80 -0
  468. vispy/visuals/surface_plot.py +192 -0
  469. vispy/visuals/tests/__init__.py +0 -0
  470. vispy/visuals/tests/test_arrows.py +109 -0
  471. vispy/visuals/tests/test_axis.py +120 -0
  472. vispy/visuals/tests/test_collections.py +15 -0
  473. vispy/visuals/tests/test_colorbar.py +179 -0
  474. vispy/visuals/tests/test_colormap.py +97 -0
  475. vispy/visuals/tests/test_ellipse.py +122 -0
  476. vispy/visuals/tests/test_gridlines.py +30 -0
  477. vispy/visuals/tests/test_histogram.py +24 -0
  478. vispy/visuals/tests/test_image.py +392 -0
  479. vispy/visuals/tests/test_image_complex.py +36 -0
  480. vispy/visuals/tests/test_infinite_line.py +53 -0
  481. vispy/visuals/tests/test_instanced_mesh.py +50 -0
  482. vispy/visuals/tests/test_isosurface.py +22 -0
  483. vispy/visuals/tests/test_linear_region.py +152 -0
  484. vispy/visuals/tests/test_markers.py +54 -0
  485. vispy/visuals/tests/test_mesh.py +261 -0
  486. vispy/visuals/tests/test_mesh_normals.py +218 -0
  487. vispy/visuals/tests/test_polygon.py +112 -0
  488. vispy/visuals/tests/test_rectangle.py +163 -0
  489. vispy/visuals/tests/test_regular_polygon.py +111 -0
  490. vispy/visuals/tests/test_scalable_textures.py +196 -0
  491. vispy/visuals/tests/test_sdf.py +73 -0
  492. vispy/visuals/tests/test_spectrogram.py +42 -0
  493. vispy/visuals/tests/test_surface_plot.py +57 -0
  494. vispy/visuals/tests/test_text.py +95 -0
  495. vispy/visuals/tests/test_volume.py +542 -0
  496. vispy/visuals/tests/test_windbarb.py +33 -0
  497. vispy/visuals/text/__init__.py +7 -0
  498. vispy/visuals/text/_sdf_cpu.cpython-313-darwin.so +0 -0
  499. vispy/visuals/text/_sdf_cpu.pyx +112 -0
  500. vispy/visuals/text/_sdf_gpu.py +316 -0
  501. vispy/visuals/text/text.py +675 -0
  502. vispy/visuals/transforms/__init__.py +34 -0
  503. vispy/visuals/transforms/_util.py +191 -0
  504. vispy/visuals/transforms/base_transform.py +233 -0
  505. vispy/visuals/transforms/chain.py +300 -0
  506. vispy/visuals/transforms/interactive.py +98 -0
  507. vispy/visuals/transforms/linear.py +564 -0
  508. vispy/visuals/transforms/nonlinear.py +398 -0
  509. vispy/visuals/transforms/tests/__init__.py +0 -0
  510. vispy/visuals/transforms/tests/test_transforms.py +243 -0
  511. vispy/visuals/transforms/transform_system.py +339 -0
  512. vispy/visuals/tube.py +173 -0
  513. vispy/visuals/visual.py +923 -0
  514. vispy/visuals/volume.py +1366 -0
  515. vispy/visuals/windbarb.py +291 -0
  516. vispy/visuals/xyz_axis.py +34 -0
  517. vispy-0.15.0.dist-info/METADATA +243 -0
  518. vispy-0.15.0.dist-info/RECORD +521 -0
  519. vispy-0.15.0.dist-info/WHEEL +6 -0
  520. vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
  521. vispy-0.15.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,196 @@
1
+ import numpy as np
2
+ import pytest
3
+
4
+ from vispy.testing import run_tests_if_main
5
+
6
+ from vispy.visuals._scalable_textures import (
7
+ get_default_clim_from_dtype,
8
+ get_default_clim_from_data,
9
+ CPUScaledTextureMixin,
10
+ GPUScaledTextureMixin,
11
+ )
12
+
13
+
14
+ class Stub:
15
+ _ndim = 2
16
+
17
+ def __init__(self, data, **kwargs):
18
+ pass
19
+
20
+ def set_data(self, data, *args, **kwargs):
21
+ self._data = data
22
+
23
+
24
+ class CPUScaledStub(CPUScaledTextureMixin, Stub):
25
+ pass
26
+
27
+
28
+ class GPUScaledStub(GPUScaledTextureMixin, Stub):
29
+
30
+ internalformat = "r32f"
31
+
32
+ def _get_texture_format_for_data(self, data, internalformat=None):
33
+ return None
34
+
35
+
36
+ def test_default_clim():
37
+ ref_data = np.array([10, 5, 15, 25, 15])
38
+
39
+ # f32
40
+ data = ref_data.astype(np.float32)
41
+ clim = get_default_clim_from_dtype(data.dtype)
42
+ assert clim == (0, 1)
43
+ clim = get_default_clim_from_data(data)
44
+ assert clim == (5, 25)
45
+
46
+ # i32
47
+ data = ref_data.astype(np.int32)
48
+ clim = get_default_clim_from_dtype(data.dtype)
49
+ assert clim == (-2**31, 2**31 - 1)
50
+ clim = get_default_clim_from_data(data)
51
+ assert clim == (5, 25)
52
+
53
+ # u8
54
+ data = ref_data.astype(np.uint8)
55
+ clim = get_default_clim_from_dtype(data.dtype)
56
+ assert clim == (0, 255)
57
+ clim = get_default_clim_from_data(data)
58
+ assert clim == (5, 25)
59
+
60
+
61
+ def test_default_clim_non_finite():
62
+
63
+ data = np.array([10, np.nan, 5, 15, 25, 15]).astype(np.float32)
64
+ clim = get_default_clim_from_dtype(data.dtype)
65
+ assert clim == (0, 1)
66
+ clim = get_default_clim_from_data(data)
67
+ assert clim == (5, 25)
68
+
69
+ data = np.array([10, np.inf, 5, 15, 25, 15]).astype(np.float32)
70
+ clim = get_default_clim_from_dtype(data.dtype)
71
+ assert clim == (0, 1)
72
+ clim = get_default_clim_from_data(data)
73
+ assert clim == (5, 25)
74
+
75
+ data = np.array([10, -np.inf, 5, 15, 25, 15]).astype(np.float32)
76
+ clim = get_default_clim_from_dtype(data.dtype)
77
+ assert clim == (0, 1)
78
+ clim = get_default_clim_from_data(data)
79
+ assert clim == (5, 25)
80
+
81
+ data = np.array([np.nan, np.nan, np.nan]).astype(np.float32)
82
+ clim = get_default_clim_from_dtype(data.dtype)
83
+ assert clim == (0, 1)
84
+ clim = get_default_clim_from_data(data)
85
+ assert clim == (0, 0)
86
+
87
+ data = np.array([np.nan, np.inf, -np.inf]).astype(np.float32)
88
+ clim = get_default_clim_from_dtype(data.dtype)
89
+ assert clim == (0, 1)
90
+ clim = get_default_clim_from_data(data)
91
+ assert clim == (0, 0)
92
+
93
+
94
+ def test_clim_handling_cpu():
95
+ ref_data = np.array([[10, 10, 5], [15, 25, 15]])
96
+
97
+ # f32 - auto clim
98
+ st = CPUScaledStub()
99
+ st.set_clim("auto")
100
+ st.scale_and_set_data(ref_data.astype(np.float32))
101
+ assert st.clim == (5, 25)
102
+ assert st.clim_normalized == (0, 1)
103
+ assert np.all(st._data == (ref_data - 5) / 20)
104
+
105
+ # Updating clim keeps data the same if not changing too much
106
+ st.set_clim((0, 20))
107
+ assert st.clim == (0, 20)
108
+ assert st.clim_normalized == (-0.25, 0.75)
109
+ assert np.all(st._data == (ref_data - 5) / 20)
110
+
111
+ # f32 - custom clim
112
+ st = CPUScaledStub()
113
+ st.set_clim((0, 20))
114
+ st.scale_and_set_data(ref_data.astype(np.float32))
115
+ assert st.clim == (0, 20)
116
+ assert st.clim_normalized == (0, 1)
117
+ assert np.all(st._data == ref_data / 20)
118
+
119
+ # f32 - flat clim
120
+ st = CPUScaledStub()
121
+ st.set_clim((10, 10))
122
+ st.scale_and_set_data(ref_data.astype(np.float32))
123
+ assert st.clim == (10, 10)
124
+ assert st.clim_normalized == (0, np.inf)
125
+ # assert np.min(st._data) == 0 - does not matter
126
+
127
+ # f32 - auto clim
128
+ st = CPUScaledStub()
129
+ st.set_clim("auto")
130
+ assert st.clim == "auto"
131
+ pytest.raises(RuntimeError, getattr, st, "clim_normalized")
132
+ st.scale_and_set_data(ref_data.astype(np.float32))
133
+ assert st.clim == (5, 25)
134
+ assert st.clim_normalized == (0, 1)
135
+
136
+ # u8 auto -> f32 auto
137
+ st = CPUScaledStub()
138
+ st.set_clim("auto")
139
+ assert st.clim == "auto"
140
+ st.scale_and_set_data(ref_data.astype(np.uint8))
141
+ assert st.clim == (5, 25)
142
+ assert st.clim_normalized == (0, 1)
143
+ # set new data with an out-of-range value
144
+ # it should clip at the limits of the original data type
145
+ st.set_clim("auto")
146
+ assert st.clim == "auto"
147
+ new_data = np.array([[10, 10, 5], [15, 2048, 15]], dtype=np.float32)
148
+ st.scale_and_set_data(new_data)
149
+ assert st.clim == (5, 255)
150
+ assert st.clim_normalized == (0, 1)
151
+
152
+
153
+ def test_clim_handling_gpu():
154
+ ref_data = np.array([[10, 10, 5], [15, 25, 15]])
155
+
156
+ # f32 - auto clim
157
+ st = GPUScaledStub()
158
+ st.set_clim("auto")
159
+ st.scale_and_set_data(ref_data.astype(np.float32))
160
+ assert st.clim == (5, 25)
161
+ assert st.clim_normalized == (5, 25)
162
+ assert np.all(st._data == ref_data)
163
+
164
+ # Updating clim keeps data the same if not changing too much
165
+ st.set_clim((0, 20))
166
+ assert st.clim == (0, 20)
167
+ assert st.clim_normalized == (0, 20)
168
+ assert np.all(st._data == ref_data)
169
+
170
+ # f32 - custom clim
171
+ st = GPUScaledStub()
172
+ st.set_clim((0, 20))
173
+ st.scale_and_set_data(ref_data.astype(np.float32))
174
+ assert st.clim == (0, 20)
175
+ assert st.clim_normalized == (0, 20)
176
+ assert np.all(st._data == ref_data)
177
+
178
+ # f32 - flat clim
179
+ st = GPUScaledStub()
180
+ st.set_clim((10, 10))
181
+ st.scale_and_set_data(ref_data.astype(np.float32))
182
+ assert st.clim == (10, 10)
183
+ assert st.clim_normalized == (10, np.inf)
184
+ # assert np.min(st._data) == 0 - does not matter
185
+
186
+ # f32 - auto clim
187
+ st = GPUScaledStub()
188
+ st.set_clim("auto")
189
+ assert st.clim == "auto"
190
+ pytest.raises(RuntimeError, getattr, st, "clim_normalized")
191
+ st.scale_and_set_data(ref_data.astype(np.float32))
192
+ assert st.clim == (5.0, 25.0)
193
+ assert st.clim_normalized == (5.0, 25.0)
194
+
195
+
196
+ run_tests_if_main()
@@ -0,0 +1,73 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Copyright (c) Vispy Development Team. All Rights Reserved.
3
+ # Distributed under the (new) BSD License. See LICENSE.txt for more info.
4
+ import gc
5
+
6
+ import numpy as np
7
+ from numpy.testing import assert_allclose
8
+
9
+ from vispy.app import Canvas
10
+ from vispy.visuals.text.text import SDFRendererCPU
11
+ from vispy.visuals.text._sdf_gpu import SDFRendererGPU
12
+ from vispy import gloo
13
+ from vispy.testing import requires_application, run_tests_if_main
14
+
15
+
16
+ @requires_application()
17
+ def test_sdf():
18
+ """Test basic text support - sdf"""
19
+ # test a simple case
20
+ data = (np.array(
21
+ [[0, 0, 0, 0, 0, 0, 0, 0, 0],
22
+ [0, 0, 0, 0, 0, 0, 0, 0, 0],
23
+ [0, 0, 1, 1, 1, 1, 1, 0, 0],
24
+ [0, 0, 1, 1, 1, 1, 1, 0, 0],
25
+ [0, 0, 1, 1, 1, 1, 1, 0, 0],
26
+ [0, 0, 1, 1, 1, 1, 1, 0, 0]]) * 255).astype(np.uint8)
27
+
28
+ # The GPU data at one point were derived this way:
29
+ # gpu = np.array(
30
+ # [[8, 5, 4, 4, 4, 4, 4, 5, 8],
31
+ # [5, 2, 1, 1, 1, 1, 1, 2, 5],
32
+ # [4, 1, 0, 0, 0, 0, 0, 1, 4],
33
+ # [4, 1, 0, -1, -4, -1, 0, 1, 4], # XXX artifact
34
+ # [4, 1, 0, -1, -4, -1, 0, 1, 4],
35
+ # [4, 1, 0, -1, -4, -1, 0, 1, 4]])
36
+ # gpu = 0.5 - (np.sqrt(np.abs(gpu)) * np.sign(gpu)) / 256. * 8
37
+ # gpu = np.round(256 * gpu).astype(np.int)
38
+ #
39
+ # But it's perhaps clearer just to give what will actually be compared:
40
+ gpu = np.array(
41
+ [[105, 110, 112, 112, 112, 112, 112, 110, 105],
42
+ [110, 117, 120, 120, 120, 120, 120, 117, 110],
43
+ [112, 120, 128, 128, 128, 128, 128, 120, 112],
44
+ [112, 120, 128, 136, 144, 136, 128, 120, 112],
45
+ [112, 120, 128, 136, 144, 136, 128, 120, 112],
46
+ [112, 120, 128, 136, 144, 136, 128, 120, 112]])
47
+ cpu = np.array(
48
+ [[0, 0, 0, 0, 0, 0, 0, 0, 0],
49
+ [0, 115, 118, 118, 118, 118, 118, 115, 0],
50
+ [0, 118, 137, 137, 137, 137, 137, 118, 0],
51
+ [0, 118, 137, 143, 143, 143, 137, 118, 0],
52
+ [0, 118, 137, 143, 149, 143, 137, 118, 0],
53
+ [0, 0, 255, 255, 255, 255, 255, 0, 0]])
54
+ # XXX: The GPU and CPU solutions are quite different.
55
+ # It doesn't seem to have much effect on the visualizations but would be
56
+ # good to fix eventually.
57
+
58
+ for Rend, expd in zip((SDFRendererGPU, SDFRendererCPU), (gpu, cpu)):
59
+ with Canvas(size=(100, 100)) as c:
60
+ tex = gloo.Texture2D(data.shape + (3,), format='rgb')
61
+ Rend().render_to_texture(data, tex, (0, 0), data.shape[::-1])
62
+ gloo.set_viewport(0, 0, *data.shape[::-1])
63
+ gloo.util.draw_texture(tex)
64
+ result = gloo.util._screenshot()[:, :, 0].astype(np.int64)
65
+ assert_allclose(result, expd, atol=1,
66
+ err_msg=Rend.__name__)
67
+ del tex, result
68
+ del c
69
+ # Do some garbage collection to make sure backend applications (PyQt5) actually clear things out
70
+ gc.collect()
71
+
72
+
73
+ run_tests_if_main()
@@ -0,0 +1,42 @@
1
+ # -*- coding: utf-8 -*-
2
+ import numpy as np
3
+
4
+ from vispy.scene.visuals import Spectrogram
5
+ from vispy.testing import (requires_application, TestingCanvas,
6
+ run_tests_if_main, raises)
7
+ from vispy.testing.image_tester import assert_image_approved
8
+
9
+
10
+ @requires_application()
11
+ def test_spectrogram():
12
+ """Test spectrogram visual"""
13
+ n_fft = 256
14
+ n_freqs = n_fft // 2 + 1
15
+ size = (100, n_freqs)
16
+ with TestingCanvas(size=size) as c:
17
+ np.random.seed(67853498)
18
+ data = np.random.normal(size=n_fft * 100)
19
+ spec = Spectrogram(data, n_fft=n_fft, step=n_fft, window=None,
20
+ color_scale='linear', cmap='grays')
21
+ c.draw_visual(spec)
22
+ # expected = np.zeros(size[::-1] + (3,))
23
+ # expected[0] = 1.
24
+ assert_image_approved("screenshot", "visuals/spectrogram.png")
25
+ freqs = spec.freqs
26
+ assert len(freqs) == n_freqs
27
+ assert freqs[0] == 0
28
+ assert freqs[-1] == 0.5
29
+
30
+ # Try changing all properties
31
+ spec.n_fft = 128
32
+ spec.step = 128
33
+ spec.fs = 2
34
+ spec.window = 'hann'
35
+ spec.normalize = True
36
+ spec.color_scale = 'log'
37
+
38
+ # Check color scale can be only 'log' or 'linear'
39
+ with raises(ValueError):
40
+ spec.color_scale = 'line_log'
41
+
42
+ run_tests_if_main()
@@ -0,0 +1,57 @@
1
+ # -*- coding: utf-8 -*-
2
+ from vispy.scene.visuals import SurfacePlot
3
+ from vispy.scene import TurntableCamera
4
+ from vispy.color import get_colormap
5
+ from vispy.testing import requires_application, TestingCanvas, run_tests_if_main
6
+ from vispy.testing.image_tester import assert_image_reasonable
7
+
8
+ import numpy as np
9
+ import pytest
10
+
11
+
12
+ @requires_application()
13
+ @pytest.mark.parametrize('x1dim', [True, False])
14
+ @pytest.mark.parametrize('y1dim', [True, False])
15
+ @pytest.mark.parametrize('use_vertex_colors', [True, False])
16
+ def test_surface_plot(x1dim:bool, y1dim:bool, use_vertex_colors:bool):
17
+ """Test SurfacePlot visual"""
18
+ with TestingCanvas(bgcolor='w') as c:
19
+
20
+ # create data
21
+ nx, ny = (100, 150)
22
+ x = np.linspace(-2, 2, nx)
23
+ y = np.linspace(-3, 3, ny)
24
+ xv, yv = np.meshgrid(x, y, indexing="ij")
25
+ z = np.sin(xv**2 + yv**2)
26
+
27
+ view = c.central_widget.add_view()
28
+ view.camera = TurntableCamera(up='z', fov=60)
29
+
30
+ # color vertices
31
+ cnorm = z / abs(np.amax(z))
32
+ colormap = get_colormap("viridis").map(cnorm)
33
+ if not use_vertex_colors:
34
+ colormap = colormap.reshape(z.shape + (-1,))
35
+
36
+ # 1 or 2 dimensional x and y data
37
+ x_input = x if x1dim else xv
38
+ y_input = y if y1dim else yv
39
+
40
+ # create figure
41
+ surface = SurfacePlot(z=z,
42
+ x=x_input,
43
+ y=y_input,
44
+ shading=None)
45
+
46
+ if use_vertex_colors:
47
+ surface.mesh_data.set_vertex_colors(colormap)
48
+ else:
49
+ surface.set_data(colors=colormap)
50
+
51
+ # c.draw_visual(surface)
52
+ view.add(surface)
53
+
54
+ assert_image_reasonable(c.render())
55
+
56
+
57
+ run_tests_if_main()
@@ -0,0 +1,95 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ import numpy as np
4
+ from numpy.testing import assert_allclose
5
+
6
+ from vispy.scene.visuals import Text
7
+ from vispy.testing import (requires_application, TestingCanvas,
8
+ run_tests_if_main)
9
+ from vispy.testing.image_tester import assert_image_approved
10
+
11
+
12
+ @requires_application()
13
+ def test_text():
14
+ """Test basic text support"""
15
+ with TestingCanvas(bgcolor='w', size=(92, 92), dpi=92) as c:
16
+ pos = [92 // 2] * 2
17
+ text = Text('testing', font_size=20, color='k',
18
+ pos=pos, anchor_x='center', anchor_y='baseline',
19
+ parent=c.scene)
20
+ # Test image created in Illustrator CS5, 1"x1" output @ 92 DPI
21
+ assert_image_approved(c.render(), 'visuals/text1.png')
22
+
23
+ text.text = ['foo', 'bar']
24
+ text.pos = [10, 10] # should auto-replicate
25
+ text.rotation = [180, 270]
26
+ try:
27
+ text.pos = [10]
28
+ except Exception:
29
+ pass
30
+ else:
31
+ raise AssertionError('Exception not raised')
32
+ c.update()
33
+ c.app.process_events()
34
+ text.pos = [[10, 10], [10, 20]]
35
+ text.text = 'foobar'
36
+ c.update()
37
+ c.app.process_events()
38
+
39
+
40
+ @requires_application()
41
+ def test_text_rotation_update():
42
+
43
+ # Regression test for a bug that caused text labels to not be redrawn
44
+ # if the rotation angle was updated
45
+
46
+ with TestingCanvas() as c:
47
+ text = Text('testing', pos=(100, 100), parent=c.scene)
48
+ c.update()
49
+ c.app.process_events()
50
+ assert_allclose(text.shared_program['a_rotation'], 0.)
51
+ text.rotation = 30.
52
+ c.update()
53
+ c.app.process_events()
54
+ assert_allclose(text.shared_program['a_rotation'], np.radians(30.))
55
+
56
+
57
+ @requires_application()
58
+ def test_face_bold_italic():
59
+
60
+ with TestingCanvas() as c:
61
+
62
+ # Check defaults
63
+ text = Text('testing', pos=(100, 100), parent=c.scene)
64
+ assert not text.bold and not text.italic
65
+
66
+ # Check getter properties
67
+ text = Text('testing', pos=(100, 100), bold=True, italic=True, parent=c.scene)
68
+ assert text.bold and text.italic
69
+
70
+ # Check that changing a property changes the font object
71
+ font1 = text._font
72
+ text.bold = False
73
+ font2 = text._font
74
+ assert font1 is not font2
75
+ text.italic = False
76
+ font3 = text._font
77
+ assert font2 is not font3
78
+ text.bold = True
79
+ text.italic = True
80
+ font4 = text._font
81
+ assert font1 is font4
82
+
83
+
84
+ def test_text_depth_test():
85
+ t = Text(depth_test=False)
86
+ assert not t._vshare.gl_state["depth_test"]
87
+
88
+ t = Text(depth_test=True)
89
+ assert t._vshare.gl_state["depth_test"]
90
+
91
+ t = Text() # Default is false
92
+ assert not t._vshare.gl_state["depth_test"]
93
+
94
+
95
+ run_tests_if_main()