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