diff options
author | Jason Barron <jason.barron@nokia.com> | 2010-07-30 09:38:37 (GMT) |
---|---|---|
committer | Jason Barron <jason.barron@nokia.com> | 2010-07-30 12:22:15 (GMT) |
commit | 9a059c53caaf19cd2ff722df6e47870a2843ee43 (patch) | |
tree | 427b1d97c4e0b4654dc273b7384e50589f140573 | |
parent | f1257358b4432abf874460f58cba73bce17981ab (diff) | |
download | Qt-9a059c53caaf19cd2ff722df6e47870a2843ee43.zip Qt-9a059c53caaf19cd2ff722df6e47870a2843ee43.tar.gz Qt-9a059c53caaf19cd2ff722df6e47870a2843ee43.tar.bz2 |
Fix proxy widgets with the OpenVG paint engine.
Proxy widgets use the shared painter functionality and this implies
that the paint engine's begin function does not get called for each new
widget that gets painted. This causes a problem because the system clip
gets modified by QPainter, but the paint engine does not realize that
this happened and fails to use the new clip. The result is that you can
end up painting outside the intended clip area.
The fix is to reimplement the virtual systemStateChanged() function in
QVGPaintEnginePrivate and make it call updateScissor() to re-evaluate
the clipping flags and update the current clip accordingly.
A similar fix was done to the OpenGL paint engine way back in 307c2954.
Task-number: QTBUG-12486
Reviewed-by: Rhys Weatherley
-rw-r--r-- | src/openvg/qpaintengine_vg.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index 7de09ce..e368c32 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -120,6 +120,7 @@ private: class QVGPaintEnginePrivate : public QPaintEngineExPrivate { + Q_DECLARE_PUBLIC(QVGPaintEngine) public: // Extra blending modes from VG_KHR_advanced_blending extension. // Use the QT_VG prefix to avoid conflicts with any definitions @@ -150,7 +151,7 @@ public: QT_VG_BLEND_XOR_KHR = 0x2026 }; - QVGPaintEnginePrivate(); + QVGPaintEnginePrivate(QVGPaintEngine *q_ptr); ~QVGPaintEnginePrivate(); void init(); @@ -171,6 +172,7 @@ public: void setBrushTransform(const QBrush& brush, VGMatrixMode mode); void setupColorRamp(const QGradient *grad, VGPaint paint); void setImageOptions(); + void systemStateChanged(); #if !defined(QVG_SCISSOR_CLIP) void ensureMask(QVGPaintEngine *engine, int width, int height); void modifyMask @@ -299,6 +301,9 @@ public: // Clear all lazily-set modes. void clearModes(); + +private: + QVGPaintEngine *q; }; inline void QVGPaintEnginePrivate::setImageMode(VGImageMode mode) @@ -350,7 +355,7 @@ void QVGPaintEnginePrivate::clearModes() imageQuality = (VGImageQuality)0; } -QVGPaintEnginePrivate::QVGPaintEnginePrivate() +QVGPaintEnginePrivate::QVGPaintEnginePrivate(QVGPaintEngine *q_ptr) : q(q_ptr) { init(); } @@ -1452,7 +1457,7 @@ QVGPainterState::~QVGPainterState() } QVGPaintEngine::QVGPaintEngine() - : QPaintEngineEx(*new QVGPaintEnginePrivate) + : QPaintEngineEx(*new QVGPaintEnginePrivate(this)) { } @@ -2995,6 +3000,11 @@ void QVGPaintEnginePrivate::setImageOptions() } } +void QVGPaintEnginePrivate::systemStateChanged() +{ + q->updateScissor(); +} + static void drawVGImage(QVGPaintEnginePrivate *d, const QRectF& r, VGImage vgImg, const QSize& imageSize, const QRectF& sr) |