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.
- 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,300 @@
|
|
|
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 __future__ import division
|
|
6
|
+
|
|
7
|
+
from ..shaders import FunctionChain
|
|
8
|
+
from .base_transform import BaseTransform
|
|
9
|
+
from .linear import NullTransform
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ChainTransform(BaseTransform):
|
|
13
|
+
"""
|
|
14
|
+
BaseTransform subclass that performs a sequence of transformations in
|
|
15
|
+
order. Internally, this class uses shaders.FunctionChain to generate
|
|
16
|
+
its glsl_map and glsl_imap functions.
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
transforms : list of BaseTransform instances
|
|
21
|
+
See ``transforms`` property.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
glsl_map = None
|
|
25
|
+
glsl_imap = None
|
|
26
|
+
|
|
27
|
+
Linear = False
|
|
28
|
+
Orthogonal = False
|
|
29
|
+
NonScaling = False
|
|
30
|
+
Isometric = False
|
|
31
|
+
|
|
32
|
+
def __init__(self, *transforms):
|
|
33
|
+
super(ChainTransform, self).__init__()
|
|
34
|
+
self._transforms = []
|
|
35
|
+
self._simplified = None
|
|
36
|
+
self._null_transform = NullTransform()
|
|
37
|
+
nmap = self._null_transform.shader_map()
|
|
38
|
+
|
|
39
|
+
# ChainTransform does not have shader maps
|
|
40
|
+
self._shader_map = FunctionChain("transform_map_chain", [nmap])
|
|
41
|
+
self._shader_imap = FunctionChain("transform_imap_chain", [nmap])
|
|
42
|
+
|
|
43
|
+
# Set input transforms
|
|
44
|
+
trs = []
|
|
45
|
+
for tr in transforms:
|
|
46
|
+
if isinstance(tr, (tuple, list)):
|
|
47
|
+
trs.extend(tr)
|
|
48
|
+
else:
|
|
49
|
+
trs.append(tr)
|
|
50
|
+
self.transforms = trs
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def transforms(self):
|
|
54
|
+
"""The list of transform that make up the transform chain.
|
|
55
|
+
|
|
56
|
+
The order of transforms is given such that the last transform in the
|
|
57
|
+
list is the first to be invoked when mapping coordinates through
|
|
58
|
+
the chain.
|
|
59
|
+
|
|
60
|
+
For example, the following two mappings are equivalent::
|
|
61
|
+
|
|
62
|
+
# Map coordinates through individual transforms:
|
|
63
|
+
trans1 = STTransform(scale=(2, 3), translate=(0, 1))
|
|
64
|
+
trans2 = PolarTransform()
|
|
65
|
+
mapped = trans1.map(trans2.map(coords))
|
|
66
|
+
|
|
67
|
+
# Equivalent mapping through chain:
|
|
68
|
+
chain = ChainTransform([trans1, trans2])
|
|
69
|
+
mapped = chain.map(coords)
|
|
70
|
+
"""
|
|
71
|
+
return self._transforms
|
|
72
|
+
|
|
73
|
+
@transforms.setter
|
|
74
|
+
def transforms(self, tr):
|
|
75
|
+
if isinstance(tr, BaseTransform):
|
|
76
|
+
tr = [tr]
|
|
77
|
+
if not isinstance(tr, list):
|
|
78
|
+
raise TypeError("Transform chain must be a list")
|
|
79
|
+
|
|
80
|
+
# Avoid extra effort if we already have the correct chain
|
|
81
|
+
if len(tr) == len(self._transforms):
|
|
82
|
+
changed = False
|
|
83
|
+
for i in range(len(tr)):
|
|
84
|
+
if tr[i] is not self._transforms[i]:
|
|
85
|
+
changed = True
|
|
86
|
+
break
|
|
87
|
+
if not changed:
|
|
88
|
+
return
|
|
89
|
+
|
|
90
|
+
for t in self._transforms:
|
|
91
|
+
t.changed.disconnect(self._subtr_changed)
|
|
92
|
+
self._transforms = tr
|
|
93
|
+
for t in self._transforms:
|
|
94
|
+
t.changed.connect(self._subtr_changed)
|
|
95
|
+
self._rebuild_shaders()
|
|
96
|
+
self.update()
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def simplified(self):
|
|
100
|
+
"""A simplified representation of the same transformation."""
|
|
101
|
+
if self._simplified is None:
|
|
102
|
+
self._simplified = SimplifiedChainTransform(self)
|
|
103
|
+
return self._simplified
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def Linear(self):
|
|
107
|
+
b = True
|
|
108
|
+
for tr in self._transforms:
|
|
109
|
+
b &= tr.Linear
|
|
110
|
+
return b
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def Orthogonal(self):
|
|
114
|
+
b = True
|
|
115
|
+
for tr in self._transforms:
|
|
116
|
+
b &= tr.Orthogonal
|
|
117
|
+
return b
|
|
118
|
+
|
|
119
|
+
@property
|
|
120
|
+
def NonScaling(self):
|
|
121
|
+
b = True
|
|
122
|
+
for tr in self._transforms:
|
|
123
|
+
b &= tr.NonScaling
|
|
124
|
+
return b
|
|
125
|
+
|
|
126
|
+
@property
|
|
127
|
+
def Isometric(self):
|
|
128
|
+
b = True
|
|
129
|
+
for tr in self._transforms:
|
|
130
|
+
b &= tr.Isometric
|
|
131
|
+
return b
|
|
132
|
+
|
|
133
|
+
def map(self, coords):
|
|
134
|
+
"""Map coordinates
|
|
135
|
+
|
|
136
|
+
Parameters
|
|
137
|
+
----------
|
|
138
|
+
coords : array-like
|
|
139
|
+
Coordinates to map.
|
|
140
|
+
|
|
141
|
+
Returns
|
|
142
|
+
-------
|
|
143
|
+
coords : ndarray
|
|
144
|
+
Coordinates.
|
|
145
|
+
"""
|
|
146
|
+
for tr in reversed(self.transforms):
|
|
147
|
+
coords = tr.map(coords)
|
|
148
|
+
return coords
|
|
149
|
+
|
|
150
|
+
def imap(self, coords):
|
|
151
|
+
"""Inverse map coordinates
|
|
152
|
+
|
|
153
|
+
Parameters
|
|
154
|
+
----------
|
|
155
|
+
coords : array-like
|
|
156
|
+
Coordinates to inverse map.
|
|
157
|
+
|
|
158
|
+
Returns
|
|
159
|
+
-------
|
|
160
|
+
coords : ndarray
|
|
161
|
+
Coordinates.
|
|
162
|
+
"""
|
|
163
|
+
for tr in self.transforms:
|
|
164
|
+
coords = tr.imap(coords)
|
|
165
|
+
return coords
|
|
166
|
+
|
|
167
|
+
def shader_map(self):
|
|
168
|
+
return self._shader_map
|
|
169
|
+
|
|
170
|
+
def shader_imap(self):
|
|
171
|
+
return self._shader_imap
|
|
172
|
+
|
|
173
|
+
def _rebuild_shaders(self):
|
|
174
|
+
trs = self.transforms
|
|
175
|
+
if len(trs) == 0:
|
|
176
|
+
trs = [self._null_transform]
|
|
177
|
+
self._shader_map.functions = [tr.shader_map() for tr in reversed(trs)]
|
|
178
|
+
self._shader_imap.functions = [tr.shader_imap() for tr in trs]
|
|
179
|
+
|
|
180
|
+
def append(self, tr):
|
|
181
|
+
"""
|
|
182
|
+
Add a new transform to the end of this chain.
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
tr : instance of Transform
|
|
187
|
+
The transform to use.
|
|
188
|
+
"""
|
|
189
|
+
self.transforms.append(tr)
|
|
190
|
+
tr.changed.connect(self._subtr_changed)
|
|
191
|
+
self._rebuild_shaders()
|
|
192
|
+
self.update()
|
|
193
|
+
|
|
194
|
+
def prepend(self, tr):
|
|
195
|
+
"""
|
|
196
|
+
Add a new transform to the beginning of this chain.
|
|
197
|
+
|
|
198
|
+
Parameters
|
|
199
|
+
----------
|
|
200
|
+
tr : instance of Transform
|
|
201
|
+
The transform to use.
|
|
202
|
+
"""
|
|
203
|
+
self.transforms.insert(0, tr)
|
|
204
|
+
tr.changed.connect(self._subtr_changed)
|
|
205
|
+
self._rebuild_shaders()
|
|
206
|
+
self.update()
|
|
207
|
+
|
|
208
|
+
def _subtr_changed(self, ev):
|
|
209
|
+
"""One of the internal transforms changed; propagate the signal."""
|
|
210
|
+
self.update(ev)
|
|
211
|
+
|
|
212
|
+
def __setitem__(self, index, tr):
|
|
213
|
+
self._transforms[index].changed.disconnect(self._subtr_changed)
|
|
214
|
+
self._transforms[index] = tr
|
|
215
|
+
tr.changed.connect(self.subtr_changed)
|
|
216
|
+
self._rebuild_shaders()
|
|
217
|
+
self.update()
|
|
218
|
+
|
|
219
|
+
def __mul__(self, tr):
|
|
220
|
+
if isinstance(tr, ChainTransform):
|
|
221
|
+
trs = tr.transforms
|
|
222
|
+
else:
|
|
223
|
+
trs = [tr]
|
|
224
|
+
return ChainTransform(self.transforms+trs)
|
|
225
|
+
|
|
226
|
+
def __rmul__(self, tr):
|
|
227
|
+
if isinstance(tr, ChainTransform):
|
|
228
|
+
trs = tr.transforms
|
|
229
|
+
else:
|
|
230
|
+
trs = [tr]
|
|
231
|
+
return ChainTransform(trs+self.transforms)
|
|
232
|
+
|
|
233
|
+
def __str__(self):
|
|
234
|
+
names = [tr.__class__.__name__ for tr in self.transforms]
|
|
235
|
+
return "<ChainTransform [%s] at 0x%x>" % (", ".join(names), id(self))
|
|
236
|
+
|
|
237
|
+
def __repr__(self):
|
|
238
|
+
tr = ",\n ".join(map(repr, self.transforms))
|
|
239
|
+
return "<ChainTransform [%s] at 0x%x>" % (tr, id(self))
|
|
240
|
+
|
|
241
|
+
def __del__(self):
|
|
242
|
+
# remove all the children transforms from our callback, since we are
|
|
243
|
+
# being deleted. (But we do *not* want to remove children from other
|
|
244
|
+
# callbacks)
|
|
245
|
+
for t in self._transforms:
|
|
246
|
+
t.changed.disconnect(self._subtr_changed)
|
|
247
|
+
self.changed.disconnect()
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class SimplifiedChainTransform(ChainTransform):
|
|
251
|
+
def __init__(self, chain):
|
|
252
|
+
ChainTransform.__init__(self)
|
|
253
|
+
self._chain = chain
|
|
254
|
+
chain.changed.connect(self.source_changed)
|
|
255
|
+
self.source_changed(None)
|
|
256
|
+
|
|
257
|
+
def source_changed(self, event):
|
|
258
|
+
"""Generate a simplified chain by joining adjacent transforms."""
|
|
259
|
+
# bail out early if the chain is empty
|
|
260
|
+
transforms = self._chain.transforms[:]
|
|
261
|
+
if len(transforms) == 0:
|
|
262
|
+
self.transforms = []
|
|
263
|
+
return
|
|
264
|
+
|
|
265
|
+
# If the change signal comes from a transform that already appears in
|
|
266
|
+
# our simplified transform list, then there is no need to re-simplify.
|
|
267
|
+
if event is not None:
|
|
268
|
+
for source in event.sources[::-1]:
|
|
269
|
+
if source in self.transforms:
|
|
270
|
+
self.update(event)
|
|
271
|
+
return
|
|
272
|
+
|
|
273
|
+
# First flatten the chain by expanding all nested chains
|
|
274
|
+
new_chain = []
|
|
275
|
+
while len(transforms) > 0:
|
|
276
|
+
tr = transforms.pop(0)
|
|
277
|
+
if isinstance(tr, ChainTransform) and not tr.dynamic:
|
|
278
|
+
transforms = tr.transforms[:] + transforms
|
|
279
|
+
else:
|
|
280
|
+
new_chain.append(tr)
|
|
281
|
+
|
|
282
|
+
# Now combine together all compatible adjacent transforms
|
|
283
|
+
cont = True
|
|
284
|
+
tr = new_chain
|
|
285
|
+
while cont:
|
|
286
|
+
new_tr = [tr[0]]
|
|
287
|
+
cont = False
|
|
288
|
+
for t2 in tr[1:]:
|
|
289
|
+
t1 = new_tr[-1]
|
|
290
|
+
pr = t1 * t2
|
|
291
|
+
if (not t1.dynamic and not t2.dynamic and not
|
|
292
|
+
isinstance(pr, ChainTransform)):
|
|
293
|
+
cont = True
|
|
294
|
+
new_tr.pop()
|
|
295
|
+
new_tr.append(pr)
|
|
296
|
+
else:
|
|
297
|
+
new_tr.append(t2)
|
|
298
|
+
tr = new_tr
|
|
299
|
+
|
|
300
|
+
self.transforms = tr
|
|
@@ -0,0 +1,98 @@
|
|
|
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
|
+
from __future__ import division
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
from .linear import STTransform
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PanZoomTransform(STTransform):
|
|
11
|
+
"""Pan-zoom transform
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
canvas : instance of Canvas | None
|
|
16
|
+
The canvas to attch to.
|
|
17
|
+
aspect : float | None
|
|
18
|
+
The aspect ratio to apply.
|
|
19
|
+
**kwargs : dict
|
|
20
|
+
Keyword arguments to pass to the underlying `STTransform`.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, canvas=None, aspect=None, **kwargs):
|
|
24
|
+
self._aspect = aspect
|
|
25
|
+
self.attach(canvas)
|
|
26
|
+
STTransform.__init__(self, **kwargs)
|
|
27
|
+
self.on_resize(None)
|
|
28
|
+
|
|
29
|
+
def attach(self, canvas):
|
|
30
|
+
"""Attach this tranform to a canvas
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
canvas : instance of Canvas
|
|
35
|
+
The canvas.
|
|
36
|
+
"""
|
|
37
|
+
self._canvas = canvas
|
|
38
|
+
canvas.events.resize.connect(self.on_resize)
|
|
39
|
+
canvas.events.mouse_wheel.connect(self.on_mouse_wheel)
|
|
40
|
+
canvas.events.mouse_move.connect(self.on_mouse_move)
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def canvas_tr(self):
|
|
44
|
+
return STTransform.from_mapping(
|
|
45
|
+
[(0, 0), self._canvas.size],
|
|
46
|
+
[(-1, 1), (1, -1)])
|
|
47
|
+
|
|
48
|
+
def on_resize(self, event):
|
|
49
|
+
"""Resize handler
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
----------
|
|
53
|
+
event : instance of Event
|
|
54
|
+
The event.
|
|
55
|
+
"""
|
|
56
|
+
if self._aspect is None:
|
|
57
|
+
return
|
|
58
|
+
w, h = self._canvas.size
|
|
59
|
+
aspect = self._aspect / (w / h)
|
|
60
|
+
self.scale = (self.scale[0], self.scale[0] / aspect)
|
|
61
|
+
self.shader_map()
|
|
62
|
+
|
|
63
|
+
def on_mouse_move(self, event):
|
|
64
|
+
"""Mouse move handler
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
event : instance of Event
|
|
69
|
+
The event.
|
|
70
|
+
"""
|
|
71
|
+
if event.is_dragging:
|
|
72
|
+
dxy = event.pos - event.last_event.pos
|
|
73
|
+
button = event.press_event.button
|
|
74
|
+
|
|
75
|
+
if button == 1:
|
|
76
|
+
dxy = self.canvas_tr.map(dxy)
|
|
77
|
+
o = self.canvas_tr.map([0, 0])
|
|
78
|
+
t = dxy - o
|
|
79
|
+
self.move(t)
|
|
80
|
+
elif button == 2:
|
|
81
|
+
center = self.canvas_tr.map(event.press_event.pos)
|
|
82
|
+
if self._aspect is None:
|
|
83
|
+
self.zoom(np.exp(dxy * (0.01, -0.01)), center)
|
|
84
|
+
else:
|
|
85
|
+
s = dxy[1] * -0.01
|
|
86
|
+
self.zoom(np.exp(np.array([s, s])), center)
|
|
87
|
+
|
|
88
|
+
self.shader_map()
|
|
89
|
+
|
|
90
|
+
def on_mouse_wheel(self, event):
|
|
91
|
+
"""Mouse wheel handler
|
|
92
|
+
|
|
93
|
+
Parameters
|
|
94
|
+
----------
|
|
95
|
+
event : instance of Event
|
|
96
|
+
The event.
|
|
97
|
+
"""
|
|
98
|
+
self.zoom(np.exp(event.delta * (0.01, -0.01)), event.pos)
|