mirror of https://github.com/qt/qtgraphs.git
Fix graphprinting example crash
We exceed maximum texture size on certain platforms. Added a check
for it.
Pick-to: 6.9.1
Fixes: QTBUG-135384
Fixes: QTBUG-135386
Change-Id: I0a09337c9c6b831f801df35b5756327f45507237
Reviewed-by: Owais Akhtar <owais.akhtar@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
(cherry picked from commit 713a6e0b72)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
ed3893c5b1
commit
46c4bd0784
|
|
@ -40,6 +40,7 @@ target_link_libraries(graphprinting PRIVATE
|
||||||
Qt::Quick3D
|
Qt::Quick3D
|
||||||
Qt::Graphs
|
Qt::Graphs
|
||||||
Qt::PrintSupport
|
Qt::PrintSupport
|
||||||
|
Qt::GuiPrivate
|
||||||
)
|
)
|
||||||
|
|
||||||
qt6_add_qml_module(graphprinting
|
qt6_add_qml_module(graphprinting
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,13 @@
|
||||||
// Copyright (C) 2024 The Qt Company Ltd.
|
// Copyright (C) 2024 The Qt Company Ltd.
|
||||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||||
#include "graphprinter.h"
|
#include "graphprinter.h"
|
||||||
|
#include <QtGui/qtguiglobal.h>
|
||||||
#include <QtGui/qtransform.h>
|
#include <QtGui/qtransform.h>
|
||||||
#include <QtPrintSupport/QtPrintSupport>
|
#include <QtPrintSupport/QtPrintSupport>
|
||||||
|
#if QT_CONFIG(opengl)
|
||||||
|
#include <QtGui/qoffscreensurface.h>
|
||||||
|
#endif
|
||||||
|
#include <rhi/qrhi.h>
|
||||||
|
|
||||||
GraphPrinter::GraphPrinter(QObject *parent)
|
GraphPrinter::GraphPrinter(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
|
|
@ -10,6 +15,45 @@ GraphPrinter::GraphPrinter(QObject *parent)
|
||||||
|
|
||||||
GraphPrinter::~GraphPrinter() {}
|
GraphPrinter::~GraphPrinter() {}
|
||||||
|
|
||||||
|
static qreal s_maxTextureSize = 0.;
|
||||||
|
|
||||||
|
qreal GraphPrinter::maxTextureSize()
|
||||||
|
{
|
||||||
|
// Query maximum texture size only once
|
||||||
|
if (!s_maxTextureSize) {
|
||||||
|
std::unique_ptr<QRhi> rhi;
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
QRhiD3D12InitParams params;
|
||||||
|
rhi.reset(QRhi::create(QRhi::D3D12, ¶ms));
|
||||||
|
#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
|
||||||
|
QRhiMetalInitParams params;
|
||||||
|
rhi.reset(QRhi::create(QRhi::Metal, ¶ms));
|
||||||
|
#elif QT_CONFIG(opengl)
|
||||||
|
QRhiGles2InitParams params;
|
||||||
|
params.fallbackSurface = QRhiGles2InitParams::newFallbackSurface();
|
||||||
|
rhi.reset(QRhi::create(QRhi::OpenGLES2, ¶ms));
|
||||||
|
#elif QT_CONFIG(vulkan)
|
||||||
|
if (!qEnvironmentVariable("QSG_RHI_BACKEND").compare("vulkan")) {
|
||||||
|
QVulkanInstance inst;
|
||||||
|
inst.setExtensions(QRhiVulkanInitParams::preferredInstanceExtensions());
|
||||||
|
if (inst.create()) {
|
||||||
|
QRhiVulkanInitParams params;
|
||||||
|
params.inst = &inst;
|
||||||
|
rhi.reset(QRhi::create(QRhi::Vulkan, ¶ms));
|
||||||
|
} else {
|
||||||
|
qWarning("Failed to create Vulkan instance");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (rhi)
|
||||||
|
s_maxTextureSize = qreal(rhi->resourceLimit(QRhi::TextureSizeMax));
|
||||||
|
else
|
||||||
|
s_maxTextureSize = 4096.; // Use 4096 as the minimum
|
||||||
|
}
|
||||||
|
|
||||||
|
return s_maxTextureSize;
|
||||||
|
}
|
||||||
|
|
||||||
QString GraphPrinter::generatePDF(const QUrl &path, const QImage &image)
|
QString GraphPrinter::generatePDF(const QUrl &path, const QImage &image)
|
||||||
{
|
{
|
||||||
//! [0]
|
//! [0]
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ public:
|
||||||
Q_INVOKABLE QString generatePDF(const QUrl &path, const QImage &image);
|
Q_INVOKABLE QString generatePDF(const QUrl &path, const QImage &image);
|
||||||
Q_INVOKABLE QString print(const QImage &image, const QString printerName);
|
Q_INVOKABLE QString print(const QImage &image, const QString printerName);
|
||||||
Q_INVOKABLE QStringList getPrinters();
|
Q_INVOKABLE QStringList getPrinters();
|
||||||
|
Q_INVOKABLE qreal maxTextureSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GRAPHPRINTER_H
|
#endif // GRAPHPRINTER_H
|
||||||
|
|
|
||||||
|
|
@ -146,6 +146,8 @@ Rectangle {
|
||||||
}
|
}
|
||||||
MessageDialog {
|
MessageDialog {
|
||||||
id: message
|
id: message
|
||||||
|
onButtonClicked: mainView.cleanAfterPrint()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! [1.1]
|
//! [1.1]
|
||||||
|
|
@ -257,7 +259,20 @@ Rectangle {
|
||||||
//! [3.3]
|
//! [3.3]
|
||||||
function prepareForPrint() {
|
function prepareForPrint() {
|
||||||
if (stackLayout.currentIndex === 1) {
|
if (stackLayout.currentIndex === 1) {
|
||||||
outputsize = Qt.size(bargraph.width * 4, bargraph.height * 4)
|
var newsize = Qt.size(bargraph.width * 4, bargraph.height * 4)
|
||||||
|
|
||||||
|
// check that we do not exceed maximum texture size
|
||||||
|
if (newsize.width * Screen.devicePixelRatio > graphPrinter.maxTextureSize() ) {
|
||||||
|
// scale to 25% under max texture size to be on the safe side; some GPUs seem
|
||||||
|
// to glitch when using the abosulute max
|
||||||
|
var ratio = (newsize.width * Screen.devicePixelRatio * 1.25)
|
||||||
|
/ graphPrinter.maxTextureSize()
|
||||||
|
newsize.width /= ratio
|
||||||
|
newsize.height /= ratio
|
||||||
|
}
|
||||||
|
outputsize.width = Math.round(newsize.width)
|
||||||
|
outputsize.height = Math.round(newsize.height)
|
||||||
|
|
||||||
// resize the bar graph to match the PDF output size
|
// resize the bar graph to match the PDF output size
|
||||||
item.width = outputsize.width
|
item.width = outputsize.width
|
||||||
item.height = outputsize.height
|
item.height = outputsize.height
|
||||||
|
|
@ -269,8 +284,8 @@ Rectangle {
|
||||||
function cleanAfterPrint() {
|
function cleanAfterPrint() {
|
||||||
if (stackLayout.currentIndex === 1) {
|
if (stackLayout.currentIndex === 1) {
|
||||||
// resize the bar graph back to the actual visual size
|
// resize the bar graph back to the actual visual size
|
||||||
item.width = mainView.width
|
item.width = stackLayout.width
|
||||||
item.height = mainView.height
|
item.height = stackLayout.height
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//! [3.3]
|
//! [3.3]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue