From 8e937d5a8d920dba42d6ef7df65ff4d0d707a723 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Mon, 15 Mar 2021 10:29:01 +0000 Subject: [PATCH] Improved DoubleBuffer --- TermTk/TTkCore/canvas.py | 23 ++++++++++++++++++++--- TermTk/TTkCore/cfg.py | 1 + TermTk/TTkCore/helper.py | 27 +++++---------------------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/TermTk/TTkCore/canvas.py b/TermTk/TTkCore/canvas.py index 3fd16eaa..1b41a1d3 100644 --- a/TermTk/TTkCore/canvas.py +++ b/TermTk/TTkCore/canvas.py @@ -49,10 +49,17 @@ class TTkCanvas: in w = the width of the new canvas in h = the height of the new canvas ''' - __slots__ = ('_widget', '_width', '_height', '_newWidth', '_newHeight','_theme', '_data', '_colors', '_visible') + __slots__ = ( + '_widget', + '_width', '_height', '_newWidth', '_newHeight', + '_theme', + '_data', '_colors', + '_bufferedData', '_bufferedColors', + '_visible', '_doubleBuffer') def __init__(self, *args, **kwargs): self._widget = kwargs.get('widget', None) self._visible = True + self._doubleBuffer = False self._width = 0 self._height = 0 self._data = [[0]] @@ -65,6 +72,10 @@ class TTkCanvas: def getWidget(self): return self._widget + def enableDoubleBuffer(self): + self._doubleBuffer = True + self._bufferedData, self._bufferedColors = self.copy() + def updateSize(self): if not self._visible: return w,h = self._newWidth, self._newHeight @@ -77,6 +88,8 @@ class TTkCanvas: self._colors[i] = [TTkColor.RST]*w self._width = w self._height = h + if self._doubleBuffer: + self._bufferedData, self._bufferedColors = self.copy() def resize(self, w, h): self._newWidth = w @@ -90,7 +103,7 @@ class TTkCanvas: for ix in range(x,x+w): self._data[iy][ix] = ' ' self._colors[iy][ix] = TTkColor.RST - + def copy(self): w,h = self._width, self._height retData = [[]]*h @@ -520,8 +533,9 @@ class TTkCanvas: ansi+=ch lbt.Term.push(ansi) - def pushToTerminalBuffered(self, x, y, w, h, oldData, oldColors): + def pushToTerminalBuffered(self, x, y, w, h): # TTkLog.debug("pushToTerminal") + oldData, oldColors = self._bufferedData, self._bufferedColors lastcolor = TTkColor.RST empty = True for y in range(0, self._height): @@ -545,3 +559,6 @@ class TTkCanvas: if not empty: lbt.Term.push(ansi) empty=True + # Switch the buffer + self._bufferedData, self._bufferedColors = self._data, self._colors + self._data, self._colors = oldData, oldColors diff --git a/TermTk/TTkCore/cfg.py b/TermTk/TTkCore/cfg.py index ca0184b2..dfe0db75 100644 --- a/TermTk/TTkCore/cfg.py +++ b/TermTk/TTkCore/cfg.py @@ -30,6 +30,7 @@ class TTkCfg: color_depth: int = TTkK.DEP_24 maxFps = 35 + doubleBuffer = True scrollDelta = 5 theme = None diff --git a/TermTk/TTkCore/helper.py b/TermTk/TTkCore/helper.py index b917a6ca..f8d20c9b 100644 --- a/TermTk/TTkCore/helper.py +++ b/TermTk/TTkCore/helper.py @@ -86,6 +86,7 @@ class TTkHelper: @staticmethod def registerRootCanvas(canvas): TTkHelper._rootCanvas = canvas + TTkHelper._rootCanvas.enableDoubleBuffer() TTkHelper._updateBuffer = [] TTkHelper._updateWidget = [] @@ -126,7 +127,6 @@ class TTkHelper: if TTkHelper._rootCanvas is None: return TTkHelper._rootCanvas.updateSize() - bufferData, bufferColors = TTkHelper._rootCanvas.copy() # Build a list of buffers to be repainted updateBuffers = TTkHelper._updateBuffer.copy() @@ -182,32 +182,15 @@ class TTkHelper: if pushToTerminal: if TTkHelper._cursor: lbt.Term.hideCursor() - # TTkHelper._rootCanvas.pushToTerminal(0, 0, TTkGlbl.term_w, TTkGlbl.term_h) - TTkHelper._rootCanvas.pushToTerminalBuffered(0, 0, TTkGlbl.term_w, TTkGlbl.term_h, bufferData, bufferColors) - # TTkHelper.pushToTerminal(TTkHelper._rootCanvas, bufferData, bufferColors ) + if TTkCfg.doubleBuffer: + TTkHelper._rootCanvas.pushToTerminalBuffered(0, 0, TTkGlbl.term_w, TTkGlbl.term_h) + else: + TTkHelper._rootCanvas.pushToTerminal(0, 0, TTkGlbl.term_w, TTkGlbl.term_h) if TTkHelper._cursor: x,y = TTkHelper._cursorPos lbt.Term.push(lbt.Mv.to(y+1,x+1)) lbt.Term.showCursor(TTkHelper._cursorType) - @staticmethod - def pushToTerminal(canvas, bufferData, bufferColors): - from TermTk.TTkCore.color import TTkColor - # TTkLog.debug("pushToTerminal") - data = canvas._data - colors = canvas._colors - lastcolor = TTkColor.RST - for y in range(0, self._height): - ansi = TTkColor.RST+lbt.Mv.t(y+1,1) - for x in range(0, self._width): - ch = data[y][x] - color = colors[y][x] - if color != lastcolor: - ansi += color-lastcolor - lastcolor = color - ansi+=ch - lbt.Term.push(ansi) - @staticmethod def widgetDepth(widget) -> int: if widget is None: