src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp
branchRCL_3
changeset 4 3b1da2848fc7
parent 3 41300fa6a67c
child 8 3f74d0d4af4c
equal deleted inserted replaced
3:41300fa6a67c 4:3b1da2848fc7
     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());
  1182     } else {
  1186     } else {
  1183         clipType = ComplexClip;
  1187         clipType = ComplexClip;
  1184     }
  1188     }
  1185 }
  1189 }
  1186 
  1190 
       
  1191 bool QDirectFBPaintEnginePrivate::supportsStretchBlit() const
       
  1192 {
       
  1193 #ifdef QT_DIRECTFB_STRETCHBLIT
       
  1194     return !(q->state()->renderHints & QPainter::SmoothPixmapTransform);
       
  1195 #else
       
  1196     return false;
       
  1197 #endif
       
  1198 }
       
  1199 
       
  1200 
  1187 void QDirectFBPaintEnginePrivate::systemStateChanged()
  1201 void QDirectFBPaintEnginePrivate::systemStateChanged()
  1188 {
  1202 {
  1189     QRasterPaintEnginePrivate::systemStateChanged();
  1203     QRasterPaintEnginePrivate::systemStateChanged();
  1190     updateClip();
  1204     updateClip();
  1191 }
  1205 }