summaryrefslogtreecommitdiffstats
path: root/src/openvg
diff options
context:
space:
mode:
authorJason Barron <jason.barron@nokia.com>2010-07-30 09:38:37 (GMT)
committerJason Barron <jason.barron@nokia.com>2010-07-30 12:22:15 (GMT)
commit9a059c53caaf19cd2ff722df6e47870a2843ee43 (patch)
tree427b1d97c4e0b4654dc273b7384e50589f140573 /src/openvg
parentf1257358b4432abf874460f58cba73bce17981ab (diff)
downloadQt-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
Diffstat (limited to 'src/openvg')
-rw-r--r--src/openvg/qpaintengine_vg.cpp16
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)