summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/image/qpixmap_blitter.cpp61
-rw-r--r--src/gui/image/qpixmap_blitter_p.h11
-rw-r--r--src/gui/image/qpixmapdata_p.h1
-rw-r--r--src/gui/painting/qgraphicssystem_p.h2
-rw-r--r--src/gui/painting/qpaintengine_blitter.cpp51
-rw-r--r--src/gui/painting/qpaintengine_blitter_p.h3
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp4
-rw-r--r--src/plugins/graphicssystems/minimaldfb/minimaldfb.pro8
-rw-r--r--src/plugins/graphicssystems/minimaldfb/qblitter_directfb.cpp94
-rw-r--r--src/plugins/graphicssystems/minimaldfb/qblitter_directfb.h24
-rw-r--r--src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.cpp65
-rw-r--r--src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.h4
-rw-r--r--src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.cpp55
-rw-r--r--src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.h5
14 files changed, 287 insertions, 101 deletions
diff --git a/src/gui/image/qpixmap_blitter.cpp b/src/gui/image/qpixmap_blitter.cpp
index 9730ecc..5ecc01d 100644
--- a/src/gui/image/qpixmap_blitter.cpp
+++ b/src/gui/image/qpixmap_blitter.cpp
@@ -3,8 +3,8 @@
#include <private/qapplication_p.h>
#include <private/qgraphicssystem_p.h>
-QBlittablePixmapData::QBlittablePixmapData(PixelType type)
- : QPixmapData(type,BlitterClass), m_blittable(0), m_engine(0)
+QBlittablePixmapData::QBlittablePixmapData(QPixmapData::PixelType type)
+ : QPixmapData(type,BlitterClass), m_engine(0), m_blittable(0)
{
}
@@ -12,17 +12,62 @@ QBlittablePixmapData::~QBlittablePixmapData()
{
}
+QBlittable *QBlittablePixmapData::blittable()
+{
+ if (!m_blittable) {
+ m_blittable = QApplicationPrivate::graphicsSystem()->createBlittable(QRect(0,0,w,h));
+ }
+
+ return m_blittable;
+}
+
+void QBlittablePixmapData::setBlittable(QBlittable *blittable)
+{
+ if (m_blittable)
+ delete m_blittable;
+ m_blittable = blittable;
+}
+
void QBlittablePixmapData::resize(int width, int height)
{
delete m_blittable;
- m_blittable = QApplicationPrivate::graphicsSystem()->createBlittable(QRect(0,0,width,height));
+ m_blittable = 0;
+ delete m_engine;
m_engine = 0;
+ d = 32;
+ w = width;
+ h = height;
+// d = image.depth();
+ is_null = (w <= 0 || h <= 0);
}
+extern int qt_defaultDpiX();
+extern int qt_defaultDpiY();
int QBlittablePixmapData::metric(QPaintDevice::PaintDeviceMetric metric) const
{
- QImage *image = m_blittable->lock();
- return image->metric(metric);
+ switch (metric) {
+ case QPaintDevice::PdmWidth:
+ return w;
+ case QPaintDevice::PdmHeight:
+ return h;
+ case QPaintDevice::PdmWidthMM:
+ return qRound(w * 25.4 / qt_defaultDpiX());
+ case QPaintDevice::PdmHeightMM:
+ return qRound(h * 25.4 / qt_defaultDpiY());
+ case QPaintDevice::PdmDepth:
+ return 32;
+ case QPaintDevice::PdmDpiX: // fall-through
+ case QPaintDevice::PdmPhysicalDpiX:
+ return qt_defaultDpiX();
+ case QPaintDevice::PdmDpiY: // fall-through
+ case QPaintDevice::PdmPhysicalDpiY:
+ return qt_defaultDpiY();
+ default:
+ qWarning("QRasterPixmapData::metric(): Unhandled metric type %d", metric);
+ break;
+ }
+
+ return 0;
}
void QBlittablePixmapData::fill(const QColor &color)
@@ -38,18 +83,18 @@ QImage *QBlittablePixmapData::buffer()
return m_blittable->lock();
}
-QImage QBlittablePixmapData::toImage()
+QImage QBlittablePixmapData::toImage() const
{
return m_blittable->lock()->copy();
}
-bool QBlittablePixmapData::hasAlphaChannel()
+bool QBlittablePixmapData::hasAlphaChannel() const
{
return m_blittable->lock()->hasAlphaChannel();
}
void QBlittablePixmapData::fromImage(const QImage &image,
- Qt::ImageConversionFlags flags)
+ Qt::ImageConversionFlags)
{
m_blittable = new QImageBlitter(image);
m_engine = 0;
diff --git a/src/gui/image/qpixmap_blitter_p.h b/src/gui/image/qpixmap_blitter_p.h
index 5e93ef4..3ed2fe4 100644
--- a/src/gui/image/qpixmap_blitter_p.h
+++ b/src/gui/image/qpixmap_blitter_p.h
@@ -34,20 +34,21 @@ private:
QImage image;
};
-class QBlittablePixmapData : public QPixmapData
+class Q_GUI_EXPORT QBlittablePixmapData : public QPixmapData
{
public:
- QBlittablePixmapData(PixelType type);
+ QBlittablePixmapData(QPixmapData::PixelType type);
~QBlittablePixmapData();
- QBlittable *blittable() const { return m_blittable; }
+ QBlittable *blittable();
+ void setBlittable(QBlittable *blittable);
void resize(int width, int height);
int metric(QPaintDevice::PaintDeviceMetric metric) const;
void fill(const QColor &color);
QImage *buffer();
- QImage toImage();
- bool hasAlphaChannel();
+ QImage toImage() const;
+ bool hasAlphaChannel() const;
void fromImage(const QImage &image, Qt::ImageConversionFlags flags);
QPaintEngine *paintEngine() const;
diff --git a/src/gui/image/qpixmapdata_p.h b/src/gui/image/qpixmapdata_p.h
index 292092f..a668f0a 100644
--- a/src/gui/image/qpixmapdata_p.h
+++ b/src/gui/image/qpixmapdata_p.h
@@ -137,6 +137,7 @@ private:
friend class QX11PixmapData;
friend class QS60PixmapData;
friend class QImagePixmapCleanupHooks; // Needs to set is_cached
+ friend class QBlittablPixmapData;
friend class QGLTextureCache; //Needs to check the reference count
friend class QExplicitlySharedDataPointer<QPixmapData>;
diff --git a/src/gui/painting/qgraphicssystem_p.h b/src/gui/painting/qgraphicssystem_p.h
index 275afc0..5fce93d 100644
--- a/src/gui/painting/qgraphicssystem_p.h
+++ b/src/gui/painting/qgraphicssystem_p.h
@@ -86,7 +86,7 @@ class Q_GUI_EXPORT QGraphicsSystem
public:
virtual QPixmapData *createPixmapData(QPixmapData::PixelType type) const = 0;
virtual QWindowSurface *createWindowSurface(QWidget *widget) const = 0;
- virtual QBlittable *createBlittable(const QRect &rect) { return 0; }
+ virtual QBlittable *createBlittable(const QRect &) const { return 0; }
virtual ~QGraphicsSystem() = 0;
diff --git a/src/gui/painting/qpaintengine_blitter.cpp b/src/gui/painting/qpaintengine_blitter.cpp
index b134d84..0632ae0 100644
--- a/src/gui/painting/qpaintengine_blitter.cpp
+++ b/src/gui/painting/qpaintengine_blitter.cpp
@@ -2,6 +2,7 @@
#include "private/qpaintengine_raster_p.h"
#include "private/qpainter_p.h"
#include "private/qapplication_p.h"
+#include "private/qpixmap_blitter_p.h"
#define STATE_XFORM_SCALE 0x00000001
#define STATE_XFORM_COMPLEX 0x00000002
@@ -147,21 +148,16 @@ public:
class QBlitterPaintEnginePrivate : public QPaintEngineExPrivate
{
public:
- QBlitterPaintEnginePrivate(QPixmapData *p)
- : QPaintEngineExPrivate(), pixmap(p),
- raster(new QRasterPaintEngine(&pixmap)), isBlitterLocked(false),
- capabillities(0), hasXForm(false)
- {
- if (QGraphicsSystem *gs = QApplicationPrivate::graphicsSystem()) {
-// QBlittable *b = gs->createBlitter(p);
-// if (b) {
-// blitter=b;
-// capabillities = new CapabilitiesToStateMask(blitter->capabilities());
-// blitter->unlock();
-// } else
-// qWarning("No blitter returned from the graphics system. QBlitterPaintEngine will not work");
- }
+ QBlitterPaintEnginePrivate(QBlittablePixmapData *p)
+ : QPaintEngineExPrivate(),
+ isBlitterLocked(false),
+ hasXForm(false)
+ {
+ blitter= p->blittable();
+ raster = new QRasterPaintEngine(p->buffer());
+ capabillities = new CapabilitiesToStateMask(blitter->capabilities());
+ lock();
}
inline void lock() {
@@ -179,31 +175,35 @@ public:
}
void fillRect(const QRectF &rect, const QColor &color) {
- unlock();
+ lock();
QRectF targetRect = rect;
if (hasXForm) {
targetRect = state->matrix.mapRect(rect);
}
QClipData *clipData = raster->state()->clip;
if (clipData) {
- if (clipData->hasRectClip)
+ if (clipData->hasRectClip) {
+ unlock();
blitter->fillRect(targetRect & clipData->clipRect, color);
- else if (clipData->hasRegionClip) {
+ } else if (clipData->hasRegionClip) {
QVector<QRect> rects = clipData->clipRegion.rects();
for ( int i = 0; i < rects.size(); i++ ) {
QRect intersectRect = rects.at(i).intersected(targetRect.toRect());
if (!intersectRect.isEmpty()) {
+ unlock();
blitter->fillRect(intersectRect,color);
}
}
}
- }else {
+ } else {
if (targetRect.x() >= 0 && targetRect.y() >= 0
&& targetRect.width() <= raster->paintDevice()->width()
- && targetRect.height() <= raster->paintDevice()->height())
+ && targetRect.height() <= raster->paintDevice()->height()) {
+ unlock();
blitter->fillRect(targetRect,color);
- else {
+ } else {
QRectF deviceRect(0,0,raster->paintDevice()->width(), raster->paintDevice()->height());
+ unlock();
blitter->fillRect(deviceRect&targetRect,color);
}
}
@@ -247,14 +247,13 @@ public:
uint hasXForm;
};
-QBlitterPaintEngine::QBlitterPaintEngine(QPixmapData *p)
+QBlitterPaintEngine::QBlitterPaintEngine(QBlittablePixmapData *p)
: QPaintEngineEx(*(new QBlitterPaintEnginePrivate(p)))
{
}
QBlitterPaintEngine::~QBlitterPaintEngine()
{
- Q_D(QBlitterPaintEngine);
}
QPainterState *QBlitterPaintEngine::createState(QPainterState *orig) const
@@ -407,17 +406,20 @@ void QBlitterPaintEngine::stroke(const QVectorPath &path, const QPen &pen)
void QBlitterPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op)
{
Q_D(QBlitterPaintEngine);
+ d->lock();
d->raster->clip(path, op);
d->updateClip();
}
void QBlitterPaintEngine::clip(const QRect &rect, Qt::ClipOperation op){
Q_D(QBlitterPaintEngine);
+ d->lock();
d->raster->clip(rect,op);
d->updateClip();
}
void QBlitterPaintEngine::clip(const QRegion &region, Qt::ClipOperation op)
{
Q_D(QBlitterPaintEngine);
+ d->lock();
d->raster->clip(region,op);
d->updateClip();
}
@@ -425,12 +427,14 @@ void QBlitterPaintEngine::clip(const QRegion &region, Qt::ClipOperation op)
void QBlitterPaintEngine::clipEnabledChanged()
{
Q_D(QBlitterPaintEngine);
+ d->lock();
d->raster->clipEnabledChanged();
}
void QBlitterPaintEngine::penChanged()
{
Q_D(QBlitterPaintEngine);
+ d->lock();
d->raster->penChanged();
d->capabillities->updateDrawRectBits(STATE_PEN_ENABLED,qpen_style(d->state->pen) != Qt::NoPen);
}
@@ -589,6 +593,7 @@ void QBlitterPaintEngine::drawTextItem(const QPointF &pos, const QTextItem &ti)
void QBlitterPaintEngine::setState(QPainterState *s)
{
Q_D(QBlitterPaintEngine);
+ d->lock();
QPaintEngineEx::setState(s);
d->raster->setState(s);
d->state = (QRasterPaintEngineState *) s;
@@ -609,7 +614,7 @@ class QBlittablePrivate
{
public:
QBlittablePrivate(const QRect &rect, QBlittable::Capabilities caps)
- : m_rect(rect), caps(caps)
+ : caps(caps), m_rect(rect)
{}
QBlittable::Capabilities caps;
QRect m_rect;
diff --git a/src/gui/painting/qpaintengine_blitter_p.h b/src/gui/painting/qpaintengine_blitter_p.h
index 16b7b2c..8cd2f74 100644
--- a/src/gui/painting/qpaintengine_blitter_p.h
+++ b/src/gui/painting/qpaintengine_blitter_p.h
@@ -6,6 +6,7 @@
class QRasterPaintEngine;
class QBlittablePrivate;
class QBlitterPaintEnginePrivate;
+class QBlittablePixmapData;
// ### find name
class Q_GUI_EXPORT QBlittable
@@ -45,7 +46,7 @@ class Q_GUI_EXPORT QBlitterPaintEngine : public QPaintEngineEx
{
Q_DECLARE_PRIVATE(QBlitterPaintEngine);
public:
- QBlitterPaintEngine(QPixmapData *p);
+ QBlitterPaintEngine(QBlittablePixmapData *p);
~QBlitterPaintEngine();
virtual QPainterState *createState(QPainterState *orig) const;
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 3f33319..5e3203a 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -458,8 +458,8 @@ bool QRasterPaintEngine::begin(QPaintDevice *device)
if (device->devType() == QInternal::Pixmap) {
QPixmap *pixmap = static_cast<QPixmap *>(device);
- if (pixmap->data->classId() == QPixmapData::RasterClass)
- d->device = pixmap->data->buffer();
+ if (pixmap->data->classId() == QPixmapData::RasterClass || pixmap->data->classId() == QPixmapData::BlitterClass)
+ d->device = pixmap->data->buffer();
} else {
d->device = device;
}
diff --git a/src/plugins/graphicssystems/minimaldfb/minimaldfb.pro b/src/plugins/graphicssystems/minimaldfb/minimaldfb.pro
index d4c93fd..8822a5b 100644
--- a/src/plugins/graphicssystems/minimaldfb/minimaldfb.pro
+++ b/src/plugins/graphicssystems/minimaldfb/minimaldfb.pro
@@ -3,11 +3,11 @@ include(../../qpluginbase.pri)
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/graphicssystems
-QMAKE_CXXFLAGS += -I/usr/include/directfb
-LIBS += -ldirectfb -lfusion -ldirect -lpthread
+QMAKE_CXXFLAGS += -I/usr/local/include/directfb
+LIBS += -L/usr/local/lib -ldirectfb -lfusion -ldirect -lpthread
-SOURCES = main.cpp qgraphicssystem_minimaldfb.cpp qwindowsurface_minimaldfb.cpp
-HEADERS = qgraphicssystem_minimaldfb.h qwindowsurface_minimaldfb.h
+SOURCES = main.cpp qgraphicssystem_minimaldfb.cpp qwindowsurface_minimaldfb.cpp qblitter_directfb.cpp
+HEADERS = qgraphicssystem_minimaldfb.h qwindowsurface_minimaldfb.h qblitter_directfb.h
target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
INSTALLS += target
diff --git a/src/plugins/graphicssystems/minimaldfb/qblitter_directfb.cpp b/src/plugins/graphicssystems/minimaldfb/qblitter_directfb.cpp
new file mode 100644
index 0000000..6800543
--- /dev/null
+++ b/src/plugins/graphicssystems/minimaldfb/qblitter_directfb.cpp
@@ -0,0 +1,94 @@
+#include "qblitter_directfb.h"
+#include "qgraphicssystem_minimaldfb.h"
+
+#include <QDebug>
+
+#include <directfb.h>
+
+QDirectFbBlitter::QDirectFbBlitter(const QRect &rect, IDirectFBSurface *surface)
+ : QBlittable(rect, QBlittable::Capabilities(QBlittable::SolidRectCapability
+ |QBlittable::SourcePixmapCapability
+ |QBlittable::SourceOverPixmapCapability
+ |QBlittable::SourceOverScaledPixmapCapability))
+// 0))
+{
+ DFBSurfaceDescription surfaceDesc;
+ surfaceDesc.width = rect.width();
+ surfaceDesc.height = rect.height();
+ surfaceDesc.flags = DFBSurfaceDescriptionFlags(DSDESC_WIDTH | DSDESC_HEIGHT);
+
+ if (surface) {
+ m_surface = surface;
+ } else {
+ IDirectFB *dfb = QDirectFbGraphicsSystem::dfbInterface();
+ dfb->CreateSurface(dfb,&surfaceDesc, &m_surface);
+ }
+}
+
+void QDirectFbBlitter::fillRect(const QRectF &rect, const QColor &color)
+{
+ m_surface->SetColor(m_surface, color.red(), color.green(), color.blue(), color.alpha());
+ m_surface->SetDrawingFlags(m_surface, DSDRAW_NOFX);
+ m_surface->FillRectangle(m_surface, rect.x(), rect.y(),
+ rect.width(), rect.height());
+}
+
+void QDirectFbBlitter::drawPixmap(const QRectF &rect, const QPixmap &pixmap, const QRectF &srcRect)
+{
+ quint32 blittingFlags = pixmap.hasAlphaChannel() ? DSBLIT_BLEND_ALPHACHANNEL : DSBLIT_NOFX;
+
+ m_surface->SetBlittingFlags(m_surface, DFBSurfaceBlittingFlags(blittingFlags));
+ m_surface->SetColor(m_surface, 0xff, 0xff, 0xff, 255);
+
+// QPixmapData *data = pixmap.pixmapData();
+// Q_ASSERT(data->classId() == QPixmapData::DirectFBClass);
+// QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data);
+// IDirectFBSurface *s = dfbData->directFBSurface();
+// const DFBRectangle sRect = { srcRect.x(), srcRect.y(), rect.width(), rect.height() };
+//
+// DFBResult result;
+// if (rect.width() == srcRect.width() && rect.height() == srcRect.height())
+// result = surface->Blit(surface, s, &sRect, rect.x(), rect.y());
+// else {
+// const DFBRectangle dRect = { rect.x(), rect.y(), rect.width(), rect.height() };
+// result = surface->StretchBlit(surface, s, &sRect, &dRect);
+// }
+// if (result != DFB_OK)
+// DirectFBError("QDirectFBBlitter::drawPixmap()", result);
+
+}
+
+QImage *QDirectFbBlitter::lock()
+{
+ if (m_image.isNull()) {
+ if(!m_surface)
+ qDebug() << "Trying to lock null surface";
+ if (!this->rect().isValid()) {
+ qDebug() << "No valid blitter rect";
+ return 0;
+ }
+
+
+
+ void *mem;
+ int bpl;
+ const DFBResult result = m_surface->Lock(m_surface, DFBSurfaceLockFlags(DSLF_WRITE|DSLF_READ), static_cast<void**>(&mem), &bpl);
+ if (result == DFB_OK) {
+ QImage::Format format = QDirectFbGraphicsSystem::imageFormatFromSurface(m_surface);
+ int w, h;
+ m_surface->GetSize(m_surface,&w,&h);
+ m_image = QImage(static_cast<uchar *>(mem),w,h,format);
+ } else {
+ DirectFBError("Failed to lock image", result);
+ }
+
+ }
+
+ return &m_image;
+}
+
+void QDirectFbBlitter::unlock()
+{
+ m_surface->Unlock(m_surface);
+ m_image = QImage();
+}
diff --git a/src/plugins/graphicssystems/minimaldfb/qblitter_directfb.h b/src/plugins/graphicssystems/minimaldfb/qblitter_directfb.h
new file mode 100644
index 0000000..d60a390
--- /dev/null
+++ b/src/plugins/graphicssystems/minimaldfb/qblitter_directfb.h
@@ -0,0 +1,24 @@
+#ifndef QDIRECTFBBLITTER_H
+#define QDIRECTFBBLITTER_H
+
+#include <private/qpaintengine_blitter_p.h>
+
+#include <directfb/directfb.h>
+
+class QDirectFbBlitter : public QBlittable
+{
+public:
+ QDirectFbBlitter(const QRect &rect, IDirectFBSurface *surface = 0);
+ virtual ~QDirectFbBlitter(){ }
+
+ virtual void fillRect(const QRectF &rect, const QColor &color);
+ virtual void drawPixmap(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect);
+
+ virtual QImage *lock();
+ virtual void unlock();
+
+ IDirectFBSurface *m_surface;
+ QImage m_image;
+};
+
+#endif // QDIRECTFBBLITTER_H
diff --git a/src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.cpp b/src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.cpp
index bf46d4c..a59cfd2 100644
--- a/src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.cpp
+++ b/src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.cpp
@@ -41,7 +41,13 @@
#include "qgraphicssystem_minimaldfb.h"
#include "qwindowsurface_minimaldfb.h"
-#include <QtGui/private/qpixmap_raster_p.h>
+#include "qblitter_directfb.h"
+
+#include <private/qwindowsurface_raster_p.h>
+#include <private/qpixmap_raster_p.h>
+
+#include <private/qpixmap_blitter_p.h>
+#include <private/qpixmapdata_p.h>
#include <QCoreApplication>
#include <directfb.h>
@@ -51,7 +57,7 @@ QDirectFbGraphicsSystemScreen::QDirectFbGraphicsSystemScreen(IDirectFB *dfb, int
{
DFBResult result = dfb->GetDisplayLayer(dfb, DLID_PRIMARY, &m_layer);
if (result != DFB_OK) {
- DirectFBError("QDirectFbGraphicsSystemScreen::connect: "
+ DirectFBError("QDirectFbGraphicsSystemScreen "
"Unable to get primary display layer!", result);
}
m_layer->SetCooperativeLevel(m_layer,DLSCL_SHARED);
@@ -106,30 +112,34 @@ IDirectFBWindow *QDirectFbGraphicsSystemScreen::createWindow(const QRect &rect)
return window;
}
+IDirectFB *QDirectFbGraphicsSystem::dfb = 0;
+
QDirectFbGraphicsSystem::QDirectFbGraphicsSystem()
{
- DFBResult result = DFB_OK;
-
- { // pass command line arguments to DirectFB
- const QStringList args = QCoreApplication::arguments();
- int argc = args.size();
- char **argv = new char*[argc];
-
- for (int i = 0; i < argc; ++i)
- argv[i] = qstrdup(args.at(i).toLocal8Bit().constData());
+ if (!dfb) {
+ DFBResult result = DFB_OK;
+
+ { // pass command line arguments to DirectFB
+ const QStringList args = QCoreApplication::arguments();
+ int argc = args.size();
+ char **argv = new char*[argc];
+
+ for (int i = 0; i < argc; ++i)
+ argv[i] = qstrdup(args.at(i).toLocal8Bit().constData());
+
+ result = DirectFBInit(&argc, &argv);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen: error initializing DirectFB",
+ result);
+ }
+ delete[] argv;
+ }
- result = DirectFBInit(&argc, &argv);
+ result = DirectFBCreate(&dfb);
if (result != DFB_OK) {
- DirectFBError("QDirectFBScreen: error initializing DirectFB",
+ DirectFBError("QDirectFBScreen: error creating DirectFB interface",
result);
}
- delete[] argv;
- }
-
- result = DirectFBCreate(&dfb);
- if (result != DFB_OK) {
- DirectFBError("QDirectFBScreen: error creating DirectFB interface",
- result);
}
mPrimaryScreen = new QDirectFbGraphicsSystemScreen(dfb,0);
@@ -138,12 +148,20 @@ QDirectFbGraphicsSystem::QDirectFbGraphicsSystem()
QPixmapData *QDirectFbGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
{
- return new QRasterPixmapData(type);
+ return new QBlittablePixmapData(type);
+// return new QRasterPixmapData(type);
}
QWindowSurface *QDirectFbGraphicsSystem::createWindowSurface(QWidget *widget) const
{
return new QDirectFbWindowSurface (mPrimaryScreen, widget);
+// return new QRasterWindowSurface(widget);
+}
+
+QBlittable *QDirectFbGraphicsSystem::createBlittable(const QRect &rect) const
+{
+ return new QDirectFbBlitter(rect);
+// return 0;
}
QImage::Format QDirectFbGraphicsSystem::imageFormatFromSurface(IDirectFBSurface *surface)
@@ -186,4 +204,9 @@ QImage::Format QDirectFbGraphicsSystem::imageFormatFromSurface(IDirectFBSurface
}
+IDirectFB *QDirectFbGraphicsSystem::dfbInterface()
+{
+ return dfb;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.h b/src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.h
index fbc5498..148086c 100644
--- a/src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.h
+++ b/src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.h
@@ -77,13 +77,15 @@ public:
QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
QWindowSurface *createWindowSurface(QWidget *widget) const;
+ QBlittable *createBlittable(const QRect &rect) const;
QList<QGraphicsSystemScreen *> screens() const { return mScreens; }
static QImage::Format imageFormatFromSurface(IDirectFBSurface *surface);
+ static IDirectFB *dfbInterface();
private:
- IDirectFB *dfb;
+ static IDirectFB *dfb;
QDirectFbGraphicsSystemScreen *mPrimaryScreen;
QList<QGraphicsSystemScreen *> mScreens;
};
diff --git a/src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.cpp b/src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.cpp
index e75a43c..86d16d3 100644
--- a/src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.cpp
+++ b/src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.cpp
@@ -41,6 +41,9 @@
#include "qwindowsurface_minimaldfb.h"
#include "qgraphicssystem_minimaldfb.h"
+#include "qblitter_directfb.h"
+#include <private/qpixmap_blitter_p.h>
+
#include <QtCore/qdebug.h>
QT_BEGIN_NAMESPACE
@@ -55,6 +58,13 @@ QDirectFbWindowSurface::QDirectFbWindowSurface
if (result != DFB_OK) {
DirectFBError("QDirectFbWindowSurface::QDirectFbWindowSurface: unable to get windows surface",result);
}
+ QDirectFbBlitter *blitter = new QDirectFbBlitter(window->rect(), m_dfbSurface);
+ pmdata = new QBlittablePixmapData(QPixmapData::PixmapType);
+ pmdata->resize(window->width(),window->height());
+ pmdata->setBlittable(blitter);
+
+ m_pixmap = new QPixmap(pmdata);
+
}
QDirectFbWindowSurface::~QDirectFbWindowSurface()
@@ -63,7 +73,7 @@ QDirectFbWindowSurface::~QDirectFbWindowSurface()
QPaintDevice *QDirectFbWindowSurface::paintDevice()
{
- return m_image;
+ return m_pixmap;
}
void QDirectFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
@@ -71,6 +81,7 @@ void QDirectFbWindowSurface::flush(QWidget *widget, const QRegion &region, const
Q_UNUSED(widget);
Q_UNUSED(offset);
+ m_dfbSurface->Unlock(m_dfbSurface);
const quint8 windowOpacity = quint8(widget->windowOpacity() * 0xff);
m_dfbWindow->SetOpacity(m_dfbWindow,windowOpacity);
@@ -85,11 +96,7 @@ void QDirectFbWindowSurface::flush(QWidget *widget, const QRegion &region, const
void QDirectFbWindowSurface::setGeometry(const QRect &rect)
{
// qDebug() << "QDirectF.bWindowSurface::setGeometry:" << (long)this << rect;
- bool wasLocked = false;
- if (m_lock){
- m_dfbSurface->Unlock(m_dfbSurface);
- wasLocked = true;
- }
+
m_dfbSurface->Release(m_dfbSurface);
QWindowSurface::setGeometry(rect);
m_dfbWindow->SetBounds(m_dfbWindow, rect.x(),rect.y(),
@@ -98,10 +105,15 @@ void QDirectFbWindowSurface::setGeometry(const QRect &rect)
// m_dfbWindow->MoveTo(m_dfbWindow,rect.x(),rect.y());
DFBResult result = m_dfbWindow->GetSurface(m_dfbWindow,&m_dfbSurface);
if (result != DFB_OK)
- qDebug() << "could not resurface";
+ DirectFBError("QDirectFbWindowSurface::setGeometry() failed to retrieve new surface",result);
+
+ QPixmap *oldpixmap = m_pixmap;
+ QDirectFbBlitter *blitter = new QDirectFbBlitter(rect, m_dfbSurface);
+ pmdata->resize(rect.width(),rect.height());
+ pmdata->setBlittable(blitter);
+ m_pixmap = new QPixmap(pmdata);
+ delete oldpixmap;
- if (wasLocked)
- lockSurfaceToImage();
}
bool QDirectFbWindowSurface::scroll(const QRegion &area, int dx, int dy)
@@ -112,36 +124,11 @@ bool QDirectFbWindowSurface::scroll(const QRegion &area, int dx, int dy)
void QDirectFbWindowSurface::beginPaint(const QRegion &region)
{
Q_UNUSED(region);
- if (!m_lock)
- lockSurfaceToImage();
}
void QDirectFbWindowSurface::endPaint(const QRegion &region)
{
Q_UNUSED(region);
- if (m_lock){
- m_dfbSurface->Unlock(m_dfbSurface);
- m_lock = false;
- }
-}
-
-void QDirectFbWindowSurface::lockSurfaceToImage()
-{
- if (m_lock)
- return;
- m_lock = true;
-
- int w,h;
- m_dfbSurface->GetSize(m_dfbSurface,&w,&h);
- uchar *data;
- int bpl;
- DFBResult result = m_dfbSurface->Lock(m_dfbSurface,static_cast<DFBSurfaceLockFlags>(DSLF_READ|DSLF_WRITE),reinterpret_cast<void **>(&data),&bpl);
- if (!result == DFB_OK) {
- DirectFBError("QDirectFbWindowSurface::lockSurfaceToImage() failed to lock surface",result);
- return;
- }
- QImage::Format format = QDirectFbGraphicsSystem::imageFormatFromSurface(m_dfbSurface);
- m_image = new QImage(data,w,h,bpl,format);
}
QT_END_NAMESPACE
diff --git a/src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.h b/src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.h
index fe88878..98575ff 100644
--- a/src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.h
+++ b/src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.h
@@ -43,6 +43,8 @@
#define QWINDOWSURFACE_MINIMAL_H
#include <QtGui/private/qwindowsurface_p.h>
+#include <private/qpixmap_blitter_p.h>
+
#include <directfb.h>
QT_BEGIN_NAMESPACE
@@ -68,7 +70,8 @@ private:
void lockSurfaceToImage();
QDirectFbGraphicsSystemScreen *m_screen;
- QImage *m_image;
+ QPixmap *m_pixmap;
+ QBlittablePixmapData *pmdata;
bool m_lock;
IDirectFBWindow *m_dfbWindow;