vispy 0.15.0__cp313-cp313-macosx_10_13_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of vispy might be problematic. Click here for more details.
- vispy/__init__.py +33 -0
- vispy/app/__init__.py +15 -0
- vispy/app/_default_app.py +76 -0
- vispy/app/_detect_eventloop.py +148 -0
- vispy/app/application.py +263 -0
- vispy/app/backends/__init__.py +52 -0
- vispy/app/backends/_egl.py +264 -0
- vispy/app/backends/_glfw.py +513 -0
- vispy/app/backends/_jupyter_rfb.py +278 -0
- vispy/app/backends/_offscreen_util.py +121 -0
- vispy/app/backends/_osmesa.py +235 -0
- vispy/app/backends/_pyglet.py +451 -0
- vispy/app/backends/_pyqt4.py +36 -0
- vispy/app/backends/_pyqt5.py +36 -0
- vispy/app/backends/_pyqt6.py +40 -0
- vispy/app/backends/_pyside.py +37 -0
- vispy/app/backends/_pyside2.py +52 -0
- vispy/app/backends/_pyside6.py +53 -0
- vispy/app/backends/_qt.py +1003 -0
- vispy/app/backends/_sdl2.py +444 -0
- vispy/app/backends/_template.py +244 -0
- vispy/app/backends/_test.py +8 -0
- vispy/app/backends/_tk.py +800 -0
- vispy/app/backends/_wx.py +476 -0
- vispy/app/backends/tests/__init__.py +0 -0
- vispy/app/backends/tests/test_offscreen_util.py +52 -0
- vispy/app/backends/tests/test_rfb.py +77 -0
- vispy/app/base.py +294 -0
- vispy/app/canvas.py +828 -0
- vispy/app/qt.py +92 -0
- vispy/app/tests/__init__.py +0 -0
- vispy/app/tests/qt-designer.ui +58 -0
- vispy/app/tests/test_app.py +442 -0
- vispy/app/tests/test_backends.py +164 -0
- vispy/app/tests/test_canvas.py +122 -0
- vispy/app/tests/test_context.py +92 -0
- vispy/app/tests/test_qt.py +47 -0
- vispy/app/tests/test_simultaneous.py +134 -0
- vispy/app/timer.py +174 -0
- vispy/color/__init__.py +17 -0
- vispy/color/_color_dict.py +193 -0
- vispy/color/color_array.py +447 -0
- vispy/color/color_space.py +181 -0
- vispy/color/colormap.py +1213 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +378 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1522 -0
- vispy/ext/cubehelix.py +138 -0
- vispy/ext/egl.py +375 -0
- vispy/ext/fontconfig.py +118 -0
- vispy/ext/gdi32plus.py +206 -0
- vispy/ext/osmesa.py +105 -0
- vispy/geometry/__init__.py +23 -0
- vispy/geometry/_triangulation_debugger.py +171 -0
- vispy/geometry/calculations.py +162 -0
- vispy/geometry/curves.py +399 -0
- vispy/geometry/generation.py +643 -0
- vispy/geometry/isocurve.py +175 -0
- vispy/geometry/isosurface.py +465 -0
- vispy/geometry/meshdata.py +700 -0
- vispy/geometry/normals.py +78 -0
- vispy/geometry/parametric.py +56 -0
- vispy/geometry/polygon.py +137 -0
- vispy/geometry/rect.py +210 -0
- vispy/geometry/tests/__init__.py +0 -0
- vispy/geometry/tests/test_calculations.py +23 -0
- vispy/geometry/tests/test_generation.py +56 -0
- vispy/geometry/tests/test_meshdata.py +106 -0
- vispy/geometry/tests/test_triangulation.py +594 -0
- vispy/geometry/torusknot.py +142 -0
- vispy/geometry/triangulation.py +876 -0
- vispy/gloo/__init__.py +56 -0
- vispy/gloo/buffer.py +505 -0
- vispy/gloo/context.py +272 -0
- vispy/gloo/framebuffer.py +257 -0
- vispy/gloo/gl/__init__.py +234 -0
- vispy/gloo/gl/_constants.py +332 -0
- vispy/gloo/gl/_es2.py +986 -0
- vispy/gloo/gl/_gl2.py +1365 -0
- vispy/gloo/gl/_proxy.py +499 -0
- vispy/gloo/gl/_pyopengl2.py +362 -0
- vispy/gloo/gl/dummy.py +24 -0
- vispy/gloo/gl/es2.py +62 -0
- vispy/gloo/gl/gl2.py +98 -0
- vispy/gloo/gl/glplus.py +168 -0
- vispy/gloo/gl/pyopengl2.py +97 -0
- vispy/gloo/gl/tests/__init__.py +0 -0
- vispy/gloo/gl/tests/test_basics.py +282 -0
- vispy/gloo/gl/tests/test_functionality.py +568 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1824 -0
- vispy/gloo/globject.py +101 -0
- vispy/gloo/preprocessor.py +67 -0
- vispy/gloo/program.py +543 -0
- vispy/gloo/tests/__init__.py +0 -0
- vispy/gloo/tests/test_buffer.py +558 -0
- vispy/gloo/tests/test_context.py +119 -0
- vispy/gloo/tests/test_framebuffer.py +195 -0
- vispy/gloo/tests/test_glir.py +307 -0
- vispy/gloo/tests/test_globject.py +35 -0
- vispy/gloo/tests/test_program.py +302 -0
- vispy/gloo/tests/test_texture.py +732 -0
- vispy/gloo/tests/test_use_gloo.py +187 -0
- vispy/gloo/tests/test_util.py +60 -0
- vispy/gloo/tests/test_wrappers.py +261 -0
- vispy/gloo/texture.py +1046 -0
- vispy/gloo/util.py +129 -0
- vispy/gloo/wrappers.py +762 -0
- vispy/glsl/__init__.py +42 -0
- vispy/glsl/antialias/antialias.glsl +7 -0
- vispy/glsl/antialias/cap-butt.glsl +31 -0
- vispy/glsl/antialias/cap-round.glsl +29 -0
- vispy/glsl/antialias/cap-square.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-in.glsl +30 -0
- vispy/glsl/antialias/cap-triangle-out.glsl +30 -0
- vispy/glsl/antialias/cap.glsl +67 -0
- vispy/glsl/antialias/caps.glsl +67 -0
- vispy/glsl/antialias/filled.glsl +50 -0
- vispy/glsl/antialias/outline.glsl +40 -0
- vispy/glsl/antialias/stroke.glsl +43 -0
- vispy/glsl/arrowheads/angle.glsl +99 -0
- vispy/glsl/arrowheads/arrowheads.frag +60 -0
- vispy/glsl/arrowheads/arrowheads.glsl +12 -0
- vispy/glsl/arrowheads/arrowheads.vert +83 -0
- vispy/glsl/arrowheads/curved.glsl +48 -0
- vispy/glsl/arrowheads/inhibitor.glsl +26 -0
- vispy/glsl/arrowheads/stealth.glsl +46 -0
- vispy/glsl/arrowheads/triangle.glsl +97 -0
- vispy/glsl/arrowheads/util.glsl +13 -0
- vispy/glsl/arrows/angle-30.glsl +12 -0
- vispy/glsl/arrows/angle-60.glsl +12 -0
- vispy/glsl/arrows/angle-90.glsl +12 -0
- vispy/glsl/arrows/arrow.frag +39 -0
- vispy/glsl/arrows/arrow.vert +49 -0
- vispy/glsl/arrows/arrows.glsl +17 -0
- vispy/glsl/arrows/common.glsl +187 -0
- vispy/glsl/arrows/curved.glsl +63 -0
- vispy/glsl/arrows/stealth.glsl +50 -0
- vispy/glsl/arrows/triangle-30.glsl +12 -0
- vispy/glsl/arrows/triangle-60.glsl +12 -0
- vispy/glsl/arrows/triangle-90.glsl +12 -0
- vispy/glsl/arrows/util.glsl +98 -0
- vispy/glsl/build_spatial_filters.py +660 -0
- vispy/glsl/collections/agg-fast-path.frag +20 -0
- vispy/glsl/collections/agg-fast-path.vert +78 -0
- vispy/glsl/collections/agg-glyph.frag +60 -0
- vispy/glsl/collections/agg-glyph.vert +33 -0
- vispy/glsl/collections/agg-marker.frag +35 -0
- vispy/glsl/collections/agg-marker.vert +48 -0
- vispy/glsl/collections/agg-path.frag +55 -0
- vispy/glsl/collections/agg-path.vert +166 -0
- vispy/glsl/collections/agg-point.frag +21 -0
- vispy/glsl/collections/agg-point.vert +35 -0
- vispy/glsl/collections/agg-segment.frag +32 -0
- vispy/glsl/collections/agg-segment.vert +75 -0
- vispy/glsl/collections/marker.frag +38 -0
- vispy/glsl/collections/marker.vert +48 -0
- vispy/glsl/collections/raw-path.frag +15 -0
- vispy/glsl/collections/raw-path.vert +24 -0
- vispy/glsl/collections/raw-point.frag +14 -0
- vispy/glsl/collections/raw-point.vert +31 -0
- vispy/glsl/collections/raw-segment.frag +18 -0
- vispy/glsl/collections/raw-segment.vert +26 -0
- vispy/glsl/collections/raw-triangle.frag +13 -0
- vispy/glsl/collections/raw-triangle.vert +26 -0
- vispy/glsl/collections/sdf-glyph-ticks.vert +69 -0
- vispy/glsl/collections/sdf-glyph.frag +80 -0
- vispy/glsl/collections/sdf-glyph.vert +59 -0
- vispy/glsl/collections/tick-labels.vert +71 -0
- vispy/glsl/colormaps/autumn.glsl +20 -0
- vispy/glsl/colormaps/blues.glsl +20 -0
- vispy/glsl/colormaps/color-space.glsl +17 -0
- vispy/glsl/colormaps/colormaps.glsl +24 -0
- vispy/glsl/colormaps/cool.glsl +20 -0
- vispy/glsl/colormaps/fire.glsl +21 -0
- vispy/glsl/colormaps/gray.glsl +20 -0
- vispy/glsl/colormaps/greens.glsl +20 -0
- vispy/glsl/colormaps/hot.glsl +22 -0
- vispy/glsl/colormaps/ice.glsl +20 -0
- vispy/glsl/colormaps/icefire.glsl +23 -0
- vispy/glsl/colormaps/parse.py +40 -0
- vispy/glsl/colormaps/reds.glsl +20 -0
- vispy/glsl/colormaps/spring.glsl +20 -0
- vispy/glsl/colormaps/summer.glsl +20 -0
- vispy/glsl/colormaps/user.glsl +22 -0
- vispy/glsl/colormaps/util.glsl +41 -0
- vispy/glsl/colormaps/wheel.glsl +21 -0
- vispy/glsl/colormaps/winter.glsl +20 -0
- vispy/glsl/lines/agg.frag +320 -0
- vispy/glsl/lines/agg.vert +241 -0
- vispy/glsl/markers/arrow.glsl +12 -0
- vispy/glsl/markers/asterisk.glsl +16 -0
- vispy/glsl/markers/chevron.glsl +14 -0
- vispy/glsl/markers/clover.glsl +20 -0
- vispy/glsl/markers/club.glsl +31 -0
- vispy/glsl/markers/cross.glsl +17 -0
- vispy/glsl/markers/diamond.glsl +12 -0
- vispy/glsl/markers/disc.glsl +9 -0
- vispy/glsl/markers/ellipse.glsl +67 -0
- vispy/glsl/markers/hbar.glsl +9 -0
- vispy/glsl/markers/heart.glsl +15 -0
- vispy/glsl/markers/infinity.glsl +15 -0
- vispy/glsl/markers/marker-sdf.frag +74 -0
- vispy/glsl/markers/marker-sdf.vert +41 -0
- vispy/glsl/markers/marker.frag +36 -0
- vispy/glsl/markers/marker.vert +46 -0
- vispy/glsl/markers/markers.glsl +24 -0
- vispy/glsl/markers/pin.glsl +18 -0
- vispy/glsl/markers/ring.glsl +11 -0
- vispy/glsl/markers/spade.glsl +28 -0
- vispy/glsl/markers/square.glsl +10 -0
- vispy/glsl/markers/tag.glsl +11 -0
- vispy/glsl/markers/triangle.glsl +14 -0
- vispy/glsl/markers/vbar.glsl +9 -0
- vispy/glsl/math/circle-through-2-points.glsl +30 -0
- vispy/glsl/math/constants.glsl +48 -0
- vispy/glsl/math/double.glsl +114 -0
- vispy/glsl/math/functions.glsl +20 -0
- vispy/glsl/math/point-to-line-distance.glsl +31 -0
- vispy/glsl/math/point-to-line-projection.glsl +29 -0
- vispy/glsl/math/signed-line-distance.glsl +27 -0
- vispy/glsl/math/signed-segment-distance.glsl +30 -0
- vispy/glsl/misc/regular-grid.frag +244 -0
- vispy/glsl/misc/spatial-filters.frag +1407 -0
- vispy/glsl/misc/viewport-NDC.glsl +20 -0
- vispy/glsl/transforms/azimuthal-equal-area.glsl +32 -0
- vispy/glsl/transforms/azimuthal-equidistant.glsl +38 -0
- vispy/glsl/transforms/hammer.glsl +44 -0
- vispy/glsl/transforms/identity.glsl +6 -0
- vispy/glsl/transforms/identity_forward.glsl +23 -0
- vispy/glsl/transforms/identity_inverse.glsl +23 -0
- vispy/glsl/transforms/linear-scale.glsl +127 -0
- vispy/glsl/transforms/log-scale.glsl +126 -0
- vispy/glsl/transforms/mercator-transverse-forward.glsl +40 -0
- vispy/glsl/transforms/mercator-transverse-inverse.glsl +40 -0
- vispy/glsl/transforms/panzoom.glsl +10 -0
- vispy/glsl/transforms/polar.glsl +41 -0
- vispy/glsl/transforms/position.glsl +44 -0
- vispy/glsl/transforms/power-scale.glsl +139 -0
- vispy/glsl/transforms/projection.glsl +7 -0
- vispy/glsl/transforms/pvm.glsl +13 -0
- vispy/glsl/transforms/rotate.glsl +45 -0
- vispy/glsl/transforms/trackball.glsl +15 -0
- vispy/glsl/transforms/translate.glsl +35 -0
- vispy/glsl/transforms/transverse_mercator.glsl +38 -0
- vispy/glsl/transforms/viewport-clipping.glsl +14 -0
- vispy/glsl/transforms/viewport-transform.glsl +16 -0
- vispy/glsl/transforms/viewport.glsl +50 -0
- vispy/glsl/transforms/x.glsl +24 -0
- vispy/glsl/transforms/y.glsl +19 -0
- vispy/glsl/transforms/z.glsl +14 -0
- vispy/io/__init__.py +20 -0
- vispy/io/_data/spatial-filters.npy +0 -0
- vispy/io/datasets.py +94 -0
- vispy/io/image.py +231 -0
- vispy/io/mesh.py +122 -0
- vispy/io/stl.py +167 -0
- vispy/io/tests/__init__.py +0 -0
- vispy/io/tests/test_image.py +47 -0
- vispy/io/tests/test_io.py +121 -0
- vispy/io/wavefront.py +350 -0
- vispy/plot/__init__.py +36 -0
- vispy/plot/fig.py +58 -0
- vispy/plot/plotwidget.py +522 -0
- vispy/plot/tests/__init__.py +0 -0
- vispy/plot/tests/test_plot.py +46 -0
- vispy/scene/__init__.py +43 -0
- vispy/scene/cameras/__init__.py +27 -0
- vispy/scene/cameras/_base.py +38 -0
- vispy/scene/cameras/arcball.py +105 -0
- vispy/scene/cameras/base_camera.py +551 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +311 -0
- vispy/scene/cameras/perspective.py +338 -0
- vispy/scene/cameras/tests/__init__.py +0 -0
- vispy/scene/cameras/tests/test_cameras.py +27 -0
- vispy/scene/cameras/tests/test_link.py +53 -0
- vispy/scene/cameras/tests/test_perspective.py +122 -0
- vispy/scene/cameras/turntable.py +183 -0
- vispy/scene/canvas.py +639 -0
- vispy/scene/events.py +85 -0
- vispy/scene/node.py +644 -0
- vispy/scene/subscene.py +20 -0
- vispy/scene/tests/__init__.py +0 -0
- vispy/scene/tests/test_canvas.py +119 -0
- vispy/scene/tests/test_node.py +142 -0
- vispy/scene/tests/test_visuals.py +141 -0
- vispy/scene/visuals.py +276 -0
- vispy/scene/widgets/__init__.py +18 -0
- vispy/scene/widgets/anchor.py +25 -0
- vispy/scene/widgets/axis.py +88 -0
- vispy/scene/widgets/colorbar.py +176 -0
- vispy/scene/widgets/console.py +351 -0
- vispy/scene/widgets/grid.py +509 -0
- vispy/scene/widgets/label.py +50 -0
- vispy/scene/widgets/tests/__init__.py +0 -0
- vispy/scene/widgets/tests/test_colorbar.py +47 -0
- vispy/scene/widgets/viewbox.py +199 -0
- vispy/scene/widgets/widget.py +478 -0
- vispy/testing/__init__.py +51 -0
- vispy/testing/_runners.py +448 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +494 -0
- vispy/testing/rendered_array_tester.py +85 -0
- vispy/testing/tests/__init__.py +0 -0
- vispy/testing/tests/test_testing.py +20 -0
- vispy/util/__init__.py +32 -0
- vispy/util/bunch.py +15 -0
- vispy/util/check_environment.py +57 -0
- vispy/util/config.py +490 -0
- vispy/util/dpi/__init__.py +19 -0
- vispy/util/dpi/_linux.py +69 -0
- vispy/util/dpi/_quartz.py +26 -0
- vispy/util/dpi/_win32.py +34 -0
- vispy/util/dpi/tests/__init__.py +0 -0
- vispy/util/dpi/tests/test_dpi.py +16 -0
- vispy/util/eq.py +41 -0
- vispy/util/event.py +774 -0
- vispy/util/fetching.py +276 -0
- vispy/util/filter.py +44 -0
- vispy/util/fonts/__init__.py +14 -0
- vispy/util/fonts/_freetype.py +73 -0
- vispy/util/fonts/_quartz.py +192 -0
- vispy/util/fonts/_triage.py +36 -0
- vispy/util/fonts/_vispy_fonts.py +20 -0
- vispy/util/fonts/_win32.py +105 -0
- vispy/util/fonts/data/OpenSans-Bold.ttf +0 -0
- vispy/util/fonts/data/OpenSans-BoldItalic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Italic.ttf +0 -0
- vispy/util/fonts/data/OpenSans-Regular.ttf +0 -0
- vispy/util/fonts/tests/__init__.py +0 -0
- vispy/util/fonts/tests/test_font.py +45 -0
- vispy/util/fourier.py +69 -0
- vispy/util/frozen.py +25 -0
- vispy/util/gallery_scraper.py +268 -0
- vispy/util/keys.py +91 -0
- vispy/util/logs.py +358 -0
- vispy/util/osmesa_gl.py +17 -0
- vispy/util/profiler.py +135 -0
- vispy/util/ptime.py +16 -0
- vispy/util/quaternion.py +229 -0
- vispy/util/svg/__init__.py +18 -0
- vispy/util/svg/base.py +20 -0
- vispy/util/svg/color.py +219 -0
- vispy/util/svg/element.py +51 -0
- vispy/util/svg/geometry.py +478 -0
- vispy/util/svg/group.py +66 -0
- vispy/util/svg/length.py +81 -0
- vispy/util/svg/number.py +25 -0
- vispy/util/svg/path.py +332 -0
- vispy/util/svg/shapes.py +57 -0
- vispy/util/svg/style.py +59 -0
- vispy/util/svg/svg.py +40 -0
- vispy/util/svg/transform.py +223 -0
- vispy/util/svg/transformable.py +28 -0
- vispy/util/svg/viewport.py +73 -0
- vispy/util/tests/__init__.py +0 -0
- vispy/util/tests/test_config.py +58 -0
- vispy/util/tests/test_docstring_parameters.py +123 -0
- vispy/util/tests/test_emitter_group.py +262 -0
- vispy/util/tests/test_event_emitter.py +743 -0
- vispy/util/tests/test_fourier.py +35 -0
- vispy/util/tests/test_gallery_scraper.py +112 -0
- vispy/util/tests/test_import.py +127 -0
- vispy/util/tests/test_key.py +22 -0
- vispy/util/tests/test_logging.py +45 -0
- vispy/util/tests/test_run.py +14 -0
- vispy/util/tests/test_transforms.py +42 -0
- vispy/util/tests/test_vispy.py +48 -0
- vispy/util/transforms.py +201 -0
- vispy/util/wrappers.py +155 -0
- vispy/version.py +21 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +487 -0
- vispy/visuals/axis.py +678 -0
- vispy/visuals/border.py +208 -0
- vispy/visuals/box.py +79 -0
- vispy/visuals/collections/__init__.py +30 -0
- vispy/visuals/collections/agg_fast_path_collection.py +219 -0
- vispy/visuals/collections/agg_path_collection.py +197 -0
- vispy/visuals/collections/agg_point_collection.py +52 -0
- vispy/visuals/collections/agg_segment_collection.py +142 -0
- vispy/visuals/collections/array_list.py +401 -0
- vispy/visuals/collections/base_collection.py +482 -0
- vispy/visuals/collections/collection.py +253 -0
- vispy/visuals/collections/path_collection.py +23 -0
- vispy/visuals/collections/point_collection.py +19 -0
- vispy/visuals/collections/polygon_collection.py +25 -0
- vispy/visuals/collections/raw_path_collection.py +119 -0
- vispy/visuals/collections/raw_point_collection.py +113 -0
- vispy/visuals/collections/raw_polygon_collection.py +77 -0
- vispy/visuals/collections/raw_segment_collection.py +112 -0
- vispy/visuals/collections/raw_triangle_collection.py +78 -0
- vispy/visuals/collections/segment_collection.py +19 -0
- vispy/visuals/collections/triangle_collection.py +16 -0
- vispy/visuals/collections/util.py +168 -0
- vispy/visuals/colorbar.py +699 -0
- vispy/visuals/cube.py +41 -0
- vispy/visuals/ellipse.py +162 -0
- vispy/visuals/filters/__init__.py +10 -0
- vispy/visuals/filters/base_filter.py +242 -0
- vispy/visuals/filters/clipper.py +60 -0
- vispy/visuals/filters/clipping_planes.py +122 -0
- vispy/visuals/filters/color.py +181 -0
- vispy/visuals/filters/markers.py +28 -0
- vispy/visuals/filters/mesh.py +801 -0
- vispy/visuals/filters/picking.py +60 -0
- vispy/visuals/filters/tests/__init__.py +3 -0
- vispy/visuals/filters/tests/test_primitive_picking_filters.py +70 -0
- vispy/visuals/filters/tests/test_wireframe_filter.py +16 -0
- vispy/visuals/glsl/__init__.py +1 -0
- vispy/visuals/glsl/antialiasing.py +133 -0
- vispy/visuals/glsl/color.py +63 -0
- vispy/visuals/graphs/__init__.py +1 -0
- vispy/visuals/graphs/graph.py +240 -0
- vispy/visuals/graphs/layouts/__init__.py +55 -0
- vispy/visuals/graphs/layouts/circular.py +49 -0
- vispy/visuals/graphs/layouts/force_directed.py +211 -0
- vispy/visuals/graphs/layouts/networkx_layout.py +87 -0
- vispy/visuals/graphs/layouts/random.py +52 -0
- vispy/visuals/graphs/tests/__init__.py +1 -0
- vispy/visuals/graphs/tests/test_layouts.py +139 -0
- vispy/visuals/graphs/tests/test_networkx_layout.py +47 -0
- vispy/visuals/graphs/util.py +120 -0
- vispy/visuals/gridlines.py +161 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +701 -0
- vispy/visuals/image_complex.py +130 -0
- vispy/visuals/infinite_line.py +199 -0
- vispy/visuals/instanced_mesh.py +152 -0
- vispy/visuals/isocurve.py +213 -0
- vispy/visuals/isoline.py +241 -0
- vispy/visuals/isosurface.py +113 -0
- vispy/visuals/line/__init__.py +6 -0
- vispy/visuals/line/arrow.py +289 -0
- vispy/visuals/line/dash_atlas.py +90 -0
- vispy/visuals/line/line.py +545 -0
- vispy/visuals/line_plot.py +135 -0
- vispy/visuals/linear_region.py +199 -0
- vispy/visuals/markers.py +819 -0
- vispy/visuals/mesh.py +373 -0
- vispy/visuals/mesh_normals.py +159 -0
- vispy/visuals/plane.py +54 -0
- vispy/visuals/polygon.py +145 -0
- vispy/visuals/rectangle.py +196 -0
- vispy/visuals/regular_polygon.py +56 -0
- vispy/visuals/scrolling_lines.py +197 -0
- vispy/visuals/shaders/__init__.py +17 -0
- vispy/visuals/shaders/compiler.py +206 -0
- vispy/visuals/shaders/expression.py +99 -0
- vispy/visuals/shaders/function.py +788 -0
- vispy/visuals/shaders/multiprogram.py +145 -0
- vispy/visuals/shaders/parsing.py +140 -0
- vispy/visuals/shaders/program.py +161 -0
- vispy/visuals/shaders/shader_object.py +162 -0
- vispy/visuals/shaders/tests/__init__.py +0 -0
- vispy/visuals/shaders/tests/test_function.py +486 -0
- vispy/visuals/shaders/tests/test_multiprogram.py +78 -0
- vispy/visuals/shaders/tests/test_parsing.py +57 -0
- vispy/visuals/shaders/variable.py +272 -0
- vispy/visuals/spectrogram.py +169 -0
- vispy/visuals/sphere.py +80 -0
- vispy/visuals/surface_plot.py +192 -0
- vispy/visuals/tests/__init__.py +0 -0
- vispy/visuals/tests/test_arrows.py +109 -0
- vispy/visuals/tests/test_axis.py +120 -0
- vispy/visuals/tests/test_collections.py +15 -0
- vispy/visuals/tests/test_colorbar.py +179 -0
- vispy/visuals/tests/test_colormap.py +97 -0
- vispy/visuals/tests/test_ellipse.py +122 -0
- vispy/visuals/tests/test_gridlines.py +30 -0
- vispy/visuals/tests/test_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +392 -0
- vispy/visuals/tests/test_image_complex.py +36 -0
- vispy/visuals/tests/test_infinite_line.py +53 -0
- vispy/visuals/tests/test_instanced_mesh.py +50 -0
- vispy/visuals/tests/test_isosurface.py +22 -0
- vispy/visuals/tests/test_linear_region.py +152 -0
- vispy/visuals/tests/test_markers.py +54 -0
- vispy/visuals/tests/test_mesh.py +261 -0
- vispy/visuals/tests/test_mesh_normals.py +218 -0
- vispy/visuals/tests/test_polygon.py +112 -0
- vispy/visuals/tests/test_rectangle.py +163 -0
- vispy/visuals/tests/test_regular_polygon.py +111 -0
- vispy/visuals/tests/test_scalable_textures.py +196 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -0
- vispy/visuals/tests/test_surface_plot.py +57 -0
- vispy/visuals/tests/test_text.py +95 -0
- vispy/visuals/tests/test_volume.py +542 -0
- vispy/visuals/tests/test_windbarb.py +33 -0
- vispy/visuals/text/__init__.py +7 -0
- vispy/visuals/text/_sdf_cpu.cpython-313-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +112 -0
- vispy/visuals/text/_sdf_gpu.py +316 -0
- vispy/visuals/text/text.py +675 -0
- vispy/visuals/transforms/__init__.py +34 -0
- vispy/visuals/transforms/_util.py +191 -0
- vispy/visuals/transforms/base_transform.py +233 -0
- vispy/visuals/transforms/chain.py +300 -0
- vispy/visuals/transforms/interactive.py +98 -0
- vispy/visuals/transforms/linear.py +564 -0
- vispy/visuals/transforms/nonlinear.py +398 -0
- vispy/visuals/transforms/tests/__init__.py +0 -0
- vispy/visuals/transforms/tests/test_transforms.py +243 -0
- vispy/visuals/transforms/transform_system.py +339 -0
- vispy/visuals/tube.py +173 -0
- vispy/visuals/visual.py +923 -0
- vispy/visuals/volume.py +1366 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.15.0.dist-info/METADATA +243 -0
- vispy-0.15.0.dist-info/RECORD +521 -0
- vispy-0.15.0.dist-info/WHEEL +6 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""Tests to quickly see if the backends look good.
|
|
2
|
+
This tests only to see if all the necessary methods are implemented,
|
|
3
|
+
whether all the right events are mentioned, and whether the keymap
|
|
4
|
+
contains all keys that should be supported.
|
|
5
|
+
|
|
6
|
+
This test basically checks whether nothing was forgotten, not that the
|
|
7
|
+
implementation is corect.
|
|
8
|
+
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import vispy
|
|
12
|
+
from vispy import keys
|
|
13
|
+
from vispy.testing import (requires_application, assert_in, run_tests_if_main,
|
|
14
|
+
assert_raises)
|
|
15
|
+
from vispy.app import use_app, Application
|
|
16
|
+
from vispy.app.backends import _template
|
|
17
|
+
from vispy.util import _get_args
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DummyApplication(Application):
|
|
21
|
+
def _use(self, backend_namd):
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _test_module_properties(_module=None):
|
|
26
|
+
"""Test application module"""
|
|
27
|
+
if _module is None:
|
|
28
|
+
app = use_app()
|
|
29
|
+
_module = app.backend_module
|
|
30
|
+
|
|
31
|
+
# Test that the keymap contains all keys supported by vispy.
|
|
32
|
+
module_fname = _module.__name__.split('.')[-1]
|
|
33
|
+
if module_fname not in ('_egl', '_osmesa'): # skip keys for EGL, osmesa
|
|
34
|
+
keymap = _module.KEYMAP
|
|
35
|
+
vispy_keys = keymap.values()
|
|
36
|
+
for keyname in dir(keys):
|
|
37
|
+
if keyname.upper() != keyname:
|
|
38
|
+
continue
|
|
39
|
+
key = getattr(keys, keyname)
|
|
40
|
+
assert_in(key, vispy_keys)
|
|
41
|
+
|
|
42
|
+
# For Qt backend, we have a common implementation
|
|
43
|
+
alt_modname = ''
|
|
44
|
+
if module_fname in ('_pyside', '_pyqt4', '_pyqt5', '_pyqt6', '_pyside2', '_pyside6'):
|
|
45
|
+
alt_modname = _module.__name__.rsplit('.', 1)[0] + '._qt'
|
|
46
|
+
|
|
47
|
+
# Test that all _vispy_x methods are there.
|
|
48
|
+
exceptions = (
|
|
49
|
+
'_vispy_get_native_canvas',
|
|
50
|
+
'_vispy_get_native_timer',
|
|
51
|
+
'_vispy_get_native_app',
|
|
52
|
+
'_vispy_reuse',
|
|
53
|
+
'_vispy_mouse_move',
|
|
54
|
+
'_vispy_mouse_press',
|
|
55
|
+
'_vispy_mouse_release',
|
|
56
|
+
'_vispy_mouse_double_click',
|
|
57
|
+
'_vispy_detect_double_click',
|
|
58
|
+
'_vispy_get_fb_bind_location',
|
|
59
|
+
'_vispy_get_geometry',
|
|
60
|
+
'_vispy_get_physical_size',
|
|
61
|
+
'_vispy_sleep',
|
|
62
|
+
'_process_backend_kwargs') # defined in base class
|
|
63
|
+
|
|
64
|
+
class KlassRef(vispy.app.base.BaseCanvasBackend):
|
|
65
|
+
def __init__(self, *args, **kwargs):
|
|
66
|
+
pass # Do not call the base class, since it will check for Canvas
|
|
67
|
+
Klass = _module.CanvasBackend
|
|
68
|
+
base = KlassRef()
|
|
69
|
+
for key in dir(KlassRef):
|
|
70
|
+
if not key.startswith('__'):
|
|
71
|
+
method = getattr(Klass, key)
|
|
72
|
+
if key not in exceptions:
|
|
73
|
+
print(key)
|
|
74
|
+
args = [None] * (len(_get_args(method)) - 1)
|
|
75
|
+
assert_raises(NotImplementedError, getattr(base, key), *args)
|
|
76
|
+
if hasattr(method, '__module__'):
|
|
77
|
+
mod_str = method.__module__ # Py3k
|
|
78
|
+
else:
|
|
79
|
+
mod_str = method.im_func.__module__
|
|
80
|
+
assert_in(mod_str, (_module.__name__, alt_modname),
|
|
81
|
+
"Method %s.%s not defined in %s"
|
|
82
|
+
% (Klass, key, _module.__name__))
|
|
83
|
+
|
|
84
|
+
Klass = _module.TimerBackend
|
|
85
|
+
KlassRef = vispy.app.timer.TimerBackend
|
|
86
|
+
for key in dir(KlassRef):
|
|
87
|
+
if not key.startswith('__'):
|
|
88
|
+
method = getattr(Klass, key)
|
|
89
|
+
if key not in exceptions:
|
|
90
|
+
if hasattr(method, '__module__'):
|
|
91
|
+
# Py3k
|
|
92
|
+
assert_in(method.__module__,
|
|
93
|
+
(_module.__name__, alt_modname))
|
|
94
|
+
else:
|
|
95
|
+
t = method.im_func.__module__ == _module.__name__
|
|
96
|
+
assert t
|
|
97
|
+
|
|
98
|
+
Klass = _module.ApplicationBackend
|
|
99
|
+
KlassRef = vispy.app.application.ApplicationBackend
|
|
100
|
+
for key in dir(KlassRef):
|
|
101
|
+
if not key.startswith('__'):
|
|
102
|
+
method = getattr(Klass, key)
|
|
103
|
+
if key not in exceptions:
|
|
104
|
+
if hasattr(method, '__module__'):
|
|
105
|
+
# Py3k
|
|
106
|
+
assert_in(method.__module__,
|
|
107
|
+
(_module.__name__, alt_modname))
|
|
108
|
+
else:
|
|
109
|
+
t = method.im_func.__module__ == _module.__name__
|
|
110
|
+
assert t
|
|
111
|
+
|
|
112
|
+
# Test that all events seem to be emitted.
|
|
113
|
+
# Get text
|
|
114
|
+
fname = _module.__file__.rstrip('c') # "strip" will break windows!
|
|
115
|
+
with open(fname, 'rb') as fid:
|
|
116
|
+
text = fid.read().decode('utf-8')
|
|
117
|
+
|
|
118
|
+
canvas = vispy.app.Canvas(create_native=False, app=DummyApplication())
|
|
119
|
+
# Stylus and touch are ignored because they are not yet implemented.
|
|
120
|
+
# Mouse events are emitted from the CanvasBackend base class.
|
|
121
|
+
ignore = set(['stylus', 'touch', 'mouse_press', 'paint',
|
|
122
|
+
'mouse_move', 'mouse_release', 'mouse_double_click',
|
|
123
|
+
'detect_double_click', 'close'])
|
|
124
|
+
if module_fname in ('_egl', '_osmesa'):
|
|
125
|
+
ignore = ignore.union(['mouse_wheel', 'key_release', 'key_press'])
|
|
126
|
+
eventNames = set(canvas.events._emitters.keys()) - ignore
|
|
127
|
+
|
|
128
|
+
if not alt_modname: # Only check for non-proxy modules
|
|
129
|
+
for name in eventNames:
|
|
130
|
+
assert_in('events.%s' % name, text,
|
|
131
|
+
'events.%s does not appear in %s' % (name, fname))
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def test_template():
|
|
135
|
+
"""Test application module template"""
|
|
136
|
+
_test_module_properties(_template)
|
|
137
|
+
assert_raises(NotImplementedError, _template._set_config, dict())
|
|
138
|
+
a = _template.ApplicationBackend()
|
|
139
|
+
print(a._vispy_get_backend_name())
|
|
140
|
+
for method in (a._vispy_process_events, a._vispy_run, a._vispy_quit,
|
|
141
|
+
a._vispy_get_native_app):
|
|
142
|
+
assert_raises(NotImplementedError, method)
|
|
143
|
+
|
|
144
|
+
class TemplateCanvasBackend(_template.CanvasBackend):
|
|
145
|
+
def __init__(self, *args, **kwargs):
|
|
146
|
+
pass # Do not call the base class, since it will check for Canvas
|
|
147
|
+
c = TemplateCanvasBackend() # _template.CanvasBackend(None)
|
|
148
|
+
print(c._vispy_get_native_canvas())
|
|
149
|
+
for method in (c._vispy_set_current, c._vispy_swap_buffers, c._vispy_close,
|
|
150
|
+
c._vispy_update, c._vispy_get_size, c._vispy_get_position):
|
|
151
|
+
assert_raises(NotImplementedError, method)
|
|
152
|
+
for method in (c._vispy_set_title, c._vispy_set_visible):
|
|
153
|
+
assert_raises(NotImplementedError, method, 0)
|
|
154
|
+
for method in (c._vispy_set_size, c._vispy_set_position):
|
|
155
|
+
assert_raises(NotImplementedError, method, 0, 0)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@requires_application()
|
|
159
|
+
def test_actual():
|
|
160
|
+
"""Test actual application module"""
|
|
161
|
+
_test_module_properties(None)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,122 @@
|
|
|
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
|
+
|
|
5
|
+
from vispy.app import Canvas, MouseEvent
|
|
6
|
+
from vispy.visuals import ImageVisual
|
|
7
|
+
from vispy.testing import requires_application
|
|
8
|
+
from vispy.visuals.transforms import STTransform
|
|
9
|
+
from vispy import gloo
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
import pytest
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@requires_application()
|
|
16
|
+
@pytest.mark.parametrize(
|
|
17
|
+
'blend_func',
|
|
18
|
+
[
|
|
19
|
+
('src_alpha', 'one_minus_src_alpha', 'one', 'one_minus_src_alpha'),
|
|
20
|
+
('src_alpha', 'one_minus_src_alpha'),
|
|
21
|
+
None,
|
|
22
|
+
])
|
|
23
|
+
def test_canvas_render(blend_func):
|
|
24
|
+
"""Test rendering a canvas to an array.
|
|
25
|
+
|
|
26
|
+
Different blending functions are used to test what various Visuals may
|
|
27
|
+
produce without actually using different types of Visuals.
|
|
28
|
+
|
|
29
|
+
"""
|
|
30
|
+
with Canvas(size=(125, 125), show=True, title='run') as c:
|
|
31
|
+
im1 = np.zeros((100, 100, 4)).astype(np.float32)
|
|
32
|
+
im1[:, :, 0] = 1
|
|
33
|
+
im1[:, :, 3] = 1
|
|
34
|
+
|
|
35
|
+
im2 = np.zeros((50, 50, 4)).astype(np.float32)
|
|
36
|
+
im2[:, :, 1] = 1
|
|
37
|
+
im2[:, :, 3] = 0.4
|
|
38
|
+
|
|
39
|
+
# Create the image
|
|
40
|
+
image1 = ImageVisual(im1)
|
|
41
|
+
image1.transform = STTransform(translate=(20, 20, 0))
|
|
42
|
+
image1.transforms.configure(canvas=c, viewport=(0, 0, 125, 125))
|
|
43
|
+
image2 = ImageVisual(im2)
|
|
44
|
+
image2.transform = STTransform(translate=(0, 0, -1))
|
|
45
|
+
image2.transforms.configure(canvas=c, viewport=(0, 0, 125, 125))
|
|
46
|
+
if blend_func:
|
|
47
|
+
image1.set_gl_state(preset='translucent', blend_func=blend_func)
|
|
48
|
+
image2.set_gl_state(preset='translucent', blend_func=blend_func)
|
|
49
|
+
|
|
50
|
+
@c.events.draw.connect
|
|
51
|
+
def on_draw(ev):
|
|
52
|
+
gloo.clear('black')
|
|
53
|
+
gloo.set_viewport(0, 0, *c.physical_size)
|
|
54
|
+
image1.draw()
|
|
55
|
+
image2.draw()
|
|
56
|
+
|
|
57
|
+
rgba_result = c.render()
|
|
58
|
+
rgb_result = c.render(alpha=False)
|
|
59
|
+
|
|
60
|
+
# the results should be the same except for alpha
|
|
61
|
+
np.testing.assert_allclose(rgba_result[..., :3], rgb_result)
|
|
62
|
+
# the image should have something drawn in it
|
|
63
|
+
assert not np.allclose(rgba_result[..., :3], 0)
|
|
64
|
+
# the alpha should not be completely transparent
|
|
65
|
+
assert not np.allclose(rgba_result[..., 3], 0)
|
|
66
|
+
if blend_func is None or 'one' in blend_func:
|
|
67
|
+
# no transparency
|
|
68
|
+
np.testing.assert_allclose(rgba_result[..., 3], 255)
|
|
69
|
+
else:
|
|
70
|
+
# the alpha should have some transparency
|
|
71
|
+
# this part of this test fails on macOS 12 at the moment
|
|
72
|
+
# see https://github.com/vispy/vispy/pull/2324#issuecomment-1163350672
|
|
73
|
+
assert (rgba_result[..., 3] != 255).any()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@requires_application()
|
|
77
|
+
@pytest.mark.parametrize(
|
|
78
|
+
'preset',
|
|
79
|
+
[
|
|
80
|
+
'opaque', 'additive', 'translucent',
|
|
81
|
+
])
|
|
82
|
+
def test_blend_presets(preset):
|
|
83
|
+
"""Test blending presets a canvas to an array.
|
|
84
|
+
|
|
85
|
+
Different blending presets are used to test that they properly set
|
|
86
|
+
blend equations.
|
|
87
|
+
|
|
88
|
+
"""
|
|
89
|
+
with Canvas(size=(125, 125), show=True, title='run') as c:
|
|
90
|
+
im1 = np.zeros((100, 100, 4)).astype(np.float32)
|
|
91
|
+
im1[:, :, 1] = 1
|
|
92
|
+
im1[:, :, 3] = .4
|
|
93
|
+
# Create the image
|
|
94
|
+
image1 = ImageVisual(im1)
|
|
95
|
+
image1.transform = STTransform(translate=(20, 20, -1))
|
|
96
|
+
image1.transforms.configure(canvas=c, viewport=(0, 0, 125, 125))
|
|
97
|
+
|
|
98
|
+
gloo.set_state(blend_equation='min')
|
|
99
|
+
image1.set_gl_state(preset)
|
|
100
|
+
|
|
101
|
+
@c.events.draw.connect
|
|
102
|
+
def on_draw(ev):
|
|
103
|
+
gloo.clear('black')
|
|
104
|
+
gloo.set_viewport(0, 0, *c.physical_size)
|
|
105
|
+
image1.draw()
|
|
106
|
+
|
|
107
|
+
rgba_result = c.render()
|
|
108
|
+
assert not np.allclose(rgba_result[..., :3], 0)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@requires_application()
|
|
112
|
+
@pytest.mark.parametrize("mouse_event_type, button, buttons, expected_button, expected_buttons", [
|
|
113
|
+
('mouse_press', 1, [], 1, [1]),
|
|
114
|
+
('mouse_release', 1, [1], 1, [1]),
|
|
115
|
+
# left click pressed and held, followed by a right click
|
|
116
|
+
('mouse_press', 2, [1], 2, [1, 2]),
|
|
117
|
+
('mouse_release', 2, [1, 2], 2, [1, 2]),
|
|
118
|
+
])
|
|
119
|
+
def test_mouse_event(mouse_event_type, button, buttons, expected_button, expected_buttons):
|
|
120
|
+
mev = MouseEvent(type=mouse_event_type, button=button, buttons=buttons)
|
|
121
|
+
assert mev.buttons == expected_buttons
|
|
122
|
+
assert mev.button == expected_button
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from vispy.testing import (requires_application, SkipTest, run_tests_if_main,
|
|
6
|
+
assert_raises, IS_CI)
|
|
7
|
+
from vispy.app import Canvas, use_app
|
|
8
|
+
from vispy.gloo import get_gl_configuration, Program
|
|
9
|
+
from vispy.gloo.gl import check_error
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@requires_application()
|
|
13
|
+
def test_context_properties():
|
|
14
|
+
"""Test setting context properties"""
|
|
15
|
+
a = use_app()
|
|
16
|
+
if a.backend_name.lower() == 'pyglet':
|
|
17
|
+
return # cannot set more than once on Pyglet
|
|
18
|
+
if a.backend_name.lower() == 'osmesa':
|
|
19
|
+
return # cannot set config on OSMesa
|
|
20
|
+
if 'pyqt5' in a.backend_name.lower() or 'pyqt6' in a.backend_name.lower() or 'pyside2' in a.backend_name.lower() or 'pyside6' in a.backend_name.lower():
|
|
21
|
+
pytest.xfail("Context sharing is not supported in PyQt5, PyQt6, PySide2, or PySide6 at this time.")
|
|
22
|
+
|
|
23
|
+
# stereo, double buffer won't work on every sys
|
|
24
|
+
configs = [dict(samples=4), dict(stencil_size=8),
|
|
25
|
+
dict(samples=4, stencil_size=8)]
|
|
26
|
+
if a.backend_name.lower() != 'glfw': # glfw *always* double-buffers
|
|
27
|
+
configs.append(dict(double_buffer=False, samples=4))
|
|
28
|
+
configs.append(dict(double_buffer=False))
|
|
29
|
+
else:
|
|
30
|
+
assert_raises(RuntimeError, Canvas, app=a,
|
|
31
|
+
config=dict(double_buffer=False))
|
|
32
|
+
if a.backend_name.lower() == 'sdl2' and IS_CI:
|
|
33
|
+
raise SkipTest('Travis SDL cannot set context')
|
|
34
|
+
for config in configs:
|
|
35
|
+
n_items = len(config)
|
|
36
|
+
with Canvas(config=config):
|
|
37
|
+
if IS_CI:
|
|
38
|
+
# Travis and Appveyor cannot handle obtaining these values
|
|
39
|
+
props = config
|
|
40
|
+
else:
|
|
41
|
+
props = get_gl_configuration()
|
|
42
|
+
assert len(config) == n_items
|
|
43
|
+
for key, val in config.items():
|
|
44
|
+
# XXX knownfail for windows samples, and wx/tkinter (all platforms)
|
|
45
|
+
if key == 'samples':
|
|
46
|
+
will_fail_backend = a.backend_name.lower() in ('wx', 'tkinter')
|
|
47
|
+
if not (sys.platform.startswith('win') or will_fail_backend):
|
|
48
|
+
assert val == props[key], key
|
|
49
|
+
assert_raises(TypeError, Canvas, config='foo')
|
|
50
|
+
assert_raises(KeyError, Canvas, config=dict(foo=True))
|
|
51
|
+
assert_raises(TypeError, Canvas, config=dict(double_buffer='foo'))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@requires_application()
|
|
55
|
+
def test_context_sharing():
|
|
56
|
+
"""Test context sharing"""
|
|
57
|
+
with Canvas() as c1:
|
|
58
|
+
vert = "attribute vec4 pos;\nvoid main (void) {gl_Position = pos;}"
|
|
59
|
+
frag = "void main (void) {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}"
|
|
60
|
+
program = Program(vert, frag)
|
|
61
|
+
program['pos'] = [(1, 2, 3, 1), (4, 5, 6, 1)]
|
|
62
|
+
program.draw('points')
|
|
63
|
+
|
|
64
|
+
def check():
|
|
65
|
+
# Do something to program and see if it worked
|
|
66
|
+
program['pos'] = [(1, 2, 3, 1), (4, 5, 6, 1)] # Do command
|
|
67
|
+
program.draw('points')
|
|
68
|
+
check_error()
|
|
69
|
+
|
|
70
|
+
# Check while c1 is active
|
|
71
|
+
check()
|
|
72
|
+
|
|
73
|
+
# pyqt5 does not currently support context sharing, pyside6 seg faults on app tests
|
|
74
|
+
if 'pyqt5' in c1.app.backend_name.lower() or 'pyqt6' in c1.app.backend_name.lower() or 'pyside2' in c1.app.backend_name.lower() or 'pyside6' in c1.app.backend_name.lower():
|
|
75
|
+
pytest.xfail("Context sharing is not supported in PyQt5, PyQt6, PySide2, or PySide6 at this time.")
|
|
76
|
+
|
|
77
|
+
# Tkinter does not currently support context sharing
|
|
78
|
+
if 'tk' in c1.app.backend_name.lower():
|
|
79
|
+
pytest.xfail("Context sharing is not supported in Tkinter at this time.")
|
|
80
|
+
|
|
81
|
+
# Check while c2 is active (with different context)
|
|
82
|
+
with Canvas() as c2:
|
|
83
|
+
# pyglet always shares
|
|
84
|
+
if 'pyglet' not in c2.app.backend_name.lower():
|
|
85
|
+
assert_raises(Exception, check)
|
|
86
|
+
|
|
87
|
+
# Check while c2 is active (with *same* context)
|
|
88
|
+
with Canvas(shared=c1.context) as c2:
|
|
89
|
+
assert c1.context.shared is c2.context.shared # same object
|
|
90
|
+
check()
|
|
91
|
+
|
|
92
|
+
run_tests_if_main()
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
|
|
5
|
+
from os import path as op
|
|
6
|
+
import warnings
|
|
7
|
+
|
|
8
|
+
from vispy.testing import requires_application
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@requires_application('pyqt4', has=['uic'])
|
|
12
|
+
def test_qt_designer():
|
|
13
|
+
"""Embed Canvas via Qt Designer"""
|
|
14
|
+
from PyQt4 import QtGui, uic
|
|
15
|
+
app = QtGui.QApplication.instance()
|
|
16
|
+
if app is None:
|
|
17
|
+
app = QtGui.QApplication([])
|
|
18
|
+
|
|
19
|
+
fname = op.join(op.dirname(__file__), 'qt-designer.ui')
|
|
20
|
+
with warnings.catch_warnings(record=True): # pyqt4 deprecation warning
|
|
21
|
+
WindowTemplate, TemplateBaseClass = uic.loadUiType(fname)
|
|
22
|
+
|
|
23
|
+
class MainWindow(TemplateBaseClass):
|
|
24
|
+
def __init__(self):
|
|
25
|
+
TemplateBaseClass.__init__(self)
|
|
26
|
+
|
|
27
|
+
self.ui = WindowTemplate()
|
|
28
|
+
self.ui.setupUi(self)
|
|
29
|
+
|
|
30
|
+
win = MainWindow()
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
canvas = win.ui.canvas
|
|
34
|
+
# test we can access properties of the internal canvas:
|
|
35
|
+
canvas.central_widget.add_view()
|
|
36
|
+
win.show()
|
|
37
|
+
app.processEvents()
|
|
38
|
+
finally:
|
|
39
|
+
win.close()
|
|
40
|
+
|
|
41
|
+
return win
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Don't use run_tests_if_main(), because we want to show the win
|
|
45
|
+
if __name__ == '__main__':
|
|
46
|
+
win = test_qt_designer()
|
|
47
|
+
win.show()
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from time import sleep
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
import numpy as np
|
|
8
|
+
from numpy.testing import assert_allclose
|
|
9
|
+
|
|
10
|
+
from vispy.app import use_app, Canvas, Timer
|
|
11
|
+
from vispy.testing import requires_application, SkipTest, run_tests_if_main, IS_TRAVIS_CI
|
|
12
|
+
from vispy.util.ptime import time
|
|
13
|
+
from vispy.gloo import gl
|
|
14
|
+
from vispy.gloo.util import _screenshot
|
|
15
|
+
|
|
16
|
+
_win_size = (200, 50)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _update_process_check(canvas, val, draw=True):
|
|
20
|
+
"""Update, process, and check result"""
|
|
21
|
+
if draw:
|
|
22
|
+
canvas.update()
|
|
23
|
+
canvas.app.process_events()
|
|
24
|
+
canvas.app.process_events()
|
|
25
|
+
sleep(0.03) # give it time to swap (Qt?)
|
|
26
|
+
canvas._backend._vispy_set_current()
|
|
27
|
+
print(' check %s' % val)
|
|
28
|
+
# check screenshot to see if it's all one color
|
|
29
|
+
ss = _screenshot()
|
|
30
|
+
try:
|
|
31
|
+
assert_allclose(ss.shape[:2], _win_size[::-1])
|
|
32
|
+
except Exception:
|
|
33
|
+
print('!!!!!!!!!! FAIL bad size %s' % list(ss.shape[:2]))
|
|
34
|
+
raise
|
|
35
|
+
goal = val * np.ones(ss.shape)
|
|
36
|
+
try:
|
|
37
|
+
# Get rid of the alpha value before testing
|
|
38
|
+
# It can be off by 1 due to rounding
|
|
39
|
+
assert_allclose(ss[:, :, :3], goal[:, :, :3], atol=1)
|
|
40
|
+
except Exception:
|
|
41
|
+
print('!!!!!!!!!! FAIL %s' % np.unique(ss))
|
|
42
|
+
raise
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@pytest.mark.xfail(IS_TRAVIS_CI and 'darwin' in sys.platform,
|
|
46
|
+
reason='Travis OSX causes segmentation fault on this test for an unknown reason.')
|
|
47
|
+
@requires_application()
|
|
48
|
+
def test_multiple_canvases():
|
|
49
|
+
"""Testing multiple canvases"""
|
|
50
|
+
n_check = 3
|
|
51
|
+
app = use_app()
|
|
52
|
+
with Canvas(app=app, size=_win_size, title='same_0') as c0:
|
|
53
|
+
with Canvas(app=app, size=_win_size, title='same_1') as c1:
|
|
54
|
+
ct = [0, 0]
|
|
55
|
+
|
|
56
|
+
@c0.events.draw.connect
|
|
57
|
+
def draw0(event):
|
|
58
|
+
ct[0] += 1
|
|
59
|
+
c0.update()
|
|
60
|
+
|
|
61
|
+
@c1.events.draw.connect # noqa, analysis:ignore
|
|
62
|
+
def draw1(event):
|
|
63
|
+
ct[1] += 1
|
|
64
|
+
c1.update()
|
|
65
|
+
|
|
66
|
+
c0.show() # ensure visible
|
|
67
|
+
c1.show()
|
|
68
|
+
c0.update() # force first draw
|
|
69
|
+
c1.update()
|
|
70
|
+
|
|
71
|
+
timeout = time() + 2.0
|
|
72
|
+
while (ct[0] < n_check or ct[1] < n_check) and time() < timeout:
|
|
73
|
+
app.process_events()
|
|
74
|
+
print((ct, n_check))
|
|
75
|
+
assert n_check <= ct[0] <= n_check + 20 # be quite lenient
|
|
76
|
+
assert n_check <= ct[1] <= n_check + 20
|
|
77
|
+
|
|
78
|
+
# check timer
|
|
79
|
+
global timer_ran
|
|
80
|
+
timer_ran = False
|
|
81
|
+
|
|
82
|
+
def on_timer(_):
|
|
83
|
+
global timer_ran
|
|
84
|
+
timer_ran = True
|
|
85
|
+
t = Timer(0.1, app=app, connect=on_timer, iterations=1, # noqa
|
|
86
|
+
start=True)
|
|
87
|
+
app.process_events()
|
|
88
|
+
sleep(0.5) # long for slow systems
|
|
89
|
+
app.process_events()
|
|
90
|
+
app.process_events()
|
|
91
|
+
assert timer_ran
|
|
92
|
+
|
|
93
|
+
if app.backend_name.lower() == 'wx':
|
|
94
|
+
raise SkipTest('wx fails test #2') # XXX TODO Fix this
|
|
95
|
+
|
|
96
|
+
kwargs = dict(app=app, autoswap=False, size=_win_size,
|
|
97
|
+
show=True)
|
|
98
|
+
with Canvas(title='0', **kwargs) as c0:
|
|
99
|
+
with Canvas(title='1', **kwargs) as c1:
|
|
100
|
+
bgcolors = [None] * 2
|
|
101
|
+
|
|
102
|
+
@c0.events.draw.connect
|
|
103
|
+
def draw00(event):
|
|
104
|
+
print(' {0:7}: {1}'.format('0', bgcolors[0]))
|
|
105
|
+
if bgcolors[0] is not None:
|
|
106
|
+
gl.glViewport(0, 0, *list(_win_size))
|
|
107
|
+
gl.glClearColor(*bgcolors[0])
|
|
108
|
+
gl.glClear(gl.GL_COLOR_BUFFER_BIT)
|
|
109
|
+
gl.glFinish()
|
|
110
|
+
|
|
111
|
+
@c1.events.draw.connect
|
|
112
|
+
def draw11(event):
|
|
113
|
+
print(' {0:7}: {1}'.format('1', bgcolors[1]))
|
|
114
|
+
if bgcolors[1] is not None:
|
|
115
|
+
gl.glViewport(0, 0, *list(_win_size))
|
|
116
|
+
gl.glClearColor(*bgcolors[1])
|
|
117
|
+
gl.glClear(gl.GL_COLOR_BUFFER_BIT)
|
|
118
|
+
gl.glFinish()
|
|
119
|
+
|
|
120
|
+
for ci, canvas in enumerate((c0, c1)):
|
|
121
|
+
print('draw %s' % canvas.title)
|
|
122
|
+
bgcolors[ci] = [0.5, 0.5, 0.5, 1.0]
|
|
123
|
+
_update_process_check(canvas, 127)
|
|
124
|
+
|
|
125
|
+
for ci, canvas in enumerate((c0, c1)):
|
|
126
|
+
print('test')
|
|
127
|
+
_update_process_check(canvas, 127, draw=False)
|
|
128
|
+
bgcolors[ci] = [1., 1., 1., 1.]
|
|
129
|
+
_update_process_check(canvas, 255)
|
|
130
|
+
bgcolors[ci] = [0.25, 0.25, 0.25, 0.25]
|
|
131
|
+
_update_process_check(canvas, 64)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
run_tests_if_main()
|