This commit is contained in:
2025-10-24 05:26:42 +02:00
parent b6196c1d46
commit 0ec8b77554
8 changed files with 250 additions and 213 deletions

View File

@ -14,151 +14,13 @@
# You should have received a copy of the GNU General Public License along with People's Video Editor.
# If not, see <https://www.gnu.org/licenses/>.
#TODO: split channels
from .node import Node
import itertools
from array import array
class Shape(Node):
_X, _Y, _U, _V, _Channels = itertools.count(0)
_Type = 'f'
_Size = array(_Type).itemsize * _Channels
def __init__(self, parent = None, children = None):
Node.__init__(self, parent, children)
class Vertex:
__slots__ = 'view'
Type = _Type
Channels = _Channels
Size = _Size
def __init__(self, view):
assert isinstance(view, memoryview)
self.view = view
def __del__(self):
del self.view
@property
def xy(self):
return self.view[_X], self.view[_Y]
@xy.setter
def xy(self, value):
self.view[_X], self.view[_Y] = value
@property
def x(self):
return self.view[_X]
@x.setter
def x(self, value):
self.view[_X] = value
@property
def y(self):
return self.view[_Y]
@y.setter
def y(self, value):
self.view[_Y] = value
@property
def uv(self):
return self.view[_U], self.view[_V]
@uv.setter
def uv(self, value):
self.view[_U], self.view[_V] = value
@property
def u(self):
return self.view[_U]
@u.setter
def u(self, value):
self.view[_U] = value
@property
def v(self):
return self.view[_V]
@v.setter
def v(self, value):
self.view[_V] = value
class Shape:
__slots__ = '_array', '_view', '_size', '_cutouts'
@classmethod
def rectangle(cls, geometry):
shape = cls(size = 4)
tl = Vertex(shape[0])
tl.xy = tl.uv = (0.0, 0.0)
tr = Vertex(shape[1])
tr.xy = tr.uv = (geometry._width, 0.0)
br = Vertex(shape[2])
br.xy = br.uv = (geometry._width, geometry._height)
bl = Vertex(shape[3])
bl.xy = bl.uv = (0.0, geometry._height)
return shape
def __init__(self, size = 0, cutouts = None):
self._array = array(_Type, bytes(size * _Size))
self._view = memoryview(self._array)
self._size = size
self._cutouts = list(cutouts) if cutouts else None
def __del__(self):
del self._view
del self._array
del self._cutouts
def __len__(self):
return self._size
def __getitem__(self, index):
index *= _Channels
return self._view[index:(index + _Channels)]
@property
def size(self):
return self._size
@property
def view(self):
return self._view
@property
def cutouts(self):
return list(self._cutouts) if self._cutouts else []
@cutouts.setter
def cutouts(self, value):
self._cutouts = list(value) if value else None
def append(self, count = 1):
index = self._size
self._view.release()
self._array.frombytes(bytes(count * _Size))
self._view = memoryview(self._array)
self._size += count
return index
def insert(self, index, count = 1):
index *= _Channels
self._view.release()
self._array[index:index] = array(_Type, bytes(count * _Size))
self._view = memoryview(self._array)
self._size += count
def remove(self, index, count = 1):
index *= _Channels
self._view.release()
del self._array[index:(index + count * _Channels)]
self._view = memoryview(self._array)
self._size -= count
def clear(self):
self._view.release()
self._array = array(_Type)
self._view = memoryview(self._array)
self._size = 0
def rebuild(self):
#TODO
raise NotImplementedError