From 103decedd602c1c75a5908fb7076332d25ade65b Mon Sep 17 00:00:00 2001 From: karliss Date: Wed, 3 Apr 2019 11:55:39 +0300 Subject: [PATCH] Take pixel ratio into account for graph cache. (#1405) * Take pixel ratio into account for graph cache. --- src/Cutter.pro | 6 ++++-- src/CutterApplication.cpp | 1 + src/common/HighDpiPixmap.cpp | 23 +++++++++++++++++++++++ src/common/HighDpiPixmap.h | 11 +++++++++++ src/dialogs/NewFileDialog.cpp | 3 ++- src/widgets/GraphView.cpp | 12 +++++++----- 6 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 src/common/HighDpiPixmap.cpp create mode 100644 src/common/HighDpiPixmap.h diff --git a/src/Cutter.pro b/src/Cutter.pro index 0704c549..84216db6 100644 --- a/src/Cutter.pro +++ b/src/Cutter.pro @@ -311,7 +311,8 @@ SOURCES += \ common/BasicBlockHighlighter.cpp \ dialogs/LinkTypeDialog.cpp \ common/UpdateWorker.cpp \ - widgets/MemoryDockWidget.cpp + widgets/MemoryDockWidget.cpp \ + common/HighDpiPixmap.cpp HEADERS += \ core/Cutter.h \ @@ -428,7 +429,8 @@ HEADERS += \ common/BasicBlockHighlighter.h \ common/UpdateWorker.h \ dialogs/LinkTypeDialog.h \ - widgets/MemoryDockWidget.h + widgets/MemoryDockWidget.h \ + common/HighDpiPixmap.h FORMS += \ dialogs/AboutDialog.ui \ diff --git a/src/CutterApplication.cpp b/src/CutterApplication.cpp index abd24626..d435ce96 100644 --- a/src/CutterApplication.cpp +++ b/src/CutterApplication.cpp @@ -29,6 +29,7 @@ CutterApplication::CutterApplication(int &argc, char **argv) : QApplication(argc setApplicationVersion(CUTTER_VERSION_FULL); setWindowIcon(QIcon(":/img/cutter.svg")); setAttribute(Qt::AA_DontShowIconsInMenus); + setAttribute(Qt::AA_UseHighDpiPixmaps); setLayoutDirection(Qt::LeftToRight); // WARN!!! Put initialization code below this line. Code above this line is mandatory to be run First diff --git a/src/common/HighDpiPixmap.cpp b/src/common/HighDpiPixmap.cpp new file mode 100644 index 00000000..c21cd2dd --- /dev/null +++ b/src/common/HighDpiPixmap.cpp @@ -0,0 +1,23 @@ +#include "common/HighDpiPixmap.h" + +#include +#include + +static qreal GetDevicePixelRatio(qreal devicePixelRatio) +{ + if (devicePixelRatio > 0) { + return devicePixelRatio; + } + qreal ratio = 1; + for (auto screen : QGuiApplication::screens()) { + ratio = std::max(ratio, screen->devicePixelRatio()); + } + return ratio; +} + +HighDpiPixmap::HighDpiPixmap(int width, int height, qreal devicePixelRatio) + : QPixmap(int(width * GetDevicePixelRatio(devicePixelRatio)), + int(height * GetDevicePixelRatio(devicePixelRatio))) +{ + setDevicePixelRatio(GetDevicePixelRatio(devicePixelRatio)); +} diff --git a/src/common/HighDpiPixmap.h b/src/common/HighDpiPixmap.h new file mode 100644 index 00000000..b46593a9 --- /dev/null +++ b/src/common/HighDpiPixmap.h @@ -0,0 +1,11 @@ +#ifndef HIGHDPIPIXMAP_H +#define HIGHDPIPIXMAP_H + +#include +class HighDpiPixmap : public QPixmap +{ +public: + HighDpiPixmap(int width, int height, qreal devicePixelRatio = -1); +}; + +#endif // HIGHDPIPIXMAP_H diff --git a/src/dialogs/NewFileDialog.cpp b/src/dialogs/NewFileDialog.cpp index 1ab8995b..9a7e2c42 100644 --- a/src/dialogs/NewFileDialog.cpp +++ b/src/dialogs/NewFileDialog.cpp @@ -4,6 +4,7 @@ #include "dialogs/AboutDialog.h" #include "ui_NewfileDialog.h" #include "common/Helpers.h" +#include "common/HighDpiPixmap.h" #include #include @@ -33,7 +34,7 @@ static QIcon getIconFor(const QString &str, int pos) int w = 64; int h = 64; - QPixmap pixmap(w, h); + HighDpiPixmap pixmap(w, h); pixmap.fill(Qt::transparent); QPainter pixPaint(&pixmap); diff --git a/src/widgets/GraphView.cpp b/src/widgets/GraphView.cpp index 9b1d9cb0..5e089b69 100644 --- a/src/widgets/GraphView.cpp +++ b/src/widgets/GraphView.cpp @@ -381,11 +381,13 @@ QPolygonF GraphView::recalculatePolygon(QPolygonF polygon) void GraphView::paintEvent(QPaintEvent *event) { Q_UNUSED(event); - if (useCache) { + qreal dpr = devicePixelRatioF(); + if (useCache && qFuzzyCompare(dpr, pixmap.devicePixelRatioF())) { drawGraph(); return; } - pixmap = QPixmap(viewport()->width(), viewport()->height()); + pixmap = QPixmap(int(viewport()->width() * dpr), int(viewport()->height() * dpr)); + pixmap.setDevicePixelRatio(dpr); QPainter p(&pixmap); p.setRenderHint(QPainter::Antialiasing); @@ -393,9 +395,8 @@ void GraphView::paintEvent(QPaintEvent *event) int render_width = viewport()->width(); int render_height = viewport()->height(); - QRect viewportRect(viewport()->rect().topLeft(), viewport()->rect().bottomRight() - QPoint(1, 1)); p.setBrush(backgroundColor); - p.drawRect(viewportRect); + p.drawRect(viewport()->rect()); p.setBrush(Qt::black); p.scale(current_scale, current_scale); @@ -448,7 +449,8 @@ void GraphView::paintEvent(QPaintEvent *event) void GraphView::drawGraph() { QRectF target(0.0, 0.0, viewport()->width(), viewport()->height()); - QRectF source(0.0, 0.0, viewport()->width(), viewport()->height()); + QRectF source(0.0, 0.0, viewport()->width() * pixmap.devicePixelRatioF(), + viewport()->height() * pixmap.devicePixelRatioF()); QPainter p(viewport()); p.drawPixmap(target, pixmap, source); }