aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMagdalena Stojek <[email protected]>2025-03-20 09:44:20 +0100
committerMagdalena Stojek <[email protected]>2025-04-25 18:52:11 +0200
commit32c8d7f9da04f40eebee04915d0861ce3084a4e5 (patch)
treecc83bf96853af3fce71ebf225a7260d526814dc2
parent81b21b475d20083a95f0d173c7f4086745bec219 (diff)
QQuickPathRectangle: Merge corner radius and bevel flags into a bitset
Replace separate storage for corner radius and bevel with a single 8-bit field cornerProperties. The first 4 bits track radius flags, and the next 4 track bevel flags. Fixes: QTBUG-134908 Change-Id: Ie2d706112965fc5dde07fa698e32e29695da219b Reviewed-by: Shawn Rutledge <[email protected]> Reviewed-by: Eirik Aavitsland <[email protected]>
-rw-r--r--src/quick/util/qquickpath.cpp52
-rw-r--r--src/quick/util/qquickpath_p.h13
-rw-r--r--tests/auto/quick/qquickpath/tst_qquickpath.cpp66
3 files changed, 104 insertions, 27 deletions
diff --git a/src/quick/util/qquickpath.cpp b/src/quick/util/qquickpath.cpp
index c122d74f6d..6909ab7a72 100644
--- a/src/quick/util/qquickpath.cpp
+++ b/src/quick/util/qquickpath.cpp
@@ -2486,13 +2486,13 @@ void QQuickPathRectangle::setRadius(qreal newRadius)
return;
_extra->radius = newRadius;
emit radiusChanged();
- if (!(_extra->isCornerRadiusSet & (1 << Qt::TopLeftCorner)))
+ if (!(_extra->isRadiusSet(Qt::TopLeftCorner)))
emit topLeftRadiusChanged();
- if (!(_extra->isCornerRadiusSet & (1 << Qt::TopRightCorner)))
+ if (!(_extra->isRadiusSet(Qt::TopRightCorner)))
emit topRightRadiusChanged();
- if (!(_extra->isCornerRadiusSet & (1 << Qt::BottomLeftCorner)))
+ if (!(_extra->isRadiusSet(Qt::BottomLeftCorner)))
emit bottomLeftRadiusChanged();
- if (!(_extra->isCornerRadiusSet & (1 << Qt::BottomRightCorner)))
+ if (!(_extra->isRadiusSet(Qt::BottomRightCorner)))
emit bottomRightRadiusChanged();
emit changed();
}
@@ -2504,7 +2504,7 @@ void QQuickPathRectangle::setRadius(qreal newRadius)
qreal QQuickPathRectangle::cornerRadius(Qt::Corner corner) const
{
if (_extra.isAllocated())
- return (_extra->isCornerRadiusSet & (1 << corner)) ? _extra->cornerRadii[corner] : _extra->radius;
+ return (_extra->isRadiusSet(corner)) ? _extra->cornerRadii[corner] : _extra->radius;
else
return 0;
}
@@ -2512,19 +2512,19 @@ qreal QQuickPathRectangle::cornerRadius(Qt::Corner corner) const
void QQuickPathRectangle::setCornerRadius(Qt::Corner corner, qreal newCornerRadius)
{
if (_extra.value().cornerRadii[corner] == newCornerRadius
- && (_extra->isCornerRadiusSet & (1 << corner)))
+ && (_extra->isRadiusSet(corner)))
return;
_extra->cornerRadii[corner] = newCornerRadius;
- _extra->isCornerRadiusSet |= (1 << corner);
+ _extra->cornerProperties |= (1 << corner);
emitCornerRadiusChanged(corner);
}
void QQuickPathRectangle::resetCornerRadius(Qt::Corner corner)
{
- if (!_extra.isAllocated() || !(_extra->isCornerRadiusSet & (1 << corner)))
+ if (!_extra.isAllocated() || !(_extra->isRadiusSet(corner)))
return;
- _extra->isCornerRadiusSet &= ~(1 << corner);
+ _extra->cornerProperties &= ~(1 << corner);
emitCornerRadiusChanged(corner);
}
@@ -2556,22 +2556,26 @@ void QQuickPathRectangle::emitCornerRadiusChanged(Qt::Corner corner)
bool QQuickPathRectangle::hasBevel() const
{
- return _extra.isAllocated() ? _extra->bevel : 0;
+ return _extra.isAllocated() ? (_extra->cornerProperties & (1 << 8)) != 0 : false;
}
void QQuickPathRectangle::setBevel(bool bevel)
{
- if (_extra.value().bevel == bevel)
+ if (((_extra.value().cornerProperties & (1 << 8)) != 0) == bevel)
return;
- _extra->bevel = bevel;
+ if (bevel)
+ _extra->cornerProperties |= (1 << 8);
+ else
+ _extra->cornerProperties &= ~(1 << 8);
+
emit bevelChanged();
- if (!_extra->cornerBevel[Qt::TopLeftCorner].has_value())
+ if (!(_extra->isBevelSet(Qt::TopLeftCorner)))
emit topLeftBevelChanged();
- if (!_extra->cornerBevel[Qt::TopRightCorner].has_value())
+ if (!(_extra->isBevelSet(Qt::TopRightCorner)))
emit topRightBevelChanged();
- if (!_extra->cornerBevel[Qt::BottomLeftCorner].has_value())
+ if (!(_extra->isBevelSet(Qt::BottomLeftCorner)))
emit bottomLeftBevelChanged();
- if (!_extra->cornerBevel[Qt::BottomRightCorner].has_value())
+ if (!(_extra->isBevelSet(Qt::BottomRightCorner)))
emit bottomRightBevelChanged();
emit changed();
}
@@ -2583,24 +2587,28 @@ void QQuickPathRectangle::setBevel(bool bevel)
bool QQuickPathRectangle::cornerBevel(Qt::Corner corner) const
{
if (_extra.isAllocated())
- return !_extra->cornerBevel[corner].has_value() ? _extra->bevel : _extra->cornerBevel[corner].value();
+ return _extra->isBevelSet(corner);
else
return false;
}
void QQuickPathRectangle::setCornerBevel(Qt::Corner corner, bool newCornerBevel)
{
- if (_extra.value().cornerBevel[corner] == newCornerBevel)
+ if ((_extra.value().isBevelSet(corner)) == newCornerBevel)
return;
- _extra->cornerBevel[corner] = newCornerBevel;
+ if (!newCornerBevel) {
+ resetCornerBevel(corner);
+ return;
+ }
+ _extra->cornerProperties |= (1 << (corner + 4));
emitCornerBevelChanged(corner);
}
void QQuickPathRectangle::resetCornerBevel(Qt::Corner corner)
{
- if (!_extra.isAllocated() || !_extra->cornerBevel[corner].has_value())
+ if (!_extra.isAllocated() || !(_extra->isBevelSet(corner)))
return;
- _extra->cornerBevel[corner].reset();
+ _extra->cornerProperties &= ~(1 << (corner + 4));
emitCornerBevelChanged(corner);
}
@@ -2641,7 +2649,7 @@ void QQuickPathRectangle::addToPath(QPainterPath &path, const QQuickPathData &da
const qreal generalDiameter = qMax(qreal(0), qMin(maxDiameter, 2 * _extra->radius));
auto effectiveDiameter = [&](Qt::Corner corner) {
qreal radius = _extra->cornerRadii[corner];
- return (_extra->isCornerRadiusSet & ( 1 << corner)) ? qMin(maxDiameter, 2 * radius) : generalDiameter;
+ return (_extra->isRadiusSet(corner)) ? qMin(maxDiameter, 2 * radius) : generalDiameter;
};
const qreal diamTL = effectiveDiameter(Qt::TopLeftCorner);
const qreal diamTR = effectiveDiameter(Qt::TopRightCorner);
diff --git a/src/quick/util/qquickpath_p.h b/src/quick/util/qquickpath_p.h
index 6f2b63e336..f4086925ab 100644
--- a/src/quick/util/qquickpath_p.h
+++ b/src/quick/util/qquickpath_p.h
@@ -511,14 +511,17 @@ private:
{
ExtraData() {
std::fill_n(cornerRadii, 4, 0);
- std::fill_n(cornerBevel, 4, std::optional<bool>());
- isCornerRadiusSet = 0;
+ cornerProperties = 0;
}
qreal radius = 0;
qreal cornerRadii[4];
- unsigned isCornerRadiusSet : 4;
- bool bevel = false;
- std::optional<bool> cornerBevel[4];
+ unsigned cornerProperties :9;
+ inline bool isRadiusSet(Qt::Corner corner) {
+ return cornerProperties & (1 << corner);
+ };
+ inline bool isBevelSet(Qt::Corner corner) {
+ return cornerProperties & (1 << (corner + 4));
+ };
};
QLazilyAllocated<ExtraData> _extra;
};
diff --git a/tests/auto/quick/qquickpath/tst_qquickpath.cpp b/tests/auto/quick/qquickpath/tst_qquickpath.cpp
index 9b6aeed2ab..3c0c706990 100644
--- a/tests/auto/quick/qquickpath/tst_qquickpath.cpp
+++ b/tests/auto/quick/qquickpath/tst_qquickpath.cpp
@@ -28,6 +28,7 @@ private slots:
void rectangleRadii();
void appendRemove();
void asynchronous();
+ void cornerProperties();
private:
void arc(QSizeF scale);
@@ -484,6 +485,71 @@ void tst_QuickPath::asynchronous()
QCOMPARE(changedSpy.count(), 1);
}
+void tst_QuickPath::cornerProperties()
+{
+ QQuickPathRectangle pathRectangle;
+
+ // Bevel
+ QVERIFY(!pathRectangle.hasBevel());
+ QCOMPARE(pathRectangle.hasTopLeftBevel(), false);
+ QCOMPARE(pathRectangle.hasTopRightBevel(), false);
+ QCOMPARE(pathRectangle.hasBottomLeftBevel(), false);
+ QCOMPARE(pathRectangle.hasBottomRightBevel(), false);
+
+ pathRectangle.setBevel(true);
+ QVERIFY(pathRectangle.hasBevel());
+ QCOMPARE(pathRectangle.hasTopLeftBevel(), false);
+ QCOMPARE(pathRectangle.hasTopRightBevel(), false);
+ QCOMPARE(pathRectangle.hasBottomLeftBevel(), false);
+ QCOMPARE(pathRectangle.hasBottomRightBevel(), false);
+
+ pathRectangle.setBottomLeftBevel(true);
+ QCOMPARE(pathRectangle.hasTopLeftBevel(), false);
+ QCOMPARE(pathRectangle.hasTopRightBevel(), false);
+ QCOMPARE(pathRectangle.hasBottomLeftBevel(), true);
+ QCOMPARE(pathRectangle.hasBottomRightBevel(), false);
+
+ pathRectangle.setBottomLeftBevel(false);
+ pathRectangle.setTopRightBevel(true);
+ QCOMPARE(pathRectangle.hasTopLeftBevel(), false);
+ QCOMPARE(pathRectangle.hasTopRightBevel(), true);
+ QCOMPARE(pathRectangle.hasBottomLeftBevel(), false);
+ QCOMPARE(pathRectangle.hasBottomRightBevel(), false);
+
+ pathRectangle.resetTopRightBevel();
+ QCOMPARE(pathRectangle.hasTopRightBevel(), false);
+ QCOMPARE(pathRectangle.hasTopLeftBevel(), false);
+ QCOMPARE(pathRectangle.hasBottomLeftBevel(), false);
+ QCOMPARE(pathRectangle.hasBottomRightBevel(), false);
+
+ // Radius
+ pathRectangle.setRadius(10.0);
+ QCOMPARE(pathRectangle.radius(), 10.0);
+ QCOMPARE(pathRectangle.topRightRadius(), 10.0);
+ QCOMPARE(pathRectangle.topLeftRadius(), 10.0);
+ QCOMPARE(pathRectangle.bottomLeftRadius(), 10.0);
+ QCOMPARE(pathRectangle.bottomRightRadius(), 10.0);
+
+ pathRectangle.setTopRightRadius(3.0);
+ QCOMPARE(pathRectangle.topRightRadius(), 3.0);
+ QCOMPARE(pathRectangle.radius(), 10.0);
+ QCOMPARE(pathRectangle.topLeftRadius(), 10.0);
+ QCOMPARE(pathRectangle.bottomLeftRadius(), 10.0);
+ QCOMPARE(pathRectangle.bottomRightRadius(), 10.0);
+
+ pathRectangle.setRadius(0.0);
+ QCOMPARE(pathRectangle.topRightRadius(), 3.0);
+ QCOMPARE(pathRectangle.topLeftRadius(), 0.0);
+ QCOMPARE(pathRectangle.bottomLeftRadius(), 0.0);
+ QCOMPARE(pathRectangle.bottomRightRadius(), 0.0);
+
+ pathRectangle.resetTopRightRadius();
+ QCOMPARE(pathRectangle.topRightRadius(), 0.0);
+ QCOMPARE(pathRectangle.topLeftRadius(), 0.0);
+ QCOMPARE(pathRectangle.bottomLeftRadius(), 0.0);
+ QCOMPARE(pathRectangle.bottomRightRadius(), 0.0);
+}
+
QTEST_MAIN(tst_QuickPath)
#include "tst_qquickpath.moc"