diff --git a/libs/ui/KisView.cpp b/libs/ui/KisView.cpp index 4f26c4f..4655c74 100644 --- a/libs/ui/KisView.cpp +++ b/libs/ui/KisView.cpp @@ -251,6 +251,7 @@ KisView::KisView(KisDocument *document, KoCanvasResourceManager *resourceManager d->paintingAssistantsDecoration->setVisible(true); d->showFloatingMessage = cfg.showCanvasMessages(); + d->zoomManager.updateScreenResolution(this); } KisView::~KisView() diff --git a/libs/ui/canvas/kis_canvas2.cpp b/libs/ui/canvas/kis_canvas2.cpp index 1d07dfe..ce6b1ea 100644 --- a/libs/ui/canvas/kis_canvas2.cpp +++ b/libs/ui/canvas/kis_canvas2.cpp @@ -1034,6 +1034,8 @@ void KisCanvas2::documentOffsetMoved(const QPoint &documentOffset) m_d->regionOfInterestUpdateCompressor.start(); } +#include "kis_zoom_manager.h" + void KisCanvas2::slotConfigChanged() { KisConfig cfg(true); @@ -1042,6 +1044,8 @@ void KisCanvas2::slotConfigChanged() resetCanvas(cfg.useOpenGL()); slotSetDisplayProfile(cfg.displayProfile(QApplication::desktop()->screenNumber(this->canvasWidget()))); + m_d->view->zoomManager()->updateScreenResolution(QApplication::desktop()); + initializeFpsDecoration(); } diff --git a/libs/ui/canvas/kis_coordinates_converter.cpp b/libs/ui/canvas/kis_coordinates_converter.cpp index c1f1718..c8e3f5c 100644 --- a/libs/ui/canvas/kis_coordinates_converter.cpp +++ b/libs/ui/canvas/kis_coordinates_converter.cpp @@ -30,7 +30,12 @@ struct KisCoordinatesConverter::Private { Private(): - isXAxisMirrored(false), isYAxisMirrored(false), rotationAngle(0.0) { } + isXAxisMirrored(false), + isYAxisMirrored(false), + rotationAngle(0.0), + devicePixelRatio(1.0) + { + } KisImageWSP image; @@ -38,6 +43,7 @@ struct KisCoordinatesConverter::Private { bool isYAxisMirrored; qreal rotationAngle; QSizeF canvasWidgetSize; + qreal devicePixelRatio; QPointF documentOffset; QTransform flakeToWidget; @@ -150,6 +156,11 @@ void KisCoordinatesConverter::setCanvasWidgetSize(QSize size) recalculateTransformations(); } +void KisCoordinatesConverter::setDevicePixelRatio(qreal value) +{ + m_d->devicePixelRatio = value; +} + void KisCoordinatesConverter::setImage(KisImageWSP image) { m_d->image = image; @@ -444,3 +455,10 @@ void KisCoordinatesConverter::imageScale(qreal *scaleX, qreal *scaleY) const *scaleX = zoomX / resX; *scaleY = zoomY / resY; } + +void KisCoordinatesConverter::imagePhysicalScale(qreal *scaleX, qreal *scaleY) const +{ + imageScale(scaleX, scaleY); + *scaleX *= m_d->devicePixelRatio; + *scaleY *= m_d->devicePixelRatio; +} diff --git a/libs/ui/canvas/kis_coordinates_converter.h b/libs/ui/canvas/kis_coordinates_converter.h index 8ac8718..9a7bd20 100644 --- a/libs/ui/canvas/kis_coordinates_converter.h +++ b/libs/ui/canvas/kis_coordinates_converter.h @@ -60,6 +60,7 @@ public: ~KisCoordinatesConverter() override; void setCanvasWidgetSize(QSize size); + void setDevicePixelRatio(qreal value); void setImage(KisImageWSP image); void setDocumentOffset(const QPoint &offset); @@ -147,6 +148,7 @@ public: QPointF widgetCenterPoint() const; void imageScale(qreal *scaleX, qreal *scaleY) const; + void imagePhysicalScale(qreal *scaleX, qreal *scaleY) const; private: friend class KisZoomAndPanTest; diff --git a/libs/ui/kis_zoom_manager.cc b/libs/ui/kis_zoom_manager.cc index baa6e02..ffc9ca2 100644 --- a/libs/ui/kis_zoom_manager.cc +++ b/libs/ui/kis_zoom_manager.cc @@ -79,6 +79,9 @@ KisZoomManager::KisZoomManager(QPointer view, KoZoomHandler * zoomHandl , m_verticalRuler(0) , m_zoomAction(0) , m_zoomActionWidget(0) + , m_physicalDpiX(72.0) + , m_physicalDpiY(72.0) + , m_devicePixelRatio(1.0) { } @@ -89,6 +92,29 @@ KisZoomManager::~KisZoomManager() } } +void KisZoomManager::updateScreenResolution(QWidget *desktopWidget) +{ + if (qFuzzyCompare(desktopWidget->physicalDpiX(), m_physicalDpiX) && + qFuzzyCompare(desktopWidget->physicalDpiY(), m_physicalDpiY) && + qFuzzyCompare(desktopWidget->devicePixelRatio(), m_devicePixelRatio)) { + + return; + } + + ENTER_FUNCTION() << ppVar(desktopWidget->physicalDpiX()) << ppVar(desktopWidget->physicalDpiY()); + + m_physicalDpiX = desktopWidget->physicalDpiX(); + m_physicalDpiY = desktopWidget->physicalDpiY(); + m_devicePixelRatio = desktopWidget->devicePixelRatio(); + + KisCoordinatesConverter *converter = + dynamic_cast(m_zoomHandler); + + converter->setDevicePixelRatio(m_devicePixelRatio); + + changeAspectMode(m_aspectMode); +} + void KisZoomManager::setup(KActionCollection * actionCollection) { @@ -337,17 +363,20 @@ void KisZoomManager::changeAspectMode(bool aspectMode) { KisImageWSP image = m_view->image(); - KoZoomMode::Mode newMode = KoZoomMode::ZOOM_CONSTANT; - qreal newZoom = m_zoomHandler->zoom(); + const KoZoomMode::Mode newMode = KoZoomMode::ZOOM_CONSTANT; + const qreal newZoom = m_zoomHandler->zoom(); + + const qreal resolutionX = + aspectMode ? image->xRes() / m_devicePixelRatio : POINT_TO_INCH(m_physicalDpiX); - qreal resolutionX = aspectMode ? image->xRes() : POINT_TO_INCH(static_cast(KoDpi::dpiX())); - qreal resolutionY = aspectMode ? image->yRes() : POINT_TO_INCH(static_cast(KoDpi::dpiY())); + const qreal resolutionY = + aspectMode ? image->yRes() / m_devicePixelRatio : POINT_TO_INCH(m_physicalDpiY); + m_aspectMode = aspectMode; m_zoomController->setZoom(newMode, newZoom, resolutionX, resolutionY); m_view->canvasBase()->notifyZoomChanged(); } - void KisZoomManager::pageOffsetChanged() { QRectF widgetRect = m_view->canvasBase()->coordinatesConverter()->imageRectInWidgetPixels(); diff --git a/libs/ui/kis_zoom_manager.h b/libs/ui/kis_zoom_manager.h index b296810..62cc9a9 100644 --- a/libs/ui/kis_zoom_manager.h +++ b/libs/ui/kis_zoom_manager.h @@ -55,6 +55,8 @@ public: KisZoomManager(QPointer view, KoZoomHandler*, KoCanvasController *); ~KisZoomManager() override; + void updateScreenResolution(QWidget *desktopWidget); + void setup(KActionCollection * actionCollection); void updateGUI(); KoZoomController * zoomController() const { @@ -100,6 +102,10 @@ private: QPointer m_zoomActionWidget; QPoint m_rulersOffset; KisSignalAutoConnectionsStore m_mouseTrackingConnections; + qreal m_physicalDpiX; + qreal m_physicalDpiY; + qreal m_devicePixelRatio; + bool m_aspectMode; }; diff --git a/libs/ui/opengl/kis_opengl_canvas2.cpp b/libs/ui/opengl/kis_opengl_canvas2.cpp index 076b495..2643f5b 100644 --- a/libs/ui/opengl/kis_opengl_canvas2.cpp +++ b/libs/ui/opengl/kis_opengl_canvas2.cpp @@ -349,6 +349,10 @@ void KisOpenGLCanvas2::reportFailedShaderCompilation(const QString &context) cfg.setCanvasState("OPENGL_FAILED"); } +#include +#include + + void KisOpenGLCanvas2::resizeGL(int width, int height) { coordinatesConverter()->setCanvasWidgetSize(QSize(width, height)); @@ -657,7 +661,10 @@ void KisOpenGLCanvas2::drawImage() } qreal scaleX, scaleY; - converter->imageScale(&scaleX, &scaleY); + converter->imagePhysicalScale(&scaleX, &scaleY); + + ENTER_FUNCTION() << ppVar(scaleX); + d->displayShader->setUniformValue(d->displayShader->location(Uniform::ViewportScale), (GLfloat) scaleX); d->displayShader->setUniformValue(d->displayShader->location(Uniform::TexelSize), (GLfloat) d->openGLImageTextures->texelSize()); diff --git a/libs/widgets/KoZoomHandler.cpp b/libs/widgets/KoZoomHandler.cpp index 90f9c1d..d0fa1ea 100644 --- a/libs/widgets/KoZoomHandler.cpp +++ b/libs/widgets/KoZoomHandler.cpp @@ -53,9 +53,11 @@ void KoZoomHandler::setDpi(int dpiX, int dpiY) setResolution(POINT_TO_INCH(static_cast(dpiX)), POINT_TO_INCH(static_cast(dpiY))); } - +#include "kis_debug.h" void KoZoomHandler::setResolution( qreal resolutionX, qreal resolutionY ) { + ENTER_FUNCTION() << ppVar(resolutionX); + m_resolutionX = resolutionX; m_resolutionY = resolutionY;