1 /**************************************************************************** |
1 /**************************************************************************** |
2 ** |
2 ** |
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
4 ** All rights reserved. |
4 ** All rights reserved. |
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
6 ** |
6 ** |
7 ** This file is part of the plugins of the Qt Toolkit. |
7 ** This file is part of the plugins of the Qt Toolkit. |
8 ** |
8 ** |
100 inline bool testCompositionMode(const QPen *pen, const QBrush *brush, const QColor *color = 0) const; |
100 inline bool testCompositionMode(const QPen *pen, const QBrush *brush, const QColor *color = 0) const; |
101 inline bool isSimpleBrush(const QBrush &brush) const; |
101 inline bool isSimpleBrush(const QBrush &brush) const; |
102 |
102 |
103 void drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &pos); |
103 void drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &pos); |
104 void blit(const QRectF &dest, IDirectFBSurface *surface, const QRectF &src); |
104 void blit(const QRectF &dest, IDirectFBSurface *surface, const QRectF &src); |
|
105 |
|
106 inline bool supportsStretchBlit() const; |
105 |
107 |
106 inline void updateClip(); |
108 inline void updateClip(); |
107 virtual void systemStateChanged(); |
109 virtual void systemStateChanged(); |
108 |
110 |
109 static IDirectFBSurface *getSurface(const QImage &img, bool *release); |
111 static IDirectFBSurface *getSurface(const QImage &img, bool *release); |
524 */ |
526 */ |
525 |
527 |
526 #if !defined QT_NO_DIRECTFB_PREALLOCATED || defined QT_DIRECTFB_IMAGECACHE |
528 #if !defined QT_NO_DIRECTFB_PREALLOCATED || defined QT_DIRECTFB_IMAGECACHE |
527 if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) |
529 if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) |
528 || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) |
530 || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) |
529 || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip |
531 || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) |
|
532 || (!d->supportsStretchBlit() && state()->matrix.mapRect(r).size() != sr.size()) |
530 #ifndef QT_DIRECTFB_IMAGECACHE |
533 #ifndef QT_DIRECTFB_IMAGECACHE |
531 || QDirectFBScreen::getSurfacePixelFormat(image.format()) == DSPF_UNKNOWN |
534 || (QDirectFBScreen::getSurfacePixelFormat(image.format()) == DSPF_UNKNOWN) |
532 #elif defined QT_NO_DIRECTFB_PREALLOCATED |
535 #elif defined QT_NO_DIRECTFB_PREALLOCATED |
533 || QDirectFBPaintEnginePrivate::cacheCost(image) > imageCache.maxCost() |
536 || (QDirectFBPaintEnginePrivate::cacheCost(image) > imageCache.maxCost()) |
534 #endif |
537 #endif |
535 ) |
538 ) |
536 #endif |
539 #endif |
537 { |
540 { |
538 RASTERFALLBACK(DRAW_IMAGE, r, image.size(), sr); |
541 RASTERFALLBACK(DRAW_IMAGE, r, image.size(), sr); |
571 } else { |
574 } else { |
572 QPixmapData *data = pixmap.pixmapData(); |
575 QPixmapData *data = pixmap.pixmapData(); |
573 Q_ASSERT(data->classId() == QPixmapData::DirectFBClass); |
576 Q_ASSERT(data->classId() == QPixmapData::DirectFBClass); |
574 QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data); |
577 QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data); |
575 if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) |
578 if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) |
576 || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) |
579 || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) |
577 || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip |
580 || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) |
578 || (state()->renderHints & QPainter::SmoothPixmapTransform |
581 || (!d->supportsStretchBlit() && state()->matrix.mapRect(r).size() != sr.size())) { |
579 && state()->matrix.mapRect(r).size() != sr.size())) { |
|
580 RASTERFALLBACK(DRAW_PIXMAP, r, pixmap.size(), sr); |
582 RASTERFALLBACK(DRAW_PIXMAP, r, pixmap.size(), sr); |
581 const QImage *img = dfbData->buffer(); |
583 const QImage *img = dfbData->buffer(); |
582 d->lock(); |
584 d->lock(); |
583 QRasterPaintEngine::drawImage(r, *img, sr); |
585 QRasterPaintEngine::drawImage(r, *img, sr); |
584 } else { |
586 } else { |
604 RASTERFALLBACK(DRAW_TILED_PIXMAP, r, pixmap.size(), offset); |
606 RASTERFALLBACK(DRAW_TILED_PIXMAP, r, pixmap.size(), offset); |
605 d->lock(); |
607 d->lock(); |
606 QRasterPaintEngine::drawTiledPixmap(r, pixmap, offset); |
608 QRasterPaintEngine::drawTiledPixmap(r, pixmap, offset); |
607 } else if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) |
609 } else if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) |
608 || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) |
610 || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) |
609 || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip |
611 || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) |
610 || (state()->renderHints & QPainter::SmoothPixmapTransform && state()->matrix.isScaling())) { |
612 || (!d->supportsStretchBlit() && state()->matrix.isScaling())) { |
611 RASTERFALLBACK(DRAW_TILED_PIXMAP, r, pixmap.size(), offset); |
613 RASTERFALLBACK(DRAW_TILED_PIXMAP, r, pixmap.size(), offset); |
612 QPixmapData *pixmapData = pixmap.pixmapData(); |
614 QPixmapData *pixmapData = pixmap.pixmapData(); |
613 Q_ASSERT(pixmapData->classId() == QPixmapData::DirectFBClass); |
615 Q_ASSERT(pixmapData->classId() == QPixmapData::DirectFBClass); |
614 QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(pixmapData); |
616 QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(pixmapData); |
615 const QImage *img = dfbData->buffer(); |
617 const QImage *img = dfbData->buffer(); |
730 return; } |
732 return; } |
731 |
733 |
732 case Qt::TexturePattern: { |
734 case Qt::TexturePattern: { |
733 if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) |
735 if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) |
734 || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) |
736 || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) |
735 || (state()->renderHints & QPainter::SmoothPixmapTransform && state()->matrix.isScaling())) { |
737 || (!d->supportsStretchBlit() && state()->matrix.isScaling())) { |
736 break; |
738 break; |
737 } |
739 } |
738 |
740 |
739 const QPixmap texture = brush.texture(); |
741 const QPixmap texture = brush.texture(); |
740 if (texture.pixmapData()->classId() != QPixmapData::DirectFBClass) |
742 if (texture.pixmapData()->classId() != QPixmapData::DirectFBClass) |
755 { |
757 { |
756 if (!color.isValid()) |
758 if (!color.isValid()) |
757 return; |
759 return; |
758 Q_D(QDirectFBPaintEngine); |
760 Q_D(QDirectFBPaintEngine); |
759 if ((d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported) |
761 if ((d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported) |
760 || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip |
762 || (d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) |
761 || !d->testCompositionMode(0, 0, &color)) { |
763 || !d->testCompositionMode(0, 0, &color)) { |
762 RASTERFALLBACK(FILL_RECT, rect, color, VOID_ARG()); |
764 RASTERFALLBACK(FILL_RECT, rect, color, VOID_ARG()); |
763 d->lock(); |
765 d->lock(); |
764 QRasterPaintEngine::fillRect(rect, color); |
766 QRasterPaintEngine::fillRect(rect, color); |
765 } else { |
767 } else { |
1047 DFBResult result; |
1049 DFBResult result; |
1048 |
1050 |
1049 if (dr.size() == sr.size()) { |
1051 if (dr.size() == sr.size()) { |
1050 result = surface->Blit(surface, s, &sRect, dr.x(), dr.y()); |
1052 result = surface->Blit(surface, s, &sRect, dr.x(), dr.y()); |
1051 } else { |
1053 } else { |
|
1054 Q_ASSERT(supportsStretchBlit()); |
1052 const DFBRectangle dRect = { dr.x(), dr.y(), dr.width(), dr.height() }; |
1055 const DFBRectangle dRect = { dr.x(), dr.y(), dr.width(), dr.height() }; |
1053 result = surface->StretchBlit(surface, s, &sRect, &dRect); |
1056 result = surface->StretchBlit(surface, s, &sRect, &dRect); |
1054 } |
1057 } |
1055 if (result != DFB_OK) |
1058 if (result != DFB_OK) |
1056 DirectFBError("QDirectFBPaintEngine::drawPixmap()", result); |
1059 DirectFBError("QDirectFBPaintEngine::drawPixmap()", result); |
1094 QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data); |
1097 QDirectFBPixmapData *dfbData = static_cast<QDirectFBPixmapData*>(data); |
1095 QDirectFBPaintEnginePrivate::unlock(dfbData); |
1098 QDirectFBPaintEnginePrivate::unlock(dfbData); |
1096 const QSize pixmapSize = dfbData->size(); |
1099 const QSize pixmapSize = dfbData->size(); |
1097 IDirectFBSurface *sourceSurface = dfbData->directFBSurface(); |
1100 IDirectFBSurface *sourceSurface = dfbData->directFBSurface(); |
1098 if (transform.isScaling()) { |
1101 if (transform.isScaling()) { |
|
1102 Q_ASSERT(supportsStretchBlit()); |
1099 Q_ASSERT(qMin(transform.m11(), transform.m22()) >= 0); |
1103 Q_ASSERT(qMin(transform.m11(), transform.m22()) >= 0); |
1100 offset.rx() *= transform.m11(); |
1104 offset.rx() *= transform.m11(); |
1101 offset.ry() *= transform.m22(); |
1105 offset.ry() *= transform.m22(); |
1102 |
1106 |
1103 const QSizeF mappedSize(pixmapSize.width() * transform.m11(), pixmapSize.height() * transform.m22()); |
1107 const QSizeF mappedSize(pixmapSize.width() * transform.m11(), pixmapSize.height() * transform.m22()); |