summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorAnders Bakken <anders.bakken@nokia.com>2009-04-27 20:36:29 -0700
committerAnders Bakken <anders.bakken@nokia.com>2009-04-28 13:12:05 -0700
commit2e9071afbf86ca3143552a3eed75418328b5ce6c (patch)
tree37e15cca39c2fc9b32de956306d9b31956210a65 /src/plugins
parentde14db188ada5e00980a152dadb13d38438a7fa2 (diff)
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>
Diffstat (limited to 'src/plugins')
-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 c4dae2e40c..101c4b7fa6 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 3e54e7f57d..177df1d809 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 8dd38dc6a4..08c9ac184c 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);