summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.cpp94
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.h20
2 files changed, 114 insertions, 0 deletions
diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.cpp b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
index bd31982d42..f7a13274e2 100644
--- a/src/plugins/platforms/directfb/qdirectfbblitter.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
@@ -45,10 +45,16 @@
#include <QtGui/private/qpixmap_blitter_p.h>
#include <QDebug>
+#include <QFile>
#include <directfb.h>
+#define QDFB_STRINGIFY(x) #x
+#define QDFB_TOSTRING(x) QDFB_STRINGIFY(x)
+#define QDFB_PRETTY \
+ (__FILE__ ":" QDFB_TOSTRING(__LINE__))
+
static QBlittable::Capabilities dfb_blitter_capabilities()
{
return QBlittable::Capabilities(QBlittable::SolidRectCapability
@@ -178,6 +184,94 @@ QImage *QDirectFbBlitter::doLock()
return &m_image;
}
+bool QDirectFbBlitterPlatformPixmap::fromDataBufferDescription(const DFBDataBufferDescription &dataBufferDescription)
+{
+ DFBResult result;
+ IDirectFB *dfb = QDirectFbConvenience::dfbInterface();
+
+ // Create a data buffer
+ QDirectFBPointer<IDirectFBDataBuffer> dataBuffer;
+ result = dfb->CreateDataBuffer(dfb, &dataBufferDescription, dataBuffer.outPtr());
+ if (result != DFB_OK) {
+ DirectFBError(QDFB_PRETTY, result);
+ return false;
+ }
+
+ // Create the image provider
+ QDirectFBPointer<IDirectFBImageProvider> provider;
+ result = dataBuffer->CreateImageProvider(dataBuffer.data(), provider.outPtr());
+ if (result != DFB_OK) {
+ DirectFBError(QDFB_PRETTY, result);
+ return false;
+ }
+
+ // Extract image information
+ DFBImageDescription imageDescription;
+ result = provider->GetImageDescription(provider.data(), &imageDescription);
+ if (result != DFB_OK) {
+ DirectFBError(QDFB_PRETTY, result);
+ return false;
+ }
+
+ // Can we handle this directlu?
+ if (imageDescription.caps & DICAPS_COLORKEY)
+ return false;
+
+ DFBSurfaceDescription surfaceDescription;
+ result = provider->GetSurfaceDescription(provider.data(), &surfaceDescription);
+ if (result != DFB_OK) {
+ DirectFBError(QDFB_PRETTY, result);
+ return false;
+ }
+
+ m_alpha = imageDescription.caps & DICAPS_ALPHACHANNEL;
+ resize(surfaceDescription.width, surfaceDescription.height);
+ // TODO: FIXME; update d
+
+
+ result = provider->RenderTo(provider.data(), dfbBlitter()->dfbSurface(), 0);
+ if (result != DFB_OK) {
+ DirectFBError(QDFB_PRETTY, result);
+ return false;
+ }
+
+ return true;
+}
+
+bool QDirectFbBlitterPlatformPixmap::fromFile(const QString &filename, const char *format,
+ Qt::ImageConversionFlags flags)
+{
+ // If we can't find the file, pass it on to the base class as it is
+ // trying harder by appending various extensions to the path.
+ if (!QFile::exists(filename))
+ return QBlittablePlatformPixmap::fromFile(filename, format, flags);
+
+ // Stop if there is a requirement for colors
+ if (flags != Qt::AutoColor)
+ return QBlittablePlatformPixmap::fromFile(filename, format, flags);
+
+ // Deal with resources
+ if (filename.startsWith(QLatin1Char(':'))) { // resource
+ QFile file(filename);
+ if (!file.open(QIODevice::ReadOnly))
+ return false;
+ const QByteArray data = file.readAll();
+ file.close();
+ return fromData(reinterpret_cast<const uchar*>(data.constData()), data.size(), format, flags);
+ }
+
+ // Try to use directfb to load it.
+ DFBDataBufferDescription description;
+ description.flags = DBDESC_FILE;
+ const QByteArray fileNameData = filename.toLocal8Bit();
+ description.file = fileNameData.constData();
+ if (fromDataBufferDescription(description))
+ return true;
+
+ // Fallback
+ return QBlittablePlatformPixmap::fromFile(filename, format, flags);
+}
+
void QDirectFbBlitter::doUnlock()
{
m_surface->Unlock(m_surface.data());
diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.h b/src/plugins/platforms/directfb/qdirectfbblitter.h
index 6ed3850487..9a7362be65 100644
--- a/src/plugins/platforms/directfb/qdirectfbblitter.h
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.h
@@ -58,6 +58,8 @@ public:
virtual void fillRect(const QRectF &rect, const QColor &color);
virtual void drawPixmap(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect);
+ IDirectFBSurface *dfbSurface() const;
+
static DFBSurfacePixelFormat alphaPixmapFormat();
static DFBSurfacePixelFormat pixmapFormat();
static DFBSurfacePixelFormat selectPixmapFormat(bool withAlpha);
@@ -76,6 +78,14 @@ class QDirectFbBlitterPlatformPixmap : public QBlittablePlatformPixmap
{
public:
QBlittable *createBlittable(const QSize &size, bool alpha) const;
+
+ QDirectFbBlitter *dfbBlitter() const;
+
+ virtual bool fromFile(const QString &filename, const char *format,
+ Qt::ImageConversionFlags flags);
+
+private:
+ bool fromDataBufferDescription(const DFBDataBufferDescription &);
};
inline QBlittable *QDirectFbBlitterPlatformPixmap::createBlittable(const QSize& size, bool alpha) const
@@ -83,4 +93,14 @@ inline QBlittable *QDirectFbBlitterPlatformPixmap::createBlittable(const QSize&
return new QDirectFbBlitter(size, alpha);
}
+inline QDirectFbBlitter *QDirectFbBlitterPlatformPixmap::dfbBlitter() const
+{
+ return static_cast<QDirectFbBlitter*>(blittable());
+}
+
+inline IDirectFBSurface *QDirectFbBlitter::dfbSurface() const
+{
+ return m_surface.data();
+}
+
#endif // QDIRECTFBBLITTER_H