diff options
Diffstat (limited to 'src/gui/painting')
-rw-r--r-- | src/gui/painting/qpaintengine_raster.cpp | 37 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine_raster_p.h | 2 | ||||
-rw-r--r-- | src/gui/painting/qpainter.cpp | 2 |
3 files changed, 41 insertions, 0 deletions
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 76489da0b4..845291b61b 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 ®ion, Qt::ClipOperation op) else if (curClip->hasRegionClip) newClip->setClipRegion(r & curClip->clipRegion); + newClip->clipTransform = s->matrix; qrasterpaintengine_dirty_clip(d, s); } } @@ -3701,6 +3707,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 e5caf0813b..0ebc6253db 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -2844,6 +2844,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; } @@ -3057,6 +3058,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; } |