Use buffer mapping for the selection buffer

This commit is contained in:
Kovid Goyal 2017-09-09 13:01:26 +05:30
parent 2611678855
commit 5c1747b2c8
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 5 additions and 5 deletions

View File

@ -5,7 +5,7 @@
import re import re
import sys import sys
from collections import namedtuple from collections import namedtuple
from ctypes import addressof, sizeof from ctypes import sizeof
from enum import Enum from enum import Enum
from .config import build_ansi_color_table, defaults from .config import build_ansi_color_table, defaults
@ -194,7 +194,7 @@ class CharGrid:
def resize(self, window_geometry): def resize(self, window_geometry):
self.update_position(window_geometry) self.update_position(window_geometry)
self.data_buffer_size = self.screen_geometry.ynum * self.screen_geometry.xnum * CELL['size'] self.data_buffer_size = self.screen_geometry.ynum * self.screen_geometry.xnum * CELL['size']
self.selection_buf = (GLfloat * (self.screen_geometry.ynum * self.screen_geometry.xnum))() self.selection_buffer_size = self.screen_geometry.ynum * self.screen_geometry.xnum * sizeof(GLfloat)
self.current_selection.clear() self.current_selection.clear()
def change_colors(self, changes): def change_colors(self, changes):
@ -363,8 +363,8 @@ class CharGrid:
start, end = sel = self.current_selection.limits(self.scrolled_by, self.screen.lines, self.screen.columns) start, end = sel = self.current_selection.limits(self.scrolled_by, self.screen.lines, self.screen.columns)
selection_changed = sel != self.last_rendered_selection selection_changed = sel != self.last_rendered_selection
if selection_changed: if selection_changed:
self.screen.apply_selection(addressof(self.selection_buf), start[0], start[1], end[0], end[1], len(self.selection_buf)) with cell_program.mapped_vertex_data(self.vao_id, self.selection_buffer_size, bufnum=1) as address:
cell_program.send_vertex_data(self.vao_id, self.selection_buf, bufnum=1) self.screen.apply_selection(address, start[0], start[1], end[0], end[1], self.selection_buffer_size)
self.last_rendered_selection = sel self.last_rendered_selection = sel
return sg return sg

View File

@ -1217,7 +1217,7 @@ apply_selection(Screen *self, PyObject *args) {
if (!PyArg_ParseTuple(args, "O!IIIII", &PyLong_Type, &l, &startx, &starty, &endx, &endy, &size)) return NULL; if (!PyArg_ParseTuple(args, "O!IIIII", &PyLong_Type, &l, &startx, &starty, &endx, &endy, &size)) return NULL;
if (startx >= self->columns || starty >= self->lines || endx >= self->columns || endy >= self->lines) { Py_RETURN_NONE; } if (startx >= self->columns || starty >= self->lines || endx >= self->columns || endy >= self->lines) { Py_RETURN_NONE; }
float *data = PyLong_AsVoidPtr(l); float *data = PyLong_AsVoidPtr(l);
memset(data, 0, size * sizeof(float)); memset(data, 0, size);
end = endy * self->columns + endx; end = endy * self->columns + endx;
i = starty * self->columns + startx; i = starty * self->columns + startx;
if (i != end) { for(; i <= end; i++) data[i] = 1; } if (i != end) { for(; i <= end; i++) data[i] = 1; }