summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Rauter <matthias.rauter@qt.io>2024-03-11 12:31:46 +0100
committerMatthias Rauter <matthias.rauter@qt.io>2024-03-15 16:35:09 +0100
commit0e21fd0ee2dde8e5c928d9428b560ea693c2bef8 (patch)
tree566c2f2b09ac434c7aa6d7c23d9a4691ca96da51 /src
parent247453e7d5c84837b80444c26b1afd6165f63477 (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.cpp19
-rw-r--r--src/svg/qsvgstructure_p.h2
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: