aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/doc/snippets/pointerHandlers/wheelHandlerAcceptedModifiers.qml20
-rw-r--r--src/quick/doc/snippets/pointerHandlers/wheelHandlerMargin.qml15
-rw-r--r--src/quick/doc/src/concepts/input/focus.qdoc8
-rw-r--r--src/quick/doc/src/qmltypereference.qdoc6
-rw-r--r--src/quick/handlers/qquickwheelhandler.cpp112
-rw-r--r--src/quick/items/context2d/qquickcontext2d.cpp2
-rw-r--r--src/quick/items/qquickitem.cpp2
-rw-r--r--src/quick/items/qquicklistview.cpp21
-rw-r--r--src/quick/items/qquickpalette.cpp2
-rw-r--r--src/quick/items/qquickselectable_p.h2
-rw-r--r--src/quick/items/qquicktableview.cpp6
-rw-r--r--src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp10
-rw-r--r--src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp27
-rw-r--r--src/quick/scenegraph/coreapi/qsgmaterial.cpp15
-rw-r--r--src/quick/scenegraph/coreapi/qsgnode.cpp4
-rw-r--r--src/quick/scenegraph/qsgcontext.cpp6
-rw-r--r--src/quick/scenegraph/qsgrhilayer.cpp11
-rw-r--r--src/quick/scenegraph/qsgthreadedrenderloop.cpp4
-rw-r--r--src/quick/util/qquickforeignutils.cpp2
-rw-r--r--src/quick/util/qquickpath.cpp2
20 files changed, 205 insertions, 72 deletions
diff --git a/src/quick/doc/snippets/pointerHandlers/wheelHandlerAcceptedModifiers.qml b/src/quick/doc/snippets/pointerHandlers/wheelHandlerAcceptedModifiers.qml
new file mode 100644
index 0000000000..1a8db7b636
--- /dev/null
+++ b/src/quick/doc/snippets/pointerHandlers/wheelHandlerAcceptedModifiers.qml
@@ -0,0 +1,20 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+//![entire]
+import QtQuick
+
+Rectangle {
+ width: 170; height: 120
+ color: "green"; antialiasing: true
+
+ WheelHandler {
+ property: "rotation"
+ acceptedModifiers: Qt.ControlModifier
+ }
+
+ WheelHandler {
+ property: "scale"
+ acceptedModifiers: Qt.NoModifier
+ }
+}
+//![entire]
diff --git a/src/quick/doc/snippets/pointerHandlers/wheelHandlerMargin.qml b/src/quick/doc/snippets/pointerHandlers/wheelHandlerMargin.qml
new file mode 100644
index 0000000000..82a4fd744b
--- /dev/null
+++ b/src/quick/doc/snippets/pointerHandlers/wheelHandlerMargin.qml
@@ -0,0 +1,15 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+//![entire]
+import QtQuick
+
+Rectangle {
+ width: 170; height: 120
+ color: "green"; antialiasing: true
+
+ WheelHandler {
+ property: "rotation"
+ margin: 10
+ }
+}
+//![entire]
diff --git a/src/quick/doc/src/concepts/input/focus.qdoc b/src/quick/doc/src/concepts/input/focus.qdoc
index 8c6f73024b..9f5a97101f 100644
--- a/src/quick/doc/src/concepts/input/focus.qdoc
+++ b/src/quick/doc/src/concepts/input/focus.qdoc
@@ -76,7 +76,7 @@ The MyWidget code:
\snippet qml/focus/MyWidget.qml mywidget
We want the first \c MyWidget object to have the focus, so we set its
-\c focus property to \c true. However, by running the code, we can confirm that
+\c focus property to \c true. However, by running the code, it can happen that
the second widget receives the focus.
\image declarative-qmlfocus2.png
@@ -85,9 +85,9 @@ Looking at both \c MyWidget and \c window code, the problem is evident - there
are three types that set the \c focus property to \c true. The two
\c {MyWidget}s set the \c focus to \c true and the \c window component also sets the
focus. Ultimately, only one type can have keyboard focus, and the system has
-to decide which type receives the focus. When the second \c MyWidget is created,
-it receives the focus because it is the last type to set its \c focus
-property to \c true.
+to decide which type receives the focus. Since QML does not guarantee which element
+will have its properties initialized first, it might be that the last \c MyWidget
+gets the initial focus.
This problem is due to visibility. The \c MyWidget component would like to have
the focus, but it cannot control the focus when it is imported or reused.
diff --git a/src/quick/doc/src/qmltypereference.qdoc b/src/quick/doc/src/qmltypereference.qdoc
index 790a1ddc8c..1c9f7d8dc9 100644
--- a/src/quick/doc/src/qmltypereference.qdoc
+++ b/src/quick/doc/src/qmltypereference.qdoc
@@ -144,15 +144,15 @@ available when you import \c QtQuick.
The following properties are also available:
\list
- \li \l enumeration \c font.weight
+ \li \l {QML Enumerations}{enumeration} \c font.weight
\li \l bool \c font.overline
\li \l bool \c font.strikeout
- \li \l enumeration \c font.capitalization
+ \li \l {QML Enumerations}{enumeration} \c font.capitalization
\li \l real \c font.letterSpacing
\li \l real \c font.wordSpacing
\li \l bool \c font.kerning
\li \l bool \c font.preferShaping
- \li \l enumeration \c font.hintingPreference
+ \li \l {QML Enumerations}{enumeration} \c font.hintingPreference
\li \l string \c font.styleName
\endlist
diff --git a/src/quick/handlers/qquickwheelhandler.cpp b/src/quick/handlers/qquickwheelhandler.cpp
index b7a42904c6..b051362e2b 100644
--- a/src/quick/handlers/qquickwheelhandler.cpp
+++ b/src/quick/handlers/qquickwheelhandler.cpp
@@ -517,8 +517,16 @@ QMetaProperty &QQuickWheelHandlerPrivate::targetMetaProperty() const
return metaProperty;
}
+/*! \internal
+ \qmlproperty flags QtQuick::WheelHandler::acceptedButtons
+
+ This overrides QtQuick::PointerDeviceHandler::acceptedButtons
+ and hides it from the documentation as the property is not relevant for
+ WheelHandler.
+*/
+
/*!
- \qmlproperty flags WheelHandler::acceptedDevices
+ \qmlproperty flags QtQuick::WheelHandler::acceptedDevices
The types of pointing devices that can activate this handler.
@@ -536,6 +544,108 @@ QMetaProperty &QQuickWheelHandlerPrivate::targetMetaProperty() const
\c acceptedDevices remains set to its default value.
*/
+/*!
+ \qmlproperty flags QtQuick::WheelHandler::acceptedModifiers
+
+ If this property is set, it will require the given keyboard modifiers to
+ be pressed in order to react to wheel events, and otherwise ignore them.
+
+ If this property is set to \c Qt.KeyboardModifierMask (the default value),
+ the WheelHandler ignores the modifier keys.
+
+ For example, an \l [QML] Item could have two handlers, one of which is
+ enabled only if the required keyboard modifier is pressed, while the other
+ ignores events if any modifier is pressed:
+
+ \snippet pointerHandlers/wheelHandlerAcceptedModifiers.qml entire
+
+ The available modifiers are as follows:
+
+ \value NoModifier No modifier key is allowed.
+ \value ShiftModifier A Shift key on the keyboard must be pressed.
+ \value ControlModifier A Ctrl key on the keyboard must be pressed.
+ \value AltModifier An Alt key on the keyboard must be pressed.
+ \value MetaModifier A Meta key on the keyboard must be pressed.
+ \value KeypadModifier A keypad button must be pressed.
+ \value GroupSwitchModifier X11 only (unless activated on Windows by a command line argument).
+ A Mode_switch key on the keyboard must be pressed.
+ \value KeyboardModifierMask The handler does not care which modifiers are pressed.
+
+ \sa Qt::KeyboardModifier
+*/
+
+/*! \internal
+ \qmlproperty flags QtQuick::WheelHandler::acceptedPointerTypes
+
+ This overrides QtQuick::PointerDeviceHandler::acceptedPointerTypes
+ and hides it from the documentation as the property is not relevant for
+ WheelHandler.
+*/
+
+/*!
+ \readonly
+ \qmlproperty bool QtQuick::WheelHandler::active
+
+ This holds \c true whenever the WheelHandler has recently seen a
+ QWheelEvent, is keeping its properties up-to-date, and actively manipulating
+ its \l target (if any).
+
+ \sa activeTimeout
+*/
+
+/*! \internal
+ \qmlproperty flags QtQuick::WheelHandler::cursorShape
+
+ This overrides QtQuick::PointerHandler::cursorShape
+ and hides it from the documentation as the property is not relevant for
+ WheelHandler.
+*/
+
+/*! \internal
+ \qmlproperty flags QtQuick::WheelHandler::dragThreshold
+
+ This overrides QtQuick::PointerHandler::dragThreshold
+ and hides it from the documentation as the property is not relevant for
+ WheelHandler.
+*/
+
+/*! \internal
+ \qmlproperty flags QtQuick::WheelHandler::grabPermissions
+
+ This overrides QtQuick::PointerHandler::grabPermissions
+ and hides it from the documentation as the property is not relevant for
+ WheelHandler.
+*/
+
+/*!
+ \qmlproperty real QtQuick::WheelHandler::margin
+
+ The margin beyond the bounds of the \l {PointerHandler::parent}{parent}
+ item within which the WheelHandler can react. For example if \c margin
+ is set to \c 10, you could place the cursor up to 10 pixels outside the
+ visible edge of the item, and it will still react to the wheel:
+
+ \snippet pointerHandlers/wheelHandlerMargin.qml entire
+
+ The default value is \c 0.
+*/
+
+/*! \internal
+ \qmlsignal QtQuick::WheelHandler::grabChanged(PointerDevice::GrabTransition transition, eventPoint point)
+
+ This overrides QtQuick::PointerHandler::grabChanged
+ and hides it from the documentation as the signal is not relevant for
+ WheelHandler.
+*/
+
+/*! \internal
+ \qmlsignal QtQuick::WheelHandler::canceled(eventPoint point)
+
+ This overrides QtQuick::PointerHandler::canceled
+ and hides it from the documentation as the signal is not relevant for
+ WheelHandler.
+*/
+
QT_END_NAMESPACE
#include "moc_qquickwheelhandler_p.cpp"
diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp
index 0ce3ef879b..362f37f509 100644
--- a/src/quick/items/context2d/qquickcontext2d.cpp
+++ b/src/quick/items/context2d/qquickcontext2d.cpp
@@ -3927,7 +3927,7 @@ void QQuickContext2D::addArcTo(const QPointF& p1, const QPointF& p2, qreal radiu
// The points p0, p1, and p2 are on the same straight line (HTML5, 4.8.11.1.8)
// We could have used areCollinear() here, but since we're reusing
// the variables computed above later on we keep this logic.
- if (qFuzzyCompare(std::abs(cos_phi), 1.0)) {
+ if (qFuzzyCompare(std::abs(cos_phi), qreal(1.0))) {
m_path.lineTo(p1);
return;
}
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 82587a178a..ec339ccc3b 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -6316,7 +6316,7 @@ qreal QQuickItem::opacity() const
void QQuickItem::setOpacity(qreal newOpacity)
{
Q_D(QQuickItem);
- qreal o = qBound<qreal>(0, newOpacity, 1);
+ qreal o = std::clamp(newOpacity, qreal(0.0), qreal(1.0));
if (d->opacity() == o)
return;
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp
index 063c48260a..7c5ef85566 100644
--- a/src/quick/items/qquicklistview.cpp
+++ b/src/quick/items/qquicklistview.cpp
@@ -1704,18 +1704,23 @@ void QQuickListViewPrivate::fixup(AxisData &data, qreal minExtent, qreal maxExte
break;
}
}
- FxViewItem *topItem = snapItemAt(tempPosition + snapOffset + highlightRangeStart);
- if (strictHighlightRange && currentItem && (!topItem || (topItem->index != currentIndex && fixupMode == Immediate))) {
- // StrictlyEnforceRange always keeps an item in range
+
+ // If there are pending changes, the item returned from snapItemAt might get deleted as
+ // soon as applyPendingChanges() is called (from e.g. updateHighlight()).
+ // Therefore, apply the pending changes before we call snapItemAt()
+ if (strictHighlightRange)
updateHighlight();
- topItem = currentItem;
- }
+
+ FxViewItem *topItem = snapItemAt(tempPosition + snapOffset + highlightRangeStart);
FxViewItem *bottomItem = snapItemAt(tempPosition + snapOffset + highlightRangeEnd);
- if (strictHighlightRange && currentItem && (!bottomItem || (bottomItem->index != currentIndex && fixupMode == Immediate))) {
+ if (strictHighlightRange && currentItem) {
// StrictlyEnforceRange always keeps an item in range
- updateHighlight();
- bottomItem = currentItem;
+ if (!topItem || (topItem->index != currentIndex && fixupMode == Immediate))
+ topItem = currentItem;
+ if (!bottomItem || (bottomItem->index != currentIndex && fixupMode == Immediate))
+ bottomItem = currentItem;
}
+
qreal pos = 0;
bool isInBounds = -position() > maxExtent && -position() <= minExtent;
diff --git a/src/quick/items/qquickpalette.cpp b/src/quick/items/qquickpalette.cpp
index 824a0bf096..2563bec022 100644
--- a/src/quick/items/qquickpalette.cpp
+++ b/src/quick/items/qquickpalette.cpp
@@ -45,7 +45,7 @@ static constexpr bool is_valid(QPalette::ColorGroup cg) noexcept
/*!
\qmltype Palette
\instantiates QQuickPalette
- \inherits QQuickColorGroup
+ \inherits ColorGroup
\inqmlmodule QtQuick
\ingroup qtquick-visual
\brief Contains color groups for each QML item state.
diff --git a/src/quick/items/qquickselectable_p.h b/src/quick/items/qquickselectable_p.h
index 726352719f..03c6cca717 100644
--- a/src/quick/items/qquickselectable_p.h
+++ b/src/quick/items/qquickselectable_p.h
@@ -23,6 +23,8 @@ QT_BEGIN_NAMESPACE
class Q_QUICK_PRIVATE_EXPORT QQuickSelectable
{
public:
+ virtual ~QQuickSelectable();
+
virtual QQuickItem *selectionPointerHandlerTarget() const = 0;
virtual bool startSelection(const QPointF &pos) = 0;
diff --git a/src/quick/items/qquicktableview.cpp b/src/quick/items/qquicktableview.cpp
index 1b564df125..3cc63cece0 100644
--- a/src/quick/items/qquicktableview.cpp
+++ b/src/quick/items/qquicktableview.cpp
@@ -1413,6 +1413,8 @@
QT_BEGIN_NAMESPACE
+QQuickSelectable::~QQuickSelectable() { }
+
Q_LOGGING_CATEGORY(lcTableViewDelegateLifecycle, "qt.quick.tableview.lifecycle")
#define Q_TABLEVIEW_UNREACHABLE(output) { dumpTable(); qWarning() << "output:" << output; Q_UNREACHABLE(); }
@@ -4550,7 +4552,7 @@ void QQuickTableViewPrivate::positionViewAtRow(int row, Qt::Alignment alignment,
Qt::Alignment verticalAlignment = alignment & (Qt::AlignTop | Qt::AlignVCenter | Qt::AlignBottom);
Q_TABLEVIEW_ASSERT(verticalAlignment, alignment);
- if (syncHorizontally) {
+ if (syncVertically) {
syncView->d_func()->positionViewAtRow(row, verticalAlignment, offset, subRect);
} else {
if (!scrollToRow(row, verticalAlignment, offset, subRect)) {
@@ -4570,7 +4572,7 @@ void QQuickTableViewPrivate::positionViewAtColumn(int column, Qt::Alignment alig
Qt::Alignment horizontalAlignment = alignment & (Qt::AlignLeft | Qt::AlignHCenter | Qt::AlignRight);
Q_TABLEVIEW_ASSERT(horizontalAlignment, alignment);
- if (syncVertically) {
+ if (syncHorizontally) {
syncView->d_func()->positionViewAtColumn(column, horizontalAlignment, offset, subRect);
} else {
if (!scrollToColumn(column, horizontalAlignment, offset, subRect)) {
diff --git a/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp b/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp
index c9385630d9..bf195a90b3 100644
--- a/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp
+++ b/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp
@@ -123,6 +123,10 @@ QRegion QSGAbstractSoftwareRenderer::optimizeRenderList()
// Objective is to update the dirty status and rects.
for (auto i = m_renderableNodes.rbegin(); i != m_renderableNodes.rend(); ++i) {
auto node = *i;
+ // Track the original version of isDirty() as it can change if
+ // when we subtract dirty regions but still need to mark the previously
+ // dirty region as dirty.
+ const bool wasDirty = node->isDirty();
if (!m_dirtyRegion.isEmpty()) {
// See if the current dirty regions apply to the current node
node->addDirtyRegion(m_dirtyRegion, true);
@@ -156,7 +160,11 @@ QRegion QSGAbstractSoftwareRenderer::optimizeRenderList()
// if isAlpha, add node's dirty rect to m_dirtyRegion
m_dirtyRegion += node->dirtyRegion();
}
- // if previousDirtyRegion has content outside of boundingRect add to m_dirtyRegion
+ }
+
+ if (wasDirty) {
+ // If this node started out dirty, make sure its previous region is
+ // added to the dirty region so that it gets cleared properly.
QRegion prevDirty = node->previousDirtyRegion();
if (!prevDirty.isNull())
m_dirtyRegion += prevDirty;
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
index 3d5a6c7705..9249b5377f 100644
--- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
+++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp
@@ -21,10 +21,6 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_DEBUG
-Q_QUICK_PRIVATE_EXPORT bool qsg_test_and_clear_material_failure();
-#endif
-
int qt_sg_envInt(const char *name, int defaultValue);
namespace QSGBatchRenderer
@@ -3173,19 +3169,6 @@ bool Renderer::prepareRenderMergedBatch(Batch *batch, PreparedRenderBatch *rende
if (directUpdatePtr)
batch->ubuf->endFullDynamicBufferUpdateForCurrentFrame();
-#ifndef QT_NO_DEBUG
- if (qsg_test_and_clear_material_failure()) {
- qDebug("QSGMaterial::updateState triggered an error (merged), batch will be skipped:");
- Element *ee = e;
- while (ee) {
- qDebug() << " -" << ee->node;
- ee = ee->nextInBatch;
- }
- QSGNodeDumper::dump(rootNode());
- qFatal("Aborting: scene graph is invalid...");
- }
-#endif
-
m_gstate.drawMode = QSGGeometry::DrawingMode(g->drawingMode());
m_gstate.lineWidth = g->lineWidth();
@@ -3381,16 +3364,6 @@ bool Renderer::prepareRenderUnmergedBatch(Batch *batch, PreparedRenderBatch *ren
QSGMaterialShader::RenderState renderState = state(QSGMaterialShader::RenderState::DirtyStates(int(dirty)));
updateMaterialDynamicData(sms, renderState, material, batch, e, ubufOffset, ubufSize, directUpdatePtr);
-#ifndef QT_NO_DEBUG
- if (qsg_test_and_clear_material_failure()) {
- qDebug("QSGMaterial::updateState() triggered an error (unmerged), batch will be skipped:");
- qDebug() << " - offending node is" << e->node;
- QSGNodeDumper::dump(rootNode());
- qFatal("Aborting: scene graph is invalid...");
- return false;
- }
-#endif
-
ubufOffset += aligned(ubufSize, m_ubufAlignment);
const QSGGeometry::DrawingMode prevDrawMode = m_gstate.drawMode;
diff --git a/src/quick/scenegraph/coreapi/qsgmaterial.cpp b/src/quick/scenegraph/coreapi/qsgmaterial.cpp
index 408cb0e1ff..bdb65c846c 100644
--- a/src/quick/scenegraph/coreapi/qsgmaterial.cpp
+++ b/src/quick/scenegraph/coreapi/qsgmaterial.cpp
@@ -6,21 +6,6 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_DEBUG
-bool qsg_material_failure = false;
-bool qsg_test_and_clear_material_failure()
-{
- bool fail = qsg_material_failure;
- qsg_material_failure = false;
- return fail;
-}
-
-void qsg_set_material_failure()
-{
- qsg_material_failure = true;
-}
-#endif
-
/*!
\group qtquick-scenegraph-materials
\title Qt Quick Scene Graph Material Classes
diff --git a/src/quick/scenegraph/coreapi/qsgnode.cpp b/src/quick/scenegraph/coreapi/qsgnode.cpp
index 8569f9d0fe..a0f7957752 100644
--- a/src/quick/scenegraph/coreapi/qsgnode.cpp
+++ b/src/quick/scenegraph/coreapi/qsgnode.cpp
@@ -7,6 +7,8 @@
#include "qsgnodeupdater_p.h"
#include "qsgmaterial.h"
+#include <algorithm>
+
#include "limits.h"
QT_BEGIN_NAMESPACE
@@ -1309,7 +1311,7 @@ const qreal OPACITY_THRESHOLD = 0.001;
void QSGOpacityNode::setOpacity(qreal opacity)
{
- opacity = qBound<qreal>(0, opacity, 1);
+ opacity = std::clamp(opacity, qreal(0.0), qreal(1.0));
if (m_opacity == opacity)
return;
DirtyState dirtyState = DirtyOpacity;
diff --git a/src/quick/scenegraph/qsgcontext.cpp b/src/quick/scenegraph/qsgcontext.cpp
index 7668db7a69..2e02713b93 100644
--- a/src/quick/scenegraph/qsgcontext.cpp
+++ b/src/quick/scenegraph/qsgcontext.cpp
@@ -142,7 +142,7 @@ public:
{
m_time = 0;
m_timer.start();
- m_wallTime.restart();
+ m_wallTime.start();
QAnimationDriver::start();
}
@@ -184,7 +184,7 @@ public:
if (m_lag > 10 && m_bad > 2) {
m_mode = TimerMode;
qCDebug(QSG_LOG_INFO, "animation driver switched to timer mode");
- m_wallTime.restart();
+ m_wallTime.start();
}
} else {
m_lag = 0;
@@ -265,7 +265,7 @@ public:
void start() override
{
- m_wallTime.restart();
+ m_wallTime.start();
QAnimationDriver::start();
}
diff --git a/src/quick/scenegraph/qsgrhilayer.cpp b/src/quick/scenegraph/qsgrhilayer.cpp
index 5299cb54ce..77ad687e61 100644
--- a/src/quick/scenegraph/qsgrhilayer.cpp
+++ b/src/quick/scenegraph/qsgrhilayer.cpp
@@ -115,7 +115,16 @@ void QSGRhiLayer::setSize(const QSize &pixelSize)
if (pixelSize == m_pixelSize)
return;
- m_pixelSize = pixelSize;
+ const int textureSizeMax = m_rhi->resourceLimit(QRhi::TextureSizeMax);
+ m_pixelSize = pixelSize.boundedTo(QSize(textureSizeMax, textureSizeMax));
+
+ if (Q_UNLIKELY(m_pixelSize != pixelSize)) {
+ qWarning("QSGRhiLayer: Unsupported size requested: [%d, %d]. "
+ "Maximum texture size: %d",
+ pixelSize.width(),
+ pixelSize.height(),
+ textureSizeMax);
+ }
if (m_live && m_pixelSize.isNull())
releaseResources();
diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
index 1b33ae8f39..d2a160c420 100644
--- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp
+++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp
@@ -234,8 +234,8 @@ public:
, stopEventProcessing(false)
{
sgrc = static_cast<QSGDefaultRenderContext *>(renderContext);
-#if (defined(Q_OS_QNX) && defined(Q_PROCESSOR_X86)) || defined(Q_OS_INTEGRITY)
- // The SDP 6.6.0 x86 MESA driver requires a larger stack than the default.
+#if defined(Q_OS_QNX) || defined(Q_OS_INTEGRITY)
+ // The render thread requires a larger stack than the default (256k).
setStackSize(1024 * 1024);
#endif
}
diff --git a/src/quick/util/qquickforeignutils.cpp b/src/quick/util/qquickforeignutils.cpp
index 2dfe9fb5aa..34b3225abe 100644
--- a/src/quick/util/qquickforeignutils.cpp
+++ b/src/quick/util/qquickforeignutils.cpp
@@ -40,7 +40,7 @@ QT_BEGIN_NAMESPACE
\li \l point \c eventPoint.scenePosition: see also \l QEventPoint::scenePosition
\li \l ulong \c eventPoint.pressTimestamp: see also \l QEventPoint::pressTimestamp
\li \l point \c eventPoint.scenePressPosition: see also \l QEventPoint::scenePressPosition
- \li \l enumeration \c eventPoint.state: see also \l QEventPoint::state
+ \li \l {QML Enumerations}{enumeration} \c eventPoint.state: see also \l QEventPoint::state
\li \l real \c eventPoint.timeHeld: see also \l QEventPoint::timeHeld
\li \l ulong \c eventPoint.timestamp: see also \l QEventPoint::timestamp
\li \l pointingDeviceUniqueId \c eventPoint.uniqueId: see also \l QEventPoint::uniqueId
diff --git a/src/quick/util/qquickpath.cpp b/src/quick/util/qquickpath.cpp
index 7562b74d46..17529317d5 100644
--- a/src/quick/util/qquickpath.cpp
+++ b/src/quick/util/qquickpath.cpp
@@ -1982,6 +1982,8 @@ void QQuickPathArc::addToPath(QPainterPath &path, const QQuickPathData &data)
{
const QPointF &startPoint = path.currentPosition();
const QPointF &endPoint = positionForCurve(data, startPoint);
+ if (startPoint == endPoint)
+ return;
QQuickSvgParser::pathArc(path,
_radiusX,
_radiusY,