diff options
author | Andy Nichols <andy.nichols@digia.com> | 2014-09-03 16:40:19 +0200 |
---|---|---|
committer | Andy Nichols <andy.nichols@digia.com> | 2014-09-03 17:07:52 +0200 |
commit | c68ef6d2c010da545c839ba669da011162828f76 (patch) | |
tree | 23354cdab7e71be64f3a4bb9d2e8138e68a66d9f /src/plugins/platforms/directfb | |
parent | 633647334c14b263a0fcc7a5087bf1e2ea3e212a (diff) |
DirectFB: Add QT_DIRECTFB_BLITTER_DEBUGPAINT environment variable
This environment variable will paint an overlay on each paint command
that is using the accelerated blitter path for DirectFB. This is useful
when you want to assure that you are taking advantage of the DirectFB
blitter.
Change-Id: I6e374754825794daf9c1bf40bee2b963e752a8e9
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Diffstat (limited to 'src/plugins/platforms/directfb')
-rw-r--r-- | src/plugins/platforms/directfb/qdirectfbblitter.cpp | 71 | ||||
-rw-r--r-- | src/plugins/platforms/directfb/qdirectfbblitter.h | 3 |
2 files changed, 67 insertions, 7 deletions
diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.cpp b/src/plugins/platforms/directfb/qdirectfbblitter.cpp index bc6e4d70e9..60a501f730 100644 --- a/src/plugins/platforms/directfb/qdirectfbblitter.cpp +++ b/src/plugins/platforms/directfb/qdirectfbblitter.cpp @@ -65,17 +65,22 @@ static QBlittable::Capabilities dfb_blitter_capabilities() QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, IDirectFBSurface *surface) : QBlittable(rect, dfb_blitter_capabilities()) - , m_surface(surface) + , m_surface(surface) + , m_debugPaint(false) { m_surface->AddRef(m_surface.data()); DFBSurfaceCapabilities surfaceCaps; m_surface->GetCapabilities(m_surface.data(), &surfaceCaps); m_premult = (surfaceCaps & DSCAPS_PREMULTIPLIED); + if (qgetenv("QT_DIRECTFB_BLITTER_DEBUGPAINT").toInt()) + m_debugPaint = true; } QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, bool alpha) - : QBlittable(rect, dfb_blitter_capabilities()), m_premult(false) + : QBlittable(rect, dfb_blitter_capabilities()) + , m_premult(false) + , m_debugPaint(false) { DFBSurfaceDescription surfaceDesc; memset(&surfaceDesc,0,sizeof(DFBSurfaceDescription)); @@ -95,6 +100,9 @@ QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, bool alpha) surfaceDesc.pixelformat = QDirectFbBlitter::pixmapFormat(); } + if (qgetenv("QT_DIRECTFB_BLITTER_DEBUGPAINT").toInt()) + m_debugPaint = true; + IDirectFB *dfb = QDirectFbConvenience::dfbInterface(); dfb->CreateSurface(dfb , &surfaceDesc, m_surface.outPtr()); m_surface->Clear(m_surface.data(), 0, 0, 0, 0); @@ -165,6 +173,8 @@ void QDirectFbBlitter::alphaFillRect(const QRectF &rect, const QColor &color, QP result = m_surface->FillRectangle(m_surface.data(), x, y, w, h); if (result != DFB_OK) DirectFBError("QDirectFBBlitter::alphaFillRect()", result); + if (m_debugPaint) + drawDebugRect(QRect(x, y, w, h), QColor(Qt::blue)); } void QDirectFbBlitter::drawPixmapOpacity(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect, QPainter::CompositionMode cmode, qreal opacity) @@ -203,13 +213,19 @@ void QDirectFbBlitter::drawPixmapOpacity(const QRectF &rect, const QPixmap &pixm if (cmode == QPainter::CompositionMode_SourceOver) m_surface->SetDstBlendFunction(m_surface.data(), DSBF_INVSRCALPHA); - if ((sRect.w == dRect.w) && (sRect.h == dRect.h)) + if ((sRect.w == dRect.w) && (sRect.h == dRect.h)) { result = m_surface->Blit(m_surface.data(), s, &sRect, dRect.x, dRect.y); - else + if (result != DFB_OK) + DirectFBError("QDirectFBBlitter::drawPixmapOpacity()", result); + if (m_debugPaint) + drawDebugRect(QRect(dRect.x, dRect.y, sRect.w, sRect.h), QColor(Qt::green)); + } else { result = m_surface->StretchBlit(m_surface.data(), s, &sRect, &dRect); - - if (result != DFB_OK) - DirectFBError("QDirectFBBlitter::drawPixmapExtended()", result); + if (result != DFB_OK) + DirectFBError("QDirectFBBlitter::drawPixmapOpacity()", result); + if (m_debugPaint) + drawDebugRect(QRect(dRect.x, dRect.y, dRect.w, dRect.h), QColor(Qt::red)); + } } bool QDirectFbBlitter::drawCachedGlyphs(const QPaintEngineState *state, QFontEngine::GlyphFormat glyphFormat, int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, QFontEngine *fontEngine) @@ -287,6 +303,12 @@ bool QDirectFbBlitter::drawCachedGlyphs(const QPaintEngineState *state, QFontEng m_surface->BatchBlit(m_surface.data(), cache->sourceSurface(), sourceRects.constData(), destPoints.constData(), nGlyphs); + if (m_debugPaint) { + for (int i = 0; i < nGlyphs; ++i) { + drawDebugRect(QRect(destPoints[i].x, destPoints[i].y, sourceRects[i].w, sourceRects[i].h), QColor(Qt::yellow)); + } + } + if (rs->clip && rs->clip->enabled) m_surface->SetClip(m_surface.data(), 0); return true; @@ -403,6 +425,41 @@ void QDirectFbBlitter::doUnlock() m_surface->Unlock(m_surface.data()); } +void QDirectFbBlitter::drawDebugRect(const QRect &rect, const QColor &color) +{ + int x, y, w, h; + DFBResult result; + + // check parameters + rect.getRect(&x, &y ,&w, &h); + if ((w <= 0) || (h <= 0)) return; + + m_surface->SetDrawingFlags(m_surface.data(), + DFBSurfaceDrawingFlags(m_premult ? (DSDRAW_BLEND | DSDRAW_SRC_PREMULTIPLY) : DSDRAW_BLEND)); + m_surface->SetPorterDuff(m_surface.data(), DSPD_SRC_OVER); + + // set color + m_surface->SetColor(m_surface.data(), color.red(), color.green(), color.blue(), 120); + + result = m_surface->DrawLine(m_surface.data(), x, y, x + w-1, y); + if (result != DFB_OK) + DirectFBError("QDirectFBBlitter::drawDebugRect()", result); + result = m_surface->DrawLine(m_surface.data(), x + w-1, y, x + w-1, y + h-1); + if (result != DFB_OK) + DirectFBError("QDirectFBBlitter::drawDebugRect()", result); + result = m_surface->DrawLine(m_surface.data(), x + w-1, y + h-1, x, y + h-1); + if (result != DFB_OK) + DirectFBError("QDirectFBBlitter::drawDebugRect()", result); + result = m_surface->DrawLine(m_surface.data(), x, y + h-1, x, y); + if (result != DFB_OK) + DirectFBError("QDirectFBBlitter::drawDebugRect()", result); + + m_surface->SetColor(m_surface.data(), color.red(), color.green(), color.blue(), 10); + result = m_surface->FillRectangle(m_surface.data(), x, y, w, h); + if (result != DFB_OK) + DirectFBError("QDirectFBBlitter::drawDebugRect()", result); +} + void QDirectFbTextureGlyphCache::resizeTextureData(int width, int height) { m_surface.reset();; diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.h b/src/plugins/platforms/directfb/qdirectfbblitter.h index c60f0fac25..4fa432462f 100644 --- a/src/plugins/platforms/directfb/qdirectfbblitter.h +++ b/src/plugins/platforms/directfb/qdirectfbblitter.h @@ -79,7 +79,10 @@ protected: friend class QDirectFbConvenience; private: + void drawDebugRect(const QRect &rect, const QColor &color); + bool m_premult; + bool m_debugPaint; }; class QDirectFbBlitterPlatformPixmap : public QBlittablePlatformPixmap |