diff -r a10844a9914d -r a60f8b6b1d32 ganeswidgets/src/hgqtquadrenderer.cpp --- 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(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); }