diff --git a/ApplicationExeCode/RiaMain.cpp b/ApplicationExeCode/RiaMain.cpp index 66ddd7eba3..4a3489ea1e 100644 --- a/ApplicationExeCode/RiaMain.cpp +++ b/ApplicationExeCode/RiaMain.cpp @@ -78,13 +78,6 @@ int main( int argc, char* argv[] ) } #endif -#ifdef WIN32 - // Temporary workaround for incorrect scaling of opengl viewport on windows with dpi scaling != 100% - // Reverts scaling behaviour to Qt5 style - // Should be replaced by proper scaling of x and y coordinates in caf::Viewer - qputenv( "QT_ENABLE_HIGHDPI_SCALING", "0" ); -#endif - // The Qt::AA_ShareOpenGLContexts setting is needed when we have multiple viz widgets in flight // and we have a setup where these widgets belong to different top-level windows, or end up // belonging to different top-level windows through re-parenting. diff --git a/ApplicationLibCode/UserInterface/RiuComparisonViewMover.cpp b/ApplicationLibCode/UserInterface/RiuComparisonViewMover.cpp index dd0d385e9a..c8825ade79 100644 --- a/ApplicationLibCode/UserInterface/RiuComparisonViewMover.cpp +++ b/ApplicationLibCode/UserInterface/RiuComparisonViewMover.cpp @@ -61,8 +61,11 @@ bool RiuComparisonViewMover::eventFilter( QObject* watched, QEvent* event ) if ( m_dragState == LEFT_EDGE ) { + const int viewWidth = m_viewer->width(); + const int viewHeight = m_viewer->height(); + QPointF mousePos = mEv->localPos(); - QPointF normMousePos = { mousePos.x() / m_viewer->width(), mousePos.y() / m_viewer->height() }; + QPointF normMousePos = { mousePos.x() / viewWidth, mousePos.y() / viewHeight }; cvf::Rectf orgCompViewWindow = m_viewer->comparisonViewVisibleNormalizedRect(); float minx = normMousePos.x(); @@ -97,8 +100,9 @@ void RiuComparisonViewMover::paintMoverHandles( QPainter* painter ) const int handleThickness = 7; cvf::Rectf normalizedComparisonRect = m_viewer->comparisonViewVisibleNormalizedRect(); - int viewerWidth = m_viewer->width(); - int viewerHeight = m_viewer->height(); + const auto ratio = m_viewer->displayScalingRatio(); + int viewerWidth = (int)( ratio * m_viewer->width() ); + int viewerHeight = (int)( ratio * m_viewer->height() ); int leftEdgePos = viewerWidth * normalizedComparisonRect.min().x(); int width = viewerWidth * normalizedComparisonRect.width(); diff --git a/ApplicationLibCode/UserInterface/RiuViewer.cpp b/ApplicationLibCode/UserInterface/RiuViewer.cpp index 1b5ef641f0..d9b8733ae4 100644 --- a/ApplicationLibCode/UserInterface/RiuViewer.cpp +++ b/ApplicationLibCode/UserInterface/RiuViewer.cpp @@ -401,6 +401,11 @@ void RiuViewer::paintOverlayItems( QPainter* painter ) // and when they are shared between views the positions are overwritten. updateLegendLayout(); + // adjust for possible DPI scaling + auto ratio = displayScalingRatio(); + const auto trueWidth = (int)( ratio * this->width() ); + const auto trueHeight = (int)( ratio * this->height() ); + int columnWidth = 200; int edgeAxisFrameBorderWidth = m_showWindowEdgeAxes ? m_windowEdgeAxisOverlay->frameBorderWidth() : 0; @@ -415,7 +420,7 @@ void RiuViewer::paintOverlayItems( QPainter* painter ) if ( m_showInfoText ) columnWidth = std::max( columnWidth, m_infoLabel->sizeHint().width() ); - int columnPos = width() - columnWidth - margin - edgeAxisFrameBorderWidth; + int columnPos = trueWidth - columnWidth - margin - edgeAxisFrameBorderWidth; if ( isComparisonViewActive() ) { @@ -424,9 +429,8 @@ void RiuViewer::paintOverlayItems( QPainter* painter ) { columnWidth = 200; - // int sliderPos = width() * comparisonViewVisibleNormalizedRect().min().x(); - int sliderPos = 0.5 * width(); - int compViewItemsXPos = sliderPos + 0.5 * ( width() - sliderPos ) - 0.5 * columnWidth; + int sliderPos = 0.5 * trueWidth; + int compViewItemsXPos = sliderPos + 0.5 * ( trueWidth - sliderPos ) - 0.5 * columnWidth; columnPos = 0.5 * sliderPos - 0.5 * columnWidth; if ( m_showInfoText ) @@ -520,13 +524,13 @@ void RiuViewer::paintOverlayItems( QPainter* painter ) { m_histogramWidget->resize( columnWidth, 40 ); m_histogramWidget->render( painter, QPoint( columnPos, yPos ) ); - // yPos += m_histogramWidget->height() + margin; } if ( m_showVersionInfo ) // Version Label { - QSize size( m_versionInfoLabel->sizeHint().width(), m_versionInfoLabel->sizeHint().height() ); - QPoint pos( width() - size.width() - margin - edgeAxisFrameBorderWidth, height() - size.height() - margin - edgeAxisFrameBorderHeight ); + QSize size( m_versionInfoLabel->sizeHint().width(), m_versionInfoLabel->sizeHint().height() ); + QPoint pos( trueWidth - size.width() - margin - edgeAxisFrameBorderWidth, + trueHeight - size.height() - margin - edgeAxisFrameBorderHeight ); m_versionInfoLabel->resize( size.width(), size.height() ); m_versionInfoLabel->render( painter, pos ); } @@ -550,8 +554,9 @@ void RiuViewer::paintOverlayItems( QPainter* painter ) cvf::Vec3d screenCoords; if ( mainCamera()->project( displayCoord, &screenCoords ) ) { - int translatedMousePosY = height() - screenCoords.y(); - QPoint centerPos( screenCoords.x(), translatedMousePosY ); + int translatedMousePosX = (int)( ratio * screenCoords.x() ); + int translatedMousePosY = (int)( ratio * ( height() - screenCoords.y() ) ); + QPoint centerPos( translatedMousePosX, translatedMousePosY ); // Draw a cross hair marker int markerHalfLength = 6; @@ -926,8 +931,9 @@ void RiuViewer::updateLegendLayout() auto scaleLegendSize = m_scaleLegend->renderSize(); auto otherItemsHeight = m_versionInfoLabel->sizeHint().height(); - const int xPos = width() - (int)scaleLegendSize.x() - margin - edgeAxisBorderWidth; - const int yPos = margin + edgeAxisBorderHeight + margin + otherItemsHeight; + const auto ratio = displayScalingRatio(); + const int xPos = (int)( ratio * width() ) - (int)scaleLegendSize.x() - margin - edgeAxisBorderWidth; + const int yPos = margin + edgeAxisBorderHeight + margin + otherItemsHeight; m_scaleLegend->setLayoutFixedPosition( { xPos, yPos } ); } @@ -1058,14 +1064,6 @@ void RiuViewer::optimizeClippingPlanes() caf::Viewer::optimizeClippingPlanes(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiuViewer::resizeGL( int width, int height ) -{ - caf::Viewer::resizeGL( width, height ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/RiuViewer.h b/ApplicationLibCode/UserInterface/RiuViewer.h index 8f402176f3..a7bac0c1dd 100644 --- a/ApplicationLibCode/UserInterface/RiuViewer.h +++ b/ApplicationLibCode/UserInterface/RiuViewer.h @@ -141,7 +141,6 @@ public slots: protected: void optimizeClippingPlanes() override; - void resizeGL( int width, int height ) override; void mouseMoveEvent( QMouseEvent* e ) override; void enterEvent( QEnterEvent* e ) override; void leaveEvent( QEvent* ) override; diff --git a/Fwk/AppFwk/cafViewer/cafViewer.cpp b/Fwk/AppFwk/cafViewer/cafViewer.cpp index 1652b9b7c1..cdb354b49a 100644 --- a/Fwk/AppFwk/cafViewer/cafViewer.cpp +++ b/Fwk/AppFwk/cafViewer/cafViewer.cpp @@ -69,6 +69,7 @@ #include "cvfqtPerformanceInfoHud.h" #include "cvfqtUtils.h" +#include #include #include #include @@ -184,6 +185,14 @@ caf::Viewer::~Viewer() if ( m_layoutWidget ) m_layoutWidget->deleteLater(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double caf::Viewer::displayScalingRatio() const +{ + return qApp->primaryScreen()->devicePixelRatio(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -325,7 +334,9 @@ void caf::Viewer::setComparisonViewVisibleNormalizedRect( const cvf::Rectf& visi { m_comparisonWindowNormalizedRect = visibleRect; - updateCamera( width(), height() ); + const auto ratio = displayScalingRatio(); + + updateCamera( (int)( ratio * width() ), (int)( ratio * height() ) ); update(); } @@ -639,8 +650,9 @@ cvf::ref caf::Viewer::rayIntersectSpecFromWindowCoordinat cvf::ref caf::Viewer::rayIntersectSpecFromWindowCoordinates( int winPosX, int winPosY, bool isForComparisonView ) { - int translatedMousePosX = winPosX; - int translatedMousePosY = height() - winPosY; + const auto ratio = displayScalingRatio(); + int translatedMousePosX = (int)( ratio * winPosX ); + int translatedMousePosY = (int)( ratio * ( height() - winPosY ) ); cvf::Rendering* renderingToInvestigate = isForComparisonView ? m_comparisonMainRendering.p() : m_mainRendering.p(); @@ -711,6 +723,10 @@ bool caf::Viewer::isMousePosWithinComparisonView( int winPosX, int winPosY ) //-------------------------------------------------------------------------------------------------- void caf::Viewer::resizeGL( int width, int height ) { + auto ratio = displayScalingRatio(); + width = (int)( ratio * width ); + height = (int)( ratio * height ); + if ( width < 1 || height < 1 ) return; if ( m_offscreenFbo.notNull() ) @@ -755,6 +771,11 @@ void caf::Viewer::paintGL() CVF_CHECK_OGL( myOglContext.p() ); CVF_ASSERT( myOglContext->isContextValid() ); + auto ratio = displayScalingRatio(); + auto thisSize = this->size(); + thisSize.setHeight( (int)( ratio * thisSize.height() ) ); + thisSize.setWidth( (int)( ratio * thisSize.width() ) ); + QPainter painter( this ); if ( m_renderingSequence.isNull() || !canRender() ) @@ -769,9 +790,9 @@ void caf::Viewer::paintGL() if ( m_isOverlayPaintingEnabled || m_showPerfInfoHud ) { // Set up image to draw to, and painter - if ( m_overlayPaintingQImage.size() != this->size() ) + if ( m_overlayPaintingQImage.size() != thisSize ) { - m_overlayPaintingQImage = QImage( this->size(), QImage::Format_ARGB32 ); + m_overlayPaintingQImage = QImage( thisSize, QImage::Format_ARGB32 ); } m_overlayPaintingQImage.fill( Qt::transparent ); @@ -798,16 +819,16 @@ void caf::Viewer::paintGL() // Convert the QImage into the cvf::TextureImage, // handling vertical mirroring and (possible) byteswapping - if ( ( (int)m_overlayTextureImage->height() ) != this->height() || - ( (int)m_overlayTextureImage->width() != this->width() ) ) + if ( ( (int)m_overlayTextureImage->height() ) != thisSize.height() || + ( (int)m_overlayTextureImage->width() != thisSize.width() ) ) { - m_overlayTextureImage->allocate( this->width(), this->height() ); + m_overlayTextureImage->allocate( thisSize.width(), thisSize.height() ); } cvfqt::Utils::toTextureImage( m_overlayPaintingQImage, m_overlayTextureImage.p() ); m_overlayImage->setImage( m_overlayTextureImage.p() ); - m_overlayImage->setPixelSize( cvf::Vec2ui( this->width(), this->height() ) ); + m_overlayImage->setPixelSize( cvf::Vec2ui( thisSize.width(), thisSize.height() ) ); } painter.beginNativePainting(); diff --git a/Fwk/AppFwk/cafViewer/cafViewer.h b/Fwk/AppFwk/cafViewer/cafViewer.h index 36d624f0d0..b2d0d190dc 100644 --- a/Fwk/AppFwk/cafViewer/cafViewer.h +++ b/Fwk/AppFwk/cafViewer/cafViewer.h @@ -181,6 +181,9 @@ public: void setCurrentComparisonFrame( int frameIndex ); void setComparisonViewToFollowAnimation( bool isToFollow ); + // display scaling ratio (should be 1 if DPI scaling is not enabled) + double displayScalingRatio() const; + public slots: virtual void slotSetCurrentFrame( int frameIndex ); virtual void slotEndAnimation();