diff options
author | Jani Hautakangas <jani.hautakangas@nokia.com> | 2011-02-10 20:28:12 (GMT) |
---|---|---|
committer | Jason McDonald <jason.mcdonald@nokia.com> | 2011-02-16 11:59:36 (GMT) |
commit | 8e2018e5af72347b4c068da735e307aee8596e80 (patch) | |
tree | b991b654c3027face4ccc5476b2d89bf1ca88bac | |
parent | 079f85dc421dc13d26f70851ecf4c360c3b6c93d (diff) | |
download | Qt-8e2018e5af72347b4c068da735e307aee8596e80.zip Qt-8e2018e5af72347b4c068da735e307aee8596e80.tar.gz Qt-8e2018e5af72347b4c068da735e307aee8596e80.tar.bz2 |
Fix for clipping failure in OpenVG paint engine.
OpenVG implementation for Broadcom chip has limited scissor rect
count to 32. Because of that Qt OpenVG paint engine fails to clip
correctly if clip rect count exceeds 32. This patch makes Qt
OpenVG paint engine to use mask instead of scissors in such cases.
Task-number: QTBUG-16932
Reviewed-by: Jason Barron
(cherry picked from commit 0a84c39a92c4d4d7f2a5e19e949116df24219aa1)
-rw-r--r-- | src/openvg/qpaintengine_vg.cpp | 35 | ||||
-rw-r--r-- | src/openvg/qwindowsurface_vgegl.cpp | 3 |
2 files changed, 33 insertions, 5 deletions
diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index 09cbc36..488f273 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -2201,6 +2201,12 @@ void QVGPaintEngine::updateScissor() #if defined(QVG_SCISSOR_CLIP) // Using the scissor to do clipping, so combine the systemClip // with the current painting clipRegion. + + if (d->maskValid) { + vgSeti(VG_MASKING, VG_FALSE); + d->maskValid = false; + } + QVGPainterState *s = state(); if (s->clipEnabled) { if (region.isEmpty()) @@ -2250,8 +2256,33 @@ void QVGPaintEngine::updateScissor() QVector<QRect> rects = region.rects(); int count = rects.count(); - if (count > d->maxScissorRects) - count = d->maxScissorRects; + if (count > d->maxScissorRects) { +#if !defined(QVG_SCISSOR_CLIP) + count = d->maxScissorRects; +#else + // Use masking + int width = paintDevice()->width(); + int height = paintDevice()->height(); + vgMask(VG_INVALID_HANDLE, VG_CLEAR_MASK, + 0, 0, width, height); + for (int i = 0; i < rects.size(); ++i) { + vgMask(VG_INVALID_HANDLE, VG_FILL_MASK, + rects[i].x(), height - rects[i].y() - rects[i].height(), + rects[i].width(), rects[i].height()); + } + + vgSeti(VG_SCISSORING, VG_FALSE); + vgSeti(VG_MASKING, VG_TRUE); + d->maskValid = true; + d->maskIsSet = false; + d->scissorMask = false; + d->scissorActive = false; + d->scissorDirty = false; + d->scissorRegion = region; + return; +#endif + } + QVarLengthArray<VGint> params(count * 4); int height = paintDevice()->height(); for (int i = 0; i < count; ++i) { diff --git a/src/openvg/qwindowsurface_vgegl.cpp b/src/openvg/qwindowsurface_vgegl.cpp index c6db869..ca80886 100644 --- a/src/openvg/qwindowsurface_vgegl.cpp +++ b/src/openvg/qwindowsurface_vgegl.cpp @@ -267,10 +267,7 @@ static QEglContext *createContext(QPaintDevice *device) int redSize = configProps.value(EGL_RED_SIZE); if (redSize == EGL_DONT_CARE || redSize == 0) configProps.setPixelFormat(QImage::Format_ARGB32); // XXX -#ifndef QVG_SCISSOR_CLIP - // If we are using the mask to clip, then explicitly request a mask. configProps.setValue(EGL_ALPHA_MASK_SIZE, 1); -#endif #ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT configProps.setValue(EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_VG_ALPHA_FORMAT_PRE_BIT); |