vispy 0.14.2__cp311-cp311-win_amd64.whl → 0.14.3__cp311-cp311-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.

@@ -16,7 +16,7 @@ from .meshdata import MeshData # noqa
16
16
  from .rect import Rect # noqa
17
17
  from .triangulation import Triangulation, triangulate # noqa
18
18
  from .torusknot import TorusKnot # noqa
19
- from .calculations import (_calculate_normals, _fast_cross_3d, # noqa
19
+ from .calculations import (_calculate_normals, _cross_2d, _fast_cross_3d, # noqa
20
20
  resize) # noqa
21
21
  from .generation import (create_arrow, create_box, create_cone, # noqa
22
22
  create_cube, create_cylinder, create_grid_mesh, # noqa
@@ -7,8 +7,33 @@
7
7
  import numpy as np
8
8
 
9
9
 
10
- ###############################################################################
11
- # These fast normal calculation routines are adapted from mne-python
10
+ def _cross_2d(x, y):
11
+ """Compute the z-component of the cross product of (arrays of) 2D vectors.
12
+
13
+ This is meant to replicate the 2D functionality of np.cross(), which is
14
+ deprecated in numpy 2.0.
15
+
16
+ x and y must have broadcastable shapes, with the last dimension being 2.
17
+
18
+ Parameters
19
+ ----------
20
+ x : array
21
+ Input array 1, shape (..., 2).
22
+ y : array
23
+ Input array 2, shape (..., 2).
24
+
25
+ Returns
26
+ -------
27
+ z : array
28
+ z-component of cross products of x and y.
29
+
30
+ See: https://github.com/numpy/numpy/issues/26620
31
+ """
32
+ if x.shape[-1] != 2 or y.shape[-1] != 2:
33
+ raise ValueError("Input arrays must have shape (..., 2)")
34
+
35
+ return x[..., 0] * y[..., 1] - x[..., 1] * y[..., 0]
36
+
12
37
 
13
38
  def _fast_cross_3d(x, y):
14
39
  """Compute cross product between list of 3D vectors
@@ -47,6 +72,9 @@ def _fast_cross_3d(x, y):
47
72
  return np.cross(x, y)
48
73
 
49
74
 
75
+ ###############################################################################
76
+ # These fast normal calculation routines are adapted from mne-python
77
+
50
78
  def _calculate_normals(rr, tris):
51
79
  """Efficiently compute vertex normals for triangulated surface"""
52
80
  # ensure highest precision for our summation/vectorization "trick"
@@ -7,6 +7,8 @@ import numpy as np
7
7
 
8
8
  from collections import OrderedDict
9
9
 
10
+ from .calculations import _cross_2d
11
+
10
12
 
11
13
  class Triangulation(object):
12
14
  """Constrained delaunay triangulation
@@ -676,7 +678,7 @@ class Triangulation(object):
676
678
  A = self.pts[a]
677
679
  B = self.pts[b]
678
680
  C = self.pts[c]
679
- return np.cross(B-A, C-B) > 0
681
+ return _cross_2d(B - A, C - B) > 0
680
682
 
681
683
  def _edges_intersect(self, edge1, edge2):
682
684
  """Return 1 if edges intersect completely (endpoints excluded)"""
@@ -739,7 +741,7 @@ class Triangulation(object):
739
741
  """
740
742
  v1 = self.pts[point] - self.pts[edge[0]]
741
743
  v2 = self.pts[edge[1]] - self.pts[edge[0]]
742
- c = np.cross(v1, v2) # positive if v1 is CW from v2
744
+ c = _cross_2d(v1, v2) # positive if v1 is CW from v2
743
745
  return 1 if c > 0 else (-1 if c < 0 else 0)
744
746
 
745
747
  def _add_tri(self, a, b, c):
vispy/gloo/buffer.py CHANGED
@@ -10,7 +10,7 @@ from traceback import extract_stack, format_list
10
10
  import weakref
11
11
 
12
12
  from . globject import GLObject
13
- from ..util import logger
13
+ from ..util import logger, np_copy_if_needed
14
14
 
15
15
 
16
16
  # ------------------------------------------------------------ Buffer class ---
@@ -70,7 +70,7 @@ class Buffer(GLObject):
70
70
  data is actually uploaded to GPU memory.
71
71
  Asking explicitly for a copy will prevent this behavior.
72
72
  """
73
- data = np.array(data, copy=copy)
73
+ data = np.array(data, copy=copy or np_copy_if_needed)
74
74
  nbytes = data.nbytes
75
75
 
76
76
  if offset < 0:
@@ -98,7 +98,7 @@ class Buffer(GLObject):
98
98
  data is actually uploaded to GPU memory.
99
99
  Asking explicitly for a copy will prevent this behavior.
100
100
  """
101
- data = np.array(data, copy=copy)
101
+ data = np.array(data, copy=copy or np_copy_if_needed)
102
102
  nbytes = data.nbytes
103
103
 
104
104
  if nbytes != self._nbytes:
@@ -283,7 +283,7 @@ class DataBuffer(Buffer):
283
283
 
284
284
  # Make sure data is an array
285
285
  if not isinstance(data, np.ndarray):
286
- data = np.array(data, dtype=self.dtype, copy=False)
286
+ data = np.array(data, dtype=self.dtype)
287
287
 
288
288
  # Make sure data is big enough
289
289
  if data.size < stop - start:
@@ -192,8 +192,10 @@ quad = np.array([[0, 0, 0], [-1, 0, 0], [-1, -1, 0],
192
192
  N = quad.shape[0] * 4
193
193
 
194
194
  # buf3 contains coordinates in device coordinates for four quadrants
195
- buf3 = np.row_stack([quad + (0, 0, 0), quad + (0, 1, 0),
196
- quad + (1, 1, 0), quad + (1, 0, 0)]).astype(np.float32)
195
+ buf3 = np.vstack([
196
+ quad + (0, 0, 0), quad + (0, 1, 0),
197
+ quad + (1, 1, 0), quad + (1, 0, 0),
198
+ ]).astype(np.float32)
197
199
 
198
200
  # buf2 is texture coords. Note that this is a view on buf2
199
201
  buf2 = ((buf3+1.0)*0.5)[:, :2] # not C-contiguous
vispy/gloo/glir.py CHANGED
@@ -1283,8 +1283,13 @@ class GlirProgram(GlirObject):
1283
1283
  gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vbo_handle)
1284
1284
  gl.glEnableVertexAttribArray(attr_handle)
1285
1285
  func(attr_handle, *args)
1286
- if divisor is not None:
1287
- gl.glVertexAttribDivisor(attr_handle, divisor)
1286
+ if hasattr(gl, "glVertexAttribDivisor"):
1287
+ gl.glVertexAttribDivisor(attr_handle, divisor or 0)
1288
+ elif divisor is not None:
1289
+ logger.warning(
1290
+ 'Instanced rendering is not supported by the current'
1291
+ f'backend ("{gl.current_backend.__name__}")'
1292
+ )
1288
1293
  else:
1289
1294
  gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
1290
1295
  gl.glDisableVertexAttribArray(attr_handle)
vispy/gloo/texture.py CHANGED
@@ -11,6 +11,7 @@ import warnings
11
11
 
12
12
  from .globject import GLObject
13
13
  from .util import check_enum
14
+ from ..util import np_copy_if_needed
14
15
 
15
16
 
16
17
  def get_dtype_limits(dtype):
@@ -29,7 +30,7 @@ def convert_dtype_and_clip(data, dtype, copy=False):
29
30
  new_min, new_max = get_dtype_limits(dtype)
30
31
  if new_max >= old_max and new_min <= old_min:
31
32
  # no need to clip
32
- return np.array(data, dtype=dtype, copy=copy)
33
+ return np.array(data, dtype=dtype, copy=copy or np_copy_if_needed)
33
34
  else:
34
35
  # to reduce copying, we clip into a pre-generated array of the right dtype
35
36
  new_data = np.empty_like(data, dtype=dtype)
@@ -158,7 +159,7 @@ class BaseTexture(GLObject):
158
159
  if data is not None:
159
160
  if shape is not None:
160
161
  raise ValueError('Texture needs data or shape, not both.')
161
- data = np.array(data, copy=False)
162
+ data = np.array(data)
162
163
  # So we can test the combination
163
164
  self._resize(data.shape, format, internalformat)
164
165
  self._set_data(data)
@@ -427,7 +428,7 @@ class BaseTexture(GLObject):
427
428
 
428
429
  # Make sure data is an array
429
430
  if not isinstance(data, np.ndarray):
430
- data = np.array(data, copy=False)
431
+ data = np.array(data)
431
432
  # Make sure data is big enough
432
433
  if data.shape != shape:
433
434
  data = np.resize(data, shape)
vispy/testing/_runners.py CHANGED
@@ -164,7 +164,9 @@ def _flake():
164
164
  print('Running flake8... ') # if end='', first error gets ugly
165
165
  sys.stdout.flush()
166
166
  try:
167
- main()
167
+ # flake8 used to exit on failure, but instead `main` now returns an exit code
168
+ # see https://github.com/PyCQA/flake8/pull/1461
169
+ raise SystemExit(main())
168
170
  except SystemExit as ex:
169
171
  if ex.code in (None, 0):
170
172
  pass # do not exit yet, we want to print a success msg
vispy/util/__init__.py CHANGED
@@ -15,3 +15,18 @@ from . import fonts # noqa
15
15
  from . import transforms # noqa
16
16
  from .wrappers import use, run_subprocess # noqa
17
17
  from .bunch import SimpleBunch # noqa
18
+
19
+ from typing import Optional
20
+
21
+ import numpy as np
22
+
23
+ # `copy` keyword semantics changed in NumPy 2.0
24
+ # this maintains compatibility with older versions
25
+ # if/when NumPy 2.0 becomes the minimum version, we can remove this
26
+ # we don't worry about early dev versions of NumPy 2.0 (that may or may not have the kwarg) here
27
+ # see:
28
+ # https://numpy.org/devdocs/numpy_2_0_migration_guide.html#adapting-to-changes-in-the-copy-keyword
29
+ # https://github.com/scipy/scipy/pull/20172
30
+ np_copy_if_needed: Optional[bool] = None
31
+ if np.lib.NumpyVersion(np.__version__) < "1.28.0":
32
+ np_copy_if_needed = False
vispy/version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.14.2'
16
- __version_tuple__ = version_tuple = (0, 14, 2)
15
+ __version__ = version = '0.14.3'
16
+ __version_tuple__ = version_tuple = (0, 14, 3)
@@ -6,6 +6,7 @@ import warnings
6
6
  import numpy as np
7
7
 
8
8
  from vispy.gloo.texture import Texture2D, Texture3D, convert_dtype_and_clip
9
+ from vispy.util import np_copy_if_needed
9
10
 
10
11
 
11
12
  def get_default_clim_from_dtype(dtype):
@@ -298,7 +299,7 @@ class CPUScaledTextureMixin(_ScaledTextureMixin):
298
299
 
299
300
  @staticmethod
300
301
  def _scale_data_on_cpu(data, clim, copy=True):
301
- data = np.array(data, dtype=np.float32, copy=copy)
302
+ data = np.array(data, dtype=np.float32, copy=copy or np_copy_if_needed)
302
303
  if clim[0] != clim[1]:
303
304
  # we always must copy the data if we change it here, otherwise it might change
304
305
  # unexpectedly the data held outside of here
@@ -73,7 +73,7 @@ class ArrayList(object):
73
73
  if isinstance(data[0], (list, tuple)):
74
74
  itemsize = [len(sublist) for sublist in data]
75
75
  data = [item for sublist in data for item in sublist]
76
- self._data = np.array(data, copy=False)
76
+ self._data = np.array(data)
77
77
  self._size = self._data.size
78
78
 
79
79
  # Default is one group with all data inside
@@ -88,7 +88,7 @@ class ArrayList(object):
88
88
  _itemsize = np.ones(
89
89
  self._count, dtype=int) * (self._size // self._count)
90
90
  else:
91
- _itemsize = np.array(itemsize, copy=False)
91
+ _itemsize = np.array(itemsize)
92
92
  self._count = len(itemsize)
93
93
  if _itemsize.sum() != self._size:
94
94
  raise ValueError("Cannot partition data as requested")
@@ -302,7 +302,7 @@ class ArrayList(object):
302
302
  itemsize = [len(sublist) for sublist in data]
303
303
  data = [item for sublist in data for item in sublist]
304
304
 
305
- data = np.array(data, copy=False).ravel()
305
+ data = np.array(data).ravel()
306
306
  size = data.size
307
307
 
308
308
  # Check item size and get item number
@@ -313,7 +313,7 @@ class ArrayList(object):
313
313
  _count = size // itemsize
314
314
  _itemsize = np.ones(_count, dtype=int) * (size // _count)
315
315
  else:
316
- _itemsize = np.array(itemsize, copy=False)
316
+ _itemsize = np.array(itemsize)
317
317
  _count = len(itemsize)
318
318
  if _itemsize.sum() != size:
319
319
  raise ValueError("Cannot partition data as requested")
vispy/visuals/image.py CHANGED
@@ -16,6 +16,7 @@ from .transforms import NullTransform
16
16
  from .visual import Visual
17
17
  from ..io import load_spatial_filters
18
18
  from ._scalable_textures import CPUScaledTexture2D, GPUScaledTexture2D
19
+ from ..util import np_copy_if_needed
19
20
 
20
21
 
21
22
  _VERTEX_SHADER = """
@@ -380,7 +381,7 @@ class ImageVisual(Visual):
380
381
  texture_format : str or None
381
382
 
382
383
  """
383
- data = np.array(image, copy=copy)
384
+ data = np.array(image, copy=copy or np_copy_if_needed)
384
385
  if np.iscomplexobj(data):
385
386
  raise TypeError(
386
387
  "Complex data types not supported. Please use 'ComplexImage' instead"
@@ -7,6 +7,8 @@ cimport numpy as np
7
7
  from libc.math cimport sqrt
8
8
  cimport cython
9
9
 
10
+ np.import_array()
11
+
10
12
  __all__ = ['_get_distance_field']
11
13
 
12
14
  dtype = np.float32
vispy/visuals/volume.py CHANGED
@@ -417,8 +417,8 @@ _ATTENUATED_MIP_SNIPPETS = dict(
417
417
  // Scale and clamp accumulation in `sumval` by contrast limits so that:
418
418
  // * attenuation value does not depend on data values
419
419
  // * negative values do not amplify instead of attenuate
420
- sumval = sumval + clamp((val - clim.x) / (clim.y - clim.x), 0.0, 1.0);
421
- scale = exp(-u_attenuation * (sumval - 1) / u_relative_step_size);
420
+ sumval = sumval + u_relative_step_size * clamp((val - clim.x) / (clim.y - clim.x), 0.0, 1.0);
421
+ scale = exp(-u_attenuation * (sumval - 1));
422
422
  if( maxval > scale * clim.y ) {
423
423
  // stop if no chance of finding a higher maxval
424
424
  iter = nsteps;
@@ -1165,9 +1165,40 @@ class VolumeVisual(Visual):
1165
1165
 
1166
1166
  @relative_step_size.setter
1167
1167
  def relative_step_size(self, value):
1168
+ """Set the relative step size used during raycasting.
1169
+
1170
+ Very small values give increased detail when rendering volumes with
1171
+ few voxels, but values that are too small give worse performance
1172
+ (framerate), in extreme cases causing a GPU hang and for the process
1173
+ to be killed by the OS. See discussion at:
1174
+
1175
+ https://github.com/vispy/vispy/pull/2587
1176
+
1177
+ For this reason, this setter issues a warning when the value is
1178
+ smaller than ``side_len / (2 * MAX_CANVAS_SIZE)``, where ``side_len``
1179
+ is the smallest side of the volume and ``MAX_CANVAS_SIZE`` is what
1180
+ we consider to be the largest likely monitor resolution along its
1181
+ longest side: 7680 pixels, equivalent to an 8K monitor.
1182
+
1183
+ This setter also raises a ValueError when the value is 0 or negative.
1184
+ """
1168
1185
  value = float(value)
1169
- if value < 0.1:
1170
- raise ValueError('relative_step_size cannot be smaller than 0.1')
1186
+ side_len = np.min(self._vol_shape)
1187
+ MAX_CANVAS_SIZE = 7680
1188
+ minimum_val = side_len / (2 * MAX_CANVAS_SIZE)
1189
+ if value <= 0:
1190
+ raise ValueError('relative_step_size cannot be 0 or negative.')
1191
+ elif value < minimum_val:
1192
+ warnings.warn(
1193
+ f'To display a volume of shape {self._vol_shape} without '
1194
+ f'artifacts, you need a step size no smaller than {side_len} /'
1195
+ f'(2 * {MAX_CANVAS_SIZE}) = {minimum_val:,.3g}. To prevent '
1196
+ 'extreme degradation in rendering performance, the provided '
1197
+ f'value of {value} is being clipped to {minimum_val:,.3g}. If '
1198
+ 'you believe you need a smaller step size, please raise an '
1199
+ 'issue at https://github.com/vispy/vispy/issues.'
1200
+ )
1201
+ value = minimum_val
1171
1202
  self._relative_step_size = value
1172
1203
  self.shared_program['u_relative_step_size'] = value
1173
1204
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vispy
3
- Version: 0.14.2
3
+ Version: 0.14.3
4
4
  Summary: Interactive visualization in Python
5
5
  Home-page: http://vispy.org
6
6
  Download-URL: https://pypi.python.org/pypi/vispy
@@ -19,13 +19,13 @@ Classifier: Operating System :: MacOS :: MacOS X
19
19
  Classifier: Operating System :: Microsoft :: Windows
20
20
  Classifier: Operating System :: POSIX
21
21
  Classifier: Programming Language :: Python
22
- Classifier: Programming Language :: Python :: 3.8
23
22
  Classifier: Programming Language :: Python :: 3.9
24
23
  Classifier: Programming Language :: Python :: 3.10
25
24
  Classifier: Programming Language :: Python :: 3.11
25
+ Classifier: Programming Language :: Python :: 3.12
26
26
  Classifier: Framework :: IPython
27
27
  Provides: vispy
28
- Requires-Python: >=3.8
28
+ Requires-Python: >=3.9
29
29
  Description-Content-Type: text/x-rst
30
30
  License-File: LICENSE.txt
31
31
  Requires-Dist: numpy
@@ -42,6 +42,8 @@ Requires-Dist: myst-parser ; extra == 'doc'
42
42
  Requires-Dist: pillow ; extra == 'doc'
43
43
  Requires-Dist: pytest ; extra == 'doc'
44
44
  Requires-Dist: pyopengl ; extra == 'doc'
45
+ Provides-Extra: glfw
46
+ Requires-Dist: glfw ; extra == 'glfw'
45
47
  Provides-Extra: io
46
48
  Requires-Dist: meshio ; extra == 'io'
47
49
  Requires-Dist: Pillow ; extra == 'io'
@@ -205,7 +207,7 @@ External links
205
207
  - `Chat room <https://gitter.im/vispy/vispy>`__
206
208
  - `Developer chat room <https://gitter.im/vispy/vispy-dev>`__
207
209
  - `Wiki <http://github.com/vispy/vispy/wiki>`__
208
- - `Gallery <http://vispy.org/gallery.html>`__
210
+ - `Gallery <http://vispy.org/gallery/index.html>`__
209
211
  - `Documentation <http://vispy.readthedocs.org>`__
210
212
 
211
213
  .. |Build Status| image:: https://github.com/vispy/vispy/workflows/CI/badge.svg
@@ -1,6 +1,6 @@
1
1
  vispy/__init__.py,sha256=Q-ECX_hCYaK0N0nHaVUQM6bNTUf4A3uGTxGcnlY2FFU,935
2
2
  vispy/conftest.py,sha256=SUNIUsn7o-cQa0mDMAhxoyeU_ENZjqO5B_xTJSNi-yQ,501
3
- vispy/version.py,sha256=IlAr5T7Yed-wpRPBQOdTSkG3tJiPqgLJanRACdE0WoY,429
3
+ vispy/version.py,sha256=KFGpPXFvW0paJWUPuXrMmn72yGv5mzyEp-ociMF1Hq4,429
4
4
  vispy/app/__init__.py,sha256=NDhvVlPpRUm5zkfs4L1VwbdE1Hhg7dGEkI28RYH2KTM,640
5
5
  vispy/app/_default_app.py,sha256=ACldZQfK7nl2zGInuJBsCm1sfFKZE-UFBgSeavG8gVo,2497
6
6
  vispy/app/_detect_eventloop.py,sha256=h7IMsSZXuIAz9M3bezB_gB2BQqcfiPcdpo5vAn8cd7Y,6622
@@ -53,9 +53,9 @@ vispy/ext/egl.py,sha256=K2vuBsbHUdomCNu74nXguoEms8Yi-FBBz9Q770esuYA,12535
53
53
  vispy/ext/fontconfig.py,sha256=DAGBvA1mN0RkKQ_QIRY1rWiPsT7HCwxpgmn4xtgvgyQ,4354
54
54
  vispy/ext/gdi32plus.py,sha256=VCwarTueydrPXCEqQmpJLJcp6afUUlpKJtNlVUMGBdE,6823
55
55
  vispy/ext/osmesa.py,sha256=hdRVI77OtZn-gbekZqWwmcCd7p2Ygol0e3KFCL0PHUw,3516
56
- vispy/geometry/__init__.py,sha256=RX_u729cTnISpRq32LHDmVGZnMdN6mkxyMbmstRwPqo,1092
56
+ vispy/geometry/__init__.py,sha256=hge__wDylvgQs54ojPcZuQ4gCG8X52qlQU3c4hWavfs,1103
57
57
  vispy/geometry/_triangulation_debugger.py,sha256=mOgnM6lGVH2PdwVflPyh7wNSABdABwEMDFk1Zs7y0Ak,5301
58
- vispy/geometry/calculations.py,sha256=zcQ0MpmhltCVX2vvByQfxOV5w9MFIzdHB1orJmJO3Aw,4379
58
+ vispy/geometry/calculations.py,sha256=6CiUB-mbNUoX7PYaWpmURrMK0WL5_LuPrUDPGMVTHDg,5150
59
59
  vispy/geometry/curves.py,sha256=aatBl8ArN1z_RumPHS4ZlCTXPUPOh8mGJ-jeKJ6LpXU,13544
60
60
  vispy/geometry/generation.py,sha256=eCJzZFJBz8dGwsPiN-Zzdq6vuP5JRFUhllPXayljMKg,21584
61
61
  vispy/geometry/isocurve.py,sha256=LNHyCpKDmtzITP1kvKQQvhmD__Pb25VYDn0fXbtJQTs,5971
@@ -66,21 +66,21 @@ vispy/geometry/parametric.py,sha256=1K2MoBwJJbWL46iqE3VM2LrgBqi08BW8r2qsMomlru4,
66
66
  vispy/geometry/polygon.py,sha256=VAgsEr4N7i1jhCUq7KBlm1juiueauNzh6a9S9WhSuxE,4338
67
67
  vispy/geometry/rect.py,sha256=m4rDnXT94nxggOGgdovgG1awqjzntaoMHlsa_xLuVTc,5894
68
68
  vispy/geometry/torusknot.py,sha256=iIQeIdkxVzEJPs6lx6a33C-Tlu5eFwozgA6FXbBvzA4,4404
69
- vispy/geometry/triangulation.py,sha256=TB3WRBO5pMWHVm1-6u93ISmqYqtuSGQuBLNRpVJRMic,32844
69
+ vispy/geometry/triangulation.py,sha256=N9ESaKS8MaoXAWpBPzIEmXEfAf8FiRiynJOMwQ6HvMY,32889
70
70
  vispy/geometry/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
71
  vispy/geometry/tests/test_calculations.py,sha256=vIskbDm-LJkNE7pQ1Ig8dq1QYjS4ka6mgsnuGNdlPZA,1061
72
72
  vispy/geometry/tests/test_generation.py,sha256=GXZE3U9W7fZ7wow3j2RXcNGDV9FytRvb6yRPErKF3wc,2166
73
73
  vispy/geometry/tests/test_meshdata.py,sha256=awAY1VmD81HHXIox-bGvSPRs71nCChOGIZCUwTk-pRg,4335
74
74
  vispy/geometry/tests/test_triangulation.py,sha256=IrwcANHEIyjeE-b-ZyeYm8K_JLyOfczLJ2AGRzEIIjw,13206
75
75
  vispy/gloo/__init__.py,sha256=zK8VDdY_d2sXDLe2ppCRkbXzqj9FrvKsuyU0SVa9OOU,2078
76
- vispy/gloo/buffer.py,sha256=0nE9huwI7l64KPxXgDIBVGIyt8FlpyA7beoALeAVaRQ,17251
76
+ vispy/gloo/buffer.py,sha256=aON7GEt0gU4K56b091TJ8MCvW05jaaYKg1fHDal04Tg,17300
77
77
  vispy/gloo/context.py,sha256=avyXSS9lpehlcjU1IG-3aaHEtVaU1peGEj_e54vvmSo,8912
78
78
  vispy/gloo/framebuffer.py,sha256=rG0fcM2NkED9jFF-GFk0vBDZfqriP63W8VSDr0gcVnM,9607
79
- vispy/gloo/glir.py,sha256=jWDtE-UyP3zwPUtMfmA-sBrHWeAC2sq009M6gcvDo5A,67989
79
+ vispy/gloo/glir.py,sha256=aBjezLai48LCQ6ibgjnvImcx1cVQ06L8yqoLoKnupfY,68263
80
80
  vispy/gloo/globject.py,sha256=eMkpFZrqJYSHx8A5j1lH-uczqZk-IX2ZYb77E-b1DOM,4013
81
81
  vispy/gloo/preprocessor.py,sha256=lMp2OxCyZDb5gyLUYK3qLMhStrmbyIgnVYnmniWr-wE,2358
82
82
  vispy/gloo/program.py,sha256=Uvo4TN6EViPqaDHhbDmOQjKYm-K6c_WHnFgPEvqTscc,22867
83
- vispy/gloo/texture.py,sha256=ULvBx-iBNo7z7yWZuhweL1yW-uPsuRTObC8URR03_GU,39467
83
+ vispy/gloo/texture.py,sha256=n21fLkSOAsDKTWbGXRfdzbbAGCu48V8SkqQn9an69rw,39502
84
84
  vispy/gloo/util.py,sha256=sC1OM-L0iY3ymJIU4eNOk_9hzDKZVNiKKHOBT_6m500,4548
85
85
  vispy/gloo/wrappers.py,sha256=Buyf8Xl8oPREzH9cn9Ez6ltQ6eaSKDfRrVmuA3GHys0,27222
86
86
  vispy/gloo/gl/__init__.py,sha256=U4QjPJQQNkGFPW2IrDE-KenH4xgcz5D3ULc-Mro39wM,8186
@@ -96,7 +96,7 @@ vispy/gloo/gl/glplus.py,sha256=Rrteeo4uuq-kksV71OWUi1N0Meo3_rtep_ereMoOMK0,9442
96
96
  vispy/gloo/gl/pyopengl2.py,sha256=QbGRBgQ49x0eiCUXB2bz18gM10pWmM6t62W8TE3deH8,2764
97
97
  vispy/gloo/gl/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  vispy/gloo/gl/tests/test_basics.py,sha256=QhMhaesWiOczpVoV8T3POzsltr3W7MiwnIMEV0evH7c,9505
99
- vispy/gloo/gl/tests/test_functionality.py,sha256=aCCxAUkbEVdHaFiRtEig-p4vsrjCyZ-sxggan-BjtW4,17906
99
+ vispy/gloo/gl/tests/test_functionality.py,sha256=2ERyZukhYX4oCN8mtGOJbpgAAc83How7mV_EcyNXrUg,17895
100
100
  vispy/gloo/gl/tests/test_names.py,sha256=b9ZzeDsj9ZlHVIKN8nmNi6GTtUXRF9bP_Qud_uOXgXk,11396
101
101
  vispy/gloo/gl/tests/test_use.py,sha256=kMjWov2cgJtMywy3VjtgFz6kMNQ0D--TkpAsNx3sFic,1909
102
102
  vispy/gloo/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -303,13 +303,13 @@ vispy/scene/widgets/widget.py,sha256=489bq_DqHGGwBxtxfCSPBkfGlFjT6Zp37DCygmnKsRI
303
303
  vispy/scene/widgets/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
304
304
  vispy/scene/widgets/tests/test_colorbar.py,sha256=f1FeuORX6gNAlpOM8UwTTjbP1Wj4T9cX3W3q61OWkOw,1409
305
305
  vispy/testing/__init__.py,sha256=u0CuG-XtGGsOUwzCgMf6o7iLo-DVRjqDGFek1BGVO3c,2488
306
- vispy/testing/_runners.py,sha256=eT_5HoZ7Yhl7I6h0MOvUQ9ObCP9u5vri_xhnGZQz1Xw,16349
306
+ vispy/testing/_runners.py,sha256=R60ItTgYZtKBalCifN2TGJfBV_MPftt6PweEWEMdED8,16519
307
307
  vispy/testing/_testing.py,sha256=NCih_PxhLPxsUkZ4qCSqtPsoh3WJj6_iTcavx15IizU,12718
308
308
  vispy/testing/image_tester.py,sha256=S1JgnR--pukPINuw-TbXz_vM8DU14_yOoF0J4V_9G04,18505
309
309
  vispy/testing/rendered_array_tester.py,sha256=wAC7XN-mOHrgDaQfpiYiF7kNAzHUNF7AgaVAyfd9BT0,2855
310
310
  vispy/testing/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
311
311
  vispy/testing/tests/test_testing.py,sha256=R2YGWKvj0nK7rWWDsp5BUj18k3eH2FmWgO7qejWns2E,805
312
- vispy/util/__init__.py,sha256=SDTPnd-LGr9pJuyYSZl-wXjC01BUcFQULQRPisGPp1Y,718
312
+ vispy/util/__init__.py,sha256=h8ZrWIgq3cVbM8rCWcF2SRWJN0RTwuC3vCa8y4age-I,1321
313
313
  vispy/util/bunch.py,sha256=1KtaQFKS2LWxza60u0WU2yRMqsI7TLiHnoS1mnnOIZc,445
314
314
  vispy/util/check_environment.py,sha256=Sjhh0-k3ZjF5FeTzpEMh1Yxjg-Q1OWHSq0UB0DkNcOM,1811
315
315
  vispy/util/config.py,sha256=w0s9g5B0zYibFJjg4eCmhyKnd39-FOMW2Nh3jL18DIs,15947
@@ -375,7 +375,7 @@ vispy/util/tests/test_run.py,sha256=m4MO_HygF_mk_aFK5zMp-5EDaxRcECJeRWc_x8Bv1ik,
375
375
  vispy/util/tests/test_transforms.py,sha256=LPX8AgB65LVO-sY2KxgBODzd_GmLDMwBpY4cjks17GA,1554
376
376
  vispy/util/tests/test_vispy.py,sha256=alCPm4Pc0pHyhLLrlflhmSVZWHNBjZ8LVx8QgOTWkb4,1542
377
377
  vispy/visuals/__init__.py,sha256=iCtogjsTpVVGd9GNFbpLHABetHoGEeTAJNP2MvXn-Jw,2278
378
- vispy/visuals/_scalable_textures.py,sha256=3ed0PAr4fuFzteC3KAWdPe9Ui6BP5IRqzxpvftbm1ho,20136
378
+ vispy/visuals/_scalable_textures.py,sha256=MF8LbK3ayS71_fgFQeN7TrEcbj9YaxVI8IIiDe65sxk,20199
379
379
  vispy/visuals/axis.py,sha256=D_kdZYJ5tzX1NOrywRn57iMiiOLJLbC59NW-dabFg30,24250
380
380
  vispy/visuals/border.py,sha256=of996lva-tNa-kRb544IWkzrcP-YVtHGEZPMjxgs2lI,7085
381
381
  vispy/visuals/box.py,sha256=2noQWXwjCPluy0YLzrugoeV-vKfSOSRabsAKrJVV_T4,2906
@@ -385,7 +385,7 @@ vispy/visuals/ellipse.py,sha256=uqsSxUL74i2aiwXGHzuwbGbdnjLeKAlhageSpjc0mdw,5236
385
385
  vispy/visuals/gridlines.py,sha256=6VtSG-mhbRfhyqZTJgXvB8tVoy_c1bW_fOq9RwJLkPw,3626
386
386
  vispy/visuals/gridmesh.py,sha256=M9CBguUnFl97F-kNtchdkhXStuKPIwfJT1idugxV9Xo,3444
387
387
  vispy/visuals/histogram.py,sha256=LaTASUMj1XJHxTIL9tSATuFPIUitIxyUDKqfpQZqVt0,2122
388
- vispy/visuals/image.py,sha256=fffw3ml_0GW2-XVtYoKbBh2kxtaKENdpEXEgXeMXEFY,27298
388
+ vispy/visuals/image.py,sha256=Pnukq08pdBd6DwwLVkEZBfItuCD5pdZ8seWscuotWwE,27357
389
389
  vispy/visuals/image_complex.py,sha256=GPzlC57zP6UjAVXQvW8kUFAfW27AqGLAzmPnMm43S6k,5403
390
390
  vispy/visuals/infinite_line.py,sha256=vOKsbwe0AoytKHynB4CM9RtHE7hWlhdse0j0KzlBX7o,6205
391
391
  vispy/visuals/instanced_mesh.py,sha256=3NqIPWGDdcP9gIh5BJWVX2fD6aithsTbEvT_qAk3C_g,5841
@@ -407,7 +407,7 @@ vispy/visuals/sphere.py,sha256=2JMsmoyjQvO6F7G-W1Bg2wAUQjyyeoTPWCPTQs04B1U,3171
407
407
  vispy/visuals/surface_plot.py,sha256=cM795YcJh49T9IzJqQlX8_nwbovgFJxPI8IofhnkEM0,7508
408
408
  vispy/visuals/tube.py,sha256=Attnn3Dtue0hTmONb3dDT0A56TAAkHoVumSMm26TyN8,6158
409
409
  vispy/visuals/visual.py,sha256=WnQQGr46ACEwiPnVDv_J0e3qEOSEkvZEdDwYEZpPvGM,30714
410
- vispy/visuals/volume.py,sha256=wZJYZGmX0_Qg24C5_mbWes7u7OiMpoM4R0IhdJfL81c,50464
410
+ vispy/visuals/volume.py,sha256=mzsrFQDFHqaiqFVhcriCrIlPrKB6imp9cLi-g0ACKHQ,52106
411
411
  vispy/visuals/windbarb.py,sha256=8mgIMTlzsp20EnY8_ZjX_jUAyciu1ErXY-Ta2Ec2FJo,9597
412
412
  vispy/visuals/xyz_axis.py,sha256=13Ni3QO8NYQsB5UzQXTZY7mF_TgQskzOZTPLKsHZIDw,991
413
413
  vispy/visuals/collections/__init__.py,sha256=tuanWMADPtUXijXdB7MNhHWbnfcKAcftdHaqX7PUfnM,1157
@@ -415,7 +415,7 @@ vispy/visuals/collections/agg_fast_path_collection.py,sha256=b1_b9yDOMdI_S6ylG4M
415
415
  vispy/visuals/collections/agg_path_collection.py,sha256=Gq2MDsFBL5cXr6bCFe1kuABd1L7jzVbh2OlWdOArLrg,6899
416
416
  vispy/visuals/collections/agg_point_collection.py,sha256=n8AnKxResRMXYjjN7UHVXL8vF_BVQXgG1-hwSg78jo4,1766
417
417
  vispy/visuals/collections/agg_segment_collection.py,sha256=S7A2yClTsMU7Gwzp8oFm_egUG0hctkQsI5kTP37yudM,4852
418
- vispy/visuals/collections/array_list.py,sha256=FsywsJisAfL1s_47ackeBgIAxyzcx5E71hKY7Ca_I-Y,14499
418
+ vispy/visuals/collections/array_list.py,sha256=gUV59OpLCk_KyMkXORiGUXX5xakg1-h9Vvpx5dF9bEw,14451
419
419
  vispy/visuals/collections/base_collection.py,sha256=LYv8yjycik7SoznF4OT3A5Qx2ldXB-FLmdglk46FosU,17221
420
420
  vispy/visuals/collections/collection.py,sha256=-Ptalveq5jFnkdLKQVveQdEBWs0BULWMKqRdsHUtpzU,9177
421
421
  vispy/visuals/collections/path_collection.py,sha256=8ChQe8cTucXsroOGpQQGWzVkXrz1_wrI24-J9TRBDv0,1015
@@ -499,8 +499,8 @@ vispy/visuals/tests/test_text.py,sha256=webfWtJcSgUkj3QBtZ4kggrs5OdkGZGb0byYc4mt
499
499
  vispy/visuals/tests/test_volume.py,sha256=mepaB3ssWl0s4gFU_yYTlhsQ1TCCkg_KtdTkLvR2Brs,18120
500
500
  vispy/visuals/tests/test_windbarb.py,sha256=cqEEcAnPMf29ZloL2fWJo2N04lrJgmQnD-Kt8mXWEQA,1135
501
501
  vispy/visuals/text/__init__.py,sha256=qWgGDKR-ezH4ZzzGKfs72S_zOauVDn5snJ5uHnYv6LE,364
502
- vispy/visuals/text/_sdf_cpu.cp311-win_amd64.pyd,sha256=gbQuvsMowXf7o-O_IfmKWfn3xczIW8fdJn4CGs3ii6M,154112
503
- vispy/visuals/text/_sdf_cpu.pyx,sha256=HiFaCXt0FgauyWD8WPpqESjp6mt9qx8n_s_CMRx8brc,3901
502
+ vispy/visuals/text/_sdf_cpu.cp311-win_amd64.pyd,sha256=N6NjbFvZk6BNNtCM7pErNTcC5Be9gHhBceK-f4bbmOQ,154624
503
+ vispy/visuals/text/_sdf_cpu.pyx,sha256=ymPErgiHN9jhBFuj_GXnChAzTeDbGM-MUQl3lIlzENE,3922
504
504
  vispy/visuals/text/_sdf_gpu.py,sha256=XW5nKivmvUx7tA8LebC7u7N37QQfBcMSUrdPvkG9JU8,10796
505
505
  vispy/visuals/text/text.py,sha256=hK8oSjF34PfczzBa5V7nmsR6uCfI-eqcR3zUB73YpjA,25928
506
506
  vispy/visuals/transforms/__init__.py,sha256=BNbVO0GWBoQZShivY_RDrRHcey-zOmQoF1A47hXgua4,1264
@@ -513,8 +513,8 @@ vispy/visuals/transforms/nonlinear.py,sha256=oiHDhqoM9E4rBGMmqZtVSJVspt1FgZORig6
513
513
  vispy/visuals/transforms/transform_system.py,sha256=dKRMid1Gm0bhh9K_v1RiC-xxbmQF61OHz_0Ur8GdMmU,14098
514
514
  vispy/visuals/transforms/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
515
515
  vispy/visuals/transforms/tests/test_transforms.py,sha256=QbAo0I3g5VkaQzzsZ03zktP-ge2JiXQeD2rqV6_LK7o,7114
516
- vispy-0.14.2.dist-info/LICENSE.txt,sha256=WDEavemgKeEMcbfp2qjU8y8yrxcTIF7ZDAxySta62p8,1810
517
- vispy-0.14.2.dist-info/METADATA,sha256=txeW6iS_cSPmccR-gYpiQVCfHg9YEQuVIZOAGx1_G5s,8546
518
- vispy-0.14.2.dist-info/WHEEL,sha256=nSybvzWlmdJnHiUQSY-d7V1ycwEVUTqXiTvr2eshg44,102
519
- vispy-0.14.2.dist-info/top_level.txt,sha256=mciStn1SI48jYwEhJXlrMJ3HaJ90XOr5ZGJ8YdFI674,6
520
- vispy-0.14.2.dist-info/RECORD,,
516
+ vispy-0.14.3.dist-info/LICENSE.txt,sha256=WDEavemgKeEMcbfp2qjU8y8yrxcTIF7ZDAxySta62p8,1810
517
+ vispy-0.14.3.dist-info/METADATA,sha256=m7BeNoyrpxev9r_EMKI_oe7mIsvNw1z_sA9xSWd_iRk,8614
518
+ vispy-0.14.3.dist-info/WHEEL,sha256=nSybvzWlmdJnHiUQSY-d7V1ycwEVUTqXiTvr2eshg44,102
519
+ vispy-0.14.3.dist-info/top_level.txt,sha256=mciStn1SI48jYwEhJXlrMJ3HaJ90XOr5ZGJ8YdFI674,6
520
+ vispy-0.14.3.dist-info/RECORD,,
File without changes