summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChen Bin <chenbin@uniontech.com>2021-10-08 14:42:33 +0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-10-27 12:55:41 +0000
commit5e4adb9fdab99749e3e75d8dc706ba6a0366f18d (patch)
tree27793668db3727ea1142dfc1bd944305f2eedef7 /src
parent97cba363f99bec3174e305a714d4cdcabb147838 (diff)
Update clipping area when antialiasing changes
Antialiasing is disabled when the painter's antialiasing attribute is set behind the clipping function(example `setClipPath` or `setClipRegion`). The cause of this problem is that the antialiasing state of the clipping region is not updated after the antialiasing attribute is set. A variable is required to record the painter's transformation state set before the clipping function, because the transformation will be applied to the clipping region, resulting in the abnormal clipping region. The value of `s->matrix` is not accurate for the clipping fun- ction. Fixes: QTBUG-97269 Change-Id: I409a9db32efc3b991ebb97ec9aed19bbddb273d8 Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io> (cherry picked from commit 6de36918c03e91933fbfb5bf7b53abbe03edf460) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp37
-rw-r--r--src/gui/painting/qpaintengine_raster_p.h2
-rw-r--r--src/gui/painting/qpainter.cpp2
3 files changed, 41 insertions, 0 deletions
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 78f1d5cd01..adda85ad9d 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -882,6 +882,9 @@ void QRasterPaintEngine::renderHintsChanged()
Q_D(QRasterPaintEngine);
d->recalculateFastImages();
+
+ if (was_aa != s->flags.antialiased)
+ d->updateClipping();
}
/*!
@@ -1245,6 +1248,7 @@ void QRasterPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op)
ensureOutlineMapper();
d->rasterize(d->outlineMapper->convertPath(path), qt_span_clip, &clipData, nullptr);
+ newClip->clipTransform = s->matrix;
newClip->fixup();
if (s->flags.has_clip_ownership)
@@ -1329,6 +1333,7 @@ bool QRasterPaintEngine::setClipRectInDeviceCoords(const QRect &r, Qt::ClipOpera
return false;
}
+ s->clip->clipTransform = s->matrix;
qrasterpaintengine_dirty_clip(d, s);
return true;
}
@@ -1384,6 +1389,7 @@ void QRasterPaintEngine::clip(const QRegion &region, Qt::ClipOperation op)
else if (curClip->hasRegionClip)
newClip->setClipRegion(r & curClip->clipRegion);
+ newClip->clipTransform = s->matrix;
qrasterpaintengine_dirty_clip(d, s);
}
}
@@ -3699,6 +3705,37 @@ void QRasterPaintEnginePrivate::rasterize(QT_FT_Outline *outline,
free(rasterPoolOnHeap);
}
+void QRasterPaintEnginePrivate::updateClipping()
+{
+ Q_Q(QRasterPaintEngine);
+ QRasterPaintEngineState *s = q->state();
+
+ if (!s->clipEnabled)
+ return;
+
+ bool noClipPath = s->clipPath.isEmpty();
+ bool noClipRegion = s->clipRegion.isEmpty();
+
+ if (noClipPath && noClipRegion)
+ return;
+
+ if (!s->clip)
+ return;
+
+ const QTransform stateTransform = s->matrix;
+ s->matrix = s->clip->clipTransform;
+
+ qrasterpaintengine_state_setNoClip(s);
+
+ if (noClipRegion) {
+ q->clip(qtVectorPathForPath(s->clipPath), s->clipOperation);
+ } else {
+ q->clip(s->clipRegion, s->clipOperation);
+ }
+
+ s->matrix = stateTransform;
+}
+
void QRasterPaintEnginePrivate::recalculateFastImages()
{
Q_Q(QRasterPaintEngine);
diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h
index d25fe4c3b3..9751eb3da8 100644
--- a/src/gui/painting/qpaintengine_raster_p.h
+++ b/src/gui/painting/qpaintengine_raster_p.h
@@ -276,6 +276,7 @@ public:
void rasterize(QT_FT_Outline *outline, ProcessSpans callback, QSpanData *spanData, QRasterBuffer *rasterBuffer);
void rasterize(QT_FT_Outline *outline, ProcessSpans callback, void *userData, QRasterBuffer *rasterBuffer);
void updateMatrixData(QSpanData *spanData, const QBrush &brush, const QTransform &brushMatrix);
+ void updateClipping();
void systemStateChanged() override;
@@ -374,6 +375,7 @@ public:
QRect clipRect;
QRegion clipRegion;
+ QTransform clipTransform;
uint enabled : 1;
uint hasRectClip : 1;
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 67f6124da5..13ae30433c 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -2868,6 +2868,7 @@ void QPainter::setClipRegion(const QRegion &r, Qt::ClipOperation op)
d->state->clipInfo.clear();
d->state->clipInfo.append(QPainterClipInfo(r, op, d->state->matrix));
d->state->clipOperation = op;
+ d->state->clipRegion = r;
return;
}
@@ -3081,6 +3082,7 @@ void QPainter::setClipPath(const QPainterPath &path, Qt::ClipOperation op)
d->state->clipInfo.clear();
d->state->clipInfo.append(QPainterClipInfo(path, op, d->state->matrix));
d->state->clipOperation = op;
+ d->state->clipPath = path;
return;
}