diff options
author | Julien Brianceau <jbrianceau@nds.com> | 2012-09-11 17:20:30 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-09-12 10:25:19 +0200 |
commit | 4ae829c1dbd0e8a72b82ab4c6cddb0a4ffe009f6 (patch) | |
tree | 3c3edfc8dbb7671a3e628f803b44052bcb79e430 /src/gui/painting/qpaintengine_blitter.cpp | |
parent | 287255c03ae501b2ce02bc835600489bc2c0ee2e (diff) |
qpa: extend drawPixmap capabilities
Extend drawPixmap capabilities for qpa through new ExtendedPixmapCapability
QBlittable flag and add related implementation in DirectFB platform.
Change-Id: If5436e16bfb37bf081bf864cad73a5e97394df8c
Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org>
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
Diffstat (limited to 'src/gui/painting/qpaintengine_blitter.cpp')
-rw-r--r-- | src/gui/painting/qpaintengine_blitter.cpp | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/src/gui/painting/qpaintengine_blitter.cpp b/src/gui/painting/qpaintengine_blitter.cpp index 20dd98b9bf..f8ebaf7b2e 100644 --- a/src/gui/painting/qpaintengine_blitter.cpp +++ b/src/gui/painting/qpaintengine_blitter.cpp @@ -74,6 +74,7 @@ public: , drawRectMask(0) , drawPixmapMask(0) , alphaFillRectMask(0) + , opacityPixmapMask(0) , capabillitiesState(0) { if (capabilities & QBlittable::SolidRectCapability) @@ -86,6 +87,8 @@ public: setSourceOverScaledPixmapMask(); if (capabilities & QBlittable::AlphaFillRectCapability) setAlphaFillRectMask(); + if (capabilities & QBlittable::OpacityPixmapCapability) + setOpacityPixmapMask(); } inline bool canBlitterFillRect() const @@ -121,6 +124,14 @@ public: return false; } + bool canBlitterDrawPixmapOpacity(const QPixmap &pm) const + { + if (pm.handle()->classId() != QPlatformPixmap::BlitterClass) + return false; + + return checkStateAgainstMask(capabillitiesState, opacityPixmapMask); + } + inline void updateState(uint mask, bool on) { updateStateBits(&capabillitiesState, mask, on); } @@ -199,11 +210,29 @@ private: updateStateBits(&drawRectMask, STATE_XFORM_SCALE, true); } + void setOpacityPixmapMask() { + updateStateBits(&opacityPixmapMask, STATE_XFORM_SCALE, true); + updateStateBits(&opacityPixmapMask, STATE_XFORM_COMPLEX, false); + + updateStateBits(&opacityPixmapMask, STATE_BRUSH_PATTERN, true); + updateStateBits(&opacityPixmapMask, STATE_BRUSH_ALPHA, true); + + updateStateBits(&opacityPixmapMask, STATE_PEN_ENABLED, true); + + updateStateBits(&opacityPixmapMask, STATE_ANTIALIASING, true); + updateStateBits(&opacityPixmapMask, STATE_ALPHA, true); + updateStateBits(&opacityPixmapMask, STATE_BLENDING_COMPLEX, false); + + updateStateBits(&opacityPixmapMask, STATE_CLIPSYS_COMPLEX, false); + updateStateBits(&opacityPixmapMask, STATE_CLIP_COMPLEX, false); + } + QBlittable::Capabilities m_capabilities; uint fillRectMask; uint drawRectMask; uint drawPixmapMask; uint alphaFillRectMask; + uint opacityPixmapMask; uint capabillitiesState; }; @@ -222,7 +251,7 @@ public: void lock(); void unlock(); void fillRect(const QRectF &rect, const QColor &color, bool alpha); - void clipAndDrawPixmap(const QRectF &clip, const QRectF &target, const QPixmap &pm, const QRectF &sr); + void clipAndDrawPixmap(const QRectF &clip, const QRectF &target, const QPixmap &pm, const QRectF &sr, bool opacity); void updateCompleteState(QPainterState *s); @@ -365,8 +394,10 @@ void QBlitterPaintEnginePrivate::fillRect(const QRectF &rect, const QColor &colo void QBlitterPaintEnginePrivate::clipAndDrawPixmap(const QRectF &clip, const QRectF &target, const QPixmap &pm, - const QRectF &sr) + const QRectF &sr, + bool opacity) { + Q_Q(QBlitterPaintEngine); QRectF intersectedRect = clip.intersected(target); if (intersectedRect.isEmpty()) return; @@ -391,7 +422,10 @@ void QBlitterPaintEnginePrivate::clipAndDrawPixmap(const QRectF &clip, } } pmData->unmarkRasterOverlay(intersectedRect); - pmData->blittable()->drawPixmap(intersectedRect, pm, source); + if (opacity) + pmData->blittable()->drawPixmapOpacity(intersectedRect, pm, source, q->state()->compositionMode(), q->state()->opacity); + else + pmData->blittable()->drawPixmap(intersectedRect, pm, source); } QBlitterPaintEngine::QBlitterPaintEngine(QBlittablePlatformPixmap *p) @@ -524,8 +558,9 @@ void QBlitterPaintEngine::fillRect(const QRectF &rect, const QBrush &brush) && qbrush_color(brush).alpha() == 0xff && d->caps.canBlitterFillRect()) { d->fillRect(rect, qbrush_color(brush), false); - } else if (brush.style() == Qt::TexturePattern - && d->caps.canBlitterDrawPixmap(rect, brush.texture(), rect)) { + } else if (brush.style() == Qt::TexturePattern && + ((d->caps.canBlitterDrawPixmapOpacity(brush.texture())) || + (d->caps.canBlitterDrawPixmap(rect, brush.texture(), rect)))) { bool rectIsFilled = false; QRectF transformedRect = state()->matrix.mapRect(rect); qreal x = transformedRect.x(); @@ -621,7 +656,10 @@ void QBlitterPaintEngine::drawPixmap(const QPointF &pos, const QPixmap &pm) void QBlitterPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) { Q_D(QBlitterPaintEngine); - if (d->caps.canBlitterDrawPixmap(r, pm, sr)) { + bool canDrawOpacity; + + canDrawOpacity = d->caps.canBlitterDrawPixmapOpacity(pm); + if (canDrawOpacity || (d->caps.canBlitterDrawPixmap(r, pm, sr))) { d->unlock(); QRectF targetRect = r; @@ -630,15 +668,15 @@ void QBlitterPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const Q const QClipData *clipData = d->clip(); if (clipData) { if (clipData->hasRectClip) { - d->clipAndDrawPixmap(clipData->clipRect, targetRect, pm, sr); + d->clipAndDrawPixmap(clipData->clipRect, targetRect, pm, sr, canDrawOpacity); } else if (clipData->hasRegionClip) { QVector<QRect>rects = clipData->clipRegion.rects(); for (int i = 0; i<rects.size(); ++i) - d->clipAndDrawPixmap(rects.at(i), targetRect, pm, sr); + d->clipAndDrawPixmap(rects.at(i), targetRect, pm, sr, canDrawOpacity); } } else { QRectF deviceRect(0, 0, paintDevice()->width(), paintDevice()->height()); - d->clipAndDrawPixmap(deviceRect, targetRect, pm, sr); + d->clipAndDrawPixmap(deviceRect, targetRect, pm, sr, canDrawOpacity); } }else { d->lock(); |