summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp1
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp2
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp121
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h2
-rw-r--r--src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp13
-rw-r--r--src/plugins/graphicssystems/opengl/main.cpp10
-rw-r--r--src/plugins/s60/s60pluginbase.pri2
7 files changed, 86 insertions, 65 deletions
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp
index 46cf65b..cb4fb88 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp
@@ -209,6 +209,7 @@ void QDirectFBPaintDevice::releaseSubSurface()
{
Q_ASSERT(QDirectFBScreen::instance());
if (subSurface) {
+ unlockSurface();
screen->releaseDFBSurface(subSurface);
subSurface = 0;
}
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
index a9ae72c..dd6b0d3 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
@@ -284,7 +284,9 @@ bool QDirectFBPaintEngine::begin(QPaintDevice *device)
}
d->prepare(d->dfbDevice);
+ gccaps = AllFeatures;
d->setCompositionMode(state()->composition_mode);
+
return QRasterPaintEngine::begin(device);
}
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
index 19103cb..f33e820 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp
@@ -81,18 +81,23 @@ QDirectFBWindowSurface::QDirectFBWindowSurface(DFBSurfaceFlipFlags flip, QDirect
, flipFlags(flip)
, boundingRectFlip(scr->directFBFlags() & QDirectFBScreen::BoundingRectFlip)
{
+ SurfaceFlags flags = 0;
+ if (!widget || widget->window()->windowOpacity() == 0xff)
+ flags |= Opaque;
#ifdef QT_NO_DIRECTFB_WM
if (widget && widget->testAttribute(Qt::WA_PaintOnScreen)) {
- setSurfaceFlags(Opaque | RegionReserved);
+ flags = RegionReserved;
mode = Primary;
} else {
mode = Offscreen;
- setSurfaceFlags(Opaque | Buffered);
+ flags = Buffered;
}
#else
- setSurfaceFlags(Opaque | Buffered);
+ noSystemBackground = widget && widget->testAttribute(Qt::WA_NoSystemBackground);
+ if (noSystemBackground)
+ flags &= ~Opaque;
#endif
-
+ setSurfaceFlags(flags);
#ifdef QT_DIRECTFB_TIMING
frames = 0;
timer.start();
@@ -135,6 +140,16 @@ void QDirectFBWindowSurface::createWindow(const QRect &rect)
description.caps = DWCAPS_NODECORATION|DWCAPS_DOUBLEBUFFER;
description.flags = DWDESC_CAPS|DWDESC_SURFACE_CAPS|DWDESC_PIXELFORMAT|DWDESC_HEIGHT|DWDESC_WIDTH|DWDESC_POSX|DWDESC_POSY;
+#if (Q_DIRECTFB_VERSION >= 0x010200)
+ description.flags |= DWDESC_OPTIONS;
+#endif
+
+ if (noSystemBackground) {
+ description.caps |= DWCAPS_ALPHACHANNEL;
+#if (Q_DIRECTFB_VERSION >= 0x010200)
+ description.options |= DWOP_ALPHACHANNEL;
+#endif
+ }
description.posx = rect.x();
description.posy = rect.y();
@@ -143,7 +158,7 @@ void QDirectFBWindowSurface::createWindow(const QRect &rect)
description.surface_caps = DSCAPS_NONE;
if (screen->directFBFlags() & QDirectFBScreen::VideoOnly)
description.surface_caps |= DSCAPS_VIDEOONLY;
- const QImage::Format format = screen->pixelFormat();
+ const QImage::Format format = (noSystemBackground ? screen->alphaPixmapFormat() : screen->pixelFormat());
description.pixelformat = QDirectFBScreen::getSurfacePixelFormat(format);
if (QDirectFBScreen::isPremultiplied(format))
description.surface_caps = DSCAPS_PREMULTIPLIED;
@@ -153,9 +168,7 @@ void QDirectFBWindowSurface::createWindow(const QRect &rect)
if (result != DFB_OK)
DirectFBErrorFatal("QDirectFBWindowSurface::createWindow", result);
- if (dfbSurface)
- dfbSurface->Release(dfbSurface);
-
+ Q_ASSERT(!dfbSurface);
dfbWindow->GetSurface(dfbWindow, &dfbSurface);
updateFormat();
}
@@ -200,10 +213,6 @@ void QDirectFBWindowSurface::setGeometry(const QRect &rect)
if (sizeChanged) {
delete engine;
engine = 0;
- unlockSurface();
-#ifdef QT_DIRECTFB_SUBSURFACE
- releaseSubSurface();
-#endif
releaseSurface();
Q_ASSERT(!dfbSurface);
}
@@ -301,29 +310,20 @@ bool QDirectFBWindowSurface::move(const QPoint &moveBy)
return true;
}
-// hw: XXX: copied from QWidgetPrivate::isOpaque()
-inline bool isWidgetOpaque(const QWidget *w)
+void QDirectFBWindowSurface::setOpaque(bool opaque)
{
- if (w->testAttribute(Qt::WA_OpaquePaintEvent)
- || w->testAttribute(Qt::WA_PaintOnScreen))
- return true;
-
- const QPalette &pal = w->palette();
-
- if (w->autoFillBackground()) {
- const QBrush &autoFillBrush = pal.brush(w->backgroundRole());
- if (autoFillBrush.style() != Qt::NoBrush && autoFillBrush.isOpaque())
- return true;
+ SurfaceFlags flags = surfaceFlags();
+ if (opaque != (flags & Opaque)) {
+ if (opaque) {
+ flags |= Opaque;
+ } else {
+ flags &= ~Opaque;
+ }
+ setSurfaceFlags(flags);
}
+}
- if (!w->testAttribute(Qt::WA_NoSystemBackground)) {
- const QBrush &windowBrush = w->palette().brush(QPalette::Window);
- if (windowBrush.style() != Qt::NoBrush && windowBrush.isOpaque())
- return true;
- }
- return false;
-}
void QDirectFBWindowSurface::flush(QWidget *widget, const QRegion &region,
const QPoint &offset)
{
@@ -335,37 +335,39 @@ void QDirectFBWindowSurface::flush(QWidget *widget, const QRegion &region,
if (extra && extra->proxyWidget)
return;
- // hw: make sure opacity information is updated before compositing
- const bool opaque = isWidgetOpaque(win);
- if (opaque != isOpaque()) {
- SurfaceFlags flags = surfaceFlags();
- if (opaque) {
- flags |= Opaque;
- } else {
- flags &= ~Opaque;
- }
- setSurfaceFlags(flags);
+ const quint8 windowOpacity = quint8(win->windowOpacity() * 0xff);
+ const QRect windowGeometry = geometry();
+#ifdef QT_DIRECTFB_WM
+ const bool wasNoSystemBackground = noSystemBackground;
+ noSystemBackground = win->testAttribute(Qt::WA_NoSystemBackground);
+ quint8 currentOpacity;
+ Q_ASSERT(dfbWindow);
+ dfbWindow->GetOpacity(dfbWindow, &currentOpacity);
+ if (currentOpacity != windowOpacity) {
+ dfbWindow->SetOpacity(dfbWindow, windowOpacity);
}
-#ifndef QT_NO_DIRECTFB_WM
- const quint8 winOpacity = quint8(win->windowOpacity() * 255);
- quint8 opacity;
-
- if (dfbWindow) {
- dfbWindow->GetOpacity(dfbWindow, &opacity);
- if (winOpacity != opacity)
- dfbWindow->SetOpacity(dfbWindow, winOpacity);
+ setOpaque(noSystemBackground || windowOpacity != 0xff);
+ if (wasNoSystemBackground != noSystemBackground) {
+ releaseSurface();
+ dfbWindow->Release(dfbWindow);
+ dfbWindow = 0;
+ createWindow(windowGeometry);
+ win->update();
+ return;
}
-#endif
-
- const QRect windowGeometry = QDirectFBWindowSurface::geometry();
-#ifdef QT_NO_DIRECTFB_WM
+ screen->flipSurface(dfbSurface, flipFlags, region, offset);
+ if (noSystemBackground) {
+ dfbSurface->Clear(dfbSurface, 0, 0, 0, 0);
+ }
+#else
+ setOpaque(windowOpacity != 0xff);
if (mode == Offscreen) {
screen->exposeRegion(region.translated(offset + geometry().topLeft()), 0);
-
- } else
-#endif
+ } else {
screen->flipSurface(dfbSurface, flipFlags, region, offset);
+ }
+#endif
#ifdef QT_DIRECTFB_TIMING
enum { Secs = 3 };
@@ -430,9 +432,10 @@ void QDirectFBWindowSurface::updateFormat()
void QDirectFBWindowSurface::releaseSurface()
{
if (dfbSurface) {
-#ifdef QT_NO_DIRECTFB_SUBSURFACE
- if (lockFlgs)
- unlockSurface();
+#ifdef QT_DIRECTFB_SUBSURFACE
+ releaseSubSurface();
+#else
+ unlockSurface();
#endif
#ifdef QT_NO_DIRECTFB_WM
Q_ASSERT(screen->primarySurface());
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h
index 0dd3a3b..2f78179 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h
@@ -97,6 +97,7 @@ public:
IDirectFBWindow *directFBWindow() const;
#endif
private:
+ void setOpaque(bool opaque);
void updateFormat();
void releaseSurface();
QDirectFBWindowSurface *sibling;
@@ -112,6 +113,7 @@ private:
#endif
DFBSurfaceFlipFlags flipFlags;
+ bool noSystemBackground;
bool boundingRectFlip;
#ifdef QT_DIRECTFB_TIMING
int frames;
diff --git a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp
index 3698afd..afee77e 100644
--- a/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp
+++ b/src/plugins/gfxdrivers/powervr/pvreglscreen/pvreglwindowsurface.cpp
@@ -157,18 +157,21 @@ QImage PvrEglWindowSurface::image() const
void *data = pvrQwsGetRenderBuffer(drawable);
if (data) {
return QImage((uchar *)data, pvrRect.width, pvrRect.height,
- pvrQwsGetStride(drawable), QImage::Format_RGB16);
+ pvrQwsGetStride(drawable), screen->pixelFormat());
}
}
- return QImage();
+ return QImage(16, 16, screen->pixelFormat());
}
QPaintDevice *PvrEglWindowSurface::paintDevice()
{
- // Return a dummy paint device because the widget itself
- // cannot be painted to this way.
+ QGLWidget *glWidget = qobject_cast<QGLWidget *>(window());
+ if (glWidget)
+ return glWidget;
+
+ // Should be a QGLWidget, but if not return a dummy paint device.
if (!pdevice)
- pdevice = new QImage(50, 50, QImage::Format_RGB16);
+ pdevice = new QImage(50, 50, screen->pixelFormat());
return pdevice;
}
diff --git a/src/plugins/graphicssystems/opengl/main.cpp b/src/plugins/graphicssystems/opengl/main.cpp
index c28b09a..6216ada 100644
--- a/src/plugins/graphicssystems/opengl/main.cpp
+++ b/src/plugins/graphicssystems/opengl/main.cpp
@@ -56,6 +56,9 @@ QStringList QGLGraphicsSystemPlugin::keys() const
{
QStringList list;
list << QLatin1String("OpenGL") << QLatin1String("OpenGL1");
+#if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)
+ list << QLatin1String("OpenGL2");
+#endif
return list;
}
@@ -66,6 +69,13 @@ QGraphicsSystem* QGLGraphicsSystemPlugin::create(const QString& system)
return new QGLGraphicsSystem;
}
+#if !defined(QT_OPENGL_ES_1) && !defined(QT_OPENGL_ES_1_CL)
+ if (system.toLower() == QLatin1String("opengl2")) {
+ QGL::setPreferredPaintEngine(QPaintEngine::OpenGL2);
+ return new QGLGraphicsSystem;
+ }
+#endif
+
if (system.toLower() == QLatin1String("opengl"))
return new QGLGraphicsSystem;
diff --git a/src/plugins/s60/s60pluginbase.pri b/src/plugins/s60/s60pluginbase.pri
index 29e8eb3..c1aa4ef 100644
--- a/src/plugins/s60/s60pluginbase.pri
+++ b/src/plugins/s60/s60pluginbase.pri
@@ -1,6 +1,6 @@
# Note: These version based 'plugins' are not an actual Qt plugins,
# they are just regular runtime loaded libraries
-include(../../qpluginbase.pri)
+include(../qpluginbase.pri)
CONFIG -= plugin