summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Bakken <anders.bakken@nokia.com>2009-04-28 03:36:29 (GMT)
committerAnders Bakken <anders.bakken@nokia.com>2009-04-28 20:12:05 (GMT)
commit2e9071afbf86ca3143552a3eed75418328b5ce6c (patch)
tree37e15cca39c2fc9b32de956306d9b31956210a65
parentde14db188ada5e00980a152dadb13d38438a7fa2 (diff)
downloadQt-2e9071afbf86ca3143552a3eed75418328b5ce6c.zip
Qt-2e9071afbf86ca3143552a3eed75418328b5ce6c.tar.gz
Qt-2e9071afbf86ca3143552a3eed75418328b5ce6c.tar.bz2
Added an option for ignoring the system clip
This is currently the only way I can make QGraphicsView not have to fall back to the raster engine for all operations. It seems the QRegion passed to the paintEvent of QGraphicsView also is set as the systemClip which in the end makes the QRasterPaintEngine's clipRegion equal the systemClip. By exporting QWS_DISPLAY=directfb:ignoresystemclip you can now draw without having a complex clip and therefore take advantage of hw acceleration with DirectFB. Reviewed-By: Donald <qt-info@nokia.com>
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp23
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp9
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.h1
3 files changed, 23 insertions, 10 deletions
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
index c4dae2e..101c4b7 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -337,6 +337,7 @@ private:
bool dirtyClip;
bool dfbHandledClip;
+ bool ignoreSystemClip;
QDirectFBPaintDevice *dfbDevice;
QDirectFBPaintEngine *q;
@@ -350,6 +351,7 @@ QDirectFBPaintEnginePrivate::QDirectFBPaintEnginePrivate(QDirectFBPaintEngine *p
dfbHandledClip(false), dfbDevice(0), q(p)
{
fb = QDirectFBScreen::instance()->dfb();
+ ignoreSystemClip = QDirectFBScreen::instance()->ignoreSystemClip();
surfaceCache = new SurfaceCache;
static int cacheLimit = qgetenv("QT_DIRECTFB_IMAGECACHE").toInt();
if (cacheLimit > 0)
@@ -774,23 +776,24 @@ void QDirectFBPaintEnginePrivate::updateClip()
if (!dirtyClip)
return;
- if (!clip() || !clip()->enabled) {
+ const QClipData *clipData = clip();
+ if (!clipData || !clipData->enabled) {
surface->SetClip(surface, NULL);
dfbHandledClip = true;
- }
- else if (clip()->hasRectClip) {
+ } else if (clipData->hasRectClip) {
const DFBRegion r = {
- clip()->clipRect.x(),
- clip()->clipRect.y(),
- clip()->clipRect.x() + clip()->clipRect.width(),
- clip()->clipRect.y() + clip()->clipRect.height()
+ clipData->clipRect.x(),
+ clipData->clipRect.y(),
+ clipData->clipRect.x() + clipData->clipRect.width(),
+ clipData->clipRect.y() + clipData->clipRect.height()
};
surface->SetClip(surface, &r);
-
dfbHandledClip = true;
- }
- else
+ } else if (clipData->hasRegionClip && ignoreSystemClip && clipData->clipRegion == systemClip) {
+ dfbHandledClip = true;
+ } else {
dfbHandledClip = false;
+ }
dirtyClip = false;
}
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
index 3e54e7f..177df1d 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
@@ -81,6 +81,7 @@ public:
QDirectFBKeyboardHandler *keyboard;
#endif
bool videoonly;
+ bool ignoreSystemClip;
QImage::Format alphaPixmapFormat;
};
@@ -97,6 +98,7 @@ QDirectFBScreenPrivate::QDirectFBScreenPrivate(QDirectFBScreen* screen)
, keyboard(0)
#endif
, videoonly(false)
+ , ignoreSystemClip(false)
, alphaPixmapFormat(QImage::Format_Invalid)
{
#ifndef QT_NO_QWS_SIGNALHANDLER
@@ -826,6 +828,9 @@ bool QDirectFBScreen::connect(const QString &displaySpec)
if (displayArgs.contains(QLatin1String("videoonly")))
d_ptr->videoonly = true;
+ if (displayArgs.contains(QLatin1String("ignoresystemclip"), Qt::CaseInsensitive))
+ d_ptr->ignoreSystemClip = true;
+
#ifndef QT_NO_DIRECTFB_WM
if (displayArgs.contains(QLatin1String("fullscreen")))
#endif
@@ -1256,3 +1261,7 @@ uchar *QDirectFBScreen::lockSurface(IDirectFBSurface *surface, DFBSurfaceLockFla
return reinterpret_cast<uchar*>(mem);
}
+bool QDirectFBScreen::ignoreSystemClip() const
+{
+ return d_ptr->ignoreSystemClip;
+}
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
index 8dd38dc..08c9ac1 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.h
@@ -109,6 +109,7 @@ public:
void releaseDFBSurface(IDirectFBSurface* surface);
bool preferVideoOnly() const;
+ bool ignoreSystemClip() const;
static int depth(DFBSurfacePixelFormat format);