Date: Tue, 8 Mar 2022 10:15:25 +0100 Subject: fix QML Canvas high dpi rendering in wasm Once paiting is done, set devicePixelRatio back to 1. In wasm, QML Canvas rendered to QImage on highdpi screen renders with wrong size. In `QSGOpenGLAtlasTexture::Atlas::upload`, a tmp QImage is created and filled with the rendered QImage that had a devicePixelRatio set to screen dpr. This cause calls `drawImage` to effectivly apply devicePixelRatio a second time. diff --git a/src/quick/items/context2d/qquickcontext2dtexture.cpp b/src/quick/items/context2d/qquickcontext2dtexture.cpp index 4248c192a9..aa6a17e6ee 100644 --- a/src/quick/items/context2d/qquickcontext2dtexture.cpp +++ b/src/quick/items/context2d/qquickcontext2dtexture.cpp @@ -734,6 +734,9 @@ QPaintDevice* QQuickContext2DImageTexture::beginPainting() (m_item->objectName().isEmpty() ? "Canvas" : qPrintable(m_item->objectName())), m_item->width(), m_item->height(), m_image.size().width(), m_image.size().height(), m_canvasDevicePixelRatio); } + else { + m_image.setDevicePixelRatio(m_canvasDevicePixelRatio); + } return &m_image; } @@ -743,6 +746,7 @@ void QQuickContext2DImageTexture::endPainting() QQuickContext2DTexture::endPainting(); if (m_onCustomThread) m_mutex.lock(); + m_image.setDevicePixelRatio(1.0); m_displayImage = m_image; if (m_onCustomThread) m_mutex.unlock();