Commit c6eed957 authored by Carlos Alves's avatar Carlos Alves Committed by Tomaz Canabrava
Browse files

Fix _history limits and increase performance

There was a bug on _history limits, now it is fixed.
Increase the "_screenLines to _history when needed" performance
parent 51280aa4
......@@ -380,7 +380,6 @@ void Screen::resizeImage(int new_lines, int new_columns)
// First join everything.
int currentPos = 0;
int count_needed_lines = 0;
while (currentPos < _cuY && currentPos < _screenLines.count() - 1) {
// if the line have the 'LINE_WRAPPED' property, concat with the next line and remove it.
if ((_lineProperties[currentPos] & LINE_WRAPPED) != 0) {
......@@ -390,27 +389,8 @@ void Screen::resizeImage(int new_lines, int new_columns)
_cuY--;
continue;
}
count_needed_lines += _screenLines[currentPos].count() / (new_columns + 1);
currentPos++;
}
count_needed_lines += _screenLines[currentPos].count() / (new_columns + 1);
// If it will need more lines than new_lines have, send lines to _history
count_needed_lines += _cuY;
if (count_needed_lines > new_lines - 1) {
_lineProperties.resize(_lines + 1);
for (int i = _screenLines.count(); (i > 0) && (i < new_lines + 1); i++) {
_lineProperties[i] = LINE_DEFAULT;
}
_screenLines.resize(_lines + 1);
// attempt to preserve focus and _lines
_bottomMargin = _lines - 1; //FIXME: margin lost
for (int i = 0; i < count_needed_lines - (new_lines - 1); i++) {
addHistLine();
scrollUp(0, 1);
_cuY--;
}
}
// Then move the data to lines below.
currentPos = 0;
......@@ -429,15 +409,23 @@ void Screen::resizeImage(int new_lines, int new_columns)
}
currentPos += 1;
}
// Check if it need to move from _screenLine to _history
while (_cuY > new_lines - 1) {
addHistLine();
_screenLines.pop_front();
_lineProperties.remove(0);
_cuY--;
}
_lineProperties.resize(new_lines + 1);
_screenLines.resize(new_lines + 1);
// Check if _history need to change
if (new_columns != _columns && _history->getLines()) {
// Join next line _history from _screenLine
// Join next line from _screenLine to _history
while (_history->isWrappedLine(_history->getLines() - 1)) {
addHistLine();
scrollUp(0, 1);
_screenLines.pop_front();
_lineProperties.remove(0);
_cuY--;
}
currentPos = 0;
......@@ -457,6 +445,7 @@ void Screen::resizeImage(int new_lines, int new_columns)
_history->setCellsAt(currentPos, new_line, curr_linelen + next_linelen);
_history->setLineAt(currentPos, new_line_property);
_history->removeCells(currentPos + 1);
continue;
}
currentPos++;
}
......@@ -473,8 +462,13 @@ void Screen::resizeImage(int new_lines, int new_columns)
_history->setCellsAt(currentPos, curr_line, new_columns);
_history->setLineAt(currentPos, true);
if (currentPos < _history->getMaxLines() - 1) {
_history->insertCells(currentPos + 1, curr_line + new_columns, curr_linelen - new_columns);
_history->setLineAt(currentPos + 1, curr_line_property);
} else {
_history->addCells(curr_line + new_columns, curr_linelen - new_columns);
_history->addLine(curr_line_property);
}
}
currentPos++;
}
......@@ -484,11 +478,12 @@ void Screen::resizeImage(int new_lines, int new_columns)
while (_cuY < old_cuY && _history->getLines()) {
int histPos = _history->getLines() - 1;
int histLineLen = _history->getLineLen(histPos);
int isWrapped = _history->isWrappedLine(histPos)? LINE_WRAPPED : LINE_DEFAULT;
histLine.resize(histLineLen);
_history->getCells(histPos, 0, histLineLen, histLine.data());
_screenLines.prepend(histLine);
_lineProperties.insert(0, _history->isWrappedLine(histPos)? LINE_WRAPPED : LINE_DEFAULT);
_screenLines.insert(0, histLine);
_lineProperties.insert(0, isWrapped);
_history->removeCells(histPos);
_cuY++;
}
......@@ -1568,7 +1563,6 @@ void Screen::addHistLine()
int newHistLines = _history->getLines();
if (hasScroll()) {
// Check if _history have 'new line' property and join lines before adding a new one to history
if (oldHistLines > 0 && _history->isWrappedLine(oldHistLines - 1)) {
int hist_linelen = _history->getLineLen(oldHistLines - 1);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment