diff options
-rw-r--r-- | src/gui/image/qpixmap_blitter.cpp | 61 | ||||
-rw-r--r-- | src/gui/image/qpixmap_blitter_p.h | 11 | ||||
-rw-r--r-- | src/gui/image/qpixmapdata_p.h | 1 | ||||
-rw-r--r-- | src/gui/painting/qgraphicssystem_p.h | 2 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine_blitter.cpp | 51 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine_blitter_p.h | 3 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine_raster.cpp | 4 | ||||
-rw-r--r-- | src/plugins/graphicssystems/minimaldfb/minimaldfb.pro | 8 | ||||
-rw-r--r-- | src/plugins/graphicssystems/minimaldfb/qblitter_directfb.cpp | 94 | ||||
-rw-r--r-- | src/plugins/graphicssystems/minimaldfb/qblitter_directfb.h | 24 | ||||
-rw-r--r-- | src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.cpp | 65 | ||||
-rw-r--r-- | src/plugins/graphicssystems/minimaldfb/qgraphicssystem_minimaldfb.h | 4 | ||||
-rw-r--r-- | src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.cpp | 55 | ||||
-rw-r--r-- | src/plugins/graphicssystems/minimaldfb/qwindowsurface_minimaldfb.h | 5 |
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 ®ion, Qt::ClipOperation op) { Q_D(QBlitterPaintEngine); + d->lock(); d->raster->clip(region,op); d->updateClip(); } @@ -425,12 +427,14 @@ void QBlitterPaintEngine::clip(const QRegion ®ion, 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 ®ion, const QPoint &offset) @@ -71,6 +81,7 @@ void QDirectFbWindowSurface::flush(QWidget *widget, const QRegion ®ion, 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 ®ion, 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 ®ion) { Q_UNUSED(region); - if (!m_lock) - lockSurfaceToImage(); } void QDirectFbWindowSurface::endPaint(const QRegion ®ion) { 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; |