vispy 0.15.0__cp313-cp313-win_amd64.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.cp313-win_amd64.pyd +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 +5 -0
- vispy-0.15.0.dist-info/licenses/LICENSE.txt +36 -0
- vispy-0.15.0.dist-info/top_level.txt +1 -0
vispy/util/logs.py
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
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
|
+
import base64
|
|
6
|
+
import logging
|
|
7
|
+
import sys
|
|
8
|
+
import inspect
|
|
9
|
+
import re
|
|
10
|
+
import traceback
|
|
11
|
+
import json
|
|
12
|
+
from functools import partial
|
|
13
|
+
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
###############################################################################
|
|
18
|
+
# LOGGING (some adapted from mne-python)
|
|
19
|
+
|
|
20
|
+
def _get_vispy_caller():
|
|
21
|
+
"""Helper to get vispy calling function from the stack"""
|
|
22
|
+
records = inspect.stack()
|
|
23
|
+
# first few records are vispy-based logging calls
|
|
24
|
+
for record in records[5:]:
|
|
25
|
+
module = record[0].f_globals['__name__']
|
|
26
|
+
if module.startswith('vispy'):
|
|
27
|
+
line = str(record[0].f_lineno)
|
|
28
|
+
func = record[3]
|
|
29
|
+
cls = record[0].f_locals.get('self', None)
|
|
30
|
+
clsname = "" if cls is None else cls.__class__.__name__ + '.'
|
|
31
|
+
caller = "{0}:{1}{2}({3}): ".format(module, clsname, func, line)
|
|
32
|
+
return caller
|
|
33
|
+
return 'unknown'
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# class _WrapStdOut(object):
|
|
37
|
+
# """Class to work around how doctest captures stdout"""
|
|
38
|
+
# def __getattr__(self, name):
|
|
39
|
+
# # Even more ridiculous than this class, this must be sys.stdout (not
|
|
40
|
+
# # just stdout) in order for this to work (tested on OSX and Linux)
|
|
41
|
+
# return getattr(sys.stdout, name)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class _VispyFormatter(logging.Formatter):
|
|
45
|
+
"""Formatter that optionally prepends caller"""
|
|
46
|
+
|
|
47
|
+
def __init__(self):
|
|
48
|
+
logging.Formatter.__init__(self, '%(levelname)s: %(message)s')
|
|
49
|
+
self._vispy_prepend_caller = False
|
|
50
|
+
|
|
51
|
+
def _vispy_set_prepend(self, prepend):
|
|
52
|
+
self._vispy_prepend_caller = prepend
|
|
53
|
+
|
|
54
|
+
def format(self, record):
|
|
55
|
+
out = logging.Formatter.format(self, record)
|
|
56
|
+
if self._vispy_prepend_caller:
|
|
57
|
+
out = _get_vispy_caller() + out
|
|
58
|
+
return out
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class _VispyStreamHandler(logging.StreamHandler):
|
|
62
|
+
"""Stream handler allowing matching and recording
|
|
63
|
+
|
|
64
|
+
This handler has two useful optional additions:
|
|
65
|
+
|
|
66
|
+
1. Recording emitted messages.
|
|
67
|
+
2. Performing regexp substring matching.
|
|
68
|
+
|
|
69
|
+
Prepending of traceback information is done in _VispyFormatter.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def __init__(self):
|
|
73
|
+
logging.StreamHandler.__init__(self, sys.stderr)
|
|
74
|
+
self._vispy_formatter = _lf
|
|
75
|
+
self.setFormatter(self._vispy_formatter)
|
|
76
|
+
self._vispy_match = None
|
|
77
|
+
self._vispy_emit_list = list()
|
|
78
|
+
self._vispy_set_emit_record(False)
|
|
79
|
+
self._vispy_set_match(None)
|
|
80
|
+
self._vispy_print_msg = True
|
|
81
|
+
|
|
82
|
+
def _vispy_emit_match_andor_record(self, record):
|
|
83
|
+
"""Log message emitter that optionally matches and/or records"""
|
|
84
|
+
test = record.getMessage()
|
|
85
|
+
match = self._vispy_match
|
|
86
|
+
if (match is None or re.search(match, test) or
|
|
87
|
+
re.search(match, _get_vispy_caller())):
|
|
88
|
+
if self._vispy_emit_record:
|
|
89
|
+
fmt_rec = self._vispy_formatter.format(record)
|
|
90
|
+
self._vispy_emit_list.append(fmt_rec)
|
|
91
|
+
if self._vispy_print_msg:
|
|
92
|
+
return logging.StreamHandler.emit(self, record)
|
|
93
|
+
else:
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
def _vispy_set_match(self, match):
|
|
97
|
+
old_match = self._vispy_match
|
|
98
|
+
self._vispy_match = match
|
|
99
|
+
# Triage here to avoid a bunch of if's later (more efficient)
|
|
100
|
+
if match is not None or self._vispy_emit_record:
|
|
101
|
+
self.emit = self._vispy_emit_match_andor_record
|
|
102
|
+
else:
|
|
103
|
+
self.emit = partial(logging.StreamHandler.emit, self)
|
|
104
|
+
return old_match
|
|
105
|
+
|
|
106
|
+
def _vispy_set_emit_record(self, record):
|
|
107
|
+
self._vispy_emit_record = record
|
|
108
|
+
match = self._vispy_match
|
|
109
|
+
# Triage here to avoid a bunch of if's later (more efficient)
|
|
110
|
+
if match is not None or self._vispy_emit_record:
|
|
111
|
+
self.emit = self._vispy_emit_match_andor_record
|
|
112
|
+
else:
|
|
113
|
+
self.emit = partial(logging.StreamHandler.emit, self)
|
|
114
|
+
|
|
115
|
+
def _vispy_reset_list(self):
|
|
116
|
+
self._vispy_emit_list = list()
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
logger = logging.getLogger('vispy')
|
|
120
|
+
_lf = _VispyFormatter()
|
|
121
|
+
_lh = _VispyStreamHandler() # needs _lf to exist
|
|
122
|
+
logger.addHandler(_lh)
|
|
123
|
+
|
|
124
|
+
logging_types = dict(debug=logging.DEBUG, info=logging.INFO,
|
|
125
|
+
warning=logging.WARNING, error=logging.ERROR,
|
|
126
|
+
critical=logging.CRITICAL)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def set_log_level(verbose, match=None, return_old=False):
|
|
130
|
+
"""Convenience function for setting the logging level
|
|
131
|
+
|
|
132
|
+
Parameters
|
|
133
|
+
----------
|
|
134
|
+
verbose : bool, str, int, or None
|
|
135
|
+
The verbosity of messages to print. If a str, it can be either DEBUG,
|
|
136
|
+
INFO, WARNING, ERROR, or CRITICAL. Note that these are for
|
|
137
|
+
convenience and are equivalent to passing in logging.DEBUG, etc.
|
|
138
|
+
For bool, True is the same as 'INFO', False is the same as 'WARNING'.
|
|
139
|
+
match : str | None
|
|
140
|
+
String to match. Only those messages that both contain a substring
|
|
141
|
+
that regexp matches ``'match'`` (and the ``verbose`` level) will be
|
|
142
|
+
displayed.
|
|
143
|
+
return_old : bool
|
|
144
|
+
If True, return the old verbosity level and old match.
|
|
145
|
+
|
|
146
|
+
Notes
|
|
147
|
+
-----
|
|
148
|
+
If ``verbose=='debug'``, then the ``vispy`` method emitting the log
|
|
149
|
+
message will be prepended to each log message, which is useful for
|
|
150
|
+
debugging. If ``verbose=='debug'`` or ``match is not None``, then a
|
|
151
|
+
small performance overhead is added. Thus it is suggested to only use
|
|
152
|
+
these options when performance is not crucial.
|
|
153
|
+
|
|
154
|
+
See also
|
|
155
|
+
--------
|
|
156
|
+
vispy.util.use_log_level
|
|
157
|
+
"""
|
|
158
|
+
# This method is responsible for setting properties of the handler and
|
|
159
|
+
# formatter such that proper messages (possibly with the vispy caller
|
|
160
|
+
# prepended) are displayed. Storing log messages is only available
|
|
161
|
+
# via the context handler (use_log_level), so that configuration is
|
|
162
|
+
# done by the context handler itself.
|
|
163
|
+
if isinstance(verbose, bool):
|
|
164
|
+
verbose = 'info' if verbose else 'warning'
|
|
165
|
+
if isinstance(verbose, str):
|
|
166
|
+
verbose = verbose.lower()
|
|
167
|
+
if verbose not in logging_types:
|
|
168
|
+
raise ValueError('Invalid argument "%s"' % verbose)
|
|
169
|
+
verbose = logging_types[verbose]
|
|
170
|
+
else:
|
|
171
|
+
raise TypeError('verbose must be a bool or string')
|
|
172
|
+
logger = logging.getLogger('vispy')
|
|
173
|
+
old_verbose = logger.level
|
|
174
|
+
old_match = _lh._vispy_set_match(match)
|
|
175
|
+
logger.setLevel(verbose)
|
|
176
|
+
if verbose <= logging.DEBUG:
|
|
177
|
+
_lf._vispy_set_prepend(True)
|
|
178
|
+
else:
|
|
179
|
+
_lf._vispy_set_prepend(False)
|
|
180
|
+
out = None
|
|
181
|
+
if return_old:
|
|
182
|
+
out = (old_verbose, old_match)
|
|
183
|
+
return out
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class use_log_level(object):
|
|
187
|
+
"""Context manager that temporarily sets logging level
|
|
188
|
+
|
|
189
|
+
Parameters
|
|
190
|
+
----------
|
|
191
|
+
level : str
|
|
192
|
+
See ``set_log_level`` for options.
|
|
193
|
+
match : str | None
|
|
194
|
+
The string to match.
|
|
195
|
+
record : bool
|
|
196
|
+
If True, the context manager will keep a record of the logging
|
|
197
|
+
messages generated by vispy. Otherwise, an empty list will
|
|
198
|
+
be returned.
|
|
199
|
+
print_msg : bool
|
|
200
|
+
If False, printing of (all) messages will be suppressed. This is
|
|
201
|
+
mainly useful in testing. False only works in `record=True` mode, if
|
|
202
|
+
not recording messages, consider setting `level` appropriately.
|
|
203
|
+
|
|
204
|
+
Returns
|
|
205
|
+
-------
|
|
206
|
+
records : list
|
|
207
|
+
As a context manager, an empty list or the list of logging messages
|
|
208
|
+
will be returned (depending on the input ``record``).
|
|
209
|
+
"""
|
|
210
|
+
|
|
211
|
+
# This method mostly wraps to set_log_level, but also takes
|
|
212
|
+
# care of enabling/disabling message recording in the formatter.
|
|
213
|
+
|
|
214
|
+
def __init__(self, level, match=None, record=False, print_msg=True):
|
|
215
|
+
self._new_level = level
|
|
216
|
+
self._new_match = match
|
|
217
|
+
self._print_msg = print_msg
|
|
218
|
+
self._record = record
|
|
219
|
+
if match is not None and not isinstance(match, str):
|
|
220
|
+
raise TypeError('match must be None or str')
|
|
221
|
+
|
|
222
|
+
def __enter__(self):
|
|
223
|
+
# set the log level
|
|
224
|
+
old_level, old_match = set_log_level(self._new_level,
|
|
225
|
+
self._new_match, return_old=True)
|
|
226
|
+
for key, value in logging_types.items():
|
|
227
|
+
if value == old_level:
|
|
228
|
+
old_level = key
|
|
229
|
+
self._old_level = old_level
|
|
230
|
+
self._old_match = old_match
|
|
231
|
+
if not self._print_msg:
|
|
232
|
+
_lh._vispy_print_msg = False
|
|
233
|
+
# set handler to record, if appropriate
|
|
234
|
+
_lh._vispy_reset_list()
|
|
235
|
+
if self._record:
|
|
236
|
+
_lh._vispy_set_emit_record(True)
|
|
237
|
+
return _lh._vispy_emit_list
|
|
238
|
+
else:
|
|
239
|
+
return list()
|
|
240
|
+
|
|
241
|
+
def __exit__(self, type, value, traceback):
|
|
242
|
+
# reset log level
|
|
243
|
+
set_log_level(self._old_level, self._old_match)
|
|
244
|
+
# reset handler
|
|
245
|
+
if self._record:
|
|
246
|
+
_lh._vispy_set_emit_record(False)
|
|
247
|
+
if not self._print_msg:
|
|
248
|
+
_lh._vispy_print_msg = True # set it back
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def log_exception(level='warning', tb_skip=2):
|
|
252
|
+
"""
|
|
253
|
+
Send an exception and traceback to the logger.
|
|
254
|
+
|
|
255
|
+
This function is used in cases where an exception is handled safely but
|
|
256
|
+
nevertheless should generate a descriptive error message. An extra line
|
|
257
|
+
is inserted into the stack trace indicating where the exception was caught.
|
|
258
|
+
|
|
259
|
+
Parameters
|
|
260
|
+
----------
|
|
261
|
+
level : str
|
|
262
|
+
See ``set_log_level`` for options.
|
|
263
|
+
tb_skip : int
|
|
264
|
+
The number of traceback entries to ignore, prior to the point where
|
|
265
|
+
the exception was caught. The default is 2.
|
|
266
|
+
"""
|
|
267
|
+
stack = "".join(traceback.format_stack()[:-tb_skip])
|
|
268
|
+
tb = traceback.format_exception(*sys.exc_info())
|
|
269
|
+
msg = tb[0] # "Traceback (most recent call last):"
|
|
270
|
+
msg += stack
|
|
271
|
+
msg += " << caught exception here: >>\n"
|
|
272
|
+
msg += "".join(tb[1:]).rstrip()
|
|
273
|
+
logger.log(logging_types[level], msg)
|
|
274
|
+
|
|
275
|
+
logger.log_exception = log_exception # make this easier to reach
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def _handle_exception(ignore_callback_errors, print_callback_errors, obj,
|
|
279
|
+
cb_event=None, node=None):
|
|
280
|
+
"""Helper for prining errors in callbacks
|
|
281
|
+
|
|
282
|
+
See EventEmitter._invoke_callback for a use example.
|
|
283
|
+
"""
|
|
284
|
+
if not hasattr(obj, '_vispy_err_registry'):
|
|
285
|
+
obj._vispy_err_registry = {}
|
|
286
|
+
registry = obj._vispy_err_registry
|
|
287
|
+
|
|
288
|
+
if cb_event is not None:
|
|
289
|
+
cb, event = cb_event
|
|
290
|
+
exp_type = 'callback'
|
|
291
|
+
else:
|
|
292
|
+
exp_type = 'node'
|
|
293
|
+
type_, value, tb = sys.exc_info()
|
|
294
|
+
tb = tb.tb_next # Skip *this* frame
|
|
295
|
+
sys.last_type = type_
|
|
296
|
+
sys.last_value = value
|
|
297
|
+
sys.last_traceback = tb
|
|
298
|
+
del tb # Get rid of it in this namespace
|
|
299
|
+
# Handle
|
|
300
|
+
if not ignore_callback_errors:
|
|
301
|
+
raise
|
|
302
|
+
if print_callback_errors != "never":
|
|
303
|
+
this_print = 'full'
|
|
304
|
+
if print_callback_errors in ('first', 'reminders'):
|
|
305
|
+
# need to check to see if we've hit this yet
|
|
306
|
+
if exp_type == 'callback':
|
|
307
|
+
key = repr(cb) + repr(event)
|
|
308
|
+
else:
|
|
309
|
+
key = repr(node)
|
|
310
|
+
if key in registry:
|
|
311
|
+
registry[key] += 1
|
|
312
|
+
if print_callback_errors == 'first':
|
|
313
|
+
this_print = None
|
|
314
|
+
else: # reminders
|
|
315
|
+
ii = registry[key]
|
|
316
|
+
# Use logarithmic selection
|
|
317
|
+
# (1, 2, ..., 10, 20, ..., 100, 200, ...)
|
|
318
|
+
if ii == (2 ** int(np.log2(ii))):
|
|
319
|
+
this_print = ii
|
|
320
|
+
else:
|
|
321
|
+
this_print = None
|
|
322
|
+
else:
|
|
323
|
+
registry[key] = 1
|
|
324
|
+
if this_print == 'full':
|
|
325
|
+
logger.log_exception()
|
|
326
|
+
if exp_type == 'callback':
|
|
327
|
+
logger.error("Invoking %s for %s" % (cb, event))
|
|
328
|
+
else: # == 'node':
|
|
329
|
+
logger.error("Drawing node %s" % node)
|
|
330
|
+
elif this_print is not None:
|
|
331
|
+
if exp_type == 'callback':
|
|
332
|
+
logger.error("Invoking %s repeat %s"
|
|
333
|
+
% (cb, this_print))
|
|
334
|
+
else: # == 'node':
|
|
335
|
+
logger.error("Drawing node %s repeat %s"
|
|
336
|
+
% (node, this_print))
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def _serialize_buffer(buffer, array_serialization=None):
|
|
340
|
+
"""Serialize a NumPy array."""
|
|
341
|
+
if array_serialization == 'binary':
|
|
342
|
+
return buffer.ravel().tobytes()
|
|
343
|
+
elif array_serialization == 'base64':
|
|
344
|
+
return {'storage_type': 'base64',
|
|
345
|
+
'buffer': base64.b64encode(buffer).decode('ascii')
|
|
346
|
+
}
|
|
347
|
+
raise ValueError("The array serialization method should be 'binary' or "
|
|
348
|
+
"'base64'.")
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
class NumPyJSONEncoder(json.JSONEncoder):
|
|
352
|
+
def default(self, obj):
|
|
353
|
+
if isinstance(obj, np.ndarray):
|
|
354
|
+
return _serialize_buffer(obj, array_serialization='base64')
|
|
355
|
+
elif isinstance(obj, np.generic):
|
|
356
|
+
return obj.item()
|
|
357
|
+
|
|
358
|
+
return json.JSONEncoder.default(self, obj)
|
vispy/util/osmesa_gl.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from . import logger
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def fix_osmesa_gl_lib():
|
|
6
|
+
"""
|
|
7
|
+
When using OSMesa, the gl functions (from libGL) are included
|
|
8
|
+
in libOSMesa.so. This function modifies the VISPY_GL_LIB env variable
|
|
9
|
+
so gl2 picks up libOSMesa.so as the OpenGL library.
|
|
10
|
+
|
|
11
|
+
This modification must be done before vispy.gloo is imported for the
|
|
12
|
+
first time.
|
|
13
|
+
"""
|
|
14
|
+
if 'VISPY_GL_LIB' in os.environ:
|
|
15
|
+
logger.warning('VISPY_GL_LIB is ignored when using OSMesa. Use '
|
|
16
|
+
'OSMESA_LIBRARY instead.')
|
|
17
|
+
os.environ['VISPY_GL_LIB'] = os.getenv('OSMESA_LIBRARY', 'libOSMesa.so')
|
vispy/util/profiler.py
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
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
|
+
# Adapted from PyQtGraph
|
|
5
|
+
import sys
|
|
6
|
+
from . import ptime
|
|
7
|
+
from .. import config
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Profiler(object):
|
|
11
|
+
"""Simple profiler allowing directed, hierarchical measurement of time
|
|
12
|
+
intervals.
|
|
13
|
+
|
|
14
|
+
By default, profilers are disabled. To enable profiling, set the
|
|
15
|
+
environment variable `VISPYPROFILE` to a comma-separated list of
|
|
16
|
+
fully-qualified names of profiled functions.
|
|
17
|
+
|
|
18
|
+
Calling a profiler registers a message (defaulting to an increasing
|
|
19
|
+
counter) that contains the time elapsed since the last call. When the
|
|
20
|
+
profiler is about to be garbage-collected, the messages are passed to the
|
|
21
|
+
outer profiler if one is running, or printed to stdout otherwise.
|
|
22
|
+
|
|
23
|
+
If `delayed` is set to False, messages are immediately printed instead.
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
def function(...):
|
|
27
|
+
profiler = Profiler()
|
|
28
|
+
... do stuff ...
|
|
29
|
+
profiler('did stuff')
|
|
30
|
+
... do other stuff ...
|
|
31
|
+
profiler('did other stuff')
|
|
32
|
+
# profiler is garbage-collected and flushed at function end
|
|
33
|
+
|
|
34
|
+
If this function is a method of class C, setting `VISPYPROFILE` to
|
|
35
|
+
"C.function" (without the module name) will enable this profiler.
|
|
36
|
+
|
|
37
|
+
For regular functions, use the qualified name of the function, stripping
|
|
38
|
+
only the initial "vispy.." prefix from the module.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
_profilers = (config['profile'].split(",") if config['profile'] is not None
|
|
42
|
+
else [])
|
|
43
|
+
|
|
44
|
+
_depth = 0
|
|
45
|
+
_msgs = []
|
|
46
|
+
# set this flag to disable all or individual profilers at runtime
|
|
47
|
+
disable = False
|
|
48
|
+
|
|
49
|
+
class DisabledProfiler(object):
|
|
50
|
+
def __init__(self, *args, **kwds):
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
def __call__(self, *args):
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
def finish(self):
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
def mark(self, msg=None):
|
|
60
|
+
pass
|
|
61
|
+
|
|
62
|
+
_disabled_profiler = DisabledProfiler()
|
|
63
|
+
|
|
64
|
+
def __new__(cls, msg=None, disabled='env', delayed=True):
|
|
65
|
+
"""Optionally create a new profiler based on caller's qualname."""
|
|
66
|
+
if (disabled is True or
|
|
67
|
+
(disabled == 'env' and len(cls._profilers) == 0)):
|
|
68
|
+
return cls._disabled_profiler
|
|
69
|
+
|
|
70
|
+
# determine the qualified name of the caller function
|
|
71
|
+
caller_frame = sys._getframe(1)
|
|
72
|
+
try:
|
|
73
|
+
caller_object_type = type(caller_frame.f_locals["self"])
|
|
74
|
+
except KeyError: # we are in a regular function
|
|
75
|
+
qualifier = caller_frame.f_globals["__name__"].split(".", 1)[1]
|
|
76
|
+
else: # we are in a method
|
|
77
|
+
qualifier = caller_object_type.__name__
|
|
78
|
+
func_qualname = qualifier + "." + caller_frame.f_code.co_name
|
|
79
|
+
if (disabled == 'env' and func_qualname not in cls._profilers and
|
|
80
|
+
'all' not in cls._profilers): # don't do anything
|
|
81
|
+
return cls._disabled_profiler
|
|
82
|
+
# create an actual profiling object
|
|
83
|
+
cls._depth += 1
|
|
84
|
+
obj = super(Profiler, cls).__new__(cls)
|
|
85
|
+
obj._name = msg or func_qualname
|
|
86
|
+
obj._delayed = delayed
|
|
87
|
+
obj._mark_count = 0
|
|
88
|
+
obj._finished = False
|
|
89
|
+
obj._firstTime = obj._last_time = ptime.time()
|
|
90
|
+
obj._new_msg("> Entering " + obj._name)
|
|
91
|
+
return obj
|
|
92
|
+
|
|
93
|
+
def __call__(self, msg=None, *args):
|
|
94
|
+
"""Register or print a new message with timing information."""
|
|
95
|
+
if self.disable:
|
|
96
|
+
return
|
|
97
|
+
if msg is None:
|
|
98
|
+
msg = str(self._mark_count)
|
|
99
|
+
self._mark_count += 1
|
|
100
|
+
new_time = ptime.time()
|
|
101
|
+
elapsed = (new_time - self._last_time) * 1000
|
|
102
|
+
self._new_msg(" " + msg + ": %0.4f ms", *(args + (elapsed,)))
|
|
103
|
+
self._last_time = new_time
|
|
104
|
+
|
|
105
|
+
def mark(self, msg=None):
|
|
106
|
+
self(msg)
|
|
107
|
+
|
|
108
|
+
def _new_msg(self, msg, *args):
|
|
109
|
+
msg = " " * (self._depth - 1) + msg
|
|
110
|
+
if self._delayed:
|
|
111
|
+
self._msgs.append((msg, args))
|
|
112
|
+
else:
|
|
113
|
+
self.flush()
|
|
114
|
+
print(msg % args)
|
|
115
|
+
|
|
116
|
+
def __del__(self):
|
|
117
|
+
self.finish()
|
|
118
|
+
|
|
119
|
+
def finish(self, msg=None):
|
|
120
|
+
"""Add a final message; flush the message list if no parent profiler."""
|
|
121
|
+
if self._finished or self.disable:
|
|
122
|
+
return
|
|
123
|
+
self._finished = True
|
|
124
|
+
if msg is not None:
|
|
125
|
+
self(msg)
|
|
126
|
+
self._new_msg("< Exiting %s, total time: %0.4f ms",
|
|
127
|
+
self._name, (ptime.time() - self._firstTime) * 1000)
|
|
128
|
+
type(self)._depth -= 1
|
|
129
|
+
if self._depth < 1:
|
|
130
|
+
self.flush()
|
|
131
|
+
|
|
132
|
+
def flush(self):
|
|
133
|
+
if self._msgs:
|
|
134
|
+
print("\n".join([m[0] % m[1] for m in self._msgs]))
|
|
135
|
+
type(self)._msgs = []
|
vispy/util/ptime.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
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
|
+
"""
|
|
6
|
+
ptime.py - Precision time function made os-independent
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import time as systime
|
|
10
|
+
# get a reference starting time - initial performance counter
|
|
11
|
+
START_TIME = systime.time() - systime.perf_counter()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def time():
|
|
15
|
+
# return reference starting time + delta of performance counters
|
|
16
|
+
return START_TIME + systime.perf_counter()
|