vispy 0.14.0__cp311-cp311-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 +968 -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 +1134 -0
- vispy/color/tests/__init__.py +0 -0
- vispy/color/tests/test_color.py +352 -0
- vispy/conftest.py +12 -0
- vispy/ext/__init__.py +0 -0
- vispy/ext/cocoapy.py +1542 -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 +134 -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 +698 -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 +506 -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 +566 -0
- vispy/gloo/gl/tests/test_names.py +246 -0
- vispy/gloo/gl/tests/test_use.py +71 -0
- vispy/gloo/glir.py +1816 -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 +1045 -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 +106 -0
- vispy/scene/cameras/base_camera.py +538 -0
- vispy/scene/cameras/fly.py +474 -0
- vispy/scene/cameras/magnify.py +163 -0
- vispy/scene/cameras/panzoom.py +308 -0
- vispy/scene/cameras/perspective.py +333 -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 +173 -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 +446 -0
- vispy/testing/_testing.py +416 -0
- vispy/testing/image_tester.py +473 -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 +17 -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 +4 -0
- vispy/visuals/__init__.py +50 -0
- vispy/visuals/_scalable_textures.py +485 -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 +163 -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 +796 -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 +105 -0
- vispy/visuals/gridmesh.py +98 -0
- vispy/visuals/histogram.py +58 -0
- vispy/visuals/image.py +688 -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 +810 -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_histogram.py +24 -0
- vispy/visuals/tests/test_image.py +390 -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 +180 -0
- vispy/visuals/tests/test_sdf.py +73 -0
- vispy/visuals/tests/test_spectrogram.py +42 -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-311-darwin.so +0 -0
- vispy/visuals/text/_sdf_cpu.pyx +110 -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 +1335 -0
- vispy/visuals/windbarb.py +291 -0
- vispy/visuals/xyz_axis.py +34 -0
- vispy-0.14.0.dist-info/LICENSE.txt +36 -0
- vispy-0.14.0.dist-info/METADATA +218 -0
- vispy-0.14.0.dist-info/RECORD +519 -0
- vispy-0.14.0.dist-info/WHEEL +5 -0
- vispy-0.14.0.dist-info/top_level.txt +1 -0
vispy/util/config.py
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
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
|
+
"""Vispy configuration functions."""
|
|
6
|
+
|
|
7
|
+
import io
|
|
8
|
+
import os
|
|
9
|
+
from os import path as op
|
|
10
|
+
import inspect
|
|
11
|
+
import json
|
|
12
|
+
import sys
|
|
13
|
+
import platform
|
|
14
|
+
import getopt
|
|
15
|
+
import traceback
|
|
16
|
+
import tempfile
|
|
17
|
+
import atexit
|
|
18
|
+
from shutil import rmtree
|
|
19
|
+
|
|
20
|
+
import numpy as np
|
|
21
|
+
|
|
22
|
+
from .event import EmitterGroup, EventEmitter, Event
|
|
23
|
+
from .logs import logger, set_log_level, use_log_level
|
|
24
|
+
|
|
25
|
+
file_types = [io.TextIOWrapper, io.BufferedRandom]
|
|
26
|
+
try:
|
|
27
|
+
file_types += [tempfile._TemporaryFileWrapper] # Py3k Windows this happens
|
|
28
|
+
except Exception:
|
|
29
|
+
pass
|
|
30
|
+
file_types = tuple(file_types)
|
|
31
|
+
|
|
32
|
+
config = None
|
|
33
|
+
_data_path = None
|
|
34
|
+
_allowed_config_keys = None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _init():
|
|
38
|
+
"""Create global Config object, parse command flags."""
|
|
39
|
+
global config, _data_path, _allowed_config_keys
|
|
40
|
+
|
|
41
|
+
app_dir = _get_vispy_app_dir()
|
|
42
|
+
if app_dir is not None:
|
|
43
|
+
_data_path = op.join(app_dir, 'data')
|
|
44
|
+
_test_data_path = op.join(app_dir, 'test_data')
|
|
45
|
+
else:
|
|
46
|
+
_data_path = _test_data_path = None
|
|
47
|
+
|
|
48
|
+
# All allowed config keys and the types they may have
|
|
49
|
+
_allowed_config_keys = {
|
|
50
|
+
'data_path': (str,),
|
|
51
|
+
'default_backend': (str,),
|
|
52
|
+
'gl_backend': (str,),
|
|
53
|
+
'gl_debug': (bool,),
|
|
54
|
+
'glir_file': (str,) + file_types,
|
|
55
|
+
'include_path': list,
|
|
56
|
+
'logging_level': (str,),
|
|
57
|
+
'qt_lib': (str,),
|
|
58
|
+
'dpi': (int, type(None)),
|
|
59
|
+
'profile': (str, type(None),),
|
|
60
|
+
'audit_tests': (bool,),
|
|
61
|
+
'test_data_path': (str, type(None),),
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Default values for all config options
|
|
65
|
+
default_config_options = {
|
|
66
|
+
'data_path': _data_path,
|
|
67
|
+
'default_backend': '',
|
|
68
|
+
'gl_backend': 'gl2',
|
|
69
|
+
'gl_debug': False,
|
|
70
|
+
'glir_file': '',
|
|
71
|
+
'include_path': [],
|
|
72
|
+
'logging_level': 'warning',
|
|
73
|
+
'qt_lib': 'any',
|
|
74
|
+
'dpi': None,
|
|
75
|
+
'profile': None,
|
|
76
|
+
'audit_tests': False,
|
|
77
|
+
'test_data_path': _test_data_path,
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
config = Config(**default_config_options)
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
config.update(**_load_config())
|
|
84
|
+
except Exception as err:
|
|
85
|
+
raise Exception('Error while reading vispy config file "%s":\n %s' %
|
|
86
|
+
(_get_config_fname(), str(err)))
|
|
87
|
+
set_log_level(config['logging_level'])
|
|
88
|
+
|
|
89
|
+
_parse_command_line_arguments()
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
###############################################################################
|
|
93
|
+
# Command line flag parsing
|
|
94
|
+
|
|
95
|
+
VISPY_HELP = """
|
|
96
|
+
VisPy command line arguments:
|
|
97
|
+
|
|
98
|
+
--vispy-backend=(qt|pyqt4|pyqt5|pyqt6|pyside|pyside2|pyside6|glfw|pyglet|sdl2|wx)
|
|
99
|
+
Selects the backend system for VisPy to use. This will override the default
|
|
100
|
+
backend selection in your configuration file.
|
|
101
|
+
|
|
102
|
+
--vispy-log=(debug|info|warning|error|critical)[,search string]
|
|
103
|
+
Sets the verbosity of logging output. The default is 'warning'. If a search
|
|
104
|
+
string is given, messages will only be displayed if they match the string,
|
|
105
|
+
or if their call location (module.class:method(line) or
|
|
106
|
+
module:function(line)) matches the string.
|
|
107
|
+
|
|
108
|
+
--vispy-dpi=resolution
|
|
109
|
+
Force the screen resolution to a certain value (in pixels per inch). By
|
|
110
|
+
default, the OS is queried to determine the screen DPI.
|
|
111
|
+
|
|
112
|
+
--vispy-fps
|
|
113
|
+
Print the framerate (in Frames Per Second) in the console.
|
|
114
|
+
|
|
115
|
+
--vispy-gl-debug
|
|
116
|
+
Enables error checking for all OpenGL calls.
|
|
117
|
+
|
|
118
|
+
--vispy-glir-file
|
|
119
|
+
Export glir commands to specified file.
|
|
120
|
+
|
|
121
|
+
--vispy-profile=locations
|
|
122
|
+
Measure performance at specific code locations and display results.
|
|
123
|
+
*locations* may be "all" or a comma-separated list of method names like
|
|
124
|
+
"SceneCanvas.draw_visual".
|
|
125
|
+
|
|
126
|
+
--vispy-cprofile
|
|
127
|
+
Enable profiling using the built-in cProfile module and display results
|
|
128
|
+
when the program exits.
|
|
129
|
+
|
|
130
|
+
--vispy-audit-tests
|
|
131
|
+
Enable user auditing of image test results.
|
|
132
|
+
|
|
133
|
+
--vispy-help
|
|
134
|
+
Display this help message.
|
|
135
|
+
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _parse_command_line_arguments():
|
|
140
|
+
"""Transform vispy specific command line args to vispy config.
|
|
141
|
+
Put into a function so that any variables dont leak in the vispy namespace.
|
|
142
|
+
"""
|
|
143
|
+
global config
|
|
144
|
+
# Get command line args for vispy
|
|
145
|
+
argnames = ['vispy-backend=', 'vispy-gl-debug', 'vispy-glir-file=',
|
|
146
|
+
'vispy-log=', 'vispy-help', 'vispy-profile=', 'vispy-cprofile',
|
|
147
|
+
'vispy-dpi=', 'vispy-audit-tests']
|
|
148
|
+
try:
|
|
149
|
+
opts, args = getopt.getopt(sys.argv[1:], '', argnames)
|
|
150
|
+
except getopt.GetoptError:
|
|
151
|
+
opts = []
|
|
152
|
+
# Use them to set the config values
|
|
153
|
+
for o, a in opts:
|
|
154
|
+
if o.startswith('--vispy'):
|
|
155
|
+
if o == '--vispy-backend':
|
|
156
|
+
config['default_backend'] = a
|
|
157
|
+
logger.info('vispy backend: %s', a)
|
|
158
|
+
elif o == '--vispy-gl-debug':
|
|
159
|
+
config['gl_debug'] = True
|
|
160
|
+
elif o == '--vispy-glir-file':
|
|
161
|
+
config['glir_file'] = a
|
|
162
|
+
elif o == '--vispy-log':
|
|
163
|
+
if ',' in a:
|
|
164
|
+
verbose, match = a.split(',')
|
|
165
|
+
else:
|
|
166
|
+
verbose = a
|
|
167
|
+
match = None
|
|
168
|
+
config['logging_level'] = a
|
|
169
|
+
set_log_level(verbose, match)
|
|
170
|
+
elif o == '--vispy-profile':
|
|
171
|
+
config['profile'] = a
|
|
172
|
+
elif o == '--vispy-cprofile':
|
|
173
|
+
_enable_profiling()
|
|
174
|
+
elif o == '--vispy-help':
|
|
175
|
+
print(VISPY_HELP)
|
|
176
|
+
elif o == '--vispy-dpi':
|
|
177
|
+
config['dpi'] = int(a)
|
|
178
|
+
elif o == '--vispy-audit-tests':
|
|
179
|
+
config['audit_tests'] = True
|
|
180
|
+
else:
|
|
181
|
+
logger.warning("Unsupported vispy flag: %s" % o)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
###############################################################################
|
|
185
|
+
# CONFIG
|
|
186
|
+
|
|
187
|
+
# Adapted from pyzolib/paths.py:
|
|
188
|
+
# https://bitbucket.org/pyzo/pyzolib/src/tip/paths.py
|
|
189
|
+
def _get_vispy_app_dir():
|
|
190
|
+
"""Helper to get the default directory for storing vispy data"""
|
|
191
|
+
# Define default user directory
|
|
192
|
+
user_dir = os.path.expanduser('~')
|
|
193
|
+
|
|
194
|
+
# Get system app data dir
|
|
195
|
+
path = None
|
|
196
|
+
if sys.platform.startswith('win'):
|
|
197
|
+
path1, path2 = os.getenv('LOCALAPPDATA'), os.getenv('APPDATA')
|
|
198
|
+
path = path1 or path2
|
|
199
|
+
elif sys.platform.startswith('darwin'):
|
|
200
|
+
path = os.path.join(user_dir, 'Library', 'Application Support')
|
|
201
|
+
# On Linux and as fallback
|
|
202
|
+
if not (path and os.path.isdir(path)):
|
|
203
|
+
path = user_dir
|
|
204
|
+
|
|
205
|
+
# Maybe we should store things local to the executable (in case of a
|
|
206
|
+
# portable distro or a frozen application that wants to be portable)
|
|
207
|
+
prefix = sys.prefix
|
|
208
|
+
if getattr(sys, 'frozen', None): # See application_dir() function
|
|
209
|
+
prefix = os.path.abspath(os.path.dirname(sys.path[0]))
|
|
210
|
+
for reldir in ('settings', '../settings'):
|
|
211
|
+
localpath = os.path.abspath(os.path.join(prefix, reldir))
|
|
212
|
+
if os.path.isdir(localpath):
|
|
213
|
+
try:
|
|
214
|
+
open(os.path.join(localpath, 'test.write'), 'wb').close()
|
|
215
|
+
os.remove(os.path.join(localpath, 'test.write'))
|
|
216
|
+
except IOError:
|
|
217
|
+
pass # We cannot write in this directory
|
|
218
|
+
else:
|
|
219
|
+
path = localpath
|
|
220
|
+
break
|
|
221
|
+
|
|
222
|
+
# Get path specific for this app
|
|
223
|
+
appname = '.vispy' if path == user_dir else 'vispy'
|
|
224
|
+
path = os.path.join(path, appname)
|
|
225
|
+
return path
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
class ConfigEvent(Event):
|
|
229
|
+
"""Event indicating a configuration change.
|
|
230
|
+
|
|
231
|
+
This class has a 'changes' attribute which is a dict of all name:value
|
|
232
|
+
pairs that have changed in the configuration.
|
|
233
|
+
"""
|
|
234
|
+
|
|
235
|
+
def __init__(self, changes):
|
|
236
|
+
Event.__init__(self, type='config_change')
|
|
237
|
+
self.changes = changes
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
class Config(object):
|
|
241
|
+
"""Container for global settings used application-wide in vispy.
|
|
242
|
+
|
|
243
|
+
Events:
|
|
244
|
+
|
|
245
|
+
- Config.events.changed - Emits ConfigEvent whenever the configuration changes.
|
|
246
|
+
|
|
247
|
+
"""
|
|
248
|
+
|
|
249
|
+
def __init__(self, **kwargs):
|
|
250
|
+
self.events = EmitterGroup(source=self)
|
|
251
|
+
self.events['changed'] = EventEmitter(
|
|
252
|
+
event_class=ConfigEvent,
|
|
253
|
+
source=self)
|
|
254
|
+
self._config = {}
|
|
255
|
+
self.update(**kwargs)
|
|
256
|
+
self._known_keys = get_config_keys()
|
|
257
|
+
|
|
258
|
+
def __getitem__(self, item):
|
|
259
|
+
return self._config[item]
|
|
260
|
+
|
|
261
|
+
def __setitem__(self, item, val):
|
|
262
|
+
self._check_key_val(item, val)
|
|
263
|
+
self._config[item] = val
|
|
264
|
+
# inform any listeners that a configuration option has changed
|
|
265
|
+
self.events.changed(changes={item: val})
|
|
266
|
+
|
|
267
|
+
def _check_key_val(self, key, val):
|
|
268
|
+
global _allowed_config_keys
|
|
269
|
+
# check values against acceptable ones
|
|
270
|
+
known_keys = _allowed_config_keys
|
|
271
|
+
if key not in known_keys:
|
|
272
|
+
raise KeyError('key "%s" not in known keys: "%s"'
|
|
273
|
+
% (key, known_keys))
|
|
274
|
+
if not isinstance(val, known_keys[key]):
|
|
275
|
+
raise TypeError('Value for key "%s" must be one of %s, not %s.'
|
|
276
|
+
% (key, known_keys[key], type(val)))
|
|
277
|
+
|
|
278
|
+
def update(self, **kwargs):
|
|
279
|
+
for key, val in kwargs.items():
|
|
280
|
+
self._check_key_val(key, val)
|
|
281
|
+
self._config.update(kwargs)
|
|
282
|
+
self.events.changed(changes=kwargs)
|
|
283
|
+
|
|
284
|
+
def __repr__(self):
|
|
285
|
+
return repr(self._config)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def get_config_keys():
|
|
289
|
+
"""The config keys known by vispy and their allowed data types.
|
|
290
|
+
|
|
291
|
+
Returns
|
|
292
|
+
-------
|
|
293
|
+
keys : dict
|
|
294
|
+
Dict of {key: (types,)} pairs.
|
|
295
|
+
"""
|
|
296
|
+
global _allowed_config_keys
|
|
297
|
+
return _allowed_config_keys.copy()
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def _get_config_fname():
|
|
301
|
+
"""Helper for the vispy config file"""
|
|
302
|
+
directory = _get_vispy_app_dir()
|
|
303
|
+
if directory is None:
|
|
304
|
+
return None
|
|
305
|
+
fname = op.join(directory, 'vispy.json')
|
|
306
|
+
if os.environ.get('_VISPY_CONFIG_TESTING', None) is not None:
|
|
307
|
+
fname = op.join(_TempDir(), 'vispy.json')
|
|
308
|
+
return fname
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def _load_config():
|
|
312
|
+
"""Helper to load prefs from ~/.vispy/vispy.json"""
|
|
313
|
+
fname = _get_config_fname()
|
|
314
|
+
if fname is None or not op.isfile(fname):
|
|
315
|
+
return dict()
|
|
316
|
+
with open(fname, 'r') as fid:
|
|
317
|
+
config = json.load(fid)
|
|
318
|
+
return config
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def save_config(**kwargs):
|
|
322
|
+
"""Save configuration keys to vispy config file
|
|
323
|
+
|
|
324
|
+
Parameters
|
|
325
|
+
----------
|
|
326
|
+
**kwargs : keyword arguments
|
|
327
|
+
Key/value pairs to save to the config file.
|
|
328
|
+
"""
|
|
329
|
+
if kwargs == {}:
|
|
330
|
+
kwargs = config._config
|
|
331
|
+
current_config = _load_config()
|
|
332
|
+
current_config.update(**kwargs)
|
|
333
|
+
# write to disk
|
|
334
|
+
fname = _get_config_fname()
|
|
335
|
+
if fname is None:
|
|
336
|
+
raise RuntimeError('config filename could not be determined')
|
|
337
|
+
if not op.isdir(op.dirname(fname)):
|
|
338
|
+
os.mkdir(op.dirname(fname))
|
|
339
|
+
with open(fname, 'w') as fid:
|
|
340
|
+
json.dump(current_config, fid, sort_keys=True, indent=0)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def set_data_dir(directory=None, create=False, save=False):
|
|
344
|
+
"""Set vispy data download directory
|
|
345
|
+
|
|
346
|
+
Parameters
|
|
347
|
+
----------
|
|
348
|
+
directory : str | None
|
|
349
|
+
The directory to use.
|
|
350
|
+
create : bool
|
|
351
|
+
If True, create directory if it doesn't exist.
|
|
352
|
+
save : bool
|
|
353
|
+
If True, save the configuration to the vispy config.
|
|
354
|
+
"""
|
|
355
|
+
if directory is None:
|
|
356
|
+
directory = _data_path
|
|
357
|
+
if _data_path is None:
|
|
358
|
+
raise IOError('default path cannot be determined, please '
|
|
359
|
+
'set it manually (directory != None)')
|
|
360
|
+
if not op.isdir(directory):
|
|
361
|
+
if not create:
|
|
362
|
+
raise IOError('directory "%s" does not exist, perhaps try '
|
|
363
|
+
'create=True to create it?' % directory)
|
|
364
|
+
os.mkdir(directory)
|
|
365
|
+
config.update(data_path=directory)
|
|
366
|
+
if save:
|
|
367
|
+
save_config(data_path=directory)
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def _enable_profiling():
|
|
371
|
+
"""Start profiling and register callback to print stats when the program
|
|
372
|
+
exits.
|
|
373
|
+
"""
|
|
374
|
+
import cProfile
|
|
375
|
+
import atexit
|
|
376
|
+
global _profiler
|
|
377
|
+
_profiler = cProfile.Profile()
|
|
378
|
+
_profiler.enable()
|
|
379
|
+
atexit.register(_profile_atexit)
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
_profiler = None
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def _profile_atexit():
|
|
386
|
+
global _profiler
|
|
387
|
+
_profiler.print_stats(sort='cumulative')
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def sys_info(fname=None, overwrite=False):
|
|
391
|
+
"""Get relevant system and debugging information
|
|
392
|
+
|
|
393
|
+
Parameters
|
|
394
|
+
----------
|
|
395
|
+
fname : str | None
|
|
396
|
+
Filename to dump info to. Use None to simply print.
|
|
397
|
+
overwrite : bool
|
|
398
|
+
If True, overwrite file (if it exists).
|
|
399
|
+
|
|
400
|
+
Returns
|
|
401
|
+
-------
|
|
402
|
+
out : str
|
|
403
|
+
The system information as a string.
|
|
404
|
+
"""
|
|
405
|
+
if fname is not None and op.isfile(fname) and not overwrite:
|
|
406
|
+
raise IOError('file exists, use overwrite=True to overwrite')
|
|
407
|
+
|
|
408
|
+
out = 'Platform: %s\n' % platform.platform()
|
|
409
|
+
out += 'Python: %s\n' % str(sys.version).replace('\n', ' ')
|
|
410
|
+
out += 'NumPy: %s\n' % (np.__version__,)
|
|
411
|
+
try:
|
|
412
|
+
# Nest all imports here to avoid any circular imports
|
|
413
|
+
from ..app import use_app, Canvas
|
|
414
|
+
from ..app.backends import BACKEND_NAMES
|
|
415
|
+
from ..gloo import gl
|
|
416
|
+
from .check_environment import has_backend
|
|
417
|
+
# get default app
|
|
418
|
+
with use_log_level('warning'):
|
|
419
|
+
app = use_app(call_reuse=False) # suppress messages
|
|
420
|
+
out += 'Backend: %s\n' % app.backend_name
|
|
421
|
+
for backend in BACKEND_NAMES:
|
|
422
|
+
if backend.startswith('ipynb_'):
|
|
423
|
+
continue
|
|
424
|
+
with use_log_level('warning', print_msg=False):
|
|
425
|
+
which = has_backend(backend, out=['which'])[1]
|
|
426
|
+
out += '{0:<9} {1}\n'.format(backend + ':', which)
|
|
427
|
+
out += '\n'
|
|
428
|
+
# We need an OpenGL context to get GL info
|
|
429
|
+
canvas = Canvas('Test', (10, 10), show=False, app=app)
|
|
430
|
+
canvas._backend._vispy_set_current()
|
|
431
|
+
out += 'GL version: %r\n' % (gl.glGetParameter(gl.GL_VERSION),)
|
|
432
|
+
x_ = gl.GL_MAX_TEXTURE_SIZE
|
|
433
|
+
out += 'MAX_TEXTURE_SIZE: %r\n' % (gl.glGetParameter(x_),)
|
|
434
|
+
out += 'Extensions: %r\n' % (gl.glGetParameter(gl.GL_EXTENSIONS),)
|
|
435
|
+
canvas.close()
|
|
436
|
+
except Exception: # don't stop printing info
|
|
437
|
+
out += 'App info-gathering error:\n%s' % traceback.format_exc()
|
|
438
|
+
pass
|
|
439
|
+
if fname is not None:
|
|
440
|
+
with open(fname, 'w') as fid:
|
|
441
|
+
fid.write(out)
|
|
442
|
+
return out
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
class _TempDir(str):
|
|
446
|
+
"""Class for creating and auto-destroying temp dir
|
|
447
|
+
|
|
448
|
+
This is designed to be used with testing modules.
|
|
449
|
+
|
|
450
|
+
We cannot simply use __del__() method for cleanup here because the rmtree
|
|
451
|
+
function may be cleaned up before this object, so we use the atexit module
|
|
452
|
+
instead.
|
|
453
|
+
"""
|
|
454
|
+
|
|
455
|
+
def __new__(self):
|
|
456
|
+
new = str.__new__(self, tempfile.mkdtemp())
|
|
457
|
+
return new
|
|
458
|
+
|
|
459
|
+
def __init__(self):
|
|
460
|
+
self._path = self.__str__()
|
|
461
|
+
atexit.register(self.cleanup)
|
|
462
|
+
|
|
463
|
+
def cleanup(self):
|
|
464
|
+
rmtree(self._path, ignore_errors=True)
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
# initialize config options
|
|
468
|
+
_init()
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
if hasattr(inspect, 'signature'): # py35
|
|
472
|
+
def _get_args(function, varargs=False):
|
|
473
|
+
params = inspect.signature(function).parameters
|
|
474
|
+
args = [key for key, param in params.items()
|
|
475
|
+
if param.kind not in (param.VAR_POSITIONAL, param.VAR_KEYWORD)]
|
|
476
|
+
if varargs:
|
|
477
|
+
varargs = [param.name for param in params.values()
|
|
478
|
+
if param.kind == param.VAR_POSITIONAL]
|
|
479
|
+
if len(varargs) == 0:
|
|
480
|
+
varargs = None
|
|
481
|
+
return args, varargs
|
|
482
|
+
else:
|
|
483
|
+
return args
|
|
484
|
+
else:
|
|
485
|
+
def _get_args(function, varargs=False):
|
|
486
|
+
out = inspect.getargspec(function) # args, varargs, keywords, defaults
|
|
487
|
+
if varargs:
|
|
488
|
+
return out[:2]
|
|
489
|
+
else:
|
|
490
|
+
return out[0]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
"""The dpi module enables querying the OS for the screen DPI."""
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
__all__ = ['get_dpi']
|
|
11
|
+
|
|
12
|
+
if sys.platform.startswith('linux'):
|
|
13
|
+
from ._linux import get_dpi
|
|
14
|
+
elif sys.platform == 'darwin':
|
|
15
|
+
from ._quartz import get_dpi
|
|
16
|
+
elif sys.platform.startswith('win'):
|
|
17
|
+
from ._win32 import get_dpi # noqa, analysis:ignore
|
|
18
|
+
else:
|
|
19
|
+
raise NotImplementedError('unknown system %s' % sys.platform)
|
vispy/util/dpi/_linux.py
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
from subprocess import CalledProcessError
|
|
10
|
+
|
|
11
|
+
from ..logs import logger
|
|
12
|
+
from ..wrappers import run_subprocess
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _get_dpi_from(cmd, pattern, func):
|
|
16
|
+
"""Match pattern against the output of func, passing the results as
|
|
17
|
+
floats to func. If anything fails, return None.
|
|
18
|
+
"""
|
|
19
|
+
try:
|
|
20
|
+
out, _ = run_subprocess([cmd])
|
|
21
|
+
except (OSError, CalledProcessError):
|
|
22
|
+
pass
|
|
23
|
+
else:
|
|
24
|
+
match = re.search(pattern, out)
|
|
25
|
+
if match:
|
|
26
|
+
return func(*map(float, match.groups()))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _xrandr_calc(x_px, y_px, x_mm, y_mm):
|
|
30
|
+
if x_mm == 0 or y_mm == 0:
|
|
31
|
+
logger.warning("'xrandr' output has screen dimension of 0mm, " +
|
|
32
|
+
"can't compute proper DPI")
|
|
33
|
+
return 96.
|
|
34
|
+
return 25.4 * (x_px / x_mm + y_px / y_mm) / 2
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_dpi(raise_error=True):
|
|
38
|
+
"""Get screen DPI from the OS
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
raise_error : bool
|
|
43
|
+
If True, raise an error if DPI could not be determined.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
dpi : float
|
|
48
|
+
Dots per inch of the primary screen.
|
|
49
|
+
"""
|
|
50
|
+
# If we are running without an X server (e.g. OSMesa), use a fixed DPI
|
|
51
|
+
if 'DISPLAY' not in os.environ:
|
|
52
|
+
return 96.
|
|
53
|
+
|
|
54
|
+
from_xdpyinfo = _get_dpi_from(
|
|
55
|
+
'xdpyinfo', r'(\d+)x(\d+) dots per inch',
|
|
56
|
+
lambda x_dpi, y_dpi: (x_dpi + y_dpi) / 2)
|
|
57
|
+
if from_xdpyinfo is not None:
|
|
58
|
+
return from_xdpyinfo
|
|
59
|
+
|
|
60
|
+
from_xrandr = _get_dpi_from(
|
|
61
|
+
'xrandr', r'(\d+)x(\d+).*?(\d+)mm x (\d+)mm',
|
|
62
|
+
_xrandr_calc)
|
|
63
|
+
if from_xrandr is not None:
|
|
64
|
+
return from_xrandr
|
|
65
|
+
if raise_error:
|
|
66
|
+
raise RuntimeError('could not determine DPI')
|
|
67
|
+
else:
|
|
68
|
+
logger.warning('could not determine DPI')
|
|
69
|
+
return 96
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
from ...ext.cocoapy import quartz
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def get_dpi(raise_error=True):
|
|
11
|
+
"""Get screen DPI from the OS
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
raise_error : bool
|
|
16
|
+
If True, raise an error if DPI could not be determined.
|
|
17
|
+
|
|
18
|
+
Returns
|
|
19
|
+
-------
|
|
20
|
+
dpi : float
|
|
21
|
+
Dots per inch of the primary screen.
|
|
22
|
+
"""
|
|
23
|
+
display = quartz.CGMainDisplayID()
|
|
24
|
+
mm = quartz.CGDisplayScreenSize(display)
|
|
25
|
+
px = quartz.CGDisplayBounds(display).size
|
|
26
|
+
return (px.width/mm.width + px.height/mm.height) * 0.5 * 25.4
|
vispy/util/dpi/_win32.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# Copyright (c) Vispy Development Team. All Rights Reserved.
|
|
4
|
+
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
|
|
5
|
+
# -----------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
from ...ext.gdi32plus import (gdi32, user32, HORZSIZE, VERTSIZE,
|
|
8
|
+
HORZRES, VERTRES)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def get_dpi(raise_error=True):
|
|
12
|
+
"""Get screen DPI from the OS
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
raise_error : bool
|
|
17
|
+
If True, raise an error if DPI could not be determined.
|
|
18
|
+
|
|
19
|
+
Returns
|
|
20
|
+
-------
|
|
21
|
+
dpi : float
|
|
22
|
+
Dots per inch of the primary screen.
|
|
23
|
+
"""
|
|
24
|
+
try:
|
|
25
|
+
user32.SetProcessDPIAware()
|
|
26
|
+
except AttributeError:
|
|
27
|
+
pass # not present on XP
|
|
28
|
+
dc = user32.GetDC(0)
|
|
29
|
+
h_size = gdi32.GetDeviceCaps(dc, HORZSIZE)
|
|
30
|
+
v_size = gdi32.GetDeviceCaps(dc, VERTSIZE)
|
|
31
|
+
h_res = gdi32.GetDeviceCaps(dc, HORZRES)
|
|
32
|
+
v_res = gdi32.GetDeviceCaps(dc, VERTRES)
|
|
33
|
+
user32.ReleaseDC(None, dc)
|
|
34
|
+
return (h_res/float(h_size) + v_res/float(v_size)) * 0.5 * 25.4
|
|
File without changes
|
|
@@ -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
|
+
from vispy.util.dpi import get_dpi
|
|
6
|
+
from vispy.testing import run_tests_if_main
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_dpi():
|
|
10
|
+
"""Test dpi support"""
|
|
11
|
+
dpi = get_dpi()
|
|
12
|
+
assert dpi > 0.
|
|
13
|
+
assert isinstance(dpi, float)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
run_tests_if_main()
|
vispy/util/eq.py
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
from numpy import ndarray, bool_
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def eq(a, b):
|
|
6
|
+
"""The great missing equivalence function: Guaranteed evaluation
|
|
7
|
+
to a single bool value.
|
|
8
|
+
"""
|
|
9
|
+
if a is b:
|
|
10
|
+
return True
|
|
11
|
+
if a is None or b is None:
|
|
12
|
+
return True if a is None and b is None else False
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
e = a == b
|
|
16
|
+
except ValueError:
|
|
17
|
+
return False
|
|
18
|
+
except AttributeError:
|
|
19
|
+
return False
|
|
20
|
+
except Exception:
|
|
21
|
+
print("a:", str(type(a)), str(a))
|
|
22
|
+
print("b:", str(type(b)), str(b))
|
|
23
|
+
raise
|
|
24
|
+
t = type(e)
|
|
25
|
+
if t is bool:
|
|
26
|
+
return e
|
|
27
|
+
elif t is bool_:
|
|
28
|
+
return bool(e)
|
|
29
|
+
elif isinstance(e, ndarray):
|
|
30
|
+
try:
|
|
31
|
+
# disaster: if a is empty and b is not, then e.all() is True
|
|
32
|
+
if a.shape != b.shape:
|
|
33
|
+
return False
|
|
34
|
+
except Exception:
|
|
35
|
+
return False
|
|
36
|
+
if (hasattr(e, 'implements') and e.implements('MetaArray')):
|
|
37
|
+
return e.asarray().all()
|
|
38
|
+
else:
|
|
39
|
+
return e.all()
|
|
40
|
+
else:
|
|
41
|
+
raise Exception("== operator returned type %s" % str(type(e)))
|