diff options
author | Magdalena Stojek <[email protected]> | 2025-03-20 09:44:20 +0100 |
---|---|---|
committer | Magdalena Stojek <[email protected]> | 2025-04-25 18:52:11 +0200 |
commit | 32c8d7f9da04f40eebee04915d0861ce3084a4e5 (patch) | |
tree | cc83bf96853af3fce71ebf225a7260d526814dc2 | |
parent | 81b21b475d20083a95f0d173c7f4086745bec219 (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.cpp | 52 | ||||
-rw-r--r-- | src/quick/util/qquickpath_p.h | 13 | ||||
-rw-r--r-- | tests/auto/quick/qquickpath/tst_qquickpath.cpp | 66 |
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" |