summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/image/qpixmap_blitter.cpp15
-rw-r--r--src/gui/image/qpixmap_blitter_p.h3
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.cpp33
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.h10
4 files changed, 45 insertions, 16 deletions
diff --git a/src/gui/image/qpixmap_blitter.cpp b/src/gui/image/qpixmap_blitter.cpp
index 8a72b2930e..2a47a891c7 100644
--- a/src/gui/image/qpixmap_blitter.cpp
+++ b/src/gui/image/qpixmap_blitter.cpp
@@ -58,6 +58,7 @@ static int global_ser_no = 0;
QBlittablePlatformPixmap::QBlittablePlatformPixmap()
: QPlatformPixmap(QPlatformPixmap::PixmapType,BlitterClass)
+ , m_alpha(false)
#ifdef QT_BLITTER_RASTEROVERLAY
,m_rasterOverlay(0), m_unmergedCopy(0)
#endif //QT_BLITTER_RASTEROVERLAY
@@ -77,7 +78,7 @@ QBlittable *QBlittablePlatformPixmap::blittable() const
{
if (!m_blittable) {
QBlittablePlatformPixmap *that = const_cast<QBlittablePlatformPixmap *>(this);
- that->m_blittable.reset(this->createBlittable(QSize(w, h)));
+ that->m_blittable.reset(this->createBlittable(QSize(w, h), m_alpha));
}
return m_blittable.data();
@@ -133,7 +134,16 @@ void QBlittablePlatformPixmap::fill(const QColor &color)
if (color.alpha() == 255 && blittable()->capabilities() & QBlittable::SolidRectCapability) {
blittable()->unlock();
blittable()->fillRect(QRectF(0,0,w,h),color);
- }else {
+ } else {
+ // Need to be backed with an alpha channel now. It would be nice
+ // if we could just change the format, e.g. when going from
+ // RGB32 -> ARGB8888.
+ if (color.alpha() != 255 && !hasAlphaChannel()) {
+ m_blittable.reset(0);
+ m_engine.reset(0);
+ m_alpha = true;
+ }
+
uint pixel;
switch (blittable()->lock()->format()) {
case QImage::Format_ARGB32_Premultiplied:
@@ -179,6 +189,7 @@ bool QBlittablePlatformPixmap::hasAlphaChannel() const
void QBlittablePlatformPixmap::fromImage(const QImage &image,
Qt::ImageConversionFlags flags)
{
+ m_alpha = image.hasAlphaChannel();
resize(image.width(),image.height());
markRasterOverlay(QRect(0,0,w,h));
QImage *thisImg = buffer();
diff --git a/src/gui/image/qpixmap_blitter_p.h b/src/gui/image/qpixmap_blitter_p.h
index 3c32e8f919..b0a9b7f848 100644
--- a/src/gui/image/qpixmap_blitter_p.h
+++ b/src/gui/image/qpixmap_blitter_p.h
@@ -55,7 +55,7 @@ public:
QBlittablePlatformPixmap();
~QBlittablePlatformPixmap();
- virtual QBlittable *createBlittable(const QSize &size) const = 0;
+ virtual QBlittable *createBlittable(const QSize &size, bool alpha) const = 0;
QBlittable *blittable() const;
void setBlittable(QBlittable *blittable);
@@ -85,6 +85,7 @@ public:
protected:
QScopedPointer<QBlitterPaintEngine> m_engine;
QScopedPointer<QBlittable> m_blittable;
+ bool m_alpha;
#ifdef QT_BLITTER_RASTEROVERLAY
QImage *m_rasterOverlay;
diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.cpp b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
index a4da2d8142..7df96c10c7 100644
--- a/src/plugins/platforms/directfb/qdirectfbblitter.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
@@ -54,22 +54,33 @@ QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, IDirectFBSurface *surface)
|QBlittable::SourceOverPixmapCapability
|QBlittable::SourceOverScaledPixmapCapability))
{
- if (surface) {
- m_surface = surface;
- } else {
- DFBSurfaceDescription surfaceDesc;
- memset(&surfaceDesc,0,sizeof(DFBSurfaceDescription));
- surfaceDesc.width = rect.width();
- surfaceDesc.height = rect.height();
+ m_surface = surface;
+}
+
+QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, bool alpha)
+ : QBlittable(rect, QBlittable::Capabilities(QBlittable::SolidRectCapability
+ |QBlittable::SourcePixmapCapability
+ |QBlittable::SourceOverPixmapCapability
+ |QBlittable::SourceOverScaledPixmapCapability))
+{
+ DFBSurfaceDescription surfaceDesc;
+ memset(&surfaceDesc,0,sizeof(DFBSurfaceDescription));
+ surfaceDesc.width = rect.width();
+ surfaceDesc.height = rect.height();
+
+ if (alpha) {
surfaceDesc.caps = DSCAPS_PREMULTIPLIED;
surfaceDesc.pixelformat = DSPF_ARGB;
surfaceDesc.flags = DFBSurfaceDescriptionFlags(DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_CAPS | DSDESC_PIXELFORMAT);
-
- IDirectFB *dfb = QDirectFbConvenience::dfbInterface();
- dfb->CreateSurface(dfb,&surfaceDesc, &m_surface);
- m_surface->Clear(m_surface,0,0,0,0);
+ } else {
+ surfaceDesc.flags = DFBSurfaceDescriptionFlags(DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT);
+ surfaceDesc.pixelformat = DSPF_RGB32;
}
+
+ IDirectFB *dfb = QDirectFbConvenience::dfbInterface();
+ dfb->CreateSurface(dfb , &surfaceDesc, &m_surface);
+ m_surface->Clear(m_surface, 0, 0, 0, 0);
}
QDirectFbBlitter::~QDirectFbBlitter()
diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.h b/src/plugins/platforms/directfb/qdirectfbblitter.h
index 2dcb2be07a..e9a77c2707 100644
--- a/src/plugins/platforms/directfb/qdirectfbblitter.h
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.h
@@ -51,7 +51,8 @@
class QDirectFbBlitter : public QBlittable
{
public:
- QDirectFbBlitter(const QSize &size, IDirectFBSurface *surface = 0);
+ QDirectFbBlitter(const QSize &size, IDirectFBSurface *surface);
+ QDirectFbBlitter(const QSize &size, bool alpha);
virtual ~QDirectFbBlitter();
virtual void fillRect(const QRectF &rect, const QColor &color);
@@ -70,7 +71,12 @@ protected:
class QDirectFbBlitterPlatformPixmap : public QBlittablePlatformPixmap
{
public:
- QBlittable *createBlittable(const QSize &size) const { return new QDirectFbBlitter(size); }
+ QBlittable *createBlittable(const QSize &size, bool alpha) const;
};
+inline QBlittable *QDirectFbBlitterPlatformPixmap::createBlittable(const QSize& size, bool alpha) const
+{
+ return new QDirectFbBlitter(size, alpha);
+}
+
#endif // QDIRECTFBBLITTER_H