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,513 @@
|
|
|
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
|
+
"""vispy backend for glfw."""
|
|
5
|
+
|
|
6
|
+
# To install GLFW on Ubuntu, use sudo apt-get install libglfw3.
|
|
7
|
+
# On OSX, consider using brew.
|
|
8
|
+
|
|
9
|
+
from __future__ import division
|
|
10
|
+
|
|
11
|
+
import atexit
|
|
12
|
+
from time import sleep
|
|
13
|
+
import gc
|
|
14
|
+
import os
|
|
15
|
+
|
|
16
|
+
from ..base import BaseApplicationBackend, BaseCanvasBackend, BaseTimerBackend
|
|
17
|
+
from ...util import keys, logger
|
|
18
|
+
from ...util.ptime import time
|
|
19
|
+
from ... import config
|
|
20
|
+
|
|
21
|
+
USE_EGL = config['gl_backend'].lower().startswith('es')
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# -------------------------------------------------------------------- init ---
|
|
25
|
+
|
|
26
|
+
glfw = None
|
|
27
|
+
try:
|
|
28
|
+
import glfw
|
|
29
|
+
except ImportError:
|
|
30
|
+
why_not = "Could not import glfw, you may need to `pip install glfw` first."
|
|
31
|
+
available, testable, why_not, which = False, False, why_not, None
|
|
32
|
+
except Exception as err:
|
|
33
|
+
why_not = "Error importing glfw: " + str(err)
|
|
34
|
+
available, testable, why_not, which = False, False, why_not, None
|
|
35
|
+
else:
|
|
36
|
+
if USE_EGL:
|
|
37
|
+
available, testable, why_not = False, False, 'EGL not supported'
|
|
38
|
+
which = 'glfw ' + str(glfw.__version__)
|
|
39
|
+
else:
|
|
40
|
+
available, testable, why_not = True, True, None
|
|
41
|
+
which = 'glfw ' + str(glfw.__version__)
|
|
42
|
+
|
|
43
|
+
if glfw:
|
|
44
|
+
# Map native keys to vispy keys
|
|
45
|
+
KEYMAP = {
|
|
46
|
+
glfw.KEY_LEFT_SHIFT: keys.SHIFT,
|
|
47
|
+
glfw.KEY_RIGHT_SHIFT: keys.SHIFT,
|
|
48
|
+
glfw.KEY_LEFT_CONTROL: keys.CONTROL,
|
|
49
|
+
glfw.KEY_RIGHT_CONTROL: keys.CONTROL,
|
|
50
|
+
glfw.KEY_LEFT_ALT: keys.ALT,
|
|
51
|
+
glfw.KEY_RIGHT_ALT: keys.ALT,
|
|
52
|
+
glfw.KEY_LEFT_SUPER: keys.META,
|
|
53
|
+
glfw.KEY_RIGHT_SUPER: keys.META,
|
|
54
|
+
|
|
55
|
+
glfw.KEY_LEFT: keys.LEFT,
|
|
56
|
+
glfw.KEY_UP: keys.UP,
|
|
57
|
+
glfw.KEY_RIGHT: keys.RIGHT,
|
|
58
|
+
glfw.KEY_DOWN: keys.DOWN,
|
|
59
|
+
glfw.KEY_PAGE_UP: keys.PAGEUP,
|
|
60
|
+
glfw.KEY_PAGE_DOWN: keys.PAGEDOWN,
|
|
61
|
+
|
|
62
|
+
glfw.KEY_INSERT: keys.INSERT,
|
|
63
|
+
glfw.KEY_DELETE: keys.DELETE,
|
|
64
|
+
glfw.KEY_HOME: keys.HOME,
|
|
65
|
+
glfw.KEY_END: keys.END,
|
|
66
|
+
|
|
67
|
+
glfw.KEY_ESCAPE: keys.ESCAPE,
|
|
68
|
+
glfw.KEY_BACKSPACE: keys.BACKSPACE,
|
|
69
|
+
|
|
70
|
+
glfw.KEY_F1: keys.F1,
|
|
71
|
+
glfw.KEY_F2: keys.F2,
|
|
72
|
+
glfw.KEY_F3: keys.F3,
|
|
73
|
+
glfw.KEY_F4: keys.F4,
|
|
74
|
+
glfw.KEY_F5: keys.F5,
|
|
75
|
+
glfw.KEY_F6: keys.F6,
|
|
76
|
+
glfw.KEY_F7: keys.F7,
|
|
77
|
+
glfw.KEY_F8: keys.F8,
|
|
78
|
+
glfw.KEY_F9: keys.F9,
|
|
79
|
+
glfw.KEY_F10: keys.F10,
|
|
80
|
+
glfw.KEY_F11: keys.F11,
|
|
81
|
+
glfw.KEY_F12: keys.F12,
|
|
82
|
+
|
|
83
|
+
glfw.KEY_SPACE: keys.SPACE,
|
|
84
|
+
glfw.KEY_ENTER: keys.ENTER,
|
|
85
|
+
'\r': keys.ENTER,
|
|
86
|
+
glfw.KEY_TAB: keys.TAB,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
BUTTONMAP = {glfw.MOUSE_BUTTON_LEFT: 1,
|
|
90
|
+
glfw.MOUSE_BUTTON_RIGHT: 2,
|
|
91
|
+
glfw.MOUSE_BUTTON_MIDDLE: 3
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
MOD_KEYS = [keys.SHIFT, keys.ALT, keys.CONTROL, keys.META]
|
|
95
|
+
_GLFW_INITIALIZED = False
|
|
96
|
+
_VP_GLFW_ALL_WINDOWS = []
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _get_glfw_windows():
|
|
100
|
+
wins = list()
|
|
101
|
+
for win in _VP_GLFW_ALL_WINDOWS:
|
|
102
|
+
if isinstance(win, CanvasBackend):
|
|
103
|
+
wins.append(win)
|
|
104
|
+
return wins
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
# -------------------------------------------------------------- capability ---
|
|
108
|
+
|
|
109
|
+
capability = dict( # things that can be set by the backend
|
|
110
|
+
title=True,
|
|
111
|
+
size=True,
|
|
112
|
+
position=True,
|
|
113
|
+
show=True,
|
|
114
|
+
vsync=True,
|
|
115
|
+
resizable=True,
|
|
116
|
+
decorate=True,
|
|
117
|
+
fullscreen=True,
|
|
118
|
+
context=True,
|
|
119
|
+
multi_window=True,
|
|
120
|
+
scroll=True,
|
|
121
|
+
parent=False,
|
|
122
|
+
always_on_top=True,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# ------------------------------------------------------- set_configuration ---
|
|
127
|
+
|
|
128
|
+
def _set_config(c):
|
|
129
|
+
"""Set gl configuration for GLFW."""
|
|
130
|
+
glfw.window_hint(glfw.RED_BITS, c['red_size'])
|
|
131
|
+
glfw.window_hint(glfw.GREEN_BITS, c['green_size'])
|
|
132
|
+
glfw.window_hint(glfw.BLUE_BITS, c['blue_size'])
|
|
133
|
+
glfw.window_hint(glfw.ALPHA_BITS, c['alpha_size'])
|
|
134
|
+
|
|
135
|
+
glfw.window_hint(glfw.ACCUM_RED_BITS, 0)
|
|
136
|
+
glfw.window_hint(glfw.ACCUM_GREEN_BITS, 0)
|
|
137
|
+
glfw.window_hint(glfw.ACCUM_BLUE_BITS, 0)
|
|
138
|
+
glfw.window_hint(glfw.ACCUM_ALPHA_BITS, 0)
|
|
139
|
+
|
|
140
|
+
glfw.window_hint(glfw.DEPTH_BITS, c['depth_size'])
|
|
141
|
+
glfw.window_hint(glfw.STENCIL_BITS, c['stencil_size'])
|
|
142
|
+
# glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, c['major_version'])
|
|
143
|
+
# glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, c['minor_version'])
|
|
144
|
+
# glfw.window_hint(glfw.SRGB_CAPABLE, c['srgb'])
|
|
145
|
+
glfw.window_hint(glfw.SAMPLES, c['samples'])
|
|
146
|
+
glfw.window_hint(glfw.STEREO, c['stereo'])
|
|
147
|
+
if not c['double_buffer']:
|
|
148
|
+
raise RuntimeError('GLFW must double buffer, consider using a '
|
|
149
|
+
'different backend, or using double buffering')
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# ------------------------------------------------------------- application ---
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
_glfw_errors = []
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _error_callback(num, descr):
|
|
159
|
+
_glfw_errors.append('Error %s: %s' % (num, descr))
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class ApplicationBackend(BaseApplicationBackend):
|
|
163
|
+
|
|
164
|
+
def __init__(self):
|
|
165
|
+
BaseApplicationBackend.__init__(self)
|
|
166
|
+
self._timers = list()
|
|
167
|
+
|
|
168
|
+
def _add_timer(self, timer):
|
|
169
|
+
if timer not in self._timers:
|
|
170
|
+
self._timers.append(timer)
|
|
171
|
+
|
|
172
|
+
def _vispy_get_backend_name(self):
|
|
173
|
+
return 'Glfw'
|
|
174
|
+
|
|
175
|
+
def _vispy_process_events(self):
|
|
176
|
+
glfw.poll_events()
|
|
177
|
+
for timer in self._timers:
|
|
178
|
+
timer._tick()
|
|
179
|
+
wins = _get_glfw_windows()
|
|
180
|
+
for win in wins:
|
|
181
|
+
if win._needs_draw:
|
|
182
|
+
win._needs_draw = False
|
|
183
|
+
win._on_draw()
|
|
184
|
+
|
|
185
|
+
def _vispy_run(self):
|
|
186
|
+
wins = _get_glfw_windows()
|
|
187
|
+
while any(w._id is not None and not glfw.window_should_close(w._id)
|
|
188
|
+
for w in wins):
|
|
189
|
+
self._vispy_process_events()
|
|
190
|
+
self._vispy_quit() # to clean up
|
|
191
|
+
|
|
192
|
+
def _vispy_quit(self):
|
|
193
|
+
# Close windows
|
|
194
|
+
wins = _get_glfw_windows()
|
|
195
|
+
for win in wins:
|
|
196
|
+
if win._vispy_canvas is not None:
|
|
197
|
+
win._vispy_canvas.close()
|
|
198
|
+
# tear down timers
|
|
199
|
+
for timer in self._timers:
|
|
200
|
+
timer._vispy_stop()
|
|
201
|
+
self._timers = []
|
|
202
|
+
|
|
203
|
+
def _vispy_get_native_app(self):
|
|
204
|
+
global _GLFW_INITIALIZED
|
|
205
|
+
if not _GLFW_INITIALIZED:
|
|
206
|
+
cwd = os.getcwd()
|
|
207
|
+
glfw.set_error_callback(_error_callback)
|
|
208
|
+
try:
|
|
209
|
+
if not glfw.init(): # only ever call once
|
|
210
|
+
raise OSError('Could not init glfw:\n%r' % _glfw_errors)
|
|
211
|
+
finally:
|
|
212
|
+
os.chdir(cwd)
|
|
213
|
+
glfw.set_error_callback(None)
|
|
214
|
+
atexit.register(glfw.terminate)
|
|
215
|
+
_GLFW_INITIALIZED = True
|
|
216
|
+
return glfw
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
# ------------------------------------------------------------------ canvas ---
|
|
220
|
+
|
|
221
|
+
class CanvasBackend(BaseCanvasBackend):
|
|
222
|
+
"""Glfw backend for Canvas abstract class."""
|
|
223
|
+
|
|
224
|
+
def __init__(self, vispy_canvas, **kwargs):
|
|
225
|
+
BaseCanvasBackend.__init__(self, vispy_canvas)
|
|
226
|
+
p = self._process_backend_kwargs(kwargs)
|
|
227
|
+
self._initialized = False
|
|
228
|
+
|
|
229
|
+
# Deal with config
|
|
230
|
+
_set_config(p.context.config)
|
|
231
|
+
# Deal with context
|
|
232
|
+
p.context.shared.add_ref('glfw', self)
|
|
233
|
+
if p.context.shared.ref is self:
|
|
234
|
+
share = None
|
|
235
|
+
else:
|
|
236
|
+
share = p.context.shared.ref._id
|
|
237
|
+
|
|
238
|
+
glfw.window_hint(glfw.REFRESH_RATE, 0) # highest possible
|
|
239
|
+
glfw.window_hint(glfw.RESIZABLE, int(p.resizable))
|
|
240
|
+
glfw.window_hint(glfw.DECORATED, int(p.decorate))
|
|
241
|
+
glfw.window_hint(glfw.VISIBLE, 0) # start out hidden
|
|
242
|
+
glfw.window_hint(glfw.FLOATING, int(p.always_on_top))
|
|
243
|
+
if p.fullscreen is not False:
|
|
244
|
+
self._fullscreen = True
|
|
245
|
+
if p.fullscreen is True:
|
|
246
|
+
monitor = glfw.get_primary_monitor()
|
|
247
|
+
else:
|
|
248
|
+
monitor = glfw.get_monitors()
|
|
249
|
+
if p.fullscreen >= len(monitor):
|
|
250
|
+
raise ValueError('fullscreen must be <= %s'
|
|
251
|
+
% len(monitor))
|
|
252
|
+
monitor = monitor[p.fullscreen]
|
|
253
|
+
use_size = glfw.get_video_mode(monitor)[0][:2]
|
|
254
|
+
if use_size != tuple(p.size):
|
|
255
|
+
logger.debug('Requested size %s, will be ignored to '
|
|
256
|
+
'use fullscreen mode %s' % (p.size, use_size))
|
|
257
|
+
size = use_size
|
|
258
|
+
else:
|
|
259
|
+
self._fullscreen = False
|
|
260
|
+
monitor = None
|
|
261
|
+
size = p.size
|
|
262
|
+
|
|
263
|
+
self._id = glfw.create_window(width=size[0], height=size[1],
|
|
264
|
+
title=p.title, monitor=monitor,
|
|
265
|
+
share=share)
|
|
266
|
+
if not self._id:
|
|
267
|
+
raise RuntimeError('Could not create window')
|
|
268
|
+
|
|
269
|
+
glfw.make_context_current(self._id)
|
|
270
|
+
glfw.swap_interval(1 if p.vsync else 0) # needs a valid context
|
|
271
|
+
|
|
272
|
+
_VP_GLFW_ALL_WINDOWS.append(self)
|
|
273
|
+
self._mod = list()
|
|
274
|
+
|
|
275
|
+
# Register callbacks
|
|
276
|
+
glfw.set_window_refresh_callback(self._id, self._on_draw)
|
|
277
|
+
glfw.set_window_size_callback(self._id, self._on_resize)
|
|
278
|
+
glfw.set_key_callback(self._id, self._on_key_press)
|
|
279
|
+
glfw.set_char_callback(self._id, self._on_key_char)
|
|
280
|
+
glfw.set_mouse_button_callback(self._id, self._on_mouse_button)
|
|
281
|
+
glfw.set_scroll_callback(self._id, self._on_mouse_scroll)
|
|
282
|
+
glfw.set_cursor_pos_callback(self._id, self._on_mouse_motion)
|
|
283
|
+
glfw.set_window_close_callback(self._id, self._on_close)
|
|
284
|
+
self._vispy_canvas_ = None
|
|
285
|
+
self._needs_draw = False
|
|
286
|
+
self._vispy_canvas.set_current()
|
|
287
|
+
if p.position is not None:
|
|
288
|
+
self._vispy_set_position(*p.position)
|
|
289
|
+
if p.show:
|
|
290
|
+
glfw.show_window(self._id)
|
|
291
|
+
|
|
292
|
+
# Init
|
|
293
|
+
self._initialized = True
|
|
294
|
+
self._next_key_events = []
|
|
295
|
+
self._next_key_text = {}
|
|
296
|
+
self._vispy_canvas.set_current()
|
|
297
|
+
self._vispy_canvas.events.initialize()
|
|
298
|
+
self._on_resize(self._id, size[0], size[1])
|
|
299
|
+
|
|
300
|
+
def _vispy_warmup(self):
|
|
301
|
+
etime = time() + 0.25
|
|
302
|
+
while time() < etime:
|
|
303
|
+
sleep(0.01)
|
|
304
|
+
self._vispy_canvas.set_current()
|
|
305
|
+
self._vispy_canvas.app.process_events()
|
|
306
|
+
|
|
307
|
+
def _vispy_set_current(self):
|
|
308
|
+
if self._id is None:
|
|
309
|
+
return
|
|
310
|
+
# Make this the current context
|
|
311
|
+
glfw.make_context_current(self._id)
|
|
312
|
+
|
|
313
|
+
def _vispy_swap_buffers(self):
|
|
314
|
+
if self._id is None:
|
|
315
|
+
return
|
|
316
|
+
# Swap front and back buffer
|
|
317
|
+
glfw.swap_buffers(self._id)
|
|
318
|
+
|
|
319
|
+
def _vispy_set_title(self, title):
|
|
320
|
+
if self._id is None:
|
|
321
|
+
return
|
|
322
|
+
# Set the window title. Has no effect for widgets
|
|
323
|
+
glfw.set_window_title(self._id, title)
|
|
324
|
+
|
|
325
|
+
def _vispy_set_size(self, w, h):
|
|
326
|
+
if self._id is None:
|
|
327
|
+
return
|
|
328
|
+
# Set size of the widget or window
|
|
329
|
+
glfw.set_window_size(self._id, w, h)
|
|
330
|
+
|
|
331
|
+
def _vispy_set_position(self, x, y):
|
|
332
|
+
if self._id is None:
|
|
333
|
+
return
|
|
334
|
+
# Set position of the widget or window. May have no effect for widgets
|
|
335
|
+
glfw.set_window_pos(self._id, x, y)
|
|
336
|
+
|
|
337
|
+
def _vispy_set_visible(self, visible):
|
|
338
|
+
# Show or hide the window or widget
|
|
339
|
+
if self._id is None:
|
|
340
|
+
return
|
|
341
|
+
if visible:
|
|
342
|
+
glfw.show_window(self._id)
|
|
343
|
+
# this ensures that the show takes effect
|
|
344
|
+
self._vispy_update()
|
|
345
|
+
else:
|
|
346
|
+
glfw.hide_window(self._id)
|
|
347
|
+
|
|
348
|
+
def _vispy_set_fullscreen(self, fullscreen):
|
|
349
|
+
logger.warn('Cannot change fullscreen mode for GLFW backend')
|
|
350
|
+
|
|
351
|
+
def _vispy_update(self):
|
|
352
|
+
# Invoke a redraw, passing it on to the canvas
|
|
353
|
+
if self._vispy_canvas is None or self._id is None:
|
|
354
|
+
return
|
|
355
|
+
# Mark that this window wants to be drawn on the next loop iter
|
|
356
|
+
self._needs_draw = True
|
|
357
|
+
|
|
358
|
+
def _vispy_close(self):
|
|
359
|
+
# Force the window or widget to shut down
|
|
360
|
+
if self._id is not None:
|
|
361
|
+
self._vispy_canvas = None
|
|
362
|
+
# glfw.set_window_should_close() # Does not really cause a close
|
|
363
|
+
self._vispy_set_visible(False)
|
|
364
|
+
self._id, id_ = None, self._id
|
|
365
|
+
glfw.destroy_window(id_)
|
|
366
|
+
gc.collect() # help ensure context gets destroyed
|
|
367
|
+
|
|
368
|
+
def _vispy_get_size(self):
|
|
369
|
+
if self._id is None:
|
|
370
|
+
return
|
|
371
|
+
w, h = glfw.get_window_size(self._id)
|
|
372
|
+
return w, h
|
|
373
|
+
|
|
374
|
+
def _vispy_get_physical_size(self):
|
|
375
|
+
if self._id is None:
|
|
376
|
+
return
|
|
377
|
+
w, h = glfw.get_framebuffer_size(self._id)
|
|
378
|
+
return w, h
|
|
379
|
+
|
|
380
|
+
def _vispy_get_position(self):
|
|
381
|
+
if self._id is None:
|
|
382
|
+
return
|
|
383
|
+
x, y = glfw.get_window_pos(self._id)
|
|
384
|
+
return x, y
|
|
385
|
+
|
|
386
|
+
def _vispy_get_fullscreen(self):
|
|
387
|
+
return self._fullscreen
|
|
388
|
+
|
|
389
|
+
##########################################
|
|
390
|
+
# Notify vispy of events triggered by GLFW
|
|
391
|
+
def _on_resize(self, _id, w, h):
|
|
392
|
+
if self._vispy_canvas is None:
|
|
393
|
+
return
|
|
394
|
+
self._vispy_canvas.events.resize(
|
|
395
|
+
size=(w, h), physical_size=self._vispy_get_physical_size())
|
|
396
|
+
|
|
397
|
+
def _on_close(self, _id):
|
|
398
|
+
if self._vispy_canvas is None:
|
|
399
|
+
return
|
|
400
|
+
self._vispy_canvas.close()
|
|
401
|
+
|
|
402
|
+
def _on_draw(self, _id=None):
|
|
403
|
+
if self._vispy_canvas is None or self._id is None:
|
|
404
|
+
return
|
|
405
|
+
self._vispy_canvas.set_current()
|
|
406
|
+
self._vispy_canvas.events.draw(region=None) # (0, 0, w, h))
|
|
407
|
+
|
|
408
|
+
def _on_mouse_button(self, _id, button, action, mod):
|
|
409
|
+
if self._vispy_canvas is None and self._id is not None:
|
|
410
|
+
return
|
|
411
|
+
pos = glfw.get_cursor_pos(self._id)
|
|
412
|
+
if button < 3:
|
|
413
|
+
# Mouse click event
|
|
414
|
+
button = BUTTONMAP.get(button, 0)
|
|
415
|
+
if action == glfw.PRESS:
|
|
416
|
+
fun = self._vispy_mouse_press
|
|
417
|
+
elif action == glfw.RELEASE:
|
|
418
|
+
fun = self._vispy_mouse_release
|
|
419
|
+
else:
|
|
420
|
+
return
|
|
421
|
+
fun(pos=pos, button=button, modifiers=self._mod)
|
|
422
|
+
|
|
423
|
+
def _on_mouse_scroll(self, _id, x_off, y_off):
|
|
424
|
+
if self._vispy_canvas is None and self._id is not None:
|
|
425
|
+
return
|
|
426
|
+
pos = glfw.get_cursor_pos(self._id)
|
|
427
|
+
delta = (float(x_off), float(y_off))
|
|
428
|
+
self._vispy_canvas.events.mouse_wheel(pos=pos, delta=delta,
|
|
429
|
+
modifiers=self._mod)
|
|
430
|
+
|
|
431
|
+
def _on_mouse_motion(self, _id, x, y):
|
|
432
|
+
if self._vispy_canvas is None:
|
|
433
|
+
return
|
|
434
|
+
self._vispy_mouse_move(pos=(x, y), modifiers=self._mod)
|
|
435
|
+
|
|
436
|
+
def _on_key_press(self, _id, key, scancode, action, mod):
|
|
437
|
+
if self._vispy_canvas is None:
|
|
438
|
+
return
|
|
439
|
+
key, text = self._process_key(key)
|
|
440
|
+
if action == glfw.PRESS:
|
|
441
|
+
fun = self._vispy_canvas.events.key_press
|
|
442
|
+
down = True
|
|
443
|
+
elif action == glfw.RELEASE:
|
|
444
|
+
fun = self._vispy_canvas.events.key_release
|
|
445
|
+
down = False
|
|
446
|
+
else:
|
|
447
|
+
return
|
|
448
|
+
self._process_mod(key, down=down)
|
|
449
|
+
|
|
450
|
+
# NOTE: GLFW only provides localized characters via _on_key_char, so if
|
|
451
|
+
# this event contains a character we store all other data and dispatch
|
|
452
|
+
# it once the final unicode character is sent shortly after.
|
|
453
|
+
if text != '' and action == glfw.PRESS:
|
|
454
|
+
self._next_key_events.append((fun, key, self._mod))
|
|
455
|
+
else:
|
|
456
|
+
if key in self._next_key_text:
|
|
457
|
+
text = self._next_key_text[key]
|
|
458
|
+
del self._next_key_text[key]
|
|
459
|
+
fun(key=key, text=text, modifiers=self._mod)
|
|
460
|
+
|
|
461
|
+
def _on_key_char(self, _id, text):
|
|
462
|
+
# Repeat strokes (frequency configured at OS) are sent here only,
|
|
463
|
+
# no regular _on_key_press events. Currently ignored!
|
|
464
|
+
if len(self._next_key_events) == 0:
|
|
465
|
+
return
|
|
466
|
+
|
|
467
|
+
(fun, key, mod) = self._next_key_events.pop(0)
|
|
468
|
+
fun(key=key, text=chr(text), modifiers=mod)
|
|
469
|
+
self._next_key_text[key] = text
|
|
470
|
+
|
|
471
|
+
def _process_key(self, key):
|
|
472
|
+
if 32 <= key <= 127:
|
|
473
|
+
return keys.Key(chr(key)), chr(key)
|
|
474
|
+
elif key in KEYMAP:
|
|
475
|
+
return KEYMAP[key], ''
|
|
476
|
+
else:
|
|
477
|
+
return None, ''
|
|
478
|
+
|
|
479
|
+
def _process_mod(self, key, down):
|
|
480
|
+
"""Process (possible) keyboard modifiers
|
|
481
|
+
|
|
482
|
+
GLFW provides "mod" with many callbacks, but not (critically) the
|
|
483
|
+
scroll callback, so we keep track on our own here.
|
|
484
|
+
"""
|
|
485
|
+
if key in MOD_KEYS:
|
|
486
|
+
if down:
|
|
487
|
+
if key not in self._mod:
|
|
488
|
+
self._mod.append(key)
|
|
489
|
+
elif key in self._mod:
|
|
490
|
+
self._mod.pop(self._mod.index(key))
|
|
491
|
+
return self._mod
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
# ------------------------------------------------------------------- timer ---
|
|
495
|
+
|
|
496
|
+
class TimerBackend(BaseTimerBackend):
|
|
497
|
+
|
|
498
|
+
def __init__(self, vispy_timer):
|
|
499
|
+
BaseTimerBackend.__init__(self, vispy_timer)
|
|
500
|
+
vispy_timer._app._backend._add_timer(self)
|
|
501
|
+
self._vispy_stop()
|
|
502
|
+
|
|
503
|
+
def _vispy_start(self, interval):
|
|
504
|
+
self._interval = interval
|
|
505
|
+
self._next_time = time() + self._interval
|
|
506
|
+
|
|
507
|
+
def _vispy_stop(self):
|
|
508
|
+
self._next_time = float('inf')
|
|
509
|
+
|
|
510
|
+
def _tick(self):
|
|
511
|
+
if time() >= self._next_time:
|
|
512
|
+
self._vispy_timer._timeout()
|
|
513
|
+
self._next_time = time() + self._interval
|