From e8875faf834229c4c3182aecc2ce5255c31bfc2c Mon Sep 17 00:00:00 2001 From: Jim Broadus Date: Wed, 7 Apr 2021 13:05:37 -0700 Subject: [PATCH] visualisations: Properly scale projectM view In version 5.6, Qt introduced an automatic scaling feature for high DPI displays. Since projectM is not part of the Qt framework, it's necessary to convert coordinates when specifying view size. Reference: https://doc.qt.io/qt-5/highdpi.html --- src/visualisations/projectmvisualisation.cpp | 19 ++++++++++++++----- src/visualisations/projectmvisualisation.h | 10 +++++++++- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/visualisations/projectmvisualisation.cpp b/src/visualisations/projectmvisualisation.cpp index 48d44de53..993894520 100644 --- a/src/visualisations/projectmvisualisation.cpp +++ b/src/visualisations/projectmvisualisation.cpp @@ -48,12 +48,14 @@ #include #endif -ProjectMVisualisation::ProjectMVisualisation(QObject* parent) - : QGraphicsScene(parent), +ProjectMVisualisation::ProjectMVisualisation(VisualisationContainer* container) + : QGraphicsScene(container), preset_model_(nullptr), mode_(Random), duration_(15), - texture_size_(512) { + texture_size_(512), + pixel_ratio_(container->devicePixelRatio()), + container_(container) { connect(this, SIGNAL(sceneRectChanged(QRectF)), SLOT(SceneRectChanged(QRectF))); @@ -143,14 +145,21 @@ void ProjectMVisualisation::drawBackground(QPainter* p, const QRectF&) { InitProjectM(); } - projectm_->projectM_resetGL(sceneRect().width(), sceneRect().height()); + projectm_->projectM_resetGL(sceneRect().width() * pixel_ratio_, + sceneRect().height() * pixel_ratio_); projectm_->renderFrame(); p->endNativePainting(); } void ProjectMVisualisation::SceneRectChanged(const QRectF& rect) { - if (projectm_) projectm_->projectM_resetGL(rect.width(), rect.height()); + // NOTE: This should be updated on a QScreen dpi change signal. Accessing the + // QScreen becomes a lot easier in Qt 5.14 with QWidget::screen(). + pixel_ratio_ = container_->devicePixelRatio(); + + if (projectm_) + projectm_->projectM_resetGL(rect.width() * pixel_ratio_, + rect.height() * pixel_ratio_); } void ProjectMVisualisation::SetTextureSize(int size) { diff --git a/src/visualisations/projectmvisualisation.h b/src/visualisations/projectmvisualisation.h index a0dd279d0..159abb57e 100644 --- a/src/visualisations/projectmvisualisation.h +++ b/src/visualisations/projectmvisualisation.h @@ -29,12 +29,14 @@ class projectM; class ProjectMPresetModel; +class VisualisationContainer; + class QTemporaryFile; class ProjectMVisualisation : public QGraphicsScene, public BufferConsumer { Q_OBJECT public: - ProjectMVisualisation(QObject* parent = nullptr); + ProjectMVisualisation(VisualisationContainer* container); ~ProjectMVisualisation(); enum Mode { @@ -87,6 +89,12 @@ class ProjectMVisualisation : public QGraphicsScene, public BufferConsumer { std::vector default_rating_list_; int texture_size_; + // As of version 5.6, Qt supports automatic scaling for high-DPI displays. We + // need to know the pixel ratio so that we can convert coordinates for + // projectM. + // https://doc.qt.io/qt-5/highdpi.html + qreal pixel_ratio_; + VisualisationContainer* container_; }; #endif // PROJECTMVISUALISATION_H