ganeswidgets/src/hgqtquadrenderer.cpp
changeset 20 a60f8b6b1d32
parent 17 a10844a9914d
--- a/ganeswidgets/src/hgqtquadrenderer.cpp	Fri Sep 17 15:55:58 2010 +0300
+++ b/ganeswidgets/src/hgqtquadrenderer.cpp	Wed Oct 06 14:53:41 2010 +0300
@@ -40,106 +40,74 @@
     {
     }
 
-    int width() const
-    {
+    int width() const {
         return mPixmap.width();
     }
 
-    int height() const
-    {
+    int height() const {
         return mPixmap.height();
     }
 
-    int mirrorImageWidth() const
-    {
-        return width();
+    int mirrorPixmapWidth() const {
+        return mMirrorPixmap.width();
     }
 
-    int mirrorImageHeight() const
-    {
-        return height();
-    }
-
-    void setImage(const QImage& image)
-    {
-        mPixmap = QPixmap::fromImage(image);
-        //mMirrorPixmap = QPixmap();
+    int mirrorPixmapHeight() const {
+        return mMirrorPixmap.height();
     }
     
-    void setPixmap(const QPixmap& pixmap)
-    {
-        mPixmap = pixmap;
-        //mMirrorPixmap = QPixmap();
+    void setPixmap(const QPixmap& pixmap, bool createMirror) {
+        mPixmap = pixmap;        
+        if (createMirror) {
+            createMirrorPixmap(mPixmap);
+        } else {
+            mMirrorPixmap = QPixmap();
+        }
     }
     
-    void releaseImage()
-    {
-        //mPixmap = QPixmap();
-        //mMirrorPixmap = QPixmap();
+    void releaseImages() {
+        mPixmap = QPixmap();
+        mMirrorPixmap = QPixmap();
     }
-    
-    QImage getQImage() const
-    {
-        return mPixmap.toImage();
-    }
-        
-    const QPixmap& pixmap() const
-    {
+            
+    QPixmap pixmap() const {
         return mPixmap;
     }
     
-    const QPixmap& mirrorPixmap(QPainter* painter)
-    {
-        Q_UNUSED(painter)
-
-        return mPixmap;
-/*        
-        if (mPixmap.isNull())
-            return mPixmap;
-
-        if (mMirrorPixmap.isNull())
-        {
-            QImage img = mPixmap.toImage();
-            QImage mirrorImage = img.scaled(QSize(img.width()/3,img.height()/3)).convertToFormat(QImage::Format_ARGB32);
-            
-            // apply gradient to alpha channel so that mirror image looks like
-            // it fades under the floor
-            for (int i = 0; i < mirrorImage.height(); i++)
-            {
-                qreal t = qreal(i) / qreal(mirrorImage.height());
-                int a = (int)(t * 255.0);
-                uchar* scanline = mirrorImage.scanLine(i);
-                for (int j = 0; j < mirrorImage.width(); j++)
-                {
-                    scanline[j*4+0] /= 3;
-                    scanline[j*4+1] /= 3;
-                    scanline[j*4+2] /= 3;
-                    scanline[j*4+3] = 255;
-                }        
-            }
-            
-            mMirrorPixmap = QPixmap::fromImage(mirrorImage);
-            
-            QPaintDevice* device = painter->device();
-            painter->end();
-
-            mMirrorPixmap = mPixmap.scaled(100,100);
-            int w = mMirrorPixmap.width();
-            int h = mMirrorPixmap.height();
-            //QPainter p;
-            painter->begin(&mMirrorPixmap);
-            painter->fillRect(0,0,w, h, QColor::fromRgbF(0, 0, 0, 0.5f));
-            painter->end();
-
-            painter->begin(device);
-        
-        }
-        
-        
-        return mMirrorPixmap;*/
+    QPixmap mirrorPixmap() {
+        return mMirrorPixmap;
     }
 
+    void setMirrorPixmap(const QPixmap& mirrorPixmap) {
+        mMirrorPixmap = mirrorPixmap;
+    }
+    
+    void createMirrorPixmap(const QPixmap& source) {
+        if (!source.isNull()) {
+            mMirrorPixmap = source.copy(QRect(0,source.height()*ReflectionHeight,source.width(),source.height()));
+            QPainter painter(&mMirrorPixmap);
+            painter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
+            QLinearGradient gradient(0.5,0.0,0.5,1);
+            gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
+            gradient.setColorAt(1, QColor::fromRgb(0,0,0,128));
+            gradient.setColorAt(0, QColor::fromRgb(0,0,0,0));
+            QBrush brush(gradient);
+            painter.setBrush(brush);
+            painter.setPen(Qt::NoPen);
+            painter.drawRect(mMirrorPixmap.rect());
+        }    
+    }
+    
+    void updateMirror(bool enabled) {
+        if (enabled && !mPixmap.isNull() && mMirrorPixmap.isNull()) {
+            createMirrorPixmap(mPixmap);
+        } else if(!enabled) {
+            mMirrorPixmap = QPixmap();
+        }
+    }
+    
     QPixmap mPixmap;
+    QPixmap mMirrorPixmap;
 };
 
 class HgQtQuad : public HgTransformedQuad
@@ -198,14 +166,17 @@
     
     void drawImage(QPainter* painter, HgQtImage* image, const QRectF& rect, const QTransform& transform)
     {
-        const QPixmap& pixmap = image->pixmap();
+        QPixmap pixmap = image->pixmap();
         
         if (pixmap.isNull())            
             return;
         
+                
         const QVector2D* points = mTransformedPoints;
-        if (mRenderer->isReflection() && quad()->mirrorImageEnabled())
+        if (mRenderer->isReflection() && quad()->mirrorImageEnabled()) {
             points = mMirroredPoints;
+            pixmap = image->mirrorPixmap();            
+        }
         
         QPolygonF poly;
         poly << points[0].toPointF();
@@ -217,9 +188,10 @@
             return;
         }
         
-        computeWarpMatrix(mTransform, image->width(), image->height(), points);
+        computeWarpMatrix(mTransform, pixmap.width(), pixmap.height(), points);
         
         painter->setTransform(mTransform * transform);    
+
         painter->drawPixmap(QPointF(0,0), pixmap);
     }
 
@@ -235,9 +207,9 @@
 {
     // initialize base class to the end.
     init(maxQuads);
-    QImage image(QSize(200,200), QImage::Format_RGB16);
+    QImage image(QSize(250,250), QImage::QImage::Format_ARGB32_Premultiplied);
     image.fill(0xFFFFFFFF);
-    setDefaultImage(image);
+    setDefaultImage(QPixmap::fromImage(image));
     
     QPixmapCache::setCacheLimit(2048);
 }
@@ -289,7 +261,7 @@
     return mDefaultQtImage;
 }
 
-void HgQtQuadRenderer::setDefaultImage(QImage defaultImage)
+void HgQtQuadRenderer::setDefaultImage(QPixmap defaultImage)
 {
     HgQuadRenderer::setDefaultImage(defaultImage);
     
@@ -297,8 +269,7 @@
     mDefaultQtImage = 0;
     
     mDefaultQtImage = static_cast<HgQtImage*>(createNativeImage());
-    mDefaultQtImage->setImage(mDefaultImage);
-
+    mDefaultQtImage->setPixmap(mDefaultImage, true);
 }
 
 HgTransformedQuad* HgQtQuadRenderer::createNativeQuad()
@@ -313,9 +284,7 @@
 
 void HgQtQuadRenderer::drawFloor(QPainter* painter, const QRectF& rect)
 {
-    QRectF floorRect(0, rect.height()/2, rect.width(), rect.height()/2);
-    QBrush brush(QColor::fromRgbF(0,0,0,0.5f));
-    painter->setBrush(brush);
-    painter->drawRect(floorRect);
+    Q_UNUSED(painter);
+    Q_UNUSED(rect);
 }