diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 33fde8c61a..6336b2943e 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -698,6 +698,11 @@ void QRasterPaintEngine::setState(QPainterState *s) { Q_D(QRasterPaintEngine); QPaintEngineEx::setState(s); + QRasterPaintEngineState *t = state(); + if (t->clip && t->clip->enabled != t->clipEnabled) { + // Since we do not "detach" clipdata when changing only enabled state, we need to resync state here + t->clip->enabled = t->clipEnabled; + } d->rasterBuffer->compositionMode = s->composition_mode; } diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp index 8dfaa6f5cd..ba405e2860 100644 --- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp +++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp @@ -153,6 +153,7 @@ private slots: void setEqualClipRegionAndPath(); void clipRectSaveRestore(); + void clipStateSaveRestore(); void clippedFillPath_data(); void clippedFillPath(); @@ -3425,6 +3426,35 @@ void tst_QPainter::clipRectSaveRestore() QCOMPARE(img.pixel(0, 0), QColor(Qt::black).rgba()); } +void tst_QPainter::clipStateSaveRestore() +{ + QImage img(16, 16, QImage::Format_RGB32); + img.fill(Qt::blue); + { + QPainter p(&img); + p.setClipRect(QRect(5, 5, 10, 10)); + p.save(); + p.setClipping(false); + p.restore(); + p.fillRect(0, 0, 16, 16, Qt::red); + p.end(); + QCOMPARE(img.pixel(0, 0), QColor(Qt::blue).rgb()); + } + + img.fill(Qt::blue); + { + QPainter p(&img); + p.setClipRect(QRect(5, 5, 10, 10)); + p.setClipping(false); + p.save(); + p.setClipping(true); + p.restore(); + p.fillRect(0, 0, 16, 16, Qt::red); + p.end(); + QCOMPARE(img.pixel(0, 0), QColor(Qt::red).rgb()); + } +} + void tst_QPainter::clippedImage() { QImage img(16, 16, QImage::Format_ARGB32_Premultiplied);