From c68ef6d2c010da545c839ba669da011162828f76 Mon Sep 17 00:00:00 2001 From: Andy Nichols Date: Wed, 3 Sep 2014 16:40:19 +0200 Subject: 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 --- .../platforms/directfb/qdirectfbblitter.cpp | 71 +++++++++++++++++++--- src/plugins/platforms/directfb/qdirectfbblitter.h | 3 + 2 files changed, 67 insertions(+), 7 deletions(-) (limited to 'src/plugins/platforms') 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 -- cgit v1.2.3