mirror of
https://github.com/rizinorg/cutter.git
synced 2024-12-19 03:16:10 +00:00
Improved big blocks rendering performance (#1166)
This commit is contained in:
parent
5365027f7c
commit
6ad7900a3f
@ -131,7 +131,8 @@ void DisassemblerGraphView::connectSeekChanged(bool disconn)
|
|||||||
disconnect(seekable, &CutterSeekable::seekableSeekChanged, this,
|
disconnect(seekable, &CutterSeekable::seekableSeekChanged, this,
|
||||||
&DisassemblerGraphView::onSeekChanged);
|
&DisassemblerGraphView::onSeekChanged);
|
||||||
} else {
|
} else {
|
||||||
connect(seekable, &CutterSeekable::seekableSeekChanged, this, &DisassemblerGraphView::onSeekChanged);
|
connect(seekable, &CutterSeekable::seekableSeekChanged, this,
|
||||||
|
&DisassemblerGraphView::onSeekChanged);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -521,13 +522,29 @@ void DisassemblerGraphView::drawBlock(QPainter &p, GraphView::GraphBlock &block)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qreal render_offset_y = -verticalScrollBar()->value() * current_scale + unscrolled_render_offset_y;
|
||||||
|
qreal render_height = viewport()->size().height();
|
||||||
|
|
||||||
// Render node text
|
// Render node text
|
||||||
auto x = block.x + (2 * charWidth);
|
auto x = block.x + (2 * charWidth);
|
||||||
int y = static_cast<int>(block.y + (2 * charWidth));
|
int y = static_cast<int>(block.y + (2 * charWidth));
|
||||||
for (auto &line : db.header_text.lines) {
|
for (auto &line : db.header_text.lines) {
|
||||||
RichTextPainter::paintRichText(&p, static_cast<int>(x), y, block.width, charHeight, 0, line, mFontMetrics);
|
qreal lineYRender = y * current_scale;
|
||||||
|
qreal lineHeightRender = charHeight * current_scale;
|
||||||
|
|
||||||
|
// Check if line does NOT intersects with view area
|
||||||
|
if (-render_offset_y >= lineYRender + lineHeightRender
|
||||||
|
|| -render_offset_y + render_height <= lineYRender) {
|
||||||
|
// Skip if it does not intersects
|
||||||
|
y += charHeight;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
RichTextPainter::paintRichText(&p, static_cast<int>(x), y, block.width, charHeight, 0, line,
|
||||||
|
mFontMetrics);
|
||||||
y += charHeight;
|
y += charHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const Instr &instr : db.instrs) {
|
for (const Instr &instr : db.instrs) {
|
||||||
if (Core()->isBreakpoint(breakpoints, instr.addr)) {
|
if (Core()->isBreakpoint(breakpoints, instr.addr)) {
|
||||||
p.fillRect(QRect(static_cast<int>(block.x + charWidth), y,
|
p.fillRect(QRect(static_cast<int>(block.x + charWidth), y,
|
||||||
@ -540,6 +557,17 @@ void DisassemblerGraphView::drawBlock(QPainter &p, GraphView::GraphBlock &block)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (auto &line : instr.text.lines) {
|
for (auto &line : instr.text.lines) {
|
||||||
|
qreal lineYRender = y * current_scale;
|
||||||
|
qreal lineHeightRender = charHeight * current_scale;
|
||||||
|
|
||||||
|
// Check if line does NOT intersects with view area
|
||||||
|
if (-render_offset_y >= lineYRender + lineHeightRender
|
||||||
|
|| -render_offset_y + render_height <= lineYRender) {
|
||||||
|
// Skip if it does not intersects
|
||||||
|
y += charHeight;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
int rectSize = qRound(charWidth);
|
int rectSize = qRound(charWidth);
|
||||||
if (rectSize % 2) {
|
if (rectSize % 2) {
|
||||||
rectSize++;
|
rectSize++;
|
||||||
|
Loading…
Reference in New Issue
Block a user