void ListItemCache::draw(QPainter * painter) { QRectF irect = sourceBoundingRect(Qt::LogicalCoordinates); QRectF vrect = painter->clipPath().boundingRect(); if (vrect.intersects(irect)) { QRectF newVisibleRect = irect.intersected(vrect); QPixmap pixmap; if (!QPixmapCache::find(m_cacheKey, &pixmap) || m_visibleRect.toRect() != newVisibleRect.toRect()) { //qDebug() << "ListItemCache: caching" << m_visibleRect // << "->" << newVisibleRect; pixmap = QPixmap(sourceBoundingRect().toRect().size()); pixmap.fill(Qt::transparent); QPainter pixmapPainter(&pixmap); drawSource(&pixmapPainter); pixmapPainter.end(); m_cacheKey = QPixmapCache::insert(pixmap); m_visibleRect = newVisibleRect; } //qDebug() << "ListItemCache: blitting" << m_visibleRect; painter->drawPixmap(0, 0, pixmap); } }
void PHISurfaceEffect::draw( QPainter *painter ) { /* QPoint offset; QPixmap pixmap; if ( sourceIsPixmap() ) { // No point in drawing in device coordinates (pixmap will be scaled anyways). pixmap=sourcePixmap( Qt::LogicalCoordinates, &offset ); } else { // Draw pixmap in device coordinates to avoid pixmap scaling; pixmap=sourcePixmap( Qt::DeviceCoordinates, &offset ); painter->setWorldTransform( QTransform() ); } QImage img=pixmap.toImage(); img=PHI::getSurfacedImage( img, _yOff, _size ); painter->drawImage( offset, img ); */ QRectF brect=sourceBoundingRect( Qt::LogicalCoordinates ); QImage img( static_cast<int>(brect.width()+1), static_cast<int>(brect.height()+_size+_yOff), QImage::Format_ARGB32_Premultiplied ); QPainter pixPainter; pixPainter.begin( &img ); pixPainter.setRenderHints( painter->renderHints() ); pixPainter.setCompositionMode( QPainter::CompositionMode_Clear ); pixPainter.fillRect( 0., 0., brect.width()+1., brect.height()+_size+_yOff+1, Qt::transparent ); pixPainter.setCompositionMode( QPainter::CompositionMode_SourceOver ); drawSource( &pixPainter ); QTransform t; t.rotate( 180., Qt::XAxis ); t.translate( 0., (-brect.height()*2.)-_yOff+1. ); pixPainter.setTransform( t ); drawSource( &pixPainter ); pixPainter.resetTransform(); pixPainter.translate( 0., brect.height()+_yOff ); QLinearGradient gradient( 0., 0., 0., 1.0 ); gradient.setColorAt( 0., QColor( 0, 0, 0, 220 ) ); gradient.setColorAt( 0.78, QColor( 0, 0, 0, 30 ) ); gradient.setColorAt( 1., Qt::transparent ); gradient.setCoordinateMode( QGradient::ObjectBoundingMode ); pixPainter.setCompositionMode( QPainter::CompositionMode_DestinationIn ); pixPainter.fillRect( 0., 0., brect.width()+1, _size, gradient ); pixPainter.end(); painter->drawImage( 0, 0, img ); }
/*! \reimp */ void QGraphicsOpacityEffect::draw(QPainter *painter) { Q_D(QGraphicsOpacityEffect); // Transparent; nothing to draw. if (d->isFullyTransparent) return; // Opaque; draw directly without going through a pixmap. if (d->isFullyOpaque && !d->hasOpacityMask) { drawSource(painter); return; } QPoint offset; Qt::CoordinateSystem system = sourceIsPixmap() ? Qt::LogicalCoordinates : Qt::DeviceCoordinates; QPixmap pixmap = sourcePixmap(system, &offset, QGraphicsEffect::NoPad); if (pixmap.isNull()) return; painter->save(); painter->setOpacity(d->opacity); if (d->hasOpacityMask) { QPainter pixmapPainter(&pixmap); pixmapPainter.setRenderHints(painter->renderHints()); pixmapPainter.setCompositionMode(QPainter::CompositionMode_DestinationIn); if (system == Qt::DeviceCoordinates) { QTransform worldTransform = painter->worldTransform(); worldTransform *= QTransform::fromTranslate(-offset.x(), -offset.y()); pixmapPainter.setWorldTransform(worldTransform); pixmapPainter.fillRect(sourceBoundingRect(), d->opacityMask); } else { pixmapPainter.translate(-offset); pixmapPainter.fillRect(pixmap.rect(), d->opacityMask); } } if (system == Qt::DeviceCoordinates) painter->setWorldTransform(QTransform()); painter->drawPixmap(offset, pixmap); painter->restore(); }