Browse Source

Improved DoubleBuffer

pull/6/head
Eugenio Parodi 5 years ago
parent
commit
8e937d5a8d
  1. 23
      TermTk/TTkCore/canvas.py
  2. 1
      TermTk/TTkCore/cfg.py
  3. 27
      TermTk/TTkCore/helper.py

23
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

1
TermTk/TTkCore/cfg.py

@ -30,6 +30,7 @@ class TTkCfg:
color_depth: int = TTkK.DEP_24
maxFps = 35
doubleBuffer = True
scrollDelta = 5
theme = None

27
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:

Loading…
Cancel
Save