Tighten up dirty_cells()

This commit is contained in:
Kovid Goyal 2016-10-20 14:21:25 +05:30
parent ca30bba165
commit dd767bdf91
2 changed files with 7 additions and 20 deletions

View File

@ -3,6 +3,7 @@
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net> # License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
from functools import lru_cache from functools import lru_cache
from itertools import product
from typing import Tuple, Iterator, Sequence from typing import Tuple, Iterator, Sequence
from PyQt5.QtCore import pyqtSignal, QTimer, QRect, Qt from PyQt5.QtCore import pyqtSignal, QTimer, QRect, Qt
@ -11,7 +12,7 @@ from PyQt5.QtWidgets import QWidget
from .config import build_ansi_color_tables, Options, fg_color_table, bg_color_table from .config import build_ansi_color_tables, Options, fg_color_table, bg_color_table
from .data_types import Line, Cursor, HAS_BG_MASK, COL_SHIFT, COL_MASK, as_color from .data_types import Line, Cursor, HAS_BG_MASK, COL_SHIFT, COL_MASK, as_color
from .utils import set_current_font_metrics, first_intersecting_bucket, last_intersecting_bucket from .utils import set_current_font_metrics
from .tracker import ChangeTracker from .tracker import ChangeTracker
from .screen import wrap_cursor_position from .screen import wrap_cursor_position
from .keys import key_event_to_data from .keys import key_event_to_data
@ -151,14 +152,11 @@ class TerminalWidget(QWidget):
self.pending_update = QRegion() self.pending_update = QRegion()
def dirty_cells(self, region: QRegion) -> Iterator[Tuple[int]]: def dirty_cells(self, region: QRegion) -> Iterator[Tuple[int]]:
for rect in region.rects(): lines = (l for l in range(self.lines_per_screen) if region.intersects(QRect(
left, top, w, h = rect.getRect() self.hmargin, self.line_positions[l], self.cell_width * self.cells_per_line, self.cell_height)))
right, bottom = left + w, top + h cells = (c for c in range(self.cells_per_line) if region.intersects(QRect(
for lnum in range(min(0, first_intersecting_bucket(self.cell_height, top, self.vmargin)), self.cell_positions[c], self.vmargin, self.cell_width, self.cell_height * self.lines_per_screen)))
max(self.lines_per_screen - 1, last_intersecting_bucket(self.cell_height, bottom, self.vmargin))): yield from product(lines, cells)
for cnum in range(min(0, first_intersecting_bucket(self.cell_width, left, self.hmargin)),
max(self.cells_per_line - 1, last_intersecting_bucket(self.cell_width, right, self.hmargin))):
yield lnum, cnum
def paintEvent(self, ev): def paintEvent(self, ev):
if self.size() != self.layout_size: if self.size() != self.layout_size:

View File

@ -3,7 +3,6 @@
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net> # License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
import os import os
import math
import sys import sys
import termios import termios
import struct import struct
@ -113,13 +112,3 @@ def timeit(name, do_timing=False):
yield yield
if do_timing: if do_timing:
print('Time for {}: {}'.format(name, monotonic() - st)) print('Time for {}: {}'.format(name, monotonic() - st))
def first_intersecting_bucket(sz, boundary, offset=0):
' Solve the eqn: offset + (n + 1) * sz >= boundary '
return int(math.ceil((boundary - offset) / sz)) - 1
def last_intersecting_bucket(sz, boundary, offset):
' Solve the eqn: offset + n * sz <= boundary '
return int(math.floor((boundary - offset) / sz))