diff options
author | Matthias Rauter <matthias.rauter@qt.io> | 2024-03-11 12:31:46 +0100 |
---|---|---|
committer | Matthias Rauter <matthias.rauter@qt.io> | 2024-03-15 16:35:09 +0100 |
commit | 0e21fd0ee2dde8e5c928d9428b560ea693c2bef8 (patch) | |
tree | 566c2f2b09ac434c7aa6d7c23d9a4691ca96da51 /src | |
parent | 247453e7d5c84837b80444c26b1afd6165f63477 (diff) |
Propagate states correctly in <pattern> element
There was a missconseption about the propagation of states in the
<pattern>, similar as in the <mask>, that was partially responsible
for QTBUG-123010.
This change applies the correction to the <pattern> element.
Pick-to: 6.7 6.7.0
Change-Id: I63bef1cef287b9d94133b299c9f68665dc1ac02c
Reviewed-by: Hatem ElKharashy <hatem.elkharashy@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/svg/qsvgstructure.cpp | 19 | ||||
-rw-r--r-- | src/svg/qsvgstructure_p.h | 2 |
2 files changed, 9 insertions, 12 deletions
diff --git a/src/svg/qsvgstructure.cpp b/src/svg/qsvgstructure.cpp index 01fe1f5..2ed6a70 100644 --- a/src/svg/qsvgstructure.cpp +++ b/src/svg/qsvgstructure.cpp @@ -863,7 +863,7 @@ QImage QSvgPattern::patternImage(QPainter *p, QSvgExtraStates &states, const QSv imageSize.setHeight(qCeil(patternBoundingBox.height() * t.m22() * m_transform.m22())); calculateAppliedTransform(t, peBoundingBox, imageSize); - return renderPattern(p, imageSize, contentScaleFactorX, contentScaleFactorY); + return renderPattern(imageSize, contentScaleFactorX, contentScaleFactorY); } QSvgNode::Type QSvgPattern::type() const @@ -871,7 +871,7 @@ QSvgNode::Type QSvgPattern::type() const return Pattern; } -QImage QSvgPattern::renderPattern(QPainter *p, QSize size, qreal contentScaleX, qreal contentScaleY) +QImage QSvgPattern::renderPattern(QSize size, qreal contentScaleX, qreal contentScaleY) { if (size.isEmpty() || !qIsFinite(contentScaleX) || !qIsFinite(contentScaleY)) return defaultPattern(); @@ -886,11 +886,10 @@ QImage QSvgPattern::renderPattern(QPainter *p, QSize size, qreal contentScaleX, // Draw the pattern using our QPainter. QPainter patternPainter(&pattern); - patternPainter.setRenderHints(p->renderHints()); - QPen pen(Qt::NoBrush, 1, Qt::SolidLine, Qt::FlatCap, Qt::SvgMiterJoin); - pen.setMiterLimit(4); - patternPainter.setPen(pen); - patternPainter.setBrush(Qt::black); + QSvgExtraStates patternStates; + initPainter(&patternPainter); + applyStyleRecursive(&patternPainter, patternStates); + patternPainter.resetTransform(); // According to the <pattern> definition, if viewBox exists then patternContentUnits // is ignored @@ -901,10 +900,8 @@ QImage QSvgPattern::renderPattern(QPainter *p, QSize size, qreal contentScaleX, // Draw all this Pattern children nodes with our QPainter, // no need to use any Extra States - QSvgExtraStates states2; - for (QSvgNode *node : m_renderers) { - node->draw(&patternPainter, states2); - } + for (QSvgNode *node : m_renderers) + node->draw(&patternPainter, patternStates); return pattern; } diff --git a/src/svg/qsvgstructure_p.h b/src/svg/qsvgstructure_p.h index c5b4014..fc08f8d 100644 --- a/src/svg/qsvgstructure_p.h +++ b/src/svg/qsvgstructure_p.h @@ -210,7 +210,7 @@ public: const QTransform& appliedTransform() const { return m_appliedTransform; } private: - QImage renderPattern(QPainter *p, QSize size, qreal contentScaleX, qreal contentScaleY); + QImage renderPattern(QSize size, qreal contentScaleX, qreal contentScaleY); void calculateAppliedTransform(QTransform& worldTransform, QRectF peLocalBB, QSize imageSize); private: |