src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp
branchRCL_3
changeset 8 3f74d0d4af4c
parent 5 d3bac044e0f0
--- a/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp	Mon Mar 15 12:43:09 2010 +0200
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbpixmap.cpp	Thu Apr 08 14:19:33 2010 +0300
@@ -174,6 +174,8 @@
 bool QDirectFBPixmapData::fromFile(const QString &filename, const char *format,
                                    Qt::ImageConversionFlags flags)
 {
+    if (!QFile::exists(filename))
+        return false;
     if (flags == Qt::AutoColor) {
         if (filename.startsWith(QLatin1Char(':'))) { // resource
             QFile file(filename);
@@ -288,27 +290,22 @@
 void QDirectFBPixmapData::fromImage(const QImage &img,
                                     Qt::ImageConversionFlags flags)
 {
-    if (img.depth() == 1 || img.format() == QImage::Format_RGB32) {
-        fromImage(img.convertToFormat(screen->alphaPixmapFormat()), flags);
-        return;
-    }
-
-    if (img.hasAlphaChannel()
+    if (img.depth() == 1) {
+        alpha = true;
 #ifndef QT_NO_DIRECTFB_OPAQUE_DETECTION
-        && (flags & Qt::NoOpaqueDetection || QDirectFBPixmapData::hasAlphaChannel(img))
+    } else if (flags & Qt::NoOpaqueDetection || QDirectFBPixmapData::hasAlphaChannel(img)) {
+        alpha = true;
+#else
+    } else if (img.hasAlphaChannel()) {
+        alpha = true;
 #endif
-        ) {
-        alpha = true;
-        imageFormat = screen->alphaPixmapFormat();
-    } else {
-        alpha = false;
-        imageFormat = screen->pixelFormat();
     }
+    imageFormat = alpha ? screen->alphaPixmapFormat() : screen->pixelFormat();
     QImage image;
-    if (flags != Qt::AutoColor) {
+    if ((flags & ~Qt::NoOpaqueDetection) != Qt::AutoColor) {
         image = img.convertToFormat(imageFormat, flags);
         flags = Qt::AutoColor;
-    } else if (img.format() == QImage::Format_RGB32) {
+    } else if (img.format() == QImage::Format_RGB32 || img.depth() == 1) {
         image = img.convertToFormat(imageFormat, flags);
     } else {
         image = img;
@@ -425,7 +422,7 @@
 
     Q_ASSERT(dfbSurface);
 
-    alpha = (color.alpha() < 255);
+    alpha |= (color.alpha() < 255);
 
     if (alpha && isOpaqueFormat(imageFormat)) {
         QSize size;
@@ -593,6 +590,17 @@
     imageFormat = QImage::Format_Invalid;
 }
 
+#ifndef QT_DIRECTFB_PLUGIN
+Q_GUI_EXPORT IDirectFBSurface *qt_directfb_surface_for_pixmap(const QPixmap &pixmap)
+{
+    const QPixmapData *data = pixmap.pixmapData();
+    if (!data || data->classId() != QPixmapData::DirectFBClass)
+        return 0;
+    const QDirectFBPixmapData *dfbData = static_cast<const QDirectFBPixmapData*>(data);
+    return dfbData->directFBSurface();
+}
+#endif
+
 QT_END_NAMESPACE
 
 #endif // QT_NO_QWS_DIRECTFB