Paste P265

Masterwork From Distant Lands
ActivePublic

Authored by dkazakov on Oct 7 2018, 9:14 PM.
diff --git a/libs/ui/KisMainWindow.cpp b/libs/ui/KisMainWindow.cpp
index 022e6c5..bdf5e64 100644
--- a/libs/ui/KisMainWindow.cpp
+++ b/libs/ui/KisMainWindow.cpp
@@ -2659,7 +2659,7 @@ void KisMainWindow::moveEvent(QMoveEvent *e)
const int newScreen = qApp->desktop()->screenNumber(e->pos());
if (oldScreen != newScreen) {
- KisConfigNotifier::instance()->notifyConfigChanged();
+ emit screenChanged();
}
}
diff --git a/libs/ui/KisMainWindow.h b/libs/ui/KisMainWindow.h
index d4e46a0..0ca48ce 100644
--- a/libs/ui/KisMainWindow.h
+++ b/libs/ui/KisMainWindow.h
@@ -226,6 +226,9 @@ Q_SIGNALS:
void guiLoadingFinished();
+ /// emitted when the window is migrated among different screens
+ void screenChanged();
+
public Q_SLOTS:
/**
diff --git a/libs/ui/KisView.cpp b/libs/ui/KisView.cpp
index 4f26c4f..e3dcc4d 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()
@@ -758,6 +759,11 @@ bool KisView::queryClose()
}
+void KisView::slotScreenChanged()
+{
+ d->zoomManager.updateScreenResolution(this);
+}
+
void KisView::resetImageSizeAndScroll(bool changeCentering,
const QPointF &oldImageStillPoint,
const QPointF &newImageStillPoint)
@@ -983,6 +989,7 @@ void KisView::slotLoadingFinished()
}
setCurrentNode(activeNode);
+ connect(d->viewManager->mainWindow(), SIGNAL(screenChanged()), SLOT(slotScreenChanged()));
zoomManager()->updateImageBoundsSnapping();
}
diff --git a/libs/ui/KisView.h b/libs/ui/KisView.h
index a33127a..124f227 100644
--- a/libs/ui/KisView.h
+++ b/libs/ui/KisView.h
@@ -247,6 +247,8 @@ public Q_SLOTS:
bool queryClose();
+ void slotScreenChanged();
+
private Q_SLOTS:
void slotImageNodeAdded(KisNodeSP node);
void slotContinueAddNode(KisNodeSP newActiveNode);
diff --git a/libs/ui/canvas/kis_canvas2.cpp b/libs/ui/canvas/kis_canvas2.cpp
index 1d07dfe..5e551d5 100644
--- a/libs/ui/canvas/kis_canvas2.cpp
+++ b/libs/ui/canvas/kis_canvas2.cpp
@@ -198,6 +198,7 @@ KisCanvas2::KisCanvas2(KisCoordinatesConverter *coordConverter, KoCanvasResource
*/
m_d->bootstrapLodBlocked = true;
connect(view->mainWindow(), SIGNAL(guiLoadingFinished()), SLOT(bootstrapFinished()));
+ connect(view->mainWindow(), SIGNAL(screenChanged()), SLOT(slotConfigChanged()));
KisImageConfig config(false);
@@ -1036,6 +1037,8 @@ void KisCanvas2::documentOffsetMoved(const QPoint &documentOffset)
void KisCanvas2::slotConfigChanged()
{
+ ENTER_FUNCTION();
+
KisConfig cfg(true);
m_d->vastScrolling = cfg.vastScrolling();
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..19d6ba2 100644
--- a/libs/ui/kis_zoom_manager.cc
+++ b/libs/ui/kis_zoom_manager.cc
@@ -79,6 +79,9 @@ KisZoomManager::KisZoomManager(QPointer<KisView> 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 *parentWidget)
+{
+ if (qFuzzyCompare(parentWidget->physicalDpiX(), m_physicalDpiX) &&
+ qFuzzyCompare(parentWidget->physicalDpiY(), m_physicalDpiY) &&
+ qFuzzyCompare(parentWidget->devicePixelRatio(), m_devicePixelRatio)) {
+
+ return;
+ }
+
+ ENTER_FUNCTION() << ppVar(parentWidget->physicalDpiX()) << ppVar(parentWidget->physicalDpiY());
+
+ m_physicalDpiX = parentWidget->physicalDpiX();
+ m_physicalDpiY = parentWidget->physicalDpiY();
+ m_devicePixelRatio = parentWidget->devicePixelRatio();
+
+ KisCoordinatesConverter *converter =
+ dynamic_cast<KisCoordinatesConverter*>(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<qreal>(KoDpi::dpiX()));
- qreal resolutionY = aspectMode ? image->yRes() : POINT_TO_INCH(static_cast<qreal>(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..cb2e93c 100644
--- a/libs/ui/kis_zoom_manager.h
+++ b/libs/ui/kis_zoom_manager.h
@@ -55,6 +55,8 @@ public:
KisZoomManager(QPointer<KisView> view, KoZoomHandler*, KoCanvasController *);
~KisZoomManager() override;
+ void updateScreenResolution(QWidget *parentWidget);
+
void setup(KActionCollection * actionCollection);
void updateGUI();
KoZoomController * zoomController() const {
@@ -100,6 +102,10 @@ private:
QPointer<QWidget> 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 <QApplication>
+#include <QDesktopWidget>
+
+
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<qreal>(dpiX)),
POINT_TO_INCH(static_cast<qreal>(dpiY)));
}
-
+#include "kis_debug.h"
void KoZoomHandler::setResolution( qreal resolutionX, qreal resolutionY )
{
+ ENTER_FUNCTION() << ppVar(resolutionX);
+
m_resolutionX = resolutionX;
m_resolutionY = resolutionY;
dkazakov edited the content of this paste. (Show Details)Oct 7 2018, 9:14 PM
dkazakov changed the title of this paste from untitled to Masterwork From Distant Lands.