src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
changeset 7 f7bc934e204c
parent 3 41300fa6a67c
--- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp	Tue Feb 02 00:43:10 2010 +0200
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp	Wed Mar 31 11:06:36 2010 +0300
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
@@ -921,7 +921,7 @@
                          qPrintable(flip));
         }
     } else {
-        flipFlags = DSFLIP_BLIT;
+        flipFlags = DSFLIP_BLIT|DSFLIP_ONSYNC;
     }
 }
 
@@ -1063,7 +1063,7 @@
 
 static inline QColor colorFromName(const QString &name)
 {
-    QRegExp rx("#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])");
+    QRegExp rx(QLatin1String("#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])"));
     rx.setCaseSensitivity(Qt::CaseInsensitive);
     if (rx.exactMatch(name)) {
         Q_ASSERT(rx.captureCount() == 4);
@@ -1126,6 +1126,8 @@
 
     if (displayArgs.contains(QLatin1String("boundingrectflip"), Qt::CaseInsensitive)) {
         d_ptr->directFBFlags |= BoundingRectFlip;
+    } else if (displayArgs.contains(QLatin1String("nopartialflip"), Qt::CaseInsensitive)) {
+        d_ptr->directFBFlags |= NoPartialFlip;
     }
 
 #ifdef QT_DIRECTFB_IMAGECACHE
@@ -1139,6 +1141,8 @@
 #endif
         d_ptr->dfb->SetCooperativeLevel(d_ptr->dfb, DFSCL_FULLSCREEN);
 
+    const bool forcePremultiplied = displayArgs.contains(QLatin1String("forcepremultiplied"), Qt::CaseInsensitive);
+
     DFBSurfaceDescription description;
     memset(&description, 0, sizeof(DFBSurfaceDescription));
     IDirectFBSurface *surface;
@@ -1167,7 +1171,7 @@
             description.caps |= capabilities[i].cap;
     }
 
-    if (displayArgs.contains(QLatin1String("forcepremultiplied"), Qt::CaseInsensitive)) {
+    if (forcePremultiplied) {
         description.caps |= DSCAPS_PREMULTIPLIED;
     }
 
@@ -1217,6 +1221,8 @@
         d_ptr->alphaPixmapFormat = QImage::Format_ARGB32_Premultiplied;
         break;
     case QImage::Format_ARGB32:
+        if (forcePremultiplied)
+            d_ptr->alphaPixmapFormat = pixelFormat = QImage::Format_ARGB32_Premultiplied;
     case QImage::Format_ARGB32_Premultiplied:
     case QImage::Format_ARGB4444_Premultiplied:
     case QImage::Format_ARGB8555_Premultiplied:
@@ -1278,7 +1284,14 @@
 #ifdef QT_NO_DIRECTFB_WM
         result = d_ptr->primarySurface->GetSize(d_ptr->primarySurface, &w, &h);
 #elif (Q_DIRECTFB_VERSION >= 0x010000)
-        result = d_ptr->dfbScreen->GetSize(d_ptr->dfbScreen, &w, &h);
+        IDirectFBSurface *layerSurface;
+        if (d_ptr->dfbLayer->GetSurface(d_ptr->dfbLayer, &layerSurface) != DFB_OK) {
+            result = layerSurface->GetSize(layerSurface, &w, &h);
+            layerSurface->Release(layerSurface);
+        }
+        if (w <= 0 || h <= 0) {
+            result = d_ptr->dfbScreen->GetSize(d_ptr->dfbScreen, &w, &h);
+        }
 #else
         qWarning("QDirectFBScreen::connect: DirectFB versions prior to 1.0 do not offer a way\n"
                  "query the size of the primary surface in windowed mode. You have to specify\n"
@@ -1667,7 +1680,7 @@
 
 uchar *QDirectFBScreen::lockSurface(IDirectFBSurface *surface, DFBSurfaceLockFlags flags, int *bpl)
 {
-    void *mem;
+    void *mem = 0;
     const DFBResult result = surface->Lock(surface, flags, &mem, bpl);
     if (result != DFB_OK) {
         DirectFBError("QDirectFBScreen::lockSurface()", result);
@@ -1676,11 +1689,22 @@
     return reinterpret_cast<uchar*>(mem);
 }
 
+static inline bool isFullUpdate(IDirectFBSurface *surface, const QRegion &region, const QPoint &offset)
+{
+    if (offset == QPoint(0, 0) && region.rectCount() == 1) {
+	QSize size;
+	surface->GetSize(surface, &size.rwidth(), &size.rheight());
+	if (region.boundingRect().size() == size)
+	    return true;
+    }
+    return false;
+}
 
 void QDirectFBScreen::flipSurface(IDirectFBSurface *surface, DFBSurfaceFlipFlags flipFlags,
                                   const QRegion &region, const QPoint &offset)
 {
-    if (!(flipFlags & DSFLIP_BLIT)) {
+    if (d_ptr->directFBFlags & NoPartialFlip
+        || (!(flipFlags & DSFLIP_BLIT) && QT_PREPEND_NAMESPACE(isFullUpdate(surface, region, offset)))) {
         surface->Flip(surface, 0, flipFlags);
     } else {
         if (!(d_ptr->directFBFlags & BoundingRectFlip) && region.rectCount() > 1) {