--- ksmserver/shutdowndlg.cpp 2005/12/21 12:31:45 1.37 +++ ksmserver/shutdowndlg.cpp 2005/12/21 12:50:31 @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -47,6 +48,9 @@ #include "shutdowndlg.moc" +static const int max_faded = 2300; +static const int slice = 20; + KSMShutdownFeedback * KSMShutdownFeedback::s_pSelf = 0L; KSMShutdownFeedback::KSMShutdownFeedback() @@ -54,32 +58,86 @@ m_currentY( 0 ) { setBackgroundMode( QWidget::NoBackground ); - setGeometry( QApplication::desktop()->geometry() ); - QTimer::singleShot( 10, this, SLOT( slotPaintEffect() ) ); - m_root.resize( width(), height() ); + QRect geo( QApplication::desktop()->geometry() ); + setGeometry( geo ); + int dep = QPixmap::defaultDepth(); + if (dep == 24 || dep == 16) + dep = 32; + grabbed.create( geo.size(), dep); + QTimer::singleShot( 0, this, SLOT( slotGrab() ) ); +} + +void KSMShutdownFeedback::slotGrab() +{ + // we start the passed early + if ( m_currentY * 4 >= height() * 3 && passed.isNull()) + passed.start(); + + if ( m_currentY >= height() ) { + slotPaintEffect(); + return; + } + + QImage img; + img = QPixmap::grabWindow( qt_xrootwin(), 0, + m_currentY, width(), + slice ); + bitBlt(&grabbed, 0, m_currentY, &img); + m_currentY += slice; + QTimer::singleShot(0, this, SLOT(slotGrab())); } void KSMShutdownFeedback::slotPaintEffect() { - if ( m_currentY >= height() ) { - if ( backgroundMode() == QWidget::NoBackground ) { - setBackgroundMode( QWidget::NoBackground ); - setBackgroundPixmap( m_root ); + const unsigned int shift_scale = 10; + const unsigned int scale = 1 << shift_scale; + + //kdDebug() << "passed before paint " << passed.elapsed() << endl; + int current_fade = QMIN(scale, passed.elapsed() * scale / max_faded); + QImage copy; + if ( grabbed.depth() == 32 ) { + copy.create( grabbed.size(), grabbed.depth() ); + unsigned int pixels = grabbed.width()*grabbed.height(); + QRgb *orig = ( QRgb* )grabbed.bits(); + QRgb *dest = ( QRgb* )copy.bits(); + QColor clr; + int h, s, v; + + int r, g, b, tg; + + for ( unsigned int i = 0; i < pixels; ++i ) + { + r = qRed( orig[i] ); + g = qGreen( orig[i] ); + b = qBlue( orig[i] ); + + // qGray formla + tg = (r*11 + g*16 + b*5)/32; + // make it a bit darker than gray + tg = tg - tg / 5; + + r = ( ( r << shift_scale ) + current_fade * ( tg - r ) ) >> shift_scale; + g = ( ( g << shift_scale ) + current_fade * ( tg - g ) ) >> shift_scale; + b = ( ( b << shift_scale ) + current_fade * ( tg - b ) ) >> shift_scale; + + dest[i] = qRgb(r, g, b); } - return; + + } else { + // old code - now used for 8bit + copy = grabbed; + copy = KImageEffect::desaturate(copy, current_fade); + copy = KImageEffect::fade(copy, 0.1 * current_fade, Qt::black); } + //kdDebug() << "passed before bitBlt " << passed.elapsed() << endl; + bitBlt( this, 0, 0, ©); + //kdDebug() << "passed after bitBlt " << passed.elapsed() << endl; + + if ( current_fade >= scale ) + return; - KPixmap pixmap; - pixmap = QPixmap::grabWindow( qt_xrootwin(), 0, m_currentY, width(), 10 ); - QImage image = pixmap.convertToImage(); - KImageEffect::blend( Qt::black, image, 0.4 ); - KImageEffect::toGray( image, true ); - pixmap.convertFromImage( image ); - bitBlt( this, 0, m_currentY, &pixmap ); - bitBlt( &m_root, 0, m_currentY, &pixmap ); - m_currentY += 10; - QTimer::singleShot( 1, this, SLOT( slotPaintEffect() ) ); + QTimer::singleShot( 0, this, SLOT( slotPaintEffect() ) ); } ////// --- ksmserver/shutdowndlg.h 2005/12/21 12:22:05 1.3 +++ ksmserver/shutdowndlg.h 2005/12/21 12:51:36 @@ -9,7 +9,9 @@ #include #include +#include #include +#include class QPushButton; class QVButtonGroup; class QPopupMenu; @@ -32,12 +34,14 @@ private slots: void slotPaintEffect(); + void slotGrab(); private: static KSMShutdownFeedback * s_pSelf; KSMShutdownFeedback(); int m_currentY; - QPixmap m_root; + QTime passed; + QImage grabbed; };