You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.8 KiB
61 lines
1.8 KiB
/* |
|
SPDX-FileCopyrightText: 2007-2008 Robert Knight <robertknight@gmail.com> |
|
SPDX-FileCopyrightText: 2020 Tomaz Canabrava <tcanabrava@gmail.com> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
#include "TerminalImageFilterChain.h" |
|
#include "profile/Profile.h" |
|
|
|
#include <QTextStream> |
|
|
|
#include "../decoders/PlainTextDecoder.h" |
|
|
|
#include "terminalDisplay/TerminalDisplay.h" |
|
|
|
using namespace Konsole; |
|
|
|
TerminalImageFilterChain::TerminalImageFilterChain(TerminalDisplay *terminalDisplay) |
|
: FilterChain(terminalDisplay) |
|
, _buffer(nullptr) |
|
, _linePositions(nullptr) |
|
{ |
|
} |
|
|
|
TerminalImageFilterChain::~TerminalImageFilterChain() = default; |
|
|
|
void TerminalImageFilterChain::setImage(const Character *const image, int lines, int columns, const QVector<LineProperty> &lineProperties) |
|
{ |
|
if (_filters.empty()) { |
|
return; |
|
} |
|
|
|
// reset all filters and hotspots |
|
reset(); |
|
|
|
PlainTextDecoder decoder; |
|
decoder.setLeadingWhitespace(true); |
|
decoder.setTrailingWhitespace(true); |
|
|
|
// setup new shared buffers for the filters to process on |
|
_buffer.reset(new QString()); |
|
_linePositions.reset(new QList<int>()); |
|
|
|
setBuffer(_buffer.get(), _linePositions.get()); |
|
|
|
QTextStream lineStream(_buffer.get()); |
|
decoder.begin(&lineStream); |
|
|
|
for (int i = 0; i < lines; i++) { |
|
_linePositions->append(_buffer->length()); |
|
decoder.decodeLine(image + i * columns, columns, LINE_DEFAULT); |
|
|
|
// pretend that each non-wrapped line ends with a newline character. |
|
// this prevents a link that occurs at the end of one line |
|
// being treated as part of a link that occurs at the start of the next line |
|
if ((lineProperties.value(i, LINE_DEFAULT) & LINE_WRAPPED) == 0) { |
|
lineStream << QLatin1Char('\n'); |
|
} |
|
} |
|
decoder.end(); |
|
}
|
|
|